aligator  0.6.1
A primal-dual augmented Lagrangian-type solver for nonlinear trajectory optimization.
Loading...
Searching...
No Matches
function-xpr-slice.hpp
Go to the documentation of this file.
1
3#pragma once
4
7
8namespace aligator {
9
10namespace detail {
11template <typename Base> struct slice_impl_tpl;
12}
13
14template <typename Scalar> struct FunctionSliceDataTpl;
15
19template <typename Scalar, typename Base = StageFunctionTpl<Scalar>>
22 using BaseData = StageFunctionDataTpl<Scalar>;
24 using Data = FunctionSliceDataTpl<Scalar>;
25
26 FunctionSliceXprTpl(shared_ptr<Base> func, std::vector<int> const &indices)
27 : Base(func->ndx1, func->nu, func->ndx2, (int)indices.size()),
29
30 FunctionSliceXprTpl(shared_ptr<Base> func, const int idx)
31 : FunctionSliceXprTpl(func, std::vector<int>{idx}) {}
32
33 void evaluate(const ConstVectorRef &x, const ConstVectorRef &u,
34 const ConstVectorRef &y, BaseData &data) const override {
35
36 this->evaluate_impl(data, x, u, y);
37 }
38
39 void computeJacobians(const ConstVectorRef &x, const ConstVectorRef &u,
40 const ConstVectorRef &y,
41 BaseData &data) const override {
42 this->computeJacobians_impl(data, x, u, y);
43 }
44
45 void computeVectorHessianProducts(const ConstVectorRef &x,
46 const ConstVectorRef &u,
47 const ConstVectorRef &y,
48 const ConstVectorRef &lbda,
49 BaseData &data) const override {
50 this->computeVectorHessianProducts_impl(data, lbda, x, u, y);
51 }
52
53 shared_ptr<BaseData> createData() const override {
54 return std::make_shared<Data>(*this);
55 }
56};
57
58template <typename Scalar>
60 : UnaryFunctionTpl<Scalar>,
61 detail::slice_impl_tpl<UnaryFunctionTpl<Scalar>> {
63 using BaseData = StageFunctionDataTpl<Scalar>;
64 using Data = FunctionSliceDataTpl<Scalar>;
67
68 FunctionSliceXprTpl(shared_ptr<Base> func, std::vector<int> const &indices)
69 : Base(func->ndx1, func->nu, func->ndx2, (int)indices.size()),
71
72 FunctionSliceXprTpl(shared_ptr<Base> func, const int idx)
73 : FunctionSliceXprTpl(func, std::vector<int>{idx}) {}
74
75 void evaluate(const ConstVectorRef &x, BaseData &data) const override {
76
77 this->evaluate_impl(data, x);
78 }
79
80 void computeJacobians(const ConstVectorRef &x,
81 BaseData &data) const override {
82 this->computeJacobians_impl(data, x);
83 }
84
85 void computeVectorHessianProducts(const ConstVectorRef &x,
86 const ConstVectorRef &lbda,
87 BaseData &data) const override {
88 this->computeVectorHessianProducts_impl(data, lbda, x);
89 }
90
91 shared_ptr<BaseData> createData() const override {
92 return std::make_shared<Data>(*this);
93 }
94};
95
96template <typename Scalar>
99 using BaseData = StageFunctionDataTpl<Scalar>;
101 shared_ptr<BaseData> sub_data;
102 VectorXs lbda_sub;
103
104 template <typename Base>
105 FunctionSliceDataTpl(FunctionSliceXprTpl<Scalar, Base> const &obj)
106 : BaseData(obj.ndx1, obj.nu, obj.ndx2, obj.nr),
107 sub_data(obj.func->createData()), lbda_sub(obj.nr) {}
108};
109
110namespace detail {
112template <typename Base> struct slice_impl_tpl {
113 using Scalar = typename Base::Scalar;
115 using BaseData = StageFunctionDataTpl<Scalar>;
116
117 using Data = FunctionSliceDataTpl<Scalar>;
118
119 shared_ptr<Base> func;
121 std::vector<int> indices;
122
123 slice_impl_tpl(shared_ptr<Base> func, std::vector<int> const &indices);
124 slice_impl_tpl(shared_ptr<Base> func, int idx);
125
126protected:
127 template <typename... Args>
128 void evaluate_impl(BaseData &data, Args &&...args) const;
129
130 template <typename... Args>
131 void computeJacobians_impl(BaseData &data, Args &&...args) const;
132
133 template <typename... Args>
135 const ConstVectorRef &lbda,
136 Args &&...args) const;
137};
138} // namespace detail
139
140} // namespace aligator
141
142#include "aligator/modelling/function-xpr-slice.hxx"
143
144#ifdef ALIGATOR_ENABLE_TEMPLATE_INSTANTIATION
145#include "aligator/modelling/function-xpr-slice.txx"
146#endif
Base definitions for ternary functions.
Main package namespace.
FunctionSliceDataTpl(FunctionSliceXprTpl< Scalar, Base > const &obj)
void computeJacobians(const ConstVectorRef &x, BaseData &data) const override
FunctionSliceXprTpl(shared_ptr< Base > func, std::vector< int > const &indices)
void evaluate(const ConstVectorRef &x, BaseData &data) const override
void computeVectorHessianProducts(const ConstVectorRef &x, const ConstVectorRef &lbda, BaseData &data) const override
shared_ptr< BaseData > createData() const override
Instantiate a Data object.
Represents a function of which the output is a subset of another function, for instance where is gi...
shared_ptr< BaseData > createData() const override
Instantiate a Data object.
void computeVectorHessianProducts(const ConstVectorRef &x, const ConstVectorRef &u, const ConstVectorRef &y, const ConstVectorRef &lbda, BaseData &data) const override
Compute the vector-hessian products of this function.
FunctionSliceXprTpl(shared_ptr< Base > func, std::vector< int > const &indices)
FunctionSliceDataTpl< Scalar > Data
void evaluate(const ConstVectorRef &x, const ConstVectorRef &u, const ConstVectorRef &y, BaseData &data) const override
Evaluate the function.
FunctionSliceXprTpl(shared_ptr< Base > func, const int idx)
void computeJacobians(const ConstVectorRef &x, const ConstVectorRef &u, const ConstVectorRef &y, BaseData &data) const override
Compute Jacobians of this function.
const int ndx2
Next state dimension.
const int nu
Control dimension.
const int ndx1
Current state dimension.
Represents unary functions of the form , with no control (or next-state) arguments.
Slicing and indexing of a function's output.
void computeJacobians_impl(BaseData &data, Args &&...args) const
FunctionSliceDataTpl< Scalar > Data
slice_impl_tpl(shared_ptr< Base > func, int idx)
void evaluate_impl(BaseData &data, Args &&...args) const
void computeVectorHessianProducts_impl(BaseData &data, const ConstVectorRef &lbda, Args &&...args) const
slice_impl_tpl(shared_ptr< Base > func, std::vector< int > const &indices)