Changeset 270 for bdm/estim/libPF.h

Show
Ignore:
Timestamp:
02/16/09 10:02:08 (15 years ago)
Author:
smidl
Message:

Changes in the very root classes!
* rv and rvc are no longer compulsory,
* samplecond does not return ll
* BM has drv

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • bdm/estim/libPF.h

    r267 r270  
    1717#include "../stat/libEF.h" 
    1818 
    19 namespace bdm{ 
     19namespace bdm { 
    2020 
    2121/*! 
     
    3636        Array<vec> &_samples; 
    3737        //! Parameter evolution model 
    38         mpdf &par; 
     38        mpdf *par; 
    3939        //! Observation model 
    40         mpdf &obs; 
     40        mpdf *obs; 
    4141public: 
    42         //! Default constructor 
    43         PF ( const RV &rv0, mpdf &par0,  mpdf &obs0, int n0 ) :BM ( rv0 ), 
    44                         n ( n0 ),est ( rv0,n ),_w ( est._w() ),_samples ( est._samples() ), 
    45                         par ( par0 ), obs ( obs0 ) {}; 
    46  
     42        //! \name Constructors 
     43        //!@{ 
     44        PF ( ) :est(), _w ( est._w() ),_samples ( est._samples() ) {}; 
     45        PF( mpdf *par0, mpdf *obs0, epdf *epdf0, int n0 ) : 
     46                        est ( ),_w ( est._w() ),_samples ( est._samples() )  
     47                        { par = par0; obs=obs0; est.set_parameters ( ones(n0),epdf0 ); }; 
     48        void set_parameters ( mpdf *par0, mpdf *obs0, int n0 )  
     49                        { par = par0; obs=obs0; n=n0; }; 
     50        void set_statistics (const vec w0, epdf *epdf0){est.set_parameters ( w0,epdf0 );}; 
     51        //!@} 
    4752        //! Set posterior density by sampling from epdf0 
    4853        void set_est ( const epdf &epdf0 ); 
    4954        void bayes ( const vec &dt ); 
    5055        //!access function 
    51         vec* __w(){return &_w;} 
     56        vec* __w() {return &_w;} 
    5257}; 
    5358 
     
    7176                Array<const epdf*> Coms; 
    7277        public: 
    73                 mpfepdf ( eEmp &E0, const RV &rvc ) : 
    74                                 epdf ( RV( ) ), E ( E0 ),  _w ( E._w() ), 
     78                mpfepdf ( eEmp &E0) : 
     79                                epdf ( ), E ( E0 ),  _w ( E._w() ), 
    7580                                Coms ( _w.length() ) { 
    76                         rv.add ( E._rv() ); 
    77                         rv.add ( rvc ); 
    7881                }; 
    7982 
     
    8386                vec mean() const { 
    8487                        // ugly 
    85                         vec pom=zeros ( ( Coms ( 0 )->_rv() ).count() ); 
     88                        vec pom=zeros ( Coms(0)->dimension() ); 
    8689                        for ( int i=0; i<_w.length(); i++ ) {pom += Coms ( i )->mean() * _w ( i );} 
    8790                        return concat ( E.mean(),pom ); 
     
    8992                vec variance() const { 
    9093                        // ugly 
    91                         vec pom=zeros ( ( Coms ( 0 )->_rv() ).count() ); 
    92                         vec pom2=zeros ( ( Coms ( 0 )->_rv() ).count() ); 
     94                        vec pom=zeros ( Coms ( 0 )->dimension() ); 
     95                        vec pom2=zeros (  Coms ( 0 )->dimension() ); 
    9396                        for ( int i=0; i<_w.length(); i++ ) { 
    9497                                pom += Coms ( i )->mean() * _w ( i ); 
    95                                 pom2 += (Coms ( i )->variance() + pow(Coms(i)->mean(),2)) * _w ( i );} 
    96                         return concat ( E.variance(),pom2-pow(pom,2) ); 
     98                                pom2 += ( Coms ( i )->variance() + pow ( Coms ( i )->mean(),2 ) ) * _w ( i ); 
     99                        } 
     100                        return concat ( E.variance(),pom2-pow ( pom,2 ) ); 
    97101                } 
    98102 
     
    107111public: 
    108112        //! Default constructor. 
    109         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 ) { 
     113        MPF ( mpdf *par0, mpdf *obs0, int n, const BM_T &BMcond0 ) : PF (), jest ( est ) { 
     114                PF::set_parameters(par0,obs0,n); 
    110115                // 
    111116                //TODO test if rv and BMcond.rv are compatible. 
    112                 rv.add ( rvlin ); 
     117//              rv.add ( rvlin ); 
    113118                // 
    114119 
     
    137142 
    138143        //!Access function 
    139         BM* _BM(int i){return Bms[i];} 
     144        BM* _BM ( int i ) {return Bms[i];} 
    140145}; 
    141146 
     
    148153        double mlls=-std::numeric_limits<double>::infinity(); 
    149154 
    150         #pragma omp parallel for 
    151         for ( i=0;i<n;i++ ) {    
     155#pragma omp parallel for 
     156        for ( i=0;i<n;i++ ) { 
    152157                //generate new samples from paramater evolution model; 
    153                 _samples ( i ) = par.samplecond ( _samples ( i ) ); 
    154                 llsP ( i ) = par._e()->evallog(_samples(i)); 
     158                _samples ( i ) = par->samplecond ( _samples ( i ) ); 
     159                llsP ( i ) = par->_e()->evallog ( _samples ( i ) ); 
    155160                Bms[i]->condition ( _samples ( i ) ); 
    156161                Bms[i]->bayes ( dt ); 
     
    161166        double sum_w=0.0; 
    162167        // compute weights 
    163         #pragma omp parallel for 
     168#pragma omp parallel for 
    164169        for ( i=0;i<n;i++ ) { 
    165170                _w ( i ) *= exp ( lls ( i ) - mlls ); // multiply w by likelihood 
    166                 sum_w+=_w(i); 
     171                sum_w+=_w ( i ); 
    167172        } 
    168173 
    169174        if ( sum_w  >0.0 ) { 
    170175                _w /=sum_w; //? 
    171         } else { 
     176        } 
     177        else { 
    172178                cout<<"sum(w)==0"<<endl; 
    173179        } 
     
    179185                // Resample Bms! 
    180186 
    181                 #pragma omp parallel for 
     187#pragma omp parallel for 
    182188                for ( i=0;i<n;i++ ) { 
    183189                        if ( ind ( i ) !=i ) {//replace the current Bm by a new one