aligator  0.14.0
A primal-dual augmented Lagrangian-type solver for nonlinear trajectory optimization.
 
Loading...
Searching...
No Matches
tangent-bundle.hpp
Go to the documentation of this file.
1#pragma once
2
4
5namespace aligator {
6
8template <class Base>
9struct TangentBundleTpl : public ManifoldAbstractTpl<typename Base::Scalar> {
10protected:
11 Base base_;
12
13public:
15 using Scalar = typename Base::Scalar;
16 static constexpr int Options = Base::Options;
18
21 : base_(base) {};
22
23 template <typename... BaseCtorArgs>
24 TangentBundleTpl(BaseCtorArgs... args)
25 : base_(Base(args...)) {}
26
28
29 inline int nx() const { return base_.nx() + base_.ndx(); }
30 inline int ndx() const { return 2 * base_.ndx(); }
31
32 bool isNormalized(const ConstVectorRef &x) const {
33 auto p = getBasePoint(x);
34 return base_.isNormalized(p);
35 }
36
37 const Base &getBaseSpace() const { return base_; }
38
41 template <typename Point>
42 typename Point::ConstSegmentReturnType
43 getBasePoint(const Eigen::MatrixBase<Point> &x) const {
44 return x.head(base_.nx());
45 }
46
47 template <typename Point>
48 typename Point::SegmentReturnType
49 getBasePointWrite(const Eigen::MatrixBase<Point> &x) const {
50 return x.const_cast_derived().head(base_.nx());
51 }
52
53 template <typename Tangent>
54 typename Tangent::ConstSegmentReturnType
55 getBaseTangent(const Tangent &v) const {
56 return v.head(base_.ndx());
57 }
58
59 template <typename Tangent>
60 typename Tangent::SegmentReturnType
61 getTangentHeadWrite(const Eigen::MatrixBase<Tangent> &v) const {
62 return v.const_cast_derived().head(base_.ndx());
63 }
64
65 template <typename Jac>
66 Eigen::Block<Jac, Eigen::Dynamic, Eigen::Dynamic>
67 getBaseJacobian(const Eigen::MatrixBase<Jac> &J) const {
68 return J.const_cast_derived().topLeftCorner(base_.ndx(), base_.ndx());
69 }
70
71protected:
73
74 void neutral_impl(VectorRef out) const;
75 void rand_impl(VectorRef out) const;
76
77 void integrate_impl(const ConstVectorRef &x, const ConstVectorRef &dx,
78 VectorRef out) const;
79
80 void difference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1,
81 VectorRef out) const;
82
83 void Jintegrate_impl(const ConstVectorRef &x, const ConstVectorRef &v,
84 MatrixRef Jout, int arg) const;
85
86 void JintegrateTransport_impl(const ConstVectorRef &x,
87 const ConstVectorRef &v, MatrixRef Jout,
88 int arg) const;
89
90 void Jdifference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1,
91 MatrixRef Jout, int arg) const;
92
93 void interpolate_impl(const ConstVectorRef &x0, const ConstVectorRef &x1,
94 const Scalar &u, VectorRef out) const;
95};
96
97} // namespace aligator
98
99#include "aligator/modelling/spaces/tangent-bundle.hxx"
Main package namespace.
Base class for manifolds, to use in cost funcs, solvers...
void Jdifference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, MatrixRef Jout, int arg) const
Point::SegmentReturnType getBasePointWrite(const Eigen::MatrixBase< Point > &x) const
void interpolate_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, const Scalar &u, VectorRef out) const
Interpolation operation.
typename Base::Scalar Scalar
TangentBundleTpl(BaseCtorArgs... args)
Constructor using base space constructor.
void rand_impl(VectorRef out) const
Tangent::SegmentReturnType getTangentHeadWrite(const Eigen::MatrixBase< Tangent > &v) const
void neutral_impl(VectorRef out) const
void integrate_impl(const ConstVectorRef &x, const ConstVectorRef &dx, VectorRef out) const
Perform the manifold integration operation.
int ndx() const
Get manifold tangent space dimension.
int nx() const
Declare implementations.
const Base & getBaseSpace() const
Point::ConstSegmentReturnType getBasePoint(const Eigen::MatrixBase< Point > &x) const
void JintegrateTransport_impl(const ConstVectorRef &x, const ConstVectorRef &v, MatrixRef Jout, int arg) const
bool isNormalized(const ConstVectorRef &x) const
Check if the input vector x is a viable element of the manifold.
void Jintegrate_impl(const ConstVectorRef &x, const ConstVectorRef &v, MatrixRef Jout, int arg) const
TangentBundleTpl(Base base)
Constructor using base space instance.
Eigen::Block< Jac, Eigen::Dynamic, Eigen::Dynamic > getBaseJacobian(const Eigen::MatrixBase< Jac > &J) const
void difference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, VectorRef out) const
Implementation of the manifold retraction operation.
static constexpr int Options
TangentBundleTpl< Base > Self
Tangent::ConstSegmentReturnType getBaseTangent(const Tangent &v) const