16 PROTECT(
args = VectorToPairList(
args));
22 for (v = LENGTH(Cnames)-1; v >= 0; v--) {
27 SET_TAG(
args,installChar(STRING_ELT(Cnames,v)));
31 for (v = LENGTH(Pnames)-1; v >= 0; v--) {
36 SET_TAG(
args,installChar(STRING_ELT(Pnames,v)));
40 for (v = LENGTH(
Snames)-1; v >= 0; v--) {
45 SET_TAG(
args,installChar(STRING_ELT(
Snames,v)));
53 SET_TAG(
args,install(
"t"));
68 SEXP var =
args, ans, ob;
71 *(REAL(CAR(var))) = *t; var = CDR(var);
72 for (v = 0; v < nvar; v++, x++, var=CDR(var)) *(REAL(CAR(var))) = *x;
73 for (v = 0; v < npar; v++, p++, var=CDR(var)) *(REAL(CAR(var))) = *p;
74 for (v = 0; v < ncov; v++, c++, var=CDR(var)) *(REAL(CAR(var))) = *c;
76 PROTECT(ob = LCONS(
fn,
args));
77 PROTECT(ans = eval(ob,CLOENV(
fn)));
103 SEXP
Snames, Pnames, Cnames, Onames = R_NilValue;
112 PROTECT(times = AS_NUMERIC(times));
113 ntimes = length(times);
115 err(
"length('times') = 0, no work to do.");
118 dim = INTEGER(GET_DIM(x));
119 nvars = dim[0]; nrepsx = dim[1];
121 if (ntimes != dim[2])
122 err(
"length of 'times' and 3rd dimension of 'x' do not agree.");
125 dim = INTEGER(GET_DIM(
params));
126 npars = dim[0]; nrepsp = dim[1];
128 nreps = (nrepsp > nrepsx) ? nrepsp : nrepsx;
130 if ((
nreps % nrepsp != 0) || (
nreps % nrepsx != 0))
131 err(
"larger number of replicates is not a multiple of smaller.");
133 PROTECT(pompfun = GET_SLOT(
object,install(
"emeasure")));
135 PROTECT(
Snames = GET_ROWNAMES(GET_DIMNAMES(x)));
136 PROTECT(Pnames = GET_ROWNAMES(GET_DIMNAMES(
params)));
138 PROTECT(Onames = GET_SLOT(pompfun,install(
"obsnames")));
142 PROTECT(cvec = NEW_NUMERIC(
ncovars));
149 PROTECT(
args = GET_SLOT(
object,install(
"userdata")));
159 double *time = REAL(times), *xs = REAL(x), *ps = REAL(
params);
165 for (k = 0; k < ntimes; k++, time++) {
167 R_CheckUserInterrupt();
171 for (j = 0; j <
nreps; j++) {
187 PROTECT(Onames = GET_NAMES(ans));
189 err(
"'emeasure' must return a named numeric vector.");
196 ys = REAL(AS_NUMERIC(ans));
198 memcpy(yt,ys,nobs*
sizeof(
double));
215 if (LENGTH(ans) != nobs)
216 err(
"'emeasure' returns variable-length results.");
218 ys = REAL(AS_NUMERIC(ans));
220 memcpy(yt,ys,nobs*
sizeof(
double));
235 double *yt = 0, *xp, *pp;
236 double *time = REAL(times), *xs = REAL(x), *ps = REAL(
params);
237 int *oidx, *sidx, *pidx, *cidx;
241 nobs = LENGTH(Onames);
243 sidx = INTEGER(GET_SLOT(pompfun,install(
"stateindex")));
244 pidx = INTEGER(GET_SLOT(pompfun,install(
"paramindex")));
245 oidx = INTEGER(GET_SLOT(pompfun,install(
"obsindex")));
246 cidx = INTEGER(GET_SLOT(pompfun,install(
"covarindex")));
249 *((
void **) (&ff)) = R_ExternalPtrAddr(
fn);
254 for (k = 0; k < ntimes; k++, time++) {
256 R_CheckUserInterrupt();
261 for (j = 0; j <
nreps; j++, yt += nobs) {
263 xp = &xs[
nvars*((j%nrepsx)+nrepsx*k)];
264 pp = &ps[
npars*(j%nrepsp)];
266 (*ff)(yt,xp,pp,oidx,sidx,pidx,cidx,
cov,*time);
276 nobs = LENGTH(Onames);
277 int dim[3] = {nobs,
nreps, ntimes};
278 const char *dimnm[3] = {
"name",
".id",
"time"};
280 int i, n = nobs*
nreps*ntimes;
286 for (i = 0, yt = REAL(
Y); i < n; i++, yt++) *yt = R_NaReal;
288 warn(
"'emeasure' unspecified: NAs generated.");
SEXP pomp_fun_handler(SEXP, SEXP, pompfunmode *, SEXP, SEXP, SEXP, SEXP)
static R_INLINE SEXP eval_call(SEXP fn, SEXP args, double *t, double *x, int nvar, double *p, int npar, double *c, int ncov)
void pomp_emeasure(double *f, const double *x, const double *p, const int *obsindex, const int *stateindex, const int *parindex, const int *covindex, const double *covars, double t)