Changeset 1189 for library

Show
Ignore:
Timestamp:
09/16/10 13:22:11 (14 years ago)
Author:
smidl
Message:

new tests of egiw

Location:
library
Files:
1 added
8 modified

Legend:

Unmodified
Added
Removed
  • library/bdm/estim/arx.h

    r1176 r1189  
    221221         
    222222        void bayes(const vec &dt, const vec &psi){ 
    223           ldmat &Pbeta = est.P; 
    224           ldmat &Palpha = alternative.P; 
     223//        ldmat &Pbeta = est.P; 
     224//        ldmat &Palpha = alternative.P; 
    225225           
    226226           
  • library/bdm/stat/exp_family.cpp

    r1102 r1189  
    4949    ChLam.inv ( iChLam ); 
    5050 
    51     eWishartCh Omega; //inverse Wishart, result is R, 
    52     Omega.set_parameters ( iChLam, nu - 2*nPsi - dimx ); // 2*nPsi is there to match numercial simulations - check if analytically correct 
     51    eWishartCh Omega; //iWishart, same degrees of freedom as in Wishard in terms of delta 
     52        // delta = nu - npsi- p -1 
     53    Omega.set_parameters ( iChLam, nu - nPsi -dimx -1); 
    5354    Omega.validate(); 
    5455 
    55     mat OmChi; 
     56    chmat OmChi; 
    5657    mat Z ( M.rows(), M.cols() ); 
    5758 
    5859    mat Mi; 
    59     mat RChiT; 
     60    chmat Ri; 
    6061    mat tmp ( dimension(), n ); 
    6162    M=M.T();// ugly hack == decide what to do with M. 
    6263    for ( int i = 0; i < n; i++ ) { 
    6364        OmChi = Omega.sample_mat(); 
    64         RChiT = inv ( OmChi ); 
    65         Z = randn ( M.rows(), M.cols() ); 
    66         Mi = M + RChiT * Z * inv ( Vz._L().T() * diag ( sqrt ( Vz._D() ) ) ); 
    67  
    68         tmp.set_col ( i, concat ( cvectorize ( Mi ), cvectorize ( RChiT*RChiT.T() ) ) ); 
     65        OmChi.inv(Ri ); 
     66                if (M._datasize()>0){ 
     67                        Z = randn ( M.rows(), M.cols() ); 
     68                        Mi = M + Ri._Ch().T() * Z * inv ( Vz._L().T() * diag ( sqrt ( Vz._D() ) ) ); 
     69                } 
     70        tmp.set_col ( i, concat ( cvectorize ( Mi ), cvectorize ( Ri.to_mat() ) ) ); 
    6971    } 
    7072    return tmp; 
     
    7981    factorize ( M, Vz, Lam ); 
    8082 
    81     chmat Ch; 
    82     Ch.setCh ( Lam._L() *diag ( sqrt ( Lam._D() ) ) ); 
     83    chmat Ch(Lam.to_mat()); 
    8384    chmat iCh; 
    8485    Ch.inv ( iCh ); 
    8586 
    8687    eWishartCh Omega; //inverse Wishart, result is R, 
    87     Omega.set_parameters ( iCh, nu - 2*nPsi - dimx ); // 2*nPsi is there to match numercial simulations - check if analytically correct 
     88    Omega.set_parameters ( iCh, nu - nPsi - dimx -1 ); // 2*nPsi is there to match numercial simulations - check if analytically correct 
    8889    Omega.validate(); 
    8990 
    9091    chmat Omi; 
    91     Omi.setCh ( Omega.sample_mat() ); 
    92  
     92    Omi= Omega.sample_mat(); 
     93        Omi.inv ( Ri ); 
     94         
    9395    if (M._datasize()>0) { 
     96                M = M.T(); 
    9497        mat Z = randn ( M.rows(), M.cols() ); 
    95         Mi = M + Omi._Ch() * Z * inv ( Vz._L() * diag ( sqrt ( Vz._D() ) ) ); 
    96     } 
    97     Omi.inv ( Ri ); 
     98        Mi = M + Ri._Ch().T() * Z * inv ( Vz._L() * diag ( sqrt ( Vz._D() ) ) ); 
     99    } 
    98100} 
    99101 
  • library/bdm/stat/exp_family.h

    r1175 r1189  
    388388* \brief Gauss-inverse-Wishart density stored in LD form 
    389389 
    390 * For \f$p\f$-variate densities, given rv.count() should be \f$p    imes\f$ V.rows(). 
     390* For \f$p\f$-variate densities,  
     391*  
     392* \f$ M,R \sim GiW( V_t, \nu_t) \propto |R|^{0.5\nu}\exp(-1/2 tr(R^{-1}[I,M] V_t [I;M'])) \f$ 
    391393* 
     394* Factorizes as: 
     395* \f$ M|R \sim N( \hat{M}, R \otimes Vz^{-1}) \propto |R|^{-0.5dim(psi)}\exp(-1/2 tr((M-\hat{M})R^{-1}(M-\hat{M})Vz) \f$ 
     396* \f$ R \sim iW( \Lambda,\delta) \propto |R|^{-0.5(\nu - dim(psi))} |\Lambda|^{}\exp(-1/2 tr(R^{-1}\Lambda) \f$ 
     397* where in standard notation \f$ |R|^{-0.5(\delta + p +1)}\f$, i.e.  
     398* \f$ \delta = \nu-dim(psi) -p-1 \f$ 
    392399*/ 
    393400class egiw : public eEF { 
     
    426433 
    427434    void factorize ( mat &M, ldmat &Vz, ldmat &Lam ) const; 
    428     //! LS estimate of \f$    heta\f$ 
     435    //! LS estimate of \f$\theta\f$ 
    429436    vec est_theta() const; 
    430437 
     
    16121619 
    16131620/*! \brief Inverse Wishart density defined on Choleski decomposition 
     1621 *  
     1622 * here \f$\Omega \sim |\Sigma|^{-0.5(\delta}|\Omega|^{0.5(\delta -p -1)} \exp(-1/2 tr(\Omega\Sigma^{-1}))\$f 
    16141623*/ 
    16151624class eWishartCh : public epdf { 
    16161625protected: 
    16171626    //! Upper-Triagle of Choleski decomposition of \f$ \Psi \f$ 
    1618     chmat Y; 
     1627    chmat Sigma; 
    16191628    //! dimension of matrix  \f$ \Psi \f$ 
    16201629    int p; 
     
    16241633    //! Set internal structures 
    16251634    void set_parameters ( const mat &Y0, const double delta0 ) { 
    1626         Y = chmat ( Y0 ); 
     1635        Sigma = chmat ( Y0 ); 
    16271636        delta = delta0; 
    1628         p = Y.rows(); 
     1637        p = Sigma.rows(); 
    16291638    } 
    16301639    //! Set internal structures 
    16311640    void set_parameters ( const chmat &Y0, const double delta0 ) { 
    1632         Y = Y0; 
     1641        Sigma = Y0; 
    16331642        delta = delta0; 
    1634         p = Y.rows(); 
     1643        p = Sigma.rows(); 
    16351644    } 
    16361645 
     
    16401649    } 
    16411650 
    1642     //! Sample matrix argument 
    1643     mat sample_mat() const { 
    1644         mat X = zeros ( p, p ); 
     1651    //! Sample matrix argument - lower  
     1652    //! Using Bartlet decomposition: W=L A A^T L^T where A is lower triag and L is choleski factor of Sigma. 
     1653    chmat sample_mat() const { 
     1654        mat A_T = zeros ( p, p ); // A transpose 
    16451655 
    16461656        //sample diagonal 
     
    16481658            GamRNG.setup ( 0.5* ( delta - i ) , 0.5 );   // no +1 !! index if from 0 
    16491659#pragma omp critical 
    1650             X ( i, i ) = sqrt ( GamRNG() ); 
     1660            A_T ( i, i ) = sqrt ( GamRNG() ); 
    16511661        } 
    16521662        //do the rest 
     
    16541664            for ( int j = i + 1; j < p; j++ ) { 
    16551665#pragma omp critical 
    1656                 X ( i, j ) = NorRNG.sample(); 
     1666                A_T ( i, j ) = NorRNG.sample(); 
    16571667            } 
    16581668        } 
    1659         return X*Y._Ch();// return upper triangular part of the decomposition 
     1669        chmat tmp; 
     1670                tmp._Ch()=A_T*Sigma._Ch(); 
     1671        return tmp;// return upper triangular part of the decomposition 
    16601672    } 
    16611673 
    16621674    vec sample () const { 
    1663         return vec ( sample_mat()._data(), p*p ); 
     1675        return vec ( sample_mat().to_mat()._data(), p*p ); 
    16641676    } 
    16651677 
     
    16731685    //! fast access function y0 will be copied into Y.Ch. 
    16741686    void setY ( const mat &Ch0 ) { 
    1675         copy_vector ( dim, Ch0._data(), Y._Ch()._data() ); 
     1687        copy_vector ( dim, Ch0._data(), Sigma._Ch()._data() ); 
    16761688    } 
    16771689 
    16781690    //! fast access function y0 will be copied into Y.Ch. 
    16791691    void _setY ( const vec &ch0 ) { 
    1680         copy_vector ( dim, ch0._data(), Y._Ch()._data() ); 
     1692        copy_vector ( dim, ch0._data(), Sigma._Ch()._data() ); 
    16811693    } 
    16821694 
    16831695    //! access function 
    16841696    const chmat& getY() const { 
    1685         return Y; 
     1697        return Sigma; 
    16861698    } 
    16871699}; 
     
    17151727    vec sample() const { 
    17161728        mat iCh; 
    1717         iCh = inv ( W.sample_mat() ); 
     1729        iCh = inv ( W.sample_mat()._Ch() ); 
    17181730        return vec ( iCh._data(), dim ); 
    17191731    } 
  • library/tests/epdf_harness.cpp

    r1064 r1189  
    2828    UI::get ( variance, set, "variance", UI::compulsory ); 
    2929 
    30     support = UI::build<rectangular_support> ( set, "support", UI::optional ); 
     30    support = UI::build<support_base> ( set, "support", UI::optional ); 
    3131    UI::get ( nsamples, set, "nsamples", UI::optional ); 
    3232    UI::get ( R, set, "R", UI::optional ); 
     
    4545    if ( support ) { // support is given 
    4646        grid_fnc ep_disc; 
    47         ep_disc.set_support ( *support ); 
     47        ep_disc.set_support ( support ); 
    4848        ep_disc.set_values ( *hepdf ); 
    4949        // ep_disc is discretized at support points 
    5050 
    51         double point_volume = prod ( support->_steps() ); 
    52         CHECK_CLOSE ( 1.0, sum ( ep_disc._values() ) *point_volume, 0.01 ); 
     51        CHECK_CLOSE ( 1.0,  ep_disc.integrate(), 0.01 ); 
    5352 
    5453        vec pdf = ep_disc._values(); 
  • library/tests/epdf_harness.h

    r1064 r1189  
    2929    vec mean; 
    3030    vec variance; 
    31     shared_ptr<rectangular_support> support; 
     31    shared_ptr<support_base> support; 
    3232    int nsamples; 
    3333    mat R; 
  • library/tests/testsuite/egiw.cfg

    r1080 r1189  
    55    class = "egiw"; 
    66    fV = ( "matrix", 2, 2, [ 13.1, 11.0, 11.0, 10.0 ] ); 
     7// m=1.1; var_e = 0.1; 
    78    nu = 10.0; 
    89    dimx = 1; 
     
    2829    class = "egiw"; 
    2930    fV = ( "matrix", 2, 2, [ 200.0, 80.0, 80.0, 40.0 ] ); 
     31        // m=2; var_e = 1; 
    3032    nu = 40.0; 
    3133    dimx = 1; 
     
    4547        }; 
    4648  tolerance = 0.01; 
    47 }); 
    48  
    49  
    50 broken =  
     49}, 
    5150{ 
    5251  class = "epdf_harness"; 
    5352  epdf = { 
    5453    class = "egiw"; 
    55     V = ( "matrix", 2, 2, [ 10.0, 5.0, 5.0, 15.0 ] ); 
    56     nu = 10.0; 
     54    fV = ( "matrix", 2, 2, [ 10.0, 5.0, 5.0, 15.0 ] ); 
     55    nu = 16.0; 
    5756    dimx = 2; 
    5857    rv :  
     
    6261    }; 
    6362  }; 
    64   mean = [1.0, 0.5, 0.5, 1.5]; 
    65   variance = [1.0, 1.0]; 
    66   R = ( "matrix", 2, 2, [ 1.0, 0.0, 0.0, 1.0 ] ); 
     63  mean = [1.0, 0.5, 0.5, 1.5];// V/(delta-2-1)=V/(nu-2-1-2-1) 
     64  variance = [0.2500, 0.2045, 0.2045, 0.5625]; // m=13; var(i,j)=(12Vij^2+10Vii*Vjj)/(11*100*8) 
     65  R = ("matrix",4,4,[0.2500, 0.0, 0.0, 0.0, 0.0, 0.2045, 0.0, 0.0, 0.0, 0.0, 0.2045, 0.0, 0.0, 0.0, 0.0, 0.5625]);  
    6766  support = { 
    68         class = "rectangular_support"; 
    69         ranges = ( [ 0.0, 4.0 ], [-2.0, 2.0], [-2.0, 2.0], [0.0, 4.0 ] ); 
    70         gridsizes = [ 10, 10, 10, 10]; 
     67        class = "discrete_support"; 
     68        points = "s@egiw_support.cfg"; 
     69        volumes = "v@egiw_support.cfg"; 
    7170        }; 
    72   tolerance = 0.01; 
    73 }; 
     71  tolerance = 0.03; 
     72} 
     73); 
  • library/tests/testsuite/epdf_test.cpp

    r1064 r1189  
    5353    mat wM = "1.1 0.9; 0.9 1.0"; 
    5454    eWishartCh eW; 
    55     eW.set_parameters ( wM / 100, 100 ); 
     55    eW.set_parameters ( wM , 10 ); 
    5656    eW.validate(); 
    5757    mat mea = zeros ( 2, 2 ); 
    58     mat Ch; 
     58    chmat Ch; 
    5959    for ( int i = 0; i < 100; i++ ) { 
    6060        Ch = eW.sample_mat(); 
    61         mea += Ch.T() * Ch; 
     61        mea += Ch.to_mat(); 
    6262    } 
    6363 
    6464    mat actual = mea / 100; 
    65     CHECK_CLOSE ( wM, actual, 0.1 ); 
     65    CHECK_CLOSE ( 10*wM, actual, 0.3 ); 
    6666} 
    6767 
  • library/tests/testsuite/rectangular_support_test.cpp

    r1064 r1189  
    99TEST ( rectangular_support_test ) { 
    1010    rectangular_support rs; 
    11     CHECK_EQUAL ( rs.first_vec(), vec ( 0 ) ); 
     11    //CHECK_EQUAL ( rs.first_vec(), vec ( 0 ) ); 
    1212 
    1313    Array<vec> range ( 2 );