User-defined recursive function error

Dear reader,

I am trying to fit a b-spline model, where I create a recursive function basis, however it doesn’t seem to be able to find itself or, potentially, go deep enough to reach the base case (degree=0) and solve the recursion. This function is called by another user-defined function but I don’t think that’s the problem. My function and the associated error message is below.

functions {    
  vector basis(vector x, int degree, int i, vector knots) {
    int N;
    vector[N] OUT1;
    vector[N] OUT2;
    vector[N] alpha1;
    vector[N] alpha2;
    vector[N] B;
    N = num_elements(x);
      for(j in 1:N){
        if((x[j]>=knots[i]) && (x[j] < knots[i+1])){
          B[j] = 1;
          B[j] = 0;
      if((knots[degree+i] - knots[i])>0){
        for(j in 1:N){        
          alpha1[j] = (x[j] - knots[i])/(knots[degree+i] - knots[i]);
        alpha1 = rep_vector(0,N);
      if((knots[i+degree+1] - knots[i+1])>0){
        for(j in 1:N){
          alpha2[j] = (knots[i+degree+1] - x[j])/(knots[i+degree+1] - knots[i+1]);
        alpha2 = rep_vector(0,N);
      OUT1 = basis(x,degree-1,i,knots);
      OUT2 = basis(x,degree-1,(i+1),knots);
      for(j in 1:N){
        B[j] = alpha1[j]*OUT1[j]+alpha2[j]*OUT2[j];
    return B;

the error message:

No matches for: 

  basis(vector, int, int, vector)

Function basis not found.
 error in '...' at line 33, column 38
    31:         alpha2 = rep_vector(0,N);
    32:       }
    33:       OUT1 = basis(x,degree-1,i,knots);
    34:       OUT2 = basis(x,degree-1,(i+1),knots);

Can you try the rstan preview:

remove.packages(c("StanHeaders", "rstan"))
install.packages("rstan", repos = c("", getOption("repos")))

Your model compiles fine for me with that

@andrjohns Thanks for your time. I personally can’t do it, but I’ll ask my admin to help. Do you know why that solves the problem?

The preview contains a newer version of the Stan model parser, which appears to more compatible with recursive functions

On older versions it should be possible to declare a recursive function using a C-style forward declaration like

  vector basis(vector x, int degree, int i, vector knots);

Before the definition