root/applications/bdmtoolbox/mex/simulator.cpp @ 801

Revision 801, 4.4 kB (checked in by smidl, 14 years ago)

disable debug write to disc

  • Property svn:eol-style set to native
RevLine 
[617]1/*!
2\file
3\brief Scenario Simulator
4
5The task of simulation is defined here as follows:
6\dot
7digraph estimation{
8        node [shape=box];
9        {rank="same"; "Data Source"; "Result Logger"}
10        "Data Source" -> "Result Logger" [label="Simulated\n data"];
11}
12\enddot
13
[622]14Here,
[617]15\li Data Source is an object (class DS) providing sequential data, \f$ [d_1, d_2, \ldots d_t] \f$.
16\li Result Logger is an object (class logger) dedicated to storing important data from the experiment.
17
18Naming of the data provided by the datasource is done via mechanism of random variables (class RV).
19
20\section  cmd Command-line usage
21Execute command:
22\code
23$> simulator config_file.cfg
24\endcode
25
26Full description of the experiment is in the file config_file.cfg which is expected to have the following structure:
27\code
28system = {type = "DS_offspring", ...};      // definition of a data source
29logger = {type = "logger_type",...};        // definition of a logger
30experiment = {ndat = 11000; };              // definition of number of data records
31\endcode
32
33\section ex Matlab usage
34Execute command:
35\code
36>> simulator(system,experiment,logger);
37\endcode
38Here, the only accepted field of experiment is \c experiment.ndat. If loger is not specified, the mexlogger is used, i.e. the data are stored as matlab structure with field names given by RV.names.
39 */
40
[700]41#include <estim/arx.h>
42#include <stat/emix.h>
43#include <base/datasources.h>
44#include <base/loggers.h>
[617]45
46//#include "mex_datasource.h"
47
48using namespace bdm;
49
50#ifdef MEX
51#include <itpp/itmex.h>
52#include "mex/mex_BM.h"
53#include "mex/mex_logger.h"
54#include "mex/mex_datasource.h"
[797]55#include "mex/mex_function.h"
[617]56
57void mexFunction ( int n_output, mxArray *output[], int n_input, const mxArray *input[] ) {
58        // Check the number of inputs and output arguments
[622]59        if ( n_input<1 ) mexErrMsgTxt ( "Usage:\n"
60                                                "result=simulator(system,  experiment, logger)\n"
61                                                "  system     = struct('class','datasource',...);  % Estimated system\n"
62                                                "  === optional ==="
63                                                "  experiment = struct('ndat',10);                 % number of data in experiment, full length of finite datasources, 10 otherwise \n"
64                                                "  logger     = struct('class','mexlogger');       % How to store results, default=mexlog, i.e. matlab structure\n\n"
65                                                "see documentation of classes datasource and mexlogger and their offsprings in BDM." );
66
[617]67        RV::clear_all();
[622]68        //CONFIG
[617]69        UImxArray Cfg;
[622]70        try {
71                Cfg.addGroup ( input[0],"system" );
[627]72                if ( n_input>1 ) {
[622]73                        Cfg.addGroup ( input[1],"experiment" );
74                }
[627]75                if ( n_input>2 ) {
[622]76                        Cfg.addGroup ( input[2],"logger" );
77                }/*else{
[617]78                // define logger as mexlog
79                Setting &S=Cfg.getRoot();
80                S.add("logger",Setting::TypeGroup);
81                S["logger"].add("class",Setting::TypeString);
82                S["logger"]["class"]="mexlog";
83                S["logger"].add("maxlen",Setting::TypeInt);
84                int maxlen;
85                S["experiment"].lookupValue("ndat",maxlen);
86                S["logger"]["maxlen"]=maxlen;
87        }*/
[622]88        } catch ( SettingException e ) {
89                it_error ( "error: "+string ( e.getPath() ) );
90        }
[617]91
92        //DBG
[801]93//      Cfg.writeFile ( "simulator.cfg" );
[617]94
95#else
96int main ( int argc, char* argv[] ) {
97        const char *fname;
98        if ( argc>1 ) {
99                fname = argv[1];
100        } else {
[756]101                fname="simulator.cfg";
[617]102        }
103        UIFile Cfg ( fname );
104#endif
[622]105
106        shared_ptr<DS> Ds = UI::build<DS> ( Cfg, "system" );
[700]107        int Ndat=10;
[622]108        if ( Cfg.exists ( "experiment" ) ) {
109                if ( Cfg.lookupValue ( "experiment.ndat",Ndat ) ) {
110                        bdm_assert ( Ndat<=Ds->max_length(), "Data source has less data then required" );
[617]111                };
112        } else {
[622]113                if ( Ds->max_length() < std::numeric_limits< int >::max() ) {
[617]114                        Ndat=Ds->max_length();
[622]115                }
116                ;// else Ndat=10;
[617]117        }
[622]118        shared_ptr<logger> L = UI::build<logger> ( Cfg, "logger",UI::optional );
119        if ( !L ) {
120#ifdef MEX
[617]121                //mex logger has only from_setting constructor - we  have to fill it...
[622]122                L=new mexlog ( Ndat );
123#else
[617]124                L=new stdlog();
[622]125#endif
[617]126        }
[622]127
[676]128        Ds->log_register ( *L, "DS" );
[617]129        L->init();
130
131        vec dt=zeros ( Ds->_drv()._dsize() );   //data variable
132
133        for ( int tK=0;tK<Ndat;tK++ ) {
134                Ds->getdata ( dt );                                     // read data
[676]135                Ds->log_write (  );
[622]136
[617]137                L->step();
138                Ds->step();                                                     // simulator step
139        }
140
141        L->finalize();
142        // ------------------ End of routine -----------------------------
143
144#ifdef MEX
[622]145        mexlog* mL=dynamic_cast<mexlog*> ( L.get() );
[617]146
[622]147        if ( mL ) { // user wants output!!
[617]148                if ( n_output<1 ) mexErrMsgTxt ( "Wrong number of output variables!" );
149                output[0] = mL->toCell();
150        }
151#endif
152}
Note: See TracBrowser for help on using the browser.