00001
00013 #ifndef DATASOURCE_H
00014 #define DATASOURCE_H
00015
00016
00017 #include "../base/bdmbase.h"
00018 #include "../stat/exp_family.h"
00019 #include "../base/user_info.h"
00020
00021 namespace bdm {
00029 class MemDS : public DS {
00030 protected:
00032 mat Data;
00034 int time;
00036 ivec rowid;
00038 ivec delays;
00039
00040 public:
00041 void getdata ( vec &dt );
00042 void getdata ( vec &dt, const ivec &indeces );
00043 void set_rvs ( RV &drv, RV &urv );
00044
00045 void write ( vec &ut ) {
00046 bdm_error ( "MemDS::write is not supported" );
00047 }
00048
00049 void write ( vec &ut, ivec &indices ) {
00050 bdm_error ( "MemDS::write is not supported" );
00051 }
00052
00053 void step();
00055 MemDS () {};
00056 MemDS ( mat &Dat, ivec &rowid0, ivec &delays0 );
00057 };
00058
00063 class EpdfDS: public DS {
00064 protected:
00066 shared_ptr<epdf> iepdf;
00068 vec dt;
00069 public:
00070 void step() {
00071 dt=iepdf->sample();
00072 }
00073 void getdata ( vec &dt_out ) {
00074 dt_out = dt;
00075 }
00076 void getdata ( vec &dt_out, const ivec &ids ) {
00077 dt_out = dt ( ids );
00078 }
00079 const RV& _drv() {
00080 return iepdf->_rv();
00081 }
00082
00090 void from_setting ( const Setting &set ) {
00091 iepdf=UI::build<epdf> ( set,"epdf",UI::compulsory );
00092 dt = zeros ( iepdf->dimension() );
00093 }
00094 };
00095 UIREGISTER ( EpdfDS );
00096
00100 class MpdfDS :public DS {
00101 protected:
00103 shared_ptr<mpdf> impdf;
00105 vec yt;
00107 vec ut;
00109 datalink_buffered ut2rgr;
00111 datalink_buffered yt2rgr;
00113 vec rgr;
00114
00115 public:
00116 void step() {
00117 yt2rgr.step(yt);
00118 ut2rgr.filldown ( ut,rgr );
00119 yt2rgr.filldown ( yt,rgr );
00120 yt=impdf->samplecond ( rgr );
00121 ut2rgr.step(ut);
00122 }
00123 void getdata ( vec &dt_out ) {
00124 bdm_assert_debug(dt_out.length()>=utsize+ytsize,"Short output vector");
00125 dt_out.set_subvector(0, yt);
00126 dt_out.set_subvector(ytsize, ut);
00127 }
00128 void write(const vec &ut0){ut=ut0;}
00129
00137 void from_setting ( const Setting &set ) {
00138 impdf=UI::build<mpdf> ( set,"mpdf",UI::compulsory );
00139
00140 Yrv = impdf->_rv();
00141
00142 RV rgrv0=impdf->_rvc().remove_time();
00143
00144 Urv=rgrv0.subt(Yrv);
00145 set_drv(Yrv, Urv);
00146
00147 ut2rgr.set_connection(impdf->_rvc(), Urv);
00148 yt2rgr.set_connection(impdf->_rvc(), Yrv);
00149
00150 yt = zeros ( impdf->dimension() );
00151 rgr = zeros ( impdf->dimensionc() );
00152 ut = zeros(Urv._dsize());
00153
00154 ytsize=yt.length();
00155 utsize=ut.length();
00156 dtsize = ytsize+utsize;
00157 }
00158 };
00159 UIREGISTER ( MpdfDS );
00160
00164 class FileDS: public MemDS {
00165
00166 public:
00167 void getdata ( vec &dt ) {
00168 dt = Data.get_col ( time );
00169 }
00170
00171 void getdata ( vec &dt, const ivec &indices ) {
00172 vec tmp = Data.get_col ( time );
00173 dt = tmp ( indices );
00174 }
00175
00177 int ndat() {
00178 return Data.cols();
00179 }
00181 void log_add ( logger &L ) {};
00183 void logit ( logger &L ) {};
00184 };
00185
00192 class ITppFileDS: public FileDS {
00193
00194 public:
00195 ITppFileDS ( const string &fname, const string &varname ) : FileDS() {
00196 it_file it ( fname );
00197 it << Name ( varname );
00198 it >> Data;
00199 time = 0;
00200
00201 };
00202
00203 ITppFileDS () : FileDS() {
00204 };
00205
00206 void from_setting ( const Setting &set );
00207
00208
00209
00210 };
00211
00212 UIREGISTER ( ITppFileDS );
00213 SHAREDPTR ( ITppFileDS );
00214
00222 class CsvFileDS: public FileDS {
00223
00224 public:
00226 CsvFileDS ( const string& fname, const string& orientation = "BY_COL" );
00227 };
00228
00229
00230
00235 class ArxDS : public DS {
00236 protected:
00238 RV Rrv;
00240 vec H;
00242 vec U;
00244 vec rgr;
00246 datalink rgrlnk;
00248 mlnorm<chmat> model;
00250 bool opt_L_theta;
00252 int L_theta;
00253 int L_R;
00254 int dt_size;
00255 public:
00256 void getdata ( vec &dt ) {
00257 dt = H;
00258 }
00259
00260 void getdata ( vec &dt, const ivec &indices ) {
00261 dt = H ( indices );
00262 }
00263
00264 void write ( vec &ut ) {
00265 U = ut;
00266 }
00267
00268 void write ( vec &ut, const ivec &indices ) {
00269 bdm_assert_debug ( ut.length() == indices.length(), "ArxDS" );
00270 set_subvector ( U, indices, ut );
00271 }
00272
00273 void step();
00274
00276 ArxDS ( ) {};
00278 void set_parameters ( const mat &Th0, const vec mu0, const chmat &sqR0 ) {
00279 model.set_parameters ( Th0, mu0, sqR0 );
00280 };
00282 void set_drv ( const RV &yrv, const RV &urv, const RV &rrv ) {
00283 Rrv = rrv;
00284 Urv = urv;
00285 dt_size = yrv._dsize() + urv._dsize();
00286
00287 RV drv = concat ( yrv, urv );
00288 Drv = drv;
00289 int td = rrv.mint();
00290 H.set_size ( drv._dsize() * ( -td + 1 ) );
00291 U.set_size ( Urv._dsize() );
00292 for ( int i = -1; i >= td; i-- ) {
00293 drv.t_plus ( -1 );
00294 Drv.add ( drv );
00295 }
00296 rgrlnk.set_connection ( rrv, Drv );
00297
00298 dtsize = Drv._dsize();
00299 utsize = Urv._dsize();
00300 }
00302 void set_options ( const string &s ) {
00303 opt_L_theta = ( s.find ( "L_theta" ) != string::npos );
00304 };
00305 virtual void log_add ( logger &L ) {
00306
00307 L_dt = L.add ( Drv ( 0, dt_size ), "" );
00308 L_ut = L.add ( Urv, "" );
00309
00310 const mat &A = model._A();
00311 const mat R = model._R();
00312 if ( opt_L_theta ) {
00313 L_theta = L.add ( RV ( "{th }", vec_1 ( A.rows() * A.cols() ) ), "t" );
00314 }
00315 if ( opt_L_theta ) {
00316 L_R = L.add ( RV ( "{R }", vec_1 ( R.rows() * R.cols() ) ), "r" );
00317 }
00318 }
00319 virtual void logit ( logger &L ) {
00320
00321 L.logit ( L_dt, H.left ( dt_size ) );
00322 L.logit ( L_ut, U );
00323
00324 const mat &A = model._A();
00325 const mat R = model._R();
00326 if ( opt_L_theta ) {
00327 L.logit ( L_theta, vec ( A._data(), A.rows() *A.cols() ) );
00328 };
00329 if ( opt_L_theta ) {
00330 L.logit ( L_R, vec ( R._data(), R.rows() *R.rows() ) );
00331 };
00332 }
00333
00334
00366 void from_setting ( const Setting &set );
00367
00368
00369 };
00370
00371 UIREGISTER ( ArxDS );
00372 SHAREDPTR ( ArxDS );
00373
00374 class stateDS : public DS {
00375 private:
00377 shared_ptr<mpdf> IM;
00378
00380 shared_ptr<mpdf> OM;
00381
00382 protected:
00384 vec dt;
00386 vec xt;
00388 vec ut;
00390 int L_xt;
00391
00392 public:
00393 void getdata ( vec &dt0 ) {
00394 dt0 = dt;
00395 }
00396
00397 void getdata ( vec &dt0, const ivec &indices ) {
00398 dt0 = dt ( indices );
00399 }
00400
00401 stateDS ( const shared_ptr<mpdf> &IM0, const shared_ptr<mpdf> &OM0, int usize ) : IM ( IM0 ), OM ( OM0 ),
00402 dt ( OM0->dimension() ), xt ( IM0->dimension() ),
00403 ut ( usize ), L_xt ( 0 ) { }
00404
00405 stateDS() : L_xt ( 0 ) { }
00406
00407 virtual void step() {
00408 xt = IM->samplecond ( concat ( xt, ut ) );
00409 dt = OM->samplecond ( concat ( xt, ut ) );
00410 }
00411
00412 virtual void log_add ( logger &L ) {
00413 DS::log_add ( L );
00414 L_xt = L.add ( IM->_rv(), "true" );
00415 }
00416 virtual void logit ( logger &L ) {
00417 DS::logit ( L );
00418 L.logit ( L_xt, xt );
00419 }
00420
00450 void from_setting ( const Setting &set );
00451
00452
00453
00454 };
00455
00456 UIREGISTER ( stateDS );
00457 SHAREDPTR ( stateDS );
00458
00459 };
00460
00461 #endif // DS_H