Changeset 638 for library/bdm/estim/particles.cpp
- Timestamp:
- 09/27/09 00:58:04 (15 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
library/bdm/estim/particles.cpp
r487 r638 5 5 using std::endl; 6 6 7 void PF::bayes ( const vec &dt ) { 8 int i; 9 vec lls ( n ); 10 ivec ind; 11 double mlls = -std::numeric_limits<double>::infinity(), sum = 0.0; 7 void PF::bayes_gensmp(){ 8 #pragma parallel for 9 for (int i = 0; i < n; i++ ) { 10 _samples ( i ) = par->samplecond ( _samples ( i ) ); 11 lls(i) = 0; 12 } 13 } 12 14 13 for ( i = 0; i < n; i++ ) { 14 //generate new samples from paramater evolution model; 15 vec old_smp=_samples ( i ); 16 _samples ( i ) = par->samplecond ( old_smp ); 17 lls ( i ) = par->evallogcond ( _samples ( i ), old_smp ); 18 lls ( i ) *= obs->evallogcond ( dt, _samples ( i ) ); 19 20 if ( lls ( i ) > mlls ) mlls = lls ( i ); //find maximum 21 } 22 15 void PF::bayes_weights(){ 16 // 17 double mlls=max(lls); 23 18 // compute weights 24 for ( i = 0; i < n; i++ ) {19 for (int i = 0; i < n; i++ ) { 25 20 _w ( i ) *= exp ( lls ( i ) - mlls ); // multiply w by likelihood 26 21 } 27 22 28 23 //renormalize 24 double sw=sum(_w); 25 if (!isfinite(sw)) { 26 for (int i=0;i<n;i++){ 27 if (!isfinite(_w(i))) {_w(i)=0;} 28 } 29 sw = sum(_w); 30 if (!isfinite(sw)) { 31 bdm_error("Particle filter is lost; no particle is good enough."); 32 } 33 } 34 _w /= sw; 35 } 36 37 void PF::bayes ( const vec &dt ) { 38 int i; 39 // generate samples - time step 40 bayes_gensmp(); 41 // weight them - data step 29 42 for ( i = 0; i < n; i++ ) { 30 sum += _w ( i );31 } ;43 lls ( i ) += obs->evallogcond ( dt, _samples ( i ) ); //+= because lls may have something from gensmp! 44 } 32 45 33 _w ( i ) /= sum; //?46 bayes_weights(); 34 47 35 ind = est.resample ( resmethod ); 48 if (do_resampling()) { 49 est.resample ( resmethod); 50 } 36 51 37 52 } … … 45 60 // } 46 61 62 void MPF::bayes ( const vec &dt ) { 63 // follows PF::bayes in most places!!! 64 65 int i; 66 int n=pf->__w().length(); 67 vec &lls = pf->_lls(); 68 69 // generate samples - time step 70 pf->bayes_gensmp(); 71 // weight them - data step 72 #pragma parallel for 73 for ( i = 0; i < n; i++ ) { 74 BMs(i) -> condition(pf->posterior()._sample(i)); 75 BMs(i) -> bayes(dt); 76 lls ( i ) += BMs(i)->_ll(); 77 } 78 79 pf->bayes_weights(); 80 81 ivec ind; 82 if (pf->do_resampling()) { 83 pf->resample ( ind); 84 85 #pragma omp parallel for 86 for ( i = 0; i < n; i++ ) { 87 if ( ind ( i ) != i ) {//replace the current Bm by a new one 88 delete BMs ( i ); 89 BMs ( i ) = BMs ( ind ( i ) )->_copy_(); //copy constructor 90 } 91 }; 92 } 93 }; 94 47 95 48 96 }