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
Line 
1#include "particles.h"
2
3namespace bdm {
4
5using std::endl;
6
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                }
23        }
24}
25
26void PF::bayes_weights(){
27//
28        double mlls=max(lls);
29        // compute weights
30        for (int  i = 0; i < n; i++ ) {
31                _w ( i ) *= exp ( lls ( i ) - mlls ); // multiply w by likelihood
32        }
33
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;}
39                }
40                sw = sum(_w);
41                if (!std::isfinite(sw) || sw==0.0) {
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 ) {
49        vec yt=dt.left(obs->dimension());
50        vec ut=dt.get(obs->dimension(),dt.length()-1);
51       
52        int i;
53        // generate samples - time step
54        bayes_gensmp(ut);
55        // weight them - data step
56        for ( i = 0; i < n; i++ ) {
57                lls ( i ) += obs->evallogcond ( yt, _samples ( i ) ); //+= because lls may have something from gensmp!
58        }
59
60        bayes_weights();
61
62        if (do_resampling()) {
63                est.resample ( resmethod);
64        }
65
66}
67
68// void PF::set_est ( const epdf &epdf0 ) {
69//      int i;
70//
71//      for ( i=0;i<n;i++ ) {
72//              _samples ( i ) = epdf0.sample();
73//      }
74// }
75
76void MPF::bayes ( const vec &dt ) {     
77        // follows PF::bayes in most places!!! 
78        int i;
79        int n=pf->__w().length();
80        vec &lls = pf->_lls();
81       
82        // generate samples - time step
83        pf->bayes_gensmp(vec(0));
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        }
91
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
109}
110//MPF::MPF:{}
Note: See TracBrowser for help on using the browser.