16 PROTECT(
args = VectorToPairList(
args));
19 for (v = LENGTH(Cnames)-1; v >= 0; v--) {
24 SET_TAG(
args,installChar(STRING_ELT(Cnames,v)));
28 for (v = LENGTH(Pnames)-1; v >= 0; v--) {
33 SET_TAG(
args,installChar(STRING_ELT(Pnames,v)));
37 for (v = LENGTH(
Snames)-1; v >= 0; v--) {
42 SET_TAG(
args,installChar(STRING_ELT(
Snames,v)));
50 SET_TAG(
args,install(
"t"));
65 SEXP var =
args, ans, ob;
68 *(REAL(CAR(var))) = *t; var = CDR(var);
69 for (v = 0; v < nvar; v++, x++, var=CDR(var)) *(REAL(CAR(var))) = *x;
70 for (v = 0; v < npar; v++, p++, var=CDR(var)) *(REAL(CAR(var))) = *p;
71 for (v = 0; v < ncov; v++, c++, var=CDR(var)) *(REAL(CAR(var))) = *c;
73 PROTECT(ob = LCONS(
fn,
args));
74 PROTECT(ans = eval(ob,CLOENV(
fn)));
85 const char *dimnms[3] = {
"name",
".id",
"time"};
95 double *f,
double *time,
double *x,
double *p,
98 int nrepx,
int nrepp,
int nreps,
109 for (k = 0; k < ntimes; k++, time++) {
111 R_CheckUserInterrupt();
125 if (LENGTH(ans)!=
nvars)
126 err(
"'skeleton' returns a vector of %d state variables but %d are expected.",LENGTH(ans),
nvars);
129 PROTECT(nm = GET_NAMES(ans));
131 err(
"'skeleton' must return a named numeric vector.");
134 fs = REAL(AS_NUMERIC(ans));
135 for (i = 0; i <
nvars; i++) f[posn[i]] = fs[i];
147 fs = REAL(AS_NUMERIC(ans));
148 for (i = 0; i <
nvars; i++) f[posn[i]] = fs[i];
162 double *
X,
double t,
double deltat,
163 double *time,
double *x,
double *p,
166 int nrepp,
int nreps,
int nzeros,
179 for (k = 0; k < ntimes; k++, time++,
X +=
nvars*
nreps) {
181 R_CheckUserInterrupt();
187 for (i = 0; i < nzeros; i++)
188 for (j = 0, xs = &x[zeroindex[i]]; j <
nreps; j++, xs +=
nvars)
191 for (h = 0; h < nsteps; h++) {
196 for (j = 0, xs = x; j <
nreps; j++, xs +=
nvars) {
202 if (LENGTH(ans) !=
nvars)
203 err(
"'skeleton' returns a vector of %d state variables but %d are expected.",LENGTH(ans),
nvars);
206 PROTECT(nm = GET_NAMES(ans));
207 if (
invalid_names(nm))
err(
"'skeleton' must return a named numeric vector.");
210 ap = REAL(AS_NUMERIC(ans));
211 for (i = 0; i <
nvars; i++) xs[posn[i]] = ap[i];
220 ap = REAL(AS_NUMERIC(ans));
221 for (i = 0; i <
nvars; i++) xs[posn[i]] = ap[i];
246 double *f,
double *time,
double *x,
double *p,
248 int nrepx,
int nrepp,
int nreps,
249 int *sidx,
int *pidx,
int *cidx,
256 for (k = 0; k < ntimes; k++, time++) {
258 R_CheckUserInterrupt();
264 xp = &x[
nvars*((j%nrepx)+nrepx*k)];
265 pp = &p[
npars*(j%nrepp)];
267 (*fun)(f,xp,pp,sidx,pidx,cidx,
cov,*time);
275 double *
X,
double t,
double deltat,
276 double *time,
double *x,
double *p,
278 int nrepp,
int nreps,
int nzeros,
279 int *sidx,
int *pidx,
int *cidx,
287 for (k = 0; k < ntimes; k++, time++,
X +=
nvars*
nreps) {
289 R_CheckUserInterrupt();
295 for (i = 0; i < nzeros; i++)
296 for (j = 0, xs = &x[zeroindex[i]]; j <
nreps; j++, xs +=
nvars)
299 for (h = 0; h < nsteps; h++) {
306 (*fun)(Xs,xs,p+
npars*(j%nrepp),sidx,pidx,cidx,
cov,t);
320 if (nsteps == 0) memcpy(
X,x,
nvars*
nreps*
sizeof(
double));
332 SEXP
Snames, Cnames, Pnames;
333 SEXP pompfun,
cov, ob;
337 PROTECT(t = AS_NUMERIC(t));
341 dim = INTEGER(GET_DIM(x));
342 nvars = dim[0]; nrepx = dim[1];
343 if (ntimes != dim[2])
344 err(
"length of 'times' and 3rd dimension of 'x' do not agree.");
347 dim = INTEGER(GET_DIM(
params));
348 npars = dim[0]; nrepp = dim[1];
351 nreps = (nrepp > nrepx) ? nrepp : nrepx;
352 if ((
nreps % nrepp != 0) || (
nreps % nrepx != 0))
353 err(
"2nd dimensions of 'x' and 'params' are incompatible");
355 PROTECT(
Snames = GET_ROWNAMES(GET_DIMNAMES(x)));
356 PROTECT(Pnames = GET_ROWNAMES(GET_DIMNAMES(
params)));
364 PROTECT(ob = GET_SLOT(
object,install(
"skeleton")));
365 PROTECT(pompfun = GET_SLOT(ob,install(
"skel.fn")));
369 PROTECT(
args = GET_SLOT(
object,install(
"userdata")));
384 &covariate_table,REAL(
cov));
391 int *sidx, *pidx, *cidx;
394 sidx = INTEGER(GET_SLOT(pompfun,install(
"stateindex")));
395 pidx = INTEGER(GET_SLOT(pompfun,install(
"paramindex")));
396 cidx = INTEGER(GET_SLOT(pompfun,install(
"covarindex")));
398 *((
void **) (&ff)) = R_ExternalPtrAddr(
fn);
401 REAL(F),REAL(t),REAL(x),REAL(
params),
403 sidx,pidx,cidx,&covariate_table,ff,
args,REAL(
cov));
411 double *ft = REAL(F);
413 for (i = 0; i < n; i++, ft++) *ft = R_NaReal;
414 warn(
"'skeleton' unspecified: NAs generated.");
int num_map_steps(double, double, double)
lookup_table_t make_covariate_table(SEXP, int *)
SEXP pomp_fun_handler(SEXP, SEXP, pompfunmode *, SEXP, SEXP, SEXP, SEXP)
void table_lookup(lookup_table_t *, double, double *)
SEXP get_covariate_names(SEXP)
void pomp_skeleton(double *f, const double *x, const double *p, const int *stateindex, const int *parindex, const int *covindex, const double *covars, double t)
static R_INLINE void fixdimnames(SEXP x, const char **names, int n)
static R_INLINE void setrownames(SEXP x, SEXP names, int rank)
static R_INLINE SEXP matchnames(SEXP provided, SEXP needed, const char *where)
static R_INLINE SEXP makearray(int rank, const int *dim)
static R_INLINE SEXP as_state_array(SEXP x)
static R_INLINE int invalid_names(SEXP names)
static R_INLINE SEXP as_matrix(SEXP x)
void eval_skeleton_native(double *f, double *time, double *x, double *p, int nvars, int npars, int ncovars, int ntimes, int nrepx, int nrepp, int nreps, int *sidx, int *pidx, int *cidx, lookup_table_t *covar_table, pomp_skeleton *fun, SEXP args, double *cov)
static R_INLINE SEXP ret_array(int nvars, int nreps, int ntimes, SEXP Snames)
SEXP add_skel_args(SEXP args, SEXP Snames, SEXP Pnames, SEXP Cnames)
SEXP do_skeleton(SEXP object, SEXP x, SEXP t, SEXP params, SEXP gnsi)
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 iterate_skeleton_R(double *X, double t, double deltat, double *time, double *x, double *p, SEXP fn, SEXP args, SEXP Snames, int nvars, int npars, int ncovars, int ntimes, int nrepp, int nreps, int nzeros, lookup_table_t *covar_table, int *zeroindex, double *cov)
void eval_skeleton_R(double *f, double *time, double *x, double *p, SEXP fn, SEXP args, SEXP Snames, int nvars, int npars, int ncovars, int ntimes, int nrepx, int nrepp, int nreps, lookup_table_t *covar_table, double *cov)
void iterate_skeleton_native(double *X, double t, double deltat, double *time, double *x, double *p, int nvars, int npars, int ncovars, int ntimes, int nrepp, int nreps, int nzeros, int *sidx, int *pidx, int *cidx, lookup_table_t *covar_table, int *zeroindex, pomp_skeleton *fun, SEXP args, double *cov)
lookup_table_t covar_table