00001
00013 #ifndef PF_H
00014 #define PF_H
00015
00016 #include <itpp/itbase.h>
00017 #include "../stat/libEF.h"
00018 #include "../math/libDC.h"
00019
00020 using namespace itpp;
00021
00022
00023 extern double PF_SSAT;
00024
00031 class PF : public BM {
00032 protected:
00034 int n;
00036 eEmp est;
00038 vec &_w;
00040 Array<vec> &_samples;
00042 mpdf ∥
00044 mpdf &obs;
00045 public:
00047 PF ( const RV &rv0, mpdf &par0, mpdf &obs0, int n0 ) :BM ( rv0 ),
00048 n ( n0 ),est ( rv0,n ),_w ( est._w() ),_samples ( est._samples() ),
00049 par ( par0 ), obs ( obs0 ) {};
00050
00052 void set_est ( const epdf &epdf0 );
00053 void bayes ( const vec &dt );
00055 vec* __w(){return &_w;}
00056 };
00057
00064 template<class BM_T>
00065
00066 class MPF : public PF {
00067 BM_T* Bms[10000];
00068
00070
00071 class mpfepdf : public epdf {
00072 protected:
00073 eEmp &E;
00074 vec &_w;
00075 Array<const epdf*> Coms;
00076 public:
00077 mpfepdf ( eEmp &E0, const RV &rvc ) :
00078 epdf ( RV( ) ), E ( E0 ), _w ( E._w() ),
00079 Coms ( _w.length() ) {
00080 rv.add ( E._rv() );
00081 rv.add ( rvc );
00082 };
00083
00084 void set_elements ( int &i, double wi, const epdf* ep )
00085 {_w ( i ) =wi; Coms ( i ) =ep;};
00086
00087 vec mean() const {
00088
00089 vec pom=zeros ( ( Coms ( 0 )->_rv() ).count() );
00090 for ( int i=0; i<_w.length(); i++ ) {pom += Coms ( i )->mean() * _w ( i );}
00091 return concat ( E.mean(),pom );
00092 }
00093 vec variance() const {
00094
00095 vec pom=zeros ( ( Coms ( 0 )->_rv() ).count() );
00096 vec pom2=zeros ( ( Coms ( 0 )->_rv() ).count() );
00097 for ( int i=0; i<_w.length(); i++ ) {
00098 pom += Coms ( i )->mean() * _w ( i );
00099 pom2 += (Coms ( i )->variance() + pow(Coms(i)->mean(),2)) * _w ( i );}
00100 return concat ( E.variance(),pom2-pow(pom,2) );
00101 }
00102
00103 vec sample() const {it_error ( "Not implemented" );return 0;}
00104
00105 double evallog ( const vec &val ) const {it_error ( "not implemented" ); return 0.0;}
00106 };
00107
00109 mpfepdf jest;
00110
00111 public:
00113 MPF ( const RV &rvlin, const RV &rvpf, mpdf &par0, mpdf &obs0, int n, const BM_T &BMcond0 ) : PF ( rvpf ,par0,obs0,n ),jest ( est,rvlin ) {
00114
00115
00116 rv.add ( rvlin );
00117
00118
00119 if ( n>10000 ) {it_error ( "increase 10000 here!" );}
00120
00121 for ( int i=0;i<n;i++ ) {
00122 Bms[i] = new BM_T ( BMcond0 );
00123 const epdf& pom=Bms[i]->_epdf();
00124 jest.set_elements ( i,1.0/n,&pom );
00125 }
00126 };
00127
00128 ~MPF() {
00129 }
00130
00131 void bayes ( const vec &dt );
00132 const epdf& _epdf() const {return jest;}
00133 const epdf* _e() const {return &jest;}
00135 void set_est ( const epdf& epdf0 ) {
00136 PF::set_est ( epdf0 );
00137
00138
00139 for ( int i=0;i<n;i++ ) {Bms[i]->condition ( _samples ( i ) );}
00140 }
00141
00143 BM* _BM(int i){return Bms[i];}
00144 };
00145
00146 template<class BM_T>
00147 void MPF<BM_T>::bayes ( const vec &dt ) {
00148 int i;
00149 vec lls ( n );
00150 vec llsP ( n );
00151 ivec ind;
00152 double mlls=-std::numeric_limits<double>::infinity();
00153
00154 #pragma omp parallel for
00155 for ( i=0;i<n;i++ ) {
00156
00157 _samples ( i ) = par.samplecond ( _samples ( i ), llsP ( i ) );
00158 Bms[i]->condition ( _samples ( i ) );
00159 Bms[i]->bayes ( dt );
00160 lls ( i ) = Bms[i]->_ll();
00161 if ( lls ( i ) >mlls ) mlls=lls ( i );
00162 }
00163
00164 double sum_w=0.0;
00165
00166 #pragma omp parallel for
00167 for ( i=0;i<n;i++ ) {
00168 _w ( i ) *= exp ( lls ( i ) - mlls );
00169 sum_w+=_w(i);
00170 }
00171
00172 if ( sum_w >0.0 ) {
00173 _w /=sum_w;
00174 } else {
00175 cout<<"sum(w)==0"<<endl;
00176 }
00177
00178
00179 double eff = 1.0/ ( _w*_w );
00180 if ( eff < ( 0.3*n ) ) {
00181 ind = est.resample();
00182
00183
00184 #pragma omp parallel for
00185 for ( i=0;i<n;i++ ) {
00186 if ( ind ( i ) !=i ) {
00187
00188
00189
00190
00191
00192 delete Bms[i];
00193 Bms[i] = new BM_T ( *Bms[ind ( i ) ] );
00194 const epdf& pom=Bms[i]->_epdf();
00195 jest.set_elements ( i,1.0/n,&pom );
00196 }
00197 };
00198 cout << '.';
00199 }
00200 }
00201
00202 #endif // KF_H
00203
00204