10 return (x - xmin) / (xmax - xmin);
12 return (exp(r * x) - exp(r * xmin)) / (exp(r * xmax) - exp(r * xmin));
16 return negative_infinity();
24 if (x < xmin || x > xmax) {
25 return negative_infinity();
28 return -log(xmax - xmin);
30 return log(abs(r)) + r * x -
31 log(abs(exp(r * xmax) - exp(r * xmin)));
34 array[] real primary_params, data real pwindow) {
35 int N = num_elements(p);
38 out[i] =
primary_lcdf(p[i] | primary_id, primary_params, pwindow);
43 data real d, vector boundaries, vector pmf,
44 int primary_id, array[] real primary_params, data real pwindow
46 int K = num_elements(pmf);
51 real u_min = d - pwindow;
59 if (u_max <= boundaries[2])
return negative_infinity();
62 vector[K] lo = fmax(u_min, head(boundaries, K));
63 vector[K] hi = fmin(u_max, tail(boundaries, K));
70 if (K > 1) cum_before[2:K] = head(cumulative_sum(pmf), K - 1);
75 for (k in 1:K) active[k] = hi[k] > lo[k] ? 1 : 0;
83 vector[K] f_diff = (exp(f_lo) - exp(f_hi)) .* active;
85 real integral = dot_product(cum_before, f_diff);
89 real tail_start = fmax(boundaries[K + 1], u_min);
90 if (tail_start < u_max) {
91 real fp_tail = exp(
primary_lcdf(d - tail_start | primary_id,
92 primary_params, pwindow));
94 primary_params, pwindow));
95 integral += fp_tail - fp_end;
101 int K = num_elements(hazards);
105 log_surv[2:K] = cumulative_sum(log1m(hazards[1:(K - 1)]));
107 return hazards .* exp(log_surv);
110 data real d, vector boundaries, vector hazards,
111 int primary_id, array[] real primary_params, data real pwindow
114 d | boundaries,
hazards_to_pmf(hazards), primary_id, primary_params,
119 int K = num_elements(pmf);
120 if (t < boundaries[2])
return negative_infinity();
121 if (t >= boundaries[K + 1])
return 0;
129 while (k < K && boundaries[k + 2] <= t) k += 1;
130 return log(cumulative_sum(pmf)[k]);
136 if (primary_id != 1)
return 0;
137 return dist_id == 2 || dist_id == 1 || dist_id == 3 || dist_id == 5;
143 if (dist_id == 26 || dist_id == 27 || dist_id == 28) {
144 return primary_id == 1 || primary_id == 2;
150 real log_A = log_sum_exp(terms_d[1], terms_q[2]);
151 real log_B = log_sum_exp(terms_q[1], terms_d[2]);
155 if (log_A == negative_infinity() && log_B == negative_infinity()) {
156 return negative_infinity();
158 return log_diff_exp(log_A, log_B) - log(pwindow);
161 array[] real params) {
163 return rep_vector(negative_infinity(), 2);
165 real shape = params[1];
166 real rate = params[2];
168 real log_E = log(shape) - log(rate);
171 real log_F_T_k = gamma_lcdf(t | shape, rate);
172 real gamma_kp1_pdf_log = shape * log(rate * t) - rate * t
174 real log_F_T_kp1 = log_diff_exp(log_F_T_k, gamma_kp1_pdf_log);
175 return [log(t) + log_F_T_k, log_E + log_F_T_kp1]
';
177real primarycensored_gamma_uniform_lcdf(data real d, real q,
180 return primarycensored_uniform_lcdf_from_terms(
181 primarycensored_gamma_uniform_terms(d, params),
182 primarycensored_gamma_uniform_terms(q, params), pwindow
185vector primarycensored_lognormal_uniform_terms(real t,
186 array[] real params) {
188 real sigma = params[2];
189 real mu_sigma2 = mu + square(sigma);
190 // log E where E = exp(mu + sigma^2/2) is the mean of the delay
191 real log_E = mu + 0.5 * square(sigma);
192 real log_t_F_T = lognormal_lcdf_underflows(t, mu, sigma)
193 ? negative_infinity()
194 : log(t) + lognormal_lcdf(t | mu, sigma);
195 real log_E_tF_T = lognormal_lcdf_underflows(t, mu_sigma2, sigma)
196 ? negative_infinity()
197 : log_E + lognormal_lcdf(t | mu_sigma2, sigma);
198 return [log_t_F_T, log_E_tF_T]';
209 real x = pow(t * inv(scale), shape);
210 real a = 1 + inv(shape);
211 return log(gamma_p(a, x)) + lgamma(a);
214 array[] real params) {
216 return rep_vector(negative_infinity(), 2);
218 real shape = params[1];
219 real scale = params[2];
221 log(t) + weibull_lcdf(t | shape, scale),
225real primarycensored_weibull_uniform_lcdf(data real d, real q,
228 return primarycensored_uniform_lcdf_from_terms(
229 primarycensored_weibull_uniform_terms(d, params),
230 primarycensored_weibull_uniform_terms(q, params), pwindow
233vector primarycensored_gengamma_uniform_terms(real t,
234 array[] real params) {
236 return rep_vector(negative_infinity(), 2);
238 real shape = params[1];
239 real scale = params[2];
241 real k_shift = k + inv(shape);
242 real log_E = log(scale) + lgamma(k_shift) - lgamma(k);
244 log(t) + gengamma_lcdf(t | shape, scale, k),
245 log_E + gengamma_lcdf(t | shape, scale, k_shift)
260 array[] real primary_params) {
261 real q = max({d - pwindow, 0});
263 if (dist_id == 2 && primary_id == 1) {
265 }
else if (dist_id == 1 && primary_id == 1) {
267 }
else if (dist_id == 3 && primary_id == 1) {
269 }
else if (dist_id == 5 && primary_id == 1) {
271 }
else if (dist_id == 26) {
273 int K = (size(params) - 1) %/% 2;
275 d | to_vector(segment(params, 1, K + 1)),
276 to_vector(segment(params, K + 2, K)),
277 primary_id, primary_params, pwindow
279 }
else if (dist_id == 27 || dist_id == 28) {
283 int K = (size(params) - 1) %/% 2;
285 d | to_vector(segment(params, 1, K + 1)),
286 to_vector(segment(params, K + 2, K)),
287 primary_id, primary_params, pwindow
290 return negative_infinity();
294 data real pwindow, data real L,
295 data real D,
int primary_id,
296 array[] real primary_params) {
297 if (d <= L)
return negative_infinity();
298 if (d >= D)
return 0;
301 d, dist_id, params, pwindow, primary_id, primary_params
305 if (!is_inf(D) || L > 0) {
307 L, D, dist_id, params, pwindow, primary_id, primary_params
309 real log_cdf_L = bounds[1];
310 real log_cdf_D = bounds[2];
320 data real pwindow, data real L,
321 data real D,
int primary_id,
322 array[] real primary_params) {
328 pwindow >= 1 && floor(pwindow) == pwindow;
331 array[] real params) {
334 }
else if (dist_id == 1) {
336 }
else if (dist_id == 3) {
338 }
else if (dist_id == 5) {
341 reject(
"Invalid distribution identifier: ", dist_id);
348 int pw = to_int(pwindow);
351 array[n + 1] vector[2] terms;
352 for (t in max(start - pw, 0):n) {
357 terms[d + 1], terms[max(d - pw, 0) + 1], pwindow
363 if (dist_id == 1)
return 1;
364 if (dist_id == 2)
return 1;
365 if (dist_id == 3)
return 1;
366 if (dist_id == 4)
return 1;
367 if (dist_id == 5)
return 1;
368 if (dist_id == 9)
return 1;
369 if (dist_id == 13)
return 1;
370 if (dist_id == 16)
return 1;
371 if (dist_id == 19)
return 1;
372 if (dist_id == 21)
return 1;
373 if (dist_id == 22)
return 1;
378 if (primary_id == 1) {
381 if (p <= 0)
return negative_infinity();
382 if (p >= pwindow)
return 0;
383 return uniform_lcdf(p | 0, pwindow);
384 }
else if (primary_id == 2) {
387 reject(
"primary_lcdf: unsupported primary_id ", primary_id);
393 return (log(y) - mu) / sigma < -38 ? 1 : 0;
396 return gamma_lcdf(pow(y / scale, shape) | k, 1);
398real
dist_lcdf(real delay, array[] real params,
int dist_id) {
400 return negative_infinity();
408 ? negative_infinity()
409 : lognormal_lcdf(delay | params[1], params[2]);
411 else if (dist_id == 2)
return gamma_lcdf(delay | params[1], params[2]);
412 else if (dist_id == 3)
return weibull_lcdf(delay | params[1], params[2]);
413 else if (dist_id == 4)
return exponential_lcdf(delay | params[1]);
414 else if (dist_id == 5)
return gengamma_lcdf(delay | params[1], params[2], params[3]);
415 else if (dist_id == 9)
return beta_lcdf(delay | params[1], params[2]);
416 else if (dist_id == 12)
return cauchy_lcdf(delay | params[1], params[2]);
417 else if (dist_id == 13)
return chi_square_lcdf(delay | params[1]);
418 else if (dist_id == 15)
return gumbel_lcdf(delay | params[1], params[2]);
419 else if (dist_id == 16)
return inv_gamma_lcdf(delay | params[1], params[2]);
420 else if (dist_id == 17)
return logistic_lcdf(delay | params[1], params[2]);
421 else if (dist_id == 18)
return normal_lcdf(delay | params[1], params[2]);
422 else if (dist_id == 19)
return inv_chi_square_lcdf(delay | params[1]);
423 else if (dist_id == 20)
return double_exponential_lcdf(delay | params[1], params[2]);
424 else if (dist_id == 21)
return pareto_lcdf(delay | params[1], params[2]);
425 else if (dist_id == 22)
return scaled_inv_chi_square_lcdf(delay | params[1], params[2]);
426 else if (dist_id == 23)
return student_t_lcdf(delay | params[1], params[2], params[3]);
427 else if (dist_id == 24)
return uniform_lcdf(delay | params[1], params[2]);
428 else if (dist_id == 25)
return von_mises_lcdf(delay | params[1], params[2]);
429 else if (dist_id == 26) {
431 int K = (size(params) - 1) %/% 2;
433 delay | to_vector(segment(params, 1, K + 1)),
434 to_vector(segment(params, K + 2, K))
437 else if (dist_id == 27 || dist_id == 28) {
441 int K = (size(params) - 1) %/% 2;
443 delay | to_vector(segment(params, 1, K + 1)),
444 to_vector(segment(params, K + 2, K))
447 else reject(
"Invalid distribution identifier: ", dist_id);
449real
primary_lpdf(real x,
int primary_id, array[] real params, real xmin, real xmax) {
451 if (primary_id == 1)
return uniform_lpdf(x | xmin, xmax);
452 if (primary_id == 2)
return expgrowth_lpdf(x | xmin, xmax, params[1]);
454 reject(
"Invalid primary distribution identifier");
457 array[] real x_r, array[]
int x_i) {
459 int dist_id = x_i[1];
460 int primary_id = x_i[2];
461 real pwindow = x_r[2];
462 int dist_params_len = x_i[3];
463 int primary_params_len = x_i[4];
466 array[dist_params_len] real params;
467 if (dist_params_len) {
468 params = theta[1:dist_params_len];
470 array[primary_params_len] real primary_params;
471 if (primary_params_len) {
472 int primary_loc = num_elements(theta);
473 primary_params = theta[primary_loc - primary_params_len + 1:primary_loc];
476 real log_cdf =
dist_lcdf(t | params, dist_id);
477 real log_primary_pdf =
primary_lpdf(d - t | primary_id, primary_params, 0, pwindow);
479 return rep_vector(exp(log_cdf + log_primary_pdf), 1);
483 return log_diff_exp(log_cdf_D, log_cdf_L);
489 real log_normalizer, real L) {
491 return log_diff_exp(log_cdf, log_cdf_L) - log_normalizer;
493 return log_cdf - log_normalizer;
497 data real L, data real D,
498 data
int dist_id, array[] real params, data real pwindow,
499 data
int primary_id, array[] real primary_params
511 result[1] = negative_infinity();
514 L | dist_id, params, pwindow,
516 positive_infinity(), primary_id, primary_params
525 D | dist_id, params, pwindow,
527 positive_infinity(), primary_id, primary_params
534 data real pwindow, data real L, data real D,
536 array[] real primary_params) {
550 d | dist_id, params, pwindow, L, D, primary_id, primary_params
559 real lower_bound = d - pwindow;
560 int n_params = num_elements(params);
561 int n_primary_params = num_elements(primary_params);
562 array[n_params + n_primary_params] real theta = append_array(params, primary_params);
563 array[4]
int ids = {dist_id, primary_id, n_params, n_primary_params};
565 vector[1] y0 = rep_vector(0.0, 1);
566 result = ode_rk45(
primarycensored_ode, y0, lower_bound, {d}, theta, {d, pwindow}, ids)[1, 1];
570 if (!is_inf(D) || L > 0 ||
572 real log_result = log(result);
574 L, D, dist_id, params, pwindow, primary_id, primary_params
576 real log_cdf_L = bounds[1];
577 real log_cdf_D = bounds[2];
581 log_result, log_cdf_L, log_normalizer, L
583 result = exp(log_result);
590 data real pwindow, data real L, data real D,
592 array[] real primary_params) {
596 return negative_infinity();
608 d | dist_id, params, pwindow,
610 positive_infinity(), primary_id, primary_params
615 d | dist_id, params, pwindow,
617 positive_infinity(), primary_id, primary_params
623 if (!is_inf(D) || L > 0 ||
626 L, D, dist_id, params, pwindow, primary_id, primary_params
628 real log_cdf_L = bounds[1];
629 real log_cdf_D = bounds[2];
638 data real pwindow, data real d_upper,
639 data real L, data real D, data
int primary_id,
640 array[] real primary_params) {
642 reject(
"Upper truncation point is greater than D. It is ", d_upper,
643 " and D is ", D,
". Resolve this by increasing D to be greater or equal to d + swindow or decreasing swindow.");
646 reject(
"Upper truncation point is less than or equal to d. It is ", d_upper,
647 " and d is ", d,
". Resolve this by increasing d to be less than d_upper.");
650 return negative_infinity();
653 d_upper | dist_id, params, pwindow,
655 positive_infinity(), primary_id, primary_params
658 d | dist_id, params, pwindow,
660 positive_infinity(), primary_id, primary_params
665 if (!is_inf(D) || L > 0 ||
673 log_cdf_L = negative_infinity();
676 log_cdf_L = log_cdf_lower;
680 L | dist_id, params, pwindow,
682 positive_infinity(), primary_id, primary_params
688 log_cdf_D = log_cdf_upper;
689 }
else if (is_inf(D)) {
693 D | dist_id, params, pwindow,
695 positive_infinity(), primary_id, primary_params
700 return log_diff_exp(log_cdf_upper, log_cdf_lower) - log_normalizer;
702 return log_diff_exp(log_cdf_upper, log_cdf_lower);
706 data
int dist_id, array[] real params,
707 data real pwindow, data
int primary_id,
708 array[] real primary_params) {
711 start, n, dist_id, params, pwindow
720 d | dist_id, params, pwindow,
722 positive_infinity(), primary_id, primary_params
728 data
int max_delay, data real L, data real D, data
int dist_id,
729 array[] real params, data real pwindow,
730 data
int primary_id, array[] real primary_params
733 int upper_interval = max_delay + 1;
734 vector[upper_interval] log_pmfs;
735 vector[upper_interval] log_cdfs;
739 if (D < upper_interval) {
740 reject(
"D must be at least max_delay + 1");
746 int start_idx = (!is_inf(L) && L > 0) ? max(1, to_int(floor(L))) : 1;
748 start_idx, upper_interval, dist_id, params, pwindow, primary_id,
756 log_cdf_L = negative_infinity();
757 }
else if (L >= 1 && L <= upper_interval && floor(L) == L) {
759 log_cdf_L = log_cdfs[to_int(L)];
763 L | dist_id, params, pwindow,
765 positive_infinity(), primary_id, primary_params
771 if (D > upper_interval) {
776 D | dist_id, params, pwindow,
778 positive_infinity(), primary_id, primary_params
782 log_cdf_D = log_cdfs[upper_interval];
788 for (d in 1:upper_interval) {
791 log_pmfs[d] = negative_infinity();
792 }
else if (d - 1 < L) {
794 log_pmfs[d] = log_diff_exp(log_cdfs[d], log_cdf_L) - log_normalizer;
798 log_pmfs[d] = log_cdfs[d] - log_normalizer;
803 0.0 | dist_id, params, pwindow,
804 negative_infinity(), positive_infinity(),
805 primary_id, primary_params
807 log_pmfs[d] = log_diff_exp(log_cdfs[d], log_cdf_0) - log_normalizer;
810 log_pmfs[d] = log_diff_exp(log_cdfs[d], log_cdfs[d-1]) - log_normalizer;
817 data
int max_delay, data real L, data real D, data
int dist_id,
818 array[] real params, data real pwindow,
820 array[] real primary_params
824 max_delay, L, D, dist_id, params, pwindow, primary_id, primary_params
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_sone_pmf_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)
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_lpmf(data int d, data int dist_id, array[] real params, data real pwindow, data real d_upper, data real L, data real D, data 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)