25 #ifndef _LevenbergMarquardtBase_hh_
26 #define _LevenbergMarquardtBase_hh_
28 #include <bias_config.h>
29 #include <Base/Math/Matrix.hh>
30 #include <Base/Math/Vector.hh>
31 #include <MathAlgo/Minpack.hh>
32 #include <MathAlgo/minpack/cminpack.h>
68 double LM_squaredSum_;
78 LM_tolerance_ = MINPACK_DEF_TOLERANCE;
79 LM_maxIters_ = LM_DEF_MAX_ITER;
99 BIASERR(
"No analytic Jacobian defined for target function!");
108 { LM_tolerance_ = (tol > 0 ? tol : MINPACK_DEF_TOLERANCE); }
112 {
return LM_tolerance_; }
116 { LM_maxIters_ = (iters > 0 ? iters : LM_DEF_MAX_ITER); }
120 {
return LM_maxIters_; }
124 {
return LM_squaredSum_; }
128 {
return LM_numIters_; }
132 {
return LM_parameters_; }
136 {
return LM_residuals_; }
140 {
return LM_Jacobian_; }
148 int LM_Compute(
const int numResiduals,
const int numParameters,
162 int LM_ComputeWithoutJacobian(
const int numResiduals,
163 const int numParameters,
167 const double epsilon = LM_DEF_EPSILON);
172 inline static int g_MinpackFunction(
void *ptr,
int m,
int n,
174 double *fvec,
double *fjac,
175 int ldfjac,
int iflag)
179 return LM->MinpackFunction_(m, n, x, fvec, fjac, ldfjac, iflag);
183 inline static int g_MinpackFunctionWithoutJacobian(
void *ptr,
int m,
int n,
185 double *fvec,
int iflag)
187 LevenbergMarquardtBase *LM =
static_cast<LevenbergMarquardtBase *
>(ptr);
189 return LM->MinpackFunctionWithoutJacobian_(m, n, x, fvec, iflag);
195 inline int MinpackFunction_(
int m,
int n,
const double *x,
double *fvec,
196 double *fjac,
int ldfjac,
int iflag)
199 memcpy(LM_parameters_.GetData(), x, n *
sizeof(double));
203 res = LM_TargetFunction_(LM_parameters_, LM_residuals_);
204 memcpy(fvec, LM_residuals_.GetData(), m *
sizeof(double));
210 res = LM_JacobianFunction_(LM_parameters_, LM_Jacobian_);
213 for (
int i = 0; i < n; i++)
214 for (
int j = 0; j < m; j++)
215 *(f++) = LM_Jacobian_[j][i];
228 inline int MinpackFunctionWithoutJacobian_(
int m,
int n,
const double *x,
229 double *fvec,
int iflag)
232 memcpy(LM_parameters_.GetData(), x, n *
sizeof(double));
233 if (iflag == 0 || iflag == 1)
236 res = LM_TargetFunction_(LM_parameters_, LM_residuals_);
237 memcpy(fvec, LM_residuals_.GetData(), m *
sizeof(double));
250 #endif // _LevenbergMarquardtBase_hh_
BIAS::Vector< double > LM_GetParameterResult() const
Return the resulting parameter vector x from last computation.
Base interface for classes using non-linear optimization of a target function using the Levenberg-Mar...
int LM_GetMaxIterations() const
Return the maximal number of iterations to perform.
void LM_SetTolerance(const double tol)
Set tolerance used to evaluate convergence.
virtual int LM_JacobianFunction_(const BIAS::Vector< double > &x, BIAS::Matrix< double > &J)
Compute Jacobian J(x) of target function f evaluated at vector x.
double LM_GetSumOfSquaredErrors() const
Return the sum of squared errors from the last computation.
void LM_SetMaxIterations(const int iters)
Set the maximal number of iterations to perform.
BIAS::Vector< double > LM_GetResidualsResult() const
Return the resulting residual vector f(x) from last computation.
BIAS::Matrix< double > LM_GetJacobianResult() const
Return the resulting Jacobian J(x) from the last computation.
int LM_GetNumOfIterations() const
Return the number of iterations performed in last computation.
virtual ~LevenbergMarquardtBase()
double LM_GetTolerance() const
Return tolerance used to evaluate convergence.