17 #ifndef OPTIMIZATION__NEWTONS_METHOD_OPTIMIZER_HPP_
18 #define OPTIMIZATION__NEWTONS_METHOD_OPTIMIZER_HPP_
33 namespace optimization
36 template<
typename LineSearchT>
38 :
public Optimizer<NewtonsMethodOptimizer<LineSearchT>>
49 const LineSearchT & line_searcher,
51 : m_line_searcher{line_searcher}, m_options{options} {}
67 template<
typename OptimizationProblemT,
typename DomainValueT,
typename EigenSolverT>
69 OptimizationProblemT & optimization_problem,
70 const DomainValueT & x0, DomainValueT & x_out)
73 using Value =
typename OptimizationProblemT::Value;
74 using Jacobian =
typename OptimizationProblemT::Jacobian;
75 using Hessian =
typename OptimizationProblemT::Hessian;
77 Value score_previous{0.0};
78 Jacobian jacobian{Jacobian{}.setZero()};
79 Hessian hessian{Hessian{}.setZero()};
80 DomainValueT opt_direction{DomainValueT{}.setZero()};
82 if (!x0.allFinite()) {
91 score_previous = optimization_problem(x_out);
92 optimization_problem.jacobian(x_out, jacobian);
93 optimization_problem.hessian(x_out, hessian);
96 if (jacobian.template lpNorm<Eigen::Infinity>() <= m_options.gradient_tolerance()) {
102 auto nr_iterations = 0UL;
103 for (; nr_iterations < m_options.max_num_iterations(); ++nr_iterations) {
104 if (!x_out.allFinite() || !jacobian.allFinite() || !hessian.allFinite()) {
109 EigenSolverT solver(hessian);
110 opt_direction = solver.solve(-jacobian);
113 if (!opt_direction.allFinite()) {
123 const auto step = m_line_searcher.compute_next_step(
124 x_out, opt_direction,
125 optimization_problem);
126 const auto prev_x_norm = x_out.norm();
133 const auto parameter_tolerance =
134 m_options.parameter_tolerance() * (prev_x_norm + m_options.parameter_tolerance());
135 if (step.norm() <= parameter_tolerance) {
142 const auto score = optimization_problem(x_out);
143 optimization_problem.jacobian(x_out, jacobian);
144 optimization_problem.hessian(x_out, hessian);
147 if (jacobian.template lpNorm<Eigen::Infinity>() <= m_options.gradient_tolerance()) {
153 if (std::fabs(score - score_previous) <=
154 (m_options.function_tolerance() * std::fabs(score_previous)))
159 score_previous = score;
169 LineSearchT m_line_searcher;
176 #endif // OPTIMIZATION__NEWTONS_METHOD_OPTIMIZER_HPP_