35 return (x - xmin) / (xmax - xmin);
37 return (exp(r * x) - exp(r * xmin)) / (exp(r * xmax) - exp(r * xmin));
41 return negative_infinity();
49 if (x < xmin || x > xmax) {
50 return negative_infinity();
53 return -log(xmax - xmin);
55 return log(abs(r)) + r * x -
56 log(abs(exp(r * xmax) - exp(r * xmin)));
59 array[] real primary_params, data real pwindow) {
60 int N = num_elements(p);
63 out[i] =
primary_lcdf(p[i] | primary_id, primary_params, pwindow);
68 data real d, vector boundaries, vector pmf,
69 int primary_id, array[] real primary_params, data real pwindow
71 int K = num_elements(pmf);
76 real u_min = d - pwindow;
84 if (u_max <= boundaries[2])
return negative_infinity();
87 vector[K] lo = fmax(u_min, head(boundaries, K));
88 vector[K] hi = fmin(u_max, tail(boundaries, K));
95 if (K > 1) cum_before[2:K] = head(cumulative_sum(pmf), K - 1);
100 for (k in 1:K) active[k] = hi[k] > lo[k] ? 1 : 0;
108 vector[K] f_diff = (exp(f_lo) - exp(f_hi)) .* active;
110 real integral = dot_product(cum_before, f_diff);
114 real tail_start = fmax(boundaries[K + 1], u_min);
115 if (tail_start < u_max) {
116 real fp_tail = exp(
primary_lcdf(d - tail_start | primary_id,
117 primary_params, pwindow));
119 primary_params, pwindow));
120 integral += fp_tail - fp_end;
123 return log(integral);
126 int K = num_elements(hazards);
130 log_surv[2:K] = cumulative_sum(log1m(hazards[1:(K - 1)]));
132 return hazards .* exp(log_surv);
135 data real d, vector boundaries, vector hazards,
136 int primary_id, array[] real primary_params, data real pwindow
139 d | boundaries,
hazards_to_pmf(hazards), primary_id, primary_params,
144 int K = num_elements(pmf);
145 if (t < boundaries[2])
return negative_infinity();
146 if (t >= boundaries[K + 1])
return 0;
154 while (k < K && boundaries[k + 2] <= t) k += 1;
155 return log(cumulative_sum(pmf)[k]);
161 if (primary_id != 1)
return 0;
162 return dist_id == 2 || dist_id == 1 || dist_id == 3 || dist_id == 5;
168 if (dist_id == 26 || dist_id == 27 || dist_id == 28) {
169 return primary_id == 1 || primary_id == 2;
175 real log_A = log_sum_exp(terms_d[1], terms_q[2]);
176 real log_B = log_sum_exp(terms_q[1], terms_d[2]);
180 if (log_A == negative_infinity() && log_B == negative_infinity()) {
181 return negative_infinity();
183 return log_diff_exp(log_A, log_B) - log(pwindow);
186 array[] real params) {
188 return rep_vector(negative_infinity(), 2);
190 real shape = params[1];
191 real rate = params[2];
193 real log_E = log(shape) - log(rate);
196 real log_F_T_k = gamma_lcdf(t | shape, rate);
197 real gamma_kp1_pdf_log = shape * log(rate * t) - rate * t
199 real log_F_T_kp1 = log_diff_exp(log_F_T_k, gamma_kp1_pdf_log);
200 return [log(t) + log_F_T_k, log_E + log_F_T_kp1]
';
202real primarycensored_gamma_uniform_lcdf(data real d, real q,
205 return primarycensored_uniform_lcdf_from_terms(
206 primarycensored_gamma_uniform_terms(d, params),
207 primarycensored_gamma_uniform_terms(q, params), pwindow
210vector primarycensored_lognormal_uniform_terms(real t,
211 array[] real params) {
213 real sigma = params[2];
214 real mu_sigma2 = mu + square(sigma);
215 // log E where E = exp(mu + sigma^2/2) is the mean of the delay
216 real log_E = mu + 0.5 * square(sigma);
217 real log_t_F_T = lognormal_lcdf_underflows(t, mu, sigma)
218 ? negative_infinity()
219 : log(t) + lognormal_lcdf(t | mu, sigma);
220 real log_E_tF_T = lognormal_lcdf_underflows(t, mu_sigma2, sigma)
221 ? negative_infinity()
222 : log_E + lognormal_lcdf(t | mu_sigma2, sigma);
223 return [log_t_F_T, log_E_tF_T]';
234 real x = pow(t * inv(scale), shape);
235 real a = 1 + inv(shape);
236 return log(gamma_p(a, x)) + lgamma(a);
239 array[] real params) {
241 return rep_vector(negative_infinity(), 2);
243 real shape = params[1];
244 real scale = params[2];
246 log(t) + weibull_lcdf(t | shape, scale),
250real primarycensored_weibull_uniform_lcdf(data real d, real q,
253 return primarycensored_uniform_lcdf_from_terms(
254 primarycensored_weibull_uniform_terms(d, params),
255 primarycensored_weibull_uniform_terms(q, params), pwindow
258vector primarycensored_gengamma_uniform_terms(real t,
259 array[] real params) {
261 return rep_vector(negative_infinity(), 2);
263 real shape = params[1];
264 real scale = params[2];
266 real k_shift = k + inv(shape);
267 real log_E = log(scale) + lgamma(k_shift) - lgamma(k);
269 log(t) + gengamma_lcdf(t | shape, scale, k),
270 log_E + gengamma_lcdf(t | shape, scale, k_shift)
285 array[] real primary_params) {
286 real q = max({d - pwindow, 0});
288 if (dist_id == 2 && primary_id == 1) {
290 }
else if (dist_id == 1 && primary_id == 1) {
292 }
else if (dist_id == 3 && primary_id == 1) {
294 }
else if (dist_id == 5 && primary_id == 1) {
296 }
else if (dist_id == 26) {
298 int K = (size(params) - 1) %/% 2;
300 d | to_vector(segment(params, 1, K + 1)),
301 to_vector(segment(params, K + 2, K)),
302 primary_id, primary_params, pwindow
304 }
else if (dist_id == 27 || dist_id == 28) {
308 int K = (size(params) - 1) %/% 2;
310 d | to_vector(segment(params, 1, K + 1)),
311 to_vector(segment(params, K + 2, K)),
312 primary_id, primary_params, pwindow
315 return negative_infinity();
319 data real pwindow, data real L,
320 data real D,
int primary_id,
321 array[] real primary_params) {
322 if (d <= L)
return negative_infinity();
323 if (d >= D)
return 0;
326 d, dist_id, params, pwindow, primary_id, primary_params
330 if (!is_inf(D) || L > 0) {
332 L, D, dist_id, params, pwindow, primary_id, primary_params
334 real log_cdf_L = bounds[1];
335 real log_cdf_D = bounds[2];
345 data real pwindow, data real L,
346 data real D,
int primary_id,
347 array[] real primary_params) {
353 pwindow >= 1 && floor(pwindow) == pwindow;
356 array[] real params) {
359 }
else if (dist_id == 1) {
361 }
else if (dist_id == 3) {
363 }
else if (dist_id == 5) {
366 reject(
"Invalid distribution identifier: ", dist_id);
373 int pw = to_int(pwindow);
376 array[n + 1] vector[2] terms;
377 for (t in max(start - pw, 0):n) {
382 terms[d + 1], terms[max(d - pw, 0) + 1], pwindow
388 if (dist_id == 1)
return 1;
389 if (dist_id == 2)
return 1;
390 if (dist_id == 3)
return 1;
391 if (dist_id == 4)
return 1;
392 if (dist_id == 5)
return 1;
393 if (dist_id == 9)
return 1;
394 if (dist_id == 13)
return 1;
395 if (dist_id == 16)
return 1;
396 if (dist_id == 19)
return 1;
397 if (dist_id == 21)
return 1;
398 if (dist_id == 22)
return 1;
403 if (primary_id == 1) {
406 if (p <= 0)
return negative_infinity();
407 if (p >= pwindow)
return 0;
408 return uniform_lcdf(p | 0, pwindow);
409 }
else if (primary_id == 2) {
412 reject(
"primary_lcdf: unsupported primary_id ", primary_id);
418 return (log(y) - mu) / sigma < -38 ? 1 : 0;
421 return gamma_lcdf(pow(y / scale, shape) | k, 1);
423real
dist_lcdf(real delay, array[] real params,
int dist_id) {
425 return negative_infinity();
433 ? negative_infinity()
434 : lognormal_lcdf(delay | params[1], params[2]);
436 else if (dist_id == 2)
return gamma_lcdf(delay | params[1], params[2]);
437 else if (dist_id == 3)
return weibull_lcdf(delay | params[1], params[2]);
438 else if (dist_id == 4)
return exponential_lcdf(delay | params[1]);
439 else if (dist_id == 5)
return gengamma_lcdf(delay | params[1], params[2], params[3]);
440 else if (dist_id == 9)
return beta_lcdf(delay | params[1], params[2]);
441 else if (dist_id == 12)
return cauchy_lcdf(delay | params[1], params[2]);
442 else if (dist_id == 13)
return chi_square_lcdf(delay | params[1]);
443 else if (dist_id == 15)
return gumbel_lcdf(delay | params[1], params[2]);
444 else if (dist_id == 16)
return inv_gamma_lcdf(delay | params[1], params[2]);
445 else if (dist_id == 17)
return logistic_lcdf(delay | params[1], params[2]);
446 else if (dist_id == 18)
return normal_lcdf(delay | params[1], params[2]);
447 else if (dist_id == 19)
return inv_chi_square_lcdf(delay | params[1]);
448 else if (dist_id == 20)
return double_exponential_lcdf(delay | params[1], params[2]);
449 else if (dist_id == 21)
return pareto_lcdf(delay | params[1], params[2]);
450 else if (dist_id == 22)
return scaled_inv_chi_square_lcdf(delay | params[1], params[2]);
451 else if (dist_id == 23)
return student_t_lcdf(delay | params[1], params[2], params[3]);
452 else if (dist_id == 24)
return uniform_lcdf(delay | params[1], params[2]);
453 else if (dist_id == 25)
return von_mises_lcdf(delay | params[1], params[2]);
454 else if (dist_id == 26) {
456 int K = (size(params) - 1) %/% 2;
458 delay | to_vector(segment(params, 1, K + 1)),
459 to_vector(segment(params, K + 2, K))
462 else if (dist_id == 27 || dist_id == 28) {
466 int K = (size(params) - 1) %/% 2;
468 delay | to_vector(segment(params, 1, K + 1)),
469 to_vector(segment(params, K + 2, K))
472 else reject(
"Invalid distribution identifier: ", dist_id);
474real
primary_lpdf(real x,
int primary_id, array[] real params, real xmin, real xmax) {
476 if (primary_id == 1)
return uniform_lpdf(x | xmin, xmax);
477 if (primary_id == 2)
return expgrowth_lpdf(x | xmin, xmax, params[1]);
479 reject(
"Invalid primary distribution identifier");
482 array[] real x_r, array[]
int x_i) {
484 int dist_id = x_i[1];
485 int primary_id = x_i[2];
486 real pwindow = x_r[2];
487 int dist_params_len = x_i[3];
488 int primary_params_len = x_i[4];
491 array[dist_params_len] real params;
492 if (dist_params_len) {
493 params = theta[1:dist_params_len];
495 array[primary_params_len] real primary_params;
496 if (primary_params_len) {
497 int primary_loc = num_elements(theta);
498 primary_params = theta[primary_loc - primary_params_len + 1:primary_loc];
501 real log_cdf =
dist_lcdf(t | params, dist_id);
502 real log_primary_pdf =
primary_lpdf(d - t | primary_id, primary_params, 0, pwindow);
504 return rep_vector(exp(log_cdf + log_primary_pdf), 1);
508 return log_diff_exp(log_cdf_D, log_cdf_L);
514 real log_normalizer, real L) {
516 return log_diff_exp(log_cdf, log_cdf_L) - log_normalizer;
518 return log_cdf - log_normalizer;
522 data real L, data real D,
523 data
int dist_id, array[] real params, data real pwindow,
524 data
int primary_id, array[] real primary_params
536 result[1] = negative_infinity();
539 L | dist_id, params, pwindow,
541 positive_infinity(), primary_id, primary_params
550 D | dist_id, params, pwindow,
552 positive_infinity(), primary_id, primary_params
559 data real pwindow, data real L, data real D,
561 array[] real primary_params) {
575 d | dist_id, params, pwindow, L, D, primary_id, primary_params
584 real lower_bound = d - pwindow;
585 int n_params = num_elements(params);
586 int n_primary_params = num_elements(primary_params);
587 array[n_params + n_primary_params] real theta = append_array(params, primary_params);
588 array[4]
int ids = {dist_id, primary_id, n_params, n_primary_params};
590 vector[1] y0 = rep_vector(0.0, 1);
591 result = ode_rk45(
primarycensored_ode, y0, lower_bound, {d}, theta, {d, pwindow}, ids)[1, 1];
595 if (!is_inf(D) || L > 0 ||
597 real log_result = log(result);
599 L, D, dist_id, params, pwindow, primary_id, primary_params
601 real log_cdf_L = bounds[1];
602 real log_cdf_D = bounds[2];
606 log_result, log_cdf_L, log_normalizer, L
608 result = exp(log_result);
615 data real pwindow, data real L, data real D,
617 array[] real primary_params) {
621 return negative_infinity();
633 d | dist_id, params, pwindow,
635 positive_infinity(), primary_id, primary_params
640 d | dist_id, params, pwindow,
642 positive_infinity(), primary_id, primary_params
648 if (!is_inf(D) || L > 0 ||
651 L, D, dist_id, params, pwindow, primary_id, primary_params
653 real log_cdf_L = bounds[1];
654 real log_cdf_D = bounds[2];
663 data
int dist_id, array[] real params,
664 data real pwindow, data
int primary_id,
665 array[] real primary_params) {
668 start, n, dist_id, params, pwindow
677 d | dist_id, params, pwindow,
679 positive_infinity(), primary_id, primary_params
685 data
int max_delay, data real L, data real D, data
int dist_id,
686 array[] real params, data real pwindow,
687 data
int primary_id, array[] real primary_params
690 int upper_interval = max_delay + 1;
691 vector[upper_interval] log_pmfs;
692 vector[upper_interval] log_cdfs;
696 if (D < upper_interval) {
697 reject(
"D must be at least max_delay + 1");
703 int start_idx = (!is_inf(L) && L > 0) ? max(1, to_int(floor(L))) : 1;
705 start_idx, upper_interval, dist_id, params, pwindow, primary_id,
713 log_cdf_L = negative_infinity();
714 }
else if (L >= 1 && L <= upper_interval && floor(L) == L) {
716 log_cdf_L = log_cdfs[to_int(L)];
720 L | dist_id, params, pwindow,
722 positive_infinity(), primary_id, primary_params
728 if (D > upper_interval) {
733 D | dist_id, params, pwindow,
735 positive_infinity(), primary_id, primary_params
739 log_cdf_D = log_cdfs[upper_interval];
745 for (d in 1:upper_interval) {
748 log_pmfs[d] = negative_infinity();
749 }
else if (d - 1 < L) {
751 log_pmfs[d] = log_diff_exp(log_cdfs[d], log_cdf_L) - log_normalizer;
755 log_pmfs[d] = log_cdfs[d] - log_normalizer;
760 0.0 | dist_id, params, pwindow,
761 negative_infinity(), positive_infinity(),
762 primary_id, primary_params
764 log_pmfs[d] = log_diff_exp(log_cdfs[d], log_cdf_0) - log_normalizer;
767 log_pmfs[d] = log_diff_exp(log_cdfs[d], log_cdfs[d-1]) - log_normalizer;
real phazard_lcdf(real t, vector boundaries, vector hazards)
real dist_lcdf(real delay, array[] real params, int dist_id)
vector primarycensored_sone_lpmf_vectorized(data int max_delay, data real L, data real D, data int dist_id, array[] real params, data real pwindow, data int primary_id, array[] real primary_params)
real primarycensored_apply_truncation(real log_cdf, real log_cdf_L, real log_normalizer, real L)
real primarycensored_cdf(data real d, data int dist_id, array[] real params, data real pwindow, data real L, data real D, data int primary_id, array[] real primary_params)
real primarycensored_log_normalizer(real log_cdf_D, real log_cdf_L, real L)
real pstep_lcdf(real t, vector boundaries, vector pmf)
real log_weibull_g(real t, real shape, real scale)
vector primarycensored_lcdf_vectorized(data int start, data int n, data int dist_id, array[] real params, data real pwindow, data int primary_id, array[] real primary_params)
vector primarycensored_ode(real t, vector y, array[] real theta, array[] real x_r, array[] int x_i)
real primarycensored_weibull_uniform_lcdf(data real d, real q, array[] real params, data real pwindow)
real primary_lcdf(real p, int primary_id, array[] real primary_params, data real pwindow)
real expgrowth_lcdf(real x, real xmin, real xmax, real r)
vector primarycensored_weibull_uniform_terms(real t, array[] real params)
vector primarycensored_lognormal_uniform_terms(real t, array[] real params)
real expgrowth_lpdf(real x, real xmin, real xmax, real r)
vector primarycensored_gengamma_uniform_terms(real t, array[] real params)
int check_for_uniform_terms(int dist_id, int primary_id)
vector primary_lcdf_vec(vector p, int primary_id, array[] real primary_params, data real pwindow)
int lognormal_lcdf_underflows(real y, real mu, real sigma)
real discretestep_lcdf(data real d, vector boundaries, vector pmf, int primary_id, array[] real primary_params, data real pwindow)
vector hazards_to_pmf(vector hazards)
vector primarycensored_gamma_uniform_terms(real t, array[] real params)
int check_for_analytical_vectorized(int dist_id, int primary_id, data real pwindow)
vector primarycensored_analytical_lcdf_vectorized(data int start, data int n, data int dist_id, array[] real params, data real pwindow)
real primarycensored_analytical_lcdf_raw(data real d, int dist_id, array[] real params, data real pwindow, int primary_id, array[] real primary_params)
real primarycensored_lcdf(data real d, data int dist_id, array[] real params, data real pwindow, data real L, data real D, data int primary_id, array[] real primary_params)
real primarycensored_lognormal_uniform_lcdf(data real d, real q, array[] real params, data real pwindow)
real discretehazard_lcdf(data real d, vector boundaries, vector hazards, int primary_id, array[] real primary_params, data real pwindow)
real primarycensored_analytical_lcdf(data real d, int dist_id, array[] real params, data real pwindow, data real L, data real D, int primary_id, array[] real primary_params)
real primarycensored_gengamma_uniform_lcdf(data real d, real q, array[] real params, data real pwindow)
int dist_has_positive_support(data int dist_id)
vector primarycensored_uniform_terms(real t, data int dist_id, array[] real params)
real primarycensored_gamma_uniform_lcdf(data real d, real q, array[] real params, data real pwindow)
real primarycensored_uniform_lcdf_from_terms(vector terms_d, vector terms_q, data real pwindow)
real primary_lpdf(real x, int primary_id, array[] real params, real xmin, real xmax)
real gengamma_lcdf(real y, real shape, real scale, real k)
real expgrowth_cdf(real x, real xmin, real xmax, real r)
vector primarycensored_truncation_bounds(data real L, data real D, data int dist_id, array[] real params, data real pwindow, data int primary_id, array[] real primary_params)
real primarycensored_analytical_cdf(data real d, int dist_id, array[] real params, data real pwindow, data real L, data real D, int primary_id, array[] real primary_params)
int check_for_analytical(int dist_id, int primary_id)