Optimist  0.0.0
A C++ library for optimization
Loading...
Searching...
No Matches
Optimist::RootFinder::RootFinder< Real, N, DerivedSolver > Class Template Reference

Class container for the multi-dimensional root finder. More...

#include <RootFinder.hh>

Inherits Optimist::Solver< Real, N, N, DerivedSolver >.

Inherited by Optimist::RootFinder::QuasiNewton< Real, N, DerivedSolver >.

Public Types

using Vector = typename Solver<Real, N, N, DerivedSolver>::InputType
 
using Matrix = typename Solver<Real, N, N, DerivedSolver>::FirstDerivativeType
 
using Tensor = typename Solver<Real, N, N, DerivedSolver>::SecondDerivativeType
 
using FunctionWrapper = typename Solver<Real, N, N, DerivedSolver>::FunctionWrapper
 
using JacobianWrapper = typename Solver<Real, N, N, DerivedSolver>::FirstDerivativeWrapper
 
using HessianWrapper = typename Solver<Real, N, N, DerivedSolver>::SecondDerivativeWrapper
 

Public Member Functions

 RootFinder ()
 
std::string name () const
 
Integer jacobian_evaluations () const
 
Integer max_jacobian_evaluations () const
 
void max_jacobian_evaluations (Integer t_jacobian_evaluations)
 
Integer hessian_evaluations () const
 
Integer max_hessian_evaluations () const
 
void max_hessian_evaluations (Integer t_hessian_evaluations)
 
bool solve (FunctionWrapper function, Vector const &x_ini, Vector &x_sol)
 
bool solve (FunctionWrapper function, JacobianWrapper jacobian, Vector const &x_ini, Vector &x_sol)
 
bool solve (FunctionWrapper function, JacobianWrapper jacobian, HessianWrapper hessian, Vector const &x_ini, Vector &x_sol)
 
- Public Member Functions inherited from Optimist::Solver< Real, N, N, DerivedSolver >
 Solver ()
 
 Solver (FunctionWrapper function, const InputType &x_ini, InputType &x_sol)
 
 Solver (FunctionWrapper function, FirstDerivativeWrapper first_derivative, const InputType &x_ini, InputType &x_sol)
 
 Solver (FunctionWrapper function, FirstDerivativeWrapper first_derivative, SecondDerivativeWrapper second_derivative, const InputType &x_ini, InputType &x_sol)
 
const InputTypelower_bound () const
 
void lower_bound (const InputType &t_lower_bound)
 
const InputTypeupper_bound () const
 
void upper_bound (const InputType &t_upper_bound)
 
void bounds (const InputType &t_lower_bound, const InputType &t_upper_bound)
 
constexpr Integer input_dimension () const
 
constexpr Integer output_dimension () const
 
Integer function_evaluations () const
 
void max_function_evaluations (Integer t_max_function_evaluations)
 
Integer max_function_evaluations () const
 
Integer iterations () const
 
Integer max_iterations () const
 
void max_iterations (Integer t_max_iterations)
 
Real alpha () const
 
void alpha (Real t_alpha)
 
Integer relaxations () const
 
Integer max_relaxations () const
 
void max_relaxations (Integer t_max_relaxations)
 
Real tolerance () const
 
void tolerance (Real t_tolerance)
 
void verbose_mode (bool t_verbose)
 
bool verbose_mode () const
 
void enable_verbose_mode ()
 
void disable_verbose_mode ()
 
void damped_mode (bool t_damped)
 
bool damped_mode () const
 
void enable_damped_mode ()
 
void disable_damped_mode ()
 
std::string task () const
 
void task (std::string t_task)
 
bool converged () const
 
const TraceTypetrace () const
 
std::ostream & ostream () const
 
void ostream (std::ostream &t_ostream)
 
bool solve (FunctionWrapper function, const InputType &x_ini, InputType &x_sol)
 
bool solve (FunctionWrapper function, FirstDerivativeWrapper first_derivative, const InputType &x_ini, InputType &x_sol)
 
bool solve (FunctionWrapper function, FirstDerivativeWrapper first_derivative, SecondDerivativeWrapper second_derivative, const InputType &x_ini, InputType &x_sol)
 
bool rootfind (Function< Real, FunInDim, FunOutDim, DerivedFunction > const &function, const InputType &x_ini, InputType &x_sol)
 
bool optimize (Function< Real, FunInDim, FunOutDim, DerivedFunction > const &function, const InputType &x_ini, InputType &x_sol)
 
std::string name () const
 

Public Attributes

friend Solver< Real, N, N, RootFinder< Real, N, DerivedSolver > >
 

Static Public Attributes

static constexpr bool is_rootfinder {true}
 
static constexpr bool is_optimizer {false}
 
static constexpr bool requires_function {DerivedSolver::requires_function}
 
static constexpr bool requires_first_derivative {DerivedSolver::requires_first_derivative}
 
static constexpr bool requires_second_derivative {DerivedSolver::requires_second_derivative}
 

Protected Member Functions

void evaluate_jacobian (JacobianWrapper jacobian, const Vector &x, Matrix &out)
 
void evaluate_hessian (HessianWrapper hessian, const Vector &x, Matrix &out)
 
- Protected Member Functions inherited from Optimist::Solver< Real, N, N, DerivedSolver >
Integer first_derivative_evaluations () const
 
Integer max_first_derivative_evaluations () const
 
void max_first_derivative_evaluations (Integer first_derivative_evaluations)
 
Integer second_derivative_evaluations () const
 
Integer max_second_derivative_evaluations () const
 
void max_second_derivative_evaluations (Integer second_derivative_evaluations)
 
bool solve (Function< Real, FunInDim, FunOutDim, DerivedFunction > const &function, const InputType &x_ini, InputType &x_sol, bool is_optimization)
 
void reset ()
 
void evaluate_function (FunctionWrapper function, const InputType &x, OutputType &out)
 
void evaluate_first_derivative (FirstDerivativeWrapper function, const InputType &x, FirstDerivativeType &out)
 
void evaluate_second_derivative (SecondDerivativeWrapper function, const InputType &x, SecondDerivativeType &out)
 
void store_trace (const InputType &x)
 
bool damp (FunctionWrapper function, InputType const &x_old, InputType const &function_old, InputType const &step_old, InputType &x_new, InputType &function_new, InputType &step_new)
 
void header ()
 
void bottom ()
 
void info (Real residuals, std::string const &notes="-")
 

Additional Inherited Members

- Protected Types inherited from Optimist::Solver< Real, N, N, DerivedSolver >
using InputType
 
using OutputType
 
using TraceType
 
using FirstDerivativeType
 
using SecondDerivativeType
 
using FunctionWrapper
 
using FirstDerivativeWrapper
 
using SecondDerivativeWrapper
 
- Protected Attributes inherited from Optimist::Solver< Real, N, N, DerivedSolver >
InputType m_lower_bound
 
InputType m_upper_bound
 
Integer m_function_evaluations
 
Integer m_first_derivative_evaluations
 
Integer m_second_derivative_evaluations
 
Integer m_max_function_evaluations
 
Integer m_max_first_derivative_evaluations
 
Integer m_max_second_derivative_evaluations
 
Integer m_iterations
 
Integer m_max_iterations
 
Real m_alpha
 
Integer m_relaxations
 
Integer m_max_relaxations
 
Real m_tolerance
 
bool m_verbose
 
bool m_damped
 
std::ostream * m_ostream
 
std::string m_task
 
bool m_converged
 
TraceType m_trace
 

Detailed Description

template<typename Real, Integer N, typename DerivedSolver>
class Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >

Root finder

This section describes the multi-dimensional root-finders implemented in Optimist. The available root-finding solvers are Newton (derivative) and quasi-Newton (non-derivative) methods. Derivative methods employ the function's derivative to find the root with high accuracy, while non-derivative methods approximate the derivative for improved efficiency in certain scenarios.

Here, the solvers are implemented for solving problems of the form

\[ \mathbf{f}(\mathbf{x}) = \mathbf{0} \text{,} \quad \text{with} \quad \mathbf{f}: \mathbb{R}^{n} \rightarrow \mathbb{R}^{n} \text{,} \]

which consist in finding the root of the function \(\mathbf{f}\) by iteratively updating the current iterate \(\mathbf{x}_k\) until convergence is achieved. The solvers require the function \(\mathbf{f}\) and its Jacobian matrix \(\mathbf{Jf}_{\mathbf{x}}\) to be provided by the user. The Jacobian matrix can be computed analytically or numerically, depending on the problem's complexity and the user's preference. Alternatively, the Jacobian can be approximated numerically using finite differences, depending on the problem's complexity and the user's preference.

Affine-invariant step

By default, the multi-dimensional root-finders in Optimist use optionally an affine-invariant advancing step to ensure convergence. The generic advancing step \(\mathbf{h}_k\) is computed as

\[ \mathbf{x}_{k+1} = \mathbf{x}_k + \alpha_k \mathbf{h}_k \text{,} \]

where \(\alpha_k\) is a damping coefficient that ensures convergence by satisfying

\[ \left\|\mathbf{Jf}_{\mathbf{x}}(\mathbf{x}_k)^{-1} \mathbf{f}(\mathbf{x}_{k+1})\right\| \leq \left(1 - \displaystyle\frac{\alpha_k}{2}\right) \left\|\mathbf{Jf}_{\mathbf{x}}(\mathbf{x}_k)^{-1} \mathbf{f}(\mathbf{x}_k)\right\| = \left(1 - \displaystyle\frac{\alpha_k}{2} \right) \left\|\mathbf{h}_k\right\| \text{.} \]

For detailed information on the affine-invariant Newton's method, refer to this link, or the works by P. Deuflhard.

Template Parameters
RealScalar number type.
NThe dimension of the root-finding problem.
DerivedSolverDerived solver class.

Member Typedef Documentation

◆ FunctionWrapper

template<typename Real, Integer N, typename DerivedSolver>
using Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::FunctionWrapper = typename Solver<Real, N, N, DerivedSolver>::FunctionWrapper

◆ HessianWrapper

template<typename Real, Integer N, typename DerivedSolver>
using Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::HessianWrapper = typename Solver<Real, N, N, DerivedSolver>::SecondDerivativeWrapper

◆ JacobianWrapper

template<typename Real, Integer N, typename DerivedSolver>
using Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::JacobianWrapper = typename Solver<Real, N, N, DerivedSolver>::FirstDerivativeWrapper

◆ Matrix

template<typename Real, Integer N, typename DerivedSolver>
using Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::Matrix = typename Solver<Real, N, N, DerivedSolver>::FirstDerivativeType

Jacobian matrix type.

◆ Tensor

template<typename Real, Integer N, typename DerivedSolver>
using Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::Tensor = typename Solver<Real, N, N, DerivedSolver>::SecondDerivativeType

Hessian tensor type.

◆ Vector

template<typename Real, Integer N, typename DerivedSolver>
using Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::Vector = typename Solver<Real, N, N, DerivedSolver>::InputType

Vector type.

Constructor & Destructor Documentation

◆ RootFinder()

template<typename Real, Integer N, typename DerivedSolver>
Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::RootFinder ( )
inline

Class constructor for the multi-dimensional root finder.

Member Function Documentation

◆ evaluate_hessian()

template<typename Real, Integer N, typename DerivedSolver>
void Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::evaluate_hessian ( HessianWrapper hessian,
const Vector & x,
Matrix & out )
inlineprotected

Evaluate the Hessian function.

Parameters
[in]hessianHessian function wrapper.
[in]xInput point.
[out]outHessian value.

◆ evaluate_jacobian()

template<typename Real, Integer N, typename DerivedSolver>
void Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::evaluate_jacobian ( JacobianWrapper jacobian,
const Vector & x,
Matrix & out )
inlineprotected

Evaluate the Jacobian function.

Parameters
[in]jacobianJacobian function wrapper.
[in]xInput point.
[out]outJacobian value.

◆ hessian_evaluations()

template<typename Real, Integer N, typename DerivedSolver>
Integer Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::hessian_evaluations ( ) const
inline

Get the number of Hessian evaluations.

Returns
The number of Hessian evaluations.

◆ jacobian_evaluations()

template<typename Real, Integer N, typename DerivedSolver>
Integer Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::jacobian_evaluations ( ) const
inline

Get the number of Jacobian evaluations.

Returns
The number of Jacobian evaluations.

◆ max_hessian_evaluations() [1/2]

template<typename Real, Integer N, typename DerivedSolver>
Integer Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::max_hessian_evaluations ( ) const
inline

Get the number of maximum allowed Hessian evaluations.

Returns
The number of maximum allowed Hessian evaluations.

◆ max_hessian_evaluations() [2/2]

template<typename Real, Integer N, typename DerivedSolver>
void Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::max_hessian_evaluations ( Integer t_hessian_evaluations)
inline

Set the number of maximum allowed Hessian evaluations.

Parameters
[in]t_hessian_evaluationsThe number of maximum allowed Hessian evaluations.

◆ max_jacobian_evaluations() [1/2]

template<typename Real, Integer N, typename DerivedSolver>
Integer Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::max_jacobian_evaluations ( ) const
inline

Get the number of maximum allowed Jacobian evaluations.

Returns
The number of maximum allowed Jacobian evaluations.

◆ max_jacobian_evaluations() [2/2]

template<typename Real, Integer N, typename DerivedSolver>
void Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::max_jacobian_evaluations ( Integer t_jacobian_evaluations)
inline

Set the number of maximum allowed Jacobian evaluations.

Parameters
[in]t_jacobian_evaluationsThe number of maximum allowed Jacobian evaluations.

◆ name()

template<typename Real, Integer N, typename DerivedSolver>
std::string Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::name ( ) const
inline

Get the solver name.

Returns
The solver name.

◆ solve() [1/3]

template<typename Real, Integer N, typename DerivedSolver>
bool Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::solve ( FunctionWrapper function,
JacobianWrapper jacobian,
HessianWrapper hessian,
Vector const & x_ini,
Vector & x_sol )
inline

Solve the root-finding problem given the function, and its Jacobian and Hessian.

Parameters
[in]functionFunction wrapper.
[in]jacobianThe Jacobian function wrapper.
[in]hessianThe Hessian function wrapper.
[in]x_iniInitialization point.
[out]x_solSolution point.
Returns
The convergence boolean flag.

◆ solve() [2/3]

template<typename Real, Integer N, typename DerivedSolver>
bool Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::solve ( FunctionWrapper function,
JacobianWrapper jacobian,
Vector const & x_ini,
Vector & x_sol )
inline

Solve the root-finding problem given the function, and its Jacobian.

Parameters
[in]functionFunction wrapper.
[in]jacobianThe Jacobian function wrapper.
[in]x_iniInitialization point.
[out]x_solSolution point.
Returns
The convergence boolean flag.

◆ solve() [3/3]

template<typename Real, Integer N, typename DerivedSolver>
bool Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::solve ( FunctionWrapper function,
Vector const & x_ini,
Vector & x_sol )
inline

Solve the root-finding problem given the function, and without derivatives.

Parameters
[in]functionFunction wrapper.
[in]x_iniInitialization point.
[out]x_solSolution point.
Returns
The convergence boolean flag.

Member Data Documentation

◆ is_optimizer

template<typename Real, Integer N, typename DerivedSolver>
bool Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::is_optimizer {false}
staticconstexpr

◆ is_rootfinder

template<typename Real, Integer N, typename DerivedSolver>
bool Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::is_rootfinder {true}
staticconstexpr

◆ requires_first_derivative

template<typename Real, Integer N, typename DerivedSolver>
bool Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::requires_first_derivative {DerivedSolver::requires_first_derivative}
staticconstexpr

◆ requires_function

template<typename Real, Integer N, typename DerivedSolver>
bool Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::requires_function {DerivedSolver::requires_function}
staticconstexpr

◆ requires_second_derivative

template<typename Real, Integer N, typename DerivedSolver>
bool Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::requires_second_derivative {DerivedSolver::requires_second_derivative}
staticconstexpr

Basic constants.

◆ Solver< Real, N, N, RootFinder< Real, N, DerivedSolver > >

template<typename Real, Integer N, typename DerivedSolver>
friend Optimist::RootFinder::RootFinder< Real, N, DerivedSolver >::Solver< Real, N, N, RootFinder< Real, N, DerivedSolver > >

The documentation for this class was generated from the following file: