root/library/bdm/estim/particles.cpp @ 665

Revision 665, 2.2 kB (checked in by smidl, 15 years ago)

Compilation and minor extensions

  • Property svn:eol-style set to native
RevLine 
[384]1#include "particles.h"
[8]2
[283]3namespace bdm {
[8]4
5using std::endl;
6
[665]7void 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                }
[11]23        }
[638]24}
[11]25
[638]26void PF::bayes_weights(){
27//
28        double mlls=max(lls);
[32]29        // compute weights
[638]30        for (int  i = 0; i < n; i++ ) {
[32]31                _w ( i ) *= exp ( lls ( i ) - mlls ); // multiply w by likelihood
[11]32        }
33
[32]34        //renormalize
[638]35        double sw=sum(_w);
[663]36        if (!std::isfinite(sw)) {
[638]37                for (int i=0;i<n;i++){
[663]38                        if (!std::isfinite(_w(i))) {_w(i)=0;}
[638]39                }
40                sw = sum(_w);
[665]41                if (!std::isfinite(sw) || sw==0.0) {
[638]42                        bdm_error("Particle filter is lost; no particle is good enough.");
43                }
44        }
45        _w /= sw;
46}
47
48void PF::bayes ( const vec &dt ) {
[665]49        vec yt=dt.left(obs->dimension());
50        vec ut=dt.get(obs->dimension(),dt.length()-1);
51       
[638]52        int i;
53        // generate samples - time step
[665]54        bayes_gensmp(ut);
[638]55        // weight them - data step
[477]56        for ( i = 0; i < n; i++ ) {
[665]57                lls ( i ) += obs->evallogcond ( yt, _samples ( i ) ); //+= because lls may have something from gensmp!
[638]58        }
[11]59
[638]60        bayes_weights();
[11]61
[638]62        if (do_resampling()) {
63                est.resample ( resmethod);
64        }
[8]65
66}
67
[283]68// void PF::set_est ( const epdf &epdf0 ) {
69//      int i;
[477]70//
[283]71//      for ( i=0;i<n;i++ ) {
72//              _samples ( i ) = epdf0.sample();
73//      }
74// }
[8]75
[638]76void MPF::bayes ( const vec &dt ) {     
[665]77        // follows PF::bayes in most places!!! 
[638]78        int i;
79        int n=pf->__w().length();
80        vec &lls = pf->_lls();
81       
82        // generate samples - time step
[665]83        pf->bayes_gensmp(vec(0));
[638]84        // weight them - data step
85        #pragma parallel for
86        for ( i = 0; i < n; i++ ) {
87                BMs(i) -> condition(pf->posterior()._sample(i));
88                BMs(i) -> bayes(dt);
89                lls ( i ) += BMs(i)->_ll();
90        }
[32]91
[638]92        pf->bayes_weights();
93       
94        ivec ind;
95        if (pf->do_resampling()) {
96                pf->resample ( ind);
97               
98                #pragma omp parallel for
99                for ( i = 0; i < n; i++ ) {
100                        if ( ind ( i ) != i ) {//replace the current Bm by a new one
101                                delete BMs ( i );
102                                BMs ( i ) = BMs ( ind ( i ) )->_copy_(); //copy constructor
103                        }
104                };
105        }
106};
107
108
[254]109}
[32]110//MPF::MPF:{}
Note: See TracBrowser for help on using the browser.