79 if (iteration == 0 && !online)
93 OptimizationAlgorithmWithHessian::template
solver.optimizer.computeActiveErrors();
95 g_type currentChi = OptimizationAlgorithmWithHessian::template
optimizer.activeRobustChi2();
97 OptimizationAlgorithmWithHessian::template
solver.buildSystem();
99 Eigen::VectorX<g_type>::ConstMapType b(OptimizationAlgorithmWithHessian::template
solver.b(), OptimizationAlgorithmWithHessian::template
solver.vectorSize());
103 OptimizationAlgorithmWithHessian::template
solver.multiplyHessian(
_auxVector.data(), OptimizationAlgorithmWithHessian::template
solver.b());
104 g_type bNormSquared = b.squaredNorm();
105 g_type alpha = bNormSquared /
_auxVector.dot(b);
108 g_type hsdNorm =
_hsd.norm();
109 g_type hgnNorm = -1.;
111 bool solvedGaussNewton =
false;
112 bool goodStep =
false;
118 if (!solvedGaussNewton) {
119 const g_type minLambda = 1e-12;
120 const g_type maxLambda = 1e3;
121 solvedGaussNewton =
true;
125 bool solverOk =
false;
129 solverOk = OptimizationAlgorithmWithHessian::template
solver.solve();
131 OptimizationAlgorithmWithHessian::template
solver.restoreDiagonal();
150 hgnNorm = Eigen::VectorX<g_type>::ConstMapType(OptimizationAlgorithmWithHessian::template
solver.x(), OptimizationAlgorithmWithHessian::template
solver.vectorSize()).norm();
153 Eigen::VectorX<g_type>::ConstMapType hgn(OptimizationAlgorithmWithHessian::template
solver.x(), OptimizationAlgorithmWithHessian::template
solver.vectorSize());
154 lib_assert(hgnNorm >= 0.,
"Norm of the GN step is not computed");
160 else if (hsdNorm >
_delta) {
167 g_type bmaSquaredNorm =
_auxVector.squaredNorm();
170 beta = (-c +
sqrt(c * c + bmaSquaredNorm * (
_delta *
_delta -
_hsd.squaredNorm()))) / bmaSquaredNorm;
172 g_type hsdSqrNorm =
_hsd.squaredNorm();
175 assert(beta > 0. && beta < 1 &&
"Error while computing beta");
178 assert(
_hdl.norm() <
_delta + 1e-5 &&
"Computed step does not correspond to the trust region");
183 OptimizationAlgorithmWithHessian::template
solver.multiplyHessian(
_auxVector.data(),
_hdl.data());
187 OptimizationAlgorithmWithHessian::template
solver.optimizer.push();
188 OptimizationAlgorithmWithHessian::template
solver.optimizer.update(
_hdl.data());
189 OptimizationAlgorithmWithHessian::template
solver.optimizer.computeActiveErrors();
190 g_type newChi = OptimizationAlgorithmWithHessian::template
optimizer.activeRobustChi2();
191 g_type nonLinearGain = currentChi - newChi;
192 if (fabs(linearGain) < 1e-12)
194 g_type rho = nonLinearGain / linearGain;
197 OptimizationAlgorithmWithHessian::template
solver.optimizer.discardTop();
201 OptimizationAlgorithmWithHessian::template
solver.optimizer.pop();