/* * B-spline evaluation routine. */ static NPY_INLINE void _deBoor_D(const double *t, double x, int k, int ell, int m, double *result) { /* * On completion the result array stores * the k+1 non-zero values of beta^(m)_i,k(x): for i=ell, ell-1, ell-2, ell-k. * Where t[ell] <= x < t[ell+1]. */ /* * Implements a recursive algorithm similar to the original algorithm of * deBoor. */ double *hh = result + k + 1; double *h = result; double xb, xa, w; int ind, j, n; /* * Perform k-m "standard" deBoor iterations * so that h contains the k+1 non-zero values of beta_{ell,k-m}(x) * needed to calculate the remaining derivatives. */ result[0] = 1.0; for (j = 1; j <= k - m; j++) { memcpy(hh, h, j*sizeof(double)); h[0] = 0.0; for (n = 1; n <= j; n++) { ind = ell + n; xb = t[ind]; xa = t[ind - j]; if (xb == xa) { h[n] = 0.0; continue; } w = hh[n - 1]/(xb - xa); h[n - 1] += w*(xb - x); h[n] = w*(x - xa); } } /* * Now do m "derivative" recursions * to convert the values of beta into the mth derivative */ for (j = k - m + 1; j <= k; j++) { memcpy(hh, h, j*sizeof(double)); h[0] = 0.0; for (n = 1; n <= j; n++) { ind = ell + n; xb = t[ind]; xa = t[ind - j]; if (xb == xa) { h[m] = 0.0; continue; } w = j*hh[n - 1]/(xb - xa); h[n - 1] -= w; h[n] = w; } } }