17 return log_diff_exp(log_cdf_D, log_cdf_L);
37 real log_normalizer, real L) {
39 return log_diff_exp(log_cdf, log_cdf_L) - log_normalizer;
41 return log_cdf - log_normalizer;
60 data real L, data real D,
61 int dist_id, array[] real params, data real pwindow,
62 int primary_id, array[] real primary_params
68 result[1] = negative_infinity();
71 L | dist_id, params, pwindow, 0, positive_infinity(),
72 primary_id, primary_params
81 D | dist_id, params, pwindow, 0, positive_infinity(),
82 primary_id, primary_params
106 data real pwindow, data real L, data real D,
108 array[] real primary_params) {
122 d | dist_id, params, pwindow, L, D, primary_id, primary_params
126 real lower_bound = max({d - pwindow, 1e-6});
127 int n_params = num_elements(params);
128 int n_primary_params = num_elements(primary_params);
129 array[n_params + n_primary_params] real theta = append_array(params, primary_params);
130 array[4]
int ids = {dist_id, primary_id, n_params, n_primary_params};
132 vector[1] y0 = rep_vector(0.0, 1);
133 result = ode_rk45(
primarycensored_ode, y0, lower_bound, {d}, theta, {d, pwindow}, ids)[1, 1];
136 if (!is_inf(D) || L > 0) {
137 real log_result = log(result);
139 L, D, dist_id, params, pwindow, primary_id, primary_params
141 real log_cdf_L = bounds[1];
142 real log_cdf_D = bounds[2];
146 log_result, log_cdf_L, log_normalizer, L
148 result = exp(log_result);
187 data real pwindow, data real L, data real D,
189 array[] real primary_params) {
193 return negative_infinity();
203 d | dist_id, params, pwindow, 0, positive_infinity(), primary_id, primary_params
208 d | dist_id, params, pwindow, 0, positive_infinity(), primary_id, primary_params
213 if (!is_inf(D) || L > 0) {
215 L, D, dist_id, params, pwindow, primary_id, primary_params
217 real log_cdf_L = bounds[1];
218 real log_cdf_D = bounds[2];
261 data real pwindow, data real d_upper,
262 data real L, data real D,
int primary_id,
263 array[] real primary_params) {
265 reject(
"Upper truncation point is greater than D. It is ", d_upper,
266 " and D is ", D,
". Resolve this by increasing D to be greater or equal to d + swindow or decreasing swindow.");
269 reject(
"Upper truncation point is less than or equal to d. It is ", d_upper,
270 " and d is ", d,
". Resolve this by increasing d to be less than d_upper.");
273 return negative_infinity();
276 d_upper | dist_id, params, pwindow, 0, positive_infinity(), primary_id, primary_params
279 d | dist_id, params, pwindow, 0, positive_infinity(), primary_id, primary_params
283 if (!is_inf(D) || L > 0) {
290 log_cdf_L = negative_infinity();
293 log_cdf_L = log_cdf_lower;
297 L | dist_id, params, pwindow, 0, positive_infinity(),
298 primary_id, primary_params
304 log_cdf_D = log_cdf_upper;
305 }
else if (is_inf(D)) {
309 D | dist_id, params, pwindow, 0, positive_infinity(),
310 primary_id, primary_params
315 return log_diff_exp(log_cdf_upper, log_cdf_lower) - log_normalizer;
317 return log_diff_exp(log_cdf_upper, log_cdf_lower);
354 data real pwindow, data real d_upper,
355 data real L, data real D,
int primary_id,
356 array[] real primary_params) {
359 d | dist_id, params, pwindow, d_upper, L, D, primary_id, primary_params
406 int max_delay, data real L, data real D,
int dist_id,
407 array[] real params, data real pwindow,
408 int primary_id, array[] real primary_params
411 int upper_interval = max_delay + 1;
412 vector[upper_interval] log_pmfs;
413 vector[upper_interval] log_cdfs;
417 if (D < upper_interval) {
418 reject(
"D must be at least max_delay + 1");
423 int start_idx = L > 0 ? max(1, to_int(floor(L))) : 1;
424 for (d in start_idx:upper_interval) {
426 d | dist_id, params, pwindow, 0, positive_infinity(), primary_id,
435 log_cdf_L = negative_infinity();
436 }
else if (L <= upper_interval && floor(L) == L) {
438 log_cdf_L = log_cdfs[to_int(L)];
442 L | dist_id, params, pwindow, 0, positive_infinity(),
443 primary_id, primary_params
449 if (D > upper_interval) {
454 D | dist_id, params, pwindow, 0, positive_infinity(),
455 primary_id, primary_params
459 log_cdf_D = log_cdfs[upper_interval];
465 for (d in 1:upper_interval) {
468 log_pmfs[d] = negative_infinity();
469 }
else if (d - 1 < L) {
471 log_pmfs[d] = log_diff_exp(log_cdfs[d], log_cdf_L) - log_normalizer;
474 log_pmfs[d] = log_cdfs[d] - log_normalizer;
477 log_pmfs[d] = log_diff_exp(log_cdfs[d], log_cdfs[d-1]) - log_normalizer;
523 int max_delay, data real L, data real D,
int dist_id,
524 array[] real params, data real pwindow,
526 array[] real primary_params
530 max_delay, L, D, dist_id, params, pwindow, primary_id, primary_params
int check_for_analytical(int dist_id, int primary_id)
vector primarycensored_ode(real t, vector y, array[] real theta, array[] real x_r, array[] int x_i)
real primarycensored_pmf(data int d, int dist_id, array[] real params, data real pwindow, data real d_upper, data real L, data real D, int primary_id, array[] real primary_params)
real primarycensored_lpmf(data int d, int dist_id, array[] real params, data real pwindow, data real d_upper, data real L, data real D, int primary_id, array[] real primary_params)
real primarycensored_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_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)
vector primarycensored_sone_pmf_vectorized(int max_delay, data real L, data real D, int dist_id, array[] real params, data real pwindow, int primary_id, array[] real primary_params)
vector primarycensored_sone_lpmf_vectorized(int max_delay, data real L, data real D, int dist_id, array[] real params, data real pwindow, int primary_id, array[] real primary_params)
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, int dist_id, array[] real params, data real pwindow, int primary_id, array[] real primary_params)