[593] | 1 | #ifndef MXDS_H |
---|
| 2 | #define MXDS_H |
---|
| 3 | |
---|
| 4 | |
---|
[565] | 5 | #include "../bdm/bdmerror.h" |
---|
[593] | 6 | #include "../bdm/base/datasources.h" |
---|
[529] | 7 | #include "mex_parser.h" |
---|
[477] | 8 | |
---|
[377] | 9 | namespace bdm { |
---|
| 10 | /*! |
---|
| 11 | * \brief Memory storage of off-line data column-wise |
---|
| 12 | |
---|
| 13 | The data are stored in an internal matrix \c Data . Each column of Data corresponds to one discrete time observation \f$t\f$. Access to this matrix is via indices \c rowid and \c delays. |
---|
| 14 | |
---|
| 15 | The data can be loaded from a file. |
---|
| 16 | */ |
---|
[593] | 17 | class mxArrayDS : public MemDS { |
---|
| 18 | public: |
---|
[477] | 19 | //!Default constructor |
---|
[593] | 20 | mxArrayDS ():MemDS() {}; |
---|
[377] | 21 | |
---|
[477] | 22 | /*! \brief Create memory data source from mxArray |
---|
| 23 | |
---|
| 24 | \code |
---|
| 25 | system={ |
---|
| 26 | type="mexDS"; |
---|
[593] | 27 | varname=""; // name of workspace variable |
---|
| 28 | row_rv = {class='RV',...} // definition of |
---|
[477] | 29 | }; |
---|
| 30 | \endcode |
---|
[377] | 31 | |
---|
[529] | 32 | MemDS with the above fields will be created; |
---|
| 33 | |
---|
| 34 | */ |
---|
| 35 | void from_setting ( const Setting &set ) { |
---|
| 36 | Data = mxArray2mat ( mexGetVariable ( "base", set["varname"] ) ); |
---|
[593] | 37 | /* UI::get ( rowid, set, "rids" , UI::compulsory ); |
---|
[565] | 38 | bdm_assert_debug ( max ( rowid ) <= Data.rows(), "MemDS rowid is too high for given Dat." ); |
---|
[529] | 39 | |
---|
| 40 | UI::get ( delays, set, "tds", UI::compulsory ); |
---|
| 41 | time = max ( delays ); |
---|
[565] | 42 | bdm_assert_debug ( time < Data.cols(), "MemDS delays are too high." ); |
---|
[593] | 43 | */ |
---|
| 44 | //set MemDS |
---|
| 45 | rowid = linspace(0,Data.rows()-1); |
---|
| 46 | dtsize=rowid.length(); |
---|
[676] | 47 | ytsize=rowid.length(); |
---|
[593] | 48 | utsize=0; |
---|
| 49 | |
---|
| 50 | shared_ptr<RV> r = UI::build<RV> ( set, "rv", UI::optional ); |
---|
[529] | 51 | RV ru = RV(); |
---|
[593] | 52 | if (r){ |
---|
[660] | 53 | set_drv ( *r, ru ); |
---|
[593] | 54 | } else { |
---|
| 55 | RV def((const char*)set["varname"],Data.rows()); |
---|
[660] | 56 | set_drv(def, ru); |
---|
[593] | 57 | } |
---|
[529] | 58 | } |
---|
| 59 | |
---|
| 60 | |
---|
| 61 | // TODO dodelat void to_setting( Setting &set ) const; |
---|
| 62 | }; |
---|
| 63 | |
---|
[593] | 64 | UIREGISTER ( mxArrayDS ); |
---|
| 65 | SHAREDPTR ( mxArrayDS ); |
---|
[377] | 66 | |
---|
[596] | 67 | /*! |
---|
| 68 | * \brief Matlab wrapper for DS mapping functions step() to a matlab function |
---|
| 69 | |
---|
| 70 | The identifier of matlab function is stored in attribute \c name. |
---|
| 71 | This identifier defines: |
---|
| 72 | \li function to call to do a step(): name_step.m |
---|
| 73 | \li workspace variable to write input to: name_input |
---|
| 74 | */ |
---|
| 75 | class mexDS : public DS { |
---|
| 76 | protected: |
---|
| 77 | //! identifier of matlab function |
---|
| 78 | string step_name; |
---|
| 79 | //! identifier of matlab input variabel |
---|
| 80 | string input_name; |
---|
| 81 | //! cache of results from name_step |
---|
| 82 | vec dt; |
---|
| 83 | //! cache of inputs |
---|
| 84 | vec ut; |
---|
| 85 | public: |
---|
| 86 | //!Default constructor |
---|
| 87 | mexDS ():DS() {}; |
---|
| 88 | |
---|
| 89 | /*! \brief Create memory data source from mxArray |
---|
| 90 | |
---|
| 91 | \code |
---|
| 92 | system={ |
---|
| 93 | type="mexDS"; |
---|
| 94 | step_name=""; // name of function to call |
---|
| 95 | input_name=""; // name of workspace variable where inputs are written |
---|
| 96 | rv_out = {class='RV',...} // identification of outputs |
---|
| 97 | rv_in = {class='RV',...} // identification of inputs |
---|
| 98 | }; |
---|
| 99 | \endcode |
---|
| 100 | |
---|
| 101 | MemDS with the above fields will be created; |
---|
| 102 | |
---|
| 103 | */ |
---|
| 104 | void from_setting ( const Setting &set ) { |
---|
| 105 | UI::get(step_name, set, "step_name", UI::compulsory); |
---|
| 106 | UI::get(input_name, set, "input_name", UI::compulsory); |
---|
| 107 | |
---|
| 108 | shared_ptr<RV> ry = UI::build<RV> ( set, "rv_out", UI::compulsory ); |
---|
| 109 | shared_ptr<RV> ru = UI::build<RV> ( set, "rv_in", UI::compulsory); |
---|
| 110 | |
---|
| 111 | dtsize=ry->_dsize(); |
---|
| 112 | utsize=ru->_dsize(); |
---|
| 113 | |
---|
| 114 | set_drv(*ry, *ru); |
---|
| 115 | } |
---|
| 116 | |
---|
| 117 | void step() { |
---|
| 118 | mxArray* tmp; |
---|
| 119 | mxArray* tmp2; |
---|
| 120 | // write inputs to variable input_name |
---|
| 121 | mxArray* mxinp= mexGetVariable ( "global", input_name.c_str()) ; |
---|
| 122 | vec2mxArray(ut, mxinp); |
---|
| 123 | // call function step_name |
---|
| 124 | mexCallMATLAB(1, &tmp, 0, (mxArray **) &tmp2, step_name.c_str()); |
---|
| 125 | // save its results |
---|
| 126 | dt=mxArray2vec(tmp); |
---|
| 127 | } |
---|
[660] | 128 | void write(const vec &ut0){ ut=ut0;} |
---|
[676] | 129 | void getdata(vec &dt_out) const {dt_out = dt; } |
---|
[596] | 130 | |
---|
| 131 | |
---|
| 132 | // TODO dodelat void to_setting( Setting &set ) const; |
---|
| 133 | }; |
---|
| 134 | |
---|
| 135 | UIREGISTER ( mexDS ); |
---|
| 136 | SHAREDPTR ( mexDS ); |
---|
| 137 | |
---|
[529] | 138 | } |
---|
[593] | 139 | #endif //MXDS_H |
---|