Changeset 665 for library/bdm/estim/particles.cpp
- Timestamp:
- 10/19/09 22:24:45 (15 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
library/bdm/estim/particles.cpp
r663 r665 5 5 using std::endl; 6 6 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; 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 _samples ( i ) = par->samplecond ( cond ); 15 lls(i) = 0; 16 } 17 } else { 18 #pragma parallel for 19 for (int i = 0; i < n; i++ ) { 20 _samples ( i ) = par->samplecond ( _samples ( i ) ); 21 lls(i) = 0; 22 } 12 23 } 13 24 } … … 28 39 } 29 40 sw = sum(_w); 30 if (!std::isfinite(sw) ) {41 if (!std::isfinite(sw) || sw==0.0) { 31 42 bdm_error("Particle filter is lost; no particle is good enough."); 32 43 } … … 36 47 37 48 void PF::bayes ( const vec &dt ) { 49 vec yt=dt.left(obs->dimension()); 50 vec ut=dt.get(obs->dimension(),dt.length()-1); 51 38 52 int i; 39 53 // generate samples - time step 40 bayes_gensmp( );54 bayes_gensmp(ut); 41 55 // weight them - data step 42 56 for ( i = 0; i < n; i++ ) { 43 lls ( i ) += obs->evallogcond ( dt, _samples ( i ) ); //+= because lls may have something from gensmp!57 lls ( i ) += obs->evallogcond ( yt, _samples ( i ) ); //+= because lls may have something from gensmp! 44 58 } 45 59 … … 61 75 62 76 void MPF::bayes ( const vec &dt ) { 63 // follows PF::bayes in most places!!! 64 77 // follows PF::bayes in most places!!! 65 78 int i; 66 79 int n=pf->__w().length(); … … 68 81 69 82 // generate samples - time step 70 pf->bayes_gensmp( );83 pf->bayes_gensmp(vec(0)); 71 84 // weight them - data step 72 85 #pragma parallel for