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