13 template <
class TScalar,
int kN>
20 ParamsImpl<TT> && Tangent<TT> && std::is_same_v<
22 Eigen::Vector<typename TT::Scalar, TT::kPointDim>> &&
23 (TT::kPointDim == TT::kAmbientDim
24 || TT::kPointDim + 1 ==
28 typename TT::Point point,
37 Eigen::Matrix<typename TT::Scalar, TT::kAmbientDim, TT::kAmbientDim>
39 Eigen::Matrix<typename TT::Scalar, TT::kDof, TT::kDof> adjoint) {
41 { TT::identityParams() } -> ConvertibleTo<typename TT::Params>;
45 { TT::exp(tangent) } -> ConvertibleTo<typename TT::Params>;
47 { TT::log(params) } -> ConvertibleTo<typename TT::Tangent>;
52 Eigen::Matrix<typename TT::Scalar, TT::kAmbientDim, TT::kAmbientDim>>;
54 { TT::vee(matrix) } -> ConvertibleTo<typename TT::Tangent>;
57 { TT::multiplication(params, params) } -> ConvertibleTo<typename TT::Params>;
59 #if __cplusplus >= 202002L
61 TT::multiplication(params, compatible_params)
66 { TT::inverse(params) } -> ConvertibleTo<typename TT::Params>;
69 { TT::action(params, point) } -> ConvertibleTo<typename TT::Point>;
71 #if __cplusplus >= 202002L
73 TT::action(params, compatible_point)
75 typename TT::template PointReturn<CompatScalarEx<typename TT::Scalar>>>;
79 TT::action(params, direction)
80 } -> ConvertibleTo<UnitVector<typename TT::Scalar, TT::kPointDim>>;
82 #if __cplusplus >= 202002L
84 TT::action(params, compatible_direction)
91 } -> ConvertibleTo<Eigen::Vector<typename TT::Scalar, TT::kAmbientDim>>;
95 } -> ConvertibleTo<Eigen::Matrix<typename TT::Scalar, TT::kDof, TT::kDof>>;
100 TT::compactMatrix(params)
102 Eigen::Matrix<typename TT::Scalar, TT::kPointDim, TT::kAmbientDim>>;
107 Eigen::Matrix<typename TT::Scalar, TT::kAmbientDim, TT::kAmbientDim>>;
113 } -> ConvertibleTo<Eigen::Matrix<typename TT::Scalar, TT::kDof, TT::kDof>>;
123 Eigen::Matrix<typename TT::Scalar, TT::kNumParams, TT::kDof>>;
126 TT::dxExpXTimesPointAt0(point)
128 Eigen::Matrix<typename TT::Scalar, TT::kPointDim, TT::kDof>>;
131 TT::dxThisMulExpXAt0(params)
133 Eigen::Matrix<typename TT::Scalar, TT::kNumParams, TT::kDof>>;
136 TT::dxLogThisInvTimesXAtThis(params)
138 Eigen::Matrix<typename TT::Scalar, TT::kDof, TT::kNumParams>>;
147 typename TT::Point point) {
149 TT::matV(params, tangent)
151 Eigen::Matrix<typename TT::Scalar, TT::kPointDim, TT::kPointDim>>;
154 TT::matVInverse(params, tangent)
156 Eigen::Matrix<typename TT::Scalar, TT::kPointDim, TT::kPointDim>>;
159 TT::adjOfTranslation(params, point)
161 Eigen::Matrix<typename TT::Scalar, TT::kPointDim, TT::kDof>>;
164 TT::adOfTranslation(point)
166 Eigen::Matrix<typename TT::Scalar, TT::kPointDim, TT::kPointDim>>;
170 concept
LieGroup = LieGroupImpl<typename TT::Impl> && Params<TT> &&
173 Eigen::Vector<typename TT::Scalar, TT::kPointDim>> &&
177 typename TT::Point point,
182 compatible_direction,
184 Eigen::Matrix<typename TT::Scalar, TT::kAmbientDim, TT::kAmbientDim>
186 Eigen::Matrix<typename TT::Scalar, TT::kDof, TT::kDof> adjoint) {
189 { TT::exp(tangent) } -> ConvertibleTo<TT>;
191 { g.log() } -> ConvertibleTo<typename TT::Tangent>;
194 { g.operator*(g) } -> ConvertibleTo<TT>;
196 { g.inverse() } -> ConvertibleTo<TT>;
199 { g.operator*(point) } -> ConvertibleTo<typename TT::Point>;
201 #if __cplusplus >= 202002L
203 g.operator*(compatible_point)
205 typename TT::template PointReturn<CompatScalarEx<typename TT::Scalar>>>;
209 g.operator*(direction)
210 } -> ConvertibleTo<UnitVector<typename TT::Scalar, TT::kPointDim>>;
212 #if __cplusplus >= 202002L
214 g.operator*(compatible_direction)
221 } -> ConvertibleTo<Eigen::Matrix<typename TT::Scalar, TT::kDof, TT::kDof>>;
223 { g.leftPlus(tangent) } -> ConvertibleTo<TT>;
225 { g.rightPlus(tangent) } -> ConvertibleTo<TT>;
227 { g.leftMinus(g) } -> ConvertibleTo<typename TT::Tangent>;
229 { g.rightMinus(g) } -> ConvertibleTo<typename TT::Tangent>;
236 Eigen::Matrix<typename TT::Scalar, TT::kPointDim, TT::kAmbientDim>>;
241 Eigen::Matrix<typename TT::Scalar, TT::kAmbientDim, TT::kAmbientDim>>;
246 } -> ConvertibleTo<Eigen::Matrix<typename TT::Scalar, TT::kDof, TT::kDof>>;
257 Eigen::Matrix<typename TT::Scalar, TT::kNumParams, TT::kDof>>;
260 TT::dxExpXTimesPointAt0(point)
262 Eigen::Matrix<typename TT::Scalar, TT::kPointDim, TT::kDof>>;
267 Eigen::Matrix<typename TT::Scalar, TT::kNumParams, TT::kDof>>;
270 g.dxLogThisInvTimesXAtThis()
272 Eigen::Matrix<typename TT::Scalar, TT::kDof, TT::kNumParams>>;
274 { TT::elementExamples() } -> ConvertibleTo<std::vector<TT>>;