aligator  0.6.1
A primal-dual augmented Lagrangian-type solver for nonlinear trajectory optimization.
Loading...
Searching...
No Matches
expose-gar.cpp
Go to the documentation of this file.
1
7
10
11#include <eigenpy/std-array.hpp>
12
13namespace aligator::python {
14using namespace gar;
15
16using context::Scalar;
17using riccati_base_t = RiccatiSolverBase<Scalar>;
18using knot_t = LQRKnotTpl<context::Scalar>;
19using lqr_t = LQRProblemTpl<context::Scalar>;
20
21using context::MatrixXs;
22using RowMatrixXs = Eigen::Transpose<MatrixXs>::PlainMatrix;
23using context::VectorXs;
24
26
27bp::dict lqr_sol_initialize_wrap(const lqr_t &problem) {
28 bp::dict out;
29 auto ss = lqrInitializeSolution(problem);
30 auto &[xs, us, vs, lbdas] = ss;
31 out["xs"] = xs;
32 out["us"] = us;
33 out["vs"] = vs;
34 out["lbdas"] = lbdas;
35 return out;
36}
37
38static void exposeBlockMatrices() {
39 BlkMatrixPythonVisitor<BlkMatrix<MatrixXs, 2, 2>>::expose("BlockMatrix22");
40 BlkMatrixPythonVisitor<BlkMatrix<VectorXs, 4, 1>>::expose("BlockVector4");
41 BlkMatrixPythonVisitor<BlkMatrix<VectorXs, 2, 1>>::expose("BlockVector2");
42 BlkMatrixPythonVisitor<BlkMatrix<RowMatrixXs, 4, 1>>::expose(
43 "BlockRowMatrix41");
44 BlkMatrixPythonVisitor<BlkMatrix<RowMatrixXs, 2, 1>>::expose(
45 "BlockRowMatrix21");
46 eigenpy::StdArrayPythonVisitor<std::array<long, 1>, true>::expose(
47 "StdArr1_long");
48 eigenpy::StdArrayPythonVisitor<std::array<long, 2>, true>::expose(
49 "StdArr2_long");
50 eigenpy::StdArrayPythonVisitor<std::array<long, 4>, true>::expose(
51 "StdArr4_long");
52}
53
54#ifdef ALIGATOR_WITH_CHOLMOD
55// fwd-declare exposeCholmodSolver()
57#endif
58// fwd-declare exposeParallelSolver()
60// fwd-declare exposeDenseSolver()
62// fwd-declare exposeProxRiccati()
64
65void exposeGAR() {
66
67 bp::scope ns = get_namespace("gar");
68
70
71 bp::class_<knot_t>("LQRKnot", bp::no_init)
72 .def(bp::init<uint, uint, uint>(("nx"_a, "nu", "nc")))
73 .def(bp::init<uint, uint, uint, uint>(("nx"_a, "nu", "nc", "nx2")))
74 .def_readonly("nx", &knot_t::nx)
75 .def_readonly("nu", &knot_t::nu)
76 .def_readonly("nc", &knot_t::nc)
77 .def_readonly("nx2", &knot_t::nx2)
78 .def_readonly("nth", &knot_t::nth)
79 //
80 .def_readwrite("Q", &knot_t::Q)
81 .def_readwrite("S", &knot_t::S)
82 .def_readwrite("R", &knot_t::R)
83 .def_readwrite("q", &knot_t::q)
84 .def_readwrite("r", &knot_t::r)
85 //
86 .def_readwrite("A", &knot_t::A)
87 .def_readwrite("B", &knot_t::B)
88 .def_readwrite("E", &knot_t::E)
89 .def_readwrite("f", &knot_t::f)
90 //
91 .def_readwrite("C", &knot_t::C)
92 .def_readwrite("D", &knot_t::D)
93 .def_readwrite("d", &knot_t::d)
94 //
95 .def_readwrite("Gth", &knot_t::Gth)
96 .def_readwrite("Gx", &knot_t::Gx)
97 .def_readwrite("Gu", &knot_t::Gu)
98 .def_readwrite("gamma", &knot_t::gamma)
99 //
100 .def(CopyableVisitor<knot_t>())
101 .def(PrintableVisitor<knot_t>());
102
103 StdVectorPythonVisitor<knot_vec_t, false>::expose("StdVec_LQRKnot");
104
105 bp::class_<lqr_t>("LQRProblem", bp::no_init)
106 .def(bp::init<const knot_vec_t &, long>(("self"_a, "stages", "nc0")))
107 .def_readwrite("stages", &lqr_t::stages)
108 .add_property("horizon", &lqr_t::horizon)
109 .def_readwrite("G0", &lqr_t::G0)
110 .def_readwrite("g0", &lqr_t::g0)
111 .add_property("isInitialized", &lqr_t::isInitialized,
112 "Whether the problem is initialized.")
113 .add_property("isParameterized", &lqr_t::isParameterized,
114 "Whether the problem is parameterized.")
115 .def("addParameterization", &lqr_t::addParameterization,
116 ("self"_a, "nth"))
117 .add_property("ntheta", &lqr_t::ntheta)
118 .def("evaluate", &lqr_t::evaluate,
119 ("self"_a, "xs", "us", "theta"_a = std::nullopt),
120 "Evaluate the problem objective.")
121 .def(CopyableVisitor<lqr_t>());
122
123 bp::class_<riccati_base_t, boost::noncopyable>("RiccatiSolverBase",
124 bp::no_init)
125 .def("backward", &riccati_base_t::backward, ("self"_a, "mu", "mueq"))
126 .def("forward", &riccati_base_t::forward,
127 ("self"_a, "xs", "us", "vs", "lbdas", "theta"_a = std::nullopt));
128
129 bp::def(
130 "lqrDenseMatrix",
131 +[](const lqr_t &problem, Scalar mudyn, Scalar mueq) {
132 auto mat_rhs = lqrDenseMatrix(problem, mudyn, mueq);
133 return bp::make_tuple(std::get<0>(mat_rhs), std::get<1>(mat_rhs));
134 },
135 ("problem"_a, "mudyn", "mueq"));
136
137 bp::def("lqrInitializeSolution", lqr_sol_initialize_wrap, ("problem"_a));
138
139#ifdef ALIGATOR_WITH_CHOLMOD
141#endif
145}
146
147} // namespace aligator::python
virtual bool backward(const Scalar mudyn, const Scalar mueq)=0
virtual bool forward(std::vector< VectorXs > &xs, std::vector< VectorXs > &us, std::vector< VectorXs > &vs, std::vector< VectorXs > &lbdas, const std::optional< ConstVectorRef > &theta_=std::nullopt) const=0
auto lqrInitializeSolution(const LQRProblemTpl< Scalar > &problem)
Definition utils.hpp:254
bool lqrDenseMatrix(const LQRProblemTpl< Scalar > &problem, Scalar mudyn, Scalar mueq, typename math_types< Scalar >::MatrixXs &mat, typename math_types< Scalar >::VectorXs &rhs)
Fill in a KKT constraint matrix and vector for the given LQ problem with the given dual-regularizatio...
Definition utils.hpp:112
The Python bindings.
Definition blk-matrix.hpp:5
Eigen::Transpose< MatrixXs >::PlainMatrix RowMatrixXs
bp::dict lqr_sol_initialize_wrap(const lqr_t &problem)
void exposeGAR()
Expose GAR module.
RiccatiSolverBase< Scalar > riccati_base_t
LQRKnotTpl< context::Scalar > knot_t
lqr_t::KnotVector knot_vec_t
static void exposeBlockMatrices()
std::vector< KnotType > KnotVector
Scalar evaluate(const VectorOfVectors &xs, const VectorOfVectors &us, const std::optional< ConstVectorRef > &theta_) const
Evaluate the quadratic objective.
int horizon() const noexcept