Changeset 622 for applications/bdmtoolbox/mex/estimator.cpp
- Timestamp:
- 09/16/09 22:52:57 (15 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
applications/bdmtoolbox/mex/estimator.cpp
r611 r622 9 9 {rank="same"; "Data Source"; "Bayesian Model"} 10 10 "Data Source" -> "Bayesian Model" [label="data"]; 11 "Bayesian Model" -> "Result Logger" [label="estimated\n statistics"]; 11 "Bayesian Model" -> "Result Logger" [label="estimated\n statistics"]; 12 12 "Data Source" -> "Result Logger" [label="Simulated\n data"]; 13 13 } 14 14 \enddot 15 15 16 Here, 16 Here, 17 17 \li Data Source is an object (class DS) providing sequential data, \f$ [d_1, d_2, \ldots d_t] \f$. 18 18 \li Bayesian Model is an object (class BM) performing Bayesian filtering, … … 65 65 void mexFunction ( int n_output, mxArray *output[], int n_input, const mxArray *input[] ) { 66 66 // Check the number of inputs and output arguments 67 if (n_input<2) mexErrMsgTxt("Usage:\n"68 "result=estimator(system, estimators, experiment, logger)\n"69 " system = struct('class','datasource',...); % Estimated system\n"70 " estimators = {struct('class','estimator',...), % Estimators\n"71 " struct('class','estimator',...),...} \n"72 " === optional ==="73 " experiment = struct('ndat',10); % number of data in experiment, full length of finite datasources, 10 otherwise \n"74 " logger = struct('class','mexlogger'); % How to store results, default=mexlog, i.e. matlab structure\n\n"75 "see documentation of classes datasource, BM, and mexlogger and their offsprings in BDM.");76 67 if ( n_input<2 ) mexErrMsgTxt ( "Usage:\n" 68 "result=estimator(system, estimators, experiment, logger)\n" 69 " system = struct('class','datasource',...); % Estimated system\n" 70 " estimators = {struct('class','estimator',...), % Estimators\n" 71 " struct('class','estimator',...),...} \n" 72 " === optional ===" 73 " experiment = struct('ndat',10); % number of data in experiment, full length of finite datasources, 10 otherwise \n" 74 " logger = struct('class','mexlogger'); % How to store results, default=mexlog, i.e. matlab structure\n\n" 75 "see documentation of classes datasource, BM, and mexlogger and their offsprings in BDM." ); 76 77 77 RV::clear_all(); 78 //CONFIG 78 //CONFIG 79 79 UImxArray Cfg; 80 try {81 Cfg.addGroup(input[0],"system");82 Cfg.addList(input[1],"estimators");83 if (n_input>2){84 Cfg.addGroup(input[2],"experiment");85 }86 if (n_input>3){87 Cfg.addGroup(input[3],"logger");88 }/*else{80 try { 81 Cfg.addGroup ( input[0],"system" ); 82 Cfg.addList ( input[1],"estimators" ); 83 if ( n_input>2 ) { 84 Cfg.addGroup ( input[2],"experiment" ); 85 } 86 if ( n_input>3 ) { 87 Cfg.addGroup ( input[3],"logger" ); 88 }/*else{ 89 89 // define logger as mexlog 90 90 Setting &S=Cfg.getRoot(); … … 97 97 S["logger"]["maxlen"]=maxlen; 98 98 }*/ 99 } catch(SettingException e){it_error("error: "+string(e.getPath()));} 99 } catch ( SettingException e ) { 100 it_error ( "error: "+string ( e.getPath() ) ); 101 } 100 102 101 103 //DBG 102 Cfg.writeFile ("estimator.cfg");104 Cfg.writeFile ( "estimator.cfg" ); 103 105 104 106 #else … … 112 114 UIFile Cfg ( fname ); 113 115 #endif 114 115 shared_ptr<DS> Ds = UI::build<DS>( Cfg, "system" ); 116 Array<shared_ptr<BM> > Es; UI::get(Es,Cfg, "estimators" ); 116 117 shared_ptr<DS> Ds = UI::build<DS> ( Cfg, "system" ); 118 Array<shared_ptr<BM> > Es; 119 UI::get ( Es,Cfg, "estimators" ); 117 120 long Ndat=10; 118 if ( Cfg.exists("experiment")) {119 if ( Cfg.lookupValue ( "experiment.ndat",Ndat )) {120 bdm_assert (Ndat<=Ds->max_length(), "Data source has less data then required");121 if ( Cfg.exists ( "experiment" ) ) { 122 if ( Cfg.lookupValue ( "experiment.ndat",Ndat ) ) { 123 bdm_assert ( Ndat<=Ds->max_length(), "Data source has less data then required" ); 121 124 }; 122 125 } else { 123 if ( Ds->max_length() < inf) {126 if ( Ds->max_length() < inf ) { 124 127 Ndat=Ds->max_length(); 125 };// else Ndat=10; 128 } 129 ;// else Ndat=10; 126 130 } 127 shared_ptr<logger> L = UI::build<logger> ( Cfg, "logger",UI::optional);128 if ( !L) {129 131 shared_ptr<logger> L = UI::build<logger> ( Cfg, "logger",UI::optional ); 132 if ( !L ) { 133 #ifdef MEX 130 134 //mex logger has only from_setting constructor - we have to fill it... 131 L=new mexlog (Ndat);132 135 L=new mexlog ( Ndat ); 136 #else 133 137 L=new stdlog(); 134 138 #endif 135 139 } 136 140 137 141 Ds->log_add ( *L ); 138 142 string Ename; 139 143 Setting &S=Cfg; 140 for ( int i=0; i<Es.length(); i++){141 try {142 UI::get (Ename, S["estimators"][i], "name");143 } catch ( UIException e){144 Ename="Est"+num2str (i);144 for ( int i=0; i<Es.length(); i++ ) { 145 try { 146 UI::get ( Ename, S["estimators"][i], "name" ); 147 } catch ( UIException e ) { 148 Ename="Est"+num2str ( i ); 145 149 } 146 147 Es (i)->log_add(*L,Ename); // estimate150 151 Es ( i )->log_add ( *L,Ename ); // estimate 148 152 } 149 153 L->init(); 150 154 151 155 vec dt=zeros ( Ds->_drv()._dsize() ); //data variable 152 Array<datalink*> Dls (Es.length());153 for ( int i=0; i<Es.length(); i++){154 Dls (i)=new datalink( Es(i)->_drv(),Ds->_drv() ); //datalink between a datasource and estimator156 Array<datalink*> Dls ( Es.length() ); 157 for ( int i=0; i<Es.length(); i++ ) { 158 Dls ( i ) =new datalink ( Es ( i )->_drv(),Ds->_drv() ); //datalink between a datasource and estimator 155 159 } 156 160 157 161 for ( int tK=0;tK<Ndat;tK++ ) { 158 162 Ds->getdata ( dt ); // read data 159 163 Ds->logit ( *L ); 160 161 for ( int i=0; i<Es.length(); i++){162 Es (i)->bayes ( Dls(i)->pushdown ( dt ) ); // update estimates163 Es (i)->logit (*L);164 165 for ( int i=0; i<Es.length(); i++ ) { 166 Es ( i )->bayes ( Dls ( i )->pushdown ( dt ) ); // update estimates 167 Es ( i )->logit ( *L ); 164 168 } 165 169 L->step(); … … 171 175 172 176 #ifdef MEX 173 mexlog* mL=dynamic_cast<mexlog*> (L.get());177 mexlog* mL=dynamic_cast<mexlog*> ( L.get() ); 174 178 175 if ( mL) { // user wants output!!179 if ( mL ) { // user wants output!! 176 180 if ( n_output<1 ) mexErrMsgTxt ( "Wrong number of output variables!" ); 177 181 output[0] = mL->toCell();