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

Revision 737, 2.4 kB (checked in by mido, 14 years ago)

ASTYLER RUN OVER THE WHOLE LIBRARY, JUPEE

  • 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 ) ) ) {
39                                _w ( i ) = 0;
40                        }
41                }
42                sw = sum ( _w );
43                if ( !std::isfinite ( sw ) || sw == 0.0 ) {
44                        bdm_error ( "Particle filter is lost; no particle is good enough." );
45                }
46        }
47        _w /= sw;
48}
49
50void PF::bayes ( const vec &yt, const vec &cond ) {
51        const vec &ut = cond; //todo
52
53        int i;
54        // generate samples - time step
55        bayes_gensmp ( ut );
56        // weight them - data step
57        for ( i = 0; i < n; i++ ) {
58                lls ( i ) += obs->evallogcond ( yt, _samples ( i ) ); //+= because lls may have something from gensmp!
59        }
60
61        bayes_weights();
62
63        if ( do_resampling() ) {
64                est.resample ( resmethod );
65        }
66
67}
68
69// void PF::set_est ( const epdf &epdf0 ) {
70//      int i;
71//
72//      for ( i=0;i<n;i++ ) {
73//              _samples ( i ) = epdf0.sample();
74//      }
75// }
76
77void MPF::bayes ( const vec &yt, const vec &cond ) {
78        // follows PF::bayes in most places!!!
79        int i;
80        int n = pf->__w().length();
81        vec &lls = pf->_lls();
82        Array<vec> &samples = pf->__samples();
83
84        // generate samples - time step
85        pf->bayes_gensmp ( vec ( 0 ) );
86        // weight them - data step
87#pragma parallel for
88        for ( i = 0; i < n; i++ ) {
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();
94        }
95
96        pf->bayes_weights();
97
98        ivec ind;
99        if ( pf->do_resampling() ) {
100                pf->resample ( ind );
101
102#pragma omp parallel for
103                for ( i = 0; i < n; i++ ) {
104                        if ( ind ( i ) != i ) {//replace the current Bm by a new one
105                                delete BMs ( i );
106                                BMs ( i ) = BMs ( ind ( i ) )->_copy_(); //copy constructor
107                        }
108                };
109        }
110};
111
112
113}
114//MPF::MPF:{}
Note: See TracBrowser for help on using the browser.