Changeset 204 for bdm

Show
Ignore:
Timestamp:
11/10/08 15:40:29 (16 years ago)
Author:
smidl
Message:

merger is now in logarithms + new merge_test

Location:
bdm
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • bdm/estim/arx.cpp

    r201 r204  
    1515        nu+=w; 
    1616 
     17        // log(sqrt(2*pi)) = 0.91893853320467 
    1718        if ( evalll ) { 
    1819                lnc = est.lognc(); 
    19                 ll = lnc - last_lognc; 
     20                ll = lnc - last_lognc - 0.91893853320467; 
    2021                last_lognc = lnc; 
    2122        } 
  • bdm/estim/merger.cpp

    r198 r204  
    1111        switch ( nu ) { 
    1212                case 2: 
    13                         coef= ( 1-0.5*sqrt ( ( 4*beta-3 ) /beta ) ); 
    14                         return exp ( coef*sq2bl + mu ); 
     13                        coef= ( 1-0.5*sqrt ( ( 4.0*beta-3.0 ) /beta ) ); 
     14                        return  coef*sq2bl + mu ; 
    1515                        break; 
    1616                case 3://Ratio of Bessel 
    1717                        coef = sqrt ( ( 3*beta-2 ) /3*beta ); 
    18                         return elem_mult ( 
    19                                    elem_div ( besselk ( 0,sq2bl*coef ), besselk ( 0,sq2bl ) ), 
    20                                    exp ( mu ) ); 
     18                        return log( besselk ( 0,sq2bl*coef )) - log( besselk ( 0,sq2bl ) ) +  mu; 
    2119                        break; 
    2220                case 4: 
     
    4644        vec lw_src ( Ns ); 
    4745        vec lw_mix ( Ns ); 
     46        vec lw ( Ns ); 
    4847        mat lW=zeros ( n,Ns ); 
    4948        vec vec0 ( 0 ); 
     
    7574//              dbg << Name ( str ) << Mpred->mean(); 
    7675 
    77                 if ( niter<10 ) { 
     76                if ( 1 ) { 
    7877                        // Generate new samples 
    7978                        eSmp.set_samples ( Mpred ); 
    80                         for ( int i=0;i<Ns;i++ ) {      set_col_part ( Smp_ex,i,Smp ( i ) );} 
    81  
    82                 } 
     79                        for ( int i=0;i<Ns;i++ ) { 
     80                                //////////// !!!!!!!!!!!!! 
     81                                if ( Smp ( i ) ( 1 ) <0 ) {Smp ( i ) ( 1 ) = GamRNG(); } 
     82                                set_col_part ( Smp_ex,i,Smp ( i ) ); 
     83                        } 
     84                        {cout<<"Eff. sample size=" << 1./sum_sqr ( w ) << endl;} 
     85                        cout << sum ( Smp_ex,2 ) /Ns <<endl; 
     86                } 
     87                else 
     88                        {cout<<"Eff. sample size=" << 1./sum_sqr ( w ) << endl;} 
     89 
    8390//              sprintf ( str,"Mpdf%d",niter ); 
    8491//              for ( int i=0;i<Ns;i++ ) {Mix_pdf ( i ) = Mix.logpred ( Smp_ex.get_col ( i ) );} 
     
    127134                                                                        zdls ( i )->get_val ( Smp ( k ) ), 
    128135                                                                        zdls ( i )->get_cond ( Smp ( k ) ) ) ); 
     136                                                if ( !std::isfinite ( lw_src ( k ) ) ) { 
     137                                                        cout << endl; 
     138                                                } 
    129139                                        } 
    130140                                        delete tmp_cond; 
     
    147157//              dbg << Name ( str ) << lW; 
    148158 
    149                 w = lognorm_merge ( lW ); //merge 
     159                lw = lognorm_merge ( lW ); //merge 
    150160 
    151161//              sprintf ( str,"w%d",niter ); 
     
    155165 
    156166                //Importance weighting 
    157                 w /=exp ( lw_mix ); // hoping that it is not numerically sensitive... 
     167                lw -=  lw_mix; // hoping that it is not numerically sensitive... 
     168                w = exp(lw-max(lw)); 
    158169                //renormalize 
    159                 w /=sum ( w ); 
    160  
     170                double sumw =sum ( w ); 
     171                if ( std::isfinite ( sumw ) ) { 
     172                        w = w/sumw; 
     173                } 
     174                else { 
     175                         
     176                } 
     177                { 
     178                        double eff = 1./sum_sqr ( w ); 
     179                        if ( eff<2 ) { 
     180                                int mi= max_index ( w ); 
     181                                cout << w(mi) <<endl; 
     182                                cout << lW.get_col ( mi ) <<endl; 
     183                                mat mm(2,1);mm.set_col(0,lW.get_col(mi)); 
     184                                cout << lognorm_merge(mm) <<endl; 
     185                                cout << lw_mix ( mi ) <<endl; 
     186                                cout << lw ( mi ) <<endl; 
     187                                cout << Smp ( mi ) <<endl; 
     188                                cout << Mix._Coms(0)->_e()->mean() <<endl; 
     189                        } 
     190                        cout << "Eff: " << eff <<endl; 
     191                } 
    161192//              sprintf ( str,"w_is_%d",niter ); 
    162193//              dbg << Name ( str ) << w; 
     
    170201                // ==== stopping rule === 
    171202                niter++; 
    172                 converged = ( niter>5 ); 
     203                converged = ( niter>20 ); 
    173204        } 
     205        cout << endl; 
    174206 
    175207} 
  • bdm/stat/emix.h

    r193 r204  
    4747        //!Default constructor. By default, the given epdf is not copied! 
    4848        //! It is assumed that this function will be used only temporarily. 
    49         mratio ( const epdf* nom0, const RV &rv, bool copy=false ) :mpdf ( rv,nom0->_rv().subt(rv) ), dl(rv,rvc,nom0->_rv()) { 
     49        mratio ( const epdf* nom0, const RV &rv, bool copy=false ) :mpdf ( rv,nom0->_rv().subt ( rv ) ), dl ( rv,rvc,nom0->_rv() ) { 
    5050                if ( copy ) { 
    5151//                      nom = nom0->_copy_(); 
    52                         it_error("todo"); 
     52                        it_error ( "todo" ); 
    5353                        destroynom=true; 
    5454                } 
     
    6161        }; 
    6262        double evalcond ( const vec &val, const vec &cond ) { 
    63                 vec nom_val(rv.count()+rvc.count()); 
    64                 dl.fill_val_cond(nom_val,val,cond); 
     63                vec nom_val ( rv.count() +rvc.count() ); 
     64                dl.fill_val_cond ( nom_val,val,cond ); 
    6565                return exp ( nom->evalpdflog ( nom_val ) - den->evalpdflog ( cond ) ); 
    6666        } 
     
    132132        //! Auxiliary function for taking ownership of the Coms() 
    133133        void ownComs() {destroyComs=true;} 
    134          
     134 
    135135        //!access function 
    136         epdf* _Coms(int i){return Coms(i);} 
     136        epdf* _Coms ( int i ) {return Coms ( i );} 
    137137}; 
    138138 
     
    175175                                                // add logarithms 
    176176                                                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                                                                                 ); 
     177                        res *= mpdfs ( i )->evalcond ( 
     178                                   dls ( i )->get_val ( val ), 
     179                                   dls ( i )->get_cond ( val, cond ) 
     180                              ); 
    181181                } 
    182182                return res; 
     
    222222                        independent=rv.add ( epdfs ( i )->_rv() ); 
    223223                        it_assert_debug ( independent==true, "eprod:: given components are not independent ." ); 
    224                         dls ( i ) = new datalink_e2e( epdfs ( i )->_rv() , rv ); 
     224                } 
     225                for ( int i=0;i<epdfs.length();i++ ) { 
     226                        dls ( i ) = new datalink_e2e ( epdfs ( i )->_rv() , rv ); 
    225227                } 
    226228        } 
     
    230232                for ( int i=0;i<epdfs.length();i++ ) { 
    231233                        vec pom = epdfs ( i )->mean(); 
    232                         dls(i)->fill_val(tmp, pom ); 
     234                        dls ( i )->fill_val ( tmp, pom ); 
    233235                } 
    234236                return tmp; 
     
    238240                for ( int i=0;i<epdfs.length();i++ ) { 
    239241                        vec pom = epdfs ( i )->sample(); 
    240                         dls(i)->fill_val(tmp, pom ); 
     242                        dls ( i )->fill_val ( tmp, pom ); 
    241243                } 
    242244                return tmp; 
     
    245247                double tmp=0; 
    246248                for ( int i=0;i<epdfs.length();i++ ) { 
    247                         tmp+=epdfs ( i )->evalpdflog ( dls(i)->get_val ( val ) ); 
     249                        tmp+=epdfs ( i )->evalpdflog ( dls ( i )->get_val ( val ) ); 
    248250                } 
    249251                return tmp; 
     
    251253        //!access function 
    252254        const epdf* operator () ( int i ) const {it_assert_debug ( i<epdfs.length(),"wrong index" );return epdfs ( i );} 
    253          
     255 
    254256        //!Destructor 
    255         ~eprod(){for(int i=0;i<epdfs.length();i++){delete dls(i);}} 
     257        ~eprod() {for ( int i=0;i<epdfs.length();i++ ) {delete dls ( i );}} 
    256258}; 
    257259 
  • bdm/stat/libEF.h

    r203 r204  
    4848        virtual double evalpdflog_nn ( const vec &val ) const{it_error ( "Not implemented" );return 0.0;}; 
    4949        //!Evaluate normalized log-probability 
    50         virtual double evalpdflog ( const vec &val ) const {return evalpdflog_nn ( val )-lognc();} 
     50        virtual double evalpdflog ( const vec &val ) const {double tmp;tmp= evalpdflog_nn ( val )-lognc();it_assert_debug(std::isfinite(tmp),"why?"); return tmp;} 
    5151        //!Evaluate normalized log-probability for many samples 
    5252        virtual vec evalpdflog ( const mat &Val ) const {