Hi,
I am trying to build a model in stan and running in to an error when compiling the stan source.
functions {
real wt_integrand(real t, real tc, real[] theta, real[] x_r, int[] x_i) {
//w[t] = o*(1-c) * [(1-I) + (I*(1-d)) ]
real it_a = theta[1];
real it_b = theta[2];
real ot_a = theta[3];
real ot_b = theta[4];
real T = theta[5];
real p_c = theta[6];
real p_d = theta[7];
real likelihood;
real I;
real o;
I = gamma_lcdf(T-t | it_a, it_b);
o = gamma_lpdf(t | ot_a, ot_b);
likelihood = o+p_c + log_diff_exp(0,p_c) + log_sum_exp(log_diff_exp(0,I), I+log_diff_exp(0,p_d));
return(likelihood);
}
real wt_prob(real T, real it_a, real it_b, real ot_a, real ot_b, real c, real d) {
real NO = log_diff_exp(0,gamma_lcdf(T | ot_a, ot_b));
return(log_sum_exp(NO, integrate_1d(wt_integrand, 0, T, {it_a,it_b,ot_a,ot_b,T,c,d}, {1.0}, {1}, 0.001)));
}
real yt_integrand(real t, real tc, real[] theta, real[] x_r, int[] x_i) {
real it_a = theta[1];
real it_b = theta[2];
real ot_a = theta[3];
real ot_b = theta[4];
real t_star = theta[5];
real p_c = theta[6];
real p_d = theta[7];
real likelihood;
likelihood = gamma_lpdf(t | ot_a, ot_b) + log_sum_exp(0,p_c) + gamma_lpdf(t_star-t | it_a, it_b) + p_d ;
return(likelihood);
}
real yt_prob(real t_star, real it_a, real it_b, real ot_a, real ot_b, real T, real c, real d) {
real ON = gamma_lpdf(t_star | ot_a, ot_b) + c;
return(log_sum_exp(ON, integrate_1d(yt_integrand, 0, T, {it_a,it_b,ot_a,ot_b,t_star,c,d}, {1.0}, {1}, 0.001)));
}
}
data {
int N_T_NR_T; // no response starting at target - not a glitch
int N_T_NR_F; // no response starting at nontarget - onset/no response + onset/identity/no response
int N_T_F_F; // glitch
int N_T_T_F; // glitch
int N_T_F_T; // onset + identity + glitch
int N_F_NR_F;
int N_F_NR_N;
int N_F_N_F;
int N_F_N_N;
int C; // number of columns
matrix[N_T_NR_T,C] T_no_T ;
matrix[N_T_NR_F,C] T_no_F ;
matrix[N_T_F_F,C] T_F_to_F;
matrix[N_T_T_F,C] T_T_to_F;
matrix[N_T_F_T,C] T_F_to_T;
matrix[N_F_NR_F,C] F_no_F;
matrix[N_F_NR_N,C] F_no_N;
matrix[N_F_N_F,C] F_N_to_F;
matrix[N_F_N_N,C] F_N_to_N;
}
parameters {
// glitch response
real<lower=0,upper=200> gt_a;
real<lower=0,upper=2> gt_b;
real<lower=0, upper=1> p_e;
// change detection
real<lower=0,upper=200> ot_a;
real<lower=0,upper=2> ot_b;
real<lower=0, upper=1> p_c;
// identity detection
real<lower=0,upper=200> it_a;
real<lower=0,upper=2> it_b;
real<lower=0, upper=1> p_d;
// hyperparameters
// real<lower=0,upper=200> it_a_hyper;
// real<lower=0,upper=200> gt_a_hyper;
// real<lower=0,upper=200> ot_a_hyper;
// real<lower=0, upper=10> pc_a;
// real<lower=0, upper=10> pd_a;
// real<lower=0, upper=10> pe_a;
}
model {
real y;
real T;
real G;
real O;
real y_pdf;
// it_a ~ gamma(it_a_hyper, 1);
// it_b ~ gamma(1, 1);
// gt_a ~ gamma(gt_a_hyper, 1);
// gt_b ~ gamma(1, 1);
// ot_a ~ gamma(ot_a_hyper, 1);
// ot_b ~ gamma(1,1);
// p_c ~ beta(pc_a, 1);
// p_d ~ beta(pd_a, 1);
// p_e ~ beta(pd_a, 1);
// targets
for(i in 1:N_T_NR_T) {
T = T_no_T[i,1];
G = gamma_lcdf(T | gt_a, gt_b) + p_e;
target += log_diff_exp(0,G);
}
for(i in 1:N_T_NR_F) {
T = T_no_T[i,1];
G = gamma_lcdf(T | gt_a, gt_b) + p_e;
target += log_diff_exp(0,G) + wt_prob(T, it_a, it_b, ot_a, ot_b, p_c, p_d);
}
for(i in 1:N_T_F_F) {
y = T_F_to_F[i,3];
target += gamma_lpdf(y | gt_a, gt_b) + p_e;
}
for(i in 1:N_T_T_F) {
y = T_T_to_F[i,3];
target += gamma_lpdf(y | gt_a, gt_b) + p_e;
}
for(i in 1:N_T_F_T) {
y = T_F_to_T[i,3];
T = T_F_to_T[i,1];
G = gamma_lcdf(T | gt_a, gt_b) + p_e;
y_pdf = log_sum_exp(gamma_lpdf(y | ot_a, ot_b)+p_c, yt_prob(y, it_a, it_b, ot_a, ot_b, T, p_c, p_d));
target += log_diff_exp(0,G) + log_diff_exp(log_sum_exp( gamma_lpdf(y | gt_a, gt_b)+p_e, y_pdf), gamma_lpdf(y | gt_a, gt_b)+p_e+y_pdf);
}
// foils
for(i in 1:N_F_NR_F) {
T = F_no_F[i,1];
G = gamma_lcdf(T | gt_a, gt_b) + p_e;
target += log_diff_exp(0,G);
}
for(i in 1:N_F_NR_N) {
T = F_no_N[i,1];
G = gamma_lcdf(T | gt_a, gt_b) + p_e;
O = gamma_lcdf(T | ot_a, ot_b);
// use the expected onset time log(ot_a/ot_b), because there is no response
target += log_diff_exp(0,G) + log_sum_exp(log_diff_exp(0,O), log(ot_a/ot_b)+log_diff_exp(0,p_c) ) ;
}
for(i in 1:N_F_N_F) {
y = F_N_to_F[i,3];
target += gamma_lpdf(y | gt_a, gt_b) + p_e;
}
for(i in 1:N_F_N_N) {
y = F_N_to_N[i,3];
G = gamma_lcdf(T | gt_a, gt_b) + p_e;
target += log_sum_exp(gamma_lpdf(y | gt_a, gt_b)+p_e, log_diff_exp(0,G)) + gamma_lpdf(y | ot_a, ot_b) + p_c;
}
}
The error which the compiler spits out is
g++ -I/usr/share/R/include -DNDEBUG -I"/home/kiran/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include/" -I"/home/kiran/R/x86_64-pc-linux-gnu-library/3.4/RcppEigen/include/" -I"/home/kiran/R/x86_64-pc-linux-gnu-library/3.4/RcppEigen/include/unsupported" -I"/home/kiran/R/x86_64-pc-linux-gnu-library/3.4/BH/include" -I"/home/kiran/R/x86_64-pc-linux-gnu-library/3.4/StanHeaders/include/src/" -I"/home/kiran/R/x86_64-pc-linux-gnu-library/3.4/StanHeaders/include/" -I"/home/kiran/R/x86_64-pc-linux-gnu-library/3.4/rstan/include" -DEIGEN_NO_DEBUG -DBOOST_DISABLE_ASSERTS -fpic -O3 -march=native -mtune=native -fPIC -c file31d04280f59c.cpp -o file31d04280f59c.o
/usr/lib/R/etc/Makeconf:168: recipe for target 'file31d04280f59c.o' failed
Error in compileCode(f, code, language = language, verbose = verbose) :
Compilation ERROR, function(s)/method(s) not created! In file included from /home/kiran/R/x86_64-pc-linux-gnu-library/3.4/RcppEigen/include/Eigen/Core:383:0,
from /home/kiran/R/x86_64-pc-linux-gnu-library/3.4/RcppEigen/include/Eigen/Dense:1,
from /home/kiran/R/x86_64-pc-linux-gnu-library/3.4/StanHeaders/include/stan/math/prim/mat/fun/Eigen.hpp:4,
from /home/kiran/R/x86_64-pc-linux-gnu-library/3.4/StanHeaders/include/stan/math/rev/core/build_vari_array.hpp:4,
from /home/kiran/R/x86_64-pc-linux-gnu-library/3.4/StanHeaders/include/stan/math/rev/core.hpp:5,
from /home/kiran/R/x86_64-pc-linux-gnu-library/3.4/StanHeaders/include/stan/math/rev/mat.hpp:4,
from /home/kiran/R/x86_64-pc-linux-gnu-library/3.4/StanHeaders/include/stan/math.hpp:4,
from /home/kiran/R/x86_64-pc-linux-gnu-library/3.4/StanHeaders/include/src/stan/model/model_header.hpp:4,
from
This error does not give me a great idea of where the error occurs but from the looks of where the verbose output stops it might be in Eigen?
Please let me know if I am missing something or if more information can be provided to highlight some issues.