Changeset 810 for library/bdm/stat

Show
Ignore:
Timestamp:
02/21/10 20:58:41 (14 years ago)
Author:
smidl
Message:

egiw with empty normal part

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • library/bdm/stat/exp_family.cpp

    r761 r810  
    9090        Omi.setCh ( Omega.sample_mat() ); 
    9191 
    92         mat Z = randn ( M.rows(), M.cols() ); 
    93         Mi = M + Omi._Ch() * Z * inv ( Vz._L() * diag ( sqrt ( Vz._D() ) ) ); 
     92        if (M._datasize()>0){ 
     93                mat Z = randn ( M.rows(), M.cols() ); 
     94                Mi = M + Omi._Ch() * Z * inv ( Vz._L() * diag ( sqrt ( Vz._D() ) ) ); 
     95        } 
    9496        Omi.inv ( Ri ); 
    9597} 
    9698 
    9799double egiw::evallog_nn ( const vec &val ) const { 
    98         bdm_assert_debug(val.length()==nPsi+dimx,"Incorrect cond in egiw::evallog_nn" ); 
     100        bdm_assert_debug(val.length()==dimx*(nPsi+dimx),"Incorrect cond in egiw::evallog_nn" ); 
    99101         
    100102        int vend = val.length() - 1; 
     
    110112                return -0.5* ( nu*log ( r ) + Vq / r ); 
    111113        } else { 
    112                 mat Th = reshape ( val ( 0, nPsi * dimx - 1 ), nPsi, dimx ); 
     114                mat Tmp; 
     115                if (nPsi>0){ 
     116                        mat Th = reshape ( val ( 0, nPsi * dimx - 1 ), nPsi, dimx ); 
     117                        Tmp = concat_vertical ( -eye ( dimx ), Th ); 
     118                } else { 
     119                        Tmp = -eye(dimx); 
     120                } 
    113121                fsqmat R ( reshape ( val ( nPsi*dimx, vend ), dimx, dimx ) ); 
    114122                double ldetR = R.logdet(); 
    115                 if ( ldetR ) return -inf; 
    116                 mat Tmp = concat_vertical ( -eye ( dimx ), Th ); 
     123                if ( !isfinite(ldetR) ) return -inf; 
    117124                fsqmat iR ( dimx ); 
    118125                R.inv ( iR ); 
     
    131138#define Inf std::numeric_limits<double>::infinity() 
    132139 
    133         double nkG = 0.5 * dimx * ( -nPsi * log2pi + sum ( log ( D ( dimx, D.length() - 1 ) ) ) ); 
     140        double nkG = 0.5 * dimx * ( -nPsi * log2pi + sum ( log ( D.mid ( dimx, nPsi ) ) ) ); 
    134141        // temporary for lgamma in Wishart 
    135142        double lg = 0; 
     
    169176        int end = L.rows() - 1; 
    170177 
    171         Vz = ldmat ( L ( dimx, end, dimx, end ), D ( dimx, end ) ); 
    172         mat iLsub = ltuinv ( Vz._L() ); 
    173         // set mean value 
    174         mat Lpsi = L ( dimx, end, 0, dimx - 1 ); 
    175         M = iLsub * Lpsi; 
    176  
    177178        Lam = ldmat ( L ( 0, dimx - 1, 0, dimx - 1 ), D ( 0, dimx - 1 ) );  //exp val of R 
    178         if ( 1 ) { // test with Peterka 
     179 
     180        if (dimx<=end){ 
     181                Vz = ldmat ( L ( dimx, end, dimx, end ), D ( dimx, end ) ); 
     182                mat iLsub = ltuinv ( Vz._L() ); 
     183                // set mean value 
     184                mat Lpsi = L ( dimx, end, 0, dimx - 1 ); 
     185                M = iLsub * Lpsi; 
     186        } 
     187/*      if ( 0 ) { // test with Peterka 
    179188                mat VF = V.to_mat(); 
    180189                mat Vf = VF ( 0, dimx - 1, 0, dimx - 1 ); 
     
    183192 
    184193                mat Lam2 = Vf - Vzf.T() * inv ( VZ ) * Vzf; 
    185         } 
     194        }*/ 
    186195} 
    187196 
     
    227236        int l = V.rows(); 
    228237        // cut out rest of lower-right part of V 
    229         const ldmat tmp ( V, linspace ( dimx, l - 1 ) ); 
    230238        // invert it 
    231239        ldmat itmp ( l ); 
    232         tmp.inv ( itmp ); 
    233  
     240        if (dimx<l){ 
     241                const ldmat tmp ( V, linspace ( dimx, l - 1 ) ); 
     242                tmp.inv ( itmp ); 
     243        } 
    234244        // following Wikipedia notation 
    235245        // m=nu-nPsi-dimx-1, p=dimx 
     
    275285 
    276286        ldmat ldR ( L ( 0, dimx - 1, 0, dimx - 1 ), D ( 0, dimx - 1 ) / ( nu - nPsi - 2*dimx - 2 ) ); //exp val of R 
    277         mat iLsub = ltuinv ( L ( dimx, end, dimx, end ) ); 
    278287 
    279288        // set mean value 
    280         mat Lpsi = L ( dimx, end, 0, dimx - 1 ); 
    281         M = iLsub * Lpsi; 
     289        if (dimx<=end){ 
     290                mat iLsub = ltuinv ( L ( dimx, end, dimx, end ) ); 
     291                mat Lpsi = L ( dimx, end, 0, dimx - 1 ); 
     292                M = iLsub * Lpsi; 
     293        } 
    282294        R = ldR.to_mat()  ; 
    283295}