aligator  0.14.0
A primal-dual augmented Lagrangian-type solver for nonlinear trajectory optimization.
Loading...
Searching...
No Matches
functions.hpp
Go to the documentation of this file.
1
2#pragma once
3
6
9
12
13namespace aligator {
14namespace python {
22template <class FunctionBase = context::StageFunction>
23struct PyStageFunction final
24 : FunctionBase,
25 PolymorphicWrapper<PyStageFunction<FunctionBase>, FunctionBase> {
26 using Scalar = typename FunctionBase::Scalar;
28 using FunctionBase::FunctionBase;
30
31 void evaluate(const ConstVectorRef &x, const ConstVectorRef &u,
32 Data &data) const override {
33 ALIGATOR_PYTHON_OVERRIDE_PURE(void, "evaluate", x, u, boost::ref(data));
34 }
35
36 void computeJacobians(const ConstVectorRef &x, const ConstVectorRef &u,
37 Data &data) const override {
38 ALIGATOR_PYTHON_OVERRIDE_PURE(void, "computeJacobians", x, u,
39 boost::ref(data));
40 }
41
42 void computeVectorHessianProducts(const ConstVectorRef &x,
43 const ConstVectorRef &u,
44 const ConstVectorRef &lbda,
45 Data &data) const override {
47 x, u, lbda, boost::ref(data));
48 }
49
50 shared_ptr<Data> createData() const override {
51 ALIGATOR_PYTHON_OVERRIDE(shared_ptr<Data>, FunctionBase, createData, );
52 }
53
54 shared_ptr<Data> default_createData() const {
55 return FunctionBase::createData();
56 }
57};
58
59template <typename UFunction = context::UnaryFunction>
60struct PyUnaryFunction final
61 : UFunction,
62 PolymorphicWrapper<PyUnaryFunction<UFunction>, UFunction> {
63 using Scalar = typename UFunction::Scalar;
64 static_assert(
65 std::is_base_of_v<UnaryFunctionTpl<Scalar>, UFunction>,
66 "Template parameter UFunction must derive from UnaryFunctionTpl<>.");
70
71 using UFunction::UFunction;
72
73 void evaluate(const ConstVectorRef &x, Data &data) const override {
74 ALIGATOR_PYTHON_OVERRIDE_PURE(void, "evaluate", x, boost::ref(data));
75 }
76
77 void computeJacobians(const ConstVectorRef &x, Data &data) const override {
78 ALIGATOR_PYTHON_OVERRIDE_PURE(void, "computeJacobians", x,
79 boost::ref(data));
80 }
81
82 void computeVectorHessianProducts(const ConstVectorRef &x,
83 const ConstVectorRef &lbda,
84 Data &data) const override {
86 lbda, boost::ref(data));
87 }
88
89 void default_computeVectorHessianProducts(const ConstVectorRef &x,
90 const ConstVectorRef &lbda,
91 Data &data) const {
92 UFunction::computeVectorHessianProducts(x, lbda, data);
93 }
94
95 shared_ptr<Data> createData() const override {
96 ALIGATOR_PYTHON_OVERRIDE(shared_ptr<Data>, UFunction, createData, );
97 }
98
99 shared_ptr<Data> default_createData() const {
100 return UFunction::createData();
101 }
102};
103
104template <typename Class>
105struct SlicingVisitor : bp::def_visitor<SlicingVisitor<Class>> {
106 using Scalar = typename Class::Scalar;
108
109 template <typename Iterator, typename Fn>
110 static auto do_with_slice(Fn &&fun, bp::slice::range<Iterator> &range) {
111 while (range.start != range.stop) {
112 fun(*range.start);
113 std::advance(range.start, range.step);
114 }
115 fun(*range.start);
116 }
117
118 static auto get_slice(xyz::polymorphic<Class> const &fn,
119 bp::slice slice_obj) {
120 std::vector<int> indices((unsigned)fn->nr);
121 std::iota(indices.begin(), indices.end(), 0);
122 auto bounds = slice_obj.get_indices(indices.cbegin(), indices.cend());
123 std::vector<int> out{};
124
125 do_with_slice([&](int i) { out.push_back(i); }, bounds);
126 return SliceType(fn, out);
127 }
128
129 static auto get_from_index(xyz::polymorphic<Class> const &fn, const int idx) {
130 return SliceType(fn, idx);
131 }
132
134 std::vector<int> const &indices) {
135 return SliceType(fn, indices);
136 }
137
138 template <typename... Args> void visit(bp::class_<Args...> &cl) const {
139 cl.def("__getitem__", &get_from_index, bp::args("self", "idx"))
140 .def("__getitem__", &get_from_indices, bp::args("self", "indices"))
141 .def("__getitem__", &get_slice, bp::args("self", "sl"));
142 }
143};
144
145} // namespace python
146} // namespace aligator
147
148namespace boost::python::objects {
149
150template <>
151struct value_holder<aligator::python::PyStageFunction<>>
152 : aligator::python::OwningNonOwningHolder<
153 aligator::python::PyStageFunction<>> {
154 using OwningNonOwningHolder::OwningNonOwningHolder;
155};
156
157template <>
158struct value_holder<aligator::python::PyUnaryFunction<>>
159 : aligator::python::OwningNonOwningHolder<
160 aligator::python::PyUnaryFunction<>> {
161 using OwningNonOwningHolder::OwningNonOwningHolder;
162};
163
164} // namespace boost::python::objects
#define ALIGATOR_PYTHON_OVERRIDE(ret_type, cname, fname,...)
Define the body of a virtual function override. This is meant to reduce boilerplate code when exposin...
Definition fwd.hpp:99
#define ALIGATOR_PYTHON_OVERRIDE_PURE(ret_type, pyname,...)
Define the body of a virtual function override. This is meant to reduce boilerplate code when exposin...
Definition fwd.hpp:91
Base definitions for ternary functions.
Base definitions for numerical integrators.
The Python bindings.
Definition blk-matrix.hpp:5
Main package namespace.
Represents a function of which the output is a subset of another function, for instance where is gi...
Definition fwd.hpp:125
Base struct for function data.
StageFunctionDataTpl< Scalar > Data
Definition functions.hpp:27
void computeJacobians(const ConstVectorRef &x, const ConstVectorRef &u, Data &data) const override
Compute Jacobians of this function.
Definition functions.hpp:36
shared_ptr< Data > default_createData() const
Definition functions.hpp:54
typename FunctionBase::Scalar Scalar
Definition functions.hpp:26
shared_ptr< Data > createData() const override
Instantiate a Data object.
Definition functions.hpp:50
void evaluate(const ConstVectorRef &x, const ConstVectorRef &u, Data &data) const override
Evaluate the function.
Definition functions.hpp:31
void computeVectorHessianProducts(const ConstVectorRef &x, const ConstVectorRef &u, const ConstVectorRef &lbda, Data &data) const override
Compute the vector-hessian products of this function.
Definition functions.hpp:42
void evaluate(const ConstVectorRef &x, Data &data) const override
Definition functions.hpp:73
shared_ptr< Data > default_createData() const
Definition functions.hpp:99
StageFunctionDataTpl< Scalar > Data
Definition functions.hpp:69
typename UFunction::Scalar Scalar
Definition functions.hpp:63
shared_ptr< Data > createData() const override
Instantiate a Data object.
Definition functions.hpp:95
void default_computeVectorHessianProducts(const ConstVectorRef &x, const ConstVectorRef &lbda, Data &data) const
Definition functions.hpp:89
void computeVectorHessianProducts(const ConstVectorRef &x, const ConstVectorRef &lbda, Data &data) const override
Definition functions.hpp:82
void computeJacobians(const ConstVectorRef &x, Data &data) const override
Definition functions.hpp:77
static auto get_from_index(xyz::polymorphic< Class > const &fn, const int idx)
FunctionSliceXprTpl< Scalar, Class > SliceType
static auto get_from_indices(xyz::polymorphic< Class > const &fn, std::vector< int > const &indices)
void visit(bp::class_< Args... > &cl) const
static auto get_slice(xyz::polymorphic< Class > const &fn, bp::slice slice_obj)
static auto do_with_slice(Fn &&fun, bp::slice::range< Iterator > &range)
typename Class::Scalar Scalar