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

Revision 887, 5.9 kB (checked in by smidl, 14 years ago)

new base for particle filtering

  • Property svn:eol-style set to native
Line 
1#include "particles.h"
2
3namespace bdm {
4
5using std::endl;
6
7
8void PF::bayes_weights() {
9//
10        double mlls = max ( lls );
11        // compute weights
12        for ( int  i = 0; i < n; i++ ) {
13                w ( i ) *= exp ( lls ( i ) - mlls ); // multiply w by likelihood
14        }
15
16        //renormalize
17        double sw = sum ( w );
18        if ( !std::isfinite ( sw ) ) {
19                for ( int i = 0; i < n; i++ ) {
20                        if ( !std::isfinite ( w ( i ) ) ) {
21                                w ( i ) = 0;
22                        }
23                }
24                sw = sum ( w );
25                if ( !std::isfinite ( sw ) || sw == 0.0 ) {
26                        bdm_error ( "Particle filter is lost; no particle is good enough." );
27                }
28        }
29        w /= sw;
30}
31
32void PF::bayes ( const vec &yt, const vec &cond ) {
33
34/*      if (auxiliary){
35                ...
36        }*/
37        // weight them - data step
38        for (int i = 0; i < n; i++ ) {
39                particles(i)->bayes(yt,cond);
40                lls ( i ) = particles(i)->_ll(); //+= because lls may have something from gensmp!
41        }
42
43        bayes_weights();
44
45        if ( do_resampling() ) { resample ( ); }
46
47}
48
49// void PF::set_est ( const epdf &epdf0 ) {
50//      int i;
51//
52//      for ( i=0;i<n;i++ ) {
53//              _samples ( i ) = epdf0.sample();
54//      }
55// }
56
57// vec MPF::mpfepdf::mean() const {
58//      const vec &w = pf->posterior()._w();
59//      vec pom = zeros ( BMs ( 0 )->posterior ().dimension() );
60//      //compute mean of BMs
61//      for ( int i = 0; i < w.length(); i++ ) {
62//              pom += BMs ( i )->posterior().mean() * w ( i );
63//      }
64//      return concat ( pf->posterior().mean(), pom );
65// }
66//
67// vec MPF::mpfepdf::variance() const {
68//      const vec &w = pf->posterior()._w();
69//
70//      vec pom = zeros ( BMs ( 0 )->posterior ().dimension() );
71//      vec pom2 = zeros ( BMs ( 0 )->posterior ().dimension() );
72//      vec mea;
73//
74//      for ( int i = 0; i < w.length(); i++ ) {
75//              // save current mean
76//              mea = BMs ( i )->posterior().mean();
77//              pom += mea * w ( i );
78//              //compute variance
79//              pom2 += ( BMs ( i )->posterior().variance() + pow ( mea, 2 ) ) * w ( i );
80//      }
81//      return concat ( pf->posterior().variance(), pom2 - pow ( pom, 2 ) );
82// }
83//
84// void MPF::mpfepdf::qbounds ( vec &lb, vec &ub, double perc ) const {
85//      //bounds on particles
86//      vec lbp;
87//      vec ubp;
88//      pf->posterior().qbounds ( lbp, ubp );
89//
90//      //bounds on Components
91//      int dimC = BMs ( 0 )->posterior().dimension();
92//      int j;
93//      // temporary
94//      vec lbc ( dimC );
95//      vec ubc ( dimC );
96//      // minima and maxima
97//      vec Lbc ( dimC );
98//      vec Ubc ( dimC );
99//      Lbc = std::numeric_limits<double>::infinity();
100//      Ubc = -std::numeric_limits<double>::infinity();
101//
102//      for ( int i = 0; i < BMs.length(); i++ ) {
103//              // check Coms
104//              BMs ( i )->posterior().qbounds ( lbc, ubc );
105//              //save either minima or maxima
106//              for ( j = 0; j < dimC; j++ ) {
107//                      if ( lbc ( j ) < Lbc ( j ) ) {
108//                              Lbc ( j ) = lbc ( j );
109//                      }
110//                      if ( ubc ( j ) > Ubc ( j ) ) {
111//                              Ubc ( j ) = ubc ( j );
112//                      }
113//              }
114//      }
115//      lb = concat ( lbp, Lbc );
116//      ub = concat ( ubp, Ubc );
117// }
118//
119//
120//
121// void MPF::bayes ( const vec &yt, const vec &cond ) {
122//      // follows PF::bayes in most places!!!
123//      int i;
124//      int n = pf->__w().length();
125//      vec &lls = pf->_lls();
126//      Array<vec> &samples = pf->__samples();
127//
128//      // generate samples - time step
129//      pf->bayes_gensmp ( vec ( 0 ) );
130//      // weight them - data step
131// #pragma parallel for
132//      for ( i = 0; i < n; i++ ) {
133//              vec bm_cond ( BMs ( i )->dimensionc() );
134//              this2bm.fill_cond ( yt, cond, bm_cond );
135//              pf2bm.filldown ( samples ( i ), bm_cond );
136//              BMs ( i ) -> bayes ( this2bm.pushdown ( yt ), bm_cond );
137//              lls ( i ) += BMs ( i )->_ll();
138//      }
139//
140//      pf->bayes_weights();
141//
142//      ivec ind;
143//      if ( pf->do_resampling() ) {
144//              pf->resample ( ind );
145//
146// #pragma omp parallel for
147//              for ( i = 0; i < n; i++ ) {
148//                      if ( ind ( i ) != i ) {//replace the current Bm by a new one
149//                              delete BMs ( i );
150//                              BMs ( i ) = (BM*) BMs ( ind ( i ) )->_copy(); //copy constructor
151//                      }
152//              };
153//      }
154// };
155//
156//
157// void MPF_ARXg::bayes ( const vec &yt, const vec &cond ) {
158//      // follows PF::bayes in most places!!!
159//      int i;
160//      int n = pf->__w().length();
161//      vec &lls = pf->_lls();
162//      Array<vec> &samples = pf->__samples();
163//     
164//      // generate samples - time step
165//      for (int i =0;i<n; i++){
166//              mat M; chmat R;
167//              BMsp(i)->posterior().sample_mat(M,R);
168//              vec diff=R._Ch().T()*randn(samples(i).length());
169//              samples(i) = g->eval(samples(i)) + diff;
170//              ////////////
171// //           samples(i) = cond;
172//              /////////
173//              BMsp(i)->bayes(diff);
174//      }
175//      // weight them - data step
176//      enorm<ldmat> ooo;
177//      ooo.set_parameters(zeros(2),0.1*eye(2));
178//      ooo.validate();
179//     
180//      #pragma parallel for
181//      for ( i = 0; i < n; i++ ) {
182//              vec tmp=yt - h->eval(samples(i));
183//              BMso ( i ) -> bayes ( tmp );
184//              lls ( i ) += BMso ( i )->_ll();
185//              /////
186//              ooo._mu()=h->eval(samples(i));
187//              lls(i) = ooo.evallog_nn(yt);
188//      }
189//     
190//      pf->bayes_weights();
191//     
192//      ivec ind;
193//      if ( pf->do_resampling() ) {
194//              pf->resample ( ind );
195//             
196//              #pragma omp parallel for
197//              for ( i = 0; i < n; i++ ) {
198//                      if ( ind ( i ) != i ) {//replace the current Bm by a new one
199//                              delete BMso ( i );
200//                              BMso ( i ) = (ARX*) BMso ( ind ( i ) )->_copy(); //copy constructor
201//                              delete BMsp ( i );
202//                              BMsp ( i ) = (ARX*) BMsp ( ind ( i ) )->_copy(); //copy constructor
203//                      }
204//              };
205//      }
206// };
207//
208// void MPF_ARXg::from_setting(const libconfig::Setting& set) {
209//      BM::from_setting(set);
210//     
211//      pf = new PF;
212//      // prior must be set before BM
213//      pf->prior_from_set ( set );
214//      pf->resmethod_from_set ( set );
215//             
216//      // read functions g and h
217//      g=UI::build<fnc>(set,"g");
218//      h=UI::build<fnc>(set,"h");
219//     
220//      set_dim( g->dimension());
221//      dimy = h->dimension();
222//     
223//      shared_ptr<ARX> arxo=UI::build<ARX>(set,"arxo");
224//      shared_ptr<ARX> arxp=UI::build<ARX>(set,"arxp");
225//      int n = pf->__samples().length();
226//      BMso.set_length(n);
227//      BMsp.set_length(n);
228//      for(int i=0; i<n; i++){
229//              BMso(i)=arxo->_copy();
230//              BMsp(i)=arxp->_copy();
231//      }
232//     
233//      yrv = arxo->_yrv();
234//      //rvc = arxo->_rvc();
235//     
236//      validate();
237//     
238// }
239
240
241}
242//MPF::MPF:{}
Note: See TracBrowser for help on using the browser.