16template <
typename _Scalar,
unsigned int arg>
17struct StateOrControlErrorResidual;
20template <
typename _Scalar>
21struct StateOrControlErrorResidual<_Scalar, 0> : UnaryFunctionTpl<_Scalar> {
22 using Scalar = _Scalar;
25 using Data = StageFunctionDataTpl<Scalar>;
26 using Manifold = ManifoldAbstractTpl<Scalar>;
27 using VectorSpace = VectorSpaceTpl<Scalar, Eigen::Dynamic>;
33 StateOrControlErrorResidual(
const PolyManifold &xspace,
const int nu,
34 const ConstVectorRef &target)
35 : Base(xspace->ndx(),
nu, xspace->ndx())
41 template <
typename U,
typename std::enable_if_t<
43 StateOrControlErrorResidual(U &&xspace,
const int nu,
44 const ConstVectorRef &target)
45 : Base(xspace.ndx(),
nu, xspace.ndx())
46 , space_{std::forward<U>(xspace)}
51 void evaluate(
const ConstVectorRef &x, Data &data)
const override {
52 space_->difference(target_, x, data.value_);
55 void computeJacobians(
const ConstVectorRef &x, Data &data)
const override {
56 space_->Jdifference(target_, x, data.Jx_, 1);
60 void validate()
const {
61 if (!space_->isNormalized(target_)) {
63 "Target parameter invalid (not a viable element of state manifold.)");
68template <
typename _Scalar,
unsigned int arg>
69struct StateOrControlErrorResidual : StageFunctionTpl<_Scalar> {
70 static_assert(arg == 1,
"arg value must be 1");
71 using Scalar = _Scalar;
74 using Data = StageFunctionDataTpl<Scalar>;
75 using Manifold = ManifoldAbstractTpl<Scalar>;
76 using VectorSpace = VectorSpaceTpl<Scalar, Eigen::Dynamic>;
78 xyz::polymorphic<Manifold> space_;
84 typename = std::enable_if_t<!is_polymorphic_of_v<Manifold, U>>>
85 StateOrControlErrorResidual(
const int ndx, U &&uspace,
86 const ConstVectorRef &target)
87 : Base(ndx, uspace.nx(), uspace.ndx())
88 , space_(std::forward<U>(uspace))
93 StateOrControlErrorResidual(
const int ndx,
94 const xyz::polymorphic<Manifold> &uspace,
95 const ConstVectorRef &target)
96 : Base(ndx, uspace->nx(), uspace->ndx())
102 StateOrControlErrorResidual(
const int ndx,
const int nu)
104 , space_(VectorSpace(
nu))
105 , target_(space_->neutral()) {}
109 StateOrControlErrorResidual(
const int ndx,
const ConstVectorRef &target)
110 : StateOrControlErrorResidual(ndx, (int)target.size()) {
114 void evaluate(
const ConstVectorRef &,
const ConstVectorRef &u,
115 Data &data)
const override {
118 space_->difference(target_, u, data.value_);
125 void computeJacobians(
const ConstVectorRef &,
const ConstVectorRef &u,
126 Data &data)
const override {
129 space_->Jdifference(target_, u, data.Ju_, 1);
137 void validate()
const {
138 if (!space_->isNormalized(target_)) {
140 "Target parameter invalid (not a viable element of state manifold.)");
151template <
typename Scalar>
153 using Base = detail::StateOrControlErrorResidual<Scalar, 0>;
157template <
typename Scalar>
159 : detail::StateOrControlErrorResidual<Scalar, 1> {
160 using Base = detail::StateOrControlErrorResidual<Scalar, 1>;
166#ifdef ALIGATOR_ENABLE_TEMPLATE_INSTANTIATION
167#include "aligator/modelling/state-error.txx"
#define ALIGATOR_RUNTIME_ERROR(...)
Base definitions for ternary functions.
#define ALIGATOR_DYNAMIC_TYPEDEFS(Scalar)
xyz::polymorphic< Manifold > PolyManifold
constexpr bool is_polymorphic_of_v
detail::StateOrControlErrorResidual< Scalar, 1 > Base
const int nu
Control dimension.
StageFunctionTpl(const int ndx, const int nu, const int nr)
detail::StateOrControlErrorResidual< Scalar, 0 > Base
#define ALIGATOR_UNARY_FUNCTION_INTERFACE(Scalar)