18 return log_diff_exp(log_cdf_D, log_cdf_L);
39 real log_normalizer, real L) {
41 return log_diff_exp(log_cdf, log_cdf_L) - log_normalizer;
43 return log_cdf - log_normalizer;
70 data real L, data real D,
71 data
int dist_id, array[] real params, data real pwindow,
72 data
int primary_id, array[] real primary_params
84 result[1] = negative_infinity();
87 L | dist_id, params, pwindow,
89 positive_infinity(), primary_id, primary_params
98 D | dist_id, params, pwindow,
100 positive_infinity(), primary_id, primary_params
124 data real pwindow, data real L, data real D,
126 array[] real primary_params) {
140 d | dist_id, params, pwindow, L, D, primary_id, primary_params
149 real lower_bound = d - pwindow;
150 int n_params = num_elements(params);
151 int n_primary_params = num_elements(primary_params);
152 array[n_params + n_primary_params] real theta = append_array(params, primary_params);
153 array[4]
int ids = {dist_id, primary_id, n_params, n_primary_params};
155 vector[1] y0 = rep_vector(0.0, 1);
156 result = ode_rk45(
primarycensored_ode, y0, lower_bound, {d}, theta, {d, pwindow}, ids)[1, 1];
160 if (!is_inf(D) || L > 0 ||
162 real log_result = log(result);
164 L, D, dist_id, params, pwindow, primary_id, primary_params
166 real log_cdf_L = bounds[1];
167 real log_cdf_D = bounds[2];
171 log_result, log_cdf_L, log_normalizer, L
173 result = exp(log_result);
212 data real pwindow, data real L, data real D,
214 array[] real primary_params) {
218 return negative_infinity();
230 d | dist_id, params, pwindow,
232 positive_infinity(), primary_id, primary_params
237 d | dist_id, params, pwindow,
239 positive_infinity(), primary_id, primary_params
245 if (!is_inf(D) || L > 0 ||
248 L, D, dist_id, params, pwindow, primary_id, primary_params
250 real log_cdf_L = bounds[1];
251 real log_cdf_D = bounds[2];
294 data real pwindow, data real d_upper,
295 data real L, data real D, data
int primary_id,
296 array[] real primary_params) {
298 reject(
"Upper truncation point is greater than D. It is ", d_upper,
299 " and D is ", D,
". Resolve this by increasing D to be greater or equal to d + swindow or decreasing swindow.");
302 reject(
"Upper truncation point is less than or equal to d. It is ", d_upper,
303 " and d is ", d,
". Resolve this by increasing d to be less than d_upper.");
306 return negative_infinity();
309 d_upper | dist_id, params, pwindow,
311 positive_infinity(), primary_id, primary_params
314 d | dist_id, params, pwindow,
316 positive_infinity(), primary_id, primary_params
321 if (!is_inf(D) || L > 0 ||
329 log_cdf_L = negative_infinity();
332 log_cdf_L = log_cdf_lower;
336 L | dist_id, params, pwindow,
338 positive_infinity(), primary_id, primary_params
344 log_cdf_D = log_cdf_upper;
345 }
else if (is_inf(D)) {
349 D | dist_id, params, pwindow,
351 positive_infinity(), primary_id, primary_params
356 return log_diff_exp(log_cdf_upper, log_cdf_lower) - log_normalizer;
358 return log_diff_exp(log_cdf_upper, log_cdf_lower);
395 data real pwindow, data real d_upper,
396 data real L, data real D, data
int primary_id,
397 array[] real primary_params) {
400 d | dist_id, params, pwindow, d_upper, L, D, primary_id, primary_params
425 data
int dist_id, array[] real params,
426 data real pwindow, data
int primary_id,
427 array[] real primary_params) {
430 start, n, dist_id, params, pwindow
439 d | dist_id, params, pwindow,
441 positive_infinity(), primary_id, primary_params
493 data
int max_delay, data real L, data real D, data
int dist_id,
494 array[] real params, data real pwindow,
495 data
int primary_id, array[] real primary_params
498 int upper_interval = max_delay + 1;
499 vector[upper_interval] log_pmfs;
500 vector[upper_interval] log_cdfs;
504 if (D < upper_interval) {
505 reject(
"D must be at least max_delay + 1");
511 int start_idx = (!is_inf(L) && L > 0) ? max(1, to_int(floor(L))) : 1;
513 start_idx, upper_interval, dist_id, params, pwindow, primary_id,
521 log_cdf_L = negative_infinity();
522 }
else if (L >= 1 && L <= upper_interval && floor(L) == L) {
524 log_cdf_L = log_cdfs[to_int(L)];
528 L | dist_id, params, pwindow,
530 positive_infinity(), primary_id, primary_params
536 if (D > upper_interval) {
541 D | dist_id, params, pwindow,
543 positive_infinity(), primary_id, primary_params
547 log_cdf_D = log_cdfs[upper_interval];
553 for (d in 1:upper_interval) {
556 log_pmfs[d] = negative_infinity();
557 }
else if (d - 1 < L) {
559 log_pmfs[d] = log_diff_exp(log_cdfs[d], log_cdf_L) - log_normalizer;
563 log_pmfs[d] = log_cdfs[d] - log_normalizer;
568 0.0 | dist_id, params, pwindow,
569 negative_infinity(), positive_infinity(),
570 primary_id, primary_params
572 log_pmfs[d] = log_diff_exp(log_cdfs[d], log_cdf_0) - log_normalizer;
575 log_pmfs[d] = log_diff_exp(log_cdfs[d], log_cdfs[d-1]) - log_normalizer;
621 data
int max_delay, data real L, data real D, data
int dist_id,
622 array[] real params, data real pwindow,
624 array[] real primary_params
628 max_delay, L, D, dist_id, params, pwindow, primary_id, primary_params
int check_for_analytical_vectorized(int dist_id, int primary_id, data real pwindow)
int check_for_analytical(int dist_id, int primary_id)
int dist_has_positive_support(data int dist_id)
vector primarycensored_ode(real t, vector y, array[] real theta, array[] real x_r, array[] int x_i)
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_pmf(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_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)
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)
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_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_analytical_lcdf_vectorized(data int start, data int n, data int dist_id, array[] real 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_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)
real primarycensored_apply_truncation(real log_cdf, real log_cdf_L, real log_normalizer, real L)
real primarycensored_log_normalizer(real log_cdf_D, real log_cdf_L, real L)
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)