26 #ifndef CASADI_BSPLINE_IMPL_HPP
27 #define CASADI_BSPLINE_IMPL_HPP
29 #include "bspline.hpp"
30 #include "interpolant_impl.hpp"
31 #include "casadi_low.hpp"
37 const std::vector<double>& knots,
38 const std::vector<casadi_int>& offset,
39 const std::vector<casadi_int>& degree,
40 const std::vector<casadi_int>& coeffs_dims,
const M& coeffs,
41 std::vector< std::vector<double> >& new_knots,
42 std::vector<casadi_int>& new_degree) {
43 casadi_int n_dims = degree.size();
46 casadi_int n = n_knots-degree[i]-1;
48 DM delta_knots = K(
range(1+degree[i], n_knots-1))
49 - K(
range(1, n_knots-degree[i]-1));
52 DM delta_knots_inv = 1/delta_knots;
53 DM T =
DM(sp_diag, -delta_knots_inv) +
DM(sp_band, delta_knots_inv);
56 std::vector<casadi_int> coeffs_dims_new = coeffs_dims;
57 coeffs_dims_new[i+1] =
T.size1();
62 std::vector<casadi_int> order =
range(n_dims+1);
63 std::swap(order.back(), order[i+1]);
65 M coeff_matrix = coeffs.nz(
mapping);
68 coeff_matrix = reshape(coeff_matrix, -1,
T.size2());
71 coeff_matrix = mtimes(coeff_matrix,
T.T());
75 coeff_matrix = coeff_matrix.nz(
mapping);
79 for (casadi_int k=0;k<degree.size();++k) {
83 new_degree.push_back(degree[k]-1);
87 new_degree.push_back(degree[k]);
97 casadi_int n_dims =
degree_.size();
98 std::vector<MX> parts;
101 std::vector<std::string> lookup_mode;
103 opts[
"lookup_mode"] = lookup_mode;
106 for (casadi_int k=0;k<n_dims;++k) {
107 std::vector< std::vector<double> > knots;
108 std::vector< casadi_int> degree;
114 return horzcat(parts);
std::vector< casadi_int > lookup_mode_
std::vector< double > knots_
std::vector< casadi_int > degree_
std::vector< casadi_int > offset_
std::vector< casadi_int > coeffs_dims_
static M derivative_coeff(casadi_int i, const std::vector< double > &knots, const std::vector< casadi_int > &offset, const std::vector< casadi_int > °ree, const std::vector< casadi_int > &coeffs_dims, const M &coeffs, std::vector< std::vector< double > > &new_knots, std::vector< casadi_int > &new_degree)
MX jac(const MX &x, const T &coeffs) const
static std::string lookup_mode_from_enum(casadi_int lookup_mode)
virtual casadi_int offset() const
virtual Matrix< casadi_int > mapping() const
Get an IM representation of a GetNonzeros or SetNonzeros node.
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 Sparsity diag(casadi_int nrow)
Create diagonal sparsity pattern *.
static Sparsity band(casadi_int n, casadi_int p)
Create a single band in a square sparsity pattern.
std::vector< casadi_int > range(casadi_int start, casadi_int stop, casadi_int step, casadi_int len)
Range function.
std::vector< casadi_int > tensor_permute_mapping(const std::vector< casadi_int > &dims, const std::vector< casadi_int > &order)
Computes a mapping for a (dense) tensor permutation.
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
T * get_ptr(std::vector< T > &v)
Get a pointer to the data contained in the vector.
std::vector< T > permute(const std::vector< T > &a, const std::vector< casadi_int > &order)
permute a list