DiaDes  0.1
DIAgnosis of Discrete-Event System
Synchronize.cc
Go to the documentation of this file.
1 
12 #include <cstdlib>
13 #include<iostream>
14 #include<fstream>
15 #include<regex>
16 #include<boost/program_options.hpp>
17 
23 #include"../AutomataInterface.hh"
26 
27 using namespace std;
28 using namespace Diades::Automata::Experimental;
29 using namespace Diades::Utils;
30 using namespace Diades::CmdInterface;
31 
32 namespace Poptions = boost::program_options;
33 
34 
35 
40 const string program("dd-synchronize");
41 
42 /*
43  * File suffixes
44  */
45 FileSuffixes suffixes({"ddaut", "ddsync"});
46 
54 void
55 initialiseOptions(int argc, char * argv[],
56  Poptions::options_description & desc,
57  Poptions::variables_map & vm)
58 {
59  desc.add_options()
60  ("help,h", "produce help message")
61  ("file,f", Poptions::value< std::vector<string> >(), "automaton files (.ddaut format)")
62  ("output,o", Poptions::value< string >(), "outfile name (.ddaut format)")
63  ("rules,r", Poptions::value<string>(), "synchronisation rule file (.ddsync)")
64  ;
65  Poptions::positional_options_description p;
66  // 10000 means that The command line can accept 10000 file names as positional options :-)
67  p.add("file", 10000);
68  Poptions::store(Poptions::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
69  Poptions::notify(vm);
70 }
71 
72 
77 
86 size_t
87 synchroniseDdAut(const std::vector<std::string> & fileNames, const std::string & rulesName,
88  const std::string & output)
89 {
91  DdAutParamSynchro synchro;
92  std::vector<DdAutFA> automata;
93  std::vector<Ptr<DdAutFA>::ConstP> components;
94  std::vector<DdAutStateManager> stateManagers;
95  std::vector<Ptr<DdAutStateManager>::ConstP> pstateManagers;
96  std::vector<DdAutEventManager> eventManagers;
97  automata.reserve(fileNames.size());
98  stateManagers.reserve(fileNames.size());
99  eventManagers.reserve(fileNames.size());
100  auto it = fileNames.begin();
101  while(it != fileNames.end())
102  {
103  ifstream file(it->c_str());
104  if(file.is_open())
105  {
106  automata.emplace_back();
107  stateManagers.emplace_back();
108  pstateManagers.push_back(Ptr<DdAutStateManager>::get(stateManagers.back()));
109  eventManagers.emplace_back();
110  components.push_back(Ptr<DdAutFA>::get(automata.back()));
111 
112 
113  if(!faFromDdAutFile(file,
114  ManagedDdAutFA(automata.back(),
115  stateManagers.back(),
116  eventManagers.back())))
117  {
118  return printCommandLineError(Msg("Error when loading the automaton file %1%") % *it);
119  }
120  automata.back().setId(automata.size());
121  }
122  else
123  {
124  return printCommandLineError(Msg("Error when opening the automaton file %1%") % *it);
125  }
126  ++it;
127  }
128 
129 
130 
131  ifstream rulefile(rulesName.c_str());
132  if(!rulefile.is_open())
133  {
134  return printCommandLineError(Msg("Error when opening the synchronisation rule file %1%") % rulesName);
135  }
136  DdSyncDescriptor descriptor;
137  std::string errorMsg;
138  if(!descriptor.readStream(rulefile, errorMsg))
139  {
140  return printCommandLineError(Msg("Error when loading the synchronisation rule file %1%: %2%")
141  % rulesName % errorMsg);
142  }
143 
144  if(!synchro.init(components))
145  {
146  return printCommandLineError(Msg("Error when initialising the synchronisation rules with the set of loaded automata"));
147  }
148  if(!descriptorToRules(descriptor, synchro, errorMsg))
149  {
150  return printCommandLineError(Msg("Error when setting the synchronisation rules with respect to the set of loaded automata: \n errors are %1%")
151  % errorMsg);
152  }
153  SynchronisationRulesEncoder<DdAutParamSynchro,
155 
156  DdAutEventManager syncEventManager;
157  generateSynchronisedDdAutEventLabels(synchro, eventManagers, syncEventManager);
158 
159 
160  DdAutStateManager syncStateManager;
161  DdAutFA synchronisation;
167  DdAutConjunction> creator(components, pstateManagers, syncStateManager);
168  std::vector<std::string> names;
169  std::for_each(automata.begin(), automata.end(), [&](const DdAutFA & automaton)
170  {
171  names.push_back(automaton.name()); });
172 
173  if(!synchronize(components,
174  synchro,
175  synchronisation,
176  creator))
177  {
178  return printCommandLineError(Msg("Error when computing the synchronisation, check all your inputs..."));
179  }
180  synchronisation.setName(DdAutSynchronisation()(names.begin(), names.end()));
181 
182  return writeFiniteAutomaton({synchronisation, syncStateManager, syncEventManager}, output, suffixes);
183 }
184 
193 size_t
194 synchroniseFsm(const std::vector<std::string> & fileNames, const std::string & rulesName,
195  const std::string & output)
196 {
197  if(fileNames.empty())
198  {
199  return printCommandLineError(Msg("Expecting a list of filenames but I did not get anything. Use dd-synchronize --help for documentation."));
200  }
201  bool isDdAut = true;
202  std::for_each(fileNames.begin(), fileNames.end(),
203  [&](const string & name)
204  {
205  isDdAut &= suffixes.match(name, "ddaut");
206  }
207  );
208  if(!isDdAut)
209  {
210  return printCommandLineError(Msg("Expecting a list of filenames with a name ending with .ddaut: check in the following list %1%")
211  % toStream(fileNames.begin(), fileNames.end()));
212  }
213  if(rulesName.empty())
214  {
215  return printCommandLineError(Msg("No file with synchronisation rules have been found. Use dd-synchronize --help for documentation."));
216  }
217  if(!suffixes.match(rulesName, "ddsync"))
218  {
219  return printCommandLineError(Msg("The synchronisation file does not have a 'ddsync' suffix. I read %1%. Use dd-synchronize --help for documentation.") % rulesName);
220  }
221 
222  if(!output.empty() && !suffixes.match(output, "ddaut"))
223  {
224  return printCommandLineError(Msg("I am expecting a .ddaut format as output but I read %1%")
225  % output);
226  }
227  else
228  {
229  return synchroniseDdAut(fileNames, rulesName, output);
230  }
231 
233 }
234 
241 int
242 main(int argc, char** argv)
243 {
244  std::string rulesName, output;
245  std::vector<std::string> fileNames;
246  try
247  {
248  Poptions::options_description desc("Options");
249  Poptions::variables_map vm;
250  initialiseOptions(argc, argv, desc, vm);
251  if(vm.count("help"))
252  {
253  return printUsage(program, desc);
254  }
255  if(vm.count("file"))
256  {
257  fileNames = vm["file"].as<std::vector < std::string >> ();
258  }
259  if(vm.count("output"))
260  {
261  output = vm["output"].as<std::string>();
262  }
263  if(vm.count("rules"))
264  {
265  rulesName = vm["rules"].as<std::string > ();
266  }
267 
268  }
269  catch(Poptions::required_option & e)
270  {
271  return printCommandLineError(e.what());
272  }
273  catch(Poptions::error & e)
274  {
275  return printCommandLineError(e.what());
276  }
277  return synchroniseFsm(fileNames, rulesName, output);
278 }
279 
280 
bool synchronize(const std::vector< typename Ptr< Fsm >::ConstP > &components, const SynchronisationRules< Fsm > &rules, Fsm &synchronisation, StateCreator &creator)
Definition: Synchronize.hh:36
StatePropertyManager< DdAutStateLabel, DdAutStateId > DdAutStateManager
Definition: DdAutFile.hh:63
virtual bool readStream(std::istream &stream, std::string &error)
size_t writeFiniteAutomaton(const Diades::Automata::Experimental::ConstManagedDdAutFA &mfa, const std::string &output, const FileSuffixes &suffixes)
size_t synchroniseFsm(const std::vector< std::string > &fileNames, const std::string &rulesName, const std::string &output)
Definition: Synchronize.cc:194
bool descriptorToRules(const DdSyncDescriptor &desc, ParametrizedSynchronisation< DdAutFsmType > &rules, std::string &errorMsg)
const size_t ERROR_UNHANDLED_EXCEPTION
Definition: CmdInterface.hh:35
size_t printCommandLineError(const string &msg)
Definition: CmdInterface.cc:98
void initialiseOptions(int argc, char *argv[], Poptions::options_description &desc, Poptions::variables_map &vm)
Definition: Synchronize.cc:55
STL namespace.
data structure that gathers an FA, a StateManager and a EventManager
Definition: DdAutFile.hh:115
bool faFromDdAutFile(std::istream &stream, const ManagedDdAutFA &mFa)
vector< string > options(numberOfOptions)
const string program("dd-synchronize")
bool generateSynchronisedDdAutEventLabels(const SynchronisationRules< DdAutFsmType > &synchro, const std::vector< DdAutEventManager > &eventManagers, DdAutEventManager &syncEventManager)
Definition: DdAutFile.hh:432
bool match(const std::string &fileName, const std::string &suffix) const
Definition: CmdInterface.cc:54
const string & setName(const string &name)
size_t synchroniseDdAut(const std::vector< std::string > &fileNames, const std::string &rulesName, const std::string &output)
Definition: Synchronize.cc:87
Diades::Utils::ToStream< InputIterator, Diades::Utils::AlwaysTrue< typename InputIterator::reference > > toStream(InputIterator first, InputIterator last)
Definition: Verbose.hh:143
int main(int argc, char **argv)
Definition: Synchronize.cc:242
FileSuffixes suffixes({"ddaut", "ddsync"})
EventManager< DdAutEventLabel, DdAutEventId > DdAutEventManager
Definition: DdAutFile.hh:68
Diades::Utils::Conjunction< DdAutEventLabel, DdAutAmpersand, Diades::Utils::NoDelimiter< char, std::char_traits< char >, std::allocator< char > >> DdAutSynchronisation
Definition: DdAutFile.hh:208
StateMachine< DdAutStateId, DdAutEventId > DdAutFsm
Definition: DdAutFile.hh:42
boost::format Msg
Definition: Verbose.hh:42
void printUsage(const po::options_description &desc)