pomp
Inference for partially observed Markov processes
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
trajectory.c
Go to the documentation of this file.
1// -*- C++ -*-
2
3#include <Rdefines.h>
4#include "internal.h"
5
6static R_INLINE SEXP ret_array (int nvars, int nreps, int ntimes, SEXP Snames, SEXP repnames)
7{
8 SEXP X;
9 int dim[3] = {nvars, nreps, ntimes};
10 const char *dimnms[3] = {"name",".id","time"};
11 PROTECT(X = makearray(3,dim));
13 setcolnames(X,repnames);
14 fixdimnames(X,dimnms,3);
15 UNPROTECT(1);
16 return X;
17}
18
19SEXP iterate_map (SEXP object, SEXP times, SEXP t0, SEXP x0, SEXP params, SEXP gnsi)
20{
21
23 SEXP fn, args;
24 SEXP X, cov;
25 SEXP Snames, Pnames, Cnames;
26 SEXP skel, pompfun;
27 SEXP accumvars;
28 SEXP repnames;
29 int *zidx = 0;
30 int nvars, npars, nreps, nrepp, ntimes, ncovars, nzeros;
31 int *dim;
32 lookup_table_t covariate_table;
33 double deltat, t;
34
35 PROTECT(skel = GET_SLOT(object,install("skeleton")));
36 deltat = *(REAL(GET_SLOT(skel,install("delta.t"))));
37 t = *(REAL(AS_NUMERIC(t0)));
38
39 PROTECT(x0 = duplicate(x0));
40 PROTECT(x0 = as_matrix(x0));
41 dim = INTEGER(GET_DIM(x0));
42 nvars = dim[0]; nreps = dim[1];
43
44 PROTECT(params = as_matrix(params));
45 dim = INTEGER(GET_DIM(params));
46 npars = dim[0]; nrepp = dim[1];
47 PROTECT(repnames = GET_COLNAMES(GET_DIMNAMES(params)));
48
49 PROTECT(times = AS_NUMERIC(times));
50 ntimes = LENGTH(times);
51
52 PROTECT(Snames = GET_ROWNAMES(GET_DIMNAMES(x0)));
53 PROTECT(Pnames = GET_ROWNAMES(GET_DIMNAMES(params)));
54 PROTECT(Cnames = get_covariate_names(GET_SLOT(object,install("covar"))));
55
56 // set up the covariate table
57 covariate_table = make_covariate_table(GET_SLOT(object,install("covar")),&ncovars);
58 PROTECT(cov = NEW_NUMERIC(ncovars));
59
60 // extract user-defined function
61 PROTECT(pompfun = GET_SLOT(skel,install("skel.fn")));
62 PROTECT(fn = pomp_fun_handler(pompfun,gnsi,&mode,Snames,Pnames,NA_STRING,Cnames));
63
64 // extract 'userdata' as pairlist
65 PROTECT(args = GET_SLOT(object,install("userdata")));
66
67 // create array to store results
68 PROTECT(X = ret_array(nvars,nreps,ntimes,Snames,repnames));
69
70 // get names and indices of accumulator variables
71 PROTECT(accumvars = GET_SLOT(object,install("accumvars")));
72 nzeros = LENGTH(accumvars);
73
74 int nprotect = 15;
75
76 if (nzeros > 0) {
77 zidx = INTEGER(PROTECT(matchnames(Snames,accumvars,"state variables"))); nprotect++;
78 }
79
80 // set up the computations
81 switch (mode) {
82
83 case Rfun: {
84
85 PROTECT(args = add_skel_args(args,Snames,Pnames,Cnames)); nprotect++;
86
87 iterate_skeleton_R(REAL(X),t,deltat,REAL(times),REAL(x0),REAL(params),
88 fn,args,Snames,nvars,npars,ncovars,ntimes,nrepp,nreps,nzeros,
89 &covariate_table,zidx,REAL(cov));
90
91 }
92
93 break;
94
95 case native: case regNative: {
96 int *sidx, *pidx, *cidx;
97 pomp_skeleton *ff;
98
99 *((void **) (&ff)) = R_ExternalPtrAddr(fn);
100
101 // construct state, parameter, covariate indices
102 sidx = INTEGER(GET_SLOT(pompfun,install("stateindex")));
103 pidx = INTEGER(GET_SLOT(pompfun,install("paramindex")));
104 cidx = INTEGER(GET_SLOT(pompfun,install("covarindex")));
105
106 iterate_skeleton_native(REAL(X),t,deltat,REAL(times),REAL(x0),REAL(params),
107 nvars,npars,ncovars,ntimes,nrepp,nreps,nzeros,sidx,pidx,cidx,
108 &covariate_table,zidx,ff,args,REAL(cov));
109
110 }
111
112 break;
113
114 default: // #nocov
115
116 break; // #nocov
117
118 }
119
120 UNPROTECT(nprotect);
121 return X;
122}
123
124static struct {
125 struct {
127 SEXP object;
128 SEXP params;
129 SEXP cov;
131 int nvars;
132 int npars;
134 int nreps;
136 union {
137 struct {
138 SEXP fn;
139 SEXP args;
140 SEXP Snames;
142 struct {
143 SEXP args;
144 SEXP sindex;
145 SEXP pindex;
146 SEXP cindex;
151
152#define COMMON(X) (_pomp_vf_eval_block.common.X)
153#define RFUN(X) (_pomp_vf_eval_block.shared.R_fun.X)
154#define NAT(X) (_pomp_vf_eval_block.shared.native_code.X)
155
156SEXP pomp_desolve_setup (SEXP object, SEXP x0, SEXP params, SEXP gnsi) {
157
159 SEXP fn, args;
160 SEXP Snames, Pnames, Cnames;
161 SEXP pompfun, ob;
162 int *dim;
163 int nvars, npars, nreps, ncovars;
164
165 // extract user-defined skeleton function
166 PROTECT(ob = GET_SLOT(object,install("skeleton")));
167 PROTECT(pompfun = GET_SLOT(ob,install("skel.fn")));
168 // extract 'userdata' as pairlist
169 PROTECT(args = GET_SLOT(object,install("userdata")));
170
171 COMMON(object) = object;
173 if (!isNull(COMMON(object))) R_ReleaseObject(COMMON(object));
174 if (!isNull(COMMON(params))) R_ReleaseObject(COMMON(params));
175 R_PreserveObject(COMMON(object));
176 R_PreserveObject(COMMON(params));
177
178 dim = INTEGER(GET_DIM(x0));
179 nvars = dim[0];
180 COMMON(nvars) = nvars;
181
182 dim = INTEGER(GET_DIM(params));
183 npars = dim[0]; nreps = dim[1];
184 COMMON(npars) = npars;
185 COMMON(nreps) = nreps;
186
187 // set up the covariate table
188 COMMON(covar_table) = make_covariate_table(GET_SLOT(object,install("covar")),&ncovars);
190 PROTECT(COMMON(cov) = NEW_NUMERIC(ncovars));
191 R_PreserveObject(COMMON(cov));
192
193 PROTECT(Snames = GET_ROWNAMES(GET_DIMNAMES(x0)));
194 PROTECT(Pnames = GET_ROWNAMES(GET_DIMNAMES(params)));
195 PROTECT(Cnames = get_covariate_names(GET_SLOT(object,install("covar"))));
196
197 PROTECT(fn = pomp_fun_handler(pompfun,gnsi,&mode,Snames,Pnames,NA_STRING,Cnames));
198
199 COMMON(mode) = mode;
200
201 int nprotect = 8;
202
203 switch (COMMON(mode)) {
204
205 case Rfun: {
206
207 PROTECT(RFUN(fn) = fn);
208 PROTECT(RFUN(args) = add_skel_args(args,Snames,Pnames,Cnames));
209 PROTECT(RFUN(Snames) = Snames);
210 nprotect += 3;
211
212 if (!isNull(RFUN(fn))) R_ReleaseObject(RFUN(fn));
213 if (!isNull(RFUN(args))) R_ReleaseObject(RFUN(args));
214 if (!isNull(RFUN(Snames))) R_ReleaseObject(RFUN(Snames));
215
216 R_PreserveObject(RFUN(fn));
217 R_PreserveObject(RFUN(args));
218 R_PreserveObject(RFUN(Snames));
219
220 }
221
222 break;
223
224 case native: case regNative: {
225
226 NAT(args) = args;
227
228 PROTECT(NAT(sindex) = GET_SLOT(pompfun,install("stateindex")));
229 PROTECT(NAT(pindex) = GET_SLOT(pompfun,install("paramindex")));
230 PROTECT(NAT(cindex) = GET_SLOT(pompfun,install("covarindex")));
231 nprotect += 3;
232
233 *((void **) (&(NAT(fun)))) = R_ExternalPtrAddr(fn);
234
235 if (!isNull(NAT(args))) R_ReleaseObject(NAT(args));
236 if (!isNull(NAT(sindex))) R_ReleaseObject(NAT(sindex));
237 if (!isNull(NAT(pindex))) R_ReleaseObject(NAT(pindex));
238 if (!isNull(NAT(cindex))) R_ReleaseObject(NAT(cindex));
239
240 R_PreserveObject(NAT(args));
241 R_PreserveObject(NAT(sindex));
242 R_PreserveObject(NAT(pindex));
243 R_PreserveObject(NAT(cindex));
244
245 }
246
247 break;
248
249 default: // #nocov
250
251 err("in 'pomp_desolve_setup': unrecognized 'mode'"); // # nocov
252
253 }
254
255 UNPROTECT(nprotect);
256
257 return R_NilValue;
258}
259
260void pomp_vf_eval (int *neq, double *t, double *y, double *ydot, double *yout, int *ip)
261{
262 switch (COMMON(mode)) {
263
264 case Rfun: // R function
265
266 eval_skeleton_R(ydot,t,y,REAL(COMMON(params)),
270 &COMMON(covar_table),REAL(COMMON(cov)));
271
272 break;
273
274 case native: case regNative: // native code
275 eval_skeleton_native(ydot,t,y,REAL(COMMON(params)),
278 INTEGER(NAT(sindex)),INTEGER(NAT(pindex)),INTEGER(NAT(cindex)),
280
281 break;
282
283 default: // #nocov
284
285 err("in 'pomp_vf_eval': unrecognized 'mode'"); // # nocov
286
287 break;
288
289 }
290}
291
293 R_ReleaseObject(COMMON(object));
294 R_ReleaseObject(COMMON(params));
295 R_ReleaseObject(COMMON(cov));
296 COMMON(object) = R_NilValue;
297 COMMON(params) = R_NilValue;
298 COMMON(cov) = R_NilValue;
299 COMMON(nvars) = 0;
300 COMMON(npars) = 0;
301 COMMON(ncovars) = 0;
302 COMMON(nreps) = 0;
303
304 switch (COMMON(mode)) {
305
306 case Rfun: {
307
308 R_ReleaseObject(RFUN(fn));
309 R_ReleaseObject(RFUN(args));
310 R_ReleaseObject(RFUN(Snames));
311 RFUN(fn) = R_NilValue;
312 RFUN(args) = R_NilValue;
313 RFUN(Snames) = R_NilValue;
314
315 }
316
317 break;
318
319 case native: case regNative: {
320
321 NAT(fun) = 0;
322 R_ReleaseObject(NAT(args));
323 R_ReleaseObject(NAT(sindex));
324 R_ReleaseObject(NAT(pindex));
325 R_ReleaseObject(NAT(cindex));
326 NAT(args) = R_NilValue;
327 NAT(sindex) = R_NilValue;
328 NAT(pindex) = R_NilValue;
329 NAT(cindex) = R_NilValue;
330
331 }
332
333 break;
334
335 default: // #nocov
336
337 err("in 'pomp_desolve_takedown': unrecognized 'mode'"); // # nocov
338
339 break;
340
341 }
342
343 COMMON(mode) = undef;
344
345 return R_NilValue;
346}
347
348#undef COMMON
349#undef RFUN
350#undef NAT
void eval_skeleton_R(double *, double *, double *, double *, SEXP, SEXP, SEXP, int, int, int, int, int, int, int, lookup_table_t *, double *)
Definition skeleton.c:94
void eval_skeleton_native(double *, double *, double *, double *, int, int, int, int, int, int, int, int *, int *, int *, lookup_table_t *, pomp_skeleton *, SEXP, double *)
Definition skeleton.c:245
lookup_table_t make_covariate_table(SEXP, int *)
SEXP add_skel_args(SEXP, SEXP, SEXP, SEXP)
Definition skeleton.c:10
SEXP pomp_fun_handler(SEXP, SEXP, pompfunmode *, SEXP, SEXP, SEXP, SEXP)
Definition pomp_fun.c:30
void iterate_skeleton_R(double *, double, double, double *, double *, double *, SEXP, SEXP, SEXP, int, int, int, int, int, int, int, lookup_table_t *, int *, double *)
Definition skeleton.c:161
void iterate_skeleton_native(double *, double, double, double *, double *, double *, int, int, int, int, int, int, int, int *, int *, int *, lookup_table_t *, int *, pomp_skeleton *, SEXP, double *)
Definition skeleton.c:274
SEXP get_covariate_names(SEXP)
Definition lookup_table.c:7
#define X
Definition gompertz.c:14
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)
Definition pomp.h:73
#define err(...)
Definition pomp.h:21
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 void setcolnames(SEXP x, SEXP names)
static R_INLINE SEXP makearray(int rank, const int *dim)
pompfunmode
@ Rfun
@ native
@ undef
@ regNative
static R_INLINE SEXP as_matrix(SEXP x)
struct @0::@1 common
#define RFUN(X)
Definition trajectory.c:153
int npars
Definition trajectory.c:132
struct @0::@2::@4 native_code
static R_INLINE SEXP ret_array(int nvars, int nreps, int ntimes, SEXP Snames, SEXP repnames)
Definition trajectory.c:6
SEXP Snames
Definition trajectory.c:140
void pomp_vf_eval(int *neq, double *t, double *y, double *ydot, double *yout, int *ip)
Definition trajectory.c:260
SEXP iterate_map(SEXP object, SEXP times, SEXP t0, SEXP x0, SEXP params, SEXP gnsi)
Definition trajectory.c:19
static struct @0 _pomp_vf_eval_block
int ncovars
Definition trajectory.c:133
SEXP params
Definition trajectory.c:128
SEXP pomp_desolve_setup(SEXP object, SEXP x0, SEXP params, SEXP gnsi)
Definition trajectory.c:156
pompfunmode mode
Definition trajectory.c:126
lookup_table_t covar_table
Definition trajectory.c:130
int nreps
Definition trajectory.c:134
#define COMMON(X)
Definition trajectory.c:152
SEXP cindex
Definition trajectory.c:146
SEXP args
Definition trajectory.c:139
pomp_skeleton * fun
Definition trajectory.c:147
struct @0::@2::@3 R_fun
SEXP sindex
Definition trajectory.c:144
SEXP pindex
Definition trajectory.c:145
SEXP pomp_desolve_takedown(void)
Definition trajectory.c:292
SEXP cov
Definition trajectory.c:129
#define NAT(X)
Definition trajectory.c:154
SEXP object
Definition trajectory.c:127
SEXP fn
Definition trajectory.c:138
int nvars
Definition trajectory.c:131
union @0::@2 shared