Changeset 205 for bdm/estim/merger.cpp
- Timestamp:
- 11/10/08 15:40:30 (16 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
bdm/estim/merger.cpp
r204 r205 16 16 case 3://Ratio of Bessel 17 17 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; 19 19 break; 20 20 case 4: … … 31 31 it_assert_debug ( rv.equal ( g0->_rv() ),"Incompatible g0" ); 32 32 //Empirical density - samples 33 eEmp eSmp ( rv,Ns );34 33 eSmp.set_parameters ( ones ( Ns ), g0 ); 35 34 Array<vec> &Smp = eSmp._samples(); //aux … … 62 61 char str[100]; 63 62 64 epdf* Mpred ;63 epdf* Mpred=Mix.predictor(rv); 65 64 vec Mix_pdf ( Ns ); 66 65 while ( !converged ) { … … 69 68 Mix.flatten ( &Mix_init ); 70 69 Mix.bayesB ( Smp_ex, w*Ns ); 70 delete Mpred; 71 71 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 ) { 77 74 // Generate new samples 78 75 eSmp.set_samples ( Mpred ); 79 76 for ( int i=0;i<Ns;i++ ) { 80 77 //////////// !!!!!!!!!!!!! 81 if ( Smp ( i ) ( 1 ) <0 ) {Smp ( i ) ( 1 ) = GamRNG(); }78 if ( Smp ( i ) ( 1 ) <0 ) {Smp ( i ) ( 1 ) = 0.01; } 82 79 set_col_part ( Smp_ex,i,Smp ( i ) ); 83 80 } 84 {cout<<" Eff. sample size=" << 1./sum_sqr ( w ) << endl;}81 {cout<<"Resampling =" << 1./sum_sqr ( w ) << endl;} 85 82 cout << sum ( Smp_ex,2 ) /Ns <<endl; 83 cout << Smp_ex*Smp_ex.T()/Ns << endl; 86 84 } 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 89 88 90 89 // sprintf ( str,"Mpdf%d",niter ); … … 135 134 zdls ( i )->get_cond ( Smp ( k ) ) ) ); 136 135 if ( !std::isfinite ( lw_src ( k ) ) ) { 137 cout << endl;136 lw_src ( k ) = -1e16; cout << "!"; 138 137 } 139 138 } … … 166 165 //Importance weighting 167 166 lw -= lw_mix; // hoping that it is not numerically sensitive... 168 w = exp (lw-max(lw));167 w = exp ( lw-max ( lw ) ); 169 168 //renormalize 170 169 double sumw =sum ( w ); … … 173 172 } 174 173 else { 175 174 176 175 } 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 192 177 // sprintf ( str,"w_is_%d",niter ); 193 178 // dbg << Name ( str ) << w;