29 #include <Eigen/Cholesky>
35 if (problem && !problem->isLeastSquaresProblem())
37 PRINT_ERROR(
"LevenbergMarquardtSparse(): 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(
"LevenbergMarquardtSparse(): 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();
70 int nnz = problem.computeSparseJacobianLsqObjectiveNNZ() + problem.computeSparseJacobianEqualitiesNNZ() +
71 problem.computeSparseJacobianInequalitiesNNZ() + problem.computeSparseJacobianFiniteCombinedBoundsNNZ();
103 constexpr
const double eps1 = 1e-5;
104 constexpr
const double eps2 = 1e-5;
105 constexpr
const double eps3 = 1e-5;
106 constexpr
const double eps4 = 0;
112 constexpr
const double goodStepUpperScale = 2. / 3.;
113 constexpr
const double goodStepLowerScale = 1. / 3.;
122 bool analyze_pattern = new_structure;
125 double chi2_old =
_values.squaredNorm();
126 if (obj_value) *obj_value = chi2_old;
144 analyze_pattern =
false;
151 if (
_delta.norm() <= eps2)
158 problem.backupParameters();
161 problem.applyIncrement(
_delta);
167 double chi2_new =
_values.squaredNorm();
176 problem.discardBackupParameters();
202 if (obj_value) *obj_value = chi2_old;
207 problem.restoreBackupParameters(
false);
215 }
while (rho <= 0 && !stop);
216 stop = (
_values.norm() <= eps3);
303 #ifdef MESSAGE_SUPPORT
304 void LevenbergMarquardtSparse::toMessage(corbo::messages::NlpSolver& message)
const
306 message.mutable_levenberg_marquardt_sparse()->set_iterations(
_iterations);
307 message.mutable_levenberg_marquardt_sparse()->set_weight_eq(
_weight_init_eq);
308 message.mutable_levenberg_marquardt_sparse()->set_weight_ineq(
_weight_init_ineq);
318 void LevenbergMarquardtSparse::fromMessage(
const corbo::messages::NlpSolver& message, std::stringstream* issues)
320 _iterations = message.levenberg_marquardt_sparse().iterations();