Boost
C++ Libraries
...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
This version of Boost is under active development. You are currently in the develop branch. The current version is 1.91.0.
This header provides default policy implementations for using the gradient-based
optimizers with boost::math::differentiation::reverse_mode::rvar These policies handle:
rvar containers
and establishing tape checkpoints.
#include <boost/math/optimization/detail/rdiff_optimization_policies> namespace boost { namespace math { namespace optimization { namespace rdiff = boost::math::differentiation::reverse_mode; /** * @brief> function evaluation policy for reverse mode autodiff * @arg objective> objective function to evaluate * @arg x> argument list */ template<typename RealType> struct reverse_mode_function_eval_policy { template<typename Objective, class ArgumentContainer> rdiff::rvar<RealType, 1> operator()(Objective&& objective, ArgumentContainer& x); }; /** * @brief> gradient evaluation policy * @arg obj_f> objective * @arg x> argument list * @arg f_eval_olicy> funciton evaluation policy. These need to be * done in tandem * @arg obj_v> reference to variable inside gradient class */ template<typename RealType> struct reverse_mode_gradient_evaluation_policy { template<class Objective, class ArgumentContainer, class FunctionEvaluationPolicy> void operator()(Objective&& obj_f, ArgumentContainer& x, FunctionEvaluationPolicy&& f_eval_pol, RealType& obj_v, std::vector<RealType>& g) }; /* * init policies */ /* default rvar policy */ template<typename RealType> struct tape_initializer_rvar { template<class ArgumentContainer> void operator()(ArgumentContainer& x) const noexcept; }; /* random uniform */ template<typename RealType> struct random_uniform_initializer_rvar { RealType low_, high_; size_t seed_; random_uniform_initializer_rvar(RealType low = 0, RealType high = 1, size_t seed = std::random_device{}()); template<class ArgumentContainer> void operator()(ArgumentContainer& x) const; }; /* constant initializer */ template<typename RealType> struct costant_initializer_rvar { RealType constant; explicit costant_initializer_rvar(RealType v = 0); template<class ArgumentContainer> void operator()(ArgumentContainer& x) const; }; } // namespace optimization } // namespace math } // namespace boost
A function evaluation policy defines how an objective is evaluated at the current parameters, and is responsible for any AD bookkeeping required before the call.
template<typename RealType> struct reverse_mode_function_eval_policy { template<typename Objective, class ArgumentContainer> rdiff::rvar<RealType, 1> operator()(Objective&& objective, ArgumentContainer& x); };
This policy evaluates the objective objective(x) using reverse-mode AD and ensures the active tape is in a valid state before evaluation:
ArgumentContainer must contain rdiff::rvar<RealType,1> values.
A gradient evaluation policy defines how gradients are computed and extracted into an ordinary numeric container.
template<typename RealType> struct reverse_mode_gradient_evaluation_policy { template<class Objective, class ArgumentContainer, class FunctionEvaluationPolicy> void operator()(Objective&& obj_f, ArgumentContainer& x, FunctionEvaluationPolicy&& f_eval_pol, RealType& obj_v, std::vector<RealType>& g); };
This policy computes the objective value and gradient using reverse-mode autodiff
Initialization policies prepare the argument container and the reverse-mode tape for optimization. They establish tape checkpoints that are later used by function/gradient evaluation policies.
template<typename RealType> struct tape_initializer_rvar { template<class ArgumentContainer> void operator()(ArgumentContainer& x) const noexcept; };
This policy: * statically requires ArgumentContainer::value_type
to be rdiff::rvar<RealType,1>, * adds
a checkpoint to the active reverse-mode tape via tape.add_checkpoint()
template<typename RealType> struct random_uniform_initializer_rvar { random_uniform_initializer_rvar(RealType low = 0, RealType high = 1, size_t seed = std::random_device{}()); template<class ArgumentContainer> void operator()(ArgumentContainer& x) const; };
This policy initializes each element of x independently as:
x[i] = rdiff::rvar<RealType,1>(U(low, high))
using
boost::random::mt19937
and
boost::random::uniform_real_distribution<RealType>
template<typename RealType> struct costant_initializer_rvar { explicit costant_initializer_rvar(RealType v = 0); template<class ArgumentContainer> void operator()(ArgumentContainer& x) const; };
This policy initializes each element of x to the constant value v