112{
113
116 SEXP
Snames, Pnames, Cnames, Onames;
117 SEXP cvec, pompfun;
119 SEXP F;
120 int *dim;
123
124 PROTECT(times = AS_NUMERIC(times));
125 ntimes = length(times);
126 if (ntimes < 1)
err(
"length('times') = 0, no work to do.");
127
129 dim = INTEGER(GET_DIM(y));
130 nobs = dim[0];
131
132 if (ntimes != dim[1])
133 err(
"length of 'times' and 2nd dimension of 'y' do not agree.");
134
136 dim = INTEGER(GET_DIM(x));
137 nvars = dim[0]; nrepsx = dim[1];
138
139 if (ntimes != dim[2])
140 err(
"length of 'times' and 3rd dimension of 'x' do not agree.");
141
143 dim = INTEGER(GET_DIM(
params));
144 npars = dim[0]; nrepsp = dim[1];
145
146 nreps = (nrepsp > nrepsx) ? nrepsp : nrepsx;
147
148 if ((
nreps % nrepsp != 0) || (
nreps % nrepsx != 0))
149 err(
"larger number of replicates is not a multiple of smaller.");
150
151 PROTECT(Onames = GET_ROWNAMES(GET_DIMNAMES(y)));
152 PROTECT(
Snames = GET_ROWNAMES(GET_DIMNAMES(x)));
153 PROTECT(Pnames = GET_ROWNAMES(GET_DIMNAMES(
params)));
155
156
158 PROTECT(cvec = NEW_NUMERIC(
ncovars));
160
161
162 PROTECT(pompfun = GET_SLOT(object,install("dmeasure")));
164
165
166 PROTECT(
args = GET_SLOT(
object,install(
"userdata")));
167
168
170
171 int nprotect = 13;
172
174
176
177 double *ys = REAL(y), *xs = REAL(x), *ps = REAL(
params), *time = REAL(times);
178 double *ft = REAL(F);
179 int j, k;
180
181
183
184 for (k = 0; k < ntimes; k++, time++, ys += nobs) {
185
186 R_CheckUserInterrupt();
187
189
190 for (j = 0; j <
nreps; j++, ft++) {
191
192
193 PROTECT(
196 time,
197 ys,nobs,
201 )
202 );
203
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));
206
207 *ft = *(REAL(AS_NUMERIC(ans)));
208
209 UNPROTECT(1);
210
211 }
212 }
213 }
214
215 break;
216
218 int *oidx, *sidx, *pidx, *cidx;
219 int give_log;
221 double *yp = REAL(y), *xs = REAL(x), *ps = REAL(
params), *time = REAL(times);
222 double *ft = REAL(F);
223 double *xp, *pp;
224 int j, k;
225
226
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")));
231
232 give_log = *(INTEGER(AS_INTEGER(log)));
233
234
235 *((
void **) (&ff)) = R_ExternalPtrAddr(
fn);
236
237 for (k = 0; k < ntimes; k++, time++, yp += nobs) {
238
239 R_CheckUserInterrupt();
240
241
243
244 for (j = 0; j <
nreps; j++, ft++) {
245
246 xp = &xs[
nvars*((j%nrepsx)+nrepsx*k)];
247 pp = &ps[
npars*(j%nrepsp)];
248
249 (*ff)(ft,yp,xp,pp,give_log,oidx,sidx,pidx,cidx,
cov,*time);
250
251 }
252 }
253
254 }
255
256 break;
257
258 default: {
259 double *ft = REAL(F);
260 int j, k;
261
262 for (k = 0; k < ntimes; k++) {
263 for (j = 0; j <
nreps; j++, ft++) {
264 *ft = R_NaReal;
265 }
266 }
267
268 warn(
"'dmeasure' unspecified: likelihood undefined.");
269
270 }
271
272 }
273
274 UNPROTECT(nprotect);
275 return F;
276}
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)
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)
static R_INLINE SEXP ret_array(int nreps, int ntimes)
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)
static R_INLINE SEXP as_state_array(SEXP x)
static R_INLINE SEXP as_matrix(SEXP x)