17 SEXP predmean, SEXP predvar,
18 SEXP filtmean, SEXP trackancestry, SEXP doparRS,
19 SEXP weights, SEXP wave)
22 SEXP pm = R_NilValue, pv = R_NilValue, fm = R_NilValue;
23 SEXP anc = R_NilValue, wmean = R_NilValue;
25 SEXP newstates = R_NilValue, newparams = R_NilValue;
26 SEXP retval, retvalnames;
27 const char *dimnm[2] = {
"name",
".id"};
29 long double w = 0, ws, maxw, sum;
31 SEXP dimX, dimP, newdim, Xnames, Pnames;
34 int do_pm, do_pv, do_fm, do_ta, do_pr, do_wave, all_fail = 0;
37 PROTECT(dimX = GET_DIM(x));
40 PROTECT(Xnames = GET_ROWNAMES(GET_DIMNAMES(x)));
43 PROTECT(dimP = GET_DIM(
params));
46 if (
nreps % dim[1] != 0)
47 err(
"ncol('states') should be a multiple of ncol('params')");
48 PROTECT(Pnames = GET_ROWNAMES(GET_DIMNAMES(
params)));
50 PROTECT(weights = duplicate(weights));
52 np = *(INTEGER(AS_INTEGER(Np)));
54 do_pm = *(LOGICAL(AS_LOGICAL(predmean)));
55 do_pv = *(LOGICAL(AS_LOGICAL(predvar)));
56 do_fm = *(LOGICAL(AS_LOGICAL(filtmean)));
57 do_ta = *(LOGICAL(AS_LOGICAL(trackancestry)));
59 do_pr = *(LOGICAL(AS_LOGICAL(doparRS)));
61 do_wave = *(LOGICAL(AS_LOGICAL(wave)));
65 err(
"ncol('states') should be equal to ncol('params')");
68 PROTECT(ess = NEW_NUMERIC(1));
69 PROTECT(loglik = NEW_NUMERIC(1));
76 for (k = 0, maxw = R_NegInf; k <
nreps; k++) {
78 if (ISNAN(xw[k]) || xw[k] == R_PosInf) {
79 PROTECT(retval = NEW_INTEGER(1)); nprotect++;
80 *INTEGER(retval) = k+1;
85 if (maxw < xw[k]) maxw = xw[k];
89 if (maxw == R_NegInf) all_fail = 1;
93 *(REAL(loglik)) = R_NegInf;
99 for (k = 0, w = 0, ws = 0; k <
nreps; k++) {
100 xw[k] = exp(xw[k]-maxw);
107 *(REAL(loglik)) = maxw + log(w/((
long double)
nreps));
108 *(REAL(ess)) = w*w/ws;
111 if (do_pm || do_pv) {
112 PROTECT(pm = NEW_NUMERIC(
nvars)); nprotect++;
116 PROTECT(pv = NEW_NUMERIC(
nvars)); nprotect++;
120 PROTECT(fm = NEW_NUMERIC(
nvars)); nprotect++;
124 PROTECT(anc = NEW_INTEGER(np)); nprotect++;
129 PROTECT(wmean = NEW_NUMERIC(
npars)); nprotect++;
130 SET_NAMES(wmean,Pnames);
133 if (do_pm || do_pv) {
134 double *tmp = (do_pv) ? REAL(pv) : 0;
146 warn(
"%s %s",
"filtering failure at last filter iteration:",
147 "using unweighted mean for point estimate.");
148 double *xwm = REAL(wmean);
149 for (j = 0; j <
npars; j++, xwm++) {
150 double *xp = REAL(
params)+j;
152 for (k = 0, sum = 0; k <
nreps; k++, xp +=
npars) sum += *xp;
153 *xwm = sum/((
long double)
nreps);
155 for (k = 0, sum = 0; k <
nreps; k++, xp +=
npars) {
156 if (xw[k]!=0) sum += xw[k]*(*xp);
168 double *ss = 0, *st = 0, *ps = 0, *pt = 0;
171 xdim[0] =
nvars; xdim[1] = np;
172 PROTECT(newstates =
makearray(2,xdim)); nprotect++;
176 st = REAL(newstates);
180 xdim[0] =
npars; xdim[1] = np;
181 PROTECT(newparams =
makearray(2,xdim)); nprotect++;
185 pt = REAL(newparams);
190 for (k = 0; k < np; k++) {
193 for (j = 0, xx = ss+
nvars*sp; j <
nvars; j++, st++, xx++)
196 for (j = 0, xp = ps+
npars*sp; j <
npars; j++, pt++, xp++)
199 if (do_ta) xanc[k] = sp+1;
204 PROTECT(newdim = NEW_INTEGER(2)); nprotect++;
205 dim = INTEGER(newdim);
212 for (k = 0; k < np; k++) xanc[k] = k+1;
217 PROTECT(retval = NEW_LIST(9));
218 PROTECT(retvalnames = NEW_CHARACTER(9));
220 SET_STRING_ELT(retvalnames,0,mkChar(
"loglik"));
221 SET_STRING_ELT(retvalnames,1,mkChar(
"ess"));
222 SET_STRING_ELT(retvalnames,2,mkChar(
"states"));
223 SET_STRING_ELT(retvalnames,3,mkChar(
"params"));
224 SET_STRING_ELT(retvalnames,4,mkChar(
"pm"));
225 SET_STRING_ELT(retvalnames,5,mkChar(
"pv"));
226 SET_STRING_ELT(retvalnames,6,mkChar(
"fm"));
227 SET_STRING_ELT(retvalnames,7,mkChar(
"ancestry"));
228 SET_STRING_ELT(retvalnames,8,mkChar(
"wmean"));
229 SET_NAMES(retval,retvalnames);
231 SET_ELEMENT(retval,0,loglik);
232 SET_ELEMENT(retval,1,ess);
235 SET_ELEMENT(retval,2,x);
237 SET_ELEMENT(retval,2,newstates);
240 if (all_fail || !do_pr) {
241 SET_ELEMENT(retval,3,
params);
243 SET_ELEMENT(retval,3,newparams);
247 SET_ELEMENT(retval,4,pm);
250 SET_ELEMENT(retval,5,pv);
253 SET_ELEMENT(retval,6,fm);
256 SET_ELEMENT(retval,7,anc);
259 SET_ELEMENT(retval,8,wmean);