Show
Ignore:
Timestamp:
10/19/09 22:24:45 (15 years ago)
Author:
smidl
Message:

Compilation and minor extensions

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • library/bdm/estim/particles.cpp

    r663 r665  
    55using std::endl; 
    66 
    7 void PF::bayes_gensmp(){ 
    8         #pragma parallel for 
    9         for (int i = 0; i < n; i++ ) { 
    10                 _samples ( i ) = par->samplecond ( _samples ( i ) ); 
    11                 lls(i) = 0; 
     7void PF::bayes_gensmp(const vec &ut){ 
     8        if (ut.length()>0){ 
     9                vec cond(par->dimensionc()); 
     10                cond.set_subvector(par->dimension(),ut); 
     11                #pragma parallel for 
     12                for (int i = 0; i < n; i++ ) { 
     13                        cond.set_subvector(0,_samples ( i )); 
     14                        _samples ( i ) = par->samplecond ( cond ); 
     15                        lls(i) = 0; 
     16                } 
     17        } else {                 
     18                #pragma parallel for 
     19                for (int i = 0; i < n; i++ ) { 
     20                        _samples ( i ) = par->samplecond ( _samples ( i ) ); 
     21                        lls(i) = 0; 
     22                } 
    1223        } 
    1324} 
     
    2839                } 
    2940                sw = sum(_w); 
    30                 if (!std::isfinite(sw)) { 
     41                if (!std::isfinite(sw) || sw==0.0) { 
    3142                        bdm_error("Particle filter is lost; no particle is good enough."); 
    3243                } 
     
    3647 
    3748void PF::bayes ( const vec &dt ) { 
     49        vec yt=dt.left(obs->dimension()); 
     50        vec ut=dt.get(obs->dimension(),dt.length()-1); 
     51         
    3852        int i; 
    3953        // generate samples - time step 
    40         bayes_gensmp(); 
     54        bayes_gensmp(ut); 
    4155        // weight them - data step 
    4256        for ( i = 0; i < n; i++ ) { 
    43                 lls ( i ) += obs->evallogcond ( dt, _samples ( i ) ); //+= because lls may have something from gensmp! 
     57                lls ( i ) += obs->evallogcond ( yt, _samples ( i ) ); //+= because lls may have something from gensmp! 
    4458        } 
    4559 
     
    6175 
    6276void MPF::bayes ( const vec &dt ) {      
    63         // follows PF::bayes in most places!!! 
    64          
     77        // follows PF::bayes in most places!!!   
    6578        int i; 
    6679        int n=pf->__w().length(); 
     
    6881         
    6982        // generate samples - time step 
    70         pf->bayes_gensmp(); 
     83        pf->bayes_gensmp(vec(0)); 
    7184        // weight them - data step 
    7285        #pragma parallel for