Changeset 665

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

Compilation and minor extensions

Location:
library/bdm
Files:
11 modified

Legend:

Unmodified
Added
Removed
  • library/bdm/base/bdmbase.h

    r660 r665  
    149149        friend std::ostream &operator<< ( std::ostream &os, const RV &rv ); 
    150150 
    151         string to_string() {ostringstream o; o << this; return o.str();} 
     151        string to_string() const {ostringstream o; o << *this; return o.str();} 
    152152         
    153153        //! total size of a random variable 
     
    303303        //! Length of the output vector 
    304304        int dimy; 
     305        //! Length of the input vector 
     306        int dimc; 
    305307public: 
    306308        //!default constructor 
     
    317319        int dimension() const { 
    318320                return dimy; 
     321        } 
     322        //! access function 
     323        int dimensionc() const { 
     324                return dimc; 
    319325        } 
    320326}; 
     
    671677                return downsize; 
    672678        } 
     679        //! for future use 
     680        virtual ~datalink(){} 
    673681}; 
    674682 
     
    12191227                } 
    12201228                string opt; 
    1221                 if ( !UI::get ( opt, set, "options", UI::optional ) ) { 
     1229                if ( UI::get ( opt, set, "options", UI::optional ) ) { 
    12221230                        set_options ( opt ); 
    12231231                } 
  • library/bdm/base/datasources.cpp

    r660 r665  
    118118        time = 0; 
    119119        //rowid and delays are ignored 
    120  
     120        rowid = linspace(0,Data.rows()-1); 
    121121        set_drv ( *rvtmp, RV() ); 
    122122} 
  • library/bdm/base/user_info.h

    r659 r665  
    575575        //!@} 
    576576 
     577        //! for future use 
     578        virtual ~UI(){} 
    577579}; 
    578580 
  • library/bdm/bdmroot.h

    r477 r665  
    3333 
    3434        //! This method returns a basic info about the current instance 
    35         virtual string to_string() { 
     35        virtual string to_string() const { 
    3636                return ""; 
    3737        } 
  • 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        } 
  • library/bdm/math/functions.h

    r620 r665  
    8484        vec eval ( const vec &cond ) { 
    8585                bdm_assert_debug ( cond.length() == ( dimx + dimu ), "linfn::eval Wrong cond." ); 
    86                 return eval ( cond ( 0, dimx - 1 ), cond ( dimx, dimx + dimu - 1 ) );//-1 = end (in matlab) 
     86                if (dimu>0){ 
     87                        return eval ( cond ( 0, dimx - 1 ), cond ( dimx, dimx + dimu - 1 ) );//-1 = end (in matlab) 
     88                } else { 
     89                        return eval ( cond ( 0, dimx - 1 ), vec(0) );//-1 = end (in matlab) 
     90                } 
     91                                 
    8792        } 
    8893 
  • library/bdm/stat/exp_family.cpp

    r637 r665  
    8282 
    8383//      bdm_assert_debug ( ( ( -nkG - nkW ) > -Inf ) && ( ( -nkG - nkW ) < Inf ), "ARX improper" ); 
    84 if (-nkG - nkW==Inf){ 
    85         cout << "??" <<endl; 
    86 } 
     84        if (-nkG - nkW==Inf){ 
     85                cout << "??" <<endl; 
     86        } 
    8787        return -nkG - nkW; 
    8888} 
  • library/bdm/stat/exp_family.h

    r660 r665  
    244244                double& _nu()  {return nu;} 
    245245                const double& _nu() const {return nu;} 
     246                const int & _dimx() const {return dimx;} 
    246247                /*! Create Gauss-inverse-Wishart density  
    247248                \f[ f(rv) = GiW(V,\nu) \f] 
     
    250251                class = 'egiw'; 
    251252                V     = [];               // square matrix 
     253                dV    = [];               // vector of diagonal of V (when V not given) 
    252254                nu    = [];               // scalar \nu ((almost) degrees of freedom) 
    253255                                                                  // when missing, it will be computed to obtain proper pdf 
     
    260262                void from_setting (const Setting &set) { 
    261263                        epdf::from_setting(set); 
    262                         if (!UI::get (nu, set, "nu", UI::compulsory)) {nu=-1;} 
    263264                        UI::get (dimx, set, "dimx", UI::compulsory); 
     265                        if (!UI::get (nu, set, "nu", UI::optional)) {nu=-1;} 
    264266                        mat V; 
    265                         UI::get (V, set, "V", UI::compulsory); 
    266                         set_parameters (dimx, V, nu); 
     267                        if (!UI::get (V, set, "V", UI::optional)){ 
     268                                vec dV; 
     269                                UI::get (dV, set, "dV", UI::compulsory); 
     270                                set_parameters (dimx, ldmat(dV), nu); 
     271                                 
     272                        } else { 
     273                                set_parameters (dimx, V, nu); 
     274                        } 
     275                } 
     276                void validate(){ 
     277                        // check sizes, rvs etc. 
    267278                } 
    268279                //!@} 
     
    594605 
    595606                double evallog (const vec &val) const  { 
    596                         if (any (val < low) && any (val > high)) {return inf;} 
     607                        if (any (val < low) && any (val > high)) {return -inf;} 
    597608                        else return lnk; 
    598609                } 
     
    632643UIREGISTER(euni); 
    633644 
     645//! Uniform density with conditional mean value 
     646class mguni : public mpdf_internal<euni>{ 
     647        //! function of the mean value 
     648        shared_ptr<fnc> mean; 
     649        //! distance from mean to both sides 
     650        vec delta; 
     651        public: 
     652                void condition(const vec &cond){ 
     653                        vec mea=mean->eval(cond); 
     654                        iepdf.set_parameters(mea-delta,mea+delta); 
     655                } 
     656                //! load from 
     657                void from_setting(const Setting &set){ 
     658                        mpdf::from_setting(set); //reads rv and rvc 
     659                        UI::get(delta,set,"delta",UI::compulsory); 
     660                        mean = UI::build<fnc>(set,"mean",UI::compulsory); 
     661                         
     662                        iepdf.set_parameters(-delta,delta); 
     663                        dimc = mean->dimensionc(); 
     664                        validate(); 
     665                } 
     666}; 
     667UIREGISTER(mguni); 
    634668/*! 
    635669 \brief Normal distributed linear function with linear function of mean value;