From e465ea82e16230f738114cc20a1334ad21b07e5c Mon Sep 17 00:00:00 2001 From: Thomas Capricelli Date: Tue, 25 Aug 2009 21:50:01 +0200 Subject: [PATCH] define and use struct Parameters --- .../src/NonLinear/HybridNonLinearSolver.h | 68 +++++---- .../Eigen/src/NonLinear/LevenbergMarquardt.h | 139 +++++++++--------- unsupported/test/NonLinear.cpp | 127 ++++++++++------ 3 files changed, 187 insertions(+), 147 deletions(-) diff --git a/unsupported/Eigen/src/NonLinear/HybridNonLinearSolver.h b/unsupported/Eigen/src/NonLinear/HybridNonLinearSolver.h index fa68ae929..bb4bb28e1 100644 --- a/unsupported/Eigen/src/NonLinear/HybridNonLinearSolver.h +++ b/unsupported/Eigen/src/NonLinear/HybridNonLinearSolver.h @@ -17,6 +17,16 @@ public: UserAksed = 6 }; + struct Parameters { + Parameters() + : factor(Scalar(100.)) + , maxfev(1000) + , xtol(ei_sqrt(epsilon())) {} + Scalar factor; + int maxfev; // maximum number of function evaluation + Scalar xtol; + }; + Status solve( Matrix< Scalar, Dynamic, 1 > &x, const Scalar tol = ei_sqrt(epsilon()) @@ -25,10 +35,8 @@ public: Matrix< Scalar, Dynamic, 1 > &x, int &nfev, int &njev, Matrix< Scalar, Dynamic, 1 > &diag, - const int mode=1, - const int maxfev = 1000, - const Scalar factor = Scalar(100.), - const Scalar xtol = ei_sqrt(epsilon()) + const Parameters ¶meters, + const int mode=1 ); Status solveNumericalDiff( @@ -39,12 +47,10 @@ public: Matrix< Scalar, Dynamic, 1 > &x, int &nfev, Matrix< Scalar, Dynamic, 1 > &diag, + const Parameters ¶meters, const int mode=1, int nb_of_subdiagonals = -1, int nb_of_superdiagonals = -1, - const int maxfev = 2000, - const Scalar factor = Scalar(100.), - const Scalar xtol = ei_sqrt(epsilon()), const Scalar epsfcn = Scalar(0.) ); @@ -68,6 +74,7 @@ HybridNonLinearSolver::solve( const int n = x.size(); int nfev=0, njev=0; Matrix< Scalar, Dynamic, 1> diag; + Parameters parameters; /* check the input parameters for errors. */ if (n <= 0 || tol < 0.) { @@ -75,15 +82,15 @@ HybridNonLinearSolver::solve( return ImproperInputParameters; } + parameters.maxfev = 100*(n+1); + parameters.xtol = tol; diag.setConstant(n, 1.); return solve( x, nfev, njev, diag, - 2, - (n+1)*100, - 100., - tol + parameters, + 2 ); } @@ -96,10 +103,8 @@ HybridNonLinearSolver::solve( int &nfev, int &njev, Matrix< Scalar, Dynamic, 1 > &diag, - const int mode, - const int maxfev, - const Scalar factor, - const Scalar xtol + const Parameters ¶meters, + const int mode ) { const int n = x.size(); @@ -133,7 +138,7 @@ HybridNonLinearSolver::solve( /* check the input parameters for errors. */ - if (n <= 0 || xtol < 0. || maxfev <= 0 || factor <= 0. ) + if (n <= 0 || parameters.xtol < 0. || parameters.maxfev <= 0 || parameters.factor <= 0. ) return RelativeErrorTooSmall; if (mode == 2) for (j = 0; j < n; ++j) @@ -187,9 +192,9 @@ HybridNonLinearSolver::solve( wa3 = diag.cwise() * x; xnorm = wa3.stableNorm(); - delta = factor * xnorm; + delta = parameters.factor * xnorm; if (delta == 0.) - delta = factor; + delta = parameters.factor; } /* form (q transpose)*fvec and store in qtf. */ @@ -326,12 +331,12 @@ HybridNonLinearSolver::solve( /* test for convergence. */ - if (delta <= xtol * xnorm || fnorm == 0.) + if (delta <= parameters.xtol * xnorm || fnorm == 0.) return RelativeErrorTooSmall; /* tests for termination and stringent tolerances. */ - if (nfev >= maxfev) + if (nfev >= parameters.maxfev) return TooManyFunctionEvaluation; /* Computing MAX */ if (Scalar(.1) * std::max(Scalar(.1) * delta, pnorm) <= epsilon() * xnorm) @@ -384,6 +389,7 @@ HybridNonLinearSolver::solveNumericalDiff( const int n = x.size(); int nfev=0; Matrix< Scalar, Dynamic, 1> diag; + Parameters parameters; /* check the input parameters for errors. */ if (n <= 0 || tol < 0.) { @@ -391,16 +397,18 @@ HybridNonLinearSolver::solveNumericalDiff( return ImproperInputParameters; } + parameters.maxfev = 200*(n+1); + parameters.xtol = tol; + diag.setConstant(n, 1.); return solveNumericalDiff( x, nfev, diag, + parameters, 2, -1, -1, - (n+1)*200, - 100., - tol, Scalar(0.) + Scalar(0.) ); } @@ -411,12 +419,10 @@ HybridNonLinearSolver::solveNumericalDiff( Matrix< Scalar, Dynamic, 1 > &x, int &nfev, Matrix< Scalar, Dynamic, 1 > &diag, + const Parameters ¶meters, const int mode, int nb_of_subdiagonals, int nb_of_superdiagonals, - const int maxfev, - const Scalar factor, - const Scalar xtol, const Scalar epsfcn ) { @@ -454,7 +460,7 @@ HybridNonLinearSolver::solveNumericalDiff( /* check the input parameters for errors. */ - if (n <= 0 || xtol < 0. || maxfev <= 0 || nb_of_subdiagonals < 0 || nb_of_superdiagonals < 0 || factor <= 0. ) + if (n <= 0 || parameters.xtol < 0. || parameters.maxfev <= 0 || nb_of_subdiagonals < 0 || nb_of_superdiagonals < 0 || parameters.factor <= 0. ) return RelativeErrorTooSmall; if (mode == 2) for (j = 0; j < n; ++j) @@ -514,9 +520,9 @@ HybridNonLinearSolver::solveNumericalDiff( wa3 = diag.cwise() * x; xnorm = wa3.stableNorm(); - delta = factor * xnorm; + delta = parameters.factor * xnorm; if (delta == 0.) - delta = factor; + delta = parameters.factor; } /* form (q transpose)*fvec and store in qtf. */ @@ -653,12 +659,12 @@ HybridNonLinearSolver::solveNumericalDiff( /* test for convergence. */ - if (delta <= xtol * xnorm || fnorm == 0.) + if (delta <= parameters.xtol * xnorm || fnorm == 0.) return RelativeErrorTooSmall; /* tests for termination and stringent tolerances. */ - if (nfev >= maxfev) + if (nfev >= parameters.maxfev) return TooManyFunctionEvaluation; /* Computing MAX */ if (Scalar(.1) * std::max(Scalar(.1) * delta, pnorm) <= epsilon() * xnorm) diff --git a/unsupported/Eigen/src/NonLinear/LevenbergMarquardt.h b/unsupported/Eigen/src/NonLinear/LevenbergMarquardt.h index 0ce2d83b9..e6536cb89 100644 --- a/unsupported/Eigen/src/NonLinear/LevenbergMarquardt.h +++ b/unsupported/Eigen/src/NonLinear/LevenbergMarquardt.h @@ -1,5 +1,4 @@ - template class LevenbergMarquardt { @@ -21,6 +20,20 @@ public: UserAsked = 9 }; + struct Parameters { + Parameters() + : factor(Scalar(100.)) + , maxfev(400) + , ftol(ei_sqrt(epsilon())) + , xtol(ei_sqrt(epsilon())) + , gtol(Scalar(0.)) { } + Scalar factor; + int maxfev; // maximum number of function evaluation + Scalar ftol; + Scalar xtol; + Scalar gtol; + }; + Status minimize( Matrix< Scalar, Dynamic, 1 > &x, const Scalar tol = ei_sqrt(epsilon()) @@ -31,12 +44,8 @@ public: int &nfev, int &njev, Matrix< Scalar, Dynamic, 1 > &diag, - const int mode=1, - const Scalar factor = Scalar(100.), - const int maxfev = 400, - const Scalar ftol = ei_sqrt(epsilon()), - const Scalar xtol = ei_sqrt(epsilon()), - const Scalar gtol = Scalar(0.) + const Parameters ¶meters, + const int mode=1 ); Status minimizeNumericalDiff( @@ -48,12 +57,8 @@ public: Matrix< Scalar, Dynamic, 1 > &x, int &nfev, Matrix< Scalar, Dynamic, 1 > &diag, + const Parameters ¶meters, const int mode=1, - const Scalar factor = Scalar(100.), - const int maxfev = 400, - const Scalar ftol = ei_sqrt(epsilon()), - const Scalar xtol = ei_sqrt(epsilon()), - const Scalar gtol = Scalar(0.), const Scalar epsfcn = Scalar(0.) ); @@ -67,12 +72,8 @@ public: int &nfev, int &njev, Matrix< Scalar, Dynamic, 1 > &diag, - const int mode=1, - const Scalar factor = Scalar(100.), - const int maxfev = 400, - const Scalar ftol = ei_sqrt(epsilon()), - const Scalar xtol = ei_sqrt(epsilon()), - const Scalar gtol = Scalar(0.) + const Parameters ¶meters, + const int mode=1 ); Matrix< Scalar, Dynamic, 1 > fvec; @@ -96,6 +97,7 @@ LevenbergMarquardt::minimize( Matrix< Scalar, Dynamic, Dynamic > fjac(m, n); Matrix< Scalar, Dynamic, 1> diag, qtf; VectorXi ipvt; + Parameters parameters; /* check the input parameters for errors. */ if (n <= 0 || m < n || tol < 0.) { @@ -103,14 +105,16 @@ LevenbergMarquardt::minimize( return ImproperInputParameters; } + parameters.ftol = tol; + parameters.xtol = tol; + parameters.maxfev = 100*(n+1); + return minimize( x, nfev, njev, diag, - 1, - 100., - (n+1)*100, - tol, tol, Scalar(0.) + parameters, + 1 ); } @@ -122,12 +126,8 @@ LevenbergMarquardt::minimize( int &nfev, int &njev, Matrix< Scalar, Dynamic, 1 > &diag, - const int mode, - const Scalar factor, - const int maxfev, - const Scalar ftol, - const Scalar xtol, - const Scalar gtol + const Parameters ¶meters, + const int mode ) { const int n = x.size(); @@ -156,7 +156,7 @@ LevenbergMarquardt::minimize( /* check the input parameters for errors. */ - if (n <= 0 || m < n || ftol < 0. || xtol < 0. || gtol < 0. || maxfev <= 0 || factor <= 0.) + if (n <= 0 || m < n || parameters.ftol < 0. || parameters.xtol < 0. || parameters.gtol < 0. || parameters.maxfev <= 0 || parameters.factor <= 0.) return RelativeErrorTooSmall; if (mode == 2) @@ -208,9 +208,9 @@ LevenbergMarquardt::minimize( wa3 = diag.cwise() * x; xnorm = wa3.stableNorm(); - delta = factor * xnorm; + delta = parameters.factor * xnorm; if (delta == 0.) - delta = factor; + delta = parameters.factor; } /* form (q transpose)*fvec and store the first n components in */ @@ -247,7 +247,7 @@ LevenbergMarquardt::minimize( /* test for convergence of the gradient norm. */ - if (gnorm <= gtol) + if (gnorm <= parameters.gtol) return CosinusTooSmall; /* rescale if necessary. */ @@ -341,16 +341,16 @@ LevenbergMarquardt::minimize( /* tests for convergence. */ - if (ei_abs(actred) <= ftol && prered <= ftol && Scalar(.5) * ratio <= 1. && delta <= xtol * xnorm) + if (ei_abs(actred) <= parameters.ftol && prered <= parameters.ftol && Scalar(.5) * ratio <= 1. && delta <= parameters.xtol * xnorm) return RelativeErrorAndReductionTooSmall; - if (ei_abs(actred) <= ftol && prered <= ftol && Scalar(.5) * ratio <= 1.) + if (ei_abs(actred) <= parameters.ftol && prered <= parameters.ftol && Scalar(.5) * ratio <= 1.) return RelativeReductionTooSmall; - if (delta <= xtol * xnorm) + if (delta <= parameters.xtol * xnorm) return RelativeErrorTooSmall; /* tests for termination and stringent tolerances. */ - if (nfev >= maxfev) + if (nfev >= parameters.maxfev) return TooManyFunctionEvaluation; if (ei_abs(actred) <= epsilon() && prered <= epsilon() && Scalar(.5) * ratio <= 1.) return FtolTooSmall; @@ -379,6 +379,7 @@ LevenbergMarquardt::minimizeNumericalDiff( Matrix< Scalar, Dynamic, Dynamic > fjac(m, n); Matrix< Scalar, Dynamic, 1> diag, qtf; VectorXi ipvt; + Parameters parameters; /* check the input parameters for errors. */ if (n <= 0 || m < n || tol < 0.) { @@ -386,14 +387,17 @@ LevenbergMarquardt::minimizeNumericalDiff( return ImproperInputParameters; } + parameters.ftol = tol; + parameters.xtol = tol; + parameters.maxfev = 200*(n+1); + return minimizeNumericalDiff( x, nfev, diag, + parameters, 1, - 100., - (n+1)*200, - tol, tol, Scalar(0.), Scalar(0.) + Scalar(0.) ); } @@ -403,12 +407,8 @@ LevenbergMarquardt::minimizeNumericalDiff( Matrix< Scalar, Dynamic, 1 > &x, int &nfev, Matrix< Scalar, Dynamic, 1 > &diag, + const Parameters ¶meters, const int mode, - const Scalar factor, - const int maxfev, - const Scalar ftol, - const Scalar xtol, - const Scalar gtol, const Scalar epsfcn ) { @@ -437,7 +437,7 @@ LevenbergMarquardt::minimizeNumericalDiff( /* check the input parameters for errors. */ - if (n <= 0 || m < n || ftol < 0. || xtol < 0. || gtol < 0. || maxfev <= 0 || factor <= 0.) + if (n <= 0 || m < n || parameters.ftol < 0. || parameters.xtol < 0. || parameters.gtol < 0. || parameters.maxfev <= 0 || parameters.factor <= 0.) return RelativeErrorTooSmall; if (mode == 2) for (j = 0; j < n; ++j) @@ -488,9 +488,9 @@ LevenbergMarquardt::minimizeNumericalDiff( wa3 = diag.cwise() * x; xnorm = wa3.stableNorm(); - delta = factor * xnorm; + delta = parameters.factor * xnorm; if (delta == 0.) - delta = factor; + delta = parameters.factor; } /* form (q transpose)*fvec and store the first n components in */ @@ -527,7 +527,7 @@ LevenbergMarquardt::minimizeNumericalDiff( /* test for convergence of the gradient norm. */ - if (gnorm <= gtol) + if (gnorm <= parameters.gtol) return CosinusTooSmall; /* rescale if necessary. */ @@ -621,16 +621,16 @@ LevenbergMarquardt::minimizeNumericalDiff( /* tests for convergence. */ - if (ei_abs(actred) <= ftol && prered <= ftol && Scalar(.5) * ratio <= 1. && delta <= xtol * xnorm) + if (ei_abs(actred) <= parameters.ftol && prered <= parameters.ftol && Scalar(.5) * ratio <= 1. && delta <= parameters.xtol * xnorm) return RelativeErrorAndReductionTooSmall; - if (ei_abs(actred) <= ftol && prered <= ftol && Scalar(.5) * ratio <= 1.) + if (ei_abs(actred) <= parameters.ftol && prered <= parameters.ftol && Scalar(.5) * ratio <= 1.) return RelativeReductionTooSmall; - if (delta <= xtol * xnorm) + if (delta <= parameters.xtol * xnorm) return RelativeErrorTooSmall; /* tests for termination and stringent tolerances. */ - if (nfev >= maxfev) + if (nfev >= parameters.maxfev) return TooManyFunctionEvaluation; if (ei_abs(actred) <= epsilon() && prered <= epsilon() && Scalar(.5) * ratio <= 1.) return FtolTooSmall; @@ -660,6 +660,7 @@ LevenbergMarquardt::minimizeOptimumStorage( Matrix< Scalar, Dynamic, Dynamic > fjac(m, n); Matrix< Scalar, Dynamic, 1> diag, qtf; VectorXi ipvt; + Parameters parameters; /* check the input parameters for errors. */ if (n <= 0 || m < n || tol < 0.) { @@ -667,14 +668,16 @@ LevenbergMarquardt::minimizeOptimumStorage( return ImproperInputParameters; } + parameters.ftol = tol; + parameters.xtol = tol; + parameters.maxfev = 100*(n+1); + return minimizeOptimumStorage( x, nfev, njev, diag, - 1, - 100., - (n+1)*100, - tol, tol, Scalar(0.) + parameters, + 1 ); } @@ -685,12 +688,8 @@ LevenbergMarquardt::minimizeOptimumStorage( int &nfev, int &njev, Matrix< Scalar, Dynamic, 1 > &diag, - const int mode, - const Scalar factor, - const int maxfev, - const Scalar ftol, - const Scalar xtol, - const Scalar gtol + const Parameters ¶meters, + const int mode ) { const int n = x.size(); @@ -720,7 +719,7 @@ LevenbergMarquardt::minimizeOptimumStorage( /* check the input parameters for errors. */ - if (n <= 0 || m < n || ftol < 0. || xtol < 0. || gtol < 0. || maxfev <= 0 || factor <= 0.) + if (n <= 0 || m < n || parameters.ftol < 0. || parameters.xtol < 0. || parameters.gtol < 0. || parameters.maxfev <= 0 || parameters.factor <= 0.) return RelativeErrorTooSmall; if (mode == 2) @@ -805,9 +804,9 @@ LevenbergMarquardt::minimizeOptimumStorage( wa3 = diag.cwise() * x; xnorm = wa3.stableNorm(); - delta = factor * xnorm; + delta = parameters.factor * xnorm; if (delta == 0.) - delta = factor; + delta = parameters.factor; } /* compute the norm of the scaled gradient. */ @@ -827,7 +826,7 @@ LevenbergMarquardt::minimizeOptimumStorage( /* test for convergence of the gradient norm. */ - if (gnorm <= gtol) + if (gnorm <= parameters.gtol) return CosinusTooSmall; /* rescale if necessary. */ @@ -921,16 +920,16 @@ LevenbergMarquardt::minimizeOptimumStorage( /* tests for convergence. */ - if (ei_abs(actred) <= ftol && prered <= ftol && Scalar(.5) * ratio <= 1. && delta <= xtol * xnorm) + if (ei_abs(actred) <= parameters.ftol && prered <= parameters.ftol && Scalar(.5) * ratio <= 1. && delta <= parameters.xtol * xnorm) return RelativeErrorAndReductionTooSmall; - if (ei_abs(actred) <= ftol && prered <= ftol && Scalar(.5) * ratio <= 1.) + if (ei_abs(actred) <= parameters.ftol && prered <= parameters.ftol && Scalar(.5) * ratio <= 1.) return RelativeReductionTooSmall; - if (delta <= xtol * xnorm) + if (delta <= parameters.xtol * xnorm) return RelativeErrorTooSmall; /* tests for termination and stringent tolerances. */ - if (nfev >= maxfev) + if (nfev >= parameters.maxfev) return TooManyFunctionEvaluation; if (ei_abs(actred) <= epsilon() && prered <= epsilon() && Scalar(.5) * ratio <= 1.) return FtolTooSmall; diff --git a/unsupported/test/NonLinear.cpp b/unsupported/test/NonLinear.cpp index 39a5239dc..1e9b92e38 100644 --- a/unsupported/test/NonLinear.cpp +++ b/unsupported/test/NonLinear.cpp @@ -181,7 +181,8 @@ void testLmder() // do the computation lmder_functor functor; LevenbergMarquardt lm(functor); - info = lm.minimize(x, nfev, njev, diag); + LevenbergMarquardt::Parameters parameters; + info = lm.minimize(x, nfev, njev, diag, parameters); // check return values VERIFY( 1 == info); @@ -290,19 +291,19 @@ void testHybrj1() void testHybrj() { const int n=9; - int info, nfev=0, njev=0, mode; + int info, nfev=0, njev=0; VectorXd x(n), diag(n); /* the following starting values provide a rough fit. */ x.setConstant(n, -1.); - mode = 2; diag.setConstant(n, 1.); // do the computation hybrj_functor functor; HybridNonLinearSolver solver(functor); - info = solver.solve(x, nfev, njev, diag, mode); + HybridNonLinearSolver::Parameters parameters; + info = solver.solve(x, nfev, njev, diag, parameters, 2); // check return value VERIFY( 1 == info); @@ -372,7 +373,7 @@ void testHybrd1() void testHybrd() { const int n=9; - int info, nfev=0, ml, mu, mode; + int info, nfev=0, ml, mu; VectorXd x, diag(n); /* the following starting values provide a rough fit. */ @@ -380,13 +381,13 @@ void testHybrd() ml = 1; mu = 1; - mode = 2; diag.setConstant(n, 1.); // do the computation hybrd_functor functor; HybridNonLinearSolver solver(functor); - info = solver.solveNumericalDiff(x, nfev, diag, mode, ml, mu); + HybridNonLinearSolver::Parameters parameters; + info = solver.solveNumericalDiff(x, nfev, diag, parameters, 2, ml, mu); // check return value VERIFY( 1 == info); @@ -484,7 +485,8 @@ void testLmstr() // do the computation lmstr_functor functor; LevenbergMarquardt lm(functor); - info = lm.minimizeOptimumStorage(x, nfev, njev, diag); + LevenbergMarquardt::Parameters parameters; + info = lm.minimizeOptimumStorage(x, nfev, njev, diag, parameters); // check return values VERIFY( 1 == info); @@ -570,7 +572,8 @@ void testLmdif() // do the computation lmdif_functor functor; LevenbergMarquardt lm(functor); - info = lm.minimizeNumericalDiff(x, nfev, diag); + LevenbergMarquardt::Parameters parameters; + info = lm.minimizeNumericalDiff(x, nfev, diag, parameters); // check return values VERIFY( 1 == info); @@ -655,7 +658,8 @@ void testNistChwirut2(void) // do the computation chwirut2_functor functor; LevenbergMarquardt lm(functor); - info = lm.minimize(x, nfev, njev, diag); + LevenbergMarquardt::Parameters parameters; + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -673,8 +677,10 @@ void testNistChwirut2(void) */ x<< 0.15, 0.008, 0.010; // do the computation - info = lm.minimize(x, nfev, njev, diag, - 1, 100., 400, 1.E6*epsilon(), 1.E6*epsilon()); + parameters = LevenbergMarquardt::Parameters(); // get default back + parameters.ftol = 1.E6*epsilon(); + parameters.xtol = 1.E6*epsilon(); + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -733,7 +739,8 @@ void testNistMisra1a(void) // do the computation misra1a_functor functor; LevenbergMarquardt lm(functor); - info = lm.minimize(x, nfev, njev, diag); + LevenbergMarquardt::Parameters parameters; + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -750,7 +757,7 @@ void testNistMisra1a(void) */ x<< 250., 0.0005; // do the computation - info = lm.minimize(x, nfev, njev, diag); + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -819,7 +826,8 @@ void testNistHahn1(void) // do the computation hahn1_functor functor; LevenbergMarquardt lm(functor); - info = lm.minimize(x, nfev, njev, diag); + LevenbergMarquardt::Parameters parameters; + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -841,7 +849,7 @@ void testNistHahn1(void) */ x<< .1, -.1, .005, -.000001, -.005, .0001, -.0000001; // do the computation - info = lm.minimize(x, nfev, njev, diag); + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -905,7 +913,8 @@ void testNistMisra1d(void) // do the computation misra1d_functor functor; LevenbergMarquardt lm(functor); - info = lm.minimize(x, nfev, njev, diag); + LevenbergMarquardt::Parameters parameters; + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 3 == info); @@ -922,7 +931,7 @@ void testNistMisra1d(void) */ x<< 450., 0.0003; // do the computation - info = lm.minimize(x, nfev, njev, diag); + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -983,7 +992,8 @@ void testNistLanczos1(void) // do the computation lanczos1_functor functor; LevenbergMarquardt lm(functor); - info = lm.minimize(x, nfev, njev, diag); + LevenbergMarquardt::Parameters parameters; + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 2 == info); @@ -1004,7 +1014,7 @@ void testNistLanczos1(void) */ x<< 0.5, 0.7, 3.6, 4.2, 4., 6.3; // do the computation - info = lm.minimize(x, nfev, njev, diag); + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 2 == info); @@ -1069,7 +1079,8 @@ void testNistRat42(void) // do the computation rat42_functor functor; LevenbergMarquardt lm(functor); - info = lm.minimize(x, nfev, njev, diag); + LevenbergMarquardt::Parameters parameters; + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -1087,7 +1098,7 @@ void testNistRat42(void) */ x<< 75., 2.5, 0.07; // do the computation - info = lm.minimize(x, nfev, njev, diag); + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -1147,7 +1158,8 @@ void testNistMGH10(void) // do the computation MGH10_functor functor; LevenbergMarquardt lm(functor); - info = lm.minimize(x, nfev, njev, diag); + LevenbergMarquardt::Parameters parameters; + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 2 == info); @@ -1165,7 +1177,7 @@ void testNistMGH10(void) */ x<< 0.02, 4000., 250.; // do the computation - info = lm.minimize(x, nfev, njev, diag); + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 2 == info); @@ -1223,8 +1235,11 @@ void testNistBoxBOD(void) // do the computation BoxBOD_functor functor; LevenbergMarquardt lm(functor); - info = lm.minimize(x, nfev, njev, diag, - 1, 10., 400, 1E6*epsilon(), 1E6*epsilon()); + LevenbergMarquardt::Parameters parameters; + parameters.ftol = 1.E6*epsilon(); + parameters.xtol = 1.E6*epsilon(); + parameters.factor = 10.; + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -1241,8 +1256,10 @@ void testNistBoxBOD(void) */ x<< 100., 0.75; // do the computation - info = lm.minimize(x, nfev, njev, diag, - 1, 100., 14000, epsilon(), epsilon()); + parameters = LevenbergMarquardt::Parameters(); // get default back + parameters.ftol = epsilon(); + parameters.xtol = epsilon(); + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -1301,8 +1318,11 @@ void testNistMGH17(void) // do the computation MGH17_functor functor; LevenbergMarquardt lm(functor); - info = lm.minimize(x, nfev, njev, diag, - 1, 100., 5000, epsilon(), epsilon()); + LevenbergMarquardt::Parameters parameters; + parameters.ftol = epsilon(); + parameters.xtol = epsilon(); + parameters.maxfev = 1000; + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -1322,7 +1342,8 @@ void testNistMGH17(void) */ x<< 0.5 ,1.5 ,-1 ,0.01 ,0.02; // do the computation - info = lm.minimize(x, nfev, njev, diag); + parameters = LevenbergMarquardt::Parameters(); // get default back + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -1387,8 +1408,9 @@ void testNistMGH09(void) // do the computation MGH09_functor functor; LevenbergMarquardt lm(functor); - info = lm.minimize(x, nfev, njev, diag, - 1, 100., 5000); + LevenbergMarquardt::Parameters parameters; + parameters.maxfev = 1000; + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -1407,7 +1429,8 @@ void testNistMGH09(void) */ x<< 0.25, 0.39, 0.415, 0.39; // do the computation - info = lm.minimize(x, nfev, njev, diag); + parameters = LevenbergMarquardt::Parameters(); + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -1469,7 +1492,9 @@ void testNistBennett5(void) // do the computation Bennett5_functor functor; LevenbergMarquardt lm(functor); - info = lm.minimize(x, nfev, njev, diag, 1, 100., 5000); + LevenbergMarquardt::Parameters parameters; + parameters.maxfev = 1000; + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -1486,7 +1511,8 @@ void testNistBennett5(void) */ x<< -1500., 45., 0.85; // do the computation - info = lm.minimize(x, nfev, njev, diag); + parameters = LevenbergMarquardt::Parameters(); + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -1554,8 +1580,10 @@ void testNistThurber(void) // do the computation thurber_functor functor; LevenbergMarquardt lm(functor); - info = lm.minimize(x, nfev, njev, diag, - 1, 100., 400, 1.E4*epsilon(), 1.E4*epsilon()); + LevenbergMarquardt::Parameters parameters; + parameters.ftol = 1.E4*epsilon(); + parameters.xtol = 1.E4*epsilon(); + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -1577,8 +1605,10 @@ void testNistThurber(void) */ x<< 1300 ,1500 ,500 ,75 ,1 ,0.4 ,0.05 ; // do the computation - info = lm.minimize(x, nfev, njev, diag, - 1, 100., 400, 1.E4*epsilon(), 1.E4*epsilon()); + parameters = LevenbergMarquardt::Parameters(); + parameters.ftol = 1.E4*epsilon(); + parameters.xtol = 1.E4*epsilon(); + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -1643,8 +1673,10 @@ void testNistRat43(void) // do the computation rat43_functor functor; LevenbergMarquardt lm(functor); - info = lm.minimize(x, nfev, njev, diag, - 1, 100., 400, 1.E6*epsilon(), 1.E6*epsilon()); + LevenbergMarquardt::Parameters parameters; + parameters.ftol = 1.E6*epsilon(); + parameters.xtol = 1.E6*epsilon(); + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -1663,8 +1695,10 @@ void testNistRat43(void) */ x<< 700., 5., 0.75, 1.3; // do the computation - info = lm.minimize(x, nfev, njev, diag, - 1, 100., 400, 1.E5*epsilon(), 1.E5*epsilon()); + parameters = LevenbergMarquardt::Parameters(); // get default back + parameters.ftol = 1.E5*epsilon(); + parameters.xtol = 1.E5*epsilon(); + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -1727,7 +1761,8 @@ void testNistEckerle4(void) // do the computation eckerle4_functor functor; LevenbergMarquardt lm(functor); - info = lm.minimize(x, nfev, njev, diag); + LevenbergMarquardt::Parameters parameters; + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info); @@ -1745,7 +1780,7 @@ void testNistEckerle4(void) */ x<< 1.5, 5., 450.; // do the computation - info = lm.minimize(x, nfev, njev, diag); + info = lm.minimize(x, nfev, njev, diag, parameters); // check return value VERIFY( 1 == info);