# Changes in Mortran and R

## Tracing progress fixes in Mortran and R

1. Changed the function definition

```
subroutine get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx);
```
to 
```
subroutine get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx,itrace);
```

taking on itrace as a switch for tracing progress. Added an `entry
chg_itrace` to change `itrace`.

2. Changed all calls to `get_int_parms` to include extra parameter.

3. Corresponding changes to `glmnet.control.R` to include `itrace` as a
   parameter. 

4. Fixes in `relax.glmnet.R` for displaying the progress by
   temporarily turning off and on tracing, if it was on. 


## Unused variable fixes in Mortran. 

1. The subroutines `spstandard`, `spstandard1`, `multspstandard1` had `jerr` as an unused
   argument. 
2. The subroutines `coxnet1`, `fishnet1`, `spfishnet1` had `isd` as an
   unused argument.
3. The subroutine `risk` had `ni` as an unusued argument.

In all these cases, I merely added a _no-op_ statement to the
function/subroutine (e.g. `jerr = jerr * 1` or `ni = ni * 1`) to stop
compiler warnings. More advanced compilers may detect these
shenanigans. We can address that later if it comes up.

## Some extraneous tabs in Mortran.

1. The subroutine `multstandard1` has an extra tabl between the
   arguments `ju` and `xm` that I removed. This is most likely because
   Emacs replaces 8 spaces with tabs. 
   
## Uninitialized variable in Mortran

1. The `gfortran` compiler warns that the variable `alf` is
   uninitialized in `elnet1`. The logic is correct, but the compiler
   is unable to detect it.  So I initialized `alf=1` and combined it
   with a previous fix for `alm=0.0` in `elnet1`.  I am reasonably
   certain this will not affect any logic.
   
## Generating Fortran from Mortran

Note that it is Mortran processing that generates unusued labels. So
each time you run Mortran to generate the Fortran, you will have to
deal with the problem of unused labels. No worries, however, if you
follow this procedure.

1. Install the latest [`SUtools`](https://github.com/bnaras/SUtools)
   package, after deleting your old one, if you had it.
2. Execute the following, assuming `GLMNET_DIR` is your `glmnet`
   package directory.

```{r, eval = FALSE}
library(SUtools)
GLMNET_DIR  <- "~/GITHUB/glmnet"
mortran <- readLines(file.path(GLMNET_DIR, "inst", "mortran", "glmnet5dpclean.m"))
result  <- process_mortran(input_mortran_file = "glmnet5dpclean.m",
                           pkg_name = "glmnet",
                           control = sutools_control(fix_allocate = FALSE))
```

The fortran file can now be written out to a file. For example, you
may choose to overwrite the old fortran with the new fortran.

```{r, eval = FALSE}
writeLines(fixed_fortran, file.path(GLMNET_DIR, "src", "glmnet5dpclean.f"))
```

## Maxit bug fixed

Mortran would branch to :again: when convergence was not reached, and
not check if maxit had been reached. On the new mac M1 this could get
into a state with a degenerate example where it never
terminated. Added a maxit check immediately after again throughout.

