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
00062 class FileDS: public MemDS {
00063
00064 public:
00065 void getdata ( vec &dt ) {
00066 dt = Data.get_col ( time );
00067 }
00068
00069 void getdata ( vec &dt, const ivec &indices ) {
00070 vec tmp = Data.get_col ( time );
00071 dt = tmp ( indices );
00072 }
00073
00075 int ndat() {
00076 return Data.cols();
00077 }
00079 void log_add ( logger &L ) {};
00081 void logit ( logger &L ) {};
00082 };
00083
00090 class ITppFileDS: public FileDS {
00091
00092 public:
00093 ITppFileDS ( const string &fname, const string &varname ) : FileDS() {
00094 it_file it ( fname );
00095 it << Name ( varname );
00096 it >> Data;
00097 time = 0;
00098
00099 };
00100
00101 ITppFileDS () : FileDS() {
00102 };
00103
00104 void from_setting ( const Setting &set );
00105
00106
00107
00108 };
00109
00110 UIREGISTER ( ITppFileDS );
00111 SHAREDPTR ( ITppFileDS );
00112
00120 class CsvFileDS: public FileDS {
00121
00122 public:
00124 CsvFileDS ( const string& fname, const string& orientation = "BY_COL" );
00125 };
00126
00127
00128
00133 class ArxDS : public DS {
00134 protected:
00136 RV Rrv;
00138 vec H;
00140 vec U;
00142 vec rgr;
00144 datalink rgrlnk;
00146 mlnorm<chmat> model;
00148 bool opt_L_theta;
00150 int L_theta;
00151 int L_R;
00152 int dt_size;
00153 public:
00154 void getdata ( vec &dt ) {
00155 dt = H;
00156 }
00157
00158 void getdata ( vec &dt, const ivec &indices ) {
00159 dt = H ( indices );
00160 }
00161
00162 void write ( vec &ut ) {
00163 U = ut;
00164 }
00165
00166 void write ( vec &ut, const ivec &indices ) {
00167 bdm_assert_debug ( ut.length() == indices.length(), "ArxDS" );
00168 set_subvector ( U, indices, ut );
00169 }
00170
00171 void step();
00172
00174 ArxDS ( ) {};
00176 void set_parameters ( const mat &Th0, const vec mu0, const chmat &sqR0 ) {
00177 model.set_parameters ( Th0, mu0, sqR0 );
00178 };
00180 void set_drv ( const RV &yrv, const RV &urv, const RV &rrv ) {
00181 Rrv = rrv;
00182 Urv = urv;
00183 dt_size = yrv._dsize() + urv._dsize();
00184
00185 RV drv = concat ( yrv, urv );
00186 Drv = drv;
00187 int td = rrv.mint();
00188 H.set_size ( drv._dsize() * ( -td + 1 ) );
00189 U.set_size ( Urv._dsize() );
00190 for ( int i = -1; i >= td; i-- ) {
00191 drv.t ( -1 );
00192 Drv.add ( drv );
00193 }
00194 rgrlnk.set_connection ( rrv, Drv );
00195
00196 dtsize = Drv._dsize();
00197 utsize = Urv._dsize();
00198 }
00200 void set_options ( const string &s ) {
00201 opt_L_theta = ( s.find ( "L_theta" ) != string::npos );
00202 };
00203 virtual void log_add ( logger &L ) {
00204
00205 L_dt = L.add ( Drv ( 0, dt_size ), "" );
00206 L_ut = L.add ( Urv, "" );
00207
00208 mat &A = model._A();
00209 mat R = model._R();
00210 if ( opt_L_theta ) {
00211 L_theta = L.add ( RV ( "{th }", vec_1 ( A.rows() * A.cols() ) ), "t" );
00212 }
00213 if ( opt_L_theta ) {
00214 L_R = L.add ( RV ( "{R }", vec_1 ( R.rows() * R.cols() ) ), "r" );
00215 }
00216 }
00217 virtual void logit ( logger &L ) {
00218
00219 L.logit ( L_dt, H.left ( dt_size ) );
00220 L.logit ( L_ut, U );
00221
00222 mat &A = model._A();
00223 mat R = model._R();
00224 if ( opt_L_theta ) {
00225 L.logit ( L_theta, vec ( A._data(), A.rows() *A.cols() ) );
00226 };
00227 if ( opt_L_theta ) {
00228 L.logit ( L_R, vec ( R._data(), R.rows() *R.rows() ) );
00229 };
00230 }
00231
00232
00264 void from_setting ( const Setting &set );
00265
00266
00267 };
00268
00269 UIREGISTER ( ArxDS );
00270 SHAREDPTR ( ArxDS );
00271
00272 class stateDS : public DS {
00273 private:
00275 shared_ptr<mpdf> IM;
00276
00278 shared_ptr<mpdf> OM;
00279
00280 protected:
00282 vec dt;
00284 vec xt;
00286 vec ut;
00288 int L_xt;
00289
00290 public:
00291 void getdata ( vec &dt0 ) {
00292 dt0 = dt;
00293 }
00294
00295 void getdata ( vec &dt0, const ivec &indices ) {
00296 dt0 = dt ( indices );
00297 }
00298
00299 stateDS ( const shared_ptr<mpdf> &IM0, const shared_ptr<mpdf> &OM0, int usize ) : IM ( IM0 ), OM ( OM0 ),
00300 dt ( OM0->dimension() ), xt ( IM0->dimension() ),
00301 ut ( usize ), L_xt(0) { }
00302
00303 stateDS() : L_xt(0) { }
00304
00305 virtual void step() {
00306 xt = IM->samplecond ( concat ( xt, ut ) );
00307 dt = OM->samplecond ( concat ( xt, ut ) );
00308 }
00309
00310 virtual void log_add ( logger &L ) {
00311 DS::log_add ( L );
00312 L_xt = L.add ( IM->_rv(), "true" );
00313 }
00314 virtual void logit ( logger &L ) {
00315 DS::logit ( L );
00316 L.logit ( L_xt, xt );
00317 }
00318
00348 void from_setting ( const Setting &set );
00349
00350
00351
00352 };
00353
00354 UIREGISTER ( stateDS );
00355 SHAREDPTR ( stateDS );
00356
00357 };
00358
00359 #endif // DS_H