26 #ifndef CASADI_BSPLINE_INTERPOLANT_HPP
27 #define CASADI_BSPLINE_INTERPOLANT_HPP
29 #include "casadi/core/interpolant_impl.hpp"
30 #include <casadi/solvers/casadi_interpolant_bspline_export.h>
59 const std::vector<double>& grid,
60 const std::vector<casadi_int>& offset,
61 const std::vector<double>& values,
71 std::string
class_name()
const override {
return "BSplineInterpolant";}
75 const std::vector<double>& grid,
76 const std::vector<casadi_int>& offset,
77 const std::vector<double>& values,
86 void init(
const Dict& opts)
override;
89 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w,
void* mem)
const override;
94 Function get_jacobian(
const std::string& name,
95 const std::vector<std::string>& inames,
96 const std::vector<std::string>& onames,
97 const Dict& opts)
const override;
108 Function get_forward(casadi_int nfwd,
const std::string& name,
109 const std::vector<std::string>& inames,
110 const std::vector<std::string>& onames,
111 const Dict& opts)
const override;
121 Function get_reverse(casadi_int nadj,
const std::string& name,
122 const std::vector<std::string>& inames,
123 const std::vector<std::string>& onames,
124 const Dict& opts)
const override;
149 void find(std::map<FunctionInternal*, Function>& all_fun, casadi_int max_depth)
const override;
153 casadi_int* iw,
bvec_t* w,
void* mem)
const override {
159 casadi_int* iw,
bvec_t* w,
void* mem)
const override {
163 static std::vector<double> greville_points(
const std::vector<double>& x, casadi_int deg);
174 static std::vector<double> not_a_knot(
const std::vector<double>& x, casadi_int k);
176 template <
typename M>
177 MX construct_graph(
const MX& x,
const M& values,
const Dict& linsol_options,
const Dict& opts);
189 template <
typename M>
191 const Dict& linsol_options,
const Dict& opts) {
193 std::vector< std::vector<double> > grid;
194 for (casadi_int k=0;k<
degree_.size();++k) {
196 grid.push_back(local_grid);
200 for (
auto&& op : opts) {
201 if (op.first==
"inline") {
213 std::vector< std::vector<double> > knots;
214 for (casadi_int k=0;k<
degree_.size();++k)
223 M V = M::reshape(values,
m_, -1).T();
227 double fit =
static_cast<double>(
norm_1(mtimes(J, C_opt) - V));
228 if (
verbose_) casadi_message(
"Lookup table fitting error: " +
str(fit));
235 casadi_int n_dim =
degree_.size();
244 std::vector< std::vector<double> > egrid;
245 std::vector< std::vector<double> > new_grid;
247 for (casadi_int k=0;k<n_dim;++k) {
248 casadi_assert(
degree_[k]==3,
"Only degree 3 supported for 'smooth_linear'.");
251 const std::vector<double>& g = grid[k];
255 for (casadi_int i=0;i<g.size()-1;++i) {
256 double delta = g[i+1]-g[i];
257 if (delta<m) m = delta;
262 std::vector<double> new_g;
263 new_g.push_back(g.front());
264 new_g.push_back(g.front()+step);
265 for (casadi_int i=1;i<g.size()-1;++i) {
266 new_g.push_back(g[i]-step);
267 new_g.push_back(g[i]);
268 new_g.push_back(g[i]+step);
270 new_g.push_back(g.back()-step);
271 new_g.push_back(g.back());
272 new_grid.push_back(new_g);
275 double v1 = new_g.front();
276 double vend = new_g.back();
277 new_g.insert(new_g.begin(),
degree_[k], v1);
278 new_g.insert(new_g.end(),
degree_[k], vend);
286 std::vector<double> mg =
meshgrid(egrid);
287 casadi_int N = mg.size()/n_dim;
293 res = linear(std::vector<M>{M(arg), values});
295 res = linear(std::vector<M>{M(arg)});
301 casadi_assert_dev(
false);
'bspline' plugin for Interpolant
std::string linear_solver_
Only used during init, no need to serialize these.
int sp_reverse(bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w, void *mem) const override
Propagate sparsity backwards.
static std::vector< double > not_a_knot(const std::vector< double > &x, casadi_int k)
int sp_forward(const bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w, void *mem) const override
Propagate sparsity forward.
std::vector< casadi_int > degree_
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize with type disambiguation.
MX construct_graph(const MX &x, const M &values, const Dict &linsol_options, const Dict &opts)
static Interpolant * creator(const std::string &name, const std::vector< double > &grid, const std::vector< casadi_int > &offset, const std::vector< double > &values, casadi_int m)
Create a new Interpolant.
FittingAlgorithm algorithm_
bool has_jacobian() const override
Full Jacobian.
const char * plugin_name() const override
const Options & get_options() const override
Options.
static std::vector< double > greville_points(const std::vector< double > &x, casadi_int deg)
double smooth_linear_frac_
static const Options options_
Options.
bool has_reverse(casadi_int nadj) const override
Return function that calculates adjoint derivatives reverse(nadj) returns a cached instance if availa...
bool get_diff_in(casadi_int i) override
Which inputs are differentiable?
std::string class_name() const override
Get type name.
static const std::string meta_doc
A documentation string.
bool has_codegen() const override
Is codegen supported?
bool has_forward(casadi_int nfwd) const override
Return function that calculates forward derivatives forward(nfwd) returns a cached instance if availa...
Helper class for C code generation.
Helper class for Serialization.
virtual int sp_forward(const bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w, void *mem) const
Propagate sparsity forward.
virtual int sp_reverse(bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w, void *mem) const
Propagate sparsity backwards.
casadi_int size2() const
Get the second dimension (i.e. number of columns)
casadi_int size1() const
Get the first dimension (i.e. number of rows)
std::vector< std::string > lookup_modes_
static std::vector< double > meshgrid(const std::vector< std::vector< double > > &grid)
std::vector< casadi_int > offset_
std::vector< double > grid_
std::vector< double > values_
bool has_parametric_values() const
Is parametric?
MX T() const
Transpose the matrix.
static MX bspline(const MX &x, const DM &coeffs, const std::vector< std::vector< double > > &knots, const std::vector< casadi_int > °ree, casadi_int m, const Dict &opts=Dict())
static DM bspline_dual(const std::vector< double > &x, const std::vector< std::vector< double > > &knots, const std::vector< casadi_int > °ree, const Dict &opts=Dict())
static Matrix< double > reshape(const Matrix< double > &x, casadi_int nrow, casadi_int ncol)
Base class for FunctionInternal and LinsolInternal.
bool verbose_
Verbose printout.
Helper class for Serialization.
Function interpolant(const std::string &name, const std::string &solver, const std::vector< std::vector< double > > &grid, const std::vector< double > &values, const Dict &opts)
T norm_1(const std::vector< T > &x)
unsigned long long bvec_t
std::vector< casadi_int > find(const std::vector< T > &v)
find nonzeros
std::string str(const T &v)
String representation, any type.
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
MX do_inline(const MX &x, const std::vector< std::vector< double > > &knots, const MX &coeffs, casadi_int m, const std::vector< casadi_int > °ree, const std::vector< casadi_int > &lookup_mode)
Options metadata for a class.