00001 
00013 #ifndef DS_H
00014 #define DS_H
00015 
00016 
00017 #include "libBM.h"
00018 #include "libEF.h"
00019 #include "../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         void write ( vec &ut ) {it_error ( "MemDS::write is not supported" );}
00045         void write ( vec &ut,ivec &indices ) {it_error ( "MemDS::write is not supported" );}
00046         void step();
00048         MemDS () {};
00049         MemDS ( mat &Dat, ivec &rowid0, ivec &delays0 );
00050 };
00051 
00055 class FileDS: public MemDS {
00056 
00057 public:
00058         void getdata ( vec &dt ) {
00059                 it_assert_debug ( dt.length() ==Data.rows(),"" );
00060                 dt = Data.get_col(time);
00061         };
00062         void getdata ( vec &dt, const ivec &indeces ){
00063                 it_assert_debug ( dt.length() ==indeces.length(),"" );
00064                 vec tmp(indeces.length());
00065                 tmp = Data.get_col(time);
00066                 dt = tmp(indeces);
00067         };
00069         int ndat(){return Data.cols();}
00071         void log_add ( logger &L ) {};
00073         void logit ( logger &L ) {};
00074 };
00075 
00082 class ITppFileDS: public FileDS {
00083 
00084 public:
00085         ITppFileDS ( const string &fname, const string &varname ) :FileDS() {
00086                 it_file it ( fname );
00087                 it << Name ( varname ); 
00088                 it >> Data;
00089                 time = 0;
00090                 
00091         };
00092 
00093         ITppFileDS () :FileDS() {
00094         };
00095 
00096         void from_setting( const Setting &root );
00097 
00098         
00099 
00100 };
00101 
00102 UIREGISTER(ITppFileDS);
00103 
00111 class CsvFileDS: public FileDS {
00112 
00113 public:
00115         CsvFileDS ( const string& fname, const string& orientation = "BY_COL" );
00116 };
00117 
00118 
00119 
00124 class ArxDS : public DS {
00125 protected:
00127         RV Rrv;
00129         vec H;
00131         vec U;
00133         vec rgr;
00135         datalink rgrlnk;
00137         mlnorm<chmat> model;
00139         bool opt_L_theta;
00141         int L_theta;
00142         int L_R;
00143         int dt_size;
00144 public:
00145         void getdata ( vec &dt ) {
00146                 
00147                 dt=H;
00148         };
00149         void getdata ( vec &dt, const ivec &indices ) {
00150                 it_assert_debug ( dt.length() ==indices.length(),"ArxDS" );
00151                 dt=H ( indices );
00152         };
00153         void write ( vec &ut ) {
00154                 
00155                 U=ut;
00156         };
00157         void write ( vec &ut, const ivec &indices ) {
00158                 it_assert_debug ( ut.length() ==indices.length(),"ArxDS" );
00159                 set_subvector ( U, indices,ut );
00160         };
00161         void step();
00163         ArxDS ( ) {};
00165         void set_parameters ( const mat &Th0, const vec mu0, const chmat &sqR0 )
00166         { model.set_parameters ( Th0, mu0, sqR0 );};
00168         void set_drv ( RV &yrv, RV &urv, RV &rrv ) {
00169                 Rrv = rrv;
00170                 Urv = urv;
00171                 dt_size = yrv._dsize() +urv._dsize();
00172 
00173                 RV drv = concat ( yrv,urv );
00174                 Drv = drv;
00175                 int td = rrv.mint();
00176                 H.set_size ( drv._dsize() * ( -td+1 ) );
00177                 U.set_size ( Urv._dsize() );
00178                 for ( int i=-1;i>=td;i-- ) {
00179                         drv.t ( -1 );
00180                         Drv.add ( drv ); 
00181                 }
00182                 rgrlnk.set_connection ( rrv,Drv );
00183 
00184                 dtsize = Drv._dsize();
00185                 utsize = Urv._dsize();
00186         }
00188         void set_options ( const string &s ) {
00189                 opt_L_theta= ( s.find ( "L_theta" ) !=string::npos );
00190         };
00191         virtual void log_add ( logger &L ) {
00192                 
00193                 L_dt=L.add ( Drv ( 0,dt_size ),"" );
00194                 L_ut=L.add ( Urv,"" );
00195 
00196                 mat &A =model._A();
00197                 mat R =model._R();
00198                 if ( opt_L_theta ) {L_theta=L.add ( RV ( "{th }", vec_1 ( A.rows() *A.cols() ) ),"t" );}
00199                 if ( opt_L_theta ) {L_R=L.add ( RV ( "{R }", vec_1 ( R.rows() *R.cols() ) ),"r" );}
00200         }
00201         virtual void logit ( logger &L ) {
00202                 
00203                 L.logit ( L_dt, H.left ( dt_size ) );
00204                 L.logit ( L_ut, U );
00205 
00206                 mat &A =model._A();
00207                 mat R =model._R();
00208                 if ( opt_L_theta ) {L.logit ( L_theta,vec ( A._data(), A.rows() *A.cols() ) );};
00209                 if ( opt_L_theta ) {L.logit ( L_R, vec ( R._data(), R.rows() *R.rows() ) );};
00210         }
00211 
00212         
00244         void from_setting( const Setting &root );
00245 
00246         
00247 };
00248 
00249 UIREGISTER( ArxDS );
00250 
00251 class stateDS : public DS {
00252 protected:
00254         mpdf* IM;
00256         mpdf* OM;
00258         vec dt;
00260         vec xt;
00262         vec ut;
00264         int L_xt;
00265 public:
00266         void getdata ( vec &dt0 ) {dt0=dt;}
00267         void getdata ( vec &dt0, const ivec &indeces ) {dt0=dt ( indeces );}
00268 
00269         stateDS ( mpdf* IM0, mpdf* OM0, int usize ) :DS ( ),IM ( IM0 ),OM ( OM0 ),
00270                         dt ( OM0->dimension() ), xt ( IM0->dimension() ), ut ( usize ) {}
00271 
00272         stateDS(){}
00273 
00274         ~stateDS() {delete IM; delete OM;}
00275         virtual void step() {
00276                 xt=IM->samplecond ( concat ( xt,ut ) );
00277                 dt=OM->samplecond ( concat ( xt,ut ) );
00278         };
00279 
00280         virtual void log_add ( logger &L ) {
00281                 DS::log_add ( L );
00282                 L_xt=L.add ( IM->_rv(),"true" );
00283         }
00284         virtual void logit ( logger &L ) {
00285                 DS::logit ( L );
00286                 L.logit ( L_xt,xt );
00287         }
00288 
00318         void from_setting( const Setting &root );
00319 
00320         
00321 
00322 };
00323 
00324 UIREGISTER(stateDS);
00325 
00326 }; 
00327 
00328 #endif // DS_H