// Prediction for all sites for all time point "XB" void z_pr_ar(int *cov, int *nsite, int *n, int *r, int *rT, int *T, int *p, int *N, double *d, double *d12, double *phip, double *nup, double *sig_ep, double *sig_etap, double *sig_l0p, double *rhop, double *betap, double *mu_lp, double *X, double *valX, double *op, int *constant, double *zpred) { int i, j, l, t, r1, col, rT1, n1, nn, ns, p1, N1; col = *constant; r1 = *r; rT1 = *rT; n1 = *n; nn = n1*n1; ns = *nsite; p1 = *p; N1 = *N; int *T1, *T2; T1 = (int *) malloc((size_t)((r1)*sizeof(int))); T2 = (int *) malloc((size_t)((r1+1)*sizeof(int))); for(i=0; i<r1; i++){ T1[i] = T[i]; } cumsumint(r, T, T2); double *S_eta, *Si_eta, *S_eta12, *S_eta12c, *det; S_eta = (double *) malloc((size_t)((n1*n1)*sizeof(double))); Si_eta = (double *) malloc((size_t)((n1*n1)*sizeof(double))); S_eta12 = (double *) malloc((size_t)((n1*ns)*sizeof(double))); S_eta12c = (double *) malloc((size_t)((n1)*sizeof(double))); det = (double *) malloc((size_t)((col)*sizeof(double))); covF(cov, n, n, phip, nup, d, S_eta); MInv(S_eta, Si_eta, n, det); covF(cov, n, nsite, phip, nup, d12, S_eta12); double *S, *m1, *O11, *O_l0, *XB; S = (double *) malloc((size_t)((n1*n1)*sizeof(double))); m1 = (double *) malloc((size_t)((n1)*sizeof(double))); O11 = (double *) malloc((size_t)((n1)*sizeof(double))); O_l0 = (double *) malloc((size_t)((n1*r1*col)*sizeof(double))); XB = (double *) malloc((size_t)((N1*col)*sizeof(double))); for(l=0; l<r1; l++){ for(i=0; i<nn; i++){ S[i] = sig_l0p[l]*Si_eta[i]; } for(i=0; i<n1; i++) { m1[i] = mu_lp[l]; } mvrnormal(constant, m1, S, n, O11); for(i=0; i<n1; i++) { O_l0[i+l*n1] = O11[i]; } } MProd(betap, constant, p, X, N, XB); double *s21, *sig, *m, *sig_0; s21 = (double *) malloc((size_t)((col)*sizeof(double))); sig = (double *) malloc((size_t)((col)*sizeof(double))); m = (double *) malloc((size_t)((col)*sizeof(double))); sig_0 = (double *) malloc((size_t)((col)*sizeof(double))); double *O1, *opp, *XB1, *valX1, *valXB1; O1 = (double *) malloc((size_t)((col)*sizeof(double))); opp = (double *) malloc((size_t)((n1)*sizeof(double))); XB1 = (double *) malloc((size_t)((n1)*sizeof(double))); valX1 = (double *) malloc((size_t)((p1*ns)*sizeof(double))); valXB1 = (double *) malloc((size_t)((ns)*sizeof(double))); double *opp1, *oox, *part2, *out, *out1, *mu, *opre; opp1 = (double *) malloc((size_t)((n1)*sizeof(double))); oox = (double *) malloc((size_t)((n1)*sizeof(double))); part2 = (double *) malloc((size_t)((col)*sizeof(double))); out = (double *) malloc((size_t)((col)*sizeof(double))); out1 = (double *) malloc((size_t)((col)*sizeof(double))); mu = (double *) malloc((size_t)((col)*sizeof(double))); opre = (double *) malloc((size_t)((rT1*col)*sizeof(double))); for(j=0; j < ns; j++) { extn_12(j, n, S_eta12,S_eta12c); xTay(S_eta12c, Si_eta, S_eta12c, n, s21); if(s21[0] > 1.0){ s21[0] = 1.0-pow(1,-320); } if(s21[0] == 1.0){ s21[0] = 1.0-pow(1,-320); } sig[0] = sig_etap[0] * (1.0 - s21[0]); for(l=0; l < r1; l++) { t=0; m[0] = mu_lp[l]; sig_0[0] = sig_l0p[l]; mvrnormal(constant, m, sig_0, constant, O1); extract_alt_uneqT(l, t, n, r, T, rT, op, opp); extract_alt_uneqT(l, t, n, r, T, rT, XB, XB1); extract_X21_uneqT(l, t, nsite, rT, r, T, p, valX, valX1); // extract_alt2(l, t, n, rT, T, op, opp); // extract_alt2(l, t, n, rT, T, XB, XB1); // extract_X21(l, t, nsite, rT, T, p, valX, valX1); // X1 = p x n MProd(valX1, nsite, p, betap, constant, valXB1); for(i=0; i < n1; i++){ opp1[i] = O_l0[i+l*n1]; } for(i=0; i < n1; i++) { oox[i] = opp[i]-rhop[0]*opp1[i]-XB1[i]; } xTay(S_eta12c, Si_eta, oox, n, part2); mu[0] = 0.0; mvrnormal(constant, mu, sig, constant, out); mu[0] = 0.0; mvrnormal(constant, mu, sig_ep, constant, out1); opre[t+T2[l]]=rhop[0]*O1[0]+valXB1[j]+part2[0]; zpred[t+T2[l]+j*(rT1)]=opre[t+T2[l]]+out[0]+out1[0]; //rhop[0]*O1[0]+valXB1[j]+part2[0]+out[0]+out1[0]; for(t=1; t < T1[l]; t++) { extract_alt_uneqT(l, t-1, n, r, T, rT, op, opp1); extract_alt_uneqT(l, t, n, r, T, rT, op, opp); extract_alt_uneqT(l, t, n, r, T, rT, XB, XB1); extract_X21_uneqT(l, t, nsite, rT, r, T, p, valX, valX1); // extract_alt2(l, t-1, n, rT, T, op, opp1); // extract_alt2(l, t, n, rT, T, op, opp); // extract_alt2(l, t, n, rT, T, XB, XB1); // extract_X21(l, t, nsite, rT, T, p, valX, valX1); // X1 = p x n MProd(valX1, nsite, p, betap, constant, valXB1); // 1 x n for(i=0; i < n1; i++) { oox[i] = opp[i]-rhop[0]*opp1[i]-XB1[i]; } xTay(S_eta12c, Si_eta, oox, n, part2); mu[0] = 0.0; mvrnormal(constant, mu, sig, constant, out); mu[0] = 0.0; mvrnormal(constant, mu, sig_ep, constant, out1); opre[t+T2[l]] = rhop[0]*opre[(t-1)+T2[l]]+valXB1[j]+part2[0]; zpred[t+T2[l]+j*(rT1)]=opre[t+T2[l]] + out[0]+ out1[0]; // zpred[t+T2[l]+j*(rT1)]=rhop[0]*zpred[t+T2[l]+j*(rT1)]+valXB1[j]+part2[0] + out[0]+ out1[0]; } } } free(opre); free(T1); free(T2); free(mu); free(out1); free(out); free(part2); free(oox); free(opp1); free(valXB1); free(valX1); free(XB1); free(opp); free(O1); free(sig_0); free(m); free(sig); free(s21); free(XB); free(O_l0); free(O11); free(m1); free(S); free(det); free(S_eta12c); free(S_eta12); free(Si_eta); free(S_eta); return; }
// K-step Forecasts without its void zlt_fore_gpp(int *cov, int *K, int *n, int *m, int *r, int *p, int *rT, int *T, int *rK, int *nrK, double *dnm, double *dm, double *phi, double *nu, double *sig_e, double *sig_eta, double *beta, double *rho, double *wp, double *foreX, int *constant, double *foreZ) { int l, k, t, i, T1, K1, r1, n1, m1, col; T1 =*T; K1 =*K; r1 =*r; n1 =*n; m1 =*m; col =*constant; double *C, *det, *I, *A, *mu, *XB, *XB1; double *wp1, *Aw, *eta, *eps, *zfore; C = (double *) malloc((size_t)((n1*m1)*sizeof(double))); // Sigeta = (double *) malloc((size_t)((m1*m1)*sizeof(double))); // Sinv = (double *) malloc((size_t)((m1*m1)*sizeof(double))); det = (double *) malloc((size_t)((col)*sizeof(double))); I = (double *) malloc((size_t)((m1*col)*sizeof(double))); A = (double *) malloc((size_t)((m1*n1)*sizeof(double))); mu = (double *) malloc((size_t)((col)*sizeof(double))); XB = (double *) malloc((size_t)((n1*r1*K1*col)*sizeof(double))); XB1 = (double *) malloc((size_t)((n1*col)*sizeof(double))); wp1 = (double *) malloc((size_t)((m1*col)*sizeof(double))); Aw = (double *) malloc((size_t)((n1*col)*sizeof(double))); eta = (double *) malloc((size_t)((m1*col)*sizeof(double))); eps = (double *) malloc((size_t)((col)*sizeof(double))); zfore = (double *) malloc((size_t)((n1*col)*sizeof(double))); double *S, *C12c, *s21, *sig; S = (double *) malloc((size_t)((m1*m1)*sizeof(double))); C12c = (double *) malloc((size_t)((m1*col)*sizeof(double))); s21 = (double *) malloc((size_t)((col)*sizeof(double))); sig = (double *) malloc((size_t)((col)*sizeof(double))); /* // exponential covariance if(cov[0] == 1){ for(i = 0; i < (m1*m1); i++){ S[i] = exp(-1.0*phi[0]*dm[i]); // Sigeta[i] = sig_eta[0]*S[i]; } // MInv(Sigeta, Sinv_eta, m, det); for(i=0; i < m1*n1; i++){ C[i] = exp(-1.0*phi[0]*dnm[i]); } } // gaussian covariance if(cov[0] == 2){ for(i = 0; i < (m1*m1); i++){ S[i] = exp(-1.0*phi[0]*phi[0]*dm[i]*dm[i]); // Sigeta[i] = sig_eta[0]*S[i]; } // MInv(Sigeta, Sinv_eta, m, det); for(i=0; i < m1*n1; i++){ C[i] = exp(-1.0*phi[0]*phi[0]*dnm[i]*dnm[i]); } } // spherical covariance if(cov[0] == 3){ for(i = 0; i < (m1*m1); i++){ if(dm[i] > 0 && dm[i] <= 1.0/phi[0]){ S[i] = (1.0-1.5*phi[0]*dm[i]+0.5*(phi[0]*dm[i])*(phi[0]*dm[i])*(phi[0]*dm[i])); // Sigeta[i] = sig_eta[0]*S[i]; } else if(dm[i] >= 1.0/phi[0]){ S[i] = 0.0; // Sigeta[i] = 0.0; } else{ S[i] = 1.0; // Sigeta[i] = 1.0*sig_eta[0]; } } // MInv(Sigeta, Sinv_eta, m, det); for(i=0; i < m1*n1; i++){ if(dnm[i] > 0 && dnm[i] <= 1.0/phi[0]){ C[i] = 1.0-1.5*phi[0]*dnm[i]+0.5*(phi[0]*dnm[i])*(phi[0]*dnm[i])*(phi[0]*dnm[i]); } else if(dnm[i] >= 1.0/phi[0]){ C[i] = 0.0; } else{ C[i] = 1.0; } } } // matern covariance, nu = 3/2 if(cov[0] == 4){ for(i = 0; i < (m1*m1); i++){ S[i] = ((1.0+phi[0]*dm[i])*exp(-1.0*phi[0]*dm[i])); // Sigeta[i] = sig_eta[0]*S[i]; } // MInv(Sigeta, Sinv_eta, m, det); for(i=0; i < m1*n1; i++){ C[i] = (1.0+phi[0]*dnm[i])*exp(-1.0*phi[0]*dnm[i]); } } */ covF(cov, m, m, phi, nu, dm, S); covF(cov, n, m, phi, nu, dnm, C); MInv(S, S, m, det); // m x m MProd(S, m, m, C, n, A); // n x m for(i=0; i<m1; i++){ I[i] = 0.0; } mu[0] = 0.0; MProd(beta, constant, p, foreX, nrK, XB); // nrK x 1 for(l=0; l<r1; l++){ for(k=0; k<1; k++){ t = (T1-1); extract_alt2(l, k, n, rK, K, XB, XB1); // n x 1 for(i=0; i<m1; i++){ wp1[i] = wp[i+t*m1+l*m1*T1]; } MProd(wp1, constant, m, A, n, Aw); // n x 1 for(i=0; i<n1; i++){ extn_12(i, m, C, C12c); // m x 1 xTay(C12c, S, C12c, m, s21); // 1 x 1 if(s21[0] > 1.0){ s21[0] = 1.0-pow(1,-320); } if(s21[0] == 1.0){ s21[0] = 1.0-pow(1,-320); } sig[0] = sig_eta[0] * (1.0 - s21[0]); mu[0] = 0.0; mvrnormal(constant, mu, sig_e, constant, eps); mu[0] = Aw[i]; mvrnormal(constant, mu, sig, constant, eta); zfore[i] = XB1[i] + eta[0] + eps[0]; } put_together1(l, k, n, r, K, foreZ, zfore); } for(k=1; k<K1; k++){ for(i=0; i<m1; i++){ wp1[i] = wp1[i]; // m x 1 } MProd(wp1, constant, m, A, n, Aw); // n x 1 extract_alt2(l, k, n, rK, K, XB, XB1); // n x 1 mvrnormal(constant, mu, sig_e, constant, eps); for(i=0; i<n1; i++){ extn_12(i, m, C, C12c); // m x 1 xTay(C12c, S, C12c, m, s21); // 1 x 1 if(s21[0] > 1.0){ s21[0] = 1.0-pow(1,-320); } if(s21[0] == 1.0){ s21[0] = 1.0-pow(1,-320); } sig[0] = sig_eta[0] * (1.0 - s21[0]); mu[0] = 0.0; mvrnormal(constant, mu, sig_e, constant, eps); mu[0] = Aw[i]; mvrnormal(constant, mu, sig, constant, eta); zfore[i] = XB1[i] + eta[0] + eps[0]; } put_together1(l, k, n, r, K, foreZ, zfore); } } free(S); free(det); free(C); free(I); free(A); free(mu); free(XB); free(XB1); free(wp1); free(Aw); free(eta); free(eps); free(zfore); free(C12c); free(s21); free(sig); return; }