24real 
dist_lcdf(real delay, array[] real params, 
int dist_id) {
 
   25  if (delay <= 0) 
return negative_infinity();
 
   28  if (dist_id == 1) 
return lognormal_lcdf(delay | params[1], params[2]);
 
   29  else if (dist_id == 2) 
return gamma_lcdf(delay | params[1], params[2]);
 
   30  else if (dist_id == 3) 
return normal_lcdf(delay | params[1], params[2]);
 
   31  else if (dist_id == 4) 
return exponential_lcdf(delay | params[1]);
 
   32  else if (dist_id == 5) 
return weibull_lcdf(delay | params[1], params[2]);
 
   33  else if (dist_id == 6) 
return beta_lcdf(delay | params[1], params[2]);
 
   34  else if (dist_id == 7) 
return cauchy_lcdf(delay | params[1], params[2]);
 
   35  else if (dist_id == 8) 
return chi_square_lcdf(delay | params[1]);
 
   36  else if (dist_id == 9) 
return inv_chi_square_lcdf(delay | params[1]);
 
   37  else if (dist_id == 10) 
return double_exponential_lcdf(delay | params[1], params[2]);
 
   38  else if (dist_id == 11) 
return inv_gamma_lcdf(delay | params[1], params[2]);
 
   39  else if (dist_id == 12) 
return logistic_lcdf(delay | params[1], params[2]);
 
   40  else if (dist_id == 13) 
return pareto_lcdf(delay | params[1], params[2]);
 
   41  else if (dist_id == 14) 
return scaled_inv_chi_square_lcdf(delay | params[1], params[2]);
 
   42  else if (dist_id == 15) 
return student_t_lcdf(delay | params[1], params[2], params[3]);
 
   43  else if (dist_id == 16) 
return uniform_lcdf(delay | params[1], params[2]);
 
   44  else if (dist_id == 17) 
return von_mises_lcdf(delay | params[1], params[2]);
 
   45  else reject(
"Invalid distribution identifier");
 
 
   70real 
primary_lpdf(real x, 
int primary_id, array[] real params, real min, real max) {
 
   72  if (primary_id == 1) 
return uniform_lpdf(x | min, max);
 
   73  if (primary_id == 2) 
return expgrowth_lpdf(x | min, max, params[1]);
 
   75  reject(
"Invalid primary distribution identifier");
 
 
   91                            array[] real x_r, array[] 
int x_i) {
 
   94  int primary_id = x_i[2];
 
   95  real pwindow = x_r[2];
 
   96  int dist_params_len = x_i[3];
 
   97  int primary_params_len = x_i[4];
 
  100  array[dist_params_len] real params;
 
  101  if (dist_params_len) {
 
  102    params = theta[1:dist_params_len];
 
  104  array[primary_params_len] real primary_params;
 
  105  if (primary_params_len) {
 
  106    int primary_loc = num_elements(theta);
 
  107    primary_params = theta[primary_loc - primary_params_len + 1:primary_loc];
 
  110  real log_cdf = 
dist_lcdf(t | params, dist_id);
 
  111  real log_primary_pdf = 
primary_lpdf(d - t | primary_id, primary_params, 0, pwindow);
 
  113  return rep_vector(exp(log_cdf + log_primary_pdf), 1);