aligator  0.14.0
A primal-dual augmented Lagrangian-type solver for nonlinear trajectory optimization.
 
Loading...
Searching...
No Matches
manifold-base.hpp
Go to the documentation of this file.
1
3#pragma once
4
5#include "aligator/fwd.hpp"
6
7namespace aligator {
8
11template <typename _Scalar> struct ManifoldAbstractTpl {
12public:
13 using Scalar = _Scalar;
17
18 virtual ~ManifoldAbstractTpl() = default;
19
21 virtual int nx() const = 0;
23 virtual int ndx() const = 0;
24
27 VectorXs neutral() const {
28 VectorXs out(nx());
29 neutral_impl(out);
30 return out;
31 }
32
34 void neutral(VectorRef out) const { neutral_impl(out); }
35
37 VectorXs rand() const {
38 VectorXs out(nx());
39 rand_impl(out);
40 return out;
41 }
42
44 void rand(VectorRef out) const { rand_impl(out); }
45
48 virtual bool isNormalized(const ConstVectorRef & /*x*/) const { return true; }
49
52 return TangentSpaceType(this->ndx());
53 }
54
56
58 void integrate(const ConstVectorRef &x, const ConstVectorRef &v,
59 VectorRef out) const;
60
62 void Jintegrate(const ConstVectorRef &x, const ConstVectorRef &v,
63 MatrixRef Jout, int arg) const;
64
67 void JintegrateTransport(const ConstVectorRef &x, const ConstVectorRef &v,
68 MatrixRef Jout, int arg) const {
69 assert(Jout.rows() == v.size());
70 JintegrateTransport_impl(x, v, Jout, arg);
71 }
72
74 void difference(const ConstVectorRef &x0, const ConstVectorRef &x1,
75 VectorRef out) const;
76
78 void Jdifference(const ConstVectorRef &x0, const ConstVectorRef &x1,
79 MatrixRef Jout, int arg) const;
80
81 void interpolate(const ConstVectorRef &x0, const ConstVectorRef &x1,
82 const Scalar &u, VectorRef out) const;
83
86
90 VectorXs integrate(const ConstVectorRef &x, const ConstVectorRef &v) const {
91 VectorXs out(nx());
92 integrate_impl(x, v, out);
93 return out;
94 }
95
99 VectorXs difference(const ConstVectorRef &x0,
100 const ConstVectorRef &x1) const {
101 VectorXs out(ndx());
102 difference_impl(x0, x1, out);
103 return out;
104 }
105
107 VectorXs interpolate(const ConstVectorRef &x0, const ConstVectorRef &x1,
108 const Scalar &u) const {
109 VectorXs out(nx());
110 interpolate_impl(x0, x1, u, out);
111 return out;
112 }
113
115
116protected:
118 virtual void integrate_impl(const ConstVectorRef &x, const ConstVectorRef &v,
119 VectorRef out) const = 0;
120
121 virtual void Jintegrate_impl(const ConstVectorRef &x, const ConstVectorRef &v,
122 MatrixRef Jout, int arg) const = 0;
123
124 virtual void JintegrateTransport_impl(const ConstVectorRef &x,
125 const ConstVectorRef &v, MatrixRef Jout,
126 int arg) const = 0;
127
129 virtual void difference_impl(const ConstVectorRef &x0,
130 const ConstVectorRef &x1,
131 VectorRef out) const = 0;
132
133 virtual void Jdifference_impl(const ConstVectorRef &x0,
134 const ConstVectorRef &x1, MatrixRef Jout,
135 int arg) const = 0;
136
138 virtual void interpolate_impl(const ConstVectorRef &x0,
139 const ConstVectorRef &x1, const Scalar &u,
140 VectorRef out) const {
141 // default implementation
142 integrate(x0, u * difference(x0, x1), out);
143 }
144
145 virtual void neutral_impl(VectorRef out) const {
146 assert(out.size() == nx());
147 out.setZero();
148 }
149
150 virtual void rand_impl(VectorRef out) const {
151 assert(out.size() == nx());
152 out.setRandom();
153 }
154};
155
156} // namespace aligator
157
158#include "aligator/core/manifold-base.hxx"
Forward declarations.
Main package namespace.
Base class for manifolds, to use in cost funcs, solvers...
VectorSpaceTpl< Scalar, Eigen::Dynamic > TangentSpaceType
virtual void Jdifference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, MatrixRef Jout, int arg) const =0
VectorXs rand() const
Sample a random point on the manifold.
void neutral(VectorRef out) const
Get the neutral element from the manifold (if this makes sense).
ALIGATOR_DYNAMIC_TYPEDEFS(Scalar)
Scalar type.
void difference(const ConstVectorRef &x0, const ConstVectorRef &x1, VectorRef out) const
Manifold difference/retraction operation .
virtual void JintegrateTransport_impl(const ConstVectorRef &x, const ConstVectorRef &v, MatrixRef Jout, int arg) const =0
void Jintegrate(const ConstVectorRef &x, const ConstVectorRef &v, MatrixRef Jout, int arg) const
Jacobian of the integation operation.
virtual void rand_impl(VectorRef out) const
void interpolate(const ConstVectorRef &x0, const ConstVectorRef &x1, const Scalar &u, VectorRef out) const
void rand(VectorRef out) const
Sample a random point on the manifold.
virtual ~ManifoldAbstractTpl()=default
virtual void interpolate_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, const Scalar &u, VectorRef out) const
Interpolation operation.
virtual int nx() const =0
Get manifold representation dimension.
void integrate(const ConstVectorRef &x, const ConstVectorRef &v, VectorRef out) const
Manifold integration operation .
VectorXs neutral() const
Get the neutral element from the manifold (if this makes sense).
VectorXs integrate(const ConstVectorRef &x, const ConstVectorRef &v) const
Manifold integration operation .
void JintegrateTransport(const ConstVectorRef &x, const ConstVectorRef &v, MatrixRef Jout, int arg) const
Perform the parallel transport operation.
VectorXs interpolate(const ConstVectorRef &x0, const ConstVectorRef &x1, const Scalar &u) const
Interpolation operation.
TangentSpaceType tangentSpace() const
Return an object representing the tangent space as a manifold.
virtual void difference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, VectorRef out) const =0
Implementation of the manifold retraction operation.
virtual void integrate_impl(const ConstVectorRef &x, const ConstVectorRef &v, VectorRef out) const =0
Perform the manifold integration operation.
void Jdifference(const ConstVectorRef &x0, const ConstVectorRef &x1, MatrixRef Jout, int arg) const
Jacobian of the retraction operation.
virtual void Jintegrate_impl(const ConstVectorRef &x, const ConstVectorRef &v, MatrixRef Jout, int arg) const =0
virtual void neutral_impl(VectorRef out) const
virtual int ndx() const =0
Get manifold tangent space dimension.
VectorXs difference(const ConstVectorRef &x0, const ConstVectorRef &x1) const
Manifold difference/retraction operation .
virtual bool isNormalized(const ConstVectorRef &) const
Check if the input vector x is a viable element of the manifold.
Standard Euclidean vector space.