Changeset 205 for bdm/estim/merger.cpp

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

merger posledni verze

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • bdm/estim/merger.cpp

    r204 r205  
    1616                case 3://Ratio of Bessel 
    1717                        coef = sqrt ( ( 3*beta-2 ) /3*beta ); 
    18                         return log( besselk ( 0,sq2bl*coef )) - log( besselk ( 0,sq2bl ) ) +  mu; 
     18                        return log ( besselk ( 0,sq2bl*coef ) ) - log ( besselk ( 0,sq2bl ) ) +  mu; 
    1919                        break; 
    2020                case 4: 
     
    3131        it_assert_debug ( rv.equal ( g0->_rv() ),"Incompatible g0" ); 
    3232        //Empirical density - samples 
    33         eEmp eSmp ( rv,Ns ); 
    3433        eSmp.set_parameters ( ones ( Ns ), g0 ); 
    3534        Array<vec> &Smp = eSmp._samples(); //aux 
     
    6261        char str[100]; 
    6362 
    64         epdf* Mpred; 
     63        epdf* Mpred=Mix.predictor(rv); 
    6564        vec Mix_pdf ( Ns ); 
    6665        while ( !converged ) { 
     
    6968                Mix.flatten ( &Mix_init ); 
    7069                Mix.bayesB ( Smp_ex, w*Ns ); 
     70                delete Mpred; 
    7171                Mpred = Mix.predictor ( rv ); // Allocation => must be deleted at the end!! 
    72  
    73 //              sprintf ( str,"Mpred_mean%d",niter ); 
    74 //              dbg << Name ( str ) << Mpred->mean(); 
    75  
    76                 if ( 1 ) { 
     72                 
     73                if ( 1./sum_sqr ( w ) <0.5*Ns ) { 
    7774                        // Generate new samples 
    7875                        eSmp.set_samples ( Mpred ); 
    7976                        for ( int i=0;i<Ns;i++ ) { 
    8077                                //////////// !!!!!!!!!!!!! 
    81                                 if ( Smp ( i ) ( 1 ) <0 ) {Smp ( i ) ( 1 ) = GamRNG(); } 
     78                                if ( Smp ( i ) ( 1 ) <0 ) {Smp ( i ) ( 1 ) = 0.01; } 
    8279                                set_col_part ( Smp_ex,i,Smp ( i ) ); 
    8380                        } 
    84                         {cout<<"Eff. sample size=" << 1./sum_sqr ( w ) << endl;} 
     81                        {cout<<"Resampling =" << 1./sum_sqr ( w ) << endl;} 
    8582                        cout << sum ( Smp_ex,2 ) /Ns <<endl; 
     83                        cout << Smp_ex*Smp_ex.T()/Ns << endl;  
    8684                } 
    87                 else 
    88                         {cout<<"Eff. sample size=" << 1./sum_sqr ( w ) << endl;} 
     85//              sprintf ( str,"Mpred_mean%d",niter ); 
     86//              dbg << Name ( str ) << Mpred->mean(); 
     87 
    8988 
    9089//              sprintf ( str,"Mpdf%d",niter ); 
     
    135134                                                                        zdls ( i )->get_cond ( Smp ( k ) ) ) ); 
    136135                                                if ( !std::isfinite ( lw_src ( k ) ) ) { 
    137                                                         cout << endl; 
     136                                                        lw_src ( k ) = -1e16; cout << "!"; 
    138137                                                } 
    139138                                        } 
     
    166165                //Importance weighting 
    167166                lw -=  lw_mix; // hoping that it is not numerically sensitive... 
    168                 w = exp(lw-max(lw)); 
     167                w = exp ( lw-max ( lw ) ); 
    169168                //renormalize 
    170169                double sumw =sum ( w ); 
     
    173172                } 
    174173                else { 
    175                          
     174 
    176175                } 
    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                 } 
     176 
    192177//              sprintf ( str,"w_is_%d",niter ); 
    193178//              dbg << Name ( str ) << w;