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