move most of results vectors/matrices inside respective classes.

This commit is contained in:
Thomas Capricelli 2009-08-25 16:08:09 +02:00
parent 38fc6c8553
commit 6c1a9703b1
6 changed files with 192 additions and 237 deletions

View File

@ -8,17 +8,11 @@ public:
int solve( int solve(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
Matrix< Scalar, Dynamic, Dynamic > &fjac,
const Scalar tol = ei_sqrt(epsilon<Scalar>()) const Scalar tol = ei_sqrt(epsilon<Scalar>())
); );
int solve( int solve(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
int &nfev, int &nfev,
Matrix< Scalar, Dynamic, Dynamic > &fjac,
Matrix< Scalar, Dynamic, 1 > &R,
Matrix< Scalar, Dynamic, 1 > &qtf,
Matrix< Scalar, Dynamic, 1 > &diag, Matrix< Scalar, Dynamic, 1 > &diag,
const int mode=1, const int mode=1,
int nb_of_subdiagonals = -1, int nb_of_subdiagonals = -1,
@ -30,6 +24,10 @@ public:
const int nprint=0 const int nprint=0
); );
Matrix< Scalar, Dynamic, 1 > fvec;
Matrix< Scalar, Dynamic, Dynamic > fjac;
Matrix< Scalar, Dynamic, 1 > R;
Matrix< Scalar, Dynamic, 1 > qtf;
private: private:
const FunctorType &functor; const FunctorType &functor;
}; };
@ -39,14 +37,12 @@ private:
template<typename FunctorType, typename Scalar> template<typename FunctorType, typename Scalar>
int HybridNonLinearSolverNumericalDiff<FunctorType,Scalar>::solve( int HybridNonLinearSolverNumericalDiff<FunctorType,Scalar>::solve(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
Matrix< Scalar, Dynamic, Dynamic > &fjac,
const Scalar tol const Scalar tol
) )
{ {
const int n = x.size(); const int n = x.size();
int info, nfev=0; int info, nfev=0;
Matrix< Scalar, Dynamic, 1> R, qtf, diag; Matrix< Scalar, Dynamic, 1> diag;
/* check the input parameters for errors. */ /* check the input parameters for errors. */
if (n <= 0 || tol < 0.) { if (n <= 0 || tol < 0.) {
@ -56,10 +52,9 @@ int HybridNonLinearSolverNumericalDiff<FunctorType,Scalar>::solve(
diag.setConstant(n, 1.); diag.setConstant(n, 1.);
info = solve( info = solve(
x, fvec, x,
nfev, nfev,
fjac, diag,
R, qtf, diag,
2, 2,
-1, -1, -1, -1,
(n+1)*200, (n+1)*200,
@ -73,11 +68,7 @@ int HybridNonLinearSolverNumericalDiff<FunctorType,Scalar>::solve(
template<typename FunctorType, typename Scalar> template<typename FunctorType, typename Scalar>
int HybridNonLinearSolverNumericalDiff<FunctorType,Scalar>::solve( int HybridNonLinearSolverNumericalDiff<FunctorType,Scalar>::solve(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
int &nfev, int &nfev,
Matrix< Scalar, Dynamic, Dynamic > &fjac,
Matrix< Scalar, Dynamic, 1 > &R,
Matrix< Scalar, Dynamic, 1 > &qtf,
Matrix< Scalar, Dynamic, 1 > &diag, Matrix< Scalar, Dynamic, 1 > &diag,
const int mode, const int mode,
int nb_of_subdiagonals, int nb_of_subdiagonals,
@ -95,10 +86,10 @@ int HybridNonLinearSolverNumericalDiff<FunctorType,Scalar>::solve(
if (nb_of_subdiagonals<0) nb_of_subdiagonals = n-1; if (nb_of_subdiagonals<0) nb_of_subdiagonals = n-1;
if (nb_of_superdiagonals<0) nb_of_superdiagonals = n-1; if (nb_of_superdiagonals<0) nb_of_superdiagonals = n-1;
fvec.resize(n);
qtf.resize(n); qtf.resize(n);
R.resize( (n*(n+1))/2); R.resize( (n*(n+1))/2);
fjac.resize(n, n); fjac.resize(n, n);
fvec.resize(n);
/* Local variables */ /* Local variables */
int i, j, l, iwa[1]; int i, j, l, iwa[1];

View File

@ -8,17 +8,11 @@ public:
int solve( int solve(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
Matrix< Scalar, Dynamic, Dynamic > &fjac,
const Scalar tol = ei_sqrt(epsilon<Scalar>()) const Scalar tol = ei_sqrt(epsilon<Scalar>())
); );
int solve( int solve(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
int &nfev, int &njev, int &nfev, int &njev,
Matrix< Scalar, Dynamic, Dynamic > &fjac,
Matrix< Scalar, Dynamic, 1 > &R,
Matrix< Scalar, Dynamic, 1 > &qtf,
Matrix< Scalar, Dynamic, 1 > &diag, Matrix< Scalar, Dynamic, 1 > &diag,
const int mode=1, const int mode=1,
const int maxfev = 1000, const int maxfev = 1000,
@ -27,6 +21,10 @@ public:
const int nprint=0 const int nprint=0
); );
Matrix< Scalar, Dynamic, 1 > fvec;
Matrix< Scalar, Dynamic, Dynamic > fjac;
Matrix< Scalar, Dynamic, 1 > R;
Matrix< Scalar, Dynamic, 1 > qtf;
private: private:
const FunctorType &functor; const FunctorType &functor;
}; };
@ -36,14 +34,12 @@ private:
template<typename FunctorType, typename Scalar> template<typename FunctorType, typename Scalar>
int HybridNonLinearSolver<FunctorType,Scalar>::solve( int HybridNonLinearSolver<FunctorType,Scalar>::solve(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
Matrix< Scalar, Dynamic, Dynamic > &fjac,
const Scalar tol const Scalar tol
) )
{ {
const int n = x.size(); const int n = x.size();
int info, nfev=0, njev=0; int info, nfev=0, njev=0;
Matrix< Scalar, Dynamic, 1> R, qtf, diag; Matrix< Scalar, Dynamic, 1> diag;
/* check the input parameters for errors. */ /* check the input parameters for errors. */
if (n <= 0 || tol < 0.) { if (n <= 0 || tol < 0.) {
@ -53,10 +49,9 @@ int HybridNonLinearSolver<FunctorType,Scalar>::solve(
diag.setConstant(n, 1.); diag.setConstant(n, 1.);
info = solve( info = solve(
x, fvec, x,
nfev, njev, nfev, njev,
fjac, diag,
R, qtf, diag,
2, 2,
(n+1)*100, (n+1)*100,
100., 100.,
@ -70,12 +65,8 @@ int HybridNonLinearSolver<FunctorType,Scalar>::solve(
template<typename FunctorType, typename Scalar> template<typename FunctorType, typename Scalar>
int HybridNonLinearSolver<FunctorType,Scalar>::solve( int HybridNonLinearSolver<FunctorType,Scalar>::solve(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
int &nfev, int &nfev,
int &njev, int &njev,
Matrix< Scalar, Dynamic, Dynamic > &fjac,
Matrix< Scalar, Dynamic, 1 > &R,
Matrix< Scalar, Dynamic, 1 > &qtf,
Matrix< Scalar, Dynamic, 1 > &diag, Matrix< Scalar, Dynamic, 1 > &diag,
const int mode, const int mode,
const int maxfev, const int maxfev,
@ -91,6 +82,7 @@ int HybridNonLinearSolver<FunctorType,Scalar>::solve(
qtf.resize(n); qtf.resize(n);
R.resize( (n*(n+1))/2); R.resize( (n*(n+1))/2);
fjac.resize(n, n); fjac.resize(n, n);
fvec.resize(n);
/* Local variables */ /* Local variables */
int i, j, l, iwa[1]; int i, j, l, iwa[1];

View File

@ -8,18 +8,13 @@ public:
int minimize( int minimize(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
const Scalar tol = ei_sqrt(epsilon<Scalar>()) const Scalar tol = ei_sqrt(epsilon<Scalar>())
); );
int minimize( int minimize(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
int &nfev, int &nfev,
int &njev, int &njev,
Matrix< Scalar, Dynamic, Dynamic > &fjac,
VectorXi &ipvt,
Matrix< Scalar, Dynamic, 1 > &qtf,
Matrix< Scalar, Dynamic, 1 > &diag, Matrix< Scalar, Dynamic, 1 > &diag,
const int mode=1, const int mode=1,
const Scalar factor = 100., const Scalar factor = 100.,
@ -30,6 +25,10 @@ public:
const int nprint=0 const int nprint=0
); );
Matrix< Scalar, Dynamic, 1 > fvec;
Matrix< Scalar, Dynamic, Dynamic > fjac;
VectorXi ipvt;
Matrix< Scalar, Dynamic, 1 > qtf;
private: private:
const FunctorType &functor; const FunctorType &functor;
}; };
@ -38,11 +37,11 @@ private:
template<typename FunctorType, typename Scalar> template<typename FunctorType, typename Scalar>
int LevenbergMarquardt<FunctorType,Scalar>::minimize( int LevenbergMarquardt<FunctorType,Scalar>::minimize(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
const Scalar tol const Scalar tol
) )
{ {
const int n = x.size(), m=fvec.size(); const int n = x.size();
const int m = functor.nbOfFunctions();
int info, nfev=0, njev=0; int info, nfev=0, njev=0;
Matrix< Scalar, Dynamic, Dynamic > fjac(m, n); Matrix< Scalar, Dynamic, Dynamic > fjac(m, n);
Matrix< Scalar, Dynamic, 1> diag, qtf; Matrix< Scalar, Dynamic, 1> diag, qtf;
@ -55,9 +54,9 @@ int LevenbergMarquardt<FunctorType,Scalar>::minimize(
} }
info = minimize( info = minimize(
x, fvec, x,
nfev, njev, nfev, njev,
fjac, ipvt, qtf, diag, diag,
1, 1,
100., 100.,
(n+1)*100, (n+1)*100,
@ -70,12 +69,8 @@ int LevenbergMarquardt<FunctorType,Scalar>::minimize(
template<typename FunctorType, typename Scalar> template<typename FunctorType, typename Scalar>
int LevenbergMarquardt<FunctorType,Scalar>::minimize( int LevenbergMarquardt<FunctorType,Scalar>::minimize(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
int &nfev, int &nfev,
int &njev, int &njev,
Matrix< Scalar, Dynamic, Dynamic > &fjac,
VectorXi &ipvt,
Matrix< Scalar, Dynamic, 1 > &qtf,
Matrix< Scalar, Dynamic, 1 > &diag, Matrix< Scalar, Dynamic, 1 > &diag,
const int mode, const int mode,
const Scalar factor, const Scalar factor,
@ -86,9 +81,11 @@ int LevenbergMarquardt<FunctorType,Scalar>::minimize(
const int nprint const int nprint
) )
{ {
const int m = fvec.size(), n = x.size(); const int n = x.size();
Matrix< Scalar, Dynamic, 1 > wa1(n), wa2(n), wa3(n), wa4(m); const int m = functor.nbOfFunctions();
Matrix< Scalar, Dynamic, 1 > wa1(n), wa2(n), wa3(n), wa4;
fvec.resize(m);
ipvt.resize(n); ipvt.resize(n);
fjac.resize(m, n); fjac.resize(m, n);
diag.resize(n); diag.resize(n);

View File

@ -8,17 +8,12 @@ public:
int minimize( int minimize(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
const Scalar tol = ei_sqrt(epsilon<Scalar>()) const Scalar tol = ei_sqrt(epsilon<Scalar>())
); );
int minimize( int minimize(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
int &nfev, int &nfev,
Matrix< Scalar, Dynamic, Dynamic > &fjac,
VectorXi &ipvt,
Matrix< Scalar, Dynamic, 1 > &qtf,
Matrix< Scalar, Dynamic, 1 > &diag, Matrix< Scalar, Dynamic, 1 > &diag,
const int mode=1, const int mode=1,
const Scalar factor = 100., const Scalar factor = 100.,
@ -30,6 +25,10 @@ public:
const int nprint=0 const int nprint=0
); );
Matrix< Scalar, Dynamic, 1 > fvec;
Matrix< Scalar, Dynamic, Dynamic > fjac;
VectorXi ipvt;
Matrix< Scalar, Dynamic, 1 > qtf;
private: private:
const FunctorType &functor; const FunctorType &functor;
}; };
@ -38,11 +37,11 @@ private:
template<typename FunctorType, typename Scalar> template<typename FunctorType, typename Scalar>
int LevenbergMarquardtNumericalDiff<FunctorType,Scalar>::minimize( int LevenbergMarquardtNumericalDiff<FunctorType,Scalar>::minimize(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
const Scalar tol const Scalar tol
) )
{ {
const int n = x.size(), m=fvec.size(); const int n = x.size();
const int m = functor.nbOfFunctions();
int info, nfev=0; int info, nfev=0;
Matrix< Scalar, Dynamic, Dynamic > fjac(m, n); Matrix< Scalar, Dynamic, Dynamic > fjac(m, n);
Matrix< Scalar, Dynamic, 1> diag, qtf; Matrix< Scalar, Dynamic, 1> diag, qtf;
@ -55,9 +54,9 @@ int LevenbergMarquardtNumericalDiff<FunctorType,Scalar>::minimize(
} }
info = minimize( info = minimize(
x, fvec, x,
nfev, nfev,
fjac, ipvt, qtf, diag, diag,
1, 1,
100., 100.,
(n+1)*200, (n+1)*200,
@ -69,11 +68,7 @@ int LevenbergMarquardtNumericalDiff<FunctorType,Scalar>::minimize(
template<typename FunctorType, typename Scalar> template<typename FunctorType, typename Scalar>
int LevenbergMarquardtNumericalDiff<FunctorType,Scalar>::minimize( int LevenbergMarquardtNumericalDiff<FunctorType,Scalar>::minimize(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
int &nfev, int &nfev,
Matrix< Scalar, Dynamic, Dynamic > &fjac,
VectorXi &ipvt,
Matrix< Scalar, Dynamic, 1 > &qtf,
Matrix< Scalar, Dynamic, 1 > &diag, Matrix< Scalar, Dynamic, 1 > &diag,
const int mode, const int mode,
const Scalar factor, const Scalar factor,
@ -85,9 +80,11 @@ int LevenbergMarquardtNumericalDiff<FunctorType,Scalar>::minimize(
const int nprint const int nprint
) )
{ {
const int m = fvec.size(), n = x.size(); const int n = x.size();
const int m = functor.nbOfFunctions();
Matrix< Scalar, Dynamic, 1 > wa1(n), wa2(n), wa3(n), wa4(m); Matrix< Scalar, Dynamic, 1 > wa1(n), wa2(n), wa3(n), wa4(m);
fvec.resize(m);
ipvt.resize(n); ipvt.resize(n);
fjac.resize(m, n); fjac.resize(m, n);
diag.resize(n); diag.resize(n);

View File

@ -8,18 +8,13 @@ public:
int minimize( int minimize(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
const Scalar tol = ei_sqrt(epsilon<Scalar>()) const Scalar tol = ei_sqrt(epsilon<Scalar>())
); );
int minimize( int minimize(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
int &nfev, int &nfev,
int &njev, int &njev,
Matrix< Scalar, Dynamic, Dynamic > &fjac,
VectorXi &ipvt,
Matrix< Scalar, Dynamic, 1 > &qtf,
Matrix< Scalar, Dynamic, 1 > &diag, Matrix< Scalar, Dynamic, 1 > &diag,
const int mode=1, const int mode=1,
const Scalar factor = 100., const Scalar factor = 100.,
@ -30,6 +25,10 @@ public:
const int nprint=0 const int nprint=0
); );
Matrix< Scalar, Dynamic, 1 > fvec;
Matrix< Scalar, Dynamic, Dynamic > fjac;
VectorXi ipvt;
Matrix< Scalar, Dynamic, 1 > qtf;
private: private:
const FunctorType &functor; const FunctorType &functor;
}; };
@ -38,11 +37,11 @@ private:
template<typename FunctorType, typename Scalar> template<typename FunctorType, typename Scalar>
int LevenbergMarquardtOptimumStorage<FunctorType,Scalar>::minimize( int LevenbergMarquardtOptimumStorage<FunctorType,Scalar>::minimize(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
const Scalar tol const Scalar tol
) )
{ {
const int n = x.size(), m=fvec.size(); const int n = x.size();
const int m = functor.nbOfFunctions();
int info, nfev=0, njev=0; int info, nfev=0, njev=0;
Matrix< Scalar, Dynamic, Dynamic > fjac(m, n); Matrix< Scalar, Dynamic, Dynamic > fjac(m, n);
Matrix< Scalar, Dynamic, 1> diag, qtf; Matrix< Scalar, Dynamic, 1> diag, qtf;
@ -55,9 +54,9 @@ int LevenbergMarquardtOptimumStorage<FunctorType,Scalar>::minimize(
} }
info = minimize( info = minimize(
x, fvec, x,
nfev, njev, nfev, njev,
fjac, ipvt, qtf, diag, diag,
1, 1,
100., 100.,
(n+1)*100, (n+1)*100,
@ -69,12 +68,8 @@ int LevenbergMarquardtOptimumStorage<FunctorType,Scalar>::minimize(
template<typename FunctorType, typename Scalar> template<typename FunctorType, typename Scalar>
int LevenbergMarquardtOptimumStorage<FunctorType,Scalar>::minimize( int LevenbergMarquardtOptimumStorage<FunctorType,Scalar>::minimize(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
int &nfev, int &nfev,
int &njev, int &njev,
Matrix< Scalar, Dynamic, Dynamic > &fjac,
VectorXi &ipvt,
Matrix< Scalar, Dynamic, 1 > &qtf,
Matrix< Scalar, Dynamic, 1 > &diag, Matrix< Scalar, Dynamic, 1 > &diag,
const int mode, const int mode,
const Scalar factor, const Scalar factor,
@ -85,9 +80,11 @@ int LevenbergMarquardtOptimumStorage<FunctorType,Scalar>::minimize(
const int nprint const int nprint
) )
{ {
const int m = fvec.size(), n = x.size(); const int n = x.size();
const int m = functor.nbOfFunctions();
Matrix< Scalar, Dynamic, 1 > wa1(n), wa2(n), wa3(n), wa4(m); Matrix< Scalar, Dynamic, 1 > wa1(n), wa2(n), wa3(n), wa4(m);
fvec.resize(m);
ipvt.resize(n); ipvt.resize(n);
fjac.resize(m, n); fjac.resize(m, n);
diag.resize(n); diag.resize(n);

File diff suppressed because it is too large Load Diff