mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
move Parameters as a class member, simplify calling sequence. Convenience
methods from minpack ( "*1()" ) get their original name back : they are only useful when porting, anyway. Still, i prefer to keep them.
This commit is contained in:
@@ -33,48 +33,44 @@ public:
|
||||
Scalar epsfcn;
|
||||
};
|
||||
|
||||
Status solve(
|
||||
Status hybrj1(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Scalar tol = ei_sqrt(epsilon<Scalar>())
|
||||
);
|
||||
|
||||
Status solveInit(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode=1
|
||||
);
|
||||
Status solveOneStep(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode=1
|
||||
);
|
||||
Status solve(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode=1
|
||||
);
|
||||
|
||||
Status solveNumericalDiff(
|
||||
Status hybrd1(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Scalar tol = ei_sqrt(epsilon<Scalar>())
|
||||
);
|
||||
|
||||
Status solveNumericalDiffInit(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode=1
|
||||
);
|
||||
Status solveNumericalDiffOneStep(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode=1
|
||||
);
|
||||
Status solveNumericalDiff(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode=1
|
||||
);
|
||||
|
||||
void resetParameters(void) { parameters = Parameters(); }
|
||||
Parameters parameters;
|
||||
Matrix< Scalar, Dynamic, 1 > fvec;
|
||||
Matrix< Scalar, Dynamic, Dynamic > fjac;
|
||||
Matrix< Scalar, Dynamic, 1 > R;
|
||||
@@ -105,24 +101,23 @@ private:
|
||||
|
||||
template<typename FunctorType, typename Scalar>
|
||||
typename HybridNonLinearSolver<FunctorType,Scalar>::Status
|
||||
HybridNonLinearSolver<FunctorType,Scalar>::solve(
|
||||
HybridNonLinearSolver<FunctorType,Scalar>::hybrj1(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Scalar tol
|
||||
)
|
||||
{
|
||||
n = x.size();
|
||||
Parameters parameters;
|
||||
|
||||
/* check the input parameters for errors. */
|
||||
if (n <= 0 || tol < 0.)
|
||||
return ImproperInputParameters;
|
||||
|
||||
resetParameters();
|
||||
parameters.maxfev = 100*(n+1);
|
||||
parameters.xtol = tol;
|
||||
diag.setConstant(n, 1.);
|
||||
return solve(
|
||||
x,
|
||||
parameters,
|
||||
2
|
||||
);
|
||||
}
|
||||
@@ -131,7 +126,6 @@ template<typename FunctorType, typename Scalar>
|
||||
typename HybridNonLinearSolver<FunctorType,Scalar>::Status
|
||||
HybridNonLinearSolver<FunctorType,Scalar>::solveInit(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode
|
||||
)
|
||||
{
|
||||
@@ -182,7 +176,6 @@ template<typename FunctorType, typename Scalar>
|
||||
typename HybridNonLinearSolver<FunctorType,Scalar>::Status
|
||||
HybridNonLinearSolver<FunctorType,Scalar>::solveOneStep(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode
|
||||
)
|
||||
{
|
||||
@@ -404,13 +397,12 @@ template<typename FunctorType, typename Scalar>
|
||||
typename HybridNonLinearSolver<FunctorType,Scalar>::Status
|
||||
HybridNonLinearSolver<FunctorType,Scalar>::solve(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode
|
||||
)
|
||||
{
|
||||
Status status = solveInit(x, parameters, mode);
|
||||
Status status = solveInit(x, mode);
|
||||
while (status==Running)
|
||||
status = solveOneStep(x, parameters, mode);
|
||||
status = solveOneStep(x, mode);
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -418,25 +410,24 @@ HybridNonLinearSolver<FunctorType,Scalar>::solve(
|
||||
|
||||
template<typename FunctorType, typename Scalar>
|
||||
typename HybridNonLinearSolver<FunctorType,Scalar>::Status
|
||||
HybridNonLinearSolver<FunctorType,Scalar>::solveNumericalDiff(
|
||||
HybridNonLinearSolver<FunctorType,Scalar>::hybrd1(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Scalar tol
|
||||
)
|
||||
{
|
||||
n = x.size();
|
||||
Parameters parameters;
|
||||
|
||||
/* check the input parameters for errors. */
|
||||
if (n <= 0 || tol < 0.)
|
||||
return ImproperInputParameters;
|
||||
|
||||
resetParameters();
|
||||
parameters.maxfev = 200*(n+1);
|
||||
parameters.xtol = tol;
|
||||
|
||||
diag.setConstant(n, 1.);
|
||||
return solveNumericalDiff(
|
||||
x,
|
||||
parameters,
|
||||
2
|
||||
);
|
||||
}
|
||||
@@ -445,16 +436,13 @@ template<typename FunctorType, typename Scalar>
|
||||
typename HybridNonLinearSolver<FunctorType,Scalar>::Status
|
||||
HybridNonLinearSolver<FunctorType,Scalar>::solveNumericalDiffInit(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode
|
||||
)
|
||||
{
|
||||
n = x.size();
|
||||
|
||||
int nsub = parameters.nb_of_subdiagonals;
|
||||
int nsup = parameters.nb_of_superdiagonals;
|
||||
if (nsub<0) nsub= n-1;
|
||||
if (nsup<0) nsup= n-1;
|
||||
if (parameters.nb_of_subdiagonals<0) parameters.nb_of_subdiagonals= n-1;
|
||||
if (parameters.nb_of_superdiagonals<0) parameters.nb_of_superdiagonals= n-1;
|
||||
|
||||
wa1.resize(n); wa2.resize(n); wa3.resize(n); wa4.resize(n);
|
||||
qtf.resize(n);
|
||||
@@ -472,7 +460,7 @@ HybridNonLinearSolver<FunctorType,Scalar>::solveNumericalDiffInit(
|
||||
|
||||
/* check the input parameters for errors. */
|
||||
|
||||
if (n <= 0 || parameters.xtol < 0. || parameters.maxfev <= 0 || nsub< 0 || nsup< 0 || parameters.factor <= 0. )
|
||||
if (n <= 0 || parameters.xtol < 0. || parameters.maxfev <= 0 || parameters.nb_of_subdiagonals< 0 || parameters.nb_of_superdiagonals< 0 || parameters.factor <= 0. )
|
||||
return ImproperInputParameters;
|
||||
if (mode == 2)
|
||||
for (int j = 0; j < n; ++j)
|
||||
@@ -502,22 +490,19 @@ template<typename FunctorType, typename Scalar>
|
||||
typename HybridNonLinearSolver<FunctorType,Scalar>::Status
|
||||
HybridNonLinearSolver<FunctorType,Scalar>::solveNumericalDiffOneStep(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode
|
||||
)
|
||||
{
|
||||
int i, j, l, iwa[1];
|
||||
jeval = true;
|
||||
int nsub = parameters.nb_of_subdiagonals;
|
||||
int nsup = parameters.nb_of_superdiagonals;
|
||||
if (nsub<0) nsub= n-1;
|
||||
if (nsup<0) nsup= n-1;
|
||||
if (parameters.nb_of_subdiagonals<0) parameters.nb_of_subdiagonals= n-1;
|
||||
if (parameters.nb_of_superdiagonals<0) parameters.nb_of_superdiagonals= n-1;
|
||||
|
||||
/* calculate the jacobian matrix. */
|
||||
|
||||
if (ei_fdjac1(functor, x, fvec, fjac, nsub, nsup, parameters.epsfcn) <0)
|
||||
if (ei_fdjac1(functor, x, fvec, fjac, parameters.nb_of_subdiagonals, parameters.nb_of_superdiagonals, parameters.epsfcn) <0)
|
||||
return UserAksed;
|
||||
nfev += std::min(nsub+ nsup+ 1, n);
|
||||
nfev += std::min(parameters.nb_of_subdiagonals+parameters.nb_of_superdiagonals+ 1, n);
|
||||
|
||||
/* compute the qr factorization of the jacobian. */
|
||||
|
||||
@@ -728,13 +713,12 @@ template<typename FunctorType, typename Scalar>
|
||||
typename HybridNonLinearSolver<FunctorType,Scalar>::Status
|
||||
HybridNonLinearSolver<FunctorType,Scalar>::solveNumericalDiff(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode
|
||||
)
|
||||
{
|
||||
Status status = solveNumericalDiffInit(x, parameters, mode);
|
||||
Status status = solveNumericalDiffInit(x, mode);
|
||||
while (status==Running)
|
||||
status = solveNumericalDiffOneStep(x, parameters, mode);
|
||||
status = solveNumericalDiffOneStep(x, mode);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
@@ -36,69 +36,62 @@ public:
|
||||
Scalar epsfcn;
|
||||
};
|
||||
|
||||
Status minimize(
|
||||
Status lmder1(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Scalar tol = ei_sqrt(epsilon<Scalar>())
|
||||
);
|
||||
|
||||
Status minimize(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode=1
|
||||
);
|
||||
Status minimizeInit(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode=1
|
||||
);
|
||||
Status minimizeOneStep(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode=1
|
||||
);
|
||||
|
||||
Status minimizeNumericalDiff(
|
||||
Status lmdif1(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Scalar tol = ei_sqrt(epsilon<Scalar>())
|
||||
);
|
||||
|
||||
Status minimizeNumericalDiff(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode=1
|
||||
);
|
||||
Status minimizeNumericalDiffInit(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode=1
|
||||
);
|
||||
Status minimizeNumericalDiffOneStep(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode=1
|
||||
);
|
||||
|
||||
Status minimizeOptimumStorage(
|
||||
Status lmstr1(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Scalar tol = ei_sqrt(epsilon<Scalar>())
|
||||
);
|
||||
|
||||
Status minimizeOptimumStorage(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode=1
|
||||
);
|
||||
Status minimizeOptimumStorageInit(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode=1
|
||||
);
|
||||
Status minimizeOptimumStorageOneStep(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode=1
|
||||
);
|
||||
|
||||
void resetParameters(void) { parameters = Parameters(); }
|
||||
Parameters parameters;
|
||||
Matrix< Scalar, Dynamic, 1 > fvec;
|
||||
Matrix< Scalar, Dynamic, Dynamic > fjac;
|
||||
VectorXi ipvt;
|
||||
@@ -123,27 +116,24 @@ private:
|
||||
|
||||
template<typename FunctorType, typename Scalar>
|
||||
typename LevenbergMarquardt<FunctorType,Scalar>::Status
|
||||
LevenbergMarquardt<FunctorType,Scalar>::minimize(
|
||||
LevenbergMarquardt<FunctorType,Scalar>::lmder1(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Scalar tol
|
||||
)
|
||||
{
|
||||
n = x.size();
|
||||
m = functor.nbOfFunctions();
|
||||
Parameters parameters;
|
||||
|
||||
/* check the input parameters for errors. */
|
||||
if (n <= 0 || m < n || tol < 0.)
|
||||
return ImproperInputParameters;
|
||||
|
||||
resetParameters();
|
||||
parameters.ftol = tol;
|
||||
parameters.xtol = tol;
|
||||
parameters.maxfev = 100*(n+1);
|
||||
|
||||
return minimize(
|
||||
x,
|
||||
parameters
|
||||
);
|
||||
return minimize(x);
|
||||
}
|
||||
|
||||
|
||||
@@ -151,13 +141,12 @@ template<typename FunctorType, typename Scalar>
|
||||
typename LevenbergMarquardt<FunctorType,Scalar>::Status
|
||||
LevenbergMarquardt<FunctorType,Scalar>::minimize(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode
|
||||
)
|
||||
{
|
||||
Status status = minimizeInit(x, parameters, mode);
|
||||
Status status = minimizeInit(x, mode);
|
||||
while (status==Running)
|
||||
status = minimizeOneStep(x, parameters, mode);
|
||||
status = minimizeOneStep(x, mode);
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -165,7 +154,6 @@ template<typename FunctorType, typename Scalar>
|
||||
typename LevenbergMarquardt<FunctorType,Scalar>::Status
|
||||
LevenbergMarquardt<FunctorType,Scalar>::minimizeInit(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode
|
||||
)
|
||||
{
|
||||
@@ -216,7 +204,6 @@ template<typename FunctorType, typename Scalar>
|
||||
typename LevenbergMarquardt<FunctorType,Scalar>::Status
|
||||
LevenbergMarquardt<FunctorType,Scalar>::minimizeOneStep(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode
|
||||
)
|
||||
{
|
||||
@@ -408,34 +395,30 @@ LevenbergMarquardt<FunctorType,Scalar>::minimizeOneStep(
|
||||
|
||||
template<typename FunctorType, typename Scalar>
|
||||
typename LevenbergMarquardt<FunctorType,Scalar>::Status
|
||||
LevenbergMarquardt<FunctorType,Scalar>::minimizeNumericalDiff(
|
||||
LevenbergMarquardt<FunctorType,Scalar>::lmdif1(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Scalar tol
|
||||
)
|
||||
{
|
||||
n = x.size();
|
||||
m = functor.nbOfFunctions();
|
||||
Parameters parameters;
|
||||
|
||||
/* check the input parameters for errors. */
|
||||
if (n <= 0 || m < n || tol < 0.)
|
||||
return ImproperInputParameters;
|
||||
|
||||
resetParameters();
|
||||
parameters.ftol = tol;
|
||||
parameters.xtol = tol;
|
||||
parameters.maxfev = 200*(n+1);
|
||||
|
||||
return minimizeNumericalDiff(
|
||||
x,
|
||||
parameters
|
||||
);
|
||||
return minimizeNumericalDiff(x);
|
||||
}
|
||||
|
||||
template<typename FunctorType, typename Scalar>
|
||||
typename LevenbergMarquardt<FunctorType,Scalar>::Status
|
||||
LevenbergMarquardt<FunctorType,Scalar>::minimizeNumericalDiffInit(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode
|
||||
)
|
||||
{
|
||||
@@ -484,7 +467,6 @@ template<typename FunctorType, typename Scalar>
|
||||
typename LevenbergMarquardt<FunctorType,Scalar>::Status
|
||||
LevenbergMarquardt<FunctorType,Scalar>::minimizeNumericalDiffOneStep(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode
|
||||
)
|
||||
{
|
||||
@@ -679,20 +661,19 @@ template<typename FunctorType, typename Scalar>
|
||||
typename LevenbergMarquardt<FunctorType,Scalar>::Status
|
||||
LevenbergMarquardt<FunctorType,Scalar>::minimizeNumericalDiff(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode
|
||||
)
|
||||
{
|
||||
Status status = minimizeNumericalDiffInit(x, parameters, mode);
|
||||
Status status = minimizeNumericalDiffInit(x, mode);
|
||||
while (status==Running)
|
||||
status = minimizeNumericalDiffOneStep(x, parameters, mode);
|
||||
status = minimizeNumericalDiffOneStep(x, mode);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
template<typename FunctorType, typename Scalar>
|
||||
typename LevenbergMarquardt<FunctorType,Scalar>::Status
|
||||
LevenbergMarquardt<FunctorType,Scalar>::minimizeOptimumStorage(
|
||||
LevenbergMarquardt<FunctorType,Scalar>::lmstr1(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Scalar tol
|
||||
)
|
||||
@@ -701,27 +682,23 @@ LevenbergMarquardt<FunctorType,Scalar>::minimizeOptimumStorage(
|
||||
m = functor.nbOfFunctions();
|
||||
Matrix< Scalar, Dynamic, Dynamic > fjac(m, n);
|
||||
VectorXi ipvt;
|
||||
Parameters parameters;
|
||||
|
||||
/* check the input parameters for errors. */
|
||||
if (n <= 0 || m < n || tol < 0.)
|
||||
return ImproperInputParameters;
|
||||
|
||||
resetParameters();
|
||||
parameters.ftol = tol;
|
||||
parameters.xtol = tol;
|
||||
parameters.maxfev = 100*(n+1);
|
||||
|
||||
return minimizeOptimumStorage(
|
||||
x,
|
||||
parameters
|
||||
);
|
||||
return minimizeOptimumStorage(x);
|
||||
}
|
||||
|
||||
template<typename FunctorType, typename Scalar>
|
||||
typename LevenbergMarquardt<FunctorType,Scalar>::Status
|
||||
LevenbergMarquardt<FunctorType,Scalar>::minimizeOptimumStorageInit(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode
|
||||
)
|
||||
{
|
||||
@@ -773,7 +750,6 @@ template<typename FunctorType, typename Scalar>
|
||||
typename LevenbergMarquardt<FunctorType,Scalar>::Status
|
||||
LevenbergMarquardt<FunctorType,Scalar>::minimizeOptimumStorageOneStep(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode
|
||||
)
|
||||
{
|
||||
@@ -986,13 +962,12 @@ template<typename FunctorType, typename Scalar>
|
||||
typename LevenbergMarquardt<FunctorType,Scalar>::Status
|
||||
LevenbergMarquardt<FunctorType,Scalar>::minimizeOptimumStorage(
|
||||
Matrix< Scalar, Dynamic, 1 > &x,
|
||||
const Parameters ¶meters,
|
||||
const int mode
|
||||
)
|
||||
{
|
||||
Status status = minimizeOptimumStorageInit(x, parameters, mode);
|
||||
Status status = minimizeOptimumStorageInit(x, mode);
|
||||
while (status==Running)
|
||||
status = minimizeOptimumStorageOneStep(x, parameters, mode);
|
||||
status = minimizeOptimumStorageOneStep(x, mode);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user