OpenM++ runtime library (libopenm)
runController.h
Go to the documentation of this file.
1
5// Copyright (c) 2013-2015 OpenM++
6// This code is licensed under the MIT license (see LICENSE.txt for details)
7
8#ifndef RUN_CTRL_H
9#define RUN_CTRL_H
10
11#include <fstream>
12#include "metaLoader.h"
13#include "dbValue.h"
14
15using namespace std;
16
17static constexpr size_t MinSizeToSaveMicrodata = 128 * 1024;
18static constexpr size_t MaxSizeToSaveMicrodata = 2 * 1024 * 1024;
20namespace openm
21{
23 class RunController : public MetaLoader, public IRunBase
24 {
25 public:
28
31
34
37
39 static RunController * create(const ArgReader & i_argOpts, bool i_isMpiUsed, IDbExec * i_dbExec, IMsgExec * i_msgExec);
40
42 virtual ~RunController(void) noexcept = 0;
43
45 int parameterIdByName(const char * i_name) const override { return MetaLoader::parameterIdByName(i_name); };
46
48 int parameterSubCount(int i_paramId) const override { return MetaLoader::parameterSubCount(i_paramId); }
49
51 int parameterSelfSubCount(int i_paramId) const override
52 {
53 return parameterSubCount(i_paramId) > 1 ? selfSubCount : 1;
54 }
55
57 int parameterSubValueIndex(int i_paramId, int i_subId) const override
58 {
59 return (parameterSubCount(i_paramId) > 1 && subFirstId <= i_subId && i_subId < subFirstId + selfSubCount) ?
60 i_subId - subFirstId :
61 0;
62 }
63
65 bool isUseSubValue(int i_subId) const override
66 {
67 return subFirstId <= i_subId && i_subId < subFirstId + selfSubCount;
68 }
69
71 RunStateHolder & runStateStore(void) { return runStateHolder; }
72
74 virtual int nextRun(void) = 0;
75
77 virtual void shutdownRun(int i_runId) = 0;
78
80 virtual void shutdownWaitAll(void) = 0;
81
83 virtual void shutdownOnExit(ModelStatus i_status) = 0;
84
86 virtual bool childExchange(void) = 0;
87
89 virtual void writeAccumulators(
90 const RunOptions & i_runOpts,
91 bool i_isLastTable,
92 const char * i_name,
93 size_t i_size,
94 forward_list<unique_ptr<double[]> > & io_accValues
95 ) = 0;
96
98 bool isOptionExist(const char * i_key) const noexcept override {
99 return metaStore->runOptionTable ? metaStore->runOptionTable->isExist(currentRunId(), i_key) : false;
100 }
101
103 string strOption(const char * i_key, const string & i_default = "") const noexcept override {
104 return metaStore->runOptionTable ? metaStore->runOptionTable->strValue(currentRunId(), i_key, i_default) : i_default;
105 }
106
108 bool boolOption(const char * i_key) const noexcept override {
109 return metaStore->runOptionTable ? metaStore->runOptionTable->boolValue(currentRunId(), i_key) : false;
110 }
111
118 int boolOptionToInt(const char * i_key) const noexcept override {
119 return metaStore->runOptionTable ? metaStore->runOptionTable->boolValueToInt(currentRunId(), i_key) : -1;
120 }
121
123 int intOption(const char * i_key, int i_default) const noexcept override {
124 return metaStore->runOptionTable ? metaStore->runOptionTable->intValue(currentRunId(), i_key, i_default) : i_default;
125 }
126
128 long long longOption(const char * i_key, long long i_default) const noexcept override {
129 return metaStore->runOptionTable ? metaStore->runOptionTable->longValue(currentRunId(), i_key, i_default) : i_default;
130 }
131
133 double doubleOption(const char * i_key, double i_default) const noexcept override {
134 return metaStore->runOptionTable ? metaStore->runOptionTable->doubleValue(currentRunId(), i_key, i_default) : i_default;
135 }
136
138 vector<pair<string, string>> allOptions(void) const noexcept override;
139
142 {
143 int attrId;
144 int idxOf;
145 ptrdiff_t rowOffset = 0;
146 unique_ptr<IValueFormatter> fmtValue;
147 unique_ptr<IValueFormatter> sqlFmtValue;
149 EntityAttrItem(int i_attrId, int i_index) : attrId(i_attrId), idxOf(i_index) {}
150 };
151
154 {
155 int entityId;
156 vector<EntityAttrItem> attrs;
157 string genDigest;
158 int genHid = 0;
160 string csvHdr;
161 size_t rowSize = 0;
163 vector<DbValueSetter> rowSetter;
164 vector<const type_info *> rowTypes;
166 EntityItem(int i_entityId) : entityId(i_entityId) {}
167 };
168
176 void pushDbMicrodata(int i_runId, int i_entityKind, uint64_t i_microdataKey, const void * i_entityThis);
177
186 void writeCsvMicrodata(int i_entityKind, uint64_t i_microdataKey, int i_eventId, bool i_isSameEntity, const void * i_entityThis, string & io_line);
187
189 const string csvHeaderMicrodata(int i_entityKind) const;
190
192 void makeCsvLineMicrodata(const EntityItem & i_entityItem, uint64_t i_microdataKey, int i_eventId, bool i_isSameEntity, const void * i_entityThis, string & io_line) const;
193
195 tuple<bool, const RunController::EntityItem &> findEntityItem(int i_entityKind) const;
196
198 bool isEntityEventInFilter(int i_entityKind, uint64_t i_microdataKey, int i_eventId) const;
199
200 protected:
202 RunController(const ArgReader & i_argStore) : MetaLoader(i_argStore),
203 subFirstId(0),
204 selfSubCount(0),
205 processCount(1),
206 processRank(0)
207 { }
208
210 virtual void init(void) = 0;
211
213 virtual int currentRunId(void) const noexcept = 0;
214
216 int createTaskRun(int i_taskId, IDbExec * i_dbExec);
217
219 int findTask(IDbExec * i_dbExec);
220
222 tuple<int, int, ModelStatus> createNewRun(int i_taskRunId, bool i_isWaitTaskRun, IDbExec * i_dbExec);
223
225 void doShutdownOnExit(ModelStatus i_status, int i_runId, int i_taskRunId, IDbExec * i_dbExec);
226
228 void doShutdownRun(int i_runId, int i_taskRunId, IDbExec * i_dbExec);
229
231 void doShutdownAll(int i_taskRunId, IDbExec * i_dbExec);
232
235 int i_runId,
236 IDbExec * i_dbExec,
237 const RunOptions & i_runOpts,
238 const char * i_name,
239 size_t i_size,
240 forward_list<unique_ptr<double[]> > & io_accValues
241 ) const;
242
244 void updateRestartSubValueId(int i_runId, IDbExec * i_dbExec, int i_subRestart) const;
245
247 void updateRunState(IDbExec * i_dbExec, const map<pair<int, int>, RunState> i_updated) const;
248
249 // microdata entities to write into database or csv
250 map<int, EntityItem> entityMap;
251 vector<int> entityIds; // sorted microdata entity id's
252
261 map<int, list<unique_ptr<uint8_t[]>>> pullDbMicrodata(bool i_isNow = false);
262
265 {
267 virtual uint8_t * toFirst(void) = 0;
268
270 virtual uint8_t * toNext(void) = 0;
271 };
272
275 {
277 ListFirstNext(list<unique_ptr<uint8_t[]>>::const_iterator i_begin, list<unique_ptr<uint8_t[]>>::const_iterator i_end) {
278 beginIt = i_begin;
279 endIt = i_end;
280 rowIt = i_begin;
281 }
282
284 virtual uint8_t * toFirst(void) override
285 {
286 rowIt = beginIt;
287 return rowIt != endIt ? rowIt->get() : nullptr;
288 }
289
291 virtual uint8_t * toNext(void) override
292 {
293 if (rowIt == endIt) return nullptr;
294
295 ++rowIt;
296 return rowIt != endIt ? rowIt->get() : nullptr;
297 }
298 private:
299 list<unique_ptr<uint8_t[]>>::const_iterator beginIt; // first row
300 list<unique_ptr<uint8_t[]>>::const_iterator endIt; // after last row
301 list<unique_ptr<uint8_t[]>>::const_iterator rowIt; // current row
302 };
303
306 {
308 BytesFirstNext(size_t i_rowCount, size_t i_rowSize, uint8_t * i_rows) : count(i_rowCount), size(i_rowSize) {
309 totalSize = size * count;
310 pRows = i_rows;
311 rowNow = 0;
312 }
313
315 virtual uint8_t * toFirst(void) override
316 {
317 if (pRows == nullptr || count <= 0 || size <= 0) return nullptr;
318
319 rowNow = 0;
320 return size <= totalSize ? pRows : nullptr;
321 }
322
324 virtual uint8_t * toNext(void) override
325 {
326 if (pRows == nullptr || count <= 0 || size <= 0 || rowNow >= count) return nullptr;
327
328 rowNow++;
329 return (rowNow + 1) * size <= totalSize ? pRows + (rowNow * size) : nullptr;
330 }
331 private:
332 size_t count = 0; // rows count
333 size_t size = 0; // row size in bytes
334 size_t totalSize = 0; // total size in bytes
335 uint8_t * pRows; // array of bytes [count, size]
336 size_t rowNow = 0; // current row index
337 };
338
340 size_t doDbMicrodata(IDbExec * i_dbExec, int i_entityId, IRowsFirstNext & i_entityMdRows);
341
343 size_t doDbMicrodataSql(IDbExec * i_dbExec, const map<int, list<unique_ptr<uint8_t[]>>> & i_entityMdRows);
344
346 void openCsvMicrodata(void);
347
348 private:
350 RunStateHolder runStateHolder;
351
353 tuple<int, string, bool, bool> findWorkset(int i_setId, IDbExec * i_dbExec);
354
356 int findBaseRun(IDbExec * i_dbExec);
357
359 void createRunOptions(int i_runId, int i_setId, const string & i_setName, int i_baseRunId, int i_taskRunId, IDbExec * i_dbExec) const;
360
361 // copy input parameters from "base" run and working set into new run id
362 void createRunParameters(int i_runId, int i_setId, bool i_isWsDefault, bool i_isReadonlyWsDefault, int i_baseRunId, IDbExec * i_dbExec) const;
363
364 // cretate run description and notes using run options or by copy it from workset text
365 void createRunText(int i_runId, int i_setId, IDbExec * i_dbExec) const;
366
367 // insert run entity metadata and create run entity database tables
368 void createRunEntityTables(IDbExec* i_dbExec);
369
370 // insert run entity rows for all entities in that model run
371 void insertRunEntity(int i_runId, IDbExec * i_dbExec);
372
373 // calculate entity generation digest: based on entity digest, attributes id, name, type digest
374 const string makeEntityGenDigest(const EntityDicRow * i_entRow, const vector<EntityAttrRow> i_attrRows) const;
375
377 void writeOutputValues(int i_runId, IDbExec * i_dbExec) const;
378
380 void writeMicrodataDigest(int i_runId, IDbExec * i_dbExec) const;
381
382 // check sub-value id's and count: sub id must be zero in range [0, sub count -1] and count must be equal to parameter size
383 void checkParamSubCounts(int i_runId, int i_subCount, const ParamDicRow & i_paramRow, IDbExec * i_dbExec) const;
384
385 // make part of where clause to select sub_id's
386 const string makeWhereSubId(const MetaLoader::ParamSubOpts & i_subOpts, int i_defaultSubId) const;
387
388 // make part of select columns list to map source sub id's to run parameter sub_id's
389 const string mapSelectedSubId(const MetaLoader::ParamSubOpts & i_subOpts) const;
390
391 // return parameter sub-value options by parameter id
392 const MetaLoader::ParamSubOpts subOptsById(const ParamDicRow & i_paramRow, int i_subCount, int i_defaultSubId) const;
393
395 RunImportOpts findImportRun(const string & i_modelName, const ImportOpts & i_importOpts, const IModelDicTable * i_mainModelTable, IDbExec * i_dbExec) const;
396
398 bool importOutputTable(
399 int i_runId,
400 const ParamDicRow & i_paramRow,
401 const ParameterNameSizeItem * i_nameSizeItem,
402 const RunImportOpts & i_riOpts,
403 const ParamImportRow * i_importRow,
404 IDbExec * i_dbExec
405 ) const;
406
408 bool importParameter(
409 int i_runId,
410 const ParamDicRow & i_paramRow,
411 const ParameterNameSizeItem * i_nameSizeItem,
412 const RunImportOpts & i_riOpts,
413 const ParamImportRow * i_importRow,
414 const ParamSubOpts & i_subOpts,
415 IDbExec * i_dbExec
416 ) const;
417
418 // microdata entity to strore in database
419 struct EntityDbItem
420 {
421 int entityId; // entity metadata id
422 //
423 recursive_mutex theMutex; // mutex to lock for db write operations
424 list<unique_ptr<uint8_t[]>> rowLst; // microdata list of rows
425 chrono::system_clock::time_point lastSaveTime = chrono::system_clock::time_point::min(); // last time of save
426 };
427 map<int, EntityDbItem> entityDbMap; // map entity id to database microdata buffer
428
433 tuple<bool, size_t> statusDbMicrodata(chrono::system_clock::time_point i_nowTime, EntityDbItem & i_entityDbItem);
434
436 list<unique_ptr<uint8_t[]>> && moveDbMicrodata(chrono::system_clock::time_point i_nowTime, EntityDbItem & io_entityDbItem);
437
438 // microdata entity to write into csv
439 struct EntityCsvItem
440 {
441 int entityId; // entity metadata id
442 string filePath; // if not empty then microdata csv file path
443 //
444 recursive_mutex theMutex; // mutex to lock for csv write operations
445 bool isReady; // if true then csv output file open and ready to use
446 ofstream csvSt; // csv output stream
447 };
448 map<int, EntityCsvItem> entityCsvMap; // map entity id to microdata entity csv file
449
450 // initialize microdata entity writing
451 void initMicrodata(void);
452
454 void closeCsvMicrodata(void) noexcept;
455
457 void writeCsvLineMicrodata(EntityCsvItem & io_entityCsvItem, const string & i_line);
458
459 private:
460 RunController(const RunController & i_runCtrl) = delete;
461 RunController & operator=(const RunController & i_runCtrl) = delete;
462 };
463}
464
465#endif // RUN_CTRL_H
database connection wrapper to execute sql commands.
Definition: dbExec.h:21
public interface for message passing
Definition: msg.h:138
model metadata loader: read and broadcast metadata and run options.
Definition: metaLoader.h:251
int parameterSubCount(int i_paramId) const
return sub-values count by parameter id
Definition: metaLoader.h:275
int parameterIdByName(const char *i_name) const
return index of parameter by name
Definition: metaLoader.cpp:116
run controller: create new model run(s) and support data exchange.
Definition: runController.h:24
long long longOption(const char *i_key, long long i_default) const noexcept override
return long value of run option by i_key or default if not found or can not be converted to long.
Definition: runController.h:128
void updateRunState(IDbExec *i_dbExec, const map< pair< int, int >, RunState > i_updated) const
merge updated sub-values run statue into database
Definition: runController.cpp:353
int parameterSelfSubCount(int i_paramId) const override
number of parameter sub-values for current process
Definition: runController.h:51
virtual ~RunController(void) noexcept=0
last cleanup
Definition: runController.cpp:21
virtual void writeAccumulators(const RunOptions &i_runOpts, bool i_isLastTable, const char *i_name, size_t i_size, forward_list< unique_ptr< double[]> > &io_accValues)=0
write output table accumulators or send data to root process.
virtual int currentRunId(void) const noexcept=0
get run id of the current model run.
const string csvHeaderMicrodata(int i_entityKind) const
return microdata entity csv file header
Definition: runControllerMicrodata.cpp:882
virtual void shutdownOnExit(ModelStatus i_status)=0
model process shutdown if exiting without completion (ie: exit on error).
int parameterIdByName(const char *i_name) const override
return index of parameter by name
Definition: runController.h:45
int createTaskRun(int i_taskId, IDbExec *i_dbExec)
create task run entry in database
Definition: runControllerNewRun.cpp:16
bool isUseSubValue(int i_subId) const override
return true if sub-value used by current process
Definition: runController.h:65
int findTask(IDbExec *i_dbExec)
find modeling task, if specified
Definition: runControllerNewRun.cpp:57
int parameterSubCount(int i_paramId) const override
number of parameter sub-values for current model run
Definition: runController.h:48
virtual void init(void)=0
get number of sub-values, read and broadcast metadata.
tuple< bool, const RunController::EntityItem & > findEntityItem(int i_entityKind) const
check if any microdata write required for this entity kind
Definition: runControllerMicrodata.cpp:83
RunStateHolder & runStateStore(void)
return holder of all sub-values modeling run states
Definition: runController.h:71
string strOption(const char *i_key, const string &i_default="") const noexcept override
return string value of run option by i_key or default value if not found.
Definition: runController.h:103
virtual void shutdownWaitAll(void)=0
model process shutdown: cleanup resources.
void openCsvMicrodata(void)
create microdata CSV files for new model run.
Definition: runControllerMicrodata.cpp:889
void writeCsvMicrodata(int i_entityKind, uint64_t i_microdataKey, int i_eventId, bool i_isSameEntity, const void *i_entityThis, string &io_line)
write microdata into the CSV file.
Definition: runControllerMicrodata.cpp:853
int selfSubCount
number of sub-values for current process
Definition: runController.h:30
virtual int nextRun(void)=0
create new run and input parameters in database.
static RunController * create(const ArgReader &i_argOpts, bool i_isMpiUsed, IDbExec *i_dbExec, IMsgExec *i_msgExec)
create run controller, load metadata tables and broadcast it to all modeling processes.
Definition: runController.cpp:24
int intOption(const char *i_key, int i_default) const noexcept override
return int value of run option by i_key or default if not found or can not be converted to int.
Definition: runController.h:123
bool isOptionExist(const char *i_key) const noexcept override
return true if run option found by i_key in run_option table for the current run id.
Definition: runController.h:98
bool boolOption(const char *i_key) const noexcept override
return boolean value of run option by i_key or false if not found or value is not "yes",...
Definition: runController.h:108
tuple< int, int, ModelStatus > createNewRun(int i_taskRunId, bool i_isWaitTaskRun, IDbExec *i_dbExec)
create new run, create input parameters and run options for input working sets
Definition: runControllerNewRun.cpp:89
virtual void shutdownRun(int i_runId)=0
model run shutdown: save results and update run status.
int processCount
number of modeling processes: MPI world size
Definition: runController.h:33
void pushDbMicrodata(int i_runId, int i_entityKind, uint64_t i_microdataKey, const void *i_entityThis)
push microdata database rows into the buffer.
Definition: runControllerMicrodata.cpp:318
void updateRestartSubValueId(int i_runId, IDbExec *i_dbExec, int i_subRestart) const
update sub-value index to restart the run
Definition: runController.cpp:339
virtual bool childExchange(void)=0
exchange between root and child processes and threads.
int parameterSubValueIndex(int i_paramId, int i_subId) const override
return index of parameter sub-value in the storage array of sub-values
Definition: runController.h:57
void makeCsvLineMicrodata(const EntityItem &i_entityItem, uint64_t i_microdataKey, int i_eventId, bool i_isSameEntity, const void *i_entityThis, string &io_line) const
make attributes csv line by converting attribute values into string
Definition: runControllerMicrodata.cpp:954
double doubleOption(const char *i_key, double i_default) const noexcept override
return double value of run option by i_key or default if not found or can not be converted to double.
Definition: runController.h:133
void doShutdownAll(int i_taskRunId, IDbExec *i_dbExec)
implementation model process shutdown.
Definition: runController.cpp:127
void doShutdownOnExit(ModelStatus i_status, int i_runId, int i_taskRunId, IDbExec *i_dbExec)
impelementation of model process shutdown if exiting without completion.
Definition: runController.cpp:66
void doWriteAccumulators(int i_runId, IDbExec *i_dbExec, const RunOptions &i_runOpts, const char *i_name, size_t i_size, forward_list< unique_ptr< double[]> > &io_accValues) const
write output table accumulators if table is not suppressed.
Definition: runController.cpp:297
void doShutdownRun(int i_runId, int i_taskRunId, IDbExec *i_dbExec)
implementation of model run shutdown.
Definition: runController.cpp:157
RunController(const ArgReader &i_argStore)
create run controller
Definition: runController.h:202
bool isEntityEventInFilter(int i_entityKind, uint64_t i_microdataKey, int i_eventId) const
retrun true if entity event id is matching events filter or if there no filter and all events are all...
Definition: runControllerMicrodata.cpp:997
map< int, list< unique_ptr< uint8_t[]> > > pullDbMicrodata(bool i_isNow=false)
pull microdata database rows from the buffer.
Definition: runControllerMicrodata.cpp:359
int boolOptionToInt(const char *i_key) const noexcept override
search for boolean value of run option by i_key and return one of: return 1 if key found and value i...
Definition: runController.h:118
size_t doDbMicrodata(IDbExec *i_dbExec, int i_entityId, IRowsFirstNext &i_entityMdRows)
write entity microdata rows into database and return inserted rows count
Definition: runControllerMicrodata.cpp:422
int processRank
modeling processes rank: MPI rank
Definition: runController.h:36
vector< pair< string, string > > allOptions(void) const noexcept override
return a copy of all run options as [key, value] pairs, ordered by key.
Definition: runControllerNewRun.cpp:348
size_t doDbMicrodataSql(IDbExec *i_dbExec, const map< int, list< unique_ptr< uint8_t[]> > > &i_entityMdRows)
write microdata into database using sql insert literal and return inserted rows count
Definition: runControllerMicrodata.cpp:515
int subFirstId
sub-value staring index for current modeling process
Definition: runController.h:27
sub-value run state for all modeling threads, identified by (run id, sub-value id) pair
Definition: modelRunState.h:61
OpenM++ data library: db value classes access value rows: input parameter, accumulator or expression ...
OpenM++ modeling library: model metadata loader to read and broadcast metadata and run options.
openM++ namespace
Definition: log.h:32
ModelStatus
modeling job status
Definition: omModelRunState.h:43
arguments reader to get runtime arguments from command line and ini-file.
Definition: argReader.h:56
entity_dic table row.
Definition: dbMetaRow.h:1200
model_dic table public interface.
Definition: dbMetaTable.h:175
public interface to initialize model run and input parameters
Definition: omModel.h:112
Definition: metaLoader.h:355
parameter_dic join to model_parameter_dic table row.
Definition: dbMetaRow.h:473
parameter_dic join to model_parameter_import table row.
Definition: dbMetaRow.h:547
model input parameter name, type and size
Definition: omModel.h:184
array of bytes rows wrapped into IRowsFirstNext interface
Definition: runController.h:306
BytesFirstNext(size_t i_rowCount, size_t i_rowSize, uint8_t *i_rows)
create interface to opaque list of bytes rows
Definition: runController.h:308
virtual uint8_t * toNext(void) override
move pointer to the next row, return NULL at the end of rows.
Definition: runController.h:324
virtual uint8_t * toFirst(void) override
move pointer to the first row, return NULL if row list is empty.
Definition: runController.h:315
entity attribute item to write microdata into database or csv file
Definition: runController.h:142
unique_ptr< IValueFormatter > fmtValue
attribute value offset in database row buffer
Definition: runController.h:146
int idxOf
entity attribute metadata id
Definition: runController.h:144
ptrdiff_t rowOffset
attribute index in EntityNameSizeArr
Definition: runController.h:145
unique_ptr< IValueFormatter > sqlFmtValue
attribute value to string converter for csv output
Definition: runController.h:147
EntityAttrItem(int i_attrId, int i_index)
attribute value to string converter for database insert
Definition: runController.h:149
entity item to write microdata into database or csv file
Definition: runController.h:154
string sqlInsPrefix
database row size
Definition: runController.h:162
string csvHdr
db microdata table name
Definition: runController.h:160
string dbMicrodataTable
entity generation unique id, unique in that database
Definition: runController.h:159
string genDigest
entity attributes
Definition: runController.h:157
int genHid
entity generation digest
Definition: runController.h:158
vector< DbValueSetter > rowSetter
microdata sql statement prefix
Definition: runController.h:163
vector< EntityAttrItem > attrs
entity metadata id
Definition: runController.h:156
EntityItem(int i_entityId)
column types of insert statement
Definition: runController.h:166
vector< const type_info * > rowTypes
function helpers to set column value of insert statement
Definition: runController.h:164
size_t rowSize
microdata csv header line
Definition: runController.h:161
interface to opaque list of bytes rows
Definition: runController.h:265
virtual uint8_t * toNext(void)=0
move pointer to the next row, return NULL at the end of rows.
virtual uint8_t * toFirst(void)=0
move pointer to the first row, return NULL if row list is empty.
list of bytes rows wrapped into IRowsFirstNext interface
Definition: runController.h:275
virtual uint8_t * toNext(void) override
move pointer to the next row, return NULL at the end of rows.
Definition: runController.h:291
virtual uint8_t * toFirst(void) override
move pointer to the first row, return NULL if row list is empty.
Definition: runController.h:284
ListFirstNext(list< unique_ptr< uint8_t[]> >::const_iterator i_begin, list< unique_ptr< uint8_t[]> >::const_iterator i_end)
create interface to opaque list of bytes rows
Definition: runController.h:277
basic model run options
Definition: omModel.h:26
model run state data: status, progress, update times
Definition: omModelRunState.h:93