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"
36 M BSplineCommon::derivative_coeff(casadi_int i,
const M& coeffs)
const {
37 casadi_int n_dims = degree_.size();
39 casadi_int n_knots = offset_[i+1]-offset_[i];
40 casadi_int n = n_knots-degree_[i]-1;
41 DM knots = std::vector<double>(get_ptr(knots_)+offset_[i], get_ptr(knots_)+offset_[i+1]);
42 DM delta_knots = knots(range(1+degree_[i], n_knots-1))
43 - knots(range(1, n_knots-degree_[i]-1));
45 Sparsity sp_band = vertsplit(
Sparsity::band(n, -1), {0, n-1, n})[0];
46 DM delta_knots_inv = 1/delta_knots;
47 DM T =
DM(sp_diag, -delta_knots_inv) +
DM(sp_band, delta_knots_inv);
50 std::vector<casadi_int> coeffs_dims_new = coeffs_dims_;
51 coeffs_dims_new[i+1] = T.size1();
56 std::vector<casadi_int> order = range(n_dims+1);
57 std::swap(order.back(), order[i+1]);
58 std::vector<casadi_int> mapping = tensor_permute_mapping(coeffs_dims_, order);
59 M coeff_matrix = coeffs.nz(mapping);
62 coeff_matrix = reshape(coeff_matrix, -1, T.size2());
65 coeff_matrix = mtimes(coeff_matrix, T.T());
68 mapping = tensor_permute_mapping(permute(coeffs_dims_new, order), order);
69 coeff_matrix = coeff_matrix.nz(mapping);
76 MX BSplineCommon::jac(
const MX& x,
const T& coeffs)
const {
77 casadi_int n_dims = degree_.size();
78 std::vector<MX> parts;
81 std::vector<std::string> lookup_mode;
82 for (
auto e : lookup_mode_) lookup_mode.push_back(Low::lookup_mode_from_enum(e));
83 opts[
"lookup_mode"] = lookup_mode;
86 for (casadi_int k=0;k<n_dims;++k) {
87 std::vector< std::vector<double> > knots;
88 std::vector< casadi_int> degree;
89 for (casadi_int i=0;i<degree_.size();++i) {
92 std::vector<double>(get_ptr(knots_)+offset_[i]+1, get_ptr(knots_)+offset_[i+1]-1));
93 degree.push_back(degree_[i]-1);
96 std::vector<double>(get_ptr(knots_)+offset_[i], get_ptr(knots_)+offset_[i+1]));
97 degree.push_back(degree_[i]);
100 MX d =
MX::bspline(x, derivative_coeff(k, coeffs), knots, degree, m_, opts);
104 return horzcat(parts);
static Sparsity band(casadi_int n, casadi_int p)
Create a single band in a square sparsity pattern.
static Sparsity diag(casadi_int nrow)
Create diagonal sparsity pattern *.
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.