16 double w[nrow],
tau[ncol], work[ncol];
20 long double x, xx, wbar, d, d0, rss, half_log_det;
21 long double alpha = 2.0, beta = 1.25;
24 half_log_det = ncol*M_LN_SQRT_2PI;
26 y1 = (
double *) R_alloc(nrow*ncol,
sizeof(
double));
27 y2 = (
double *) R_alloc(nrow*ncol,
sizeof(
double));
30 err(
"'nsim' (=%d) should be (much) larger than the number of probes (=%d)",nrow,ncol);
33 memcpy(y1,y,nrow*ncol*
sizeof(
double));
34 for (yp = y1, j = 0; j < ncol; j++, yp += nrow) {
35 for (x = 0, i = 0; i < nrow; i++) x += yp[i];
37 for (i = 0; i < nrow; i++) yp[i] -= x;
38 for (x = 0, i = 0; i < nrow; i++) x += yp[i]*yp[i];
40 for (i = 0; i < nrow; i++) yp[i] /= d;
44 memcpy(y2,y1,nrow*ncol*
sizeof(
double));
46 F77_CALL(dgeqr2)(&nrow,&ncol,y2,&nrow,
tau,work,&info);
48 F77_CALL(dtrsm)(
"right",
"upper",
"no transpose",
"non-unit",&nrow,&ncol,&one,y2,&nrow,y1,&nrow
FCONE FCONE FCONE FCONE);
51 d0 = sqrt(ncol)+alpha/sqrt(2.0);
52 for (wbar = 0, i = 0; i < nrow; i++) {
53 for (xx = 0, j = 0; j < ncol; j++) {
57 d = sqrt((nrow-1)*xx);
60 xx = exp(-0.5*x*x/beta)*d0/d;
70 memcpy(y1,y,nrow*ncol*
sizeof(
double));
71 for (yp = y1, j = 0; j < ncol; j++, yp += nrow) {
72 for (x = 0, xx = 0, i = 0; i < nrow; i++) {
77 for (i = 0; i < nrow; i++) yp[i] -= xx;
79 for (xx = 0, i = 0; i < nrow; i++) {
83 d = sqrt(xx/(nrow-1));
84 for (i = 0; i < nrow; i++) yp[i] *= (w[i]/d);
86 half_log_det += log(d);
91 F77_CALL(dgeqr2)(&nrow,&ncol,y1,&nrow,
tau,work,&info);
92 pomp_backsolve(y1,nrow,ncol,ydat,1,
"upper",
"transpose",
"non-unit");
95 for (yp = y1, rss = 0, i = nrow+1, j = 0; j < ncol; j++, yp += i) {
98 half_log_det += log(fabs(*yp));
101 *loglik = -0.5*rss-half_log_det;
107 PROTECT(y = duplicate(AS_NUMERIC(ydat)));
108 PROTECT(dim = GET_DIM(ysim));
109 PROTECT(ysim = AS_NUMERIC(ysim));
110 PROTECT(loglik = NEW_NUMERIC(1));
static R_INLINE void pomp_backsolve(double *a, int lda, int n, double *x, int incx, char *uplo, char *transpose, char *unit)