Show
Ignore:
Timestamp:
09/27/09 00:58:04 (15 years ago)
Author:
smidl
Message:

redesign of PF and MPF to be more flexible and share more code

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • library/bdm/estim/particles.cpp

    r487 r638  
    55using std::endl; 
    66 
    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; 
     7void 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} 
    1214 
    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  
     15void PF::bayes_weights(){ 
     16//  
     17        double mlls=max(lls); 
    2318        // compute weights 
    24         for ( i = 0; i < n; i++ ) { 
     19        for (int i = 0; i < n; i++ ) { 
    2520                _w ( i ) *= exp ( lls ( i ) - mlls ); // multiply w by likelihood 
    2621        } 
    2722 
    2823        //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 
     37void PF::bayes ( const vec &dt ) { 
     38        int i; 
     39        // generate samples - time step 
     40        bayes_gensmp(); 
     41        // weight them - data step 
    2942        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        } 
    3245 
    33         _w ( i ) /= sum; //? 
     46        bayes_weights(); 
    3447 
    35         ind = est.resample ( resmethod ); 
     48        if (do_resampling()) { 
     49                est.resample ( resmethod); 
     50        } 
    3651 
    3752} 
     
    4560// } 
    4661 
     62void 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 
    4795 
    4896}