[263] | 1 | |
---|
[384] | 2 | #include "datasources.h" |
---|
[357] | 3 | |
---|
[254] | 4 | using namespace bdm; |
---|
[18] | 5 | |
---|
[676] | 6 | void MemDS::getdata ( vec &dt ) const { |
---|
[19] | 7 | int i; |
---|
[263] | 8 | |
---|
[565] | 9 | bdm_assert_debug ( dt.length() == rowid.length(), "MemDS:getdata incompatible dt" ); |
---|
[477] | 10 | for ( i = 0; i < rowid.length(); i++ ) { |
---|
[609] | 11 | dt ( i ) = Data ( rowid ( i ), time ); |
---|
[18] | 12 | } |
---|
| 13 | } |
---|
| 14 | |
---|
[477] | 15 | void MemDS::getdata ( vec &dt, const ivec &indeces ) { |
---|
| 16 | int j, i; |
---|
[565] | 17 | bdm_assert_debug ( dt.length() == indeces.length(), "MemDS:getdata incompatible dt" ); |
---|
[477] | 18 | for ( i = 0; i < indeces.length(); i++ ) { |
---|
[263] | 19 | j = indeces ( i ); |
---|
[737] | 20 | dt ( i ) = Data ( rowid ( j ), time ); |
---|
[18] | 21 | } |
---|
| 22 | } |
---|
| 23 | |
---|
| 24 | void MemDS::step() { |
---|
[477] | 25 | if ( time < Data.cols() ) { |
---|
| 26 | time++; |
---|
| 27 | } |
---|
[18] | 28 | } |
---|
| 29 | |
---|
[737] | 30 | void MemDS::set_drv ( const RV &drv, const RV &urv ) { |
---|
[565] | 31 | bdm_assert_debug ( drv._dsize() == rowid.length(), "MemDS::set_rvs incompatible drv" ); |
---|
| 32 | bdm_assert_debug ( urv._dsize() == 0, "MemDS does not support urv." ); |
---|
[263] | 33 | |
---|
[737] | 34 | DS::set_drv ( drv, urv ); |
---|
[18] | 35 | } |
---|
| 36 | |
---|
[737] | 37 | MemDS::MemDS ( mat &Dat, ivec &rowid0 ) : rowid ( rowid0 ) { |
---|
[565] | 38 | bdm_assert_debug ( max ( rowid ) <= Dat.rows(), "MemDS rowid is too high for given Dat." ); |
---|
[263] | 39 | |
---|
[609] | 40 | time = 0; |
---|
[18] | 41 | Data = Dat; |
---|
[19] | 42 | } |
---|
[263] | 43 | |
---|
[892] | 44 | void ITppFileDS::from_setting ( const Setting &set ) { |
---|
| 45 | shared_ptr<RV> rvtmp = UI::build<RV> ( set, "rv" , UI::compulsory ); |
---|
| 46 | |
---|
| 47 | it_file it ( set["filename"] ); |
---|
| 48 | it << Name ( set["varname"] ); |
---|
| 49 | it >> Data; |
---|
| 50 | time = 0; |
---|
| 51 | //rowid and delays are ignored |
---|
| 52 | rowid = linspace ( 0, Data.rows() - 1 ); |
---|
| 53 | set_drv ( *rvtmp, RV() ); |
---|
| 54 | } |
---|
| 55 | |
---|
[738] | 56 | void PdfDS::step() { |
---|
| 57 | yt2rgr.store_data ( yt ); // y is now history |
---|
| 58 | ut2rgr.filldown ( ut, rgr ); |
---|
| 59 | yt2rgr.filldown ( yt, rgr ); |
---|
| 60 | yt = ipdf->samplecond ( rgr ); |
---|
| 61 | ut2rgr.store_data ( ut ); //u is now history |
---|
| 62 | } |
---|
| 63 | |
---|
| 64 | void PdfDS::getdata ( vec &dt_out ) const { |
---|
[895] | 65 | bdm_assert_debug ( dt_out.length() >= dtsize, "Short output vector" ); |
---|
[738] | 66 | dt_out.set_subvector ( 0, yt ); |
---|
[895] | 67 | dt_out.set_subvector ( yt.length(), ut ); |
---|
[738] | 68 | } |
---|
| 69 | |
---|
| 70 | void StateDS::step() { |
---|
| 71 | vec imc ( IM->dimensionc() ); |
---|
| 72 | imc.set_subvector ( 0, xt ); |
---|
| 73 | u2imc.filldown ( ut, imc ); |
---|
| 74 | xt = IM->samplecond ( imc ); |
---|
| 75 | |
---|
| 76 | vec omc ( OM->dimensionc() ); |
---|
| 77 | omc.set_subvector ( 0, xt ); |
---|
| 78 | u2omc.filldown ( ut, omc ); |
---|
| 79 | vec yt; |
---|
| 80 | yt = OM->samplecond ( omc ); |
---|
| 81 | //fill all data |
---|
| 82 | dt.set_subvector ( 0, yt ); |
---|
| 83 | dt.set_subvector ( yt.length(), xt ); |
---|
[895] | 84 | dt.set_subvector ( yt.length()+xt.length(), ut ); |
---|
[738] | 85 | } |
---|
| 86 | |
---|
[695] | 87 | void StateDS::from_setting ( const Setting &set ) { |
---|
[693] | 88 | IM = UI::build<pdf> ( set, "IM", UI::compulsory ); |
---|
| 89 | OM = UI::build<pdf> ( set, "OM", UI::compulsory ); |
---|
[357] | 90 | |
---|
[695] | 91 | //todo test if IM->rvc contains IM->rv |
---|
| 92 | //todo test if OM->rvc contains IM->rv |
---|
[737] | 93 | |
---|
| 94 | UI::get ( xt, set, "x0", UI::optional ); |
---|
| 95 | |
---|
[695] | 96 | } |
---|
[477] | 97 | |
---|
[737] | 98 | void StateDS::validate() { |
---|
[795] | 99 | DS::validate(); |
---|
| 100 | |
---|
[895] | 101 | RV Yrv = concat ( OM->_rv() , IM->_rv() ); // export also true state |
---|
| 102 | int ytsize = Yrv._dsize(); |
---|
[737] | 103 | |
---|
| 104 | RV tmp = concat ( OM->_rvc(), IM->_rvc() ); // what i not in rvc |
---|
| 105 | Urv = tmp.subt ( Yrv ); // remove dt,xt and |
---|
| 106 | Urv = Urv.subt ( Yrv.copy_t ( -1 ) ); // remove dt,xt and |
---|
| 107 | utsize = Urv._dsize(); |
---|
| 108 | |
---|
| 109 | set_drv ( Yrv, Urv ); |
---|
[695] | 110 | dtsize = utsize + ytsize; |
---|
[737] | 111 | |
---|
[695] | 112 | dt.set_length ( dtsize ); |
---|
[737] | 113 | if ( xt.length() != IM->dimension() ) { |
---|
| 114 | xt = zeros ( IM->dimension() ); |
---|
[695] | 115 | } |
---|
| 116 | ut.set_length ( Urv._dsize() ); |
---|
[737] | 117 | |
---|
[695] | 118 | //create data links |
---|
[737] | 119 | u2imc.set_connection ( IM->_rvc(), Urv ); |
---|
| 120 | u2omc.set_connection ( OM->_rvc(), Urv ); |
---|
[357] | 121 | } |
---|