45 vector log_exp_obs,
int exp_offset,
46 array[]
int total, array[]
int obs_lookup,
47 array[]
int lsl, array[]
int clsl,
48 array[]
int nsl, array[]
int cnsl) {
50 for (i in start:end) {
55 vector[lsl[i]] lprob = log_softmax(
56 segment(log_exp_obs, c[1] - exp_offset + 1, lsl[i])
59 if (nsl[i] == lsl[i]) {
61 tar += multinomial_lpmf(segment(obs, o[1], nsl[i]) | exp(lprob));
65 vector[nsl[i] + 1] cat_lprob;
66 array[nsl[i] + 1]
int cat_obs;
69 int local = obs_lookup[o[1] + j - 1] - c[1] + 1;
70 cat_lprob[j] = lprob[local];
71 cat_obs[j] = obs[o[1] + j - 1];
72 obs_sum += cat_obs[j];
75 cat_lprob[nsl[i] + 1] = log1m_exp(log_sum_exp(cat_lprob[1:nsl[i]]));
76 cat_obs[nsl[i] + 1] = max(total[i] - obs_sum, 0);
77 tar += multinomial_lpmf(cat_obs | exp(cat_lprob));
real delay_multinomial_snaps(int start, int end, array[] int obs, vector log_exp_obs, int exp_offset, array[] int total, array[] int obs_lookup, array[] int lsl, array[] int clsl, array[] int nsl, array[] int cnsl)