26 #ifndef CASADI_BSPLINE_HPP
27 #define CASADI_BSPLINE_HPP
29 #include "mx_node.hpp"
42 class CASADI_EXPORT BSplineCommon :
public MXNode {
46 BSplineCommon(
const std::vector<double>& knots,
47 const std::vector<casadi_int>& offset,
48 const std::vector<casadi_int>& degree,
50 const std::vector<casadi_int>& lookup_mode);
53 ~BSplineCommon()
override {}
55 static void prepare(casadi_int m,
const std::vector<casadi_int>& offset,
56 const std::vector<casadi_int>& degree, casadi_int &coeffs_size,
57 std::vector<casadi_int>& coeffs_dims, std::vector<casadi_int>& strides);
59 static casadi_int get_coeff_size(casadi_int m,
const std::vector<casadi_int>& offset,
60 const std::vector<casadi_int>& degree);
62 std::vector<double> knots_;
63 std::vector<casadi_int> offset_;
64 std::vector<casadi_int> degree_;
66 std::vector<casadi_int> lookup_mode_;
69 std::vector<casadi_int> strides_;
70 std::vector<casadi_int> coeffs_dims_;
71 casadi_int coeffs_size_;
79 mutable MX jac_cache_;
81 virtual MX jac_cached()
const = 0;
86 static size_t n_iw(
const std::vector<casadi_int> °ree);
91 static size_t n_w(
const std::vector<casadi_int> °ree);
96 size_t sz_iw()
const override;
101 size_t sz_w()
const override;
106 casadi_int op()
const override {
return OP_BSPLINE;}
111 void ad_forward(
const std::vector<std::vector<MX> >& fseed,
112 std::vector<std::vector<MX> >& fsens)
const override;
117 void ad_reverse(
const std::vector<std::vector<MX> >& aseed,
118 std::vector<std::vector<MX> >& asens)
const override;
123 void generate(CodeGenerator& g,
124 const std::vector<casadi_int>& arg,
125 const std::vector<casadi_int>& res)
const override;
130 virtual std::string generate(CodeGenerator& g,
131 const std::vector<casadi_int>& arg)
const = 0;
136 static MXNode* deserialize(DeserializingStream& s);
139 M derivative_coeff(casadi_int i,
const M& coeffs)
const;
142 MX jac(
const MX& x,
const T& coeffs)
const;
147 void serialize_body(SerializingStream& s)
const override;
154 explicit BSplineCommon(DeserializingStream& s);
166 class CASADI_EXPORT BSpline :
public BSplineCommon {
169 static MX create(
const MX& x,
const std::vector< std::vector<double> >& knots,
170 const std::vector<double>& coeffs,
171 const std::vector<casadi_int>& degree,
176 BSpline(
const MX& x,
const std::vector<double>& knots,
177 const std::vector<casadi_int>& offset,
178 const std::vector<double>& coeffs,
179 const std::vector<casadi_int>& degree,
181 const std::vector<casadi_int>& lookup_mode);
184 ~BSpline()
override {}
187 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w)
const override;
192 void eval_mx(
const std::vector<MX>& arg, std::vector<MX>& res)
const override;
197 std::string generate(CodeGenerator& g,
198 const std::vector<casadi_int>& arg)
const override;
203 std::string disp(
const std::vector<std::string>& arg)
const override;
206 std::vector<double> coeffs_;
208 MX jac_cached()
const override;
220 static DM dual(
const std::vector<double>& x,
221 const std::vector< std::vector<double> >& knots,
222 const std::vector<casadi_int>& degree,
227 void serialize_body(SerializingStream& s)
const override;
231 void serialize_type(SerializingStream& s)
const override;
236 explicit BSpline(DeserializingStream& s);
240 class CASADI_EXPORT BSplineParametric :
public BSplineCommon {
242 static MX create(
const MX& x,
const MX& coeffs,
243 const std::vector< std::vector<double> >& knots,
244 const std::vector<casadi_int>& degree,
249 BSplineParametric(
const MX& x,
const MX& coeffs,
250 const std::vector<double>& knots,
251 const std::vector<casadi_int>& offset,
252 const std::vector<casadi_int>& degree,
254 const std::vector<casadi_int>& lookup_mode);
257 ~BSplineParametric()
override {}
260 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w)
const override;
265 void eval_mx(
const std::vector<MX>& arg, std::vector<MX>& res)
const override;
267 MX jac_cached()
const override;
272 std::string generate(CodeGenerator& g,
273 const std::vector<casadi_int>& arg)
const override;
278 std::string disp(
const std::vector<std::string>& arg)
const override;
283 void serialize_type(SerializingStream& s)
const override;
288 explicit BSplineParametric(DeserializingStream& s) : BSplineCommon(s) {}
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.