13 SEXP Pnames, SEXP Cnames, SEXP log
22 PROTECT(log = AS_LOGICAL(log));
23 PROTECT(
args = VectorToPairList(
args));
25 SET_TAG(
args,install(
"log"));
28 for (v = LENGTH(Cnames)-1; v >= 0; v--) {
33 SET_TAG(
args,installChar(STRING_ELT(Cnames,v)));
37 for (v = LENGTH(Pnames)-1; v >= 0; v--) {
42 SET_TAG(
args,installChar(STRING_ELT(Pnames,v)));
46 for (v = LENGTH(
Snames)-1; v >= 0; v--) {
51 SET_TAG(
args,installChar(STRING_ELT(
Snames,v)));
55 for (v = LENGTH(Onames)-1; v >= 0; v--) {
60 SET_TAG(
args,installChar(STRING_ELT(Onames,v)));
68 SET_TAG(
args,install(
"t"));
84 SEXP var =
args, ans, ob;
87 *(REAL(CAR(var))) = *t; var = CDR(var);
88 for (v = 0; v < nobs; v++, y++, var=CDR(var)) *(REAL(CAR(var))) = *y;
89 for (v = 0; v < nvar; v++, x++, var=CDR(var)) *(REAL(CAR(var))) = *x;
90 for (v = 0; v < npar; v++, p++, var=CDR(var)) *(REAL(CAR(var))) = *p;
91 for (v = 0; v < ncov; v++, c++, var=CDR(var)) *(REAL(CAR(var))) = *c;
93 PROTECT(ob = LCONS(
fn,
args));
94 PROTECT(ans = eval(ob,CLOENV(
fn)));
116 SEXP
Snames, Pnames, Cnames, Onames;
124 PROTECT(times = AS_NUMERIC(times));
125 ntimes = length(times);
126 if (ntimes < 1)
err(
"length('times') = 0, no work to do.");
129 dim = INTEGER(GET_DIM(y));
132 if (ntimes != dim[1])
133 err(
"length of 'times' and 2nd dimension of 'y' do not agree.");
136 dim = INTEGER(GET_DIM(x));
137 nvars = dim[0]; nrepsx = dim[1];
139 if (ntimes != dim[2])
140 err(
"length of 'times' and 3rd dimension of 'x' do not agree.");
143 dim = INTEGER(GET_DIM(
params));
144 npars = dim[0]; nrepsp = dim[1];
146 nreps = (nrepsp > nrepsx) ? nrepsp : nrepsx;
148 if ((
nreps % nrepsp != 0) || (
nreps % nrepsx != 0))
149 err(
"larger number of replicates is not a multiple of smaller.");
151 PROTECT(Onames = GET_ROWNAMES(GET_DIMNAMES(y)));
152 PROTECT(
Snames = GET_ROWNAMES(GET_DIMNAMES(x)));
153 PROTECT(Pnames = GET_ROWNAMES(GET_DIMNAMES(
params)));
158 PROTECT(cvec = NEW_NUMERIC(
ncovars));
162 PROTECT(pompfun = GET_SLOT(
object,install(
"dmeasure")));
166 PROTECT(
args = GET_SLOT(
object,install(
"userdata")));
177 double *ys = REAL(y), *xs = REAL(x), *ps = REAL(
params), *time = REAL(times);
178 double *ft = REAL(F);
184 for (k = 0; k < ntimes; k++, time++, ys += nobs) {
186 R_CheckUserInterrupt();
190 for (j = 0; j <
nreps; j++, ft++) {
204 if (k == 0 && j == 0 && LENGTH(ans) != 1)
205 err(
"user 'dmeasure' returns a vector of length %d when it should return a scalar.",LENGTH(ans));
207 *ft = *(REAL(AS_NUMERIC(ans)));
218 int *oidx, *sidx, *pidx, *cidx;
221 double *yp = REAL(y), *xs = REAL(x), *ps = REAL(
params), *time = REAL(times);
222 double *ft = REAL(F);
227 sidx = INTEGER(GET_SLOT(pompfun,install(
"stateindex")));
228 pidx = INTEGER(GET_SLOT(pompfun,install(
"paramindex")));
229 oidx = INTEGER(GET_SLOT(pompfun,install(
"obsindex")));
230 cidx = INTEGER(GET_SLOT(pompfun,install(
"covarindex")));
232 give_log = *(INTEGER(AS_INTEGER(log)));
235 *((
void **) (&ff)) = R_ExternalPtrAddr(
fn);
237 for (k = 0; k < ntimes; k++, time++, yp += nobs) {
239 R_CheckUserInterrupt();
244 for (j = 0; j <
nreps; j++, ft++) {
246 xp = &xs[
nvars*((j%nrepsx)+nrepsx*k)];
247 pp = &ps[
npars*(j%nrepsp)];
249 (*ff)(ft,yp,xp,pp,give_log,oidx,sidx,pidx,cidx,
cov,*time);
259 double *ft = REAL(F);
262 for (k = 0; k < ntimes; k++) {
263 for (j = 0; j <
nreps; j++, ft++) {
268 warn(
"'dmeasure' unspecified: likelihood undefined.");
SEXP pomp_fun_handler(SEXP, SEXP, pompfunmode *, SEXP, SEXP, SEXP, SEXP)
SEXP do_dmeasure(SEXP object, SEXP y, SEXP x, SEXP times, SEXP params, SEXP log, SEXP gnsi)
static R_INLINE SEXP add_args(SEXP args, SEXP Onames, SEXP Snames, SEXP Pnames, SEXP Cnames, SEXP log)
static R_INLINE SEXP eval_call(SEXP fn, SEXP args, double *t, double *y, int nobs, double *x, int nvar, double *p, int npar, double *c, int ncov)
void pomp_dmeasure(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)