00001 
00013 #ifndef DS_H
00014 #define DS_H
00015 
00016 
00017 #include "libBM.h"
00018 #include "libEF.h"
00019 
00020 
00021 namespace bdm {
00029 class MemDS : public DS {
00031         mat Data;
00033         int time;
00035         ivec rowid;
00037         ivec delays;
00038 
00039 public:
00040         void getdata ( vec &dt );
00041         void getdata ( vec &dt, const ivec &indeces );
00042         void set_rvs ( RV &drv, RV &urv );
00043         void write ( vec &ut ) {it_error ( "MemDS::write is not supported" );}
00044         void write ( vec &ut,ivec &indices ) {it_error ( "MemDS::write is not supported" );}
00045         void step();
00047         MemDS ( mat &Dat, ivec &rowid, ivec &delays );
00048 };
00049 
00054 class ArxDS : public DS {
00055 protected:
00057         RV Rrv;
00059         vec H;
00061         vec U;
00063         vec rgr;
00065         datalink rgrlnk;
00067         mlnorm<chmat> model;
00069         bool opt_L_theta;
00071         int L_theta;
00072         int L_R;
00073         int dt_size;
00074 public:
00075         void getdata ( vec &dt ) {
00076                 
00077                 dt=H;
00078         };
00079         void getdata ( vec &dt, const ivec &indices ) {
00080                 it_assert_debug ( dt.length() ==indices.length(),"ArxDS" );
00081                 dt=H ( indices );
00082         };
00083         void write ( vec &ut ) {
00084                 
00085                 U=ut;
00086         };
00087         void write ( vec &ut, const ivec &indices ) {
00088                 it_assert_debug ( ut.length() ==indices.length(),"ArxDS" );
00089                 set_subvector ( U, indices,ut );
00090         };
00091         void step();
00093         ArxDS ( ) {};
00095         void set_parameters ( const mat &Th0, const vec mu0, const chmat &sqR0 )
00096         { model.set_parameters ( Th0, mu0, sqR0 );};
00098         void set_drv(RV &yrv, RV &urv, RV &rrv){
00099                 Rrv = rrv;
00100                 Urv = urv;
00101                 dt_size = yrv._dsize()+urv._dsize();
00102                 
00103                 RV drv = concat(yrv,urv);
00104                 Drv = drv;
00105                 int td = rrv.mint();
00106                 H.set_size(drv._dsize()*(-td+1));
00107                 U.set_size(Urv._dsize());
00108                 for (int i=-1;i>=td;i--){
00109                         drv.t(-1);
00110                         Drv.add(drv); 
00111                 }
00112                 rgrlnk.set_connection(rrv,Drv);
00113                 
00114                 dtsize = Drv._dsize();
00115                 utsize = Urv._dsize();
00116         }
00118         void set_options ( const string &s ) {
00119                 opt_L_theta= ( s.find ( "L_theta" ) !=string::npos );
00120         };
00121         virtual void log_add ( logger &L ) {
00122                 
00123                 L_dt=L.add ( Drv(0,dt_size),"" );
00124                 L_ut=L.add ( Urv,"" );
00125 
00126                 mat &A =model._A();
00127                 mat R =model._R();
00128                 if ( opt_L_theta ) {L_theta=L.add ( RV ( "{th }", vec_1 ( A.rows() *A.cols() ) ),"t" );}
00129                 if ( opt_L_theta ) {L_R=L.add ( RV ( "{R }", vec_1 ( R.rows() *R.cols() ) ),"r" );}
00130         }
00131         virtual void logit ( logger &L ) {
00132                 
00133                 L.logit( L_dt, H.left(dt_size));
00134                 L.logit(L_ut, U);
00135                 
00136                 mat &A =model._A();
00137                 mat R =model._R();
00138                 if ( opt_L_theta ) {L.logit ( L_theta,vec ( A._data(), A.rows() *A.cols() ) );};
00139                 if ( opt_L_theta ) {L.logit ( L_R, vec ( R._data(), R.rows() *R.rows() ) );};
00140         }
00141 
00142 };
00143 
00144 class stateDS : public DS {
00145 protected:
00147         mpdf* IM;
00149         mpdf* OM;
00151         vec dt;
00153         vec xt;
00155         vec ut;
00157         int L_xt;
00158 public:
00159         void getdata ( vec &dt0 ) {dt0=dt;}
00160         void getdata ( vec &dt0, const ivec &indeces ) {dt0=dt ( indeces );}
00161 
00162         stateDS ( mpdf* IM0, mpdf* OM0, int usize ) :DS ( ),IM ( IM0 ),OM ( OM0 ),
00163                         dt ( OM0->dimension() ), xt ( IM0->dimension() ), ut ( usize ) {}
00164         ~stateDS() {delete IM; delete OM;}
00165         virtual void step() {
00166                 xt=IM->samplecond ( concat ( xt,ut ) );
00167                 dt=OM->samplecond ( concat ( xt,ut ) );
00168         };
00169 
00170         virtual void log_add ( logger &L ) {
00171                 DS::log_add ( L );
00172                 L_xt=L.add ( IM->_rv(),"true" );
00173         }
00174         virtual void logit ( logger &L ) {
00175                 DS::logit ( L );
00176                 L.logit ( L_xt,xt );
00177         }
00178 
00179 };
00180 
00181 }; 
00182 
00183 #endif // DS_H