DiaDes  0.1
DIAgnosis of Discrete-Event System
GlobalModel.cc
Go to the documentation of this file.
1 
11 #include<iostream>
12 #include<fstream>
13 #include<list>
14 #include<string>
15 #include<set>
16 
17 #include <boost/date_time/posix_time/posix_time.hpp>
23 #include"FaultDiagnosis.hh"
24 
25 using namespace std;
26 using namespace Diades::Automata;
27 using namespace Diades::Utils;
28 
29 /************************************************************************************/
30 
31 
32 void printUsage();
33 void readParameters(int argc, char * argv[],
34  list<string> & modelFiles);
35 string getSuffix(const string & name);
36 void synchroniseModels(vector<const ObservableComponent *> & components,
37  const ParametrizedSynchronisation & rules);
38 
39 /************************************************************************************/
40 
41 int main(int argc, char * argv[]) {
42  list<string> modelFiles;
43  readParameters(argc, argv, modelFiles);
44  map<string,const ObservableComponent *> sortedComponents;
45  vector<const ObservableComponent *> components;
46 
47 
48 
49 
50  ParametrizedSynchronisation::ComponentVector vectorComp;
51  unsigned nbModel = modelFiles.size() - 1;
52  try {
53  while (nbModel != 0) {
54  ObservableComponent * component = new ObservableComponent();
55  if (component->importDesCompModel(modelFiles.front())) {
56  sortedComponents[component->name()] = component;
57  modelFiles.pop_front();
58  --nbModel;
59  } else {
60  throw (Failure("dd-global-model"));
61  }
62  }
63  for(auto & pair : sortedComponents)
64  {
65  components.push_back(pair.second);
66  vectorComp.push_back(pair.second);
67  }
69  if(!loadSynchronisationRules(vectorComp, modelFiles.front(), rules))
70  {
71  throw (Failure("dd-global-model"));
72  }
73  modelFiles.pop_front();
74 
75  cout << "Start synchronising..." << flush;
76  synchroniseModels(components, rules);
77  cout << "done" << endl;
78 
79 
80  for (vector<const ObservableComponent *>::size_type i = 0;
81  i != components.size();
82  ++i) {
83  if (components[i] != nullptr) {
84  delete components[i];
85  components[i] = nullptr;
86  }
87  }
88  } catch (exception & e) {
89  Diades::Utils::log< Diades::Utils::LgProcess>("global_model has failed, sorry for any inconvience: %1%")
90  % e.what();
91  saveLog(cerr);
92  for (vector<const ObservableComponent *>::size_type i = 0;
93  i != components.size();
94  ++i) {
95  if (components[i] != nullptr) {
96  delete components[i];
97  components[i] = nullptr;
98  }
99  }
100  }
103  return 0;
104 }
105 
106 /*************************************************************************************/
107 
108 void printUsage() {
109 
110  cout << "Usage: global_model file1.des_comp file2.des_comp [file3.des_comp ...] sync.rules" << endl;
111  cout << " Compute the model file1||file2||..." << endl;
112 }
113 
114 /*************************************************************************************/
115 
116 void readParameters(int argc, char * argv[],
117  list<string> & modelFiles) {
118  if (argc < 3) {
119  printUsage();
120  exit(1);
121  }
122 
124  string param = argv[1];
125  int index = 1;
126  int nbModel = 0;
127  while (index < argc) {
128  param = argv[index];
129  string suffix = getSuffix(string(argv[index]));
130  if (suffix == "des_comp") {
131  ++nbModel;
132  modelFiles.push_back(string(argv[index]));
133  ++index;
134  } else {
135  if (suffix == "rules") {
136  modelFiles.push_back(string(argv[index]));
137  ++index;
138  if (index < argc) {
139  printUsage();
140  exit(1);
141  }
142  }
143  }
144  }
145 }
146 
147 /***********************************************************************************/
148 
149 string getSuffix(const string & name) {
150  string::size_type idx = name.rfind('.');
151  if (idx == string::npos) {
152  return "";
153  }
154  return name.substr(idx + 1);
155 }
156 
157 /***********************************************************************************/
158 
159 void synchroniseModels(vector<const ObservableComponent *> & components,
160  const ParametrizedSynchronisation & rules) {
161  vector<ComposableModel::ConstPointer> composableModels;
162  for (vector<const ObservableComponent *>::size_type i = 0;
163  i != components.size();
164  ++i) {
165  composableModels.push_back(new ComposableModel(*components[i], rules));
166  }
167  ObservableComponent result;
168  ComposableModel synchronisation(composableModels, rules, false, &result);
169  //ComposableModel * globalModel = new ComposableModel(composableModels,rules,false);
170  //globalModel->component().exportDesCompModel(globalModel->component().name() + ".des_comp");
171  //delete globalModel;
172 
173  ObservableMask synchronisedMask(rules,components);
174 // for (auto it = rules.beginOfSynchronisedEvents();
175 // it != rules.endOfSynchronisedEvents();
176 // ++it) {
177 // vector<Event> supportObservableEvents;
178 // vector<string> supportCompNames;
179 // vector<const ObservableMask *> supportMasks;
180 // vector<ObservableMask::ObservableEventIterator> positions;
181 // for (auto compIt = it->beginOfComponents();
182 // compIt != it->endOfComponents();
183 // ++compIt) {
184 // SynchronisationEvent::ComponentIterator supportIt =
185 // it->findSupportComponent(*compIt);
186 // if (supportIt != it->endOfSupport()) {
187 // const ObservableMask * mask = masks[supportIt->name()];
188 // if (mask->observableBegin(supportIt.getAssociatedEvent())
189 // != mask->observableEnd(supportIt.getAssociatedEvent())) {
190 // supportCompNames.push_back(supportIt->name());
191 // supportObservableEvents.push_back(supportIt.getAssociatedEvent());
192 // supportMasks.push_back(mask);
193 // positions.push_back(supportMasks.back()->observableBegin(supportObservableEvents.back()));
194 // }
195 // }
196 // }
197 // if (positions.empty()) {
198 // // it->synchronisedEvent() is not observable
199 // synchronisedMask.makeUnobservable(it->synchronisedEvent());
200 // } else {
201 // while (positions[0] != supportMasks[0]->observableEnd(supportObservableEvents[0])) {
202 // Event::Label label;
203 // string comps;
204 // string names;
205 // for (size_t i = 0; i < supportMasks.size(); ++i) {
206 // if (*(positions[i]) != supportMasks[i]->noEvent()) {
207 // if (comps.empty()) {
208 // comps = supportCompNames[i];
209 // names = supportObservableEvents[i].nickname();
210 // } else {
211 // comps = comps + "_" + supportCompNames[i];
212 // names = names + "_" +
213 // supportObservableEvents[i].nickname();
214 // }
215 //
216 // }
217 //
218 // }
219 // if (!comps.empty()) {
220 // Event synchronisedObservableEvent =
221 // EventFactory::factory()->getEvent(comps + "." + names);
222 // synchronisedObservableEvent.setNickname(names);
223 // synchronisedMask.addMask(it->synchronisedEvent(),
224 // synchronisedObservableEvent);
225 // } else {
226 // synchronisedMask.addMask(it->synchronisedEvent(), synchronisedMask.noEvent());
227 // }
228 // size_t index = positions.size() - 1;
229 // ++positions[index];
230 // while ((index > 0) &&
231 // (positions[index] == supportMasks[index]->observableEnd(supportObservableEvents[index]))) {
232 // positions[index] == supportMasks[index]->observableBegin(supportObservableEvents[index]);
233 // --index;
234 // ++positions[index];
235 // }
236 //
237 // }
238 // }
239 //
240 //
241 //
242 //
243 //
244 // }
245  result.setMask(synchronisedMask);
246  result.exportDesCompModel(result.name() + ".des_comp");
247  for (vector<const ObservableComponent *>::size_type i = 0;
248  i != components.size();
249  ++i) {
250  delete composableModels[i];
251  }
252 }
253 
254 
255 /***********************************************************************************/
256 
virtual bool exportDesCompModel(const string &filename) const
string getSuffix(const string &name)
Definition: GlobalModel.cc:149
void setMask(const ObservableMask &mask)
void setVerboseLevel(Diades::Utils::VerboseLevel level)
Definition: Verbose.hh:135
STL namespace.
bool loadSynchronisationRules(const ParametrizedSynchronisation::ComponentVector &models, const string &filename, ParametrizedSynchronisation &sync)
static void destroyEvents()
An observable Component defined as a automaton.
virtual bool importDesCompModel(const string &filename)
void synchroniseModels(vector< const ObservableComponent *> &components, const ParametrizedSynchronisation &rules)
Definition: GlobalModel.cc:159
const string & name() const
Definition: Component.hh:256
int main(int argc, char *argv[])
Definition: GlobalModel.cc:41
void saveLog(Logger logger, ostream &os)
Definition: Log.hh:163
void printUsage()
Definition: GlobalModel.cc:108
void readParameters(int argc, char *argv[], list< string > &modelFiles)
Definition: GlobalModel.cc:116