48 #include<boost/date_time/posix_time/posix_time.hpp> 62 OBSMIN = 0,
OBSMAX = 1,
TIMEMIN = 2,
TIMEMAX = 3,
NOEVT = 4,
SEED = 5,
XML = 6,
GENERATEFAULTS = 7,
HELP = 8,
INTERACTIVE = 9,
PTALOG = 10,
NBSIM = 11
75 string description =
"Usage: dd-simulate\n\t --help |\n\t model1.des_comp [model2.des_comp ... sync.rules]\n\t [--seed randomSeed]\n\t [--noevent e3 e4 ....]\n\t [--obsMin nbObsMin]\n\t [--obsMax nbObsMax]\n\t [--timeMin minSeconds]\n\t [--timeMax maxSeconds]\n\t [--generateFaults]\n\t [--xml simulation.xml]\n\t [--interactive]\n\t [--ptalog output.pta_log]\n\t [--nbSim number]\n\n\n Write an observable scenario on the standard output based on \n the model that contains at least one occurrence of the event e1, e2 \n and that does not contain the events e3 e4. The generated scenario \n contains [nbObsMin,nbObsMax] observations. If set, the delay between\n two event occurrences is in [minSeconds,maxSeconds]. Optionnaly, a xml\n file can be generated with option --xml. \n The option --generateFaults randomly selects unobservable events in\n the model that will be considered as fault in the generated scenario.\n --interactive is the interactive mode, invalidate any other simulation\n option. --ptalog write the observable simulation in a pta_log file.\n --nbSim defines the number of simulations (default is 1)";
104 void clean(vector<Diades::Automata::ObservableComponent *> & components) {
105 for (vector<Diades::Automata::ObservableComponent *>::size_type i = 0; i < components.size();
107 if (components[i] !=
nullptr) {
108 delete components[i];
109 components[i] =
nullptr;
133 vector<unsigned> & values,
134 vector< set<string> > & noevents,
135 set<string> & modelFiles,
139 bool & faultGeneration,
140 bool & interactiveMode) {
146 while (index < argc) {
148 if (getOption<Option>(argv[index],
options, currentOption)) {
149 if (
isSet[currentOption]) {
153 isSet[currentOption] =
true;
156 switch (currentOption) {
160 interactiveMode =
true;
165 if ((index != 1) || (argc != 2)) {
181 getParameter<unsigned>(argc, argv, index, values[currentOption]);
187 faultGeneration =
true;
194 index, noevents[currentOption]);
195 if (noevents[currentOption].empty()) {
207 if (files.size() != 1) {
211 xmlFile = *(files.begin());
220 cout << files.size() << endl;
221 if (files.size() != 1) {
225 ptaLogFile = *(files.begin());
238 vector<string>::const_iterator it =
256 modelFiles.insert(
string(argv[index]));
261 if (!ruleFile.empty()) {
262 printCommandLineError(
"It seems that there are more than one synchronization rules file as a argument.");
267 ruleFile = string(argv[index]);
274 if (modelFiles.empty()) {
278 if ((modelFiles.size() == 1) && (!ruleFile.empty())) {
282 if ((modelFiles.size() > 1) && (ruleFile.empty())) {
283 printCommandLineError(
"There is no synchronization rule file but it is required as there is more than one component in the model.");
286 if ((modelFiles.size() == 1) && (!ruleFile.empty())) {
289 if ((modelFiles.size() > 1) && (ruleFile.empty())) {
290 printCommandLineError(
"There is no synchronization rule file but it is required as there is more than one component in the model.");
300 if (values[TIMEMIN] > values[TIMEMAX]) {
316 (
const set<string> & modelFiles,
317 const string & ruleFile,
318 vector<Diades::Automata::ObservableComponent *> & components,
323 for (
const string & name : modelFiles) {
325 if (!components[i]->importDesCompModel(name)) {
328 vectorComp.push_back(components[i]);
331 if (!ruleFile.empty()) {
334 }
catch (exception & e) {
335 log<LgProcess>(
"The readModels function caught the following exception: \n\t%1%") % e.what();
352 const vector<Diades::Automata::ObservableComponent *> components,
353 list<Diades::Automata::Event> & faults) {
355 for (
unsigned i = 0; i < components.size(); ++i) {
356 for (
auto & event : components[i]->events()) {
357 components[i]->setNormal(event);
363 for (
unsigned i = 0; i < components.size(); ++i) {
364 vector<Diades::Automata::Event> candidates;
366 it != components[i]->eventEnd();
369 if (!components[i]->mask().isIdentifiable(*it)) {
370 candidates.push_back(*it);
374 set<unsigned> indexes;
376 for (
const unsigned & index : indexes) {
377 faults.push_back(candidates[index]);
378 components[i]->setFaulty(candidates[index]);
385 set<Diades::Automata::Event> & observables,
386 set<Diades::Automata::Event> & nonObservables,
391 list< pair<time_duration, Diades::Automata::Event> > timedSimulation;
392 back_insert_iterator<list< pair<time_duration, Diades::Automata::Event> > > ii(timedSimulation);
393 timeStamp(simulation.begin(), simulation.end(), seconds(timeMin), seconds(timeMax), ii);
396 cout <<
"TIMED SIMULATION:" << endl;
398 list< pair<time_duration, Diades::Automata::Event> > observableTimedSimulation;
399 for (
const pair<time_duration, Diades::Automata::Event> & occurrence : timedSimulation) {
401 observableTimedSimulation.push_back(make_pair(occurrence.first, occurrence.second));
402 observables.insert(occurrence.second);
405 nonObservables.insert(occurrence.second);
407 cout << occurrence.second <<
" " << occurrence.first.total_seconds() <<
" ";
409 cout <<
"}" << endl << endl;
410 cout <<
"OBSERVABLE PART OF TIMED SIMULATION:" << endl;
412 for (
const pair<time_duration, Diades::Automata::Event> & occurrence : observableTimedSimulation) {
413 cout << occurrence.second <<
" " << occurrence.first.total_seconds() <<
" ";
417 cout <<
"not implemented yet" << endl;
439 set<Diades::Automata::Event> & observables,
440 set<Diades::Automata::Event> & nonObservables,
444 list< Diades::Automata::Event> observations;
447 cout <<
"SIMULATION:" << endl;
448 cout <<
toStream(simulation.begin(), simulation.end()) << endl << endl;
449 cout <<
"OBSERVABLE PART OF SIMULATION:" << endl;
452 observations.push_back(e);
453 observables.insert(e);
456 nonObservables.insert(e);
459 cout <<
toStream(observations.begin(), observations.end());
462 cout <<
"not implemented yet" << endl;
475 const list<Diades::Automata::Event> & simulation,
476 bool faultGeneration,
477 const list<Diades::Automata::Event> & faults,
478 const set<Diades::Automata::Event> & identifiables,
479 const set<Diades::Automata::Event> & nonIdentifiables,
481 const set<Diades::Automata::Event> & events,
483 cout << endl << endl <<
"Size of the scenario: " << simulation.size() << endl;
484 if (faultGeneration) {
485 cout <<
"Number of faults in the model: " << faults.size() << endl;
486 cout <<
"Faults: " <<
toStream(faults.begin(), faults.end()) << endl;
488 cout <<
"Size of the observable scenario: " << nbObs << endl;
489 cout <<
"Non-identifiable events in this scenario: " <<
toStream(nonIdentifiables.begin(), nonIdentifiables.end()) << endl;
490 cout <<
"Identifiable events in this scenario: " <<
toStream(identifiables.begin(), identifiables.end()) << endl;
493 cout <<
"Non-identifiable events that did not occur in this scenario: " 494 <<
toStream(events.begin(), events.end(),
497 cout <<
"Identifiable events that did not occur in this scenario: " 503 vector<unsigned> & values,
504 bool faultGeneration,
505 const list<Diades::Automata::Event> & faults,
506 const set<Diades::Automata::Event> & events,
508 set<Diades::Automata::Event> observables;
509 set<Diades::Automata::Event> nonObservables;
513 values[TIMEMIN], values[
TIMEMAX], nbObs);
518 nonObservables, nbObs, events, mask);
522 const vector<Diades::Automata::ObservableComponent *> components,
525 set<Diades::Automata::Event> & events,
526 list<Diades::Automata::Event> & simulation) {
528 if (components.size() == 1) {
529 mask = components[0]->mask();
530 events = components[0]->events();
533 cout <<
"Failed SIMULATION:" << endl;
534 cout <<
toStream(simulation.begin(), simulation.end());
535 log<LgProcess>(
"The simulation has failed. See the log above.");
541 vector<Diades::Automata::ComposableModel::ConstPointer> comps;
542 vector<const Diades::Automata::ObservableComponent *> comps2;
543 for (
unsigned i = 0; i < components.size(); ++i) {
545 comps2.push_back(components[i]);
551 mask = synchronisedMask;
555 cout <<
"Failed SIMULATION:" << endl;
556 cout <<
toStream(simulation.begin(), simulation.end());
557 log<LgProcess>(
"The simulation has failed. See the log above.");
561 if (model !=
nullptr) {
564 for (
unsigned i = 0; i < components.size(); ++i) {
573 const vector<Diades::Automata::ObservableComponent *> components,
575 const vector<unsigned> & values,
576 const vector< set<string> > & noevents,
578 set<Diades::Automata::Event> & events,
579 list<Diades::Automata::Event> & simulation,
582 if (components.size() == 1) {
583 mask = components[0]->mask();
584 events = components[0]->events();
589 values[
SEED] + simNb, simulation)) {
590 cout <<
"Failed SIMULATION:" << endl;
591 cout <<
toStream(simulation.begin(), simulation.end());
592 log<LgProcess>(
"The simulation has failed. See the log above.");
598 vector<Diades::Automata::ComposableModel::ConstPointer> comps;
599 vector<const Diades::Automata::ObservableComponent *> comps2;
600 for (
unsigned i = 0; i < components.size(); ++i) {
602 comps2.push_back(components[i]);
608 mask = synchronisedMask;
616 cout <<
"Failed SIMULATION:" << endl;
617 cout <<
toStream(simulation.begin(), simulation.end());
618 log<LgProcess>(
"The simulation has failed. See the log above.");
622 if (model !=
nullptr) {
625 for (
unsigned i = 0; i < components.size(); ++i) {
635 const list<Diades::Automata::Event> & simulation,
640 set<Diades::Automata::Event> faults;
641 for (
auto & event : simulation) {
645 found = (
event == it->synchronisedEvent());
650 bool isFaulty =
false;
651 auto it2 = it->beginOfSupport();
652 while (!isFaulty && (it2 != it->endOfSupport())) {
653 isFaulty = it2->isFaulty(it->getAssociatedEvent(it2));
657 faults.insert(event);
660 if (faults.empty()) {
663 for (
auto & event : faults) {
669 for (
auto & event : simulation) {
692 int main(
int argc,
char ** argv) {
693 verbose<VbOutput>(
"DiaDes: Discrete Event System Simulator\n");
694 verbose<VbOutput>(
"LAAS-CNRS, 2006-2017, 7 avenue du Colonel Roche, Toulouse, France\n");
695 verbose<VbOutput>(
"Contact: yannick.pencole@laas.fr\n");
701 set<string> modelFiles;
705 bool faultGeneration =
false;
706 bool interactiveMode =
false;
710 ruleFile, xmlFile, ptaLogFile, faultGeneration, interactiveMode)) {
715 vector<Diades::Automata::ObservableComponent *> components(modelFiles.size(),
nullptr);
717 if (!
readModels(modelFiles, ruleFile, components, rules)) {
722 if (!ptaLogFile.empty()) {
723 file.
open(ptaLogFile);
727 list<Diades::Automata::Event> faults;
728 if (faultGeneration) {
733 for (
unsigned i = 0; i < values[
NBSIM]; ++i) {
736 list<Diades::Automata::Event> simulation;
737 set<Diades::Automata::Event> events;
740 if (interactiveMode) {
748 mask, events, simulation,i)) {
759 faults, events, mask);
761 if (!ptaLogFile.empty()) {
765 if (!ptaLogFile.empty()) {
vector< const Component * > ComponentVector
bool readModels(const set< string > &modelFiles, const string &ruleFile, vector< Diades::Automata::ObservableComponent *> &components, Diades::Automata::ParametrizedSynchronisation &rules)
void writeUntimedSimulation(const list< Diades::Automata::Event > &simulation, const Diades::Automata::ObservableMask &mask, set< Diades::Automata::Event > &observables, set< Diades::Automata::Event > &nonObservables, unsigned &nbObs)
Some utilities to deal with the command line.
InputIterator getFileExtension(const std::basic_string< CharType, CharTraits > &fileName, InputIterator begin, InputIterator end)
unsigned initialiseSeed()
size_t printCommandLineError(const string &msg)
void setVerboseLevel(Diades::Utils::VerboseLevel level)
bool loadSynchronisationRules(const ParametrizedSynchronisation::ComponentVector &models, const string &filename, ParametrizedSynchronisation &sync)
bool readParameters(int argc, char **argv, vector< unsigned > &values, vector< set< string > > &noevents, set< string > &modelFiles, string &ruleFile, string &xmlFile, string &ptaLogFile, bool &faultGeneration, bool &interactiveMode)
vector< string > fileExtensions(numberOfFileExtensions)
void selectNValues(unsigned int min, unsigned int max, unsigned int n, set< unsigned > &result)
void initialiseRandomGenerator()
SynchronisationIterator beginOfSynchronisedEvents() const
IsNotIn< InputIterator > isNotIn(InputIterator first, InputIterator last)
An observable Component defined as a automaton.
bool startNonInteractiveSimulation(const vector< Diades::Automata::ObservableComponent *> components, const Diades::Automata::ParametrizedSynchronisation &rules, const vector< unsigned > &values, const vector< set< string > > &noevents, Diades::Automata::ObservableMask &mask, set< Diades::Automata::Event > &events, list< Diades::Automata::Event > &simulation, unsigned simNb)
void writeSimulation(const list< Diades::Automata::Event > &simulation, vector< unsigned > &values, bool faultGeneration, const list< Diades::Automata::Event > &faults, const set< Diades::Automata::Event > &events, const Diades::Automata::ObservableMask &mask)
const Event & noEvent() const
Random generation utilities.
vector< string > options(numberOfOptions)
void clean(vector< Diades::Automata::ObservableComponent *> &components)
ObservableEventIterator observableBegin() const
void saveLog(Logger logger, ostream &os)
vector< bool > isSet(numberOfOptions, false)
Diades::Utils::ToStream< InputIterator, Diades::Utils::AlwaysTrue< typename InputIterator::reference > > toStream(InputIterator first, InputIterator last)
void writeTimedSimulation(const list< Diades::Automata::Event > &simulation, const Diades::Automata::ObservableMask &mask, set< Diades::Automata::Event > &observables, set< Diades::Automata::Event > &nonObservables, unsigned timeMin, unsigned timeMax, unsigned &nbObs)
SynchronisationIterator endOfSynchronisedEvents() const
int main(int argc, char **argv)
ObservableEventIterator observableEnd() const
bool interactiveSimulation(const ObservableComponent &component, State ¤t, list< Event > &simulation)
void generateFaults(unsigned seed, const vector< Diades::Automata::ObservableComponent *> components, list< Diades::Automata::Event > &faults)
bool simulate(const ObservableComponent &component, const set< string > &absentEvents, unsigned obsMin, unsigned obsMax, unsigned seed, list< Event > &simulation)
bool isObservable(const Event &e) const
const Component & component() const
void timeStamp(InputIterator first, InputIterator last, time_duration min, time_duration max, OutputIterator result)
set< Event >::const_iterator EventIterator
unsigned numberOfFileExtensions
UnaryAnd< Predicate1, Predicate2 > unaryAnd(const Predicate1 &p1, const Predicate2 &p2)
bool isUnobservable(const Event &e) const
void writeFinalPartOfSimulation(const list< Diades::Automata::Event > &simulation, bool faultGeneration, const list< Diades::Automata::Event > &faults, const set< Diades::Automata::Event > &identifiables, const set< Diades::Automata::Event > &nonIdentifiables, unsigned nbObs, const set< Diades::Automata::Event > &events, const Diades::Automata::ObservableMask &mask)
long generateRandomValue(long lower, long upper)
const set< Event > & events() const
bool startInteractiveSimulation(const vector< Diades::Automata::ObservableComponent *> components, const Diades::Automata::ParametrizedSynchronisation &rules, Diades::Automata::ObservableMask &mask, set< Diades::Automata::Event > &events, list< Diades::Automata::Event > &simulation)
void exportLogIntoPtaLogFile(const vector< Diades::Automata::ObservableComponent *> &components, const Diades::Automata::ParametrizedSynchronisation &rules, const list< Diades::Automata::Event > &simulation, const Diades::Automata::ObservableMask &mask, ostream &file)
void printUsage(const po::options_description &desc)