bspline.hpp
1 /*
2  * This file is part of CasADi.
3  *
4  * CasADi -- A symbolic framework for dynamic optimization.
5  * Copyright (C) 2010-2023 Joel Andersson, Joris Gillis, Moritz Diehl,
6  * KU Leuven. All rights reserved.
7  * Copyright (C) 2011-2014 Greg Horn
8  *
9  * CasADi is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 3 of the License, or (at your option) any later version.
13  *
14  * CasADi is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with CasADi; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  *
23  */
24 
25 
26 #ifndef CASADI_BSPLINE_HPP
27 #define CASADI_BSPLINE_HPP
28 
29 #include "mx_node.hpp"
30 #include <map>
31 #include <stack>
32 
34 
35 namespace casadi {
42  class CASADI_EXPORT BSplineCommon : public MXNode {
43  public:
44 
46  BSplineCommon(const std::vector<double>& knots,
47  const std::vector<casadi_int>& offset,
48  const std::vector<casadi_int>& degree,
49  casadi_int m,
50  const std::vector<casadi_int>& lookup_mode);
51 
53  ~BSplineCommon() override {}
54 
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);
58 
59  static casadi_int get_coeff_size(casadi_int m, const std::vector<casadi_int>& offset,
60  const std::vector<casadi_int>& degree);
61 
62  template<class M>
63  static M derivative_coeff(casadi_int i,
64  const std::vector<double>& knots,
65  const std::vector<casadi_int>& offset,
66  const std::vector<casadi_int>& degree,
67  const std::vector<casadi_int>& coeffs_dims,
68  const M& coeffs,
69  std::vector< std::vector<double> >& new_knots,
70  std::vector<casadi_int>& new_degree);
71 
72  std::vector<double> knots_;
73  std::vector<casadi_int> offset_;
74  std::vector<casadi_int> degree_;
75  casadi_int m_;
76  std::vector<casadi_int> lookup_mode_;
77 
78  // Derived fields
79  std::vector<casadi_int> strides_;
80  std::vector<casadi_int> coeffs_dims_;
81  casadi_int coeffs_size_;
82 
89  mutable MX jac_cache_;
90 
91 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
93  mutable std::mutex jac_cache_mtx_;
94 #endif // CASADI_WITH_THREADSAFE_SYMBOLICS
95 
96  virtual MX jac_cached() const = 0;
97 
101  static size_t n_iw(const std::vector<casadi_int> &degree);
102 
106  static size_t n_w(const std::vector<casadi_int> &degree);
107 
111  size_t sz_iw() const override;
112 
116  size_t sz_w() const override;
117 
121  casadi_int op() const override { return OP_BSPLINE;}
122 
126  void ad_forward(const std::vector<std::vector<MX> >& fseed,
127  std::vector<std::vector<MX> >& fsens) const override;
128 
132  void ad_reverse(const std::vector<std::vector<MX> >& aseed,
133  std::vector<std::vector<MX> >& asens) const override;
134 
138  void generate(CodeGenerator& g,
139  const std::vector<casadi_int>& arg,
140  const std::vector<casadi_int>& res,
141  const std::vector<bool>& arg_is_ref,
142  std::vector<bool>& res_is_ref) const override;
143 
147  virtual std::string generate(CodeGenerator& g,
148  const std::vector<casadi_int>& arg,
149  const std::vector<bool>& arg_is_ref) const = 0;
150 
154  static MXNode* deserialize(DeserializingStream& s);
155 
156  template<class T>
157  MX jac(const MX& x, const T& coeffs) const;
158 
162  void serialize_body(SerializingStream& s) const override;
163 
164  protected:
165 
169  explicit BSplineCommon(DeserializingStream& s);
170 
171  };
172 
181  class CASADI_EXPORT BSpline : public BSplineCommon {
182  public:
183 
184  static MX create(const MX& x, const std::vector< std::vector<double> >& knots,
185  const std::vector<double>& coeffs,
186  const std::vector<casadi_int>& degree,
187  casadi_int m,
188  const Dict& opts);
189 
191  BSpline(const MX& x, const std::vector<double>& knots,
192  const std::vector<casadi_int>& offset,
193  const std::vector<double>& coeffs,
194  const std::vector<casadi_int>& degree,
195  casadi_int m,
196  const std::vector<casadi_int>& lookup_mode);
197 
199  ~BSpline() override {}
200 
202  int eval(const double** arg, double** res, casadi_int* iw, double* w) const override;
203 
207  void eval_mx(const std::vector<MX>& arg, std::vector<MX>& res) const override;
208 
212  std::string generate(CodeGenerator& g,
213  const std::vector<casadi_int>& arg,
214  const std::vector<bool>& arg_is_ref) const override;
215 
219  std::string disp(const std::vector<std::string>& arg) const override;
220 
221  // Numeric coefficients
222  std::vector<double> coeffs_;
223 
224  MX jac_cached() const override;
225 
236  static DM dual(const std::vector<double>& x,
237  const std::vector< std::vector<double> >& knots,
238  const std::vector<casadi_int>& degree,
239  const Dict& opts);
243  void serialize_body(SerializingStream& s) const override;
247  void serialize_type(SerializingStream& s) const override;
248 
252  explicit BSpline(DeserializingStream& s);
253  };
254 
255  // Symbolic coefficients
256  class CASADI_EXPORT BSplineParametric : public BSplineCommon {
257  public:
258  static MX create(const MX& x, const MX& coeffs,
259  const std::vector< std::vector<double> >& knots,
260  const std::vector<casadi_int>& degree,
261  casadi_int m,
262  const Dict& opts);
263 
265  BSplineParametric(const MX& x, const MX& coeffs,
266  const std::vector<double>& knots,
267  const std::vector<casadi_int>& offset,
268  const std::vector<casadi_int>& degree,
269  casadi_int m,
270  const std::vector<casadi_int>& lookup_mode);
271 
273  ~BSplineParametric() override {}
274 
276  int eval(const double** arg, double** res, casadi_int* iw, double* w) const override;
277 
281  void eval_mx(const std::vector<MX>& arg, std::vector<MX>& res) const override;
282 
283  MX jac_cached() const override;
284 
288  std::string generate(CodeGenerator& g,
289  const std::vector<casadi_int>& arg,
290  const std::vector<bool>& arg_is_ref) const override;
291 
295  std::string disp(const std::vector<std::string>& arg) const override;
296 
300  void serialize_type(SerializingStream& s) const override;
301 
306  };
307 
308 } // namespace casadi
310 
311 #endif // CASADI_BSPLINE_HPP
BSpline Node.
Definition: bspline.hpp:42
std::vector< casadi_int > lookup_mode_
Definition: bspline.hpp:76
std::vector< double > knots_
Definition: bspline.hpp:72
MX jac_cache_
Jacobian.
Definition: bspline.hpp:89
virtual std::string generate(CodeGenerator &g, const std::vector< casadi_int > &arg, const std::vector< bool > &arg_is_ref) const =0
Generate code for the operation.
~BSplineCommon() override
Destructor.
Definition: bspline.hpp:53
std::vector< casadi_int > degree_
Definition: bspline.hpp:74
std::vector< casadi_int > offset_
Definition: bspline.hpp:73
casadi_int coeffs_size_
Definition: bspline.hpp:81
std::vector< casadi_int > coeffs_dims_
Definition: bspline.hpp:80
std::vector< casadi_int > strides_
Definition: bspline.hpp:79
virtual MX jac_cached() const =0
casadi_int op() const override
Get the operation.
Definition: bspline.hpp:121
BSplineParametric(DeserializingStream &s)
Deserializing constructor.
Definition: bspline.hpp:305
~BSplineParametric() override
Destructor.
Definition: bspline.hpp:273
~BSpline() override
Destructor.
Definition: bspline.hpp:199
std::vector< double > coeffs_
Definition: bspline.hpp:222
Helper class for C code generation.
Helper class for Serialization.
Node class for MX objects.
Definition: mx_node.hpp:51
MX - Matrix expression.
Definition: mx.hpp:92
Helper class for Serialization.
The casadi namespace.
Definition: archiver.cpp:28
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
@ OP_BSPLINE
Definition: calculus.hpp:195