52{
53
56 SEXP Pnames, pompfun,
fn,
args, F;
57 int *dim;
58
60 dim = INTEGER(GET_DIM(
params));
62
63 PROTECT(Pnames = GET_ROWNAMES(GET_DIMNAMES(
params)));
64
65
66 PROTECT(pompfun = GET_SLOT(object,install("dprior")));
68
69
70 PROTECT(
args = GET_SLOT(
object,install(
"userdata")));
71
72
73 PROTECT(F = NEW_NUMERIC(
nreps));
74
75 int nprotect = 6;
76
79 SEXP ans;
80 double *ps, *pt;
81 int j;
82
84
85 for (j = 0, ps = REAL(
params), pt = REAL(F); j <
nreps; j++, ps +=
npars, pt++) {
86
88 *pt = *(REAL(AS_NUMERIC(ans)));
89 UNPROTECT(1);
90
91 }
92 }
93
94 break;
95
97 int give_log, *pidx = 0;
99 double *ps, *pt;
100 int j;
101
102
103 pidx = INTEGER(GET_SLOT(pompfun,install("paramindex")));
104
105
106 *((
void **) (&ff)) = R_ExternalPtrAddr(
fn);
107
108 give_log = *(INTEGER(AS_INTEGER(log)));
109
110 R_CheckUserInterrupt();
111
112
113 for (j = 0, pt = REAL(F), ps = REAL(
params); j <
nreps; j++, ps +=
npars, pt++)
114 (*ff)(pt,ps,give_log,pidx);
115
116 }
117
118 break;
119
120 default: {
121 int give_log, j;
122 double *pt;
123
124 give_log = *(INTEGER(AS_INTEGER(log)));
125
126
127 for (j = 0, pt = REAL(F); j <
nreps; j++, pt++)
128 *pt = (give_log) ? 0.0 : 1.0;
129
130 }
131
132 }
133
134 UNPROTECT(nprotect);
135 return F;
136}
SEXP pomp_fun_handler(SEXP, SEXP, pompfunmode *, SEXP, SEXP, SEXP, SEXP)
static R_INLINE SEXP eval_call(SEXP fn, SEXP args, double *p, int n)
static R_INLINE SEXP add_args(SEXP names, SEXP log, SEXP args)
void pomp_dprior(double *lik, const double *p, int give_log, const int *parindex)
static R_INLINE SEXP as_matrix(SEXP x)