8#include <boost/core/demangle.hpp>
14template <
typename Scalar>
16 -> shared_ptr<CostFunctionBaseTpl<Scalar>> {
17 if (func->nr() != 1) {
18 PROXSUITE_NLP_RUNTIME_ERROR(
19 "Function cannot be cast to cost (codimension nr != 1).");
21 return std::make_shared<func_to_cost<Scalar>>(func);
29template <
typename _Scalar>
30struct CostFunctionBaseTpl :
public C2FunctionTpl<_Scalar> {
32 using Scalar = _Scalar;
34 using Base = C2FunctionTpl<Scalar>;
36 CostFunctionBaseTpl(
const int nx,
const int ndx) : Base(
nx,
ndx, 1) {}
38 : Base(manifold, 1) {}
43 virtual Scalar
call(
const ConstVectorRef &x)
const = 0;
44 virtual void computeGradient(
const ConstVectorRef &x,
45 VectorRef out)
const = 0;
46 virtual void computeHessian(
const ConstVectorRef &x, MatrixRef out)
const = 0;
50 VectorXs computeGradient(
const ConstVectorRef &x)
const {
51 VectorXs out(this->
ndx());
52 computeGradient(x, out);
56 MatrixXs computeHessian(
const ConstVectorRef &x)
const {
57 MatrixXs out(this->
ndx(), this->
ndx());
58 computeHessian(x, out);
71 Eigen::Matrix<Scalar, 1, -1> gT = Jout.template topRows<1>();
72 computeGradient(x, gT.transpose());
77 MatrixRef Hout)
const {
78 computeHessian(x, Hout);
84 friend std::ostream &operator<<(std::ostream &ostr,
86 const std::string name = boost::core::demangle(
typeid(cost).name());
92template <
typename _Scalar>
struct func_to_cost : CostFunctionBaseTpl<_Scalar> {
93 using Scalar = _Scalar;
95 using Base = CostFunctionBaseTpl<Scalar>;
102 : Base(func->
nx(), func->
ndx()), underlying_(func) {}
104 Scalar
call(
const ConstVectorRef &x)
const {
return underlying()(x)(0); }
106 void computeGradient(
const ConstVectorRef &x, VectorRef out)
const {
110 void computeHessian(
const ConstVectorRef &x, MatrixRef Hout)
const {
111 VectorXs v = VectorXs::Ones(1);
116 shared_ptr<C2Function> underlying_;
117 const C2Function &underlying()
const {
return *underlying_; }
123#ifdef PROXSUITE_NLP_ENABLE_TEMPLATE_INSTANTIATION
124#include "proxsuite-nlp/cost-function.txx"
Base definitions for function classes.
#define PROXSUITE_NLP_DYNAMIC_TYPEDEFS(Scalar)
int nx() const
Get function input vector size (representation of manifold).
int ndx() const
Get input manifold's tangent space dimension.
virtual void computeJacobian(const ConstVectorRef &x, MatrixRef Jout) const =0
Jacobian matrix of the constraint function.
Twice-differentiable function, with method Jacobian and vector-hessian product evaluation.
virtual void vectorHessianProduct(const ConstVectorRef &, const ConstVectorRef &, MatrixRef Hout) const
Vector-hessian product.
Base class for differentiable cost functions.
virtual Scalar call(const ConstVectorRef &x) const =0
Evaluate the cost function.
void computeJacobian(const ConstVectorRef &x, MatrixRef Jout) const
Jacobian matrix of the constraint function.
void vectorHessianProduct(const ConstVectorRef &x, const ConstVectorRef &v, MatrixRef Hout) const
Vector-hessian product.
VectorXs operator()(const ConstVectorRef &x) const
Evaluate the residual at a given point x.
Scalar call(const ConstVectorRef &x) const
Evaluate the cost function.
func_to_cost(const shared_ptr< C2Function > &func)
Constructor.