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

Revision 1187, 6.0 kB (checked in by smidl, 14 years ago)

logging of weights + old computing of weights

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