Fourth argument to map_rect must be of type real

When trying to compile a model for threading/MPI I get an error and the message

Fourth argument to map_rect must be of type real[ , ] (two dimensional array of reals).
; Fifth argument to map_rect must be of type int[ , ] (two dimensional array of integers).
error in ‘/usit/abel/u1/guidopb/programming/R/stan_MPI_vs_Threading/bb1.stan’ at line 58, column 64

I understand the error message and am pretty sure that I have defined the fourth and fifth argument for map_rect correctly. Here are the relevant code snippets:

transformed data {
  int n_shards = 5;
  vector[0] theta[n_shards];
  int M = N/n_shards;
  int xr[n_shards, M*2];
  real xi[n_shards, M*K];

  for (s in 1:n_shards) {
    int i = n_shards*M - M + 1 ;
    int j = n_shards*M;
    int MK = M*K;
    xr[s,1:M] = y[i:j];
    xr[s,(M+1):(2*M)] = nT[i:j];
    for (k in 1:K)
      xi[s,(M*k-M+1):(M*k)] = to_array_1d(X[i:j,k]);
  }
}
model {
  vector[K+1] beta_phi;
  beta ~ normal(0,1);
  phi ~ normal(0,10);
  beta_phi = to_vector(append_row(beta,phi));

  target += sum( map_rect( lp_reduce , beta_phi, theta, xr, xi ) );
}

Am I overlooking something here?

FULL MODEL:

functions {
  vector lp_reduce( vector beta_phi , vector theta , real[] xr , int[] xi ) {
    int M = size(xr)/2;
    int K = size(xi)/M;
    int y[M] = xi[1:M];
    int nT[M] = xi[(M+1):(2*M)];
    matrix[M,K] X;
    vector[M] m;
    real lp;
    real phi = beta_phi[K+1];
    vector[K] beta = beta_phi[1:K];
    for (k in 1:K)
       X[1:M,k] = to_vector(xr[(M*k-M+1):(M*k)]);
    m = inv_logit(X * beta);

    lp = beta_binomial_lpmf(y | nT, m*phi, (1-m)*phi);
    return [lp]';
  }
}

data {
  int<lower=0> N;
  int<lower=0> K;
  matrix[N,K] X;
  int y[N];
  int nT[N];
}

transformed data {
  int n_shards = 5;
  vector[0] theta[n_shards];
  int M = N/n_shards;
  int xr[n_shards, M*2];
  real xi[n_shards, M*K];

  for (s in 1:n_shards) {
    int i = n_shards*M - M + 1 ;
    int j = n_shards*M;
    int MK = M*K;
    xr[s,1:M] = y[i:j];
    xr[s,(M+1):(2*M)] = nT[i:j];
    for (k in 1:K)
      xi[s,(M*k-M+1):(M*k)] = to_array_1d(X[i:j,k]);
  }
}

parameters {
  vector[K] beta;
  real<lower=0> phi;
}

model {
  vector[K+1] beta_phi;
  beta ~ normal(0,1);
  phi ~ normal(0,10);
  beta_phi = to_vector(append_row(beta,phi));

  target += sum( map_rect( lp_reduce , beta_phi, theta, xr, xi ) );
}

it should be

transformed data {
  int n_shards = 5;
  vector[0] theta[n_shards];
  int M = N/n_shards;
  int xi[n_shards, M*2];
  real xr[n_shards, M*K];

  for (s in 1:n_shards) {
    int i = n_shards*M - M + 1 ;
    int j = n_shards*M;
    int MK = M*K;
    xi[s,1:M] = y[i:j];
    xi[s,(M+1):(2*M)] = nT[i:j];
    for (k in 1:K) {
      int sidx = (M*k-M+1);
      int eidx = (M*k);
      xr[s,sidx:eidx] = to_array_1d(X[i:j,k]);
    }
  }
}

(in particular int xi[n_shards, M*2]; and not real xi[n_shards, M*2]; etc.)

Not quite… you flipped int and real