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_ Definition: common/optimization/include/optimization/utils.hpp:38
ComputeMode & set_hessian() noexcept
Definition: utils.cpp:41
float_t StepT
Definition: newtons_method_optimizer.hpp:41
TerminationType
Type of termination at the end of an optimization loop.
Definition: optimizer_options.hpp:34
Definition: optimizer_options.hpp:46
ComputeMode & set_jacobian() noexcept
Definition: utils.cpp:36
NewtonsMethodOptimizer(const LineSearchT &line_searcher, const OptimizationOptions &options)
Definition: newtons_method_optimizer.hpp:48
OptimizationSummary solve_(OptimizationProblemT &optimization_problem, const DomainValueT &x0, DomainValueT &x_out)
Definition: newtons_method_optimizer.hpp:68
Definition: optimizer_options.hpp:77
Optimizer using the Newton method with line search.
Definition: newtons_method_optimizer.hpp:37
ComputeMode & set_score() noexcept
Definition: utils.cpp:31
Definition: optimizer.hpp:32
This file defines the lanelet2_map_provider_node class.
Definition: quick_sort.hpp:24