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
00027 class PF : public BM {
00028 protected:
00030 int n;
00032 eEmp ePdf;
00034 vec &w;
00036 Array<vec> &samples;
00038 mpdf ∥
00040 mpdf &obs;
00041 public:
00042 PF ( const RV &rv0, mpdf &par0, mpdf &obs0, int n ) :BM(rv0),
00043 n ( 1 ),ePdf ( rv0 ),w ( ePdf._w() ),samples ( ePdf._samples() ),
00044 par ( par0 ), obs ( obs0 ) {};
00045
00046 void set_est ( const epdf* &epdf0 );
00047
00048 void bayes ( const vec &dt );
00049 };
00050
00057 template<class BM_T>
00058 class MPF : public PF {
00059 BM_T* Bms[1000];
00060 RV rvc;
00061 emix est;
00062 public:
00064 MPF ( const RV &rv0, mpdf &par0, mpdf &obs0, int n, const BM_T &BMcond0 ) :
00065 PF ( rv0,par0,obs0,n ), est(rv0,w) {
00066
00067 if (n>1000) it_error("increase 1000 here!");
00068 for ( int i=0;i<n;i++ ) {
00069 Bms[i] = new BM_T(BMcond0);
00070 epdf& pom=Bms[i]->_epdf();
00071 est.set_parameters(i,&pom);
00072 }
00073 };
00074 ~MPF() {
00075 }
00076 void bayes (const vec &dt );
00077 epdf& _epdf(){return est;}
00078 };
00079
00080 template<class BM_T>
00081 void MPF<BM_T>::bayes( const vec &dt) {
00082 int i;
00083 vec lls(n);
00084 ivec ind;
00085 double mlls=-std::numeric_limits<double>::infinity(), sum=0.0;
00086
00087 for ( i=0;i<n;i++ ) {
00088
00089 samples(i) = par.samplecond( samples( i ), lls(i) );
00090 if (lls(i)>mlls) mlls=lls(i);
00091 }
00092
00093 for ( i=0;i<n;i++ ) {
00094 w(i) *= exp( lls(i) - mlls);
00095 }
00096
00097 for ( i=0;i<n;i++ ){sum+=w( i );};
00098 w( i ) /=sum;
00099
00100 ind = ePdf.resample();
00101
00102 }
00103
00104 #endif // KF_H
00105
00106