Esempio n. 1
0
// 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;
}
Esempio n. 2
0
// 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;
}