From fa0183e7c7b84cf2a83b9f377bc8923e03be117d Mon Sep 17 00:00:00 2001 From: Thomas Capricelli Date: Tue, 25 Aug 2009 21:59:10 +0200 Subject: [PATCH] make diag be an internal variable too --- .../src/NonLinear/HybridNonLinearSolver.h | 13 +-- .../Eigen/src/NonLinear/LevenbergMarquardt.h | 26 ++--- unsupported/test/NonLinear.cpp | 108 +++++++++--------- 3 files changed, 66 insertions(+), 81 deletions(-) diff --git a/unsupported/Eigen/src/NonLinear/HybridNonLinearSolver.h b/unsupported/Eigen/src/NonLinear/HybridNonLinearSolver.h index bb4bb28e1..6022ce363 100644 --- a/unsupported/Eigen/src/NonLinear/HybridNonLinearSolver.h +++ b/unsupported/Eigen/src/NonLinear/HybridNonLinearSolver.h @@ -34,7 +34,6 @@ public: Status solve( Matrix< Scalar, Dynamic, 1 > &x, int &nfev, int &njev, - Matrix< Scalar, Dynamic, 1 > &diag, const Parameters ¶meters, const int mode=1 ); @@ -46,7 +45,6 @@ public: Status solveNumericalDiff( Matrix< Scalar, Dynamic, 1 > &x, int &nfev, - Matrix< Scalar, Dynamic, 1 > &diag, const Parameters ¶meters, const int mode=1, int nb_of_subdiagonals = -1, @@ -58,6 +56,7 @@ public: Matrix< Scalar, Dynamic, Dynamic > fjac; Matrix< Scalar, Dynamic, 1 > R; Matrix< Scalar, Dynamic, 1 > qtf; + Matrix< Scalar, Dynamic, 1 > diag; private: const FunctorType &functor; }; @@ -73,7 +72,6 @@ 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. */ @@ -88,7 +86,6 @@ HybridNonLinearSolver::solve( return solve( x, nfev, njev, - diag, parameters, 2 ); @@ -102,7 +99,6 @@ HybridNonLinearSolver::solve( Matrix< Scalar, Dynamic, 1 > &x, int &nfev, int &njev, - Matrix< Scalar, Dynamic, 1 > &diag, const Parameters ¶meters, const int mode ) @@ -115,6 +111,8 @@ HybridNonLinearSolver::solve( R.resize( (n*(n+1))/2); fjac.resize(n, n); fvec.resize(n); + if (mode != 2) + diag.resize(n); /* Local variables */ int i, j, l, iwa[1]; @@ -388,7 +386,6 @@ HybridNonLinearSolver::solveNumericalDiff( { const int n = x.size(); int nfev=0; - Matrix< Scalar, Dynamic, 1> diag; Parameters parameters; /* check the input parameters for errors. */ @@ -404,7 +401,6 @@ HybridNonLinearSolver::solveNumericalDiff( return solveNumericalDiff( x, nfev, - diag, parameters, 2, -1, -1, @@ -418,7 +414,6 @@ typename HybridNonLinearSolver::Status HybridNonLinearSolver::solveNumericalDiff( Matrix< Scalar, Dynamic, 1 > &x, int &nfev, - Matrix< Scalar, Dynamic, 1 > &diag, const Parameters ¶meters, const int mode, int nb_of_subdiagonals, @@ -436,6 +431,8 @@ HybridNonLinearSolver::solveNumericalDiff( R.resize( (n*(n+1))/2); fjac.resize(n, n); fvec.resize(n); + if (mode != 2) + diag.resize(n); /* Local variables */ int i, j, l, iwa[1]; diff --git a/unsupported/Eigen/src/NonLinear/LevenbergMarquardt.h b/unsupported/Eigen/src/NonLinear/LevenbergMarquardt.h index e6536cb89..35b6e3ee2 100644 --- a/unsupported/Eigen/src/NonLinear/LevenbergMarquardt.h +++ b/unsupported/Eigen/src/NonLinear/LevenbergMarquardt.h @@ -43,7 +43,6 @@ public: Matrix< Scalar, Dynamic, 1 > &x, int &nfev, int &njev, - Matrix< Scalar, Dynamic, 1 > &diag, const Parameters ¶meters, const int mode=1 ); @@ -56,7 +55,6 @@ public: Status minimizeNumericalDiff( Matrix< Scalar, Dynamic, 1 > &x, int &nfev, - Matrix< Scalar, Dynamic, 1 > &diag, const Parameters ¶meters, const int mode=1, const Scalar epsfcn = Scalar(0.) @@ -71,7 +69,6 @@ public: Matrix< Scalar, Dynamic, 1 > &x, int &nfev, int &njev, - Matrix< Scalar, Dynamic, 1 > &diag, const Parameters ¶meters, const int mode=1 ); @@ -80,6 +77,7 @@ public: Matrix< Scalar, Dynamic, Dynamic > fjac; VectorXi ipvt; Matrix< Scalar, Dynamic, 1 > qtf; + Matrix< Scalar, Dynamic, 1 > diag; private: const FunctorType &functor; }; @@ -94,9 +92,6 @@ LevenbergMarquardt::minimize( const int n = x.size(); const int m = functor.nbOfFunctions(); int nfev=0, njev=0; - Matrix< Scalar, Dynamic, Dynamic > fjac(m, n); - Matrix< Scalar, Dynamic, 1> diag, qtf; - VectorXi ipvt; Parameters parameters; /* check the input parameters for errors. */ @@ -112,7 +107,6 @@ LevenbergMarquardt::minimize( return minimize( x, nfev, njev, - diag, parameters, 1 ); @@ -125,7 +119,6 @@ LevenbergMarquardt::minimize( Matrix< Scalar, Dynamic, 1 > &x, int &nfev, int &njev, - Matrix< Scalar, Dynamic, 1 > &diag, const Parameters ¶meters, const int mode ) @@ -137,7 +130,8 @@ LevenbergMarquardt::minimize( fvec.resize(m); ipvt.resize(n); fjac.resize(m, n); - diag.resize(n); + if (mode != 2) + diag.resize(n); qtf.resize(n); /* Local variables */ @@ -376,9 +370,6 @@ LevenbergMarquardt::minimizeNumericalDiff( const int n = x.size(); const int m = functor.nbOfFunctions(); int nfev=0; - Matrix< Scalar, Dynamic, Dynamic > fjac(m, n); - Matrix< Scalar, Dynamic, 1> diag, qtf; - VectorXi ipvt; Parameters parameters; /* check the input parameters for errors. */ @@ -394,7 +385,6 @@ LevenbergMarquardt::minimizeNumericalDiff( return minimizeNumericalDiff( x, nfev, - diag, parameters, 1, Scalar(0.) @@ -406,7 +396,6 @@ typename LevenbergMarquardt::Status LevenbergMarquardt::minimizeNumericalDiff( Matrix< Scalar, Dynamic, 1 > &x, int &nfev, - Matrix< Scalar, Dynamic, 1 > &diag, const Parameters ¶meters, const int mode, const Scalar epsfcn @@ -419,7 +408,8 @@ LevenbergMarquardt::minimizeNumericalDiff( fvec.resize(m); ipvt.resize(n); fjac.resize(m, n); - diag.resize(n); + if (mode != 2 ) + diag.resize(n); qtf.resize(n); /* Local variables */ @@ -658,7 +648,6 @@ LevenbergMarquardt::minimizeOptimumStorage( const int m = functor.nbOfFunctions(); int nfev=0, njev=0; Matrix< Scalar, Dynamic, Dynamic > fjac(m, n); - Matrix< Scalar, Dynamic, 1> diag, qtf; VectorXi ipvt; Parameters parameters; @@ -675,7 +664,6 @@ LevenbergMarquardt::minimizeOptimumStorage( return minimizeOptimumStorage( x, nfev, njev, - diag, parameters, 1 ); @@ -687,7 +675,6 @@ LevenbergMarquardt::minimizeOptimumStorage( Matrix< Scalar, Dynamic, 1 > &x, int &nfev, int &njev, - Matrix< Scalar, Dynamic, 1 > &diag, const Parameters ¶meters, const int mode ) @@ -699,7 +686,8 @@ LevenbergMarquardt::minimizeOptimumStorage( fvec.resize(m); ipvt.resize(n); fjac.resize(m, n); - diag.resize(n); + if (mode != 2) + diag.resize(n); qtf.resize(n); /* Local variables */ diff --git a/unsupported/test/NonLinear.cpp b/unsupported/test/NonLinear.cpp index 1e9b92e38..b67cf5c95 100644 --- a/unsupported/test/NonLinear.cpp +++ b/unsupported/test/NonLinear.cpp @@ -173,7 +173,7 @@ void testLmder() const int m=15, n=3; int info, nfev=0, njev=0; double fnorm, covfac; - VectorXd x, diag; + VectorXd x; /* the following starting values provide a rough fit. */ x.setConstant(n, 1.); @@ -182,7 +182,7 @@ void testLmder() lmder_functor functor; LevenbergMarquardt lm(functor); LevenbergMarquardt::Parameters parameters; - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return values VERIFY( 1 == info); @@ -292,18 +292,18 @@ void testHybrj() { const int n=9; int info, nfev=0, njev=0; - VectorXd x(n), diag(n); + VectorXd x(n); /* the following starting values provide a rough fit. */ x.setConstant(n, -1.); - diag.setConstant(n, 1.); // do the computation hybrj_functor functor; HybridNonLinearSolver solver(functor); + solver.diag.setConstant(n, 1.); HybridNonLinearSolver::Parameters parameters; - info = solver.solve(x, nfev, njev, diag, parameters, 2); + info = solver.solve(x, nfev, njev, parameters, 2); // check return value VERIFY( 1 == info); @@ -374,20 +374,20 @@ void testHybrd() { const int n=9; int info, nfev=0, ml, mu; - VectorXd x, diag(n); + VectorXd x; /* the following starting values provide a rough fit. */ x.setConstant(n, -1.); ml = 1; mu = 1; - diag.setConstant(n, 1.); // do the computation hybrd_functor functor; HybridNonLinearSolver solver(functor); HybridNonLinearSolver::Parameters parameters; - info = solver.solveNumericalDiff(x, nfev, diag, parameters, 2, ml, mu); + solver.diag.setConstant(n, 1.); + info = solver.solveNumericalDiff(x, nfev, parameters, 2, ml, mu); // check return value VERIFY( 1 == info); @@ -477,7 +477,7 @@ void testLmstr() const int n=3; int info, nfev=0, njev=0; double fnorm; - VectorXd x(n), diag; + VectorXd x(n); /* the following starting values provide a rough fit. */ x.setConstant(n, 1.); @@ -486,7 +486,7 @@ void testLmstr() lmstr_functor functor; LevenbergMarquardt lm(functor); LevenbergMarquardt::Parameters parameters; - info = lm.minimizeOptimumStorage(x, nfev, njev, diag, parameters); + info = lm.minimizeOptimumStorage(x, nfev, njev, parameters); // check return values VERIFY( 1 == info); @@ -564,7 +564,7 @@ void testLmdif() const int m=15, n=3; int info, nfev=0; double fnorm, covfac; - VectorXd x(n), diag; + VectorXd x(n); /* the following starting values provide a rough fit. */ x.setConstant(n, 1.); @@ -573,7 +573,7 @@ void testLmdif() lmdif_functor functor; LevenbergMarquardt lm(functor); LevenbergMarquardt::Parameters parameters; - info = lm.minimizeNumericalDiff(x, nfev, diag, parameters); + info = lm.minimizeNumericalDiff(x, nfev, parameters); // check return values VERIFY( 1 == info); @@ -649,7 +649,7 @@ void testNistChwirut2(void) const int n=3; int info, nfev=0, njev=0; - VectorXd x(n), diag; + VectorXd x(n); /* * First try @@ -659,7 +659,7 @@ void testNistChwirut2(void) chwirut2_functor functor; LevenbergMarquardt lm(functor); LevenbergMarquardt::Parameters parameters; - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -680,7 +680,7 @@ void testNistChwirut2(void) parameters = LevenbergMarquardt::Parameters(); // get default back parameters.ftol = 1.E6*epsilon(); parameters.xtol = 1.E6*epsilon(); - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -730,7 +730,7 @@ void testNistMisra1a(void) const int n=2; int info, nfev=0, njev=0; - VectorXd x(n), diag; + VectorXd x(n); /* * First try @@ -740,7 +740,7 @@ void testNistMisra1a(void) misra1a_functor functor; LevenbergMarquardt lm(functor); LevenbergMarquardt::Parameters parameters; - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -757,7 +757,7 @@ void testNistMisra1a(void) */ x<< 250., 0.0005; // do the computation - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -817,7 +817,7 @@ void testNistHahn1(void) const int n=7; int info, nfev=0, njev=0; - VectorXd x(n), diag; + VectorXd x(n); /* * First try @@ -827,7 +827,7 @@ void testNistHahn1(void) hahn1_functor functor; LevenbergMarquardt lm(functor); LevenbergMarquardt::Parameters parameters; - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -849,7 +849,7 @@ void testNistHahn1(void) */ x<< .1, -.1, .005, -.000001, -.005, .0001, -.0000001; // do the computation - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -904,7 +904,7 @@ void testNistMisra1d(void) const int n=2; int info, nfev=0, njev=0; - VectorXd x(n), diag; + VectorXd x(n); /* * First try @@ -914,7 +914,7 @@ void testNistMisra1d(void) misra1d_functor functor; LevenbergMarquardt lm(functor); LevenbergMarquardt::Parameters parameters; - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 3 == info); @@ -931,7 +931,7 @@ void testNistMisra1d(void) */ x<< 450., 0.0003; // do the computation - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -983,7 +983,7 @@ void testNistLanczos1(void) const int n=6; int info, nfev=0, njev=0; - VectorXd x(n), diag; + VectorXd x(n); /* * First try @@ -993,7 +993,7 @@ void testNistLanczos1(void) lanczos1_functor functor; LevenbergMarquardt lm(functor); LevenbergMarquardt::Parameters parameters; - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 2 == info); @@ -1014,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, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 2 == info); @@ -1070,7 +1070,7 @@ void testNistRat42(void) const int n=3; int info, nfev=0, njev=0; - VectorXd x(n), diag; + VectorXd x(n); /* * First try @@ -1080,7 +1080,7 @@ void testNistRat42(void) rat42_functor functor; LevenbergMarquardt lm(functor); LevenbergMarquardt::Parameters parameters; - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -1098,7 +1098,7 @@ void testNistRat42(void) */ x<< 75., 2.5, 0.07; // do the computation - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -1149,7 +1149,7 @@ void testNistMGH10(void) const int n=3; int info, nfev=0, njev=0; - VectorXd x(n), diag; + VectorXd x(n); /* * First try @@ -1159,7 +1159,7 @@ void testNistMGH10(void) MGH10_functor functor; LevenbergMarquardt lm(functor); LevenbergMarquardt::Parameters parameters; - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 2 == info); @@ -1177,7 +1177,7 @@ void testNistMGH10(void) */ x<< 0.02, 4000., 250.; // do the computation - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 2 == info); @@ -1226,7 +1226,7 @@ void testNistBoxBOD(void) const int n=2; int info, nfev=0, njev=0; - VectorXd x(n), diag; + VectorXd x(n); /* * First try @@ -1239,7 +1239,7 @@ void testNistBoxBOD(void) parameters.ftol = 1.E6*epsilon(); parameters.xtol = 1.E6*epsilon(); parameters.factor = 10.; - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -1259,7 +1259,7 @@ void testNistBoxBOD(void) parameters = LevenbergMarquardt::Parameters(); // get default back parameters.ftol = epsilon(); parameters.xtol = epsilon(); - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -1309,7 +1309,7 @@ void testNistMGH17(void) const int n=5; int info, nfev=0, njev=0; - VectorXd x(n), diag; + VectorXd x(n); /* * First try @@ -1322,7 +1322,7 @@ void testNistMGH17(void) parameters.ftol = epsilon(); parameters.xtol = epsilon(); parameters.maxfev = 1000; - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -1343,7 +1343,7 @@ void testNistMGH17(void) x<< 0.5 ,1.5 ,-1 ,0.01 ,0.02; // do the computation parameters = LevenbergMarquardt::Parameters(); // get default back - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -1399,7 +1399,7 @@ void testNistMGH09(void) const int n=4; int info, nfev=0, njev=0; - VectorXd x(n), diag; + VectorXd x(n); /* * First try @@ -1410,7 +1410,7 @@ void testNistMGH09(void) LevenbergMarquardt lm(functor); LevenbergMarquardt::Parameters parameters; parameters.maxfev = 1000; - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -1430,7 +1430,7 @@ void testNistMGH09(void) x<< 0.25, 0.39, 0.415, 0.39; // do the computation parameters = LevenbergMarquardt::Parameters(); - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -1483,7 +1483,7 @@ void testNistBennett5(void) const int n=3; int info, nfev=0, njev=0; - VectorXd x(n), diag; + VectorXd x(n); /* * First try @@ -1494,7 +1494,7 @@ void testNistBennett5(void) LevenbergMarquardt lm(functor); LevenbergMarquardt::Parameters parameters; parameters.maxfev = 1000; - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -1512,7 +1512,7 @@ void testNistBennett5(void) x<< -1500., 45., 0.85; // do the computation parameters = LevenbergMarquardt::Parameters(); - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -1571,7 +1571,7 @@ void testNistThurber(void) const int n=7; int info, nfev=0, njev=0; - VectorXd x(n), diag; + VectorXd x(n); /* * First try @@ -1583,7 +1583,7 @@ void testNistThurber(void) LevenbergMarquardt::Parameters parameters; parameters.ftol = 1.E4*epsilon(); parameters.xtol = 1.E4*epsilon(); - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -1608,7 +1608,7 @@ void testNistThurber(void) parameters = LevenbergMarquardt::Parameters(); parameters.ftol = 1.E4*epsilon(); parameters.xtol = 1.E4*epsilon(); - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -1664,7 +1664,7 @@ void testNistRat43(void) const int n=4; int info, nfev=0, njev=0; - VectorXd x(n), diag; + VectorXd x(n); /* * First try @@ -1676,7 +1676,7 @@ void testNistRat43(void) LevenbergMarquardt::Parameters parameters; parameters.ftol = 1.E6*epsilon(); parameters.xtol = 1.E6*epsilon(); - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -1698,7 +1698,7 @@ void testNistRat43(void) parameters = LevenbergMarquardt::Parameters(); // get default back parameters.ftol = 1.E5*epsilon(); parameters.xtol = 1.E5*epsilon(); - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -1752,7 +1752,7 @@ void testNistEckerle4(void) const int n=3; int info, nfev=0, njev=0; - VectorXd x(n), diag; + VectorXd x(n); /* * First try @@ -1762,7 +1762,7 @@ void testNistEckerle4(void) eckerle4_functor functor; LevenbergMarquardt lm(functor); LevenbergMarquardt::Parameters parameters; - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info); @@ -1780,7 +1780,7 @@ void testNistEckerle4(void) */ x<< 1.5, 5., 450.; // do the computation - info = lm.minimize(x, nfev, njev, diag, parameters); + info = lm.minimize(x, nfev, njev, parameters); // check return value VERIFY( 1 == info);