11template <
typename _FunType>
struct linear_func_composition_impl : _FunType {
12 using FunType = _FunType;
13 using Scalar =
typename FunType::Scalar;
15 using BaseData = StageFunctionDataTpl<Scalar>;
17 xyz::polymorphic<FunType> func;
21 struct Data : BaseData {
22 shared_ptr<BaseData> sub_data;
23 Data(
const linear_func_composition_impl &model)
24 : BaseData(model.
ndx1, model.
nu, model.
nr)
25 , sub_data(model.func->createData()) {}
28 linear_func_composition_impl(xyz::polymorphic<FunType> func,
29 const ConstMatrixRef A,
const ConstVectorRef b)
30 : FunType(func->ndx1, func->nu, (int)A.rows())
37 if (A.rows() != b.rows()) {
38 ALIGATOR_RUNTIME_ERROR(
"Incompatible dimensions: A.rows() != b.rows()");
40 if (A.cols() != func->nr) {
41 ALIGATOR_RUNTIME_ERROR(
"Incompatible dimensions: A.cols() != func.nr");
45 linear_func_composition_impl(xyz::polymorphic<FunType> func,
46 const ConstMatrixRef A)
47 : linear_func_composition_impl(func, A, VectorXs::Zero(A.rows())) {}
49 shared_ptr<BaseData> createData()
const {
50 return std::make_shared<Data>(*
this);
55template <
typename _Scalar>
57 : detail::linear_func_composition_impl<StageFunctionTpl<_Scalar>> {
60 using Impl = detail::linear_func_composition_impl<StageFunctionTpl<Scalar>>;
61 using Base =
typename Impl::FunType;
62 using Data =
typename Impl::Data;
71 void evaluate(
const ConstVectorRef &x,
const ConstVectorRef &u,
78template <
typename _Scalar>
80 : detail::linear_func_composition_impl<UnaryFunctionTpl<_Scalar>> {
84 using Impl = detail::linear_func_composition_impl<Base>;
85 using Data =
typename Impl::Data;
90 using Impl::createData;
99template <
typename Scalar>
107template <
typename Scalar>
114#ifdef ALIGATOR_ENABLE_TEMPLATE_INSTANTIATION
115extern template struct LinearFunctionCompositionTpl<context::Scalar>;
116extern template struct LinearUnaryFunctionCompositionTpl<context::Scalar>;
Base definitions for ternary functions.
#define ALIGATOR_DYNAMIC_TYPEDEFS(Scalar)
auto linear_compose(xyz::polymorphic< StageFunctionTpl< Scalar > > func, const typename math_types< Scalar >::ConstMatrixRef A, const typename math_types< Scalar >::ConstVectorRef b)
Create a linear composition of the input function func.
void evaluate(const ConstVectorRef &x, const ConstVectorRef &u, BaseData &data) const override
Evaluate the function.
void computeJacobians(const ConstVectorRef &x, const ConstVectorRef &u, BaseData &data) const override
Compute Jacobians of this function.
StageFunctionDataTpl< Scalar > BaseData
typename Impl::FunType Base
detail::linear_func_composition_impl< StageFunctionTpl< Scalar > > Impl
ALIGATOR_DYNAMIC_TYPEDEFS(Scalar)
ALIGATOR_DYNAMIC_TYPEDEFS(Scalar)
detail::linear_func_composition_impl< Base > Impl
ALIGATOR_UNARY_FUNCTION_INTERFACE(Scalar)
void evaluate(const ConstVectorRef &x, BaseData &data) const override
void computeJacobians(const ConstVectorRef &x, BaseData &data) const override
StageFunctionDataTpl< Scalar > BaseData
Base struct for function data.
Class representing ternary functions .
virtual shared_ptr< Data > createData() const
Represents unary functions of the form , with no control (or next-state) arguments.
Typedefs for math (Eigen vectors, matrices) depending on scalar type.