aligator  0.14.0
A primal-dual augmented Lagrangian-type solver for nonlinear trajectory optimization.
 
Loading...
Searching...
No Matches
vector-space.hpp
Go to the documentation of this file.
1
3#pragma once
4
5#include "manifold-base.hpp"
6
7#include <type_traits>
8
9namespace aligator {
10
12template <typename _Scalar, int _Dim>
13struct VectorSpaceTpl : public ManifoldAbstractTpl<_Scalar> {
14 using Scalar = _Scalar;
15 static constexpr int Dim = _Dim;
18
19 int dim_;
20
22 VectorSpaceTpl(const int dim)
23 : Base()
24 , dim_(dim) {
25 static_assert(
26 Dim == Eigen::Dynamic,
27 "This constructor is only valid if the dimension is dynamic.");
28 }
29
34 template <int N = Dim,
35 typename = typename std::enable_if_t<N != Eigen::Dynamic>>
37 : Base()
38 , dim_(Dim) {}
39
40 inline int nx() const { return dim_; }
41 inline int ndx() const { return dim_; }
42
44 template <int OtherDim>
46 : Base()
47 , dim_(other.dim_) {
48 static_assert((Dim == OtherDim) || (Dim == Eigen::Dynamic));
49 }
50
51protected:
53
54 /* Integrate */
55
56 void integrate_impl(const ConstVectorRef &x, const ConstVectorRef &v,
57 VectorRef out) const {
58 out = x + v;
59 }
60
61 void Jintegrate_impl(const ConstVectorRef &, const ConstVectorRef &,
62 MatrixRef Jout, int) const {
63 Jout.setIdentity();
64 }
65
66 void JintegrateTransport_impl(const ConstVectorRef &, const ConstVectorRef &,
67 MatrixRef, int) const {}
68
69 /* Difference */
70
71 void difference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1,
72 VectorRef out) const {
73 out = x1 - x0;
74 }
75
76 void Jdifference_impl(const ConstVectorRef &, const ConstVectorRef &,
77 MatrixRef Jout, int arg) const {
78 switch (arg) {
79 case 0:
80 Jout = -MatrixXs::Identity(ndx(), ndx());
81 break;
82 case 1:
83 Jout.setIdentity();
84 break;
85 default:
86 ALIGATOR_DOMAIN_ERROR("Wrong arg value.");
87 }
88 }
89
90 void interpolate_impl(const ConstVectorRef &x0, const ConstVectorRef &x1,
91 const Scalar &u, VectorRef out) const {
92 out = u * x1 + (static_cast<Scalar>(1.) - u) * x0;
93 }
94};
95
96} // namespace aligator
#define ALIGATOR_DOMAIN_ERROR(...)
Main package namespace.
Base class for manifolds, to use in cost funcs, solvers...
void interpolate_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, const Scalar &u, VectorRef out) const
Interpolation operation.
VectorSpaceTpl(const int dim)
Default constructor where the dimension is supplied.
VectorSpaceTpl()
Default constructor without arguments.
void Jdifference_impl(const ConstVectorRef &, const ConstVectorRef &, MatrixRef Jout, int arg) const
void integrate_impl(const ConstVectorRef &x, const ConstVectorRef &v, VectorRef out) const
Perform the manifold integration operation.
int ndx() const
Get manifold tangent space dimension.
void JintegrateTransport_impl(const ConstVectorRef &, const ConstVectorRef &, MatrixRef, int) const
int nx() const
Get manifold representation dimension.
VectorSpaceTpl(const VectorSpaceTpl< Scalar, OtherDim > &other)
Build from VectorSpaceTpl of different dimension.
void difference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, VectorRef out) const
Implementation of the manifold retraction operation.
void Jintegrate_impl(const ConstVectorRef &, const ConstVectorRef &, MatrixRef Jout, int) const