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 sigma (__p[__parindex[0]])
27#define lambda (__p[__parindex[1]])
28#define mu (__p[__parindex[2]])
29#define chi (__p[__parindex[3]])
30#define POP (__p[__parindex[4]])
31#define E0 (__p[__parindex[5]])
32#define I0 (__p[__parindex[6]])
33#define E (__x[__stateindex[0]])
34#define I (__x[__stateindex[1]])
35#define ll (__x[__stateindex[2]])
36#define node (__x[__stateindex[3]])
37#define ellE (__x[__stateindex[4]])
38#define ellI (__x[__stateindex[5]])
39#define COLOR (__x[__stateindex[6]])
42 event_rates(__x,__p,t, \
43 __stateindex,__parindex,__covindex, \
44 __covars,rate,logpi,&penalty) \
51 const int *__stateindex,
52 const int *__parindex,
53 const int *__covindex,
54 const double *__covars,
59 double event_rate = 0;
67 event_rate += (*rate = alpha*pi); rate++;
68 *logpi = log(pi); logpi++;
71 event_rate += (*rate = alpha*pi); rate++;
72 *logpi = (
ellI > 0) ? -log(
ellI+1) : 0; logpi++;
77 pi = (
E > 0) ? 1-
ellE/
E : 1;
78 event_rate += (*rate = alpha*pi); rate++;
79 *logpi = log(pi); logpi++;
82 event_rate += (*rate = alpha*pi); rate++;
83 *logpi = (
ellE > 0) ? log(pi)-log(
ellE) : 0; logpi++;
87 event_rate += (*rate = alpha); rate++;
96 assert(R_FINITE(event_rate));
111 const int *__stateindex,
112 const int *__parindex,
113 const int *__covindex,
114 const double *__covars
118 !R_FINITE(
mu) ||
mu < 0 || !R_FINITE(
chi) ||
chi < 0)
119 err(
"BDEI rates must be finite and nonnegative.");
120 if (!R_FINITE(
POP) ||
POP < 0 ||
121 !R_FINITE(
E0) ||
E0 < 0 || !R_FINITE(
I0) ||
I0 < 0 ||
123 err(
"BDEI initial values must be finite and nonnegative, with E0+I0 > 0.");
125 if (!R_FINITE(adj))
err(
"BDEI: pop/(E0+I0) must be finite.");
126 E = nearbyint(
E0*adj);
127 I = nearbyint(
I0*adj);
142 const int *__stateindex,
143 const int *__parindex,
144 const int *__covindex,
145 const double *__covars,
149 double tstep = 0.0, tmax = t + dt;
150 double *color = &
COLOR;
158 int parent = (int) nearbyint(
node);
163 assert(parent<=nnode);
166 int parlin = lineage[parent];
167 int parcol = color[parlin];
168 assert(parlin >= 0 && parlin <
nsample);
173 switch (nodetype[parent]) {
177 assert(sat[parent]==1);
179 int c = child[index[parent]];
180 assert(lineage[parent]==lineage[c]);
183 if (unif_rand() < x) {
194 if (unif_rand() < 0.5) {
211 if (sat[parent] == 0) {
213 ll += (
I > 0) ? log(
chi*
I) : R_NegInf;
219 color[parlin] = R_NaReal;
228 assert(sat[parent]==2);
233 int c1 = child[index[parent]];
234 int c2 = child[index[parent]+1];
236 assert(lineage[c1] != lineage[c2]);
237 assert(lineage[c1] != parlin || lineage[c2] != parlin);
238 assert(lineage[c1] == parlin || lineage[c2] == parlin);
239 if (unif_rand() < 0.5) {
252 if (tmax > t && R_FINITE(
ll)) {
256 double event_rate = 0;
260 tstep = exp_rand()/event_rate;
262 while (t + tstep < tmax) {
264 assert(event>=0 && event<
nrate);
265 ll -= penalty*tstep + logpi[event];
308 tstep = exp_rand()/event_rate;
317# define lik (__lik[0])
327 const int *__obsindex,
328 const int *__stateindex,
329 const int *__parindex,
330 const int *__covindex,
331 const double *__covars,
335 lik = (give_log) ?
ll : exp(
ll);
static void change_color(double *color, int nsample, int n, int from, int to)
void bdei_gill(double *__x, const double *__p, const int *__stateindex, const int *__parindex, const int *__covindex, const double *__covars, double t, double dt)
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 bdei_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).
void bdei_rinit(double *__x, const double *__p, double t0, const int *__stateindex, const int *__parindex, const int *__covindex, const double *__covars)
get_userdata_int_t * get_userdata_int
static int rcateg(double erate, double *rate, int nrate)