#ifndef SPLINES_H #define SPLINES_H #include namespace rstpm2 { /* arma::mat qr_q(const arma::mat& X, double tol = 1E-12); */ class SplineBasis { public: int order, /* order of the spline */ ordm1, /* order - 1 (3 for cubic splines) */ nknots, /* number of knots */ curs, /* current position in knots vector */ boundary, /* must have knots[(curs) <= x < knots(curs+1) */ ncoef; /* number of coefficients */ /* except for the boundary case */ arma::vec ldel; /* differences from knots on the left */ arma::vec rdel; /* differences from knots on the right */ arma::vec knots; /* knot vector */ arma::vec coeff; /* coefficients */ arma::vec a; /* scratch array */ SplineBasis(int order = 4); SplineBasis(arma::vec knots, int order = 4); int set_cursor(double x); void diff_table(double x, int ndiff); double slow_evaluate(double x, int nder); /* fast evaluation of basis functions */ arma::vec basis_funcs(double x); arma::vec eval(double x, int ders=0); arma::mat basis(arma::vec x, int ders=0); }; class bs : public SplineBasis { public: arma::vec boundary_knots, interior_knots; int intercept, df; bs(); // default constructor bs(arma::vec boundary_knots, arma::vec interior_knots, int intercept = 0); arma::vec eval(double x, int ders=0); arma::mat basis(arma::vec x, int ders=0); }; class ns : public bs { public: arma::vec tl0, tl1, tr0, tr1; arma::mat q_matrix; int cure; ns(); // default constructor // ns(vec boundary_knots, vec interior_knots, int intercept=0) : // bs(boundary_knots, interior_knots, intercept) { // // calculate the Q matrix // mat const_basis = bs::basis(boundary_knots, 2); // mat qd = qr_q(const_basis.t()); // mat qsub(qd.n_rows, qd.n_cols-2); // for (size_t i=0; i