Changeset 204 for bdm/estim/merger.cpp
- Timestamp:
- 11/10/08 15:40:29 (16 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
bdm/estim/merger.cpp
r198 r204 11 11 switch ( nu ) { 12 12 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 ; 15 15 break; 16 16 case 3://Ratio of Bessel 17 17 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; 21 19 break; 22 20 case 4: … … 46 44 vec lw_src ( Ns ); 47 45 vec lw_mix ( Ns ); 46 vec lw ( Ns ); 48 47 mat lW=zeros ( n,Ns ); 49 48 vec vec0 ( 0 ); … … 75 74 // dbg << Name ( str ) << Mpred->mean(); 76 75 77 if ( niter<10) {76 if ( 1 ) { 78 77 // Generate new samples 79 78 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 83 90 // sprintf ( str,"Mpdf%d",niter ); 84 91 // for ( int i=0;i<Ns;i++ ) {Mix_pdf ( i ) = Mix.logpred ( Smp_ex.get_col ( i ) );} … … 127 134 zdls ( i )->get_val ( Smp ( k ) ), 128 135 zdls ( i )->get_cond ( Smp ( k ) ) ) ); 136 if ( !std::isfinite ( lw_src ( k ) ) ) { 137 cout << endl; 138 } 129 139 } 130 140 delete tmp_cond; … … 147 157 // dbg << Name ( str ) << lW; 148 158 149 w = lognorm_merge ( lW ); //merge159 lw = lognorm_merge ( lW ); //merge 150 160 151 161 // sprintf ( str,"w%d",niter ); … … 155 165 156 166 //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)); 158 169 //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 } 161 192 // sprintf ( str,"w_is_%d",niter ); 162 193 // dbg << Name ( str ) << w; … … 170 201 // ==== stopping rule === 171 202 niter++; 172 converged = ( niter> 5);203 converged = ( niter>20 ); 173 204 } 205 cout << endl; 174 206 175 207 }