Changeset 737 for library/bdm/estim/particles.cpp
- Timestamp:
- 11/25/09 12:14:38 (15 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
library/bdm/estim/particles.cpp
r700 r737 5 5 using std::endl; 6 6 7 void PF::bayes_gensmp (const vec &ut){8 if ( ut.length()>0){9 vec cond (par->dimensionc());10 cond.set_subvector (par->dimension(),ut);11 12 for ( int i = 0; i < n; i++ ) {13 cond.set_subvector (0,_samples ( i ));7 void PF::bayes_gensmp ( const vec &ut ) { 8 if ( ut.length() > 0 ) { 9 vec cond ( par->dimensionc() ); 10 cond.set_subvector ( par->dimension(), ut ); 11 #pragma parallel for 12 for ( int i = 0; i < n; i++ ) { 13 cond.set_subvector ( 0, _samples ( i ) ); 14 14 _samples ( i ) = par->samplecond ( cond ); 15 lls (i) = 0;15 lls ( i ) = 0; 16 16 } 17 } else { 18 19 for ( int i = 0; i < n; i++ ) {17 } else { 18 #pragma parallel for 19 for ( int i = 0; i < n; i++ ) { 20 20 _samples ( i ) = par->samplecond ( _samples ( i ) ); 21 lls (i) = 0;21 lls ( i ) = 0; 22 22 } 23 23 } 24 24 } 25 25 26 void PF::bayes_weights() {27 // 28 double mlls =max(lls);26 void PF::bayes_weights() { 27 // 28 double mlls = max ( lls ); 29 29 // compute weights 30 for ( int i = 0; i < n; i++ ) {30 for ( int i = 0; i < n; i++ ) { 31 31 _w ( i ) *= exp ( lls ( i ) - mlls ); // multiply w by likelihood 32 32 } 33 33 34 34 //renormalize 35 double sw=sum(_w); 36 if (!std::isfinite(sw)) { 37 for (int i=0;i<n;i++){ 38 if (!std::isfinite(_w(i))) {_w(i)=0;} 35 double sw = sum ( _w ); 36 if ( !std::isfinite ( sw ) ) { 37 for ( int i = 0; i < n; i++ ) { 38 if ( !std::isfinite ( _w ( i ) ) ) { 39 _w ( i ) = 0; 40 } 39 41 } 40 sw = sum (_w);41 if ( !std::isfinite(sw) || sw==0.0) {42 bdm_error ("Particle filter is lost; no particle is good enough.");42 sw = sum ( _w ); 43 if ( !std::isfinite ( sw ) || sw == 0.0 ) { 44 bdm_error ( "Particle filter is lost; no particle is good enough." ); 43 45 } 44 46 } … … 46 48 } 47 49 48 void PF::bayes ( const vec &yt, const vec &cond ) {49 const vec &ut =cond; //todo50 50 void PF::bayes ( const vec &yt, const vec &cond ) { 51 const vec &ut = cond; //todo 52 51 53 int i; 52 54 // generate samples - time step 53 bayes_gensmp (ut);55 bayes_gensmp ( ut ); 54 56 // weight them - data step 55 57 for ( i = 0; i < n; i++ ) { … … 59 61 bayes_weights(); 60 62 61 if ( do_resampling()) {62 est.resample ( resmethod );63 if ( do_resampling() ) { 64 est.resample ( resmethod ); 63 65 } 64 66 … … 73 75 // } 74 76 75 void MPF::bayes ( const vec &yt, const vec &cond ) { 76 // follows PF::bayes in most places!!! 77 void MPF::bayes ( const vec &yt, const vec &cond ) { 78 // follows PF::bayes in most places!!! 77 79 int i; 78 int n =pf->__w().length();80 int n = pf->__w().length(); 79 81 vec &lls = pf->_lls(); 80 Array<vec> &samples =pf->__samples();81 82 Array<vec> &samples = pf->__samples(); 83 82 84 // generate samples - time step 83 pf->bayes_gensmp (vec(0));85 pf->bayes_gensmp ( vec ( 0 ) ); 84 86 // weight them - data step 85 87 #pragma parallel for 86 88 for ( i = 0; i < n; i++ ) { 87 vec bm_cond (BMs(i)->dimensionc());88 this2bm.fill_cond (yt,cond, bm_cond);89 pf2bm.filldown (samples(i), bm_cond);90 BMs (i) -> bayes(this2bm.pushdown(yt), bm_cond);91 lls ( i ) += BMs (i)->_ll();89 vec bm_cond ( BMs ( i )->dimensionc() ); 90 this2bm.fill_cond ( yt, cond, bm_cond ); 91 pf2bm.filldown ( samples ( i ), bm_cond ); 92 BMs ( i ) -> bayes ( this2bm.pushdown ( yt ), bm_cond ); 93 lls ( i ) += BMs ( i )->_ll(); 92 94 } 93 95 94 96 pf->bayes_weights(); 95 97 96 98 ivec ind; 97 if ( pf->do_resampling()) {98 pf->resample ( ind );99 100 99 if ( pf->do_resampling() ) { 100 pf->resample ( ind ); 101 102 #pragma omp parallel for 101 103 for ( i = 0; i < n; i++ ) { 102 104 if ( ind ( i ) != i ) {//replace the current Bm by a new one