13#ifndef EIGEN_LEVENBERGMARQUARDT__H
14#define EIGEN_LEVENBERGMARQUARDT__H
18namespace LevenbergMarquardtSpace {
45template<
typename FunctorType,
typename Scalar=
double>
46class LevenbergMarquardt
48 static Scalar sqrt_epsilon()
51 return sqrt(NumTraits<Scalar>::epsilon());
64 ,
ftol(sqrt_epsilon())
65 ,
xtol(sqrt_epsilon())
81 const Scalar tol = sqrt_epsilon()
92 const Scalar tol = sqrt_epsilon()
97 const Scalar tol = sqrt_epsilon()
125 Scalar temp, temp1, temp2;
128 Scalar pnorm, xnorm, fnorm1, actred, dirder, prered;
133template<
typename FunctorType,
typename Scalar>
141 m = functor.values();
144 if (
n <= 0 ||
m <
n || tol < 0.)
148 parameters.ftol = tol;
149 parameters.xtol = tol;
150 parameters.maxfev = 100*(
n+1);
156template<
typename FunctorType,
typename Scalar>
164 status = minimizeOneStep(
x);
169template<
typename FunctorType,
typename Scalar>
174 m = functor.values();
176 wa1.resize(
n); wa2.resize(
n); wa3.resize(
n);
180 if (!useExternalScaling)
182 eigen_assert( (!useExternalScaling || diag.size()==
n) &&
"When useExternalScaling is set, the caller must provide a valid 'diag'");
190 if (
n <= 0 ||
m <
n || parameters.ftol < 0. || parameters.xtol < 0. || parameters.gtol < 0. || parameters.maxfev <= 0 || parameters.factor <= 0.)
193 if (useExternalScaling)
201 if ( functor(
x, fvec) < 0)
203 fnorm = fvec.stableNorm();
212template<
typename FunctorType,
typename Scalar>
222 Index df_ret = functor.df(
x, fjac);
231 wa2 = fjac.colwise().blueNorm();
232 ColPivHouseholderQR<JacobianType> qrfac(fjac);
233 fjac = qrfac.matrixQR();
234 permutation = qrfac.colsPermutation();
239 if (!useExternalScaling)
241 diag[
j] = (wa2[
j]==0.)? 1. : wa2[
j];
245 xnorm = diag.cwiseProduct(
x).stableNorm();
246 delta = parameters.factor * xnorm;
248 delta = parameters.factor;
254 wa4.applyOnTheLeft(qrfac.householderQ().adjoint());
261 if (wa2[permutation.indices()[
j]] != 0.)
262 gnorm = (std::max)(gnorm,
abs( fjac.col(
j).head(
j+1).dot(qtf.head(
j+1)/fnorm) / wa2[permutation.indices()[
j]]));
265 if (gnorm <= parameters.gtol)
269 if (!useExternalScaling)
270 diag = diag.cwiseMax(wa2);
275 internal::lmpar2<Scalar>(qrfac, diag, qtf, delta, par, wa1);
280 pnorm = diag.cwiseProduct(wa1).stableNorm();
284 delta = (std::min)(delta,pnorm);
287 if ( functor(wa2, wa4) < 0)
290 fnorm1 = wa4.stableNorm();
294 if (
Scalar(.1) * fnorm1 < fnorm)
299 wa3 = fjac.template triangularView<Upper>() * (qrfac.colsPermutation().inverse() *wa1);
302 prered = temp1 + temp2 /
Scalar(.5);
303 dirder = -(temp1 + temp2);
309 ratio = actred / prered;
316 temp =
Scalar(.5) * dirder / (dirder +
Scalar(.5) * actred);
320 delta = temp * (std::min)(delta, pnorm /
Scalar(.1));
323 delta = pnorm /
Scalar(.5);
331 wa2 = diag.cwiseProduct(
x);
333 xnorm = wa2.stableNorm();
339 if (
abs(actred) <= parameters.ftol && prered <= parameters.ftol &&
Scalar(.5) *
ratio <= 1. && delta <= parameters.xtol * xnorm)
341 if (
abs(actred) <= parameters.ftol && prered <= parameters.ftol &&
Scalar(.5) *
ratio <= 1.)
343 if (delta <= parameters.xtol * xnorm)
347 if (nfev >= parameters.maxfev)
349 if (
abs(actred) <= NumTraits<Scalar>::epsilon() && prered <= NumTraits<Scalar>::epsilon() &&
Scalar(.5) *
ratio <= 1.)
351 if (delta <= NumTraits<Scalar>::epsilon() * xnorm)
353 if (gnorm <= NumTraits<Scalar>::epsilon())
361template<
typename FunctorType,
typename Scalar>
369 m = functor.values();
372 if (
n <= 0 ||
m <
n || tol < 0.)
376 parameters.ftol = tol;
377 parameters.xtol = tol;
378 parameters.maxfev = 100*(
n+1);
380 return minimizeOptimumStorage(
x);
383template<
typename FunctorType,
typename Scalar>
388 m = functor.values();
390 wa1.resize(
n); wa2.resize(
n); wa3.resize(
n);
399 if (!useExternalScaling)
401 eigen_assert( (!useExternalScaling || diag.size()==
n) &&
"When useExternalScaling is set, the caller must provide a valid 'diag'");
409 if (
n <= 0 ||
m <
n || parameters.ftol < 0. || parameters.xtol < 0. || parameters.gtol < 0. || parameters.maxfev <= 0 || parameters.factor <= 0.)
412 if (useExternalScaling)
420 if ( functor(
x, fvec) < 0)
422 fnorm = fvec.stableNorm();
432template<
typename FunctorType,
typename Scalar>
451 for (
i = 0;
i <
m; ++
i) {
461 for (
j = 0;
j <
n; ++
j) {
464 wa2[
j] = fjac.col(
j).head(
j).stableNorm();
466 permutation.setIdentity(
n);
468 wa2 = fjac.colwise().blueNorm();
473 wa1 = fjac.diagonal();
474 fjac.diagonal() = qrfac.
hCoeffs();
477 for(
Index ii=0; ii< fjac.cols(); ii++) fjac.col(ii).segment(ii+1, fjac.rows()-ii-1) *= fjac(ii,ii);
479 for (
j = 0;
j <
n; ++
j) {
480 if (fjac(
j,
j) != 0.) {
482 for (
i =
j;
i <
n; ++
i)
483 sum += fjac(
i,
j) * qtf[
i];
484 temp = -sum / fjac(
j,
j);
485 for (
i =
j;
i <
n; ++
i)
486 qtf[
i] += fjac(
i,
j) * temp;
495 if (!useExternalScaling)
496 for (
j = 0;
j <
n; ++
j)
497 diag[
j] = (wa2[
j]==0.)? 1. : wa2[
j];
501 xnorm = diag.cwiseProduct(
x).stableNorm();
502 delta = parameters.factor * xnorm;
504 delta = parameters.factor;
510 for (
j = 0;
j <
n; ++
j)
511 if (wa2[permutation.indices()[
j]] != 0.)
512 gnorm = (std::max)(gnorm,
abs( fjac.col(
j).head(
j+1).dot(qtf.head(
j+1)/fnorm) / wa2[permutation.indices()[
j]]));
515 if (gnorm <= parameters.gtol)
519 if (!useExternalScaling)
520 diag = diag.cwiseMax(wa2);
530 pnorm = diag.cwiseProduct(wa1).stableNorm();
534 delta = (std::min)(delta,pnorm);
537 if ( functor(wa2, wa4) < 0)
540 fnorm1 = wa4.stableNorm();
544 if (
Scalar(.1) * fnorm1 < fnorm)
549 wa3 = fjac.topLeftCorner(
n,
n).template triangularView<Upper>() * (permutation.inverse() * wa1);
552 prered = temp1 + temp2 /
Scalar(.5);
553 dirder = -(temp1 + temp2);
559 ratio = actred / prered;
566 temp =
Scalar(.5) * dirder / (dirder +
Scalar(.5) * actred);
570 delta = temp * (std::min)(delta, pnorm /
Scalar(.1));
573 delta = pnorm /
Scalar(.5);
581 wa2 = diag.cwiseProduct(
x);
583 xnorm = wa2.stableNorm();
589 if (
abs(actred) <= parameters.ftol && prered <= parameters.ftol &&
Scalar(.5) *
ratio <= 1. && delta <= parameters.xtol * xnorm)
591 if (
abs(actred) <= parameters.ftol && prered <= parameters.ftol &&
Scalar(.5) *
ratio <= 1.)
593 if (delta <= parameters.xtol * xnorm)
597 if (nfev >= parameters.maxfev)
611template<
typename FunctorType,
typename Scalar>
619 status = minimizeOptimumStorageOneStep(
x);
624template<
typename FunctorType,
typename Scalar>
627 FunctorType &functor,
634 Index m = functor.values();
637 if (
n <= 0 ||
m <
n || tol < 0.)
643 lm.parameters.ftol = tol;
644 lm.parameters.xtol = tol;
645 lm.parameters.maxfev = 200*(
n+1);
Matrix3f m
Definition AngleAxis_mimic_euler.cpp:1
int n
Definition BiCGSTAB_simple.cpp:1
int i
Definition BiCGSTAB_step_by_step.cpp:9
Array< double, 1, 3 > e(1./3., 0.5, 2.)
#define eigen_assert(x)
Definition Macros.h:1037
SCALAR Scalar
Definition bench_gemm.cpp:46
Householder rank-revealing QR decomposition of a matrix with column-pivoting.
Definition ColPivHouseholderQR.h:53
const HCoeffsType & hCoeffs() const
Definition ColPivHouseholderQR.h:334
const PermutationType & colsPermutation() const
Definition ColPivHouseholderQR.h:214
const MatrixType & matrixQR() const
Definition ColPivHouseholderQR.h:189
Performs non linear optimization over a non-linear function, using a variant of the Levenberg Marquar...
Definition LevenbergMarquardt.h:111
static LevenbergMarquardtSpace::Status lmdif1(FunctorType &functor, FVectorType &x, Index *nfev, const Scalar tol=std::sqrt(NumTraits< Scalar >::epsilon()))
Definition LevenbergMarquardt.h:367
PermutationMatrix< Dynamic, Dynamic > permutation
Definition LevenbergMarquardt.h:109
Scalar fnorm
Definition LevenbergMarquardt.h:113
LevenbergMarquardtSpace::Status minimizeOneStep(FVectorType &x)
Definition LMonestep.h:21
_FunctorType FunctorType
Definition LevenbergMarquardt.h:113
LevenbergMarquardtSpace::Status minimizeOptimumStorageOneStep(FVectorType &x)
Definition LevenbergMarquardt.h:434
Parameters parameters
Definition LevenbergMarquardt.h:106
FVectorType diag
Definition LevenbergMarquardt.h:107
FunctorType::JacobianType JacobianType
Definition LevenbergMarquardt.h:115
LevenbergMarquardtSpace::Status minimize(FVectorType &x)
LevenbergMarquardtSpace::Status minimize(FVectorType &x)
Definition LevenbergMarquardt.h:277
LevenbergMarquardtSpace::Status lmstr1(FVectorType &x, const Scalar tol=sqrt_epsilon())
Definition LevenbergMarquardt.h:363
LevenbergMarquardtSpace::Status minimizeOneStep(FVectorType &x)
Index iter
Definition LevenbergMarquardt.h:112
void resetParameters(void)
Definition LevenbergMarquardt.h:104
Index nfev
Definition LevenbergMarquardt.h:110
JacobianType::Scalar Scalar
Definition LevenbergMarquardt.h:116
static LevenbergMarquardtSpace::Status lmdif1(FunctorType &functor, FVectorType &x, Index *nfev, const Scalar tol=sqrt_epsilon())
LevenbergMarquardtSpace::Status lmder1(FVectorType &x, const Scalar tol=std::sqrt(NumTraits< Scalar >::epsilon()))
Definition LevenbergMarquardt.h:344
Scalar lm_param(void)
Definition LevenbergMarquardt.h:116
Matrix< Scalar, Dynamic, 1 > FVectorType
Definition LevenbergMarquardt.h:76
LevenbergMarquardtSpace::Status minimizeOptimumStorage(FVectorType &x)
Definition LevenbergMarquardt.h:613
bool useExternalScaling
Definition LevenbergMarquardt.h:114
FVectorType fvec
Definition LevenbergMarquardt.h:107
FVectorType qtf
Definition LevenbergMarquardt.h:107
Matrix< Scalar, Dynamic, Dynamic > JacobianType
Definition LevenbergMarquardt.h:77
LevenbergMarquardt(FunctorType &_functor)
Definition LevenbergMarquardt.h:55
LevenbergMarquardtSpace::Status lmder1(FVectorType &x, const Scalar tol=sqrt_epsilon())
Scalar gnorm
Definition LevenbergMarquardt.h:113
DenseIndex Index
Definition LevenbergMarquardt.h:58
LevenbergMarquardtSpace::Status minimizeInit(FVectorType &x)
Definition LevenbergMarquardt.h:294
LevenbergMarquardtSpace::Status minimizeInit(FVectorType &x)
JacobianType fjac
Definition LevenbergMarquardt.h:108
LevenbergMarquardtSpace::Status minimizeOptimumStorageInit(FVectorType &x)
Definition LevenbergMarquardt.h:385
Index njev
Definition LevenbergMarquardt.h:111
Matrix< Scalar, Dynamic, 1 > FVectorType
Definition LevenbergMarquardt.h:119
Definition NumericalDiff.h:37
Permutation matrix.
Definition PermutationMatrix.h:298
#define abs(x)
Definition datatypes.h:17
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy x
Definition gnuplot_common_settings.hh:12
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy y set format x g set format y g set format x2 g set format y2 g set format z g set angles radians set nogrid set key title set key left top Right noreverse box linetype linewidth samplen spacing width set nolabel set noarrow set nologscale set logscale x set set pointsize set encoding default set nopolar set noparametric set set set set surface set nocontour set clabel set mapping cartesian set nohidden3d set cntrparam order set cntrparam linear set cntrparam levels auto set cntrparam points set size ratio
Definition gnuplot_common_settings.hh:44
else if n * info
Definition cholesky.cpp:18
Status
Definition LevenbergMarquardt.h:25
@ RelativeReductionTooSmall
Definition LevenbergMarquardt.h:29
@ GtolTooSmall
Definition LevenbergMarquardt.h:36
@ NotStarted
Definition LevenbergMarquardt.h:26
@ UserAsked
Definition LevenbergMarquardt.h:37
@ Running
Definition LevenbergMarquardt.h:27
@ FtolTooSmall
Definition LevenbergMarquardt.h:34
@ TooManyFunctionEvaluation
Definition LevenbergMarquardt.h:33
@ XtolTooSmall
Definition LevenbergMarquardt.h:35
@ CosinusTooSmall
Definition LevenbergMarquardt.h:32
@ RelativeErrorTooSmall
Definition LevenbergMarquardt.h:30
@ ImproperInputParameters
Definition LevenbergMarquardt.h:28
@ RelativeErrorAndReductionTooSmall
Definition LevenbergMarquardt.h:31
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 sqrt(const bfloat16 &a)
Definition BFloat16.h:511
EIGEN_DEVICE_FUNC bool abs2(bool x)
Definition MathFunctions.h:1292
Namespace containing all symbols from the Eigen library.
Definition bench_norm.cpp:85
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:74
EIGEN_DEFAULT_DENSE_INDEX_TYPE DenseIndex
Definition Meta.h:66
Definition LevenbergMarquardt.h:60
Scalar ftol
Definition LevenbergMarquardt.h:70
Scalar gtol
Definition LevenbergMarquardt.h:72
Scalar factor
Definition LevenbergMarquardt.h:68
Parameters()
Definition LevenbergMarquardt.h:61
Index maxfev
Definition LevenbergMarquardt.h:69
Scalar xtol
Definition LevenbergMarquardt.h:71
Scalar epsfcn
Definition LevenbergMarquardt.h:73
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition NumTraits.h:233
Definition ForwardDeclarations.h:17
std::ptrdiff_t j
Definition tut_arithmetic_redux_minmax.cpp:2