12template <
typename _Scalar>
24 template <
class Concrete>
inline void addComponent(
const Concrete &c) {
26 std::is_base_of_v<Base, Concrete> ||
27 std::is_same_v<Concrete, xyz::polymorphic<Base>>,
28 "Input type should either be derived from ManifoldAbstractTpl or be "
29 "polymorphic<ManifoldAbstractTpl>.");
58 inline int nx()
const {
66 inline int ndx()
const {
78 template <
class VectorType,
class U = std::remove_const_t<VectorType>>
81 template <
class VectorType,
class U = std::remove_const_t<VectorType>>
84 std::vector<VectorRef>
split(VectorRef x)
const {
88 std::vector<ConstVectorRef>
split(
const ConstVectorRef &x)
const {
96 std::vector<ConstVectorRef>
split_vector(
const ConstVectorRef &v)
const {
100 VectorXs
merge(
const std::vector<VectorXs> &xs)
const;
108 VectorRef out)
const;
111 VectorRef out)
const;
114 MatrixRef Jout,
int arg)
const;
117 const ConstVectorRef &v, MatrixRef Jout,
121 MatrixRef Jout,
int arg)
const;
155#include "aligator/modelling/spaces/cartesian-product.hxx"
xyz::polymorphic< CostStackTpl< T > > operator*(T u, xyz::polymorphic< CostStackTpl< T > > &&c1)
The cartesian product of two or more manifolds.
int ndx() const
Get manifold tangent space dimension.
CartesianProductTpl()=default
CartesianProductTpl(const std::vector< xyz::polymorphic< Base > > &components)
CartesianProductTpl(const CartesianProductTpl &)=default
int nx() const
Get manifold representation dimension.
void Jintegrate_impl(const ConstVectorRef &x, const ConstVectorRef &v, MatrixRef Jout, int arg) const
const Base & getComponent(std::size_t i) const
std::vector< U > split_impl(VectorType &x) const
std::vector< VectorRef > split_vector(VectorRef v) const
ALIGATOR_DYNAMIC_TYPEDEFS(Scalar)
std::size_t numComponents() const
std::vector< VectorRef > split(VectorRef x) const
void neutral_impl(VectorRef out) const
void rand_impl(VectorRef out) const
CartesianProductTpl(std::vector< xyz::polymorphic< Base > > &&components)
CartesianProductTpl & operator=(CartesianProductTpl &&)=default
VectorXs merge(const std::vector< VectorXs > &xs) const
bool isNormalized(const ConstVectorRef &x) const
Check if the input vector x is a viable element of the manifold.
void difference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, VectorRef out) const
Implementation of the manifold retraction operation.
VectorXs merge_vector(const std::vector< VectorXs > &vs) const
std::vector< ConstVectorRef > split(const ConstVectorRef &x) const
CartesianProductTpl & operator=(const CartesianProductTpl &)=default
void integrate_impl(const ConstVectorRef &x, const ConstVectorRef &v, VectorRef out) const
Perform the manifold integration operation.
ManifoldAbstractTpl< Scalar > Base
void Jdifference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, MatrixRef Jout, int arg) const
void JintegrateTransport_impl(const ConstVectorRef &x, const ConstVectorRef &v, MatrixRef Jout, int arg) const
CartesianProductTpl(const xyz::polymorphic< Base > &left, const xyz::polymorphic< Base > &right)
CartesianProductTpl(std::initializer_list< xyz::polymorphic< Base > > components)
void addComponent(const Concrete &c)
std::vector< ConstVectorRef > split_vector(const ConstVectorRef &v) const
void addComponent(const CartesianProductTpl &other)
CartesianProductTpl(CartesianProductTpl &&)=default
std::vector< U > split_vector_impl(VectorType &v) const
std::vector< xyz::polymorphic< Base > > m_components
Base class for manifolds, to use in cost funcs, solvers...