16template <
typename _Scalar,
template <
typename>
class _Base>
17struct finite_difference_impl :
virtual _Base<_Scalar> {
18 using Scalar = _Scalar;
20 using Base = _Base<Scalar>;
21 using BaseData =
typename Base::Data;
22 using Manifold = ManifoldAbstractTpl<Scalar>;
24 shared_ptr<Manifold> space_;
25 shared_ptr<Base> func_;
29 struct Data : BaseData {
34 shared_ptr<BaseData> data_0;
35 shared_ptr<BaseData> data_1;
39 Data(finite_difference_impl
const &model)
40 : BaseData(model.ndx1, model.nu, model.ndx2, model.nr),
41 data_0(model.func_->createData()), data_1(model.func_->createData()),
42 dx(ndx1), du(nu), dy(ndx2), xp(model.nx1), up(model.nu),
50 template <
typename U = Base,
class = std::enable_if_t<
51 std::is_same_v<U, StageFunctionTpl<Scalar>>>>
52 finite_difference_impl(shared_ptr<Manifold> space, shared_ptr<U> func,
54 : Base(func->ndx1, func->nu, func->ndx2, func->nr), space_(space),
55 func_(func), fd_eps(fd_eps), nx1(space->nx()), nx2(space->nx()) {}
57 template <
typename U = Base,
class = std::enable_if_t<
58 std::is_same_v<U, DynamicsModelTpl<Scalar>>>>
59 finite_difference_impl(shared_ptr<Manifold> space, shared_ptr<U> func,
60 const Scalar fd_eps, boost::mpl::false_ = {})
61 : Base(space, func->nu, space), space_(space), func_(func),
62 fd_eps(fd_eps), nx1(space->nx()), nx2(space->nx()) {}
64 void evaluate(
const ConstVectorRef &x,
const ConstVectorRef &u,
65 const ConstVectorRef &y, BaseData &data)
const {
66 Data &d =
static_cast<Data &
>(data);
67 func_->evaluate(x, u, y, *d.data_0);
68 d.value_ = d.data_0->value_;
71 void computeJacobians(
const ConstVectorRef &x,
const ConstVectorRef &u,
72 const ConstVectorRef &y, BaseData &data)
const {
73 Data &d =
static_cast<Data &
>(data);
75 VectorXs &v0 = d.data_0->value_;
76 VectorXs &vp = d.data_1->value_;
78 for (
int i = 0; i < func_->ndx1; i++) {
80 space_->integrate(x, d.dx, d.xp);
81 func_->evaluate(d.xp, u, y, *d.data_1);
82 data.Jx_.col(i) = (vp - v0) / fd_eps;
86 for (
int i = 0; i < func_->ndx2; i++) {
88 space_->integrate(y, d.dy, d.yp);
89 func_->evaluate(x, u, d.yp, *d.data_1);
90 data.Jy_.col(i) = (vp - v0) / fd_eps;
94 for (
int i = 0; i < func_->nu; i++) {
97 func_->evaluate(x, d.up, y, *d.data_1);
98 data.Ju_.col(i) = (vp - v0) / fd_eps;
103 void computeVectorHessianProducts(
const ConstVectorRef &,
104 const ConstVectorRef &,
105 const ConstVectorRef &,
106 const ConstVectorRef &, BaseData &)
const {}
108 shared_ptr<BaseData> createData()
const {
109 return std::make_shared<Data>(*
this);
121template <
typename _Scalar>
123 : internal::finite_difference_impl<_Scalar, StageFunctionTpl> {
128 using Base = internal::finite_difference_impl<Scalar, StageFunctionTpl>;
129 using Base::computeJacobians;
130 using Base::computeVectorHessianProducts;
131 using Base::evaluate;
136 shared_ptr<StageFunction> func,
const Scalar fd_eps)
138 Base(space, func, fd_eps) {}
141template <
typename _Scalar>
143 : internal::finite_difference_impl<_Scalar, DynamicsModelTpl> {
148 using Base = internal::finite_difference_impl<Scalar, DynamicsModelTpl>;
149 using Base::computeJacobians;
150 using Base::computeVectorHessianProducts;
151 using Base::evaluate;
156 shared_ptr<DynamicsModel> func,
161template <
typename Scalar>
179 c1 = obj.cost_->createData();
180 c2 = obj.cost_->createData();
188 void evaluate(
const ConstVectorRef &x,
const ConstVectorRef &u,
190 Data &d =
static_cast<Data &
>(data_);
191 cost_->evaluate(x, u, *d.c1);
193 d.value_ = d.c1->value_;
198 Data &d =
static_cast<Data &
>(data_);
201 cost_->evaluate(x, u, *d.c1);
204 for (
int i = 0; i < this->
ndx(); i++) {
206 space.integrate(x, d.dx, d.xp);
207 cost_->evaluate(d.xp, u, *d.c2);
209 d.Lx_[i] = (d.c2->value_ - d.c1->value_) /
fd_eps;
214 for (
int i = 0; i < this->
nu; i++) {
217 cost_->evaluate(x, d.up, *d.c2);
219 d.Lu_[i] = (d.c2->value_ - d.c1->value_) /
fd_eps;
229 return std::make_shared<Data>(*
this);
236#ifdef ALIGATOR_ENABLE_TEMPLATE_INSTANTIATION
237extern template struct FiniteDifferenceHelper<context::Scalar>;
238extern template struct DynamicsFiniteDifferenceHelper<context::Scalar>;
239extern template struct CostFiniteDifferenceHelper<context::Scalar>;