fix tests : we perform slightly worse because we do use one more function evaluation in our numericaldiff than what (c)minpack did
diff --git a/unsupported/Eigen/src/NonLinear/LevenbergMarquardt.h b/unsupported/Eigen/src/NonLinear/LevenbergMarquardt.h index 4e05652..f541c38 100644 --- a/unsupported/Eigen/src/NonLinear/LevenbergMarquardt.h +++ b/unsupported/Eigen/src/NonLinear/LevenbergMarquardt.h
@@ -55,7 +55,7 @@ ); static Status lmdif1( - FunctorType &_functor, + FunctorType &functor, Matrix< Scalar, Dynamic, 1 > &x, int *nfev, const Scalar tol = ei_sqrt(epsilon<Scalar>()) @@ -200,9 +200,13 @@ /* calculate the jacobian matrix. */ - if (functor.df(x, fjac) < 0) + int df_ret = functor.df(x, fjac); + if (df_ret<0) return UserAsked; - ++njev; + if (df_ret>0) + // numerical diff, we evaluated the function df_ret times + nfev += df_ret; + else njev++; /* compute the qr factorization of the jacobian. */ @@ -702,10 +706,8 @@ lm.parameters.maxfev = 200*(n+1); Status info = Status(lm.minimize(x)); - if (nfev) * nfev = lm.nfev; - return info; }
diff --git a/unsupported/Eigen/src/NumericalDiff/NumericalDiff.h b/unsupported/Eigen/src/NumericalDiff/NumericalDiff.h index 276b315..dcd4358 100644 --- a/unsupported/Eigen/src/NumericalDiff/NumericalDiff.h +++ b/unsupported/Eigen/src/NumericalDiff/NumericalDiff.h
@@ -74,6 +74,7 @@ val1.resize(Functor::values()); val2.resize(Functor::values()); + // initialization switch(mode) { case Forward: // compute f(x) @@ -86,8 +87,7 @@ assert(false); }; - /* Function Body */ - + // Function Body for (int j = 0; j < n; ++j) { h = eps * ei_abs(x[j]); if (h == 0.) {