Hello all. I am trying to implement reduce_sum_static
to parallelize over N
(participants; this is why grainsize=1
), but when I compile my model in PyStan3, I get an error Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
functions {
real partial_sum(real[,] RTu_rdm, int start, int end, real[,] RTl_rdm, real[,] Cohu_rdm, real[,] Cohl_rdm,
real[] delta_rdm, real[] alpha_rdm, real[] tau_rdm, real[] beta_rdm, int w, int[] idx_rdm_obs,
int[] Nu_rdm, int[] Nl_rdm) {
real lu = 0;
real ll = 0;
real lt = 0;
if (idx_rdm_obs[start] != 0) {
vector[Nu_rdm[start]] delta_cohu;
vector[Nl_rdm[start]] delta_cohl;
delta_cohu = delta_rdm[start]*to_vector(Cohu_rdm[start,:Nu_rdm[start]]);
lu = wiener_lpdf(RTu_rdm[start, :Nu_rdm[start]] | alpha_rdm[start], tau_rdm[start], beta_rdm[start], delta_cohu);
delta_cohl = delta_rdm[start]*to_vector(Cohl_rdm[start,:Nl_rdm[start]]);
ll = wiener_lpdf(RTl_rdm[start,:Nl_rdm[start]] | alpha_rdm[start], tau_rdm[start], 1-beta_rdm[start], -delta_cohl);
}
lt = lu + ll;
return lt;
}
}
data {
int W;
int N;
int Xdim;
int exo_q_num;
vector[exo_q_num] U[N,W];
int<lower=1> W_rdm_obs[N];
int<lower=0> W_rdm_mis[N];
int<lower=0> idx_rdm_obs[N,W];
int<lower=1> P_rdm;
int<lower=0> Nu_max_rdm;
int<lower=0> Nl_max_rdm;
int<lower=0> Nu_rdm[N,W];
int<lower=0> Nl_rdm[N,W];
real RTu_rdm[N, W, Nu_max_rdm];
real RTl_rdm[N, W, Nl_max_rdm];
real Cohu_rdm[N, W, Nu_max_rdm];
real Cohl_rdm[N, W, Nl_max_rdm];
matrix[N,W] minRT_rdm;
real RTbound_rdm;
}
transformed data {
real Q = 1;
int cauchy_alpha = 5;
int<lower=1> num_par = P_rdm;
int grainsize = 1;
}
parameters {
real<lower = -pi()/2, upper = pi()/2> sigma_unif; // for cauchy reparametrization; see stan manual, chapter 22.7
vector[Xdim] mu_prior_x;
vector[Xdim] X[N,W];
matrix[Xdim, Xdim] A;
matrix[Xdim, exo_q_num] B;
matrix[num_par, Xdim] C;
real alpha_rdm_pr[N,W];
real beta_rdm_pr[N,W];
real delta_rdm_pr[N,W];
real tau_rdm_pr[N,W];
}
transformed parameters {
real<lower=0> sigma_x;
real<lower=0> sigma_v;
real<lower=0> sigma_r;
real<lower=0> sigma_a;
real<lower=0> sigma_b;
real<lower=0> sigma_c;
real<lower=0> alpha_rdm[N,W];
real<lower=0, upper=1> beta_rdm[N,W];
real<lower=0> delta_rdm[N,W];
real<lower=RTbound_rdm, upper=max(minRT_rdm[,])> tau_rdm[N,W];
sigma_x = cauchy_alpha * tan(sigma_unif);
sigma_v = cauchy_alpha * tan(sigma_unif);
sigma_r = cauchy_alpha * tan(sigma_unif);
sigma_a = cauchy_alpha * tan(sigma_unif);
sigma_b = cauchy_alpha * tan(sigma_unif);
sigma_c = cauchy_alpha * tan(sigma_unif);
for (n in 1:N) {
alpha_rdm[n] = exp(alpha_rdm_pr[n]);
delta_rdm[n] = exp(delta_rdm_pr[n]);
}
for (n in 1:N) {
for (w in 1:W) {
beta_rdm[n,w] = Phi_approx(beta_rdm_pr[n,w]);
tau_rdm[n,w] = Phi_approx(tau_rdm_pr[n,w]) * (minRT_rdm[n,w] - RTbound_rdm) + RTbound_rdm;
}
}
}
model {
mu_prior_x ~ normal(0,sigma_x); // prior on X mean
// put priors an A, B, C
to_vector(A) ~ normal(0,sigma_a);
to_vector(B) ~ normal(0,sigma_b);
to_vector(C) ~ normal(0,sigma_c);
for (w in 1:W) {
for (n in 1:N) {
if (w == 1) {
X[n,w] ~ normal(mu_prior_x,sigma_v);
}
else {
X[n,w] ~ normal((A * X[n,w] + B * U[n,w-1]), Q);
}
alpha_rdm_pr[n,w] ~ normal(C[1,] * X[n,w],sigma_r);
beta_rdm_pr[n,w] ~ normal(C[2,] * X[n,w],sigma_r);
delta_rdm_pr[n,w] ~ normal(C[3,] * X[n,w],sigma_r);
tau_rdm_pr[n,w] ~ normal(C[4,] * X[n,w],sigma_r);
}
target += reduce_sum_static(partial_sum, RTu_rdm[,w,], grainsize, RTl_rdm[,w,], Cohu_rdm[,w,],
Cohl_rdm[,w,], delta_rdm[w,], alpha_rdm[w,], tau_rdm[w,],
beta_rdm[w,], w, idx_rdm_obs[,w], Nu_rdm[,w], Nl_rdm[,w]);
}
}
Python code from PyCharm
posterior = stan.build(model, data=data)
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
Any help will be very appreciated. I feel like I am missing something fundamental here.
Thank you!