00001 #ifndef MXDS_H
00002 #define MXDS_H
00003 
00004 
00005 #include "../bdm/bdmerror.h"
00006 #include "../bdm/base/datasources.h"
00007 #include "mex_parser.h"
00008 
00009 namespace bdm {
00017 class mxArrayDS : public MemDS {
00018         public:
00020         mxArrayDS ():MemDS() {};
00021 
00035         void from_setting ( const Setting &set ) {
00036                 Data = mxArray2mat ( mexGetVariable ( "base", set["varname"] ) );
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044                 
00045                 rowid = linspace(0,Data.rows()-1);
00046                 dtsize=rowid.length();
00047                 utsize=0;
00048                 
00049                 shared_ptr<RV> r = UI::build<RV> ( set, "rv", UI::optional );
00050                 RV ru = RV();
00051                 if (r){
00052                         set_rvs ( *r, ru );
00053                 } else {
00054                         RV def((const char*)set["varname"],Data.rows());
00055                         set_rvs(def, ru);
00056                 }
00057         }
00058 
00059 
00060         
00061 };
00062 
00063 UIREGISTER ( mxArrayDS );
00064 SHAREDPTR ( mxArrayDS );
00065 
00074 class mexDS : public DS {
00075         protected:
00077                 string step_name;
00079                 string input_name;
00081                 vec dt;
00083                 vec ut;
00084         public:
00086         mexDS ():DS() {};
00087 
00103         void from_setting ( const Setting &set ) {
00104                 UI::get(step_name, set, "step_name", UI::compulsory);
00105                 UI::get(input_name, set, "input_name", UI::compulsory);
00106                 
00107                 shared_ptr<RV> ry = UI::build<RV> ( set, "rv_out", UI::compulsory );
00108                 shared_ptr<RV> ru = UI::build<RV> ( set, "rv_in", UI::compulsory);
00109 
00110                 dtsize=ry->_dsize();
00111                 utsize=ru->_dsize();
00112 
00113                 set_drv(*ry, *ru);
00114         }
00115         
00116         void step() {
00117                 mxArray* tmp;
00118                 mxArray* tmp2;
00119                 
00120                 mxArray* mxinp= mexGetVariable ( "global", input_name.c_str()) ;
00121                 vec2mxArray(ut, mxinp);
00122                 
00123                 mexCallMATLAB(1, &tmp, 0, (mxArray **) &tmp2, step_name.c_str());
00124                 
00125                 dt=mxArray2vec(tmp);
00126         }
00127         void write(vec &ut0){ ut=ut0;}
00128         void getdata(vec &dt_out){dt_out = dt;  }
00129 
00130 
00131         
00132 };
00133 
00134 UIREGISTER ( mexDS );
00135 SHAREDPTR ( mexDS );
00136 
00137 }
00138 #endif //MXDS_H