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