26 PROTECT(
args = VectorToPairList(
args));
29 for (v = LENGTH(Cnames)-1; v >= 0; v--) {
34 SET_TAG(
args,installChar(STRING_ELT(Cnames,v)));
38 for (v = LENGTH(Pnames)-1; v >= 0; v--) {
43 SET_TAG(
args,installChar(STRING_ELT(Pnames,v)));
51 SET_TAG(
args,install(
"t0"));
61 double *t0,
double *p,
int npar,
double *c,
int ncov
64 SEXP var =
args, ans, ob;
67 *(REAL(CAR(var))) = *t0; var = CDR(var);
68 for (v = 0; v < npar; v++, p++, var=CDR(var)) *(REAL(CAR(var))) = *p;
69 for (v = 0; v < ncov; v++, c++, var=CDR(var)) *(REAL(CAR(var))) = *c;
71 PROTECT(ob = LCONS(
fn,
args));
72 PROTECT(ans = eval(ob,CLOENV(
fn)));
94 SEXP Pnames, Cnames,
Snames, pcnames;
102 int npar, nrep, nvar,
ncovars, nsims, ns;
104 nsims = *(INTEGER(AS_INTEGER(nsim)));
106 PROTECT(Pnames = GET_ROWNAMES(GET_DIMNAMES(
params)));
107 PROTECT(pcnames = GET_COLNAMES(GET_DIMNAMES(
params)));
109 dim = INTEGER(GET_DIM(
params));
110 npar = dim[0]; nrep = dim[1];
116 PROTECT(cvec = NEW_NUMERIC(
ncovars));
122 PROTECT(
args = GET_SLOT(
object,install(
"userdata")));
124 PROTECT(pompfun = GET_SLOT(
object,install(
"rinit")));
125 PROTECT(
Snames = GET_SLOT(pompfun,install(
"statenames")));
135 double *time = REAL(AS_NUMERIC(t0));
136 double *ps = REAL(
params);
137 double *xs, *xt = NULL;
143 PROTECT(ans = AS_NUMERIC(ans));
144 PROTECT(
Snames = GET_NAMES(ans));
147 err(
"user 'rinit' must return a named numeric vector.");
151 midx = INTEGER(PROTECT(match(Pnames,
Snames,0)));
153 for (j = 0; j < nvar; j++) {
155 err(
"a state variable and a parameter share the name: '%s'.",CHAR(STRING_ELT(
Snames,j)));
161 memcpy(xt,xs,nvar*
sizeof(
double));
165 for (j = 1, xt += nvar; j < ns; j++, xt += nvar) {
168 if (LENGTH(ans) != nvar)
169 err(
"user 'rinit' returns vectors of variable length.");
170 memcpy(xt,xs,nvar*
sizeof(
double));
180 int *sidx, *pidx, *cidx;
181 double *xt, *ps, time;
185 nvar = *INTEGER(GET_SLOT(
object,install(
"nstatevars")));
188 sidx = INTEGER(GET_SLOT(pompfun,install(
"stateindex")));
189 pidx = INTEGER(GET_SLOT(pompfun,install(
"paramindex")));
190 cidx = INTEGER(GET_SLOT(pompfun,install(
"covarindex")));
193 *((
void **) (&ff)) = R_ExternalPtrAddr(
fn);
200 for (j = 0, xt = REAL(x), ps = REAL(
params); j < ns; j++, xt += nvar)
201 (*ff)(xt,ps+npar*(j%nrep),time,sidx,pidx,cidx,
cov);
224 if (isNull(pcnames)) {
225 PROTECT(pcnames = NEW_INTEGER(nrep)); nprotect++;
226 for (k = 0, p = INTEGER(pcnames); k < nrep; k++, p++) *p = k+1;
232 PROTECT(us = mkString(
"_"));
233 PROTECT(xn = NEW_INTEGER(ns));
234 for (k = 0, sp = INTEGER(xn); k < ns; k++, sp++) *sp = (k/nrep)+1;
235 PROTECT(xn =
paste0(pcnames,us,xn));
236 PROTECT(dn = GET_DIMNAMES(x));
238 SET_ELEMENT(dn,1,xn);
243 PROTECT(dn = GET_DIMNAMES(x)); nprotect++;
244 SET_ELEMENT(dn,1,pcnames);
255 int npar,
int nrep,
int nsim)
258 SEXP fcall, pat, ivpnames, statenames, x;
264 PROTECT(pat = mkString(
"[\\_\\.]0$"));
265 PROTECT(fcall = LCONS(ScalarLogical(1),R_NilValue));
266 SET_TAG(fcall,install(
"value"));
267 PROTECT(fcall = LCONS(Pnames,fcall));
268 SET_TAG(fcall,install(
"x"));
269 PROTECT(fcall = LCONS(pat,fcall));
270 SET_TAG(fcall,install(
"pattern"));
271 PROTECT(fcall = LCONS(install(
"grep"),fcall));
272 PROTECT(ivpnames = eval(fcall,R_BaseEnv));
274 nvar = LENGTH(ivpnames);
276 warn(
"in default 'rinit': there are no parameters with suffix '.0' or '_0'. See '?rinit_spec'.");
278 pidx = INTEGER(PROTECT(match(Pnames,ivpnames,0)));
279 for (k = 0; k < nvar; k++) pidx[k]--;
282 PROTECT(fcall = LCONS(ivpnames,R_NilValue));
283 SET_TAG(fcall,install(
"x"));
284 PROTECT(fcall = LCONS(mkString(
""),fcall));
285 SET_TAG(fcall,install(
"replacement"));
286 PROTECT(fcall = LCONS(pat,fcall));
287 SET_TAG(fcall,install(
"pattern"));
288 PROTECT(fcall = LCONS(install(
"sub"),fcall));
289 PROTECT(statenames = eval(fcall,R_BaseEnv));
291 PROTECT(x =
ret_array(nvar,nsim,statenames));
293 for (j = 0, xp = REAL(x); j < nsim; j++) {
294 pp = REAL(
params) + npar*(j%nrep);
295 for (k = 0; k < nvar; k++, xp++) *xp = pp[pidx[k]];
void pomp_rinit(double *x, const double *p, double t0, const int *stateindex, const int *parindex, const int *covindex, const double *covars)
static R_INLINE SEXP eval_call(SEXP fn, SEXP args, double *t0, double *p, int npar, double *c, int ncov)