29 #include <Eigen/Cholesky>
35 if (problem && !problem->isLeastSquaresProblem())
37 PRINT_ERROR(
"LevenbergMarquardtDense(): cannot handle non-least-squares objectives or LS objectives in non-LS form.");
46 if (obj_value) *obj_value = -1;
50 if (!problem.isLeastSquaresProblem())
52 PRINT_ERROR(
"LevenbergMarquardtDense(): cannot handle non-least-squares objectives or LS objectives in non-LS form.");
57 _obj_dim = problem.getLsqObjectiveDimension();
58 _eq_dim = problem.getEqualityDimension();
59 _ineq_dim = problem.getInequalityDimension();
97 constexpr
const double eps1 = 1e-5;
98 constexpr
const double eps2 = 1e-5;
99 constexpr
const double eps3 = 1e-5;
100 constexpr
const double eps4 = 0;
106 constexpr
const double goodStepUpperScale = 2. / 3.;
107 constexpr
const double goodStepLowerScale = 1. / 3.;
111 double mu = tau *
_hessian.diagonal().maxCoeff();
117 double chi2_old =
_values.squaredNorm();
118 if (obj_value) *obj_value = chi2_old;
132 if (
_delta.norm() <= eps2)
137 problem.backupParameters();
140 problem.applyIncrement(
_delta);
146 double chi2_new =
_values.squaredNorm();
155 problem.discardBackupParameters();
180 if (obj_value) *obj_value = chi2_old;
185 problem.restoreBackupParameters(
false);
193 }
while (rho <= 0 && !stop);
194 stop = (
_values.norm() <= eps3);
307 #ifdef MESSAGE_SUPPORT
308 void LevenbergMarquardtDense::toMessage(corbo::messages::NlpSolver& message)
const
310 message.mutable_levenberg_marquardt_dense()->set_iterations(
_iterations);
311 message.mutable_levenberg_marquardt_dense()->set_weight_eq(
_weight_init_eq);
322 void LevenbergMarquardtDense::fromMessage(
const corbo::messages::NlpSolver& message, std::stringstream* issues)
324 _iterations = message.levenberg_marquardt_dense().iterations();