Remove poor non-convergence checks in NonLinearOptimization.

This commit is contained in:
Antonio Sánchez 2022-03-02 19:31:20 +00:00
parent 9c07e201ff
commit d819a33bf6
2 changed files with 220 additions and 155 deletions

View File

@ -12,14 +12,10 @@
// It is intended to be done for this test only. // It is intended to be done for this test only.
#include <Eigen/src/Core/util/DisableStupidWarnings.h> #include <Eigen/src/Core/util/DisableStupidWarnings.h>
// tolerance for chekcing number of iterations // tolerance for checking number of iterations
#define LM_EVAL_COUNT_TOL 4/3 #define LM_EVAL_COUNT_TOL 2
#define LM_CHECK_N_ITERS(SOLVER,NFEV,NJEV) { \ #define LM_CHECK_N_ITERS(SOLVER,NFEV,NJEV) { \
++g_test_level; \
VERIFY_IS_EQUAL(SOLVER.nfev, NFEV); \
VERIFY_IS_EQUAL(SOLVER.njev, NJEV); \
--g_test_level; \
VERIFY(SOLVER.nfev <= NFEV * LM_EVAL_COUNT_TOL); \ VERIFY(SOLVER.nfev <= NFEV * LM_EVAL_COUNT_TOL); \
VERIFY(SOLVER.njev <= NJEV * LM_EVAL_COUNT_TOL); \ VERIFY(SOLVER.njev <= NJEV * LM_EVAL_COUNT_TOL); \
} }
@ -186,9 +182,10 @@ void testLmder1()
lmder_functor functor; lmder_functor functor;
LevenbergMarquardt<lmder_functor> lm(functor); LevenbergMarquardt<lmder_functor> lm(functor);
info = lm.lmder1(x); info = lm.lmder1(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 6, 5); LM_CHECK_N_ITERS(lm, 6, 5);
// check norm // check norm
@ -214,9 +211,10 @@ void testLmder()
lmder_functor functor; lmder_functor functor;
LevenbergMarquardt<lmder_functor> lm(functor); LevenbergMarquardt<lmder_functor> lm(functor);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return values // check return values
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 6, 5); LM_CHECK_N_ITERS(lm, 6, 5);
// check norm // check norm
@ -298,9 +296,10 @@ void testHybrj1()
hybrj_functor functor; hybrj_functor functor;
HybridNonLinearSolver<hybrj_functor> solver(functor); HybridNonLinearSolver<hybrj_functor> solver(functor);
info = solver.hybrj1(x); info = solver.hybrj1(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(solver, 11, 1); LM_CHECK_N_ITERS(solver, 11, 1);
// check norm // check norm
@ -332,9 +331,10 @@ void testHybrj()
solver.diag.setConstant(n, 1.); solver.diag.setConstant(n, 1.);
solver.useExternalScaling = true; solver.useExternalScaling = true;
info = solver.solve(x); info = solver.solve(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(solver, 11, 1); LM_CHECK_N_ITERS(solver, 11, 1);
// check norm // check norm
@ -385,10 +385,11 @@ void testHybrd1()
hybrd_functor functor; hybrd_functor functor;
HybridNonLinearSolver<hybrd_functor> solver(functor); HybridNonLinearSolver<hybrd_functor> solver(functor);
info = solver.hybrd1(x); info = solver.hybrd1(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY_IS_EQUAL(solver.nfev, 20); VERIFY(solver.nfev <= 20*LM_EVAL_COUNT_TOL);
// check norm // check norm
VERIFY_IS_APPROX(solver.fvec.blueNorm(), 1.192636e-08); VERIFY_IS_APPROX(solver.fvec.blueNorm(), 1.192636e-08);
@ -416,10 +417,11 @@ void testHybrd()
solver.diag.setConstant(n, 1.); solver.diag.setConstant(n, 1.);
solver.useExternalScaling = true; solver.useExternalScaling = true;
info = solver.solveNumericalDiff(x); info = solver.solveNumericalDiff(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY_IS_EQUAL(solver.nfev, 14); VERIFY(solver.nfev <= 14*LM_EVAL_COUNT_TOL);
// check norm // check norm
VERIFY_IS_APPROX(solver.fvec.blueNorm(), 1.192636e-08); VERIFY_IS_APPROX(solver.fvec.blueNorm(), 1.192636e-08);
@ -487,9 +489,10 @@ void testLmstr1()
lmstr_functor functor; lmstr_functor functor;
LevenbergMarquardt<lmstr_functor> lm(functor); LevenbergMarquardt<lmstr_functor> lm(functor);
info = lm.lmstr1(x); info = lm.lmstr1(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 6, 5); LM_CHECK_N_ITERS(lm, 6, 5);
// check norm // check norm
@ -515,9 +518,10 @@ void testLmstr()
lmstr_functor functor; lmstr_functor functor;
LevenbergMarquardt<lmstr_functor> lm(functor); LevenbergMarquardt<lmstr_functor> lm(functor);
info = lm.minimizeOptimumStorage(x); info = lm.minimizeOptimumStorage(x);
EIGEN_UNUSED_VARIABLE(info)
// check return values // check return values
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 6, 5); LM_CHECK_N_ITERS(lm, 6, 5);
// check norm // check norm
@ -570,10 +574,11 @@ void testLmdif1()
lmdif_functor functor; lmdif_functor functor;
DenseIndex nfev = -1; // initialize to avoid maybe-uninitialized warning DenseIndex nfev = -1; // initialize to avoid maybe-uninitialized warning
info = LevenbergMarquardt<lmdif_functor>::lmdif1(functor, x, &nfev); info = LevenbergMarquardt<lmdif_functor>::lmdif1(functor, x, &nfev);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY_IS_EQUAL(nfev, 26); VERIFY( nfev <= 26*LM_EVAL_COUNT_TOL);
// check norm // check norm
functor(x, fvec); functor(x, fvec);
@ -601,10 +606,11 @@ void testLmdif()
NumericalDiff<lmdif_functor> numDiff(functor); NumericalDiff<lmdif_functor> numDiff(functor);
LevenbergMarquardt<NumericalDiff<lmdif_functor> > lm(numDiff); LevenbergMarquardt<NumericalDiff<lmdif_functor> > lm(numDiff);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return values // check return values
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY_IS_EQUAL(lm.nfev, 26); VERIFY(lm.nfev <= 26*LM_EVAL_COUNT_TOL);
// check norm // check norm
fnorm = lm.fvec.blueNorm(); fnorm = lm.fvec.blueNorm();
@ -686,9 +692,10 @@ void testNistChwirut2(void)
chwirut2_functor functor; chwirut2_functor functor;
LevenbergMarquardt<chwirut2_functor> lm(functor); LevenbergMarquardt<chwirut2_functor> lm(functor);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 10, 8); LM_CHECK_N_ITERS(lm, 10, 8);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.1304802941E+02); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.1304802941E+02);
@ -706,9 +713,10 @@ void testNistChwirut2(void)
lm.parameters.ftol = 1.E6*NumTraits<double>::epsilon(); lm.parameters.ftol = 1.E6*NumTraits<double>::epsilon();
lm.parameters.xtol = 1.E6*NumTraits<double>::epsilon(); lm.parameters.xtol = 1.E6*NumTraits<double>::epsilon();
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 7, 6); LM_CHECK_N_ITERS(lm, 7, 6);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.1304802941E+02); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.1304802941E+02);
@ -764,9 +772,10 @@ void testNistMisra1a(void)
misra1a_functor functor; misra1a_functor functor;
LevenbergMarquardt<misra1a_functor> lm(functor); LevenbergMarquardt<misra1a_functor> lm(functor);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 19, 15); LM_CHECK_N_ITERS(lm, 19, 15);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.2455138894E-01); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.2455138894E-01);
@ -780,9 +789,10 @@ void testNistMisra1a(void)
x<< 250., 0.0005; x<< 250., 0.0005;
// do the computation // do the computation
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 5, 4); LM_CHECK_N_ITERS(lm, 5, 4);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.2455138894E-01); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.2455138894E-01);
@ -852,9 +862,10 @@ void testNistHahn1(void)
hahn1_functor functor; hahn1_functor functor;
LevenbergMarquardt<hahn1_functor> lm(functor); LevenbergMarquardt<hahn1_functor> lm(functor);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 11, 10); LM_CHECK_N_ITERS(lm, 11, 10);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.5324382854E+00); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.5324382854E+00);
@ -873,9 +884,10 @@ void testNistHahn1(void)
x<< .1, -.1, .005, -.000001, -.005, .0001, -.0000001; x<< .1, -.1, .005, -.000001, -.005, .0001, -.0000001;
// do the computation // do the computation
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 11, 10); LM_CHECK_N_ITERS(lm, 11, 10);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.5324382854E+00); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.5324382854E+00);
@ -936,9 +948,10 @@ void testNistMisra1d(void)
misra1d_functor functor; misra1d_functor functor;
LevenbergMarquardt<misra1d_functor> lm(functor); LevenbergMarquardt<misra1d_functor> lm(functor);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 3); // VERIFY_IS_EQUAL(info, 3);
LM_CHECK_N_ITERS(lm, 9, 7); LM_CHECK_N_ITERS(lm, 9, 7);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.6419295283E-02); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.6419295283E-02);
@ -952,9 +965,10 @@ void testNistMisra1d(void)
x<< 450., 0.0003; x<< 450., 0.0003;
// do the computation // do the computation
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 4, 3); LM_CHECK_N_ITERS(lm, 4, 3);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.6419295283E-02); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.6419295283E-02);
@ -1012,13 +1026,14 @@ void testNistLanczos1(void)
lanczos1_functor functor; lanczos1_functor functor;
LevenbergMarquardt<lanczos1_functor> lm(functor); LevenbergMarquardt<lanczos1_functor> lm(functor);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 2); // VERIFY_IS_EQUAL(info, 2);
LM_CHECK_N_ITERS(lm, 79, 72); LM_CHECK_N_ITERS(lm, 79, 72);
// check norm^2 // check norm^2
std::cout.precision(30); // std::cout.precision(30);
std::cout << lm.fvec.squaredNorm() << "\n"; // std::cout << lm.fvec.squaredNorm() << "\n";
VERIFY(lm.fvec.squaredNorm() <= 1.4307867721E-25); VERIFY(lm.fvec.squaredNorm() <= 1.4307867721E-25);
// check x // check x
VERIFY_IS_APPROX(x[0], 9.5100000027E-02); VERIFY_IS_APPROX(x[0], 9.5100000027E-02);
@ -1034,9 +1049,10 @@ void testNistLanczos1(void)
x<< 0.5, 0.7, 3.6, 4.2, 4., 6.3; x<< 0.5, 0.7, 3.6, 4.2, 4., 6.3;
// do the computation // do the computation
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 2); // VERIFY_IS_EQUAL(info, 2);
LM_CHECK_N_ITERS(lm, 9, 8); LM_CHECK_N_ITERS(lm, 9, 8);
// check norm^2 // check norm^2
VERIFY(lm.fvec.squaredNorm() <= 1.4307867721E-25); VERIFY(lm.fvec.squaredNorm() <= 1.4307867721E-25);
@ -1098,9 +1114,10 @@ void testNistRat42(void)
rat42_functor functor; rat42_functor functor;
LevenbergMarquardt<rat42_functor> lm(functor); LevenbergMarquardt<rat42_functor> lm(functor);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 10, 8); LM_CHECK_N_ITERS(lm, 10, 8);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.0565229338E+00); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.0565229338E+00);
@ -1115,9 +1132,10 @@ void testNistRat42(void)
x<< 75., 2.5, 0.07; x<< 75., 2.5, 0.07;
// do the computation // do the computation
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 6, 5); LM_CHECK_N_ITERS(lm, 6, 5);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.0565229338E+00); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.0565229338E+00);
@ -1174,9 +1192,10 @@ void testNistMGH10(void)
MGH10_functor functor; MGH10_functor functor;
LevenbergMarquardt<MGH10_functor> lm(functor); LevenbergMarquardt<MGH10_functor> lm(functor);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 2); // VERIFY_IS_EQUAL(info, 2);
LM_CHECK_N_ITERS(lm, 284, 249); LM_CHECK_N_ITERS(lm, 284, 249);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.7945855171E+01); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.7945855171E+01);
@ -1191,9 +1210,10 @@ void testNistMGH10(void)
x<< 0.02, 4000., 250.; x<< 0.02, 4000., 250.;
// do the computation // do the computation
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 3); // VERIFY_IS_EQUAL(info, 3);
LM_CHECK_N_ITERS(lm, 126, 116); LM_CHECK_N_ITERS(lm, 126, 116);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.7945855171E+01); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.7945855171E+01);
@ -1251,9 +1271,10 @@ void testNistBoxBOD(void)
lm.parameters.xtol = 1.E6*NumTraits<double>::epsilon(); lm.parameters.xtol = 1.E6*NumTraits<double>::epsilon();
lm.parameters.factor = 10.; lm.parameters.factor = 10.;
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 31, 25); LM_CHECK_N_ITERS(lm, 31, 25);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.1680088766E+03); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.1680088766E+03);
@ -1270,10 +1291,11 @@ void testNistBoxBOD(void)
lm.parameters.ftol = NumTraits<double>::epsilon(); lm.parameters.ftol = NumTraits<double>::epsilon();
lm.parameters.xtol = NumTraits<double>::epsilon(); lm.parameters.xtol = NumTraits<double>::epsilon();
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 15, 14); LM_CHECK_N_ITERS(lm, 20, 14);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.1680088766E+03); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.1680088766E+03);
// check x // check x
@ -1331,6 +1353,7 @@ void testNistMGH17(void)
lm.parameters.xtol = NumTraits<double>::epsilon(); lm.parameters.xtol = NumTraits<double>::epsilon();
lm.parameters.maxfev = 1000; lm.parameters.maxfev = 1000;
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.4648946975E-05); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.4648946975E-05);
@ -1342,7 +1365,7 @@ void testNistMGH17(void)
VERIFY_IS_APPROX(x[4], 2.2122699662E-02); VERIFY_IS_APPROX(x[4], 2.2122699662E-02);
// check return value // check return value
VERIFY_IS_EQUAL(info, 2); // VERIFY_IS_EQUAL(info, 2);
LM_CHECK_N_ITERS(lm, 602, 545); LM_CHECK_N_ITERS(lm, 602, 545);
/* /*
@ -1352,9 +1375,10 @@ void testNistMGH17(void)
// do the computation // do the computation
lm.resetParameters(); lm.resetParameters();
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 18, 15); LM_CHECK_N_ITERS(lm, 18, 15);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.4648946975E-05); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.4648946975E-05);
@ -1417,9 +1441,10 @@ void testNistMGH09(void)
LevenbergMarquardt<MGH09_functor> lm(functor); LevenbergMarquardt<MGH09_functor> lm(functor);
lm.parameters.maxfev = 1000; lm.parameters.maxfev = 1000;
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 490, 376); LM_CHECK_N_ITERS(lm, 490, 376);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 3.0750560385E-04); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 3.0750560385E-04);
@ -1436,9 +1461,10 @@ void testNistMGH09(void)
// do the computation // do the computation
lm.resetParameters(); lm.resetParameters();
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 18, 16); LM_CHECK_N_ITERS(lm, 18, 16);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 3.0750560385E-04); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 3.0750560385E-04);
@ -1501,9 +1527,10 @@ void testNistBennett5(void)
LevenbergMarquardt<Bennett5_functor> lm(functor); LevenbergMarquardt<Bennett5_functor> lm(functor);
lm.parameters.maxfev = 1000; lm.parameters.maxfev = 1000;
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 758, 744); LM_CHECK_N_ITERS(lm, 758, 744);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.2404744073E-04); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.2404744073E-04);
@ -1518,9 +1545,10 @@ void testNistBennett5(void)
// do the computation // do the computation
lm.resetParameters(); lm.resetParameters();
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 203, 192); LM_CHECK_N_ITERS(lm, 203, 192);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.2404744073E-04); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.2404744073E-04);
@ -1587,9 +1615,10 @@ void testNistThurber(void)
lm.parameters.ftol = 1.E4*NumTraits<double>::epsilon(); lm.parameters.ftol = 1.E4*NumTraits<double>::epsilon();
lm.parameters.xtol = 1.E4*NumTraits<double>::epsilon(); lm.parameters.xtol = 1.E4*NumTraits<double>::epsilon();
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 39,36); LM_CHECK_N_ITERS(lm, 39,36);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.6427082397E+03); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.6427082397E+03);
@ -1611,9 +1640,10 @@ void testNistThurber(void)
lm.parameters.ftol = 1.E4*NumTraits<double>::epsilon(); lm.parameters.ftol = 1.E4*NumTraits<double>::epsilon();
lm.parameters.xtol = 1.E4*NumTraits<double>::epsilon(); lm.parameters.xtol = 1.E4*NumTraits<double>::epsilon();
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 29, 28); LM_CHECK_N_ITERS(lm, 29, 28);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.6427082397E+03); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.6427082397E+03);
@ -1677,9 +1707,10 @@ void testNistRat43(void)
lm.parameters.ftol = 1.E6*NumTraits<double>::epsilon(); lm.parameters.ftol = 1.E6*NumTraits<double>::epsilon();
lm.parameters.xtol = 1.E6*NumTraits<double>::epsilon(); lm.parameters.xtol = 1.E6*NumTraits<double>::epsilon();
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 27, 20); LM_CHECK_N_ITERS(lm, 27, 20);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.7864049080E+03); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.7864049080E+03);
@ -1698,9 +1729,10 @@ void testNistRat43(void)
lm.parameters.ftol = 1.E5*NumTraits<double>::epsilon(); lm.parameters.ftol = 1.E5*NumTraits<double>::epsilon();
lm.parameters.xtol = 1.E5*NumTraits<double>::epsilon(); lm.parameters.xtol = 1.E5*NumTraits<double>::epsilon();
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 9, 8); LM_CHECK_N_ITERS(lm, 9, 8);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.7864049080E+03); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.7864049080E+03);
@ -1760,9 +1792,10 @@ void testNistEckerle4(void)
eckerle4_functor functor; eckerle4_functor functor;
LevenbergMarquardt<eckerle4_functor> lm(functor); LevenbergMarquardt<eckerle4_functor> lm(functor);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 18, 15); LM_CHECK_N_ITERS(lm, 18, 15);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.4635887487E-03); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.4635887487E-03);
@ -1777,9 +1810,10 @@ void testNistEckerle4(void)
x<< 1.5, 5., 450.; x<< 1.5, 5., 450.;
// do the computation // do the computation
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
LM_CHECK_N_ITERS(lm, 7, 6); LM_CHECK_N_ITERS(lm, 7, 6);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.4635887487E-03); VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.4635887487E-03);

View File

@ -24,7 +24,7 @@
using std::sqrt; using std::sqrt;
// tolerance for chekcing number of iterations // tolerance for chekcing number of iterations
#define LM_EVAL_COUNT_TOL 4/3 #define LM_EVAL_COUNT_TOL 2
struct lmder_functor : DenseFunctor<double> struct lmder_functor : DenseFunctor<double>
{ {
@ -75,11 +75,11 @@ void testLmder1()
lmder_functor functor; lmder_functor functor;
LevenbergMarquardt<lmder_functor> lm(functor); LevenbergMarquardt<lmder_functor> lm(functor);
info = lm.lmder1(x); info = lm.lmder1(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY_IS_EQUAL(lm.nfev(), 6); // VERIFY_IS_EQUAL(lm.nfev(), 6);
VERIFY_IS_EQUAL(lm.njev(), 5); // VERIFY_IS_EQUAL(lm.njev(), 5);
// check norm // check norm
VERIFY_IS_APPROX(lm.fvec().blueNorm(), 0.09063596); VERIFY_IS_APPROX(lm.fvec().blueNorm(), 0.09063596);
@ -104,11 +104,12 @@ void testLmder()
lmder_functor functor; lmder_functor functor;
LevenbergMarquardt<lmder_functor> lm(functor); LevenbergMarquardt<lmder_functor> lm(functor);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return values // check return values
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY_IS_EQUAL(lm.nfev(), 6); // VERIFY_IS_EQUAL(lm.nfev(), 6);
VERIFY_IS_EQUAL(lm.njev(), 5); // VERIFY_IS_EQUAL(lm.njev(), 5);
// check norm // check norm
fnorm = lm.fvec().blueNorm(); fnorm = lm.fvec().blueNorm();
@ -177,9 +178,10 @@ void testLmdif1()
lmdif_functor functor; lmdif_functor functor;
DenseIndex nfev; DenseIndex nfev;
info = LevenbergMarquardt<lmdif_functor>::lmdif1(functor, x, &nfev); info = LevenbergMarquardt<lmdif_functor>::lmdif1(functor, x, &nfev);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
// VERIFY_IS_EQUAL(nfev, 26); // VERIFY_IS_EQUAL(nfev, 26);
// check norm // check norm
@ -208,9 +210,10 @@ void testLmdif()
NumericalDiff<lmdif_functor> numDiff(functor); NumericalDiff<lmdif_functor> numDiff(functor);
LevenbergMarquardt<NumericalDiff<lmdif_functor> > lm(numDiff); LevenbergMarquardt<NumericalDiff<lmdif_functor> > lm(numDiff);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return values // check return values
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
// VERIFY_IS_EQUAL(lm.nfev(), 26); // VERIFY_IS_EQUAL(lm.nfev(), 26);
// check norm // check norm
@ -293,11 +296,12 @@ void testNistChwirut2(void)
chwirut2_functor functor; chwirut2_functor functor;
LevenbergMarquardt<chwirut2_functor> lm(functor); LevenbergMarquardt<chwirut2_functor> lm(functor);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
// VERIFY_IS_EQUAL(lm.nfev(), 10); // VERIFY_IS_EQUAL(lm.nfev(), 10);
VERIFY_IS_EQUAL(lm.njev(), 8); // VERIFY_IS_EQUAL(lm.njev(), 8);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.1304802941E+02); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.1304802941E+02);
// check x // check x
@ -314,11 +318,12 @@ void testNistChwirut2(void)
lm.setFtol(1.E6*NumTraits<double>::epsilon()); lm.setFtol(1.E6*NumTraits<double>::epsilon());
lm.setXtol(1.E6*NumTraits<double>::epsilon()); lm.setXtol(1.E6*NumTraits<double>::epsilon());
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
// VERIFY_IS_EQUAL(lm.nfev(), 7); // VERIFY_IS_EQUAL(lm.nfev(), 7);
VERIFY_IS_EQUAL(lm.njev(), 6); // VERIFY_IS_EQUAL(lm.njev(), 6);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.1304802941E+02); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.1304802941E+02);
// check x // check x
@ -373,11 +378,12 @@ void testNistMisra1a(void)
misra1a_functor functor; misra1a_functor functor;
LevenbergMarquardt<misra1a_functor> lm(functor); LevenbergMarquardt<misra1a_functor> lm(functor);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY_IS_EQUAL(lm.nfev(), 19); // VERIFY_IS_EQUAL(lm.nfev(), 19);
VERIFY_IS_EQUAL(lm.njev(), 15); // VERIFY_IS_EQUAL(lm.njev(), 15);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.2455138894E-01); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.2455138894E-01);
// check x // check x
@ -390,11 +396,12 @@ void testNistMisra1a(void)
x<< 250., 0.0005; x<< 250., 0.0005;
// do the computation // do the computation
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY_IS_EQUAL(lm.nfev(), 5); // VERIFY_IS_EQUAL(lm.nfev(), 5);
VERIFY_IS_EQUAL(lm.njev(), 4); // VERIFY_IS_EQUAL(lm.njev(), 4);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.2455138894E-01); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.2455138894E-01);
// check x // check x
@ -464,11 +471,12 @@ void testNistHahn1(void)
hahn1_functor functor; hahn1_functor functor;
LevenbergMarquardt<hahn1_functor> lm(functor); LevenbergMarquardt<hahn1_functor> lm(functor);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY_IS_EQUAL(lm.nfev(), 11); // VERIFY_IS_EQUAL(lm.nfev(), 11);
VERIFY_IS_EQUAL(lm.njev(), 10); // VERIFY_IS_EQUAL(lm.njev(), 10);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.5324382854E+00); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.5324382854E+00);
// check x // check x
@ -486,11 +494,12 @@ void testNistHahn1(void)
x<< .1, -.1, .005, -.000001, -.005, .0001, -.0000001; x<< .1, -.1, .005, -.000001, -.005, .0001, -.0000001;
// do the computation // do the computation
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
// VERIFY_IS_EQUAL(lm.nfev(), 11); // VERIFY_IS_EQUAL(lm.nfev(), 11);
VERIFY_IS_EQUAL(lm.njev(), 10); // VERIFY_IS_EQUAL(lm.njev(), 10);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.5324382854E+00); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.5324382854E+00);
// check x // check x
@ -550,11 +559,12 @@ void testNistMisra1d(void)
misra1d_functor functor; misra1d_functor functor;
LevenbergMarquardt<misra1d_functor> lm(functor); LevenbergMarquardt<misra1d_functor> lm(functor);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY_IS_EQUAL(lm.nfev(), 9); // VERIFY_IS_EQUAL(lm.nfev(), 9);
VERIFY_IS_EQUAL(lm.njev(), 7); // VERIFY_IS_EQUAL(lm.njev(), 7);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.6419295283E-02); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.6419295283E-02);
// check x // check x
@ -567,11 +577,12 @@ void testNistMisra1d(void)
x<< 450., 0.0003; x<< 450., 0.0003;
// do the computation // do the computation
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY_IS_EQUAL(lm.nfev(), 4); // VERIFY_IS_EQUAL(lm.nfev(), 4);
VERIFY_IS_EQUAL(lm.njev(), 3); // VERIFY_IS_EQUAL(lm.njev(), 3);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.6419295283E-02); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.6419295283E-02);
// check x // check x
@ -628,11 +639,12 @@ void testNistLanczos1(void)
lanczos1_functor functor; lanczos1_functor functor;
LevenbergMarquardt<lanczos1_functor> lm(functor); LevenbergMarquardt<lanczos1_functor> lm(functor);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, LevenbergMarquardtSpace::RelativeErrorTooSmall); // VERIFY_IS_EQUAL(info, LevenbergMarquardtSpace::RelativeErrorTooSmall);
VERIFY_IS_EQUAL(lm.nfev(), 79); // VERIFY_IS_EQUAL(lm.nfev(), 79);
VERIFY_IS_EQUAL(lm.njev(), 72); // VERIFY_IS_EQUAL(lm.njev(), 72);
// check norm^2 // check norm^2
VERIFY(lm.fvec().squaredNorm() <= 1.4307867721E-25); VERIFY(lm.fvec().squaredNorm() <= 1.4307867721E-25);
// check x // check x
@ -649,11 +661,12 @@ void testNistLanczos1(void)
x<< 0.5, 0.7, 3.6, 4.2, 4., 6.3; x<< 0.5, 0.7, 3.6, 4.2, 4., 6.3;
// do the computation // do the computation
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, LevenbergMarquardtSpace::RelativeErrorTooSmall); // VERIFY_IS_EQUAL(info, LevenbergMarquardtSpace::RelativeErrorTooSmall);
VERIFY_IS_EQUAL(lm.nfev(), 9); // VERIFY_IS_EQUAL(lm.nfev(), 9);
VERIFY_IS_EQUAL(lm.njev(), 8); // VERIFY_IS_EQUAL(lm.njev(), 8);
// check norm^2 // check norm^2
VERIFY(lm.fvec().squaredNorm() <= 1.4307867721E-25); VERIFY(lm.fvec().squaredNorm() <= 1.4307867721E-25);
// check x // check x
@ -714,11 +727,12 @@ void testNistRat42(void)
rat42_functor functor; rat42_functor functor;
LevenbergMarquardt<rat42_functor> lm(functor); LevenbergMarquardt<rat42_functor> lm(functor);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, LevenbergMarquardtSpace::RelativeReductionTooSmall); // VERIFY_IS_EQUAL(info, LevenbergMarquardtSpace::RelativeReductionTooSmall);
VERIFY_IS_EQUAL(lm.nfev(), 10); // VERIFY_IS_EQUAL(lm.nfev(), 10);
VERIFY_IS_EQUAL(lm.njev(), 8); // VERIFY_IS_EQUAL(lm.njev(), 8);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.0565229338E+00); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.0565229338E+00);
// check x // check x
@ -732,11 +746,12 @@ void testNistRat42(void)
x<< 75., 2.5, 0.07; x<< 75., 2.5, 0.07;
// do the computation // do the computation
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, LevenbergMarquardtSpace::RelativeReductionTooSmall); // VERIFY_IS_EQUAL(info, LevenbergMarquardtSpace::RelativeReductionTooSmall);
VERIFY_IS_EQUAL(lm.nfev(), 6); // VERIFY_IS_EQUAL(lm.nfev(), 6);
VERIFY_IS_EQUAL(lm.njev(), 5); // VERIFY_IS_EQUAL(lm.njev(), 5);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.0565229338E+00); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.0565229338E+00);
// check x // check x
@ -787,14 +802,15 @@ void testNistMGH10(void)
/* /*
* First try * First try
*/ */
x<< 2., 400000., 25000.; x << 2., 400000., 25000.;
// do the computation // do the computation
MGH10_functor functor; MGH10_functor functor;
LevenbergMarquardt<MGH10_functor> lm(functor); LevenbergMarquardt<MGH10_functor> lm(functor);
info = lm.minimize(x); info = lm.minimize(x);
++g_test_level; EIGEN_UNUSED_VARIABLE(info)
VERIFY_IS_EQUAL(info, LevenbergMarquardtSpace::RelativeReductionTooSmall); // ++g_test_level;
--g_test_level; // VERIFY_IS_EQUAL(info, LevenbergMarquardtSpace::RelativeReductionTooSmall);
// --g_test_level;
// was: VERIFY_IS_EQUAL(info, 1); // was: VERIFY_IS_EQUAL(info, 1);
// check norm^2 // check norm^2
@ -805,11 +821,11 @@ void testNistMGH10(void)
VERIFY_IS_APPROX(x[2], 3.4522363462E+02); VERIFY_IS_APPROX(x[2], 3.4522363462E+02);
// check return value // check return value
++g_test_level; // ++g_test_level;
VERIFY_IS_EQUAL(lm.nfev(), 284 ); // VERIFY_IS_EQUAL(lm.nfev(), 284 );
VERIFY_IS_EQUAL(lm.njev(), 249 ); // VERIFY_IS_EQUAL(lm.njev(), 249 );
--g_test_level; // --g_test_level;
VERIFY(lm.nfev() < 284 * LM_EVAL_COUNT_TOL); VERIFY(lm.nfev() < 284 * LM_EVAL_COUNT_TOL);
VERIFY(lm.njev() < 249 * LM_EVAL_COUNT_TOL); VERIFY(lm.njev() < 249 * LM_EVAL_COUNT_TOL);
@ -819,11 +835,12 @@ void testNistMGH10(void)
x<< 0.02, 4000., 250.; x<< 0.02, 4000., 250.;
// do the computation // do the computation
info = lm.minimize(x); info = lm.minimize(x);
++g_test_level; EIGEN_UNUSED_VARIABLE(info)
VERIFY_IS_EQUAL(info, LevenbergMarquardtSpace::RelativeReductionTooSmall); // ++g_test_level;
// was: VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, LevenbergMarquardtSpace::RelativeReductionTooSmall);
--g_test_level; // // was: VERIFY_IS_EQUAL(info, 1);
// --g_test_level;
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.7945855171E+01); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.7945855171E+01);
// check x // check x
@ -832,10 +849,10 @@ void testNistMGH10(void)
VERIFY_IS_APPROX(x[2], 3.4522363462E+02); VERIFY_IS_APPROX(x[2], 3.4522363462E+02);
// check return value // check return value
++g_test_level; // ++g_test_level;
VERIFY_IS_EQUAL(lm.nfev(), 126); // VERIFY_IS_EQUAL(lm.nfev(), 126);
VERIFY_IS_EQUAL(lm.njev(), 116); // VERIFY_IS_EQUAL(lm.njev(), 116);
--g_test_level; // --g_test_level;
VERIFY(lm.nfev() < 126 * LM_EVAL_COUNT_TOL); VERIFY(lm.nfev() < 126 * LM_EVAL_COUNT_TOL);
VERIFY(lm.njev() < 116 * LM_EVAL_COUNT_TOL); VERIFY(lm.njev() < 116 * LM_EVAL_COUNT_TOL);
} }
@ -888,6 +905,7 @@ void testNistBoxBOD(void)
lm.setXtol(1.E6*NumTraits<double>::epsilon()); lm.setXtol(1.E6*NumTraits<double>::epsilon());
lm.setFactor(10); lm.setFactor(10);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.1680088766E+03); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.1680088766E+03);
@ -896,9 +914,9 @@ void testNistBoxBOD(void)
VERIFY_IS_APPROX(x[1], 5.4723748542E-01); VERIFY_IS_APPROX(x[1], 5.4723748542E-01);
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY(lm.nfev() < 31); // 31 // VERIFY(lm.nfev() < 31); // 31
VERIFY(lm.njev() < 25); // 25 // VERIFY(lm.njev() < 25); // 25
/* /*
* Second try * Second try
@ -909,13 +927,14 @@ void testNistBoxBOD(void)
lm.setFtol(NumTraits<double>::epsilon()); lm.setFtol(NumTraits<double>::epsilon());
lm.setXtol( NumTraits<double>::epsilon()); lm.setXtol( NumTraits<double>::epsilon());
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
++g_test_level; // ++g_test_level;
VERIFY_IS_EQUAL(lm.nfev(), 16 ); // VERIFY_IS_EQUAL(lm.nfev(), 16 );
VERIFY_IS_EQUAL(lm.njev(), 15 ); // VERIFY_IS_EQUAL(lm.njev(), 15 );
--g_test_level; // --g_test_level;
VERIFY(lm.nfev() < 16 * LM_EVAL_COUNT_TOL); VERIFY(lm.nfev() < 16 * LM_EVAL_COUNT_TOL);
VERIFY(lm.njev() < 15 * LM_EVAL_COUNT_TOL); VERIFY(lm.njev() < 15 * LM_EVAL_COUNT_TOL);
// check norm^2 // check norm^2
@ -975,6 +994,7 @@ void testNistMGH17(void)
lm.setXtol(NumTraits<double>::epsilon()); lm.setXtol(NumTraits<double>::epsilon());
lm.setMaxfev(1000); lm.setMaxfev(1000);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.4648946975E-05); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.4648946975E-05);
@ -987,8 +1007,8 @@ void testNistMGH17(void)
// check return value // check return value
// VERIFY_IS_EQUAL(info, 2); //FIXME Use (lm.info() == Success) // VERIFY_IS_EQUAL(info, 2); //FIXME Use (lm.info() == Success)
VERIFY(lm.nfev() < 700 ); // 602 // VERIFY(lm.nfev() < 700 ); // 602
VERIFY(lm.njev() < 600 ); // 545 // VERIFY(lm.njev() < 600 ); // 545
/* /*
* Second try * Second try
@ -997,11 +1017,12 @@ void testNistMGH17(void)
// do the computation // do the computation
lm.resetParameters(); lm.resetParameters();
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY_IS_EQUAL(lm.nfev(), 18); // VERIFY_IS_EQUAL(lm.nfev(), 18);
VERIFY_IS_EQUAL(lm.njev(), 15); // VERIFY_IS_EQUAL(lm.njev(), 15);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.4648946975E-05); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.4648946975E-05);
// check x // check x
@ -1063,6 +1084,7 @@ void testNistMGH09(void)
LevenbergMarquardt<MGH09_functor> lm(functor); LevenbergMarquardt<MGH09_functor> lm(functor);
lm.setMaxfev(1000); lm.setMaxfev(1000);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 3.0750560385E-04); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 3.0750560385E-04);
@ -1072,9 +1094,9 @@ void testNistMGH09(void)
VERIFY_IS_APPROX(x[2], 0.12305309914); // should be 1.2305650693E-01 VERIFY_IS_APPROX(x[2], 0.12305309914); // should be 1.2305650693E-01
VERIFY_IS_APPROX(x[3], 0.13605395375); // should be 1.3606233068E-01 VERIFY_IS_APPROX(x[3], 0.13605395375); // should be 1.3606233068E-01
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY(lm.nfev() < 510 ); // 490 // VERIFY(lm.nfev() < 510 ); // 490
VERIFY(lm.njev() < 400 ); // 376 // VERIFY(lm.njev() < 400 ); // 376
/* /*
* Second try * Second try
@ -1083,11 +1105,12 @@ void testNistMGH09(void)
// do the computation // do the computation
lm.resetParameters(); lm.resetParameters();
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY_IS_EQUAL(lm.nfev(), 18); // VERIFY_IS_EQUAL(lm.nfev(), 18);
VERIFY_IS_EQUAL(lm.njev(), 16); // VERIFY_IS_EQUAL(lm.njev(), 16);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 3.0750560385E-04); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 3.0750560385E-04);
// check x // check x
@ -1149,11 +1172,12 @@ void testNistBennett5(void)
LevenbergMarquardt<Bennett5_functor> lm(functor); LevenbergMarquardt<Bennett5_functor> lm(functor);
lm.setMaxfev(1000); lm.setMaxfev(1000);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY_IS_EQUAL(lm.nfev(), 758); // VERIFY_IS_EQUAL(lm.nfev(), 758);
VERIFY_IS_EQUAL(lm.njev(), 744); // VERIFY_IS_EQUAL(lm.njev(), 744);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.2404744073E-04); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.2404744073E-04);
// check x // check x
@ -1167,11 +1191,12 @@ void testNistBennett5(void)
// do the computation // do the computation
lm.resetParameters(); lm.resetParameters();
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY_IS_EQUAL(lm.nfev(), 203); // VERIFY_IS_EQUAL(lm.nfev(), 203);
VERIFY_IS_EQUAL(lm.njev(), 192); // VERIFY_IS_EQUAL(lm.njev(), 192);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.2404744073E-04); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.2404744073E-04);
// check x // check x
@ -1237,11 +1262,12 @@ void testNistThurber(void)
lm.setFtol(1.E4*NumTraits<double>::epsilon()); lm.setFtol(1.E4*NumTraits<double>::epsilon());
lm.setXtol(1.E4*NumTraits<double>::epsilon()); lm.setXtol(1.E4*NumTraits<double>::epsilon());
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY_IS_EQUAL(lm.nfev(), 39); // VERIFY_IS_EQUAL(lm.nfev(), 39);
VERIFY_IS_EQUAL(lm.njev(), 36); // VERIFY_IS_EQUAL(lm.njev(), 36);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.6427082397E+03); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.6427082397E+03);
// check x // check x
@ -1262,11 +1288,12 @@ void testNistThurber(void)
lm.setFtol(1.E4*NumTraits<double>::epsilon()); lm.setFtol(1.E4*NumTraits<double>::epsilon());
lm.setXtol(1.E4*NumTraits<double>::epsilon()); lm.setXtol(1.E4*NumTraits<double>::epsilon());
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY_IS_EQUAL(lm.nfev(), 29); // VERIFY_IS_EQUAL(lm.nfev(), 29);
VERIFY_IS_EQUAL(lm.njev(), 28); // VERIFY_IS_EQUAL(lm.njev(), 28);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.6427082397E+03); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.6427082397E+03);
// check x // check x
@ -1329,11 +1356,12 @@ void testNistRat43(void)
lm.setFtol(1.E6*NumTraits<double>::epsilon()); lm.setFtol(1.E6*NumTraits<double>::epsilon());
lm.setXtol(1.E6*NumTraits<double>::epsilon()); lm.setXtol(1.E6*NumTraits<double>::epsilon());
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY_IS_EQUAL(lm.nfev(), 27); // VERIFY_IS_EQUAL(lm.nfev(), 27);
VERIFY_IS_EQUAL(lm.njev(), 20); // VERIFY_IS_EQUAL(lm.njev(), 20);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.7864049080E+03); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.7864049080E+03);
// check x // check x
@ -1351,11 +1379,12 @@ void testNistRat43(void)
lm.setFtol(1.E5*NumTraits<double>::epsilon()); lm.setFtol(1.E5*NumTraits<double>::epsilon());
lm.setXtol(1.E5*NumTraits<double>::epsilon()); lm.setXtol(1.E5*NumTraits<double>::epsilon());
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY_IS_EQUAL(lm.nfev(), 9); // VERIFY_IS_EQUAL(lm.nfev(), 9);
VERIFY_IS_EQUAL(lm.njev(), 8); // VERIFY_IS_EQUAL(lm.njev(), 8);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.7864049080E+03); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.7864049080E+03);
// check x // check x
@ -1414,11 +1443,12 @@ void testNistEckerle4(void)
eckerle4_functor functor; eckerle4_functor functor;
LevenbergMarquardt<eckerle4_functor> lm(functor); LevenbergMarquardt<eckerle4_functor> lm(functor);
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY_IS_EQUAL(lm.nfev(), 18); // VERIFY_IS_EQUAL(lm.nfev(), 18);
VERIFY_IS_EQUAL(lm.njev(), 15); // VERIFY_IS_EQUAL(lm.njev(), 15);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.4635887487E-03); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.4635887487E-03);
// check x // check x
@ -1432,11 +1462,12 @@ void testNistEckerle4(void)
x<< 1.5, 5., 450.; x<< 1.5, 5., 450.;
// do the computation // do the computation
info = lm.minimize(x); info = lm.minimize(x);
EIGEN_UNUSED_VARIABLE(info)
// check return value // check return value
VERIFY_IS_EQUAL(info, 1); // VERIFY_IS_EQUAL(info, 1);
VERIFY_IS_EQUAL(lm.nfev(), 7); // VERIFY_IS_EQUAL(lm.nfev(), 7);
VERIFY_IS_EQUAL(lm.njev(), 6); // VERIFY_IS_EQUAL(lm.njev(), 6);
// check norm^2 // check norm^2
VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.4635887487E-03); VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.4635887487E-03);
// check x // check x