Allow LevenbergMarquardt to work with non-standard types.

This commit is contained in:
Freddie Witherden 2014-08-27 15:24:51 +01:00
parent 0ba490cf80
commit c3e4080474
2 changed files with 12 additions and 8 deletions

View File

@ -144,11 +144,13 @@ class LevenbergMarquardt : internal::no_assignment_operator
/** Sets the default parameters */ /** Sets the default parameters */
void resetParameters() void resetParameters()
{ {
using std::sqrt;
m_factor = 100.; m_factor = 100.;
m_maxfev = 400; m_maxfev = 400;
m_ftol = std::sqrt(NumTraits<RealScalar>::epsilon()); m_ftol = sqrt(NumTraits<RealScalar>::epsilon());
m_xtol = std::sqrt(NumTraits<RealScalar>::epsilon()); m_xtol = sqrt(NumTraits<RealScalar>::epsilon());
m_gtol = 0. ; m_gtol = 0. ;
m_epsfcn = 0. ; m_epsfcn = 0. ;
} }

View File

@ -55,8 +55,8 @@ public:
Parameters() Parameters()
: factor(Scalar(100.)) : factor(Scalar(100.))
, maxfev(400) , maxfev(400)
, ftol(std::sqrt(NumTraits<Scalar>::epsilon())) , ftol(sqrt_(NumTraits<Scalar>::epsilon()))
, xtol(std::sqrt(NumTraits<Scalar>::epsilon())) , xtol(sqrt_(NumTraits<Scalar>::epsilon()))
, gtol(Scalar(0.)) , gtol(Scalar(0.))
, epsfcn(Scalar(0.)) {} , epsfcn(Scalar(0.)) {}
Scalar factor; Scalar factor;
@ -72,7 +72,7 @@ public:
LevenbergMarquardtSpace::Status lmder1( LevenbergMarquardtSpace::Status lmder1(
FVectorType &x, FVectorType &x,
const Scalar tol = std::sqrt(NumTraits<Scalar>::epsilon()) const Scalar tol = sqrt_(NumTraits<Scalar>::epsilon())
); );
LevenbergMarquardtSpace::Status minimize(FVectorType &x); LevenbergMarquardtSpace::Status minimize(FVectorType &x);
@ -83,12 +83,12 @@ public:
FunctorType &functor, FunctorType &functor,
FVectorType &x, FVectorType &x,
Index *nfev, Index *nfev,
const Scalar tol = std::sqrt(NumTraits<Scalar>::epsilon()) const Scalar tol = sqrt_(NumTraits<Scalar>::epsilon())
); );
LevenbergMarquardtSpace::Status lmstr1( LevenbergMarquardtSpace::Status lmstr1(
FVectorType &x, FVectorType &x,
const Scalar tol = std::sqrt(NumTraits<Scalar>::epsilon()) const Scalar tol = sqrt_(NumTraits<Scalar>::epsilon())
); );
LevenbergMarquardtSpace::Status minimizeOptimumStorage(FVectorType &x); LevenbergMarquardtSpace::Status minimizeOptimumStorage(FVectorType &x);
@ -109,6 +109,8 @@ public:
Scalar lm_param(void) { return par; } Scalar lm_param(void) { return par; }
private: private:
static Scalar sqrt_(const Scalar& x) { using std::sqrt; return sqrt(x); }
FunctorType &functor; FunctorType &functor;
Index n; Index n;
Index m; Index m;