00001
00013 #ifndef BDMBASE_H
00014 #define BDMBASE_H
00015
00016 #include <map>
00017
00018 #include "../itpp_ext.h"
00019 #include "../bdmroot.h"
00020 #include "../shared_ptr.h"
00021 #include "user_info.h"
00022
00023 using namespace libconfig;
00024 using namespace itpp;
00025 using namespace std;
00026
00027 namespace bdm {
00029 class str {
00030 public:
00032 ivec ids;
00034 ivec times;
00036 str ( ivec ids0, ivec times0 ) : ids ( ids0 ), times ( times0 ) {
00037 bdm_assert ( times0.length() == ids0.length(), "Incompatible input" );
00038 };
00039 };
00040
00079 class RV : public root {
00080 private:
00081 typedef std::map<string, int> str2int_map;
00082
00084 static ivec SIZES;
00086 static Array<string> NAMES;
00087
00089 const static int BUFFER_STEP;
00090
00092 static str2int_map MAP;
00093
00094 public:
00095
00096 protected:
00098 int dsize;
00100 int len;
00102 ivec ids;
00104 ivec times;
00105
00106 private:
00107 enum enum_dummy {dummy};
00108
00110 void init ( const Array<std::string> &in_names, const ivec &in_sizes, const ivec &in_times );
00111 int init ( const string &name, int size );
00114 explicit RV ( const ivec &ids0, enum_dummy dum ) : dsize ( 0 ), len ( ids0.length() ), ids ( ids0 ), times ( zeros_i ( ids0.length() ) ) {
00115 dsize = countsize();
00116 }
00117 public:
00120
00122 RV ( const Array<std::string> &in_names, const ivec &in_sizes, const ivec &in_times ) {
00123 init ( in_names, in_sizes, in_times );
00124 }
00125
00127 RV ( const Array<std::string> &in_names, const ivec &in_sizes ) {
00128 init ( in_names, in_sizes, zeros_i ( in_names.length() ) );
00129 }
00130
00132 RV ( const Array<std::string> &in_names ) {
00133 init ( in_names, ones_i ( in_names.length() ), zeros_i ( in_names.length() ) );
00134 }
00135
00137 RV() : dsize ( 0 ), len ( 0 ), ids ( 0 ), times ( 0 ) {}
00138
00140 RV ( string name, int sz, int tm = 0 );
00141
00142
00144
00147
00149 friend std::ostream &operator<< ( std::ostream &os, const RV &rv );
00150
00151 string to_string() {ostringstream o; o << this; return o.str();}
00152
00154 int _dsize() const {
00155 return dsize;
00156 }
00157
00159 const ivec& _ids() const {
00160 return ids;
00161 }
00162
00164 int countsize() const;
00166 ivec cumsizes() const;
00168 int length() const {
00169 return len;
00170 }
00171 int id ( int at ) const {
00172 return ids ( at );
00173 }
00174 int size ( int at ) const {
00175 return SIZES ( ids ( at ) );
00176 }
00177 int time ( int at ) const {
00178 return times ( at );
00179 }
00180 std::string name ( int at ) const {
00181 return NAMES ( ids ( at ) );
00182 }
00184 std::string scalarname ( int scalat ) const {
00185 bdm_assert(scalat<dsize,"Wrong input index");
00186 int id=0;
00187 int scalid=0;
00188 while (scalid+SIZES(ids(id))<=scalat) { scalid+=SIZES(ids(id)); id++;};
00189
00190 if (size(id)==1)
00191 return NAMES ( ids ( id ) );
00192 else
00193 return NAMES ( ids ( id ) )+ "_" + num2str(scalat-scalid);
00194
00195 }
00196 void set_time ( int at, int time0 ) {
00197 times ( at ) = time0;
00198 }
00200
00203
00205 ivec findself ( const RV &rv2 ) const;
00207 ivec findself_ids ( const RV &rv2 ) const;
00209 bool equal ( const RV &rv2 ) const;
00211 bool add ( const RV &rv2 );
00213 RV subt ( const RV &rv2 ) const;
00215 RV subselect ( const ivec &ind ) const;
00216
00218 RV operator() ( const ivec &ind ) const {
00219 return subselect ( ind );
00220 }
00221
00223 RV operator() ( int di1, int di2 ) const;
00224
00226 void t_plus ( int delta );
00228
00231 RV remove_time() const {
00232 return RV ( unique ( ids ), dummy );
00233 }
00235 RV copy_t(int dt) const {
00236 RV tmp=*this;
00237 tmp.t_plus(dt);
00238 return tmp;
00239 }
00241 RV expand_delayes() const {
00242 RV rvt = this->remove_time();
00243 RV tmp = rvt;
00244 int td = mint();
00245 for ( int i = -1; i >= td; i-- ) {
00246 rvt.t_plus ( -1 );
00247 tmp.add ( rvt );
00248 }
00249 return tmp;
00250 }
00252
00255
00257 str tostr() const;
00260 ivec dataind ( const RV &crv ) const;
00262 ivec dataind_part ( const RV &crv ) const;
00265 void dataind ( const RV &rv2, ivec &selfi, ivec &rv2i ) const;
00267 int mint() const {
00268 return times.length()>0 ? min (times) : 0;
00269 }
00271
00284 void from_setting ( const Setting &set );
00285
00286
00287
00289 static void clear_all();
00291 string show_all();
00292
00293 };
00294 UIREGISTER ( RV );
00295 SHAREDPTR ( RV );
00296
00298 RV concat ( const RV &rv1, const RV &rv2 );
00299
00301 class fnc : public root {
00302 protected:
00304 int dimy;
00305 public:
00307 fnc() {};
00309 virtual vec eval ( const vec &cond ) {
00310 return vec ( 0 );
00311 };
00312
00314 virtual void condition ( const vec &val ) {};
00315
00317 int dimension() const {
00318 return dimy;
00319 }
00320 };
00321
00322 class mpdf;
00323
00325
00326 class epdf : public root {
00327 protected:
00329 int dim;
00331 RV rv;
00332
00333 public:
00345 epdf() : dim ( 0 ), rv() {};
00346 epdf ( const epdf &e ) : dim ( e.dim ), rv ( e.rv ) {};
00347 epdf ( const RV &rv0 ) : dim ( rv0._dsize() ) {
00348 set_rv ( rv0 );
00349 };
00350 void set_parameters ( int dim0 ) {
00351 dim = dim0;
00352 }
00354
00357
00359 virtual vec sample() const {
00360 bdm_error ( "not implemented" );
00361 return vec();
00362 }
00363
00365 virtual mat sample_m ( int N ) const;
00366
00369 virtual double evallog ( const vec &val ) const {
00370 bdm_error ( "not implemented" );
00371 return 0.0;
00372 }
00373
00375 virtual vec evallog_m ( const mat &Val ) const;
00376
00378 virtual vec evallog_m ( const Array<vec> &Avec ) const;
00379
00381 virtual shared_ptr<mpdf> condition ( const RV &rv ) const;
00382
00384 virtual shared_ptr<epdf> marginal ( const RV &rv ) const;
00385
00387 virtual vec mean() const {
00388 bdm_error ( "not implemneted" );
00389 return vec();
00390 }
00391
00393 virtual vec variance() const {
00394 bdm_error ( "not implemneted" );
00395 return vec();
00396 }
00397
00399 virtual void qbounds ( vec &lb, vec &ub, double percentage = 0.95 ) const {
00400 vec mea = mean();
00401 vec std = sqrt ( variance() );
00402 lb = mea - 2 * std;
00403 ub = mea + 2 * std;
00404 };
00406
00412
00414 void set_rv ( const RV &rv0 ) {
00415 rv = rv0;
00416 }
00417
00419 bool isnamed() const {
00420 bool b = ( dim == rv._dsize() );
00421 return b;
00422 }
00423
00425 const RV& _rv() const {
00426
00427 return rv;
00428 }
00430
00433
00435 int dimension() const {
00436 return dim;
00437 }
00445 void from_setting ( const Setting &set ) {
00446 shared_ptr<RV> r = UI::build<RV> ( set, "rv", UI::optional );
00447 if ( r ) {
00448 set_rv ( *r );
00449 }
00450 }
00451
00452 };
00453 SHAREDPTR ( epdf );
00454
00456 class mpdf : public root {
00457 protected:
00459 int dimc;
00461 RV rvc;
00462 private:
00464 epdf* ep;
00465
00466 protected:
00468 void set_ep ( epdf &iepdf ) {
00469 ep = &iepdf;
00470 }
00472 void set_ep ( epdf *iepdfp ) {
00473 ep = iepdfp;
00474 }
00475
00476 public:
00479
00480 mpdf() : dimc ( 0 ), rvc(), ep ( NULL ) { }
00481
00482 mpdf ( const mpdf &m ) : dimc ( m.dimc ), rvc ( m.rvc ), ep ( m.ep ) { }
00484
00487
00489 virtual vec samplecond ( const vec &cond ) {
00490 bdm_error ( "Not implemented" );
00491 return vec();
00492 }
00493
00495 virtual mat samplecond_m ( const vec &cond, int N );
00496
00498 virtual double evallogcond ( const vec &dt, const vec &cond ) {
00499 bdm_error ( "Not implemented" );
00500 return 0.0;
00501 }
00502
00504 virtual vec evallogcond_m ( const mat &Dt, const vec &cond ) {
00505 vec v ( Dt.cols() );
00506 for ( int i = 0; i < Dt.cols(); i++ ) {
00507 v ( i ) = evallogcond ( Dt.get_col ( i ), cond );
00508 }
00509 return v;
00510 }
00511
00513 virtual vec evallogcond_m ( const Array<vec> &Dt, const vec &cond ) {
00514 bdm_error ( "Not implemented" );
00515 return vec();
00516 }
00517
00520
00521 const RV& _rv() const {
00522 return ep->_rv();
00523 }
00524 const RV& _rvc() const {
00525 return rvc;
00526 }
00527
00528 int dimension() const {
00529 return ep->dimension();
00530 }
00531 int dimensionc() {
00532 return dimc;
00533 }
00534
00544 void from_setting ( const Setting &set );
00546
00549 void set_rvc ( const RV &rvc0 ) {
00550 rvc = rvc0;
00551 }
00552 void set_rv ( const RV &rv0 ) {
00553 ep->set_rv ( rv0 );
00554 }
00555 bool isnamed() {
00556 return ( ep->isnamed() ) && ( dimc == rvc._dsize() );
00557 }
00559 };
00560 SHAREDPTR ( mpdf );
00561
00563 template <class EPDF>
00564 class mpdf_internal: public mpdf {
00565 protected :
00567 EPDF iepdf;
00568 public:
00570 mpdf_internal() : mpdf(), iepdf() {
00571 set_ep ( iepdf );
00572 }
00573
00576 virtual void condition ( const vec &cond ) {
00577 bdm_error ( "Not implemented" );
00578 }
00579
00581 EPDF& e() {
00582 return iepdf;
00583 }
00584
00586 vec samplecond ( const vec &cond );
00588 double evallogcond ( const vec &val, const vec &cond );
00590 virtual vec evallogcond_m ( const mat &Dt, const vec &cond );
00592 virtual vec evallogcond_m ( const Array<vec> &Dt, const vec &cond );
00594 virtual mat samplecond_m ( const vec &cond, int N );
00595 };
00596
00622 class datalink {
00623 protected:
00625 int downsize;
00626
00628 int upsize;
00629
00631 ivec v2v_up;
00632
00633 public:
00635 datalink() : downsize ( 0 ), upsize ( 0 ) { }
00636
00638 datalink ( const RV &rv, const RV &rv_up ) {
00639 set_connection ( rv, rv_up );
00640 }
00641
00643 virtual void set_connection ( const RV &rv, const RV &rv_up );
00644
00646 virtual void set_connection ( int ds, int us, const ivec &upind );
00647
00649 vec pushdown ( const vec &val_up ) {
00650 vec tmp ( downsize );
00651 filldown ( val_up, tmp );
00652 return tmp;
00653 }
00655 virtual void filldown ( const vec &val_up, vec &val_down ) {
00656 bdm_assert_debug ( upsize == val_up.length(), "Wrong val_up" );
00657 val_down = val_up ( v2v_up );
00658 }
00660 virtual void pushup ( vec &val_up, const vec &val ) {
00661 bdm_assert_debug ( downsize == val.length(), "Wrong val" );
00662 bdm_assert_debug ( upsize == val_up.length(), "Wrong val_up" );
00663 set_subvector ( val_up, v2v_up, val );
00664 }
00666 int _upsize() {
00667 return upsize;
00668 }
00670 int _downsize() {
00671 return downsize;
00672 }
00673 };
00674
00677 class datalink_part : public datalink {
00678 protected:
00680 ivec v2v_down;
00681 public:
00682 void set_connection ( const RV &rv, const RV &rv_up );
00684 void filldown ( const vec &val_up, vec &val_down ) {
00685 set_subvector ( val_down, v2v_down, val_up ( v2v_up ) );
00686 }
00687 };
00688
00693 class datalink_buffered: public datalink_part {
00694 protected:
00696 vec history;
00698 RV Hrv;
00700 ivec h2v_down;
00702 ivec h2v_hist;
00704 ivec v2h_up;
00705 public:
00706
00707 datalink_buffered() : datalink_part(), history ( 0 ), h2v_down ( 0 ), h2v_hist ( 0 ) {};
00709 void step ( const vec &val_up ) {
00710 if ( v2h_up.length() > 0 ) {
00711 history.shift_right ( 0, v2h_up.length() );
00712 history.set_subvector ( 0, val_up(v2h_up) );
00713 }
00714 }
00716 vec pushdown ( const vec &val_up ) {
00717 vec tmp ( downsize );
00718 filldown ( val_up, tmp );
00719 return tmp;
00720 }
00721
00722 void filldown ( const vec &val_up, vec &val_down ) {
00723 bdm_assert_debug ( val_down.length() >= downsize, "short val_down" );
00724
00725 set_subvector ( val_down, v2v_down, val_up ( v2v_up ) );
00726 set_subvector ( val_down, h2v_down, history ( h2v_hist ) );
00727 }
00728
00729 void set_connection ( const RV &rv, const RV &rv_up ) {
00730
00731 datalink_part::set_connection ( rv, rv_up );
00732
00733
00734
00735 ivec valid_ids = rv.findself_ids ( rv_up );
00736 RV rv_hist = rv.subselect ( find ( valid_ids >= 0 ) );
00737 RV rv_hist0 =rv_hist.remove_time();
00738
00739 rv_hist = rv_hist.expand_delayes();
00740 Hrv=rv_hist.subt(rv_hist0);
00741 history = zeros ( Hrv._dsize() );
00742
00743
00744 if (Hrv._dsize() >0) {
00745 v2h_up = rv_hist0.dataind(rv_up);
00746 }
00747
00748 Hrv.dataind ( rv, h2v_hist, h2v_down );
00749
00750 downsize = v2v_down.length() + h2v_down.length();
00751 upsize = v2v_up.length();
00752 }
00754 void set_history(const RV& rv1, const vec &hist0){
00755 bdm_assert(rv1._dsize()==hist0.length(),"hist is not compatible with given rv1");
00756 ivec ind_H;
00757 ivec ind_h0;
00758 Hrv.dataind(rv1, ind_H, ind_h0);
00759 set_subvector(history, ind_H, hist0(ind_h0));
00760 }
00761 };
00762
00764 class datalink_2to1_buffered {
00765 protected:
00767 datalink_buffered dl1;
00769 datalink_buffered dl2;
00770 public:
00772 void set_connection ( const RV &rv, const RV &rv_up1, const RV &rv_up2 ) {
00773 dl1.set_connection ( rv, rv_up1 );
00774 dl2.set_connection ( rv, rv_up2 );
00775 }
00777 void filldown ( const vec &val1, const vec &val2, vec &val_down ) {
00778 bdm_assert_debug ( val_down.length() >= dl1._downsize() + dl2._downsize(), "short val_down" );
00779 dl1.filldown ( val1, val_down );
00780 dl2.filldown ( val2, val_down );
00781 }
00783 void step ( const vec &dt, const vec &ut ) {
00784 dl1.step ( dt );
00785 dl2.step ( ut );
00786 }
00787 };
00788
00789
00790
00792 class datalink_m2e: public datalink {
00793 protected:
00795 int condsize;
00796
00798 ivec v2c_up;
00799
00801 ivec v2c_lo;
00802
00803 public:
00805 datalink_m2e() : condsize ( 0 ) { }
00806
00808 void set_connection ( const RV &rv, const RV &rvc, const RV &rv_up );
00809
00811 vec get_cond ( const vec &val_up );
00812
00814 void pushup_cond ( vec &val_up, const vec &val, const vec &cond );
00815 };
00816
00819 class datalink_m2m: public datalink_m2e {
00820 protected:
00822 ivec c2c_up;
00824 ivec c2c_lo;
00825
00826 public:
00828 datalink_m2m() {};
00830 void set_connection ( const RV &rv, const RV &rvc, const RV &rv_up, const RV &rvc_up ) {
00831 datalink_m2e::set_connection ( rv, rvc, rv_up );
00832
00833 rvc.dataind ( rvc_up, c2c_lo, c2c_up );
00834 bdm_assert_debug ( c2c_lo.length() + v2c_lo.length() == condsize, "cond is not fully given" );
00835 }
00836
00838 vec get_cond ( const vec &val_up, const vec &cond_up ) {
00839 vec tmp ( condsize );
00840 set_subvector ( tmp, v2c_lo, val_up ( v2c_up ) );
00841 set_subvector ( tmp, c2c_lo, cond_up ( c2c_up ) );
00842 return tmp;
00843 }
00845
00846 };
00847
00853 class logger : public root {
00854 protected:
00856 Array<RV> entries;
00858 Array<string> names;
00859 public:
00861 logger() : entries ( 0 ), names ( 0 ) {}
00862
00865 virtual int add ( const RV &rv, string prefix = "" ) {
00866 int id;
00867 if ( rv._dsize() > 0 ) {
00868 id = entries.length();
00869 names = concat ( names, prefix );
00870 entries.set_length ( id + 1, true );
00871 entries ( id ) = rv;
00872 } else {
00873 id = -1;
00874 }
00875 return id;
00876 }
00877
00879 virtual void logit ( int id, const vec &v ) {
00880 bdm_error ( "Not implemented" );
00881 };
00883 virtual void logit ( int id, const double &d ) {
00884 bdm_error ( "Not implemented" );
00885 };
00886
00888 virtual void step() {
00889 bdm_error ( "Not implemneted" );
00890 };
00891
00893 virtual void finalize() {};
00894
00896 virtual void init() {};
00897
00898 };
00899
00903 class mepdf : public mpdf {
00905 shared_ptr<epdf> iepdf;
00906 public:
00908 mepdf() { }
00910 mepdf ( shared_ptr<epdf> em ) {
00911 iepdf = em;
00912 set_ep ( *iepdf.get() );
00913 dimc = 0;
00914 }
00915
00917 vec samplecond ( const vec &cond ) {
00918 return iepdf->sample();
00919 }
00920 double evallogcond ( const vec &val, const vec &cond ) {
00921 return iepdf->evallog ( val );
00922 }
00923
00931 void from_setting ( const Setting &set );
00932 };
00933 UIREGISTER ( mepdf );
00934 SHAREDPTR ( mepdf );
00935
00937 RV get_composite_rv ( const Array<shared_ptr<mpdf> > &mpdfs, bool checkoverlap = false );
00938
00954 class DS : public root {
00955 protected:
00957 int dtsize;
00959 int utsize;
00961 int ytsize;
00963 RV Drv;
00965 RV Urv;
00967 RV Yrv;
00969 ivec LIDs;
00970 public:
00972 DS() : Drv(), Urv(),Yrv(), LIDs(2) {};
00973
00975 virtual int max_length() {return std::numeric_limits< int >::max();}
00977 virtual void getdata ( vec &dt ) {
00978 bdm_error ( "abstract class" );
00979 }
00981 virtual void getdata ( vec &dt, const ivec &indeces ) {
00982 bdm_error ( "abstract class" );
00983 }
00984
00986 virtual void write (const vec &ut ) {
00987 bdm_error ( "abstract class" );
00988 }
00989
00991 virtual void write (const vec &ut, const ivec &indeces ) {
00992 bdm_error ( "abstract class" );
00993 }
00994
00996 virtual void step()
00997 {
00998 bdm_error ( "abstract class" );
00999 }
01000
01002 virtual void log_add ( logger &L ) {
01003 bdm_assert ( dtsize == Drv._dsize(), "invalid DS: dtsize (" + num2str ( dtsize ) + ") different from Drv " + num2str ( Drv._dsize() ) );
01004 bdm_assert ( utsize == Urv._dsize(), "invalid DS: utsize (" + num2str ( utsize ) + ") different from Urv " + num2str ( Urv._dsize() ) );
01005
01006 LIDs(0) = L.add ( Drv, "" );
01007 LIDs(1) = L.add ( Urv, "" );
01008 }
01010 virtual void logit ( logger &L ) {
01011 vec tmp ( Drv._dsize() + Urv._dsize() );
01012 getdata ( tmp );
01013
01014 L.logit ( LIDs(0), tmp.left ( Drv._dsize() ) );
01015
01016 L.logit ( LIDs(1), tmp.mid ( Drv._dsize(), Urv._dsize() ) );
01017 }
01019 virtual const RV& _drv() const {
01020
01021 return Drv;
01022 }
01024 const RV& _urv() const {
01025 return Urv;
01026 }
01028 const RV& _yrv() const {
01029 return Yrv;
01030 }
01032 virtual void set_drv (const RV &yrv, const RV &urv) {
01033 Yrv = yrv;
01034 Drv = concat(yrv,urv);
01035 Urv = urv;
01036 }
01037 };
01038
01060 class BM : public root {
01061 protected:
01063 RV drv;
01065 double ll;
01067 bool evalll;
01068 public:
01071
01072 BM() : ll ( 0 ), evalll ( true ), LIDs ( 4 ), LFlags ( 4 ) {
01073 LIDs = -1;
01074 LFlags = 0;
01075 LFlags ( 0 ) = 1;
01076 };
01077 BM ( const BM &B ) : drv ( B.drv ), ll ( B.ll ), evalll ( B.evalll ) {}
01080 virtual BM* _copy_() const {
01081 return NULL;
01082 };
01084
01087
01091 virtual void bayes ( const vec &dt ) = 0;
01093 virtual void bayesB ( const mat &Dt );
01096 virtual double logpred ( const vec &dt ) const {
01097 bdm_error ( "Not implemented" );
01098 return 0.0;
01099 }
01100
01102 vec logpred_m ( const mat &dt ) const {
01103 vec tmp ( dt.cols() );
01104 for ( int i = 0; i < dt.cols(); i++ ) {
01105 tmp ( i ) = logpred ( dt.get_col ( i ) );
01106 }
01107 return tmp;
01108 }
01109
01111 virtual epdf* epredictor() const {
01112 bdm_error ( "Not implemented" );
01113 return NULL;
01114 };
01116 virtual mpdf* predictor() const {
01117 bdm_error ( "Not implemented" );
01118 return NULL;
01119 };
01121
01126
01128 RV rvc;
01130 const RV& _rvc() const {
01131 return rvc;
01132 }
01133
01135 virtual void condition ( const vec &val ) {
01136 bdm_error ( "Not implemented!" );
01137 }
01138
01140
01141
01145 const RV& _drv() const {
01146 return drv;
01147 }
01149 void set_drv ( const RV &rv ) {
01150 drv = rv;
01151 }
01153 void set_rv ( const RV &rv ) {
01154 const_cast<epdf&> ( posterior() ).set_rv ( rv );
01155 }
01157 double _ll() const {
01158 return ll;
01159 }
01161 void set_evalll ( bool evl0 ) {
01162 evalll = evl0;
01163 }
01165 virtual const epdf& posterior() const = 0;
01167
01170
01172 virtual void set_options ( const string &opt ) {
01173 LFlags ( 0 ) = 1;
01174 if ( opt.find ( "logbounds" ) != string::npos ) {
01175 LFlags ( 1 ) = 1;
01176 LFlags ( 2 ) = 1;
01177 }
01178 if ( opt.find ( "logll" ) != string::npos ) {
01179 LFlags ( 3 ) = 1;
01180 }
01181 }
01183 ivec LIDs;
01184
01186 ivec LFlags;
01188 virtual void log_add ( logger &L, const string &name = "" ) {
01189
01190 RV r;
01191 if ( posterior().isnamed() ) {
01192 r = posterior()._rv();
01193 } else {
01194 r = RV ( "est", posterior().dimension() );
01195 };
01196
01197
01198 if ( LFlags ( 0 ) ) LIDs ( 0 ) = L.add ( r, name + "mean_" );
01199 if ( LFlags ( 1 ) ) LIDs ( 1 ) = L.add ( r, name + "lb_" );
01200 if ( LFlags ( 2 ) ) LIDs ( 2 ) = L.add ( r, name + "ub_" );
01201 if ( LFlags ( 3 ) ) LIDs ( 3 ) = L.add ( RV ( "ll", 1 ), name );
01202 }
01204 virtual void logit ( logger &L ) {
01205 L.logit ( LIDs ( 0 ), posterior().mean() );
01206 if ( LFlags ( 1 ) || LFlags ( 2 ) ) {
01207 vec ub, lb;
01208 posterior().qbounds ( lb, ub );
01209 L.logit ( LIDs ( 1 ), lb );
01210 L.logit ( LIDs ( 2 ), ub );
01211 }
01212 if ( LFlags ( 3 ) ) L.logit ( LIDs ( 3 ), ll );
01213 }
01215 void from_setting ( const Setting &set ) {
01216 shared_ptr<RV> r = UI::build<RV> ( set, "drv", UI::optional );
01217 if ( r ) {
01218 set_drv ( *r );
01219 }
01220 string opt;
01221 if ( !UI::get ( opt, set, "options", UI::optional ) ) {
01222 set_options ( opt );
01223 }
01224 }
01225
01226 };
01228 typedef Array<shared_ptr<epdf> > epdf_array;
01230 typedef Array<shared_ptr<mpdf> > mpdf_array;
01231
01232 template<class EPDF>
01233 vec mpdf_internal<EPDF>::samplecond ( const vec &cond ) {
01234 condition ( cond );
01235 vec temp = iepdf.sample();
01236 return temp;
01237 }
01238
01239 template<class EPDF>
01240 mat mpdf_internal<EPDF>::samplecond_m ( const vec &cond, int N ) {
01241 condition ( cond );
01242 mat temp ( dimension(), N );
01243 vec smp ( dimension() );
01244 for ( int i = 0; i < N; i++ ) {
01245 smp = iepdf.sample();
01246 temp.set_col ( i, smp );
01247 }
01248
01249 return temp;
01250 }
01251
01252 template<class EPDF>
01253 double mpdf_internal<EPDF>::evallogcond ( const vec &dt, const vec &cond ) {
01254 double tmp;
01255 condition ( cond );
01256 tmp = iepdf.evallog ( dt );
01257 return tmp;
01258 }
01259
01260 template<class EPDF>
01261 vec mpdf_internal<EPDF>::evallogcond_m ( const mat &Dt, const vec &cond ) {
01262 condition ( cond );
01263 return iepdf.evallog_m ( Dt );
01264 }
01265
01266 template<class EPDF>
01267 vec mpdf_internal<EPDF>::evallogcond_m ( const Array<vec> &Dt, const vec &cond ) {
01268 condition ( cond );
01269 return iepdf.evallog_m ( Dt );
01270 }
01271
01272 };
01273 #endif // BDMBASE_H