26template <
typename Scalar>
struct finite_difference_impl {
31 const Scalar fd_eps,
const ConstVectorRef &x,
33 VectorXs ei(func.
ndx());
34 VectorXs xplus = space.
neutral();
35 VectorXs xminus = space.
neutral();
37 for (
int i = 0; i < func.
ndx(); i++) {
41 Jout.col(i) = (func(xplus) - func(xminus)) / (2 * fd_eps);
48 const Scalar fd_eps,
const ConstVectorRef &x,
49 const ConstVectorRef &v, MatrixRef Hout) {
50 VectorXs ei(func.
ndx());
51 VectorXs xplus = space.
neutral();
52 VectorXs xminus = space.
neutral();
53 MatrixXs Jplus(func.
nr(), func.
ndx());
54 MatrixXs Jminus(func.
nr(), func.
ndx());
59 for (
int i = 0; i < func.
ndx(); i++) {
63 func.computeJacobian(xplus, Jplus);
64 func.computeJacobian(xminus, Jminus);
65 Hout.col(i) = ((Jplus - Jminus) / (2 * fd_eps)).transpose() * v;
78template <
typename _Scalar>
79struct finite_difference_wrapper<_Scalar,
TOC1> : C1FunctionTpl<_Scalar> {
80 using Scalar = _Scalar;
83 using Base = C1FunctionTpl<_Scalar>;
84 using FuncType = BaseFunctionTpl<Scalar>;
93 const FuncType &func,
const Scalar fd_eps)
94 : Base(space, func.nr()), space(space), func(func), fd_eps(fd_eps) {}
96 VectorXs
operator()(
const ConstVectorRef &x)
const override {
101 return internal::finite_difference_impl<Scalar>::computeJacobian(
102 space, func, fd_eps, x, Jout);
112template <
typename _Scalar>
113struct finite_difference_wrapper<_Scalar,
TOC2> : C2FunctionTpl<_Scalar> {
114 using Scalar = _Scalar;
117 using Base = C2FunctionTpl<_Scalar>;
118 using FuncType = C1FunctionTpl<Scalar>;
121 const FuncType &func;
127 const FuncType &func,
const Scalar fd_eps)
128 : Base(space, func.nr()), space(space), func(func), fd_eps(fd_eps) {}
130 VectorXs
operator()(
const ConstVectorRef &x)
const override {
135 func.computeJacobian(x, Jout);
139 MatrixRef Hout)
const override {
140 internal::finite_difference_impl<Scalar>::vectorHessianProduct(
141 space, func, fd_eps, x, v, Hout);
Base definitions for function classes.
#define PROXSUITE_NLP_DYNAMIC_TYPEDEFS(Scalar)
Automatic differentiation utilities.
@ FORWARD
Forward finite differences .
@ CENTRAL
Central finite differences .
@ BACKWARD
Backward finite differences .
@ TOC2
Cast to a function.
@ TOC1
Cast to a function.
int nr() const
Get function codimension.
int ndx() const
Get input manifold's tangent space dimension.
Differentiable function, with method for the Jacobian.
virtual void computeJacobian(const ConstVectorRef &x, MatrixRef Jout) const =0
Jacobian matrix of the constraint function.
virtual VectorXs neutral() const
Get the neutral element from the manifold (if this makes sense).
void integrate(const ConstVectorRef &x, const ConstVectorRef &v, VectorRef out) const
Manifold integration operation .
VectorXs operator()(const ConstVectorRef &x) const override
Evaluate the residual at a given point x.
void computeJacobian(const ConstVectorRef &x, MatrixRef Jout) const override
Jacobian matrix of the constraint function.
VectorXs operator()(const ConstVectorRef &x) const override
Evaluate the residual at a given point x.
void vectorHessianProduct(const ConstVectorRef &x, const ConstVectorRef &v, MatrixRef Hout) const override
Vector-hessian product.
void computeJacobian(const ConstVectorRef &x, MatrixRef Jout) const override
Jacobian matrix of the constraint function.