Changeset 193

Show
Ignore:
Timestamp:
10/22/08 10:46:42 (16 years ago)
Author:
smidl
Message:

oprava merger_iter a jeho casti

Files:
1 added
9 modified

Legend:

Unmodified
Added
Removed
  • bdm/estim/merger.cpp

    r192 r193  
    6060                //Re-Initialize Mixture model 
    6161                Mix.init ( &A0, Smp_ex, Nc ); 
    62                 Mix.bayesB ( Smp_ex, ones ( Ns ) );//w*Ns ); 
     62                Mix.bayesB ( Smp_ex, w*Ns ); 
    6363                Mpred = Mix.predictor ( rv ); // Allocation => must be deleted at the end!! 
    6464 
    65                 // Generate new samples 
    66                 eSmp.set_samples ( Mpred ); 
    67                 for ( int i=0;i<Ns;i++ ) {      set_col_part ( Smp_ex,i,Smp ( i ) );} 
     65                if ( 1 ) { 
     66                        // Generate new samples 
     67                        eSmp.set_samples ( Mpred ); 
     68                        for ( int i=0;i<Ns;i++ ) {      set_col_part ( Smp_ex,i,Smp ( i ) );} 
     69                } 
     70                else { 
     71                        for ( int ii=0;ii<10;ii++ ) { 
     72                                for ( int jj=0; jj<10; jj++ ) { 
     73                                        Smp ( ii+jj*10 ) =vec_2 ( -1.0+6*ii/10.0, -1.0+6*jj/10.0 ); 
     74                                } 
     75                        } 
     76                        for ( int i=0;i<Ns;i++ ) {      set_col_part ( Smp_ex,i,Smp ( i ) );} 
     77                } 
    6878 
    6979                sprintf ( str,"Mpdf%d",niter ); 
     
    98108                                // Compute likelihood of the missing variable 
    99109                                if ( rv.count() > ( mpdfs ( i )->_rv().count() + mpdfs ( i )->_rvc().count() ) ) { 
     110                                        /////////////// 
     111                                        cout << Mpred->mean() <<endl; 
    100112                                        // There are variales unknown to mpdfs(i) : rvzs 
    101113                                        mpdf* tmp_cond = Mpred->condition ( rvzs ( i ) ); 
    102114                                        // Compute likelihood 
     115                                        vec lw_dbg=lw_src; 
    103116                                        for ( int k= 0; k<Ns; k++ ) { 
    104117                                                lw_src ( k ) += log ( 
     
    111124                                // Compute likelihood of the partial source 
    112125                                for ( int k= 0; k<Ns; k++ ) { 
    113                                         mpdfs ( i )->condition ( dls ( i )->get_cond ( Smp(k) ) ); 
    114                                         lw_src ( k ) += mpdfs ( i )->_epdf().evalpdflog ( dls ( i )->get_val ( Smp(k) ) ); 
     126                                        mpdfs ( i )->condition ( dls ( i )->get_cond ( Smp ( k ) ) ); 
     127                                        lw_src ( k ) += mpdfs ( i )->_epdf().evalpdflog ( dls ( i )->get_val ( Smp ( k ) ) ); 
    115128                                } 
     129                                 
    116130                        } 
    117131                        lW.set_row ( i, lw_src ); // do not divide by mix 
     
    139153                dbg << Name ( str ) << w; 
    140154 
    141                 eSmp.resample(); // So that it can be used in bayes 
    142                 for ( int i=0;i<Ns;i++ ) {      set_col_part ( Smp_ex,i,Smp ( i ) );} 
     155//              eSmp.resample(); // So that it can be used in bayes 
     156//              for ( int i=0;i<Ns;i++ ) {      set_col_part ( Smp_ex,i,Smp ( i ) );} 
    143157 
    144158                sprintf ( str,"Smp_res%d",niter ); 
     
    147161                // ==== stopping rule === 
    148162                niter++; 
    149                 converged = ( niter>20 ); 
     163                converged = ( niter>4 ); 
    150164        } 
    151165 
  • bdm/estim/mixef.h

    r189 r193  
    9999        //! Flatten the density as if it was not estimated from the data 
    100100        void flatten(double sumw=1.0); 
     101        //! Access function 
     102        BMEF* _Coms(int i){return Coms(i);} 
    101103         
    102104        //!Set which method is to be used 
  • bdm/stat/emix.h

    r192 r193  
    4242        //!flag for destructor 
    4343        bool destroynom; 
     44        //!datalink between conditional and nom 
     45        datalink_m2e dl; 
    4446public: 
    4547        //!Default constructor. By default, the given epdf is not copied! 
    4648        //! It is assumed that this function will be used only temporarily. 
    47         mratio ( const epdf* nom0, const RV &rv, bool copy=false ) :mpdf ( rv,RV() ) { 
     49        mratio ( const epdf* nom0, const RV &rv, bool copy=false ) :mpdf ( rv,nom0->_rv().subt(rv) ), dl(rv,rvc,nom0->_rv()) { 
    4850                if ( copy ) { 
    4951//                      nom = nom0->_copy_(); 
     52                        it_error("todo"); 
    5053                        destroynom=true; 
    5154                } 
     
    5457                        destroynom = false; 
    5558                } 
    56                 rvc = nom->_rv().subt ( rv ); 
    5759                it_assert_debug ( rvc.length() >0,"Makes no sense to use this object!" ); 
    5860                den = nom->marginal ( rvc ); 
    5961        }; 
    6062        double evalcond ( const vec &val, const vec &cond ) { 
    61                 return exp ( nom->evalpdflog ( concat ( val,cond ) ) - den->evalpdflog ( cond ) ); 
     63                vec nom_val(rv.count()+rvc.count()); 
     64                dl.fill_val_cond(nom_val,val,cond); 
     65                return exp ( nom->evalpdflog ( nom_val ) - den->evalpdflog ( cond ) ); 
    6266        } 
    6367        //! Object takes ownership of nom and will destroy it 
     
    105109        }; 
    106110        vec evalpdflog_m ( const mat &Val ) const { 
    107                 vec x=ones ( Val.cols() ); 
    108                 vec y ( Val.cols() ); 
     111                vec x=zeros ( Val.cols() ); 
    109112                for ( int i = 0; i < w.length(); i++ ) { 
    110                         y = w ( i ) *exp ( Coms ( i )->evalpdflog_m ( Val ) ); 
    111                         elem_mult_inplace ( y,x ); //result is in x 
     113                        x+= w ( i ) *exp ( Coms ( i )->evalpdflog_m ( Val ) ); 
    112114                } 
    113115                return log ( x ); 
     
    130132        //! Auxiliary function for taking ownership of the Coms() 
    131133        void ownComs() {destroyComs=true;} 
     134         
     135        //!access function 
     136        epdf* _Coms(int i){return Coms(i);} 
    132137}; 
    133138 
     
    153158                // rv and rvc established = > we can link them with mpdfs 
    154159                for ( int i = 0;i < n;i++ ) { 
    155                         dls ( i ) = new datalink_m2m ( mpdfs ( i )->_rv(), mpdfs(i)->_rvc(), rv, rvc ); 
     160                        dls ( i ) = new datalink_m2m ( mpdfs ( i )->_rv(), mpdfs ( i )->_rvc(), rv, rvc ); 
    156161                } 
    157162 
     
    163168        double evalcond ( const vec &val, const vec &cond ) { 
    164169                int i; 
    165                 double res = 0.0; 
     170                double res = 1.0; 
    166171                for ( i = n - 1;i >= 0;i-- ) { 
    167                         if ( mpdfs(i)->_rvc().count() >0) { 
    168                                 mpdfs ( i )->condition ( dls ( i )->get_cond ( val,cond ) ); 
    169                         } 
    170                         // add logarithms 
    171                         res += epdfs ( i )->evalpdflog ( dls ( i )->get_val ( val ) ); 
    172                 } 
    173                 return exp ( res ); 
     172                        /*                      if ( mpdfs(i)->_rvc().count() >0) { 
     173                                                        mpdfs ( i )->condition ( dls ( i )->get_cond ( val,cond ) ); 
     174                                                } 
     175                                                // add logarithms 
     176                                                res += epdfs ( i )->evalpdflog ( dls ( i )->get_val ( val ) );*/ 
     177                        res *= mpdfs ( i )->evalcond (  
     178                                                   dls ( i )->get_val ( val ), 
     179                        dls ( i )->get_cond ( val, cond ) 
     180                                                                                 ); 
     181                } 
     182                return res; 
    174183        } 
    175184        vec samplecond ( const vec &cond, double &ll ) { 
     
    180189                // Hard assumption here!!! We are going backwards, to assure that samples that are needed from smp are already generated! 
    181190                for ( int i = ( n - 1 );i >= 0;i-- ) { 
    182                         if ( mpdfs(i)->_rvc().count() ) { 
     191                        if ( mpdfs ( i )->_rvc().count() ) { 
    183192                                mpdfs ( i )->condition ( dls ( i )->get_cond ( smp ,cond ) ); // smp is val here!! 
    184193                        } 
    185194                        smpi = epdfs ( i )->sample(); 
    186195                        // copy contribution of this pdf into smp 
    187                         dls(i)->fill_val(smp, smpi); 
     196                        dls ( i )->fill_val ( smp, smpi ); 
    188197                        // add ith likelihood contribution 
    189198                        ll+=epdfs ( i )->evalpdflog ( smpi ); 
     
    206215        Array<const epdf*> epdfs; 
    207216        //! Array of indeces 
    208         Array<ivec> rvinds; 
    209 public: 
    210         eprod ( const Array<const epdf*> epdfs0 ) : epdf ( RV() ),epdfs ( epdfs0 ),rvinds ( epdfs.length() ) { 
     217        Array<datalink_e2e*> dls; 
     218public: 
     219        eprod ( const Array<const epdf*> epdfs0 ) : epdf ( RV() ),epdfs ( epdfs0 ),dls ( epdfs.length() ) { 
    211220                bool independent=true; 
    212221                for ( int i=0;i<epdfs.length();i++ ) { 
    213222                        independent=rv.add ( epdfs ( i )->_rv() ); 
    214223                        it_assert_debug ( independent==true, "eprod:: given components are not independent ." ); 
    215                         rvinds ( i ) = ( epdfs ( i )->_rv() ).dataind ( rv ); 
     224                        dls ( i ) = new datalink_e2e( epdfs ( i )->_rv() , rv ); 
    216225                } 
    217226        } 
     
    221230                for ( int i=0;i<epdfs.length();i++ ) { 
    222231                        vec pom = epdfs ( i )->mean(); 
    223                         set_subvector ( tmp,rvinds ( i ), pom ); 
     232                        dls(i)->fill_val(tmp, pom ); 
    224233                } 
    225234                return tmp; 
     
    229238                for ( int i=0;i<epdfs.length();i++ ) { 
    230239                        vec pom = epdfs ( i )->sample(); 
    231                         set_subvector ( tmp,rvinds ( i ), pom ); 
     240                        dls(i)->fill_val(tmp, pom ); 
    232241                } 
    233242                return tmp; 
     
    236245                double tmp=0; 
    237246                for ( int i=0;i<epdfs.length();i++ ) { 
    238                         tmp+=epdfs ( i )->evalpdflog ( val ( rvinds ( i ) ) ); 
     247                        tmp+=epdfs ( i )->evalpdflog ( dls(i)->get_val ( val ) ); 
    239248                } 
    240249                return tmp; 
     
    242251        //!access function 
    243252        const epdf* operator () ( int i ) const {it_assert_debug ( i<epdfs.length(),"wrong index" );return epdfs ( i );} 
     253         
     254        //!Destructor 
     255        ~eprod(){for(int i=0;i<epdfs.length();i++){delete dls(i);}} 
    244256}; 
    245257 
  • bdm/stat/libBM.h

    r192 r193  
    296296                return tmp; 
    297297        } 
     298        void fill_val_cond ( vec &val_up, const vec &val, const vec &cond ) { 
     299                it_assert_debug ( valsize==val.length(),"Wrong val" ); 
     300                it_assert_debug ( valupsize==val_up.length(),"Wrong val_up" ); 
     301                set_subvector ( val_up, v2v_up, val ); 
     302                set_subvector ( val_up, v2c_up, cond ); 
     303        } 
    298304}; 
    299305//!DataLink is a connection between mpdf and its superordinate (Up) 
  • bdm/stat/libEF.cpp

    r182 r193  
    8282                mat R; 
    8383                mean_mat(M,R); 
    84                 return cvectorize (concat_vertical(M,R)); 
     84                return cvectorize (concat_vertical(M.T(),R)); 
    8585        } 
    8686 
  • bdm/stat/libEF.h

    r192 r193  
    620620 
    621621        //fixme - could this be done in general for all sq_T? 
    622         mat S=R.to_mat(); 
     622        mat S=Rn.to_mat(); 
    623623        //fixme 
    624624        int n=rvn.count()-1; 
  • matlab/merger_iter_debug.m

    r190 r193  
    77 
    88figure(1); 
    9 for it=0:20 
     9for it=0:4 
    1010    figure(it+1) 
    1111    subplot(2,2,1); 
     
    2424    subplot(2,2,3); 
    2525    eval(['contour_2(Smp' si '(1,:),Smp' si '(2,:),exp(lW' si '(2,:)))']); 
     26    %eval(['contour_2(Smp' si '(1,:),Smp' si '(2,:),exp(lw_cond' si '))']); 
    2627    title('Second source'); 
    2728    set(gca,'XLim',XL); 
     
    3031     
    3132    subplot(2,2,4); 
    32     eval(['contour_2(Smp' si '(1,:),Smp' si '(2,:),w' si ')']); 
     33    hold off 
     34    eval(['contour_2(Smp' si '(1,:),Smp' si '(2,:),w' si ','':'')']); 
    3335    title('Merged density');  
    3436    set(gca,'XLim',XL); 
    3537    set(gca,'YLim',YL); 
     38    hold on 
     39    eval(['contour_2(Smp' si '(1,:),Smp' si '(2,:),w_is_' si ')']); 
    3640     
    3741end 
  • tests/CMakeLists.txt

    r190 r193  
    3434TEST(enorm_test) 
    3535TEST(egiw_test) 
     36TEST(emix_test) 
    3637TEST(test0) 
    3738TEST(testResample) 
  • tests/merger_iter_test.cpp

    r190 r193  
    1111int main() { 
    1212 
    13         RNG_randomize(); 
     13        //RNG_randomize(); 
    1414         
    1515        RV x ( "{x }","1" ); 
     
    2121        enorm<fsqmat> f2 ( x ); 
    2222                 
    23         f1.set_parameters ( "0 0",mat ( "0.5 0; 0 0.5" ) ); 
     23        f1.set_parameters ( "3 2",mat ( "0.5 0; 0 0.5" ) ); 
    2424        f2.set_parameters ( "3",mat ( "0.5" ) ); 
    2525         
     
    4444        g0.set_parameters(vec("1 1"),mat("1 0; 0 1")); 
    4545         
    46         M.set_parameters(1.2,200,2); 
     46        M.set_parameters(1.2,100,1); 
    4747        M.merge(&g0); 
    4848