10 return floor(R_unif_index(
n));
14 int n,
int from,
int to) {
18 if (!ISNA(color[i]) && nearbyint(color[i]) == from)
n--;
22 assert(nearbyint(color[i]) == from);
26#define lambda_nn (__p[__parindex[0]])
27#define lambda_ns (__p[__parindex[1]])
28#define lambda_sn (__p[__parindex[2]])
29#define lambda_ss (__p[__parindex[3]])
30#define mu (__p[__parindex[4]])
31#define chi (__p[__parindex[5]])
32#define POP (__p[__parindex[6]])
33#define N0 (__p[__parindex[7]])
34#define S0 (__p[__parindex[8]])
35#define N (__x[__stateindex[0]])
36#define S (__x[__stateindex[1]])
37#define ll (__x[__stateindex[2]])
38#define node (__x[__stateindex[3]])
39#define ell1 (__x[__stateindex[4]])
40#define ell2 (__x[__stateindex[5]])
41#define COLOR (__x[__stateindex[6]])
44 event_rates(__x,__p,t, \
45 __stateindex,__parindex,__covindex, \
46 __covars,rate,logpi,&penalty) \
53 const int *__stateindex,
54 const int *__parindex,
55 const int *__covindex,
56 const double *__covars,
61 double event_rate = 0;
62 double alpha, pi, disc;
69 *penalty += alpha*disc;
70 event_rate += (*rate = alpha*(1-disc)); rate++;
75 event_rate += (*rate = alpha*pi); rate++;
76 *logpi = log(pi); logpi++;
79 event_rate += (*rate = alpha*pi); rate++;
80 *logpi = (
ell1 > 0) ? -log(
ell1+1) : 0; logpi++;
84 *penalty += alpha*disc;
85 event_rate += (*rate = alpha*(1-disc)); rate++;
90 event_rate += (*rate = alpha*pi); rate++;
91 *logpi = log(pi); logpi++;
94 event_rate += (*rate = alpha*pi); rate++;
95 *logpi = (
ell2 > 0) ? -log(
ell2+1) : 0; logpi++;
99 event_rate += (*rate = alpha); rate++;
109 event_rate += (*rate = alpha); rate++;
117 *penalty +=
chi*(
N+
S);
118 assert(R_FINITE(event_rate));
133 const int *__stateindex,
134 const int *__parindex,
135 const int *__covindex,
136 const double *__covars
142 !R_FINITE(
mu) ||
mu < 0 || !R_FINITE(
chi) ||
chi < 0)
143 err(
"BDSS rates must be finite and nonnegative.");
144 if (!R_FINITE(
POP) ||
POP < 0 ||
145 !R_FINITE(
N0) ||
N0 < 0 || !R_FINITE(
S0) ||
S0 < 0 ||
147 err(
"BDSS initial values must be finite and nonnegative, with N0+S0 > 0.");
149 if (!R_FINITE(adj))
err(
"BDSS: pop/(N0+S0) must be finite.");
150 N = nearbyint(
N0*adj);
151 S = nearbyint(
S0*adj);
166 const int *__stateindex,
167 const int *__parindex,
168 const int *__covindex,
169 const double *__covars,
173 double tstep = 0.0, tmax = t + dt;
174 double *color = &
COLOR;
182 int parent = (int) nearbyint(
node);
187 assert(parent<=nnode);
190 int parlin = lineage[parent];
191 int parcol = color[parlin];
192 assert(parlin >= 0 && parlin <
nsample);
197 switch (nodetype[parent]) {
201 assert(sat[parent]==1);
203 int c = child[index[parent]];
204 assert(lineage[parent]==lineage[c]);
207 if (unif_rand() < x) {
208 color[lineage[c]] =
Normal;
218 if (unif_rand() < 0.5) {
219 color[lineage[c]] =
Normal;
229 if (sat[parent] == 0) {
232 ll += (
N > 0) ? log(
chi*
N) : R_NegInf;
236 ll += (
S > 0) ? log(
chi*
S) : R_NegInf;
245 color[parlin] = R_NaReal;
248 assert(sat[parent]==2);
250 int c1 = child[index[parent]];
251 int c2 = child[index[parent]+1];
253 assert(lineage[c1] != lineage[c2]);
254 assert(lineage[c1] != parlin || lineage[c2] != parlin);
255 assert(lineage[c1] == parlin || lineage[c2] == parlin);
259 if (lam <= 0) {
ll += R_NegInf;
break; }
261 if (unif_rand() < p_nn) {
265 if (
N*(
N-1) <= 0)
ll += R_NegInf;
266 color[lineage[c1]] =
Normal;
267 color[lineage[c2]] =
Normal;
272 if (
N*
S <= 0)
ll += R_NegInf;
273 if (unif_rand() < 0.5) {
274 color[lineage[c1]] =
Normal;
278 color[lineage[c2]] =
Normal;
284 if (lam <= 0) {
ll += R_NegInf;
break; }
286 if (unif_rand() < p_ss) {
290 if (
S*(
S-1) <= 0)
ll += R_NegInf;
297 if (
N*
S <= 0)
ll += R_NegInf;
298 if (unif_rand() < 0.5) {
299 color[lineage[c1]] =
Normal;
303 color[lineage[c2]] =
Normal;
315 if (tmax > t && R_FINITE(
ll)) {
319 double event_rate = 0;
323 tstep = exp_rand()/event_rate;
325 while (t + tstep < tmax) {
327 assert(event>=0 && event<
nrate);
328 ll -= penalty*tstep + logpi[event];
380 tstep = exp_rand()/event_rate;
389# define lik (__lik[0])
399 const int *__obsindex,
400 const int *__stateindex,
401 const int *__parindex,
402 const int *__covindex,
403 const double *__covars,
407 lik = (give_log) ?
ll : exp(
ll);
void bdss_rinit(double *__x, const double *__p, double t0, const int *__stateindex, const int *__parindex, const int *__covindex, const double *__covars)
static void change_color(double *color, int nsample, int n, int from, int to)
static double event_rates(double *__x, const double *__p, double t, const int *__stateindex, const int *__parindex, const int *__covindex, const double *__covars, double *rate, double *logpi, double *penalty)
static int random_choice(double n)
void bdss_gill(double *__x, const double *__p, const int *__stateindex, const int *__parindex, const int *__covindex, const double *__covars, double t, double dt)
void bdss_dmeas(double *__lik, const double *__y, const double *__x, const double *__p, int give_log, const int *__obsindex, const int *__stateindex, const int *__parindex, const int *__covindex, const double *__covars, double t)
Measurement model likelihood (dmeasure).
get_userdata_int_t * get_userdata_int
static int rcateg(double erate, double *rate, int nrate)