92{
93
94 SEXP Pnames, Cnames,
Snames, pcnames;
95 SEXP x = R_NilValue;
99 SEXP cvec;
101 int *dim;
102 int npar, nrep, nvar,
ncovars, nsims, ns;
103
104 nsims = *(INTEGER(AS_INTEGER(nsim)));
106 PROTECT(Pnames = GET_ROWNAMES(GET_DIMNAMES(
params)));
107 PROTECT(pcnames = GET_COLNAMES(GET_DIMNAMES(
params)));
108
109 dim = INTEGER(GET_DIM(
params));
110 npar = dim[0]; nrep = dim[1];
111 ns = nsims*nrep;
112
113
116 PROTECT(cvec = NEW_NUMERIC(
ncovars));
118
120
121
122 PROTECT(
args = GET_SLOT(
object,install(
"userdata")));
123
124 PROTECT(pompfun = GET_SLOT(object,install("rinit")));
125 PROTECT(
Snames = GET_SLOT(pompfun,install(
"statenames")));
126
128
129 int nprotect = 9;
130
133
134 SEXP ans;
135 double *time = REAL(AS_NUMERIC(t0));
136 double *ps = REAL(
params);
137 double *xs, *xt = NULL;
138 int *midx;
139 int j;
140
143 PROTECT(ans = AS_NUMERIC(ans));
144 PROTECT(
Snames = GET_NAMES(ans));
145
147 err(
"user 'rinit' must return a named numeric vector.");
148
149 nvar = LENGTH(ans);
150 xs = REAL(ans);
151 midx = INTEGER(PROTECT(match(Pnames,
Snames,0)));
152
153 for (j = 0; j < nvar; j++) {
154 if (midx[j] != 0)
155 err(
"a state variable and a parameter share the name: '%s'.",CHAR(STRING_ELT(
Snames,j)));
156 }
157
159 xt = REAL(x);
160
161 memcpy(xt,xs,nvar*sizeof(double));
162
163 nprotect += 6;
164
165 for (j = 1, xt += nvar; j < ns; j++, xt += nvar) {
167 xs = REAL(ans);
168 if (LENGTH(ans) != nvar)
169 err(
"user 'rinit' returns vectors of variable length.");
170 memcpy(xt,xs,nvar*sizeof(double));
171 UNPROTECT(1);
172 }
173
174 }
175
176 break;
177
179
180 int *sidx, *pidx, *cidx;
181 double *xt, *ps, time;
183 int j;
184
185 nvar = *INTEGER(GET_SLOT(object,install("nstatevars")));
187
188 sidx = INTEGER(GET_SLOT(pompfun,install("stateindex")));
189 pidx = INTEGER(GET_SLOT(pompfun,install("paramindex")));
190 cidx = INTEGER(GET_SLOT(pompfun,install("covarindex")));
191
192
193 *((
void **) (&ff)) = R_ExternalPtrAddr(
fn);
194
195 GetRNGstate();
196
197 time = *(REAL(t0));
198
199
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);
202
203 PutRNGstate();
204
205 }
206
207 break;
208
209 default: {
210
212
213 }
214
215 break;
216
217 }
218
219
220 if (nrep > 1) {
221 SEXP dn, xn;
222 int k, *p;
223
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;
227 }
228
229 if (nsims > 1) {
230 int k, *sp;
231 SEXP us;
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));
237 nprotect += 4;
238 SET_ELEMENT(dn,1,xn);
239 SET_DIMNAMES(x,dn);
240
241 } else {
242
243 PROTECT(dn = GET_DIMNAMES(x)); nprotect++;
244 SET_ELEMENT(dn,1,pcnames);
245 SET_DIMNAMES(x,dn);
246
247 }
248 }
249
250 UNPROTECT(nprotect);
251 return x;
252}
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_rinit(double *x, const double *p, double t0, const int *stateindex, const int *parindex, const int *covindex, const double *covars)
static R_INLINE int invalid_names(SEXP names)
static R_INLINE SEXP as_matrix(SEXP x)
static R_INLINE SEXP ret_array(int m, int n, SEXP names)
static R_INLINE SEXP paste0(SEXP a, SEXP b, SEXP c)
static SEXP pomp_default_rinit(SEXP params, SEXP Pnames, int npar, int nrep, int nsim)
static R_INLINE SEXP eval_call(SEXP fn, SEXP args, double *t0, double *p, int npar, double *c, int ncov)
static R_INLINE SEXP add_args(SEXP args, SEXP Pnames, SEXP Cnames)