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

Class container for the multi-dimensional optimizer. More...

#include <Optimizer.hh>

Inherits Optimist::SolverBase< Real, N, 1, DerivedSolver, false >.

Public Types

using Vector = typename SolverBase<Real, N, 1, DerivedSolver, ForceEigen>::InputType
using RowVector = typename SolverBase<Real, N, 1, DerivedSolver, ForceEigen>::FirstDerivativeType
using Matrix = typename SolverBase<Real, N, 1, DerivedSolver, ForceEigen>::SecondDerivativeType
using FunctionWrapper = typename SolverBase<Real, N, 1, DerivedSolver, ForceEigen>::FunctionWrapper
using GradientWrapper = typename SolverBase<Real, N, 1, DerivedSolver, ForceEigen>::FirstDerivativeWrapper
using HessianWrapper = typename SolverBase<Real, N, 1, DerivedSolver, ForceEigen>::SecondDerivativeWrapper

Public Member Functions

 Optimizer ()
std::string name () const
Integer gradient_evaluations () const
Integer max_gradient_evaluations () const
void max_gradient_evaluations (Integer t_gradient_evaluations)
Integer hessian_evaluations () const
Integer max_hessian_evaluations () const
void max_hessian_evaluations (Integer t_hessian_evaluations)
Public Member Functions inherited from Optimist::SolverBase< Real, N, 1, DerivedSolver, false >
 SolverBase ()
const InputTypelower_bound () const
const InputTypeupper_bound () const
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 iterations () const
Integer max_iterations () const
Real alpha () const
Integer relaxations () const
Integer max_relaxations () const
Real 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
const TraceTypetrace () const
std::ostream & ostream () const
bool solve (FunctionWrapper function, const InputType &x_ini, InputType &x_sol)
bool rootfind (FunctionBase< Real, FunInDim, FunOutDim, DerivedFunction, ForceEigen &&FunOutDim==1 > const &function, const InputType &x_ini, InputType &x_sol)
bool optimize (FunctionBase< Real, FunInDim, FunOutDim, DerivedFunction, ForceEigen &&FunOutDim==1 > const &function, const InputType &x_ini, InputType &x_sol)
std::string name () const

Static Public Attributes

static constexpr bool is_rootfinder {false}
static constexpr bool is_optimizer {true}
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_gradient (GradientWrapper gradient, const Vector &x, Matrix &out)
void evaluate_hessian (HessianWrapper hessian, const Vector &x, Matrix &out)
bool solve (FunctionWrapper function, Vector const &x_ini, Vector &x_sol)
bool solve (FunctionWrapper function, GradientWrapper gradient, Vector const &x_ini, Vector &x_sol)
bool solve (FunctionWrapper function, GradientWrapper gradient, HessianWrapper hessian, Vector const &x_ini, Vector &x_sol)
Protected Member Functions inherited from Optimist::SolverBase< Real, N, 1, DerivedSolver, false >
Integer first_derivative_evaluations () const
Integer max_first_derivative_evaluations () const
Integer second_derivative_evaluations () const
Integer max_second_derivative_evaluations () const
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="-")

Friends

class SolverBase< Real, N, 1, Optimizer< Real, N, DerivedSolver, ForceEigen > >

Additional Inherited Members

Protected Types inherited from Optimist::SolverBase< Real, N, 1, DerivedSolver, false >
using InputType
using OutputType
using TraceType
using FirstDerivativeType
using SecondDerivativeType
using FunctionWrapper
using FirstDerivativeWrapper
using SecondDerivativeWrapper
Protected Attributes inherited from Optimist::SolverBase< Real, N, 1, DerivedSolver, false >
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, bool ForceEigen = false>
class Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >

Optimizer

This section describes the scalar optimizers implemented in Optimist. The available optimizers are derivative and non-derivative methods. Derivative methods employ the function's derivative to find the minimum 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

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

which consist in finding the minimum of the cost function \(\mathbf{f}\) by iteratively updating the current iterate \(\mathbf{x}_k\) until convergence is achieved. The solvers require the cost function \(\mathbf{f}\) and its first derivative \(\mathbf{f}^{\prime}(\mathbf{x})\) to be provided by the user. Alternatively, the derivative can be approximated numerically using finite differences, depending on the problem's complexity and the user's preference.

Template Parameters
NDimension of the optimization problem.
DerivedSolverDerived solver class.
ForceEigenForce the use of Eigen types for input and output.

Member Typedef Documentation

◆ FunctionWrapper

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
using Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::FunctionWrapper = typename SolverBase<Real, N, 1, DerivedSolver, ForceEigen>::FunctionWrapper

◆ GradientWrapper

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
using Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::GradientWrapper = typename SolverBase<Real, N, 1, DerivedSolver, ForceEigen>::FirstDerivativeWrapper

◆ HessianWrapper

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
using Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::HessianWrapper = typename SolverBase<Real, N, 1, DerivedSolver, ForceEigen>::SecondDerivativeWrapper

◆ Matrix

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
using Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::Matrix = typename SolverBase<Real, N, 1, DerivedSolver, ForceEigen>::SecondDerivativeType

Hessian matrix type.

◆ RowVector

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
using Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::RowVector = typename SolverBase<Real, N, 1, DerivedSolver, ForceEigen>::FirstDerivativeType

Gradient (row) vector type.

◆ Vector

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
using Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::Vector = typename SolverBase<Real, N, 1, DerivedSolver, ForceEigen>::InputType

Vector type.

Constructor & Destructor Documentation

◆ Optimizer()

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::Optimizer ( )
inline

Class constructor for the multi-dimensional optimizer.

Member Function Documentation

◆ evaluate_gradient()

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
void Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::evaluate_gradient ( GradientWrapper gradient,
const Vector & x,
Matrix & out )
inlineprotected

Evaluate the gradient function.

Parameters
[in]gradientGradient function wrapper.
[in]xInput point.
[out]outGradient value.

◆ evaluate_hessian()

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
void Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::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.

◆ gradient_evaluations()

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
Integer Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::gradient_evaluations ( ) const
inline

Get the number of gradient evaluations.

Returns
The number of gradient evaluations.

◆ hessian_evaluations()

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
Integer Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::hessian_evaluations ( ) const
inline

Get the number of hessian evaluations.

Returns
The number of hessian evaluations.

◆ max_gradient_evaluations() [1/2]

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
Integer Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::max_gradient_evaluations ( ) const
inline

Get the number of maximum allowed gradient evaluations.

Returns
The number of maximum allowed gradient evaluations.

◆ max_gradient_evaluations() [2/2]

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
void Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::max_gradient_evaluations ( Integer t_gradient_evaluations)
inline

Set the number of maximum allowed gradient evaluations.

Parameters
[in]t_gradient_evaluationsThe number of maximum allowed gradient evaluations.

◆ max_hessian_evaluations() [1/2]

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
Integer Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::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, bool ForceEigen = false>
void Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::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.

◆ name()

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
std::string Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::name ( ) const
inline

Get the solver name.

Returns
The solver name.

◆ solve() [1/3]

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
bool Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::solve ( FunctionWrapper function,
GradientWrapper gradient,
HessianWrapper hessian,
Vector const & x_ini,
Vector & x_sol )
inlineprotected

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

Parameters
[in]functionFunction wrapper.
[in]gradientGradient function wrapper.
[in]hessianHessian 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 ForceEigen = false>
bool Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::solve ( FunctionWrapper function,
GradientWrapper gradient,
Vector const & x_ini,
Vector & x_sol )
inlineprotected

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

Parameters
[in]functionFunction wrapper.
[in]gradientGradient 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 ForceEigen = false>
bool Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::solve ( FunctionWrapper function,
Vector const & x_ini,
Vector & x_sol )
inlineprotected

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.

◆ SolverBase< Real, N, 1, Optimizer< Real, N, DerivedSolver, ForceEigen > >

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
friend class SolverBase< Real, N, 1, Optimizer< Real, N, DerivedSolver, ForceEigen > >
friend

Member Data Documentation

◆ is_optimizer

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
bool Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::is_optimizer {true}
staticconstexpr

◆ is_rootfinder

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
bool Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::is_rootfinder {false}
staticconstexpr

◆ requires_first_derivative

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
bool Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::requires_first_derivative {DerivedSolver::requires_first_derivative}
staticconstexpr

◆ requires_function

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
bool Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::requires_function {DerivedSolver::requires_function}
staticconstexpr

◆ requires_second_derivative

template<typename Real, Integer N, typename DerivedSolver, bool ForceEigen = false>
bool Optimist::Optimizer::Optimizer< Real, N, DerivedSolver, ForceEigen >::requires_second_derivative {DerivedSolver::requires_second_derivative}
staticconstexpr

Basic constants.


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