Changeset 33 for bdm/estim/libPF.h

Show
Ignore:
Timestamp:
03/05/08 16:01:56 (16 years ago)
Author:
smidl
Message:

Oprava PF a MPF + jejich implementace pro pmsm system

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • bdm/estim/libPF.h

    r32 r33  
    4141        mpdf &obs; 
    4242public: 
     43        //! Default constructor 
    4344        PF ( const RV &rv0, mpdf &par0,  mpdf &obs0, int n0 ) :BM ( rv0 ), 
    4445                        n ( n0 ),est ( rv0,n ),_w ( est._w() ),_samples ( est._samples() ), 
    4546                        par ( par0 ), obs ( obs0 ) {}; 
    4647 
    47 //      void set_parametres(mpdf &par0, mpdf &obs0) {par=&par0;obs=&obs0;}; 
     48        //! Set posterior density by sampling from epdf0 
    4849        void set_est ( const epdf &epdf0 ); 
    49         //TODO remove or implement bayes()! 
    5050        void bayes ( const vec &dt ); 
    5151}; 
     
    119119        void bayes ( const vec &dt ); 
    120120        epdf& _epdf() {return jest;} 
    121  
     121        //! Set postrior of \c rvc to samples from epdf0. Statistics of Bms are not re-computed! Use only for initialization! 
    122122        void set_est ( const epdf& epdf0 ) { 
    123123                PF::set_est ( epdf0 );  // sample params in condition 
     
    134134        ivec ind; 
    135135        double mlls=-std::numeric_limits<double>::infinity(); 
    136         double sum=0.0; 
    137136 
    138137        for ( i=0;i<n;i++ ) { 
     
    141140                Bms[i]->condition ( _samples ( i ) ); 
    142141                Bms[i]->bayes ( dt ); 
    143                 lls ( i ) += Bms[i]->_ll(); 
     142                lls ( i ) = Bms[i]->_ll(); // lls above is also in proposal her must be lls(i) =, not +=!! 
    144143 
    145144                if ( lls ( i ) >mlls ) mlls=lls ( i ); //find maximum likelihood (for numerical stability) 
     
    151150        } 
    152151 
    153         //renormalize 
    154         for ( i=0;i<n;i++ ) {sum+=_w ( i );}; 
     152        _w /=sum(_w); //? 
    155153 
    156         _w /=sum; //? 
    157  
    158         if ( ( _w*_w ) < ( 0.5*n ) ) { 
     154        double eff = 1.0/( _w*_w ); 
     155        if ( eff < ( 0.1*n ) ) { 
    159156                ind = est.resample(); 
    160157                // Resample Bms! 
     
    173170                        } 
    174171                }; 
     172                cout << '.';  
    175173        } 
    176174}