From baec4f39ab4336bb6197238f7887b4ef5a48a2b1 Mon Sep 17 00:00:00 2001 From: Thomas Capricelli Date: Tue, 25 Aug 2009 22:49:05 +0200 Subject: [PATCH] reduce local variables so that we can split algorithms --- .../src/NonLinear/HybridNonLinearSolver.h | 66 ++++++--------- .../Eigen/src/NonLinear/LevenbergMarquardt.h | 82 ++++++++----------- 2 files changed, 61 insertions(+), 87 deletions(-) diff --git a/unsupported/Eigen/src/NonLinear/HybridNonLinearSolver.h b/unsupported/Eigen/src/NonLinear/HybridNonLinearSolver.h index 7907bcd93..448a2d981 100644 --- a/unsupported/Eigen/src/NonLinear/HybridNonLinearSolver.h +++ b/unsupported/Eigen/src/NonLinear/HybridNonLinearSolver.h @@ -59,6 +59,21 @@ public: int njev; private: const FunctorType &functor; + int n; + Scalar sum; + bool sing; + int iter; + Scalar temp; + Scalar delta; + bool jeval; + int ncsuc; + Scalar ratio; + Scalar fnorm; + Scalar pnorm, xnorm, fnorm1; + int nslow1, nslow2; + int ncfail; + Scalar actred, prered; + Matrix< Scalar, Dynamic, 1 > wa1, wa2, wa3, wa4; }; @@ -70,7 +85,7 @@ HybridNonLinearSolver::solve( const Scalar tol ) { - const int n = x.size(); + n = x.size(); Parameters parameters; /* check the input parameters for errors. */ @@ -99,9 +114,9 @@ HybridNonLinearSolver::solve( const int mode ) { - const int n = x.size(); - Matrix< Scalar, Dynamic, 1 > wa1(n), wa2(n), wa3(n), wa4(n); + n = x.size(); + wa1.resize(n); wa2.resize(n); wa3.resize(n); wa4.resize(n); fvec.resize(n); qtf.resize(n); R.resize( (n*(n+1))/2); @@ -111,22 +126,6 @@ HybridNonLinearSolver::solve( diag.resize(n); assert( (mode!=2 || diag.size()==n) || "When using mode==2, the caller must provide a valid 'diag'"); - /* Local variables */ - int i, j, l, iwa[1]; - Scalar sum; - bool sing; - int iter; - Scalar temp; - Scalar delta; - bool jeval; - int ncsuc; - Scalar ratio; - Scalar fnorm; - Scalar pnorm, xnorm, fnorm1; - int nslow1, nslow2; - int ncfail; - Scalar actred, prered; - /* Function Body */ nfev = 0; njev = 0; @@ -136,7 +135,7 @@ HybridNonLinearSolver::solve( if (n <= 0 || parameters.xtol < 0. || parameters.maxfev <= 0 || parameters.factor <= 0. ) return ImproperInputParameters; if (mode == 2) - for (j = 0; j < n; ++j) + for (int j = 0; j < n; ++j) if (diag[j] <= 0.) return ImproperInputParameters; @@ -159,6 +158,7 @@ HybridNonLinearSolver::solve( /* beginning of the outer loop. */ while (true) { + int i, j, l, iwa[1]; jeval = true; /* calculate the jacobian matrix. */ @@ -380,7 +380,7 @@ HybridNonLinearSolver::solveNumericalDiff( const Scalar tol ) { - const int n = x.size(); + n = x.size(); Parameters parameters; /* check the input parameters for errors. */ @@ -412,12 +412,12 @@ HybridNonLinearSolver::solveNumericalDiff( const Scalar epsfcn ) { - const int n = x.size(); - Matrix< Scalar, Dynamic, 1 > wa1(n), wa2(n), wa3(n), wa4(n); - + n = x.size(); if (nb_of_subdiagonals<0) nb_of_subdiagonals = n-1; if (nb_of_superdiagonals<0) nb_of_superdiagonals = n-1; + + wa1.resize(n); wa2.resize(n); wa3.resize(n); wa4.resize(n); qtf.resize(n); R.resize( (n*(n+1))/2); fjac.resize(n, n); @@ -426,22 +426,7 @@ HybridNonLinearSolver::solveNumericalDiff( diag.resize(n); assert( (mode!=2 || diag.size()==n) || "When using mode==2, the caller must provide a valid 'diag'"); - /* Local variables */ - int i, j, l, iwa[1]; - Scalar sum; - bool sing; - int iter; - Scalar temp; int msum; - Scalar delta; - bool jeval; - int ncsuc; - Scalar ratio; - Scalar fnorm; - Scalar pnorm, xnorm, fnorm1; - int nslow1, nslow2; - int ncfail; - Scalar actred, prered; /* Function Body */ @@ -452,7 +437,7 @@ HybridNonLinearSolver::solveNumericalDiff( if (n <= 0 || parameters.xtol < 0. || parameters.maxfev <= 0 || nb_of_subdiagonals < 0 || nb_of_superdiagonals < 0 || parameters.factor <= 0. ) return ImproperInputParameters; if (mode == 2) - for (j = 0; j < n; ++j) + for (int j = 0; j < n; ++j) if (diag[j] <= 0.) return ImproperInputParameters; @@ -481,6 +466,7 @@ HybridNonLinearSolver::solveNumericalDiff( /* beginning of the outer loop. */ while (true) { + int i, j, l, iwa[1]; jeval = true; /* calculate the jacobian matrix. */ diff --git a/unsupported/Eigen/src/NonLinear/LevenbergMarquardt.h b/unsupported/Eigen/src/NonLinear/LevenbergMarquardt.h index 1633b7c16..b477268ed 100644 --- a/unsupported/Eigen/src/NonLinear/LevenbergMarquardt.h +++ b/unsupported/Eigen/src/NonLinear/LevenbergMarquardt.h @@ -77,6 +77,17 @@ public: int njev; private: const FunctorType &functor; + int n; + int m; + Matrix< Scalar, Dynamic, 1 > wa1, wa2, wa3, wa4; + + Scalar par, sum; + int iter; + Scalar temp, temp1, temp2; + Scalar delta; + Scalar ratio; + Scalar fnorm, gnorm; + Scalar pnorm, xnorm, fnorm1, actred, dirder, prered; }; template @@ -86,8 +97,8 @@ LevenbergMarquardt::minimize( const Scalar tol ) { - const int n = x.size(); - const int m = functor.nbOfFunctions(); + n = x.size(); + m = functor.nbOfFunctions(); Parameters parameters; /* check the input parameters for errors. */ @@ -115,10 +126,11 @@ LevenbergMarquardt::minimize( const int mode ) { - const int n = x.size(); - const int m = functor.nbOfFunctions(); - Matrix< Scalar, Dynamic, 1 > wa1(n), wa2(n), wa3(n), wa4; + n = x.size(); + m = functor.nbOfFunctions(); + wa1.resize(n); wa2.resize(n); wa3.resize(n); + wa4.resize(m); fvec.resize(m); ipvt.resize(n); fjac.resize(m, n); @@ -127,16 +139,6 @@ LevenbergMarquardt::minimize( assert( (mode!=2 || diag.size()==n) || "When using mode==2, the caller must provide a valid 'diag'"); qtf.resize(n); - /* Local variables */ - int i, j, l; - Scalar par, sum; - int iter; - Scalar temp, temp1, temp2; - Scalar delta; - Scalar ratio; - Scalar fnorm, gnorm; - Scalar pnorm, xnorm, fnorm1, actred, dirder, prered; - /* Function Body */ nfev = 0; njev = 0; @@ -147,7 +149,7 @@ LevenbergMarquardt::minimize( return ImproperInputParameters; if (mode == 2) - for (j = 0; j < n; ++j) + for (int j = 0; j < n; ++j) if (diag[j] <= 0.) return ImproperInputParameters; @@ -167,6 +169,7 @@ LevenbergMarquardt::minimize( /* beginning of the outer loop. */ while (true) { + int i, j, l; /* calculate the jacobian matrix. */ @@ -349,7 +352,6 @@ LevenbergMarquardt::minimize( } while (ratio < Scalar(1e-4)); /* end of the outer loop. */ } - assert(false); // should never be reached } @@ -360,8 +362,8 @@ LevenbergMarquardt::minimizeNumericalDiff( const Scalar tol ) { - const int n = x.size(); - const int m = functor.nbOfFunctions(); + n = x.size(); + m = functor.nbOfFunctions(); Parameters parameters; /* check the input parameters for errors. */ @@ -389,10 +391,11 @@ LevenbergMarquardt::minimizeNumericalDiff( const Scalar epsfcn ) { - const int n = x.size(); - const int m = functor.nbOfFunctions(); - Matrix< Scalar, Dynamic, 1 > wa1(n), wa2(n), wa3(n), wa4(m); + n = x.size(); + m = functor.nbOfFunctions(); + wa1.resize(n); wa2.resize(n); wa3.resize(n); + wa4.resize(m); fvec.resize(m); ipvt.resize(n); fjac.resize(m, n); @@ -401,16 +404,6 @@ LevenbergMarquardt::minimizeNumericalDiff( assert( (mode!=2 || diag.size()==n) || "When using mode==2, the caller must provide a valid 'diag'"); qtf.resize(n); - /* Local variables */ - int i, j, l; - Scalar par, sum; - int iter; - Scalar temp, temp1, temp2; - Scalar delta; - Scalar ratio; - Scalar fnorm, gnorm; - Scalar pnorm, xnorm, fnorm1, actred, dirder, prered; - /* Function Body */ nfev = 0; @@ -419,7 +412,7 @@ LevenbergMarquardt::minimizeNumericalDiff( if (n <= 0 || m < n || parameters.ftol < 0. || parameters.xtol < 0. || parameters.gtol < 0. || parameters.maxfev <= 0 || parameters.factor <= 0.) return ImproperInputParameters; if (mode == 2) - for (j = 0; j < n; ++j) + for (int j = 0; j < n; ++j) if (diag[j] <= 0.) return ImproperInputParameters; @@ -439,6 +432,7 @@ LevenbergMarquardt::minimizeNumericalDiff( /* beginning of the outer loop. */ while (true) { + int i, j, l; /* calculate the jacobian matrix. */ @@ -633,8 +627,8 @@ LevenbergMarquardt::minimizeOptimumStorage( const Scalar tol ) { - const int n = x.size(); - const int m = functor.nbOfFunctions(); + n = x.size(); + m = functor.nbOfFunctions(); Matrix< Scalar, Dynamic, Dynamic > fjac(m, n); VectorXi ipvt; Parameters parameters; @@ -663,10 +657,11 @@ LevenbergMarquardt::minimizeOptimumStorage( const int mode ) { - const int n = x.size(); - const int m = functor.nbOfFunctions(); - Matrix< Scalar, Dynamic, 1 > wa1(n), wa2(n), wa3(n), wa4(m); + n = x.size(); + m = functor.nbOfFunctions(); + wa1.resize(n); wa2.resize(n); wa3.resize(n); + wa4.resize(m); fvec.resize(m); ipvt.resize(n); fjac.resize(m, n); @@ -676,15 +671,7 @@ LevenbergMarquardt::minimizeOptimumStorage( qtf.resize(n); /* Local variables */ - int i, j, l; - Scalar par, sum; - int iter; bool sing; - Scalar temp, temp1, temp2; - Scalar delta; - Scalar ratio; - Scalar fnorm, gnorm; - Scalar pnorm, xnorm, fnorm1, actred, dirder, prered; /* Function Body */ nfev = 0; @@ -696,7 +683,7 @@ LevenbergMarquardt::minimizeOptimumStorage( return ImproperInputParameters; if (mode == 2) - for (j = 0; j < n; ++j) + for (int j = 0; j < n; ++j) if (diag[j] <= 0.) return ImproperInputParameters; @@ -716,6 +703,7 @@ LevenbergMarquardt::minimizeOptimumStorage( /* beginning of the outer loop. */ while (true) { + int i, j, l; /* compute the qr factorization of the jacobian matrix */ /* calculated one row at a time, while simultaneously */