Changeset 665 for library/bdm/estim

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

Compilation and minor extensions

Location:
library/bdm/estim
Files:
4 modified

Legend:

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

    r639 r665  
    66                 
    77        if ( frg < 1.0 ) { 
    8                 est.pow ( frg ); 
     8                est.pow ( frg ); // multiply V and nu 
    99                 
    1010                //stabilize 
    11                 ldmat V0(eye(V.rows())); 
    12                 V0*=(1-frg)*1e-3; 
     11                ldmat V0=alter_est._V(); //$ copy 
     12                double &nu0=alter_est._nu(); 
     13                V0*=(1-frg); 
    1314                V += V0; //stabilization 
    14                 nu +=(1-frg)*(0.1 + V.rows() + 1* dimx + 2); 
    15                  
    16                 // recompute loglikelihood of "prior" 
     15                nu +=(1-frg)*nu0; 
     16                 
     17                // recompute loglikelihood of new "prior" 
    1718                if ( evalll ) { 
    1819                        last_lognc = est.lognc(); 
     
    219220        int rgrlen = rrv->_dsize(); 
    220221         
     222        dimx = ylen; 
    221223        set_rv ( *yrv, *rrv ); 
    222224         
     
    234236 
    235237        //init 
    236         mat V0; 
    237         vec dV0; 
    238         if (!UI::get(V0, set, "V0",UI::optional)){ 
    239                 if ( !UI::get ( dV0, set, "dV0" ) ) 
    240                         dV0 = concat ( 1e-3 * ones ( ylen ), 1e-5 * ones ( rgrlen ) ); 
    241                 V0 = diag ( dV0 ); 
    242         } 
    243         double nu0; 
    244         if ( !UI::get ( nu0, set, "nu0" ) ) 
    245                 nu0 = rgrlen + ylen + 2; 
     238        shared_ptr<egiw> pri=UI::build<egiw>(set, "prior", UI::optional); 
     239        if (pri) { 
     240                bdm_assert(pri->_dimx()==ylen,"prior is not compatible"); 
     241                bdm_assert(pri->_V().rows()==ylen+rgrlen,"prior is not compatible"); 
     242                est.set_parameters( pri->_dimx(),pri->_V(), pri->_nu()); 
     243        }else{ 
     244                est.set_parameters( ylen, zeros(ylen+rgrlen)); 
     245                set_prior_default(est); 
     246        } 
     247                 
     248        shared_ptr<egiw> alt=UI::build<egiw>(set, "alternative", UI::optional); 
     249        if (alt) { 
     250                bdm_assert(alt->_dimx()==ylen,"alternative is not compatible"); 
     251                bdm_assert(alt->_V().rows()==ylen+rgrlen,"alternative is not compatible"); 
     252                alter_est.set_parameters( alt->_dimx(),alt->_V(), alt->_nu()); 
     253        } else { 
     254                alter_est = est; 
     255        } 
    246256 
    247257        double frg; 
     
    250260 
    251261        set_parameters ( frg ); 
    252         set_statistics ( ylen, V0, nu0 ); 
    253262         
    254263        //name results (for logging) 
  • library/bdm/estim/arx.h

    r660 r665  
    162162 
    163163        --- optional --- 
    164         V0  = [1 0;0 1];                           // Initial value of information matrix V 
    165           --- OR --- 
    166         dV0 = [1e-3, 1e-5, 1e-5, 1e-5];            // Initial value of diagonal of information matrix V 
    167                                                                                            // default: 1e-3 for rv, 1e-5 for rgr 
    168         nu0 = 6;                                                   // initial value of nu, default: rgrlen + 2 
     164        prior = {class='egiw',...};                // Prior density, when given default is used instead 
     165        alternative = {class='egiw',...};          // Alternative density in stabilized estimation, when not given prior is used 
     166         
    169167        frg = 1.0;                                 // forgetting, default frg=1.0 
    170168 
     
    178176                bdm_assert(dimx == _yrv._dsize(), "RVs of parameters and regressor do not match"); 
    179177                 
     178        } 
     179        //! function sets prior and alternative density  
     180        void set_prior(const RV &drv, egiw &prior){ 
     181                //TODO check ranges in RV and build prior 
     182        }; 
     183        //! build default prior and alternative when all values are set 
     184        void set_prior_default(egiw &prior){ 
     185                //assume  
     186                vec dV0(prior._V().rows()); 
     187                dV0.set_subvector(0,prior._dimx()-1, 1.0); 
     188                dV0.set_subvector(prior._dimx(),dV0.length()-1, 1e-5); 
     189                 
     190                prior.set_parameters(prior._dimx(),ldmat(dV0)); 
    180191        } 
    181192}; 
  • 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 
  • library/bdm/estim/particles.h

    r660 r665  
    9393        } 
    9494        //! bayes I - generate samples and add their weights to lls 
    95         virtual void bayes_gensmp(); 
     95        virtual void bayes_gensmp(const vec &ut); 
    9696        //! bayes II - compute weights of the  
    9797        virtual void bayes_weights(); 
     
    124124        */ 
    125125        void from_setting(const Setting &set){ 
     126                BM::from_setting(set); 
    126127                par = UI::build<mpdf>(set,"parameter_pdf",UI::compulsory); 
    127128                obs = UI::build<mpdf>(set,"observation_pdf",UI::compulsory); 
     
    137138                 
    138139                u.add(obs_u); // join both u, and check if they do not overlap 
    139                  
     140 
    140141                set_drv(concat(obs->_rv(),u) ); 
    141142        } 
     
    163164                        res_threshold=0.5; 
    164165                } 
     166                validate(); 
    165167        } 
    166168        //! load prior information from set and set internal structures accordingly 
     
    172174                        est=*test_emp; 
    173175                } else { 
    174                         int n; 
     176                        //int n; 
    175177                        if (!UI::get(n,set,"n",UI::optional)){n=10;} 
    176178                        // sample from prior 
    177179                        set_statistics(ones(n)/n, *pri); 
    178180                } 
     181                n = est._w().length(); 
    179182                //validate(); 
    180183        }