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  static void check_coeffs(casadi_int n, casadi_int m, const std::vector<casadi_int>& offset,
63  const std::vector<casadi_int>& degree);
64 
65  template<class M>
66  static M derivative_coeff(casadi_int i,
67  const std::vector< std::vector<double> >& knots,
68  const std::vector<casadi_int>& degree,
69  const std::vector<casadi_int>& coeffs_dims,
70  const M& coeffs,
71  std::vector< std::vector<double> >& new_knots,
72  std::vector<casadi_int>& new_degree);
73 
74  std::vector<double> knots_;
75  std::vector<casadi_int> offset_;
76  std::vector<casadi_int> degree_;
77  casadi_int m_;
78  std::vector<casadi_int> lookup_mode_;
79 
80  // Derived fields
81  std::vector<casadi_int> strides_;
82  std::vector<casadi_int> coeffs_dims_;
83  casadi_int coeffs_size_;
84 
91  mutable MX jac_cache_;
92 
93 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
95  mutable std::mutex jac_cache_mtx_;
96 #endif // CASADI_WITH_THREADSAFE_SYMBOLICS
97 
98  virtual MX jac_cached() const = 0;
99 
103  static size_t n_iw(const std::vector<casadi_int> &degree);
104 
108  static size_t n_w(const std::vector<casadi_int> &degree);
109 
113  size_t sz_iw() const override;
114 
118  size_t sz_w() const override;
119 
123  casadi_int op() const override { return OP_BSPLINE;}
124 
128  void ad_forward(const std::vector<std::vector<MX> >& fseed,
129  std::vector<std::vector<MX> >& fsens) const override;
130 
134  void ad_reverse(const std::vector<std::vector<MX> >& aseed,
135  std::vector<std::vector<MX> >& asens) const override;
136 
140  void generate(CodeGenerator& g,
141  const std::vector<casadi_int>& arg,
142  const std::vector<casadi_int>& res,
143  const std::vector<bool>& arg_is_ref,
144  std::vector<bool>& res_is_ref) const override;
145 
149  virtual std::string generate(CodeGenerator& g,
150  const std::vector<casadi_int>& arg,
151  const std::vector<bool>& arg_is_ref) const = 0;
152 
156  static MXNode* deserialize(DeserializingStream& s);
157 
158  template<class T>
159  MX jac(const MX& x, const T& coeffs) const;
160 
164  void serialize_body(SerializingStream& s) const override;
165 
166  protected:
167 
171  explicit BSplineCommon(DeserializingStream& s);
172 
173  };
174 
183  class CASADI_EXPORT BSpline : public BSplineCommon {
184  public:
185 
186  static MX create(const MX& x, const std::vector< std::vector<double> >& knots,
187  const std::vector<double>& coeffs,
188  const std::vector<casadi_int>& degree,
189  casadi_int m,
190  const Dict& opts);
191 
193  BSpline(const MX& x, const std::vector<double>& knots,
194  const std::vector<casadi_int>& offset,
195  const std::vector<double>& coeffs,
196  const std::vector<casadi_int>& degree,
197  casadi_int m,
198  const std::vector<casadi_int>& lookup_mode);
199 
201  ~BSpline() override {}
202 
204  int eval(const double** arg, double** res, casadi_int* iw, double* w) const override;
205 
209  void eval_mx(const std::vector<MX>& arg, std::vector<MX>& res,
210  const std::vector<bool>& unique={}) const override;
211 
215  std::string generate(CodeGenerator& g,
216  const std::vector<casadi_int>& arg,
217  const std::vector<bool>& arg_is_ref) const override;
218 
222  std::string disp(const std::vector<std::string>& arg) const override;
223 
224  // Numeric coefficients
225  std::vector<double> coeffs_;
226 
227  MX jac_cached() const override;
228 
239  static DM dual(const std::vector<double>& x,
240  const std::vector< std::vector<double> >& knots,
241  const std::vector<casadi_int>& degree,
242  const Dict& opts);
246  void serialize_body(SerializingStream& s) const override;
250  void serialize_type(SerializingStream& s) const override;
251 
255  explicit BSpline(DeserializingStream& s);
256  };
257 
258  // Symbolic coefficients
259  class CASADI_EXPORT BSplineParametric : public BSplineCommon {
260  public:
261  static MX create(const MX& x, const MX& coeffs,
262  const std::vector< std::vector<double> >& knots,
263  const std::vector<casadi_int>& degree,
264  casadi_int m,
265  const Dict& opts);
266 
268  static MX create(const MX& x, const MX& coeffs,
269  const std::vector<MX>& knots,
270  const std::vector<casadi_int>& degree,
271  casadi_int m,
272  const Dict& opts);
273 
275  BSplineParametric(const MX& x, const MX& coeffs,
276  const std::vector<double>& knots,
277  const std::vector<casadi_int>& offset,
278  const std::vector<casadi_int>& degree,
279  casadi_int m,
280  const std::vector<casadi_int>& lookup_mode);
281 
283  ~BSplineParametric() override {}
284 
286  int eval(const double** arg, double** res, casadi_int* iw, double* w) const override;
287 
291  void eval_mx(const std::vector<MX>& arg, std::vector<MX>& res,
292  const std::vector<bool>& unique={}) const override;
293 
294  MX jac_cached() const override;
295 
299  std::string generate(CodeGenerator& g,
300  const std::vector<casadi_int>& arg,
301  const std::vector<bool>& arg_is_ref) const override;
302 
306  std::string disp(const std::vector<std::string>& arg) const override;
307 
311  void serialize_type(SerializingStream& s) const override;
312 
317  };
318 
319 } // namespace casadi
321 
322 #endif // CASADI_BSPLINE_HPP
BSpline Node.
Definition: bspline.hpp:42
std::vector< casadi_int > lookup_mode_
Definition: bspline.hpp:78
std::vector< double > knots_
Definition: bspline.hpp:74
MX jac_cache_
Jacobian.
Definition: bspline.hpp:91
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:76
std::vector< casadi_int > offset_
Definition: bspline.hpp:75
casadi_int coeffs_size_
Definition: bspline.hpp:83
std::vector< casadi_int > coeffs_dims_
Definition: bspline.hpp:82
std::vector< casadi_int > strides_
Definition: bspline.hpp:81
virtual MX jac_cached() const =0
casadi_int op() const override
Get the operation.
Definition: bspline.hpp:123
BSplineParametric(DeserializingStream &s)
Deserializing constructor.
Definition: bspline.hpp:316
~BSplineParametric() override
Destructor.
Definition: bspline.hpp:283
~BSpline() override
Destructor.
Definition: bspline.hpp:201
std::vector< double > coeffs_
Definition: bspline.hpp:225
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:145
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