Nemo  2.3.56
Simulate forward-in-time genetic evolution in a spatially explicit, individual-based stochastic simulator
ParamManager Class Reference

Class to manage the sets of parameters of the simulation components. More...

#include <basicsimulation.h>

+ Inheritance diagram for ParamManager:
+ Collaboration diagram for ParamManager:

Public Member Functions

 ParamManager ()
 Cstor. More...
 
 ~ParamManager ()
 
void add_paramset (ParamSet *paramset)
 Adds a ParamSet to the list of the parameter sets of the simulation. More...
 
ParamSetget_paramset (string &name)
 Looks for paramset with "name" in the list of parameter sets. More...
 
void build_allParams ()
 Clears and fills the _allParams list with the ParamSet's of the simulation components. More...
 
list< ParamSet * > & get_allParams ()
 Accessor of the whole list of the parameter sets. More...
 
bool set_parameters (map< string, string > &simparams, bool silent)
 Sets the parameters of the simulation with the argument strings given in input. More...
 
bool param_consistency_check ()
 Checks if all the mandatory parameters are set so that the simulation can be launched. More...
 
void build_records (map< string, vector< string > > &initParams)
 Builds the list of simulation parameters from the parsed input file(s). More...
 
list< map< string, string > > & get_simRecords ()
 Accessor to the simulations parameter list. More...
 
map< string, string > & get_firstRecord ()
 Accessor to the first element in the simulations parameter list. More...
 
int get_nbSims ()
 Accessor to the size of the simulations parameter list, i.e. More...
 
- Public Member Functions inherited from ComponentManager
 ComponentManager ()
 
 ~ComponentManager ()
 
void build_component_list ()
 Clears and builds the list of all components from the lists of trait prototype templates and life cycle event templates. More...
 
void add_component (SimComponent *cmpt)
 Push a component at the back of the component list. More...
 
void add_trait (TraitPrototype *trait)
 Add a trait prototype to the template and component lists. More...
 
void add_LCE (LifeCycleEvent *event)
 Add a life cycle event to the template and component lists. More...
 
TraitPrototypeget_trait (string name)
 Search for component with "name" in the trait prototype list. More...
 
LifeCycleEventget_LCE (string name)
 Search for component with "name" in the life cycle events list. More...
 

Protected Attributes

list< ParamSet * > _allParams
 A list of all the parameter sets of all the simulation components loaded in the _component list of the ComponentManager. More...
 
map< string, string > _inputParams
 A map of the parameters and their arguments of the current (running) simulation. More...
 
map< unsigned int, list< pair< string, string > > > _temporalParams
 Lists of parameters to be updated during a simulation indexed by generation update time. More...
 
list< map< string, string > > _simRecords
 Sets of parameters of all the simulations to perform. More...
 
ParamSet _paramSet
 The ParamSet param set of the simulation. More...
 
- Protected Attributes inherited from ComponentManager
list< SimComponent * > _components
 List of all the simulation components. More...
 
list< TraitPrototype * > _TTrait_Templates
 List of all trait prototypes of the simulation, a subset of _components list. More...
 
list< LifeCycleEvent * > _LCE_Templates
 List of all the life-cycle events of the simulation, a subset of _components list. More...
 

Private Member Functions

string setFilename (string &fstring, unsigned int sim, vector< string > &args, vector< unsigned int > &arg_no, bool check_arg_no)
 
string stripFormatString (string &str, unsigned int &index)
 
string setArgString (string &fmt, string &arg, unsigned int arg_pos)
 
string lowercase (string &input)
 

Detailed Description

Class to manage the sets of parameters of the simulation components.

This class performs parameters setting and checking for the whole set of the simulation components. Provides access to derived classes to the complete list of parameter sets. Also sets the list of simulations parameters in case of sequential parameters found in input. It stores and builds the simulation parameters set.

See also
ParamsParser and derived classes. These are the input parameters providers.

Constructor & Destructor Documentation

◆ ParamManager()

ParamManager::ParamManager ( )

Cstor.

Builds the simulation PramaSet.

98{
99 _paramSet.setName("simulation");
101 _paramSet.setOwner(NULL);
102 _paramSet.add_param("filename",STR,true,false,0,0);
103 _paramSet.add_param("root_dir",STR,false,false,0,0);
104 _paramSet.add_param("logfile",STR,false,false,0,0);
105 _paramSet.add_param("postexec_script",STR,false,false,0,0);
106 _paramSet.add_param("postexec_args",STR,false,false,0,0);
107 _paramSet.add_param("postexec_replicate_wise", BOOL, 0,0,0,0);
108 _paramSet.add_param("random_seed",INT,false,false,0,0);
109 _paramSet.add_param("replicates",INT,true,false,0,0);
110 _paramSet.add_param("generations",INT,true,false,0,0);
111 _paramSet.add_param("run_mode",STR,false,false,0,0);
112}
ParamSet _paramSet
The ParamSet param set of the simulation.
Definition: basicsimulation.h:151
void add_param(Param *param)
Adds the param argument to the list.
Definition: param.h:243
void setName(string value)
Sets the container's name.
Definition: param.h:282
void setOwner(SimComponent *owner)
Sets the pointer to the SimComponents that owns this set.
Definition: param.h:286
void setIsRequired(bool value)
Sets the _isRequired flag meaning this container is mandatory and must be set in order to run a simul...
Definition: param.h:284
@ BOOL
Definition: types.h:78
@ STR
Definition: types.h:78
@ INT
Definition: types.h:78

References _paramSet, ParamSet::add_param(), BOOL, INT, ParamSet::setIsRequired(), ParamSet::setName(), ParamSet::setOwner(), and STR.

◆ ~ParamManager()

ParamManager::~ParamManager ( )
inline
93{/*message("ParamManager::~ParamManager\n");*/}

Member Function Documentation

◆ add_paramset()

void ParamManager::add_paramset ( ParamSet paramset)
inline

Adds a ParamSet to the list of the parameter sets of the simulation.

96 {
97 _allParams.push_back(paramset);
98 }
list< ParamSet * > _allParams
A list of all the parameter sets of all the simulation components loaded in the _component list of th...
Definition: basicsimulation.h:143

References _allParams.

Referenced by BinaryDataLoader::extractPop().

+ Here is the caller graph for this function:

◆ build_allParams()

void ParamManager::build_allParams ( )

Clears and fills the _allParams list with the ParamSet's of the simulation components.

117{
118 list< SimComponent* >::iterator cmpt = _components.begin();
119
120 _allParams.clear();
121
122 _allParams.push_back(&_paramSet);
123
124 while(cmpt != _components.end()) {
125 _allParams.push_back( (*cmpt)->get_paramset() );
126 cmpt++;
127 }
128}
list< SimComponent * > _components
List of all the simulation components.
Definition: basicsimulation.h:71

References _allParams, ComponentManager::_components, and _paramSet.

Referenced by SIMenv::loadDefaultComponents(), SimRunner::run(), and SimBuilder::SimBuilder().

+ Here is the caller graph for this function:

◆ build_records()

void ParamManager::build_records ( map< string, vector< string > > &  initParams)

Builds the list of simulation parameters from the parsed input file(s).

251{
252 map< string, string > params;
253 map< string, string > paramsToExpand;
254 map< string, string >::iterator param_iter;
255 map< string, vector<string> >::iterator Pit;
256 unsigned int RecNb = 1, ArgNb, SeqParam = 0, BlockSize, seq_pos, num_seq_arg = 0;
257 vector<unsigned int> sequence; //stores the number of args of each sequence parameters
258 vector<string> currSeqArg;
259 vector<unsigned int> currSeqPos;
260 vector<string> currCombinArg;
261 vector<unsigned int> currCombinPos;
262 string NAME;
263 string ARG;
264 bool SEQUENCE = 0;
265
266 //find sequential and combinatorial parameters:
267 for(Pit = initParams.begin(); Pit != initParams.end(); ++Pit) {
268
269 if(Pit->second.size() > 1) {
270 //fetch the number of the current sequence parameter:
271 sequence.push_back(Pit->second.size());
272 num_seq_arg++;
273 //increase the total number of simulations records:
274 RecNb *= Pit->second.size();
275
276 } else if(Pit->second[0].find_first_of('[') != string::npos) {
277 //@TODO process true sequential arg
278 }
279
280 }
281
282 if(RecNb > 1)
283 //we have a sequence of simulations:
284 SEQUENCE = true;
285
286 for(unsigned int i = 0; i < RecNb; ++i) {
287 //now build the simulation records with the right params!
288 //the map 'param' will get all the params used for one simulation
289 //it is then added to the list of simulations' parameters map
290
291 SeqParam = 0;//used as index of the 'sequence' vector
292
293 for(Pit = initParams.begin(); Pit != initParams.end(); ++Pit) {
294
295 if(!(Pit->first.compare("filename")==0) &&
296 !(Pit->first.compare("stat")==0) &&
297 !(Pit->first.compare("postexec_args")==0)) {
298
299 //get the number of arguments for the current parameter:
300 ArgNb = Pit->second.size();
301
302 if(ArgNb > 1) {
303 //the current param is a sequence param
304 //increase the index of the sequence parameter
305 SeqParam++;
306 //then compute the right argument to give to the current simulation record:
307 BlockSize = RecNb;
308
309 for(unsigned int j = 0; j < SeqParam; ++j)
310 BlockSize /= sequence[j];
311
312 seq_pos = (i/BlockSize) % ArgNb;
313 //we store the argument position in its sequence and the actual argument string to build the filename:
314 currSeqPos.push_back( seq_pos );
315 currSeqArg.push_back(Pit->second[ seq_pos ]);
316
317 //assign the right argument to the parameter:
318 //params[Pit->first] = Pit->second[ seq_pos ];
319
320 ARG = Pit->second[ seq_pos ];
321 //we can expand a string argument of a sequential parameter as well
322 if(ARG.find_first_of('%') != string::npos) {
323
324 if(!SEQUENCE) fatal("found name expansion string '%' without multi-value parameters in the input file.\n");
325
326 paramsToExpand[Pit->first] = ARG;
327
328 } else
329 params[Pit->first] = ARG;
330
331 } else if (ArgNb == 1) {
332 //the current param isn't a sequence param but gets an argument
333 //we might have to do some name expansion:
334 ARG = Pit->second[0];
335
336 if(ARG.find_first_of('%') != string::npos) {
337
338 if(!SEQUENCE) fatal("found name expansion string '%' without multi-value parameters in the input file.\n");
339
340 paramsToExpand[Pit->first] = ARG;
341
342 } else
343 params[Pit->first] = ARG;
344
345 } else
346 //current param has no argument (bool type param) we give it value 1 (true)
347 params[Pit->first] = "1";
348
349 } else if (Pit->first.compare("stat") == 0){
350
351 params["stat"].assign("");
352 //build a string with all the stats arguments
353 for(unsigned int k = 0; k < Pit->second.size(); ++k)
354 params["stat"] += Pit->second[k] + " ";
355
356 } else if (Pit->first.compare("filename")==0) {
357
358 if(SEQUENCE)
359 NAME = Pit->second[0];
360 else
361 params["filename"] = Pit->second[0];
362
363 } else if (Pit->first.compare("postexec_args") == 0){
364
365 ARG = "";
366
367 //build a string with all the postexec arguments
368 for(unsigned int k = 0; k < Pit->second.size(); ++k)
369 ARG += Pit->second[k] + " ";
370
371 params["postexec_args"] = ARG;
372
373//#ifdef NEMOSUB
374 if(ARG.find_first_of('%') != string::npos)
375 paramsToExpand["postexec_args"] = ARG;
376//#endif
377
378 }
379 }
380
381 if(SEQUENCE) { //perform expansion of param arguments containing the '%' marker
382
383 params["filename"] = setFilename(NAME, i+1, currSeqArg, currSeqPos, true);
384
385 for(param_iter = paramsToExpand.begin(); param_iter != paramsToExpand.end(); param_iter++)
386 params[param_iter->first] = setFilename(param_iter->second, i+1, currSeqArg, currSeqPos, false);
387 }
388
389 //add all the params previously computed to the main simulation recorder list (of maps)
390 _simRecords.push_back(params);
391
392 currSeqArg.clear();
393 currSeqPos.clear();
394 }
395 /*
396 RecNb = 1;
397 for(RecIt = SimRecorder.begin();RecIt != SimRecorder.end();++RecIt){
398 message("\nSimulation "<<RecNb++;
399 for(P2 = RecIt->begin();P2 != RecIt->end();++P2)
400 message("\n "<<P2->first<<"\t"<<P2->second;
401 }
402*/
403}
list< map< string, string > > _simRecords
Sets of parameters of all the simulations to perform.
Definition: basicsimulation.h:149
string setFilename(string &fstring, unsigned int sim, vector< string > &args, vector< unsigned int > &arg_no, bool check_arg_no)
Definition: basicsimulation.cc:407
void fatal(const char *str,...)
Definition: output.cc:96

References _simRecords, fatal(), and setFilename().

Referenced by SimRunner::run().

+ Here is the caller graph for this function:

◆ get_allParams()

list< ParamSet * > & ParamManager::get_allParams ( )
inline

Accessor of the whole list of the parameter sets.

Returns
the reference to the list of ParamSet
109 {
110 return _allParams;
111 }

References _allParams.

◆ get_firstRecord()

map< string, string > & ParamManager::get_firstRecord ( )
inline

Accessor to the first element in the simulations parameter list.

137{return (*_simRecords.begin());}

References _simRecords.

◆ get_nbSims()

int ParamManager::get_nbSims ( )
inline

Accessor to the size of the simulations parameter list, i.e.

the number of simulations to perform.

139{return _simRecords.size();}

References _simRecords.

◆ get_paramset()

ParamSet * ParamManager::get_paramset ( string &  name)

Looks for paramset with "name" in the list of parameter sets.

Returns
NULL if parameter set "name" not found
233{
234 list<ParamSet*>::iterator pset = _allParams.begin();
235
236 while(pset != _allParams.end()) {
237
238 if( (*pset)->getName().compare(name) == 0)
239 return (*pset);
240
241 pset++;
242 }
243
244 return NULL;
245}

References _allParams.

Referenced by SimRunner::Replicate_LOOP().

+ Here is the caller graph for this function:

◆ get_simRecords()

list< map< string, string > > & ParamManager::get_simRecords ( )
inline

Accessor to the simulations parameter list.

135{return _simRecords;}

References _simRecords.

◆ lowercase()

string ParamManager::lowercase ( string &  input)
private
598{
599 for(unsigned int i=0;i<input.size();++i)
600 input[i] = tolower(input[i]);
601 return input;
602}

◆ param_consistency_check()

bool ParamManager::param_consistency_check ( )

Checks if all the mandatory parameters are set so that the simulation can be launched.

Returns
TRUE if all ParamSet::check_consistency() returned true
133{
134 list<ParamSet*>::iterator current_paramset = _allParams.begin();
135
136 bool check = true;
137
138 while(current_paramset != _allParams.end()){
139 if(!(*current_paramset)->check_consistency()){
140 error("ParamManager::param_consistency_check::consistency not satisfied for \"%s\"\n",
141 (*current_paramset)->getName().c_str());
142 check = false;
143 }
144 current_paramset++;
145 }
146 return check;
147}
int error(const char *str,...)
Definition: output.cc:77

References _allParams, and error().

Referenced by set_parameters().

+ Here is the caller graph for this function:

◆ set_parameters()

bool ParamManager::set_parameters ( map< string, string > &  simparams,
bool  silent 
)

Sets the parameters of the simulation with the argument strings given in input.

Scans the _allParams list to set the parameters present in the input map simparams. Each ParamSet checks internally for the presence of a Param with the given name string and sets its value with the given argument, if present.

Note: all ParamSet owning a Param with the same name will use the same argument string. The input map is not a multimap, each param name is present only once.

Parameters
simparamsa map containing the parameter names and their argument string
silentwill be silent about parameters that could not be set.
Returns
the status of the param_consistency_check() function
152{
153 _inputParams = simparams;
154 list<ParamSet*>::iterator current_paramset = _allParams.begin();
155 map< string,string >::iterator IT = _inputParams.begin();
156 bool set = false;
157 bool found = false;
158
159 vector< string > unset;
160 vector< string > notfound;
161
162 // we try and assign recorded parameters to a paramset
163 while(IT != _inputParams.end()) {
164
165 current_paramset = _allParams.begin();
166
167 // go through the list of all paramsets to assign the param to at least one paramset
168 // one parameter can be in multiple paramsets because of inheritance between components
169 while(current_paramset != _allParams.end()){
170
171 found |= ( (*current_paramset)->find_param((string&)IT->first) != NULL );
172
173 if(found)
174 set |= (*current_paramset)->set_param((string&)IT->first, IT->second);
175
176 current_paramset++;
177 }
178
179 // if not found, add param to list for warnings
180 if(!found){
181
182 notfound.push_back(IT->first);
183
184 }
185
186 // if found but set failed, add param to list for warnings
187 if(found && !set){
188
189 unset.push_back(IT->first);
190
191 }
192
193 // reset the flags
194 found = false;
195 set = false;
196
197 // move to next input parameter
198 IT++;
199 }
200
201
202 if(!silent && _myenv->isMaster()) {
203
204 if(notfound.size() > 0) {
205
206 warning(" Orphan parameters!\n>>>> The following parameters do not belong to any simulation component:\n");
207
208 for(unsigned i = 0; i < notfound.size(); ++i)
209 message(">>>> \"%s\" \n",notfound[i].c_str());
210
211 message("\n");
212 }
213
214 if(unset.size() > 0) {
215
216 error(" Unset parameters!\n>>>> The following parameters could not be set (wrong value):\n");
217
218 for(unsigned i = 0; i < unset.size(); ++i)
219 message(">>>> \"%s\" \n",unset[i].c_str());
220
221 fatal("Please check the input parameter file and correct the error.\n");
222 }
223
224 }
225
226
228}
MPIenv * _myenv
Definition: MPImanager.cc:36
bool isMaster() const
Definition: MPImanager.h:127
map< string, string > _inputParams
A map of the parameters and their arguments of the current (running) simulation.
Definition: basicsimulation.h:145
bool param_consistency_check()
Checks if all the mandatory parameters are set so that the simulation can be launched.
Definition: basicsimulation.cc:132
void warning(const char *str,...)
Definition: output.cc:58
void message(const char *message,...)
Definition: output.cc:40

References _allParams, _inputParams, _myenv, error(), fatal(), MPIenv::isMaster(), message(), param_consistency_check(), and warning().

Referenced by SimBuilder::build_currentParams().

+ Here is the caller graph for this function:

◆ setArgString()

string ParamManager::setArgString ( string &  fmt,
string &  arg,
unsigned int  arg_pos 
)
private
513{
514 unsigned int width, digits;
515 double value;
516 bool is_dotless = 0;
517 string out, arg_str;
518 size_t pos = 0;
519
520 if(fmt.size() != 0) {
521
522 if(fmt[0] == '.') {
523 is_dotless = true;
524 fmt = fmt.substr(1, string::npos);
525 }
526
527 if( !isdigit(fmt[0]) ) {
528 error("syntax error in format string for filename parameter:\n");
529 fatal("first character within \' \' must be a number\n");
530 }
531
532 width = (unsigned int) strtol(fmt.c_str(), NULL, 10);
533
534 digits = (unsigned int) log10((double)width) +1;
535
536 fmt = fmt.substr(digits, string::npos);
537
538 if(fmt[0] == '[') {
539
540 if( (pos = fmt.find(']')) == string::npos){
541 error("syntax error in format string for filename parameter:\n");
542 fatal("enclosing ']' was not found\n");
543 }
544
545 arg_str = fmt.substr(1, pos-1);
546
547 if(arg_str[0] == '+') {
548
549 ostringstream ostr;
550 ostr.width(width);
551 ostr.fill('0');
552 ostr << arg_pos+1;
553
554 out = ostr.str();
555
556 } else {
557
558 if (arg_str.size() < (arg_pos+1)*width) {
559 error("syntax error in format string for filename parameter:\n");
560 fatal("the number of characters within [ ] is not sufficient.\n");
561 }
562
563 for(unsigned int i = 0, start = arg_pos*width; i < width; i++)
564 out += arg_str[start + i];
565 }
566
567 } else {
568
569 value = strtod(arg.c_str(), 0);
570
571 if(is_dotless) {
572 //take the decimal part:
573 double dummy;
574 value = modf(value, &dummy);
575 value *= pow(10.0, (double)width);
576 }
577
578 ostringstream ostr;
579 ostr.width(width);
580 ostr.fill('0');
581 ostr << value;
582
583 out = ostr.str();
584 }
585
586 } else {
587
588 out = arg;
589
590 }
591
592 return out;
593}

References error(), and fatal().

Referenced by setFilename().

+ Here is the caller graph for this function:

◆ setFilename()

string ParamManager::setFilename ( string &  fstring,
unsigned int  sim,
vector< string > &  args,
vector< unsigned int > &  arg_no,
bool  check_arg_no 
)
private
411{
412 string out, tail, fmt;
413 string::size_type pos = fstring.find_first_of('%');
414 string::size_type next;
415 unsigned int index, nstr_args = (pos != string::npos ? 1 : 0);
416 bool add_sim_no = false;
417 static bool has_warned = false;
418
419 while(pos != string::npos)
420 nstr_args += ( (pos = fstring.find('%', pos+1)) != string::npos);
421
422 if(check_arg_no && nstr_args < args.size()) {
423 if(!has_warned) warning("missing sequential arguments in filename parameter, adding simulation number to filename.\n");
424 has_warned = true;
425 add_sim_no = true;
426 }
427
428 pos = fstring.find_first_of('%');
429
430 if(pos != string::npos) {
431
432 if(pos > 0) out = fstring.substr(0, pos);
433
434 tail = fstring.substr(pos+1, string::npos);
435
436 fmt = stripFormatString(tail, index);
437
438 if(index > args.size()) fatal("too many sequential arguments in \"%s\"\n",fstring.c_str());
439
440 out += setArgString(fmt, args[index-1], arg_no[index-1]);
441
442 next = tail.find_first_of('%');
443
444 while(next != string::npos){
445
446 out += tail.substr(0, next);
447
448 tail = tail.substr(next+1, string::npos);
449
450 fmt = stripFormatString(tail, index);
451
452 if(index > args.size()) fatal("too many sequential arguments in \"%s\"\n",fstring.c_str());
453
454 out += setArgString(fmt, args[index-1], arg_no[index-1]);
455
456 next = tail.find_first_of('%');
457 }
458
459 out += tail.substr(0, next);
460
461 } else
462 out = fstring;
463
464 if(add_sim_no) {
465
466 ostringstream ostr;
467 ostr << sim;
468
469 out += "-" + ostr.str();
470 }
471
472 return out;
473}
string setArgString(string &fmt, string &arg, unsigned int arg_pos)
Definition: basicsimulation.cc:512
string stripFormatString(string &str, unsigned int &index)
Definition: basicsimulation.cc:477

References fatal(), setArgString(), stripFormatString(), and warning().

Referenced by build_records().

+ Here is the caller graph for this function:

◆ stripFormatString()

string ParamManager::stripFormatString ( string &  str,
unsigned int index 
)
private
478{
479 string fmt;
480 unsigned int digits;
481 size_t fmt_end;
482
483 //check for the presence of a format string, enclose by two \'
484 if(str[0] == '\'') {
485
486 fmt_end = str.find('\'', 1);
487
488 if(fmt_end == string::npos) fatal("format string not closed in filename parameter\n");
489
490 fmt = str.substr(1, fmt_end-1);
491
492 str = str.substr(fmt_end +1, string::npos);
493
494 } else {
495
496 fmt = "";
497
498 }
499
500 index = (unsigned int) strtol(str.c_str(), NULL, 10);
501
502 digits = (unsigned int) log10((double)index) +1;
503
504 str = str.substr(digits, string::npos);
505
506 return fmt;
507
508}

References fatal().

Referenced by setFilename().

+ Here is the caller graph for this function:

Member Data Documentation

◆ _allParams

list< ParamSet* > ParamManager::_allParams
protected

A list of all the parameter sets of all the simulation components loaded in the _component list of the ComponentManager.

Referenced by add_paramset(), build_allParams(), SimBuilder::build_currentParams(), get_allParams(), get_paramset(), param_consistency_check(), SimRunner::reset(), and set_parameters().

◆ _inputParams

map< string, string > ParamManager::_inputParams
protected

A map of the parameters and their arguments of the current (running) simulation.

Referenced by set_parameters().

◆ _paramSet

ParamSet ParamManager::_paramSet
protected

◆ _simRecords

list< map< string, string > > ParamManager::_simRecords
protected

Sets of parameters of all the simulations to perform.

Referenced by build_records(), get_firstRecord(), get_nbSims(), get_simRecords(), and SimRunner::run().

◆ _temporalParams

map< unsigned int, list < pair< string, string> > > ParamManager::_temporalParams
protected

Lists of parameters to be updated during a simulation indexed by generation update time.


The documentation for this class was generated from the following files:

Generated for Nemo v2.3.56 by  doxygen 1.9.0 -- Nemo is hosted on  Download Nemo

Locations of visitors to this page
Catalogued on GSR