minpack icon indicating copy to clipboard operation
minpack copied to clipboard

Port features from SciPy's minpack version

Open certik opened this issue 3 years ago • 6 comments
trafficstars

The version is here: https://github.com/scipy/scipy/tree/a0535bee9d4da58e6d41e963e907c1b9f7684585/scipy/optimize/minpack and we need to check to see what changes they have made to the original code and port those to this version.

Towards #14.

certik avatar Feb 02 '22 20:02 certik

I checked the history of that folder. The only major change is they added the recursive attribute to all subroutines to make sure they are re-entrant. The relevant issue is https://github.com/scipy/scipy/pull/7999

If I understand correctly, by adding recursive the compiler must guarantee the subroutines are re-entrant. Quoting one the replies in that thread:

Many Fortran 77 compilears saved all local variables by default. gfortran still uses this misfeature, even for Fortran 90, albeit to a lesser extent and it can be controlled with compiler flags. Since the SciPy source cannot assume anything about the compiler and compiler flags passed to the Fortran compiler, we just have to assume that Fortran subroutines are never reentrant.

ivan-pi avatar Feb 03 '22 21:02 ivan-pi

With F2018, procedures are recursive by default, nevertheless we should use recursive to ensure this on older compiler versions.

milancurcic avatar Feb 03 '22 22:02 milancurcic

Here's a list of things we could try to improve on based upon a search of the open issues containing the keyword "minpack" in the SciPy repository:

  • Robust handling of NaN and Inf; https://github.com/scipy/scipy/issues/4777, https://github.com/scipy/scipy/issues/11841
  • Loss functions for robust least squares (e.g. filtering outliers); https://github.com/scipy/scipy/issues/15162
  • Count number of function evaluations: https://github.com/scipy/scipy/issues/5369
  • Better scaling of the objective function; related to https://github.com/scipy/scipy/issues/4227 and https://github.com/scipy/scipy/issues/7519
  • Sparse Jacobians; https://github.com/scipy/scipy/issues/2309, also see my suggestion in #1 about banded Jacobians. This is a bigger issue, because it means we also need specialized factorization routines for such matrices.
  • Box constraints (I believe these are the same as lower and upper bounds on the solution); https://github.com/scipy/scipy/issues/5249

ivan-pi avatar Feb 03 '22 22:02 ivan-pi

@ivan-pi awesome! Let's implement those, and bring it to SciPy to use our newer improved version, which would fix a lot of their (reported) bugs.

certik avatar Feb 03 '22 23:02 certik

Perhaps more relevant than issues directly related to MINPACK is to look directly at the options available with other solvers in scipy.optimize.leastsq and scipy.optimize.root.

For least squares, the features missing in MINPACK compared to the other two SciPy solvers "trf" and "dogbox" are:

  • Bound constraints
  • Sparse Jacobian matrices
  • Robust loss functions

The C++ library Ceres (BSD-licensed) implements all of these.

ivan-pi avatar Feb 12 '22 00:02 ivan-pi

Many Fortran 77 compilears saved all local variables by default. gfortran still uses this misfeature, even for Fortran 90, albeit to a lesser extent and it can be controlled with compiler flags.

That was stated in 2017. I do not recall Gfortran having that "misfeature", and recent versions of Gfortran do not do so. In fact, see this quote from the current Gfortran documentation:

"The default, which is -fautomatic, uses the stack for local variables smaller than the value given by -fmax-stack-var-size. Use the option -frecursive to use no static memory."

The Gfortran option "-fmax-stack-var-size=n" allows control over which arrays are put into the stack, and to avoid stack overflow. The parameter n has a default value of n = 65536 bytes. Thus, most local arrays of small or medium size are allocated on the stack without the need for any explicit request by the user.

xecej4 avatar May 19 '22 10:05 xecej4