Changeset 622 for applications/bdmtoolbox/mex/simulator.cpp
- Timestamp:
- 09/16/09 22:52:57 (15 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
applications/bdmtoolbox/mex/simulator.cpp
r617 r622 12 12 \enddot 13 13 14 Here, 14 Here, 15 15 \li Data Source is an object (class DS) providing sequential data, \f$ [d_1, d_2, \ldots d_t] \f$. 16 16 \li Result Logger is an object (class logger) dedicated to storing important data from the experiment. … … 56 56 void mexFunction ( int n_output, mxArray *output[], int n_input, const mxArray *input[] ) { 57 57 // Check the number of inputs and output arguments 58 if (n_input<1) mexErrMsgTxt("Usage:\n"59 "result=simulator(system, experiment, logger)\n"60 " system = struct('class','datasource',...); % Estimated system\n"61 " === optional ==="62 " experiment = struct('ndat',10); % number of data in experiment, full length of finite datasources, 10 otherwise \n"63 " logger = struct('class','mexlogger'); % How to store results, default=mexlog, i.e. matlab structure\n\n"64 "see documentation of classes datasource and mexlogger and their offsprings in BDM.");65 58 if ( n_input<1 ) mexErrMsgTxt ( "Usage:\n" 59 "result=simulator(system, experiment, logger)\n" 60 " system = struct('class','datasource',...); % Estimated system\n" 61 " === optional ===" 62 " experiment = struct('ndat',10); % number of data in experiment, full length of finite datasources, 10 otherwise \n" 63 " logger = struct('class','mexlogger'); % How to store results, default=mexlog, i.e. matlab structure\n\n" 64 "see documentation of classes datasource and mexlogger and their offsprings in BDM." ); 65 66 66 RV::clear_all(); 67 //CONFIG 67 //CONFIG 68 68 UImxArray Cfg; 69 try {70 Cfg.addGroup(input[0],"system");71 if (n_input>2){72 Cfg.addGroup(input[1],"experiment");73 }74 if (n_input>3){75 Cfg.addGroup(input[2],"logger");76 }/*else{69 try { 70 Cfg.addGroup ( input[0],"system" ); 71 if ( n_input>2 ) { 72 Cfg.addGroup ( input[1],"experiment" ); 73 } 74 if ( n_input>3 ) { 75 Cfg.addGroup ( input[2],"logger" ); 76 }/*else{ 77 77 // define logger as mexlog 78 78 Setting &S=Cfg.getRoot(); … … 85 85 S["logger"]["maxlen"]=maxlen; 86 86 }*/ 87 } catch(SettingException e){it_error("error: "+string(e.getPath()));} 87 } catch ( SettingException e ) { 88 it_error ( "error: "+string ( e.getPath() ) ); 89 } 88 90 89 91 //DBG 90 Cfg.writeFile ("simulator.cfg");92 Cfg.writeFile ( "simulator.cfg" ); 91 93 92 94 #else … … 100 102 UIFile Cfg ( fname ); 101 103 #endif 102 103 shared_ptr<DS> Ds = UI::build<DS> ( Cfg, "system" );104 105 shared_ptr<DS> Ds = UI::build<DS> ( Cfg, "system" ); 104 106 long Ndat=10; 105 if ( Cfg.exists("experiment")) {106 if ( Cfg.lookupValue ( "experiment.ndat",Ndat )) {107 bdm_assert (Ndat<=Ds->max_length(), "Data source has less data then required");107 if ( Cfg.exists ( "experiment" ) ) { 108 if ( Cfg.lookupValue ( "experiment.ndat",Ndat ) ) { 109 bdm_assert ( Ndat<=Ds->max_length(), "Data source has less data then required" ); 108 110 }; 109 111 } else { 110 if ( Ds->max_length() < std::numeric_limits< int >::max()) {112 if ( Ds->max_length() < std::numeric_limits< int >::max() ) { 111 113 Ndat=Ds->max_length(); 112 };// else Ndat=10; 114 } 115 ;// else Ndat=10; 113 116 } 114 shared_ptr<logger> L = UI::build<logger> ( Cfg, "logger",UI::optional);115 if ( !L) {116 117 shared_ptr<logger> L = UI::build<logger> ( Cfg, "logger",UI::optional ); 118 if ( !L ) { 119 #ifdef MEX 117 120 //mex logger has only from_setting constructor - we have to fill it... 118 L=new mexlog (Ndat);119 121 L=new mexlog ( Ndat ); 122 #else 120 123 L=new stdlog(); 121 124 #endif 122 125 } 123 126 124 127 Ds->log_add ( *L ); 125 128 L->init(); … … 130 133 Ds->getdata ( dt ); // read data 131 134 Ds->logit ( *L ); 132 135 133 136 L->step(); 134 137 Ds->step(); // simulator step … … 139 142 140 143 #ifdef MEX 141 mexlog* mL=dynamic_cast<mexlog*> (L.get());144 mexlog* mL=dynamic_cast<mexlog*> ( L.get() ); 142 145 143 if ( mL) { // user wants output!!146 if ( mL ) { // user wants output!! 144 147 if ( n_output<1 ) mexErrMsgTxt ( "Wrong number of output variables!" ); 145 148 output[0] = mL->toCell();