Changeset 204 for bdm/estim/merger.cpp

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

merger is now in logarithms + new merge_test

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • 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}