59{
60
63 SEXP Pnames, pompfun,
fn,
args;
64 int *dim;
65
67 dim = INTEGER(GET_DIM(
params));
69
70 PROTECT(Pnames = GET_ROWNAMES(GET_DIMNAMES(
params)));
71
72
73 PROTECT(pompfun = GET_SLOT(object,install("rprior")));
75
76
77 PROTECT(
args = GET_SLOT(
object,install(
"userdata")));
78
79 int nprotect = 5;
80 int first = 1;
81
83
85
86 SEXP ans, nm;
87 double *pa, *p = REAL(
params);
88 int *posn = NULL;
89 int i, j;
90
91
93
95
96 if (first) {
97
99 PROTECT(ans = AS_NUMERIC(ans));
100
101 PROTECT(nm = GET_NAMES(ans));
103 err(
"'rprior' must return a named numeric vector.");
104 posn = INTEGER(PROTECT(
matchnames(Pnames,nm,
"parameters")));
105
106 nprotect += 4;
107
108 pa = REAL(ans);
109 for (i = 0; i < LENGTH(ans); i++) p[posn[i]] = pa[i];
110
111 first = 0;
112
113 } else {
114
116 PROTECT(ans = AS_NUMERIC(ans));
117
118 pa = REAL(ans);
119 for (i = 0; i < LENGTH(ans); i++) p[posn[i]] = pa[i];
120
121 UNPROTECT(2);
122
123 }
124 }
125 }
126
127 break;
128
130
131 double *p;
132 int *pidx = 0;
134 int j;
135
136
137 pidx = INTEGER(GET_SLOT(pompfun,install("paramindex")));
138
139
140 *((
void **) (&ff)) = R_ExternalPtrAddr(
fn);
141
142 R_CheckUserInterrupt();
143
144 GetRNGstate();
145
146
148 (*ff)(p,pidx);
149
150 PutRNGstate();
151
152 }
153
154 break;
155
156 default:
157
158 warn(
"'rprior' unspecified: duplicating parameters.");
159
160 }
161
162 UNPROTECT(nprotect);
164}
SEXP pomp_fun_handler(SEXP, SEXP, pompfunmode *, SEXP, SEXP, SEXP, SEXP)
void pomp_rprior(double *p, const int *parindex)
static R_INLINE SEXP matchnames(SEXP provided, SEXP needed, const char *where)
static R_INLINE int invalid_names(SEXP names)
static R_INLINE SEXP eval_call(SEXP fn, SEXP args, double *p, int n)
static R_INLINE SEXP ret_array(SEXP params)
static R_INLINE SEXP add_args(SEXP args, SEXP names)