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

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

#include <RootFinder.hh>

Inherits Optimist::SolverBase< T, T, DerivedSolver >.

Public Types

using Scalar = typename TypeTrait<T>::Scalar
using Input = T
using Output = T
Public Types inherited from Optimist::SolverBase< T, T, DerivedSolver >
using InputTrait
using OutputTrait
using Scalar
using FirstDerivative
using SecondDerivative

Public Member Functions

 RootFinder ()
constexpr std::string name () const
Integer jacobian_evaluations () const
Integer max_jacobian_evaluations () const
void max_jacobian_evaluations (const Integer t_jacobian_evaluations)
Integer hessian_evaluations () const
Integer max_hessian_evaluations () const
void max_hessian_evaluations (const Integer t_hessian_evaluations)
template<typename FunctionLambda>
bool solve (FunctionLambda &&function, const Input &x_ini, Output &x_sol)
template<typename FunctionLambda, typename JacobianLambda>
bool solve (FunctionLambda &&function, JacobianLambda &&jacobian, const Input &x_ini, Output &x_sol)
template<typename FunctionLambda, typename JacobianLambda, typename HessianLambda>
bool solve (FunctionLambda &&function, JacobianLambda &&jacobian, HessianLambda &&hessian, const Input &x_ini, Output &x_sol)
Public Member Functions inherited from Optimist::SolverBase< T, T, DerivedSolver >
 SolverBase ()
void reset_bounds (const Integer n=InputTrait::IsDynamic ? 0 :InputTrait::Dimension)
const T & lower_bound () const
const T & upper_bound () const
void bounds (const T &t_lower_bound, const T &t_upper_bound)
constexpr Integer input_dimension () const
constexpr Integer output_dimension () const
Integer function_evaluations () const
void max_function_evaluations (const Integer t_max_function_evaluations)
Integer iterations () const
Integer max_iterations () const
Scalar alpha () const
Integer relaxations () const
Integer max_relaxations () const
Scalar tolerance () const
void verbose_mode (bool t_verbose)
void enable_verbose_mode ()
void disable_verbose_mode ()
void damped_mode (bool t_damped)
void enable_damped_mode ()
void disable_damped_mode ()
std::string task () const
bool converged () const
std::ostream & ostream () const
bool solve (FunctionLambda &&function, const T &x_ini, T &x_sol)
bool rootfind (const FunctionBase< FunctionInput, FunctionOutput, DerivedFunction > &function, const T &x_ini, T &x_sol)
bool optimize (const FunctionBase< FunctionInput, FunctionOutput, DerivedFunction > &function, const T &x_ini, T &x_sol)
constexpr std::string name () const

Static Public Attributes

static constexpr bool IsRootFinder {true}
static constexpr bool IsOptimizer {false}

Protected Member Functions

template<typename JacobianLambda>
bool evaluate_jacobian (JacobianLambda &&jacobian, const Input &x, FirstDerivative &out)
template<typename HessianLambda>
bool evaluate_hessian (HessianLambda &&hessian, const Input &x, SecondDerivative &out)
Protected Member Functions inherited from Optimist::SolverBase< T, T, DerivedSolver >
Integer first_derivative_evaluations () const
Integer max_first_derivative_evaluations () const
Integer second_derivative_evaluations () const
Integer max_second_derivative_evaluations () const
void reset_counters ()
bool evaluate_function (FunctionLambda &&function, const T &x, T &out)
bool evaluate_first_derivative (FirstDerivativeLambda &&function, const T &x, FirstDerivative &out)
bool evaluate_second_derivative (SecondDerivativeLambda &&function, const T &x, SecondDerivative &out)
bool damp (FunctionLambda &&function, const T &x_old, const T &function_old, const T &step_old, T &x_new, T &function_new, T &step_new)
void header ()
void bottom ()
void info (Scalar residuals, const std::string &notes="-")

Friends

class SolverBase< T, T, DerivedSolver >

Additional Inherited Members

Protected Attributes inherited from Optimist::SolverBase< T, T, DerivedSolver >
m_lower_bound
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
Scalar m_alpha
Integer m_relaxations
Integer m_max_relaxations
Scalar m_tolerance
bool m_verbose
bool m_damped
std::ostream * m_ostream
std::string m_task
bool m_converged

Detailed Description

template<typename T, typename DerivedSolver>
requires (TypeTrait<T>::IsScalar || TypeTrait<T>::IsEigen) && (!TypeTrait<T>::IsFixed || TypeTrait<T>::Dimension > 0)
class Optimist::RootFinder::RootFinder< T, 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
TInput and output type (scalar or Eigen vector).
DerivedSolverDerived solver class.

Member Typedef Documentation

◆ Input

template<typename T, typename DerivedSolver>
using Optimist::RootFinder::RootFinder< T, DerivedSolver >::Input = T

◆ Output

template<typename T, typename DerivedSolver>
using Optimist::RootFinder::RootFinder< T, DerivedSolver >::Output = T

◆ Scalar

template<typename T, typename DerivedSolver>
using Optimist::RootFinder::RootFinder< T, DerivedSolver >::Scalar = typename TypeTrait<T>::Scalar

Constructor & Destructor Documentation

◆ RootFinder()

template<typename T, typename DerivedSolver>
Optimist::RootFinder::RootFinder< T, DerivedSolver >::RootFinder ( )
inline

Class constructor for the multi-dimensional root finder.

Member Function Documentation

◆ evaluate_hessian()

template<typename T, typename DerivedSolver>
template<typename HessianLambda>
bool Optimist::RootFinder::RootFinder< T, DerivedSolver >::evaluate_hessian ( HessianLambda && hessian,
const Input & x,
SecondDerivative & out )
inlineprotected

Evaluate the Hessian function.

Template Parameters
HessianLambdaThe Hessian lambda function type.
Parameters
[in]hessianHessian lambda function.
[in]xInput point.
[out]outHessian value.
Returns
The boolean flag for successful evaluation.

◆ evaluate_jacobian()

template<typename T, typename DerivedSolver>
template<typename JacobianLambda>
bool Optimist::RootFinder::RootFinder< T, DerivedSolver >::evaluate_jacobian ( JacobianLambda && jacobian,
const Input & x,
FirstDerivative & out )
inlineprotected

Evaluate the Jacobian function.

Template Parameters
JacobianLambdaThe Jacobian lambda function type.
Parameters
[in]jacobianJacobian lambda function.
[in]xInput point.
[out]outJacobian value.
Returns
The boolean flag for successful evaluation.

◆ hessian_evaluations()

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

Get the number of Hessian evaluations.

Returns
The number of Hessian evaluations.

◆ jacobian_evaluations()

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

Get the number of Jacobian evaluations.

Returns
The number of Jacobian evaluations.

◆ max_hessian_evaluations() [1/2]

template<typename T, typename DerivedSolver>
Integer Optimist::RootFinder::RootFinder< T, 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 T, typename DerivedSolver>
void Optimist::RootFinder::RootFinder< T, DerivedSolver >::max_hessian_evaluations ( const 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 T, typename DerivedSolver>
Integer Optimist::RootFinder::RootFinder< T, 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 T, typename DerivedSolver>
void Optimist::RootFinder::RootFinder< T, DerivedSolver >::max_jacobian_evaluations ( const 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 T, typename DerivedSolver>
std::string Optimist::RootFinder::RootFinder< T, DerivedSolver >::name ( ) const
inlineconstexpr

Get the solver name.

Returns
The solver name.

◆ solve() [1/3]

template<typename T, typename DerivedSolver>
template<typename FunctionLambda>
bool Optimist::RootFinder::RootFinder< T, DerivedSolver >::solve ( FunctionLambda && function,
const Input & x_ini,
Output & x_sol )
inline

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

Template Parameters
FunctionLambdaThe lambda function type.
Parameters
[in]functionFunction lambda.
[in]x_iniInitialization point.
[out]x_solSolution point.
Returns
The convergence boolean flag.

◆ solve() [2/3]

template<typename T, typename DerivedSolver>
template<typename FunctionLambda, typename JacobianLambda>
bool Optimist::RootFinder::RootFinder< T, DerivedSolver >::solve ( FunctionLambda && function,
JacobianLambda && jacobian,
const Input & x_ini,
Output & x_sol )
inline

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

Template Parameters
FunctionLambdaThe lambda function type.
JacobianLambdaThe Jacobian lambda function type.
Parameters
[in]functionFunction lambda.
[in]jacobianThe Jacobian lambda function.
[in]x_iniInitialization point.
[out]x_solSolution point.
Returns
The convergence boolean flag.

◆ solve() [3/3]

template<typename T, typename DerivedSolver>
template<typename FunctionLambda, typename JacobianLambda, typename HessianLambda>
bool Optimist::RootFinder::RootFinder< T, DerivedSolver >::solve ( FunctionLambda && function,
JacobianLambda && jacobian,
HessianLambda && hessian,
const Input & x_ini,
Output & x_sol )
inline

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

Template Parameters
FunctionLambdaThe lambda function type.
JacobianLambdaThe Jacobian lambda function type.
HessianLambdaThe Hessian lambda function type.
Parameters
[in]functionFunction lambda.
[in]jacobianThe Jacobian lambda function.
[in]hessianThe Hessian lambda function.
[in]x_iniInitialization point.
[out]x_solSolution point.
Returns
The convergence boolean flag.

◆ SolverBase< T, T, DerivedSolver >

template<typename T, typename DerivedSolver>
friend class SolverBase< T, T, DerivedSolver >
friend

Member Data Documentation

◆ IsOptimizer

template<typename T, typename DerivedSolver>
bool Optimist::RootFinder::RootFinder< T, DerivedSolver >::IsOptimizer {false}
staticconstexpr

◆ IsRootFinder

template<typename T, typename DerivedSolver>
bool Optimist::RootFinder::RootFinder< T, DerivedSolver >::IsRootFinder {true}
staticconstexpr

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