Hi there! I am a new user to Stan, and I am currently trying to adapt a model to enable multithreading. The original model compiles well and runs without any problem, but the adapted model could not compile successfully and reports error:
PARSER FAILED TO PARSE INPUT COMPLETELY
STOPPED AT LINE 27:
Here is orginal model:
functions.stan:
functions {
real gammaModeSD_lpdf(real parm,real m,real sd) {
real r=(m+sqrt(m^2+4*sd^2))/(2*sd^2);
real s=1+m*r;
return gamma_lpdf(parm|r,s);
}
// This function can be used via: p~betaModeConc(mode,concentration);
real betaModeConc_lpdf(real parm,real m,real c) {
return beta_lpdf(parm|m*(c-2)+1, (1-m)*(c-2)+1);
}
real betaMeanConc_lpdf(real parm,real m,real c) {
return beta_lpdf(parm|m*(c-2), (1-m)*(c-2));
}
real dirichMultinom_lpmf(int[] x,int K,vector alpha) {
real alpha0=sum(alpha);
int n=sum(x);
real logP=log(n)+lbeta(alpha0,n);
for(k in 1:K)
if(x[k]>0) logP-=(x[k]+lbeta(alpha[k],x[k]));
return logP; }
}
model.stan:
#include /functions.stan
data {
int<lower=1> N_VARIANTS;
real<lower=0,upper=1> v[N_VARIANTS];
int<lower=1> N_DNA;
int<lower=0> a[N_VARIANTS,N_DNA];
int<lower=0> b[N_VARIANTS,N_DNA];
int<lower=1> N_RNA;
int<lower=0> k[N_VARIANTS,N_RNA];
int<lower=0> m[N_VARIANTS,N_RNA];
}
parameters {
real<lower=0,upper=1> p[N_VARIANTS];
real<lower=0,upper=1> qi[N_VARIANTS,N_RNA];
real<lower=0> theta[N_VARIANTS];
real<lower=2> c1; // concentration parameter of beta prior for qi
real<lower=2> c2; // concentration parameter of beta prior for p
real<lower=0> s; // std.dev. parameter of lognormal prior for theta
}
transformed parameters { // ORDER MATTERS!
real<lower=0,upper=1> q[N_VARIANTS];
for(j in 1:N_VARIANTS)
q[j]=theta[j]*p[j]/(1.0-p[j]+theta[j]*p[j]);
}
model {
// Parameters
c1 ~ gamma(1.1, 0.005);
c2 ~ gamma(1.1, 0.005);
s ~ gammaModeSD(1,1);
for(j in 1:N_VARIANTS) {
p[j] ~ betaModeConc(v[j],c2);
log(theta[j])/s ~ normal(0,1); // theta~lognormal(0,s)
target+=-log(theta[j])-log(s); // Jacobian
for(i in 1:N_RNA)
qi[j,i] ~ betaModeConc(q[j],c1);
for(i in 1:N_DNA)
a[j,i] ~ binomial(a[j,i]+b[j,i],p[j]);
for(i in 1:N_RNA)
k[j,i] ~ binomial(k[j,i]+m[j,i],qi[j,i]);
}
}
And here is my naive version of adapted model with map_rect()
function (I think I might have done it completely wrong :< ) basically I just packed all data and parameters into 3-d arrays and unpack them inside the function.
#include /functions.stan
functions{
vector f(vector alpha , vector beta , real[] xr , int[] xi ){
int n = size(xr);
int a = xi[1:M,1:N_DNA];
int b = xi[1:M,(N_DNA+1):(2*N_DNA)];
int k = xi[1:M,(2*N_DNA+1):(2*N_DNA+N_RNA)];
int m = xi[1:M,(2*N_DNA+N_RNA+1):2*(N_DNA+N_RNA)];
int p = alpha[1,1:M];
int theta = alpha[2,1:M];
int q = alpha[3,1:M];
int qi = alpha[4:(N_RNA+2), 1:M]';
vector[n] l;
for(j in 1:N_VARIANTS) {
p[j] ~ betaModeConc(v[j],beta[2]);
log(theta[j])/beta[3] ~ normal(0,1); // theta~lognormal(0,s)
l +=-log(theta[j])-log(beta[3]); // Jacobian
for(i in 1:N_RNA)
qi[j,i] ~ betaModeConc(q[j],beta[1]);
for(i in 1:N_DNA)
a[j,i] ~ binomial(a[j,i]+b[j,i],p[j]);
for(i in 1:N_RNA)
k[j,i] ~ binomial(k[j,i]+m[j,i],qi[j,i]);
}
return [l]';
}
}
data {
int<lower=2> N_VARIANTS; // number of variants in the model
real<lower=0,upper=1> v[N_VARIANTS]; // alt allele freq in VCF file
int<lower=1> N_DNA; // number of DNA replicates
int<lower=0> a[N_VARIANTS,N_DNA]; // DNA alt read counts
int<lower=0> b[N_VARIANTS,N_DNA]; // DNA ref read counts
int<lower=1> N_RNA; // number of RNA replicates
int<lower=0> k[N_VARIANTS,N_RNA]; // RNA alt read counts
int<lower=0> m[N_VARIANTS,N_RNA]; // RNA ref read counts
}
transformed data {
int N_P = 6;
int N_THREAD = 2;
int M = N_VARIANTS/N_THREAD;
matrix[M, 2*(N_DNA + N_RNA)] xi[2];
real xr[N_THREAD, M];
for ( i in 1:N_THREAD ) {
int j = 1 + (i-1)*M;
int k = i*M;
xi[i, 1:M, 1:N_DNA] = a[j:k,N_DNA];
xi[i, 1:M, N_DNA+1:2*N_DNA] = b[j:k,N_DNA];
xi[i, 1:M, 2*N_DNA+1:2*N_DNA+N_RNA] = k[j:k,N_RNA];
xi[i, 1:M,2*N_DNA+N_RNA+1:2*(N_DNA + N_RNA)] = m[j:k,N_RNA];
xr[i] = v[j:k];
}
}
parameters {
real<lower=0,upper=1> p[N_VARIANTS]; // alt allele freq in DNA
real<lower=0,upper=1> qi[N_VARIANTS,N_RNA]; // alt freqs in RNA
real<lower=0> theta[N_VARIANTS];
real<lower=2> c1; // concentration parameter of beta prior for qi
real<lower=2> c2; // concentration parameter of beta prior for p
real<lower=0> s; // std.dev. parameter of lognormal prior for theta
vector[3] beta[N_THREAD]; ////Universal Parameter for 2 shards
for (i in 1:N_THREAD){
beta[i, 1] = c1;
beta[i, 2] = c2;
beta[i, 3] = s;
}
matrix[N_RNA+3, M] alpha[N_THREAD]
for (i in 1:N_THREAD){
int j = 1 + (i-1)*M;
int k = i*M;
alpha[i, 1, 1:M] = p[j:k];
alpha[i, 2, 1:M] = theta[j:k];
alpha[i, 4:(N_RNA+2), 1:M] = qi[j:k,1:N_RNA]';
}
}
transformed parameters { // ORDER MATTERS!
real<lower=0,upper=1> q[M]; // alt allele freq in RNA
for(j in 1:M)
q[j]=theta[j]*p[j]/(1.0-p[j]+theta[j]*p[j]);
/////////////////////////////////
for (i in 1:N_THREAD){
int j = 1 + (i-1)*M;
int k = i*M;
alpha[i, 3, 1:M] = q[j:k];
}
}
model {
// Parameters
c1 ~ gamma(1.1, 0.005);
c2 ~ gamma(1.1, 0.005);
s ~ gammaModeSD(1,1);
target += sum(map_rect(f, beta , alpha , xr , xi)));
}
Any advise would be helpful! Thank you all!