DiaDes  0.1
DIAgnosis of Discrete-Event System
Insert.cc
Go to the documentation of this file.
1 
12 #include<fstream>
13 #include<boost/program_options.hpp>
19 #include"../AutomataInterface.hh"
20 using namespace std;
21 using namespace Diades::Automata::Experimental;
22 using namespace Diades::Utils;
23 using namespace Diades::CmdInterface;
24 
25 namespace Poptions = boost::program_options;
26 
27 
28 
33 const string program("dd-insert");
34 const string briefcomment(": this program gathers a set of automata as a unique automaton (raw insertion).");
35 /*
36  * File suffixes
37  */
38 FileSuffixes suffixes({"ddaut", "aut"});
39 
47 void
48 initialiseOptions(int argc, char * argv[],
49  Poptions::options_description & desc,
50  Poptions::variables_map & vm)
51 {
52  desc.add_options()
53  ("help,h", "produce help message")
54  ("file,f", Poptions::value< std::vector<string> >(), "automaton files (.ddaut/.aut format)")
55  ("output,o", Poptions::value< string >(), "outfile name (.ddaut/.aut format)")
56  ;
57  Poptions::positional_options_description p;
58  // 10000 means that The command line can accept 10000 file names as positional options :-)
59  p.add("file", 10000);
60  Poptions::store(Poptions::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
61  Poptions::notify(vm);
62 }
63 
64 
69 
70 
72 
73 
81 size_t
82 insertAuts(const std::vector<std::string> & fileNames,
83  const std::string & output)
84 {
85 
86  AutFsm result;
87  std::vector<AutFsm> automata;
89  automata.reserve(fileNames.size());
90  auto it = fileNames.begin();
91  while(it != fileNames.end())
92  {
93  ifstream file(it->c_str());
94  if(file.is_open())
95  {
96  automata.emplace_back();
97  auto loaded = fromAutFile(file, automata.back());
98  file.close();
99  if(!loaded)
100  {
101  return printCommandLineError(Msg("Error when loading the automaton file %1%") % *it);
102  }
103  }
104  else
105  {
106  return printCommandLineError(Msg("Error when opening the automaton file %1%") % *it);
107  }
108  ++it;
109  }
110  insertAutFsms(RangeAut(automata.begin(), automata.end()), result);
111  return writeAut(result, output, suffixes);
112 }
113 
114 
115 
122 size_t
123 insertDdAuts(const std::vector<std::string> & fileNames,
124  const std::string & output)
125 {
126  DdAutFA result;
127  DdAutStateManager stateManager;
128  DdAutEventManager eventManager;
129  std::vector<DdAutFA> automata;
130  std::vector<DdAutStateManager> stateManagers;
131  std::vector<DdAutEventManager> eventManagers;
132  using RangeDdAutFA = Range<std::vector<DdAutFA>::const_iterator>;
135 
136 
137 
138  automata.reserve(fileNames.size());
139  stateManagers.reserve(fileNames.size());
140  eventManagers.reserve(fileNames.size());
141 
142  auto it = fileNames.begin();
143  while(it != fileNames.end())
144  {
145  ifstream file(it->c_str());
146  if(file.is_open())
147  {
148  automata.emplace_back();
149  stateManagers.emplace_back();
150  eventManagers.emplace_back();
151  if(!faFromDdAutFile(file, {automata.back(),
152  stateManagers.back(),
153  eventManagers.back()}))
154  {
155  return printCommandLineError(Msg("Error when loading the automaton file %1%") % *it);
156  }
157  }
158  ++it;
159  }
160  insertFiniteAutomata(RangeDdAutFA(automata.begin(), automata.end()),
161  RangeDdAutSM(stateManagers.begin(),stateManagers.end()),
162  RangeDdAutEM(eventManagers.begin(),eventManagers.end()),
163  result,
164  stateManager,
165  eventManager);
166  return writeFiniteAutomaton({result, stateManager, eventManager}, output, suffixes);
167 }
168 
169 
170 
178 size_t
179 insertFsms(const std::vector<std::string> & fileNames,
180  const std::string & output)
181 {
182  if(fileNames.empty())
183  {
184  return printCommandLineError(Msg("Expecting a list of filenames but I did not get anything. Use %1% --help for documentation.") % program);
185  }
186  bool isDdAut = true;
187  bool isAut = true;
188  std::for_each(fileNames.begin(), fileNames.end(),
189  [&](const string & name)
190  {
191  isDdAut &= suffixes.match(name, "ddaut");
192  isAut &= suffixes.match(name, "aut");
193  }
194  );
195  if(!isDdAut && !isAut)
196  {
197  return printCommandLineError(Msg("Expecting a list of filenames with a name all ending either with .ddaut or with .aut: check in the following list %1%")
198  % toStream(fileNames.begin(), fileNames.end()));
199  }
200  if(isAut)
201  {
202  if(!output.empty() && !suffixes.match(output, "aut"))
203  {
204  return printCommandLineError(Msg("As the input files are 'aut' files, I am expecting a .aut format as output but I read %1%")
205  % output);
206  }
207 
208 
209  return insertAuts(fileNames, output);
210  }
211  if(isDdAut)
212  {
213  if(!output.empty() && !suffixes.match(output, "ddaut"))
214  {
215  return printCommandLineError(Msg("As the input files are 'ddaut' files, I am expecting a .ddaut format as output but I read %1%")
216  % output);
217  }
218  return insertDdAuts(fileNames, output);
219  }
220 
222 }
223 
230 int
231 main(int argc, char** argv)
232 {
233  std::string output;
234  std::vector<std::string> fileNames;
235  try
236  {
237  Poptions::options_description desc("Options");
238  Poptions::variables_map vm;
239  initialiseOptions(argc, argv, desc, vm);
240  if(vm.count("help"))
241  {
242  return printUsage(program + briefcomment, desc);
243  }
244  if(vm.count("file"))
245  {
246  fileNames = vm["file"].as<std::vector < std::string >> ();
247  }
248  if(vm.count("output"))
249  {
250  output = vm["output"].as<std::string>();
251  }
252  }
253  catch(Poptions::required_option & e)
254  {
255  return printCommandLineError(e.what());
256  }
257  catch(Poptions::error & e)
258  {
259  return printCommandLineError(e.what());
260  }
261  return insertFsms(fileNames, output);
262 }
263 
264 
size_t insertFsms(const std::vector< std::string > &fileNames, const std::string &output)
Definition: Insert.cc:179
size_t writeAut(const Diades::Automata::Experimental::AutFsm &fsm, const std::string &output, const FileSuffixes &suffixes)
FileSuffixes suffixes({"ddaut", "aut"})
bool insertFiniteAutomata(DdAutFARange faRange, RangeDdAutSM smRange, RangeDdAutEM evRange, DdAutFA &result, DdAutStateManager &targetStateManager, DdAutEventManager &targetEventManager)
Definition: DdAutFile.hh:493
int main(int argc, char **argv)
Definition: Insert.cc:231
StatePropertyManager< DdAutStateLabel, DdAutStateId > DdAutStateManager
Definition: DdAutFile.hh:63
const string briefcomment(": this program gathers a set of automata as a unique automaton (raw insertion).")
size_t writeFiniteAutomaton(const Diades::Automata::Experimental::ConstManagedDdAutFA &mfa, const std::string &output, const FileSuffixes &suffixes)
const size_t ERROR_UNHANDLED_EXCEPTION
Definition: CmdInterface.hh:35
size_t printCommandLineError(const string &msg)
Definition: CmdInterface.cc:98
STL namespace.
bool faFromDdAutFile(std::istream &stream, const ManagedDdAutFA &mFa)
vector< string > options(numberOfOptions)
void initialiseOptions(int argc, char *argv[], Poptions::options_description &desc, Poptions::variables_map &vm)
Definition: Insert.cc:48
const string program("dd-insert")
bool match(const std::string &fileName, const std::string &suffix) const
Definition: CmdInterface.cc:54
size_t insertAuts(const std::vector< std::string > &fileNames, const std::string &output)
Definition: Insert.cc:82
bool insertAutFsms(AutFsmRange range, AutFsm &output)
Definition: AutFile.hh:270
Diades::Utils::ToStream< InputIterator, Diades::Utils::AlwaysTrue< typename InputIterator::reference > > toStream(InputIterator first, InputIterator last)
Definition: Verbose.hh:143
EventManager< DdAutEventLabel, DdAutEventId > DdAutEventManager
Definition: DdAutFile.hh:68
size_t insertDdAuts(const std::vector< std::string > &fileNames, const std::string &output)
Definition: Insert.cc:123
bool fromAutFile(std::istream &stream, AutFsm &fsm)
StateMachine< DdAutStateId, DdAutEventId > DdAutFsm
Definition: DdAutFile.hh:42
boost::format Msg
Definition: Verbose.hh:42
void printUsage(const po::options_description &desc)