10SEXP
wpfilter (SEXP
X, SEXP Params, SEXP Weights, SEXP W, SEXP Trigger, SEXP Target, SEXP Np)
13 SEXP dimX, dimP, Xnames, Pnames;
19 const char *dimnm[] = {
"name",
".id"};
21 PROTECT(dimX = GET_DIM(
X));
24 PROTECT(Xnames = GET_ROWNAMES(GET_DIMNAMES(
X)));
27 PROTECT(dimP = GET_DIM(Params));
30 if (dim[1] > 1 &&
nreps != dim[1])
31 err(
"ncol('params') does not match ncol('states')");
32 PROTECT(Pnames = GET_ROWNAMES(GET_DIMNAMES(Params)));
34 np = *INTEGER(AS_INTEGER(Np));
38 PROTECT(Weights = duplicate(AS_NUMERIC(Weights)));
39 PROTECT(W = duplicate(AS_NUMERIC(W)));
43 double trigger, target;
44 trigger = *REAL(AS_NUMERIC(Trigger));
45 target = *REAL(AS_NUMERIC(Target));
48 long double maxlogw = R_NegInf, oldw = 0;
49 double *xW = REAL(Weights);
51 for (k = 0; k <
nreps; k++, xw++, xW++) {
56 if (ISNAN(*xW) || *xW == R_PosInf) {
58 PROTECT(rv = ScalarInteger(k+1)); nprotect++;
63 if (maxlogw < *xW) maxlogw = *xW;
68 SEXP retval, retvalnames, newdim;
70 PROTECT(retval = NEW_LIST(5));
71 PROTECT(retvalnames = NEW_CHARACTER(5));
72 PROTECT(newdim = NEW_INTEGER(2));
75 dim = INTEGER(newdim);
81 SET_STRING_ELT(retvalnames,0,mkChar(
"states"));
82 SET_STRING_ELT(retvalnames,1,mkChar(
"params"));
83 SET_STRING_ELT(retvalnames,2,mkChar(
"weights"));
84 SET_STRING_ELT(retvalnames,3,mkChar(
"ess"));
85 SET_STRING_ELT(retvalnames,4,mkChar(
"loglik"));
86 SET_NAMES(retval,retvalnames);
89 PROTECT(ess = NEW_NUMERIC(1));
90 PROTECT(loglik = NEW_NUMERIC(1));
93 if (maxlogw == R_NegInf) {
95 *REAL(loglik) = R_NegInf;
98 long double w = 0, ws = 0;
101 for (k = 0; k <
nreps; k++, xw++, xW++) {
109 *(REAL(ess)) = w*w/ws;
110 *(REAL(loglik)) = maxlogw + log(w) - log(oldw);
113 SET_ELEMENT(retval,3,ess);
114 SET_ELEMENT(retval,4,loglik);
116 if (maxlogw == R_NegInf || (*REAL(ess) >=
nreps*trigger && np ==
nreps)) {
118 SET_ELEMENT(retval,0,
X);
119 SET_ELEMENT(retval,1,Params);
120 SET_ELEMENT(retval,2,Weights);
125 SEXP newstates = R_NilValue;
126 double *ss = 0, *st = 0;
128 int xdim[] = {
nvars, np};
129 PROTECT(newstates =
makearray(2,xdim)); nprotect++;
133 st = REAL(newstates);
135 SET_ELEMENT(retval,0,newstates);
150 SET_ELEMENT(retval,1,Params);
154 SEXP newweights = R_NilValue;
155 double *ws = 0, *wt = 0;
157 PROTECT(newweights = NEW_NUMERIC(np)); nprotect++;
159 wt = REAL(newweights);
161 SET_ELEMENT(retval,2,newweights);
164 for (k = 0, xw = REAL(W), xW = REAL(Weights); k <
nreps; k++, xw++, xW++) {
167 *xw = exp(*xw - *xW);
177 for (k = 0; k < np; k++) {
178 int sp = sample[k], j;
181 for (j = 0, xx = ss+
nvars*sp; j <
nvars; j++, st++, xx++)