DiaDes  0.1
DIAgnosis of Discrete-Event System
Complete.cc
Go to the documentation of this file.
1 
15 #include <cstdlib>
16 #include<iostream>
17 #include<fstream>
18 #include<regex>
19 #include<boost/program_options.hpp>
20 
28 #include"../AutomataInterface.hh"
29 
30 using namespace std;
31 using namespace Diades::Automata::Experimental;
32 using namespace Diades::Utils;
33 using namespace Diades::CmdInterface;
34 
35 namespace Poptions = boost::program_options;
36 
37 
38 
43 const string program("dd-complete");
44 
45 /*
46  * File suffixes
47  */
48 FileSuffixes suffixes({"aut","ddaut"});
49 
50 
58 void initialiseOptions(int argc, char * argv[],
59  Poptions::options_description & desc,
60  Poptions::variables_map & vm)
61 {
62  desc.add_options()
63  ("help,h", "produce help message")
64  ("file,f", Poptions::value< string >(), "automaton file (.aut/.ddaut format)")
65  ("output,o", Poptions::value< string >(), "outfile name (.aut/.ddaut format)");
66  Poptions::positional_options_description p;
67  p.add("file", 1);
68  Poptions::store(Poptions::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
69  Poptions::notify(vm);
70 }
71 
72 
78 
79 
80 
81 
82 
90 size_t completeAut(const std::string & fileName, const std::string & output)
91 {
92 
93  AutFsm fsm;
94  ifstream file(fileName.c_str());
95  if(file.is_open())
96  {
97  auto loaded = fromAutFile(file, fsm);
98  file.close();
99  if(!loaded)
100  {
101  return printCommandLineError(Msg("Error when loading the automaton file %1%")%fileName);
102  }
103  }
104  else
105  {
106  return printCommandLineError(Msg("Error when opening the automaton file %1%")%fileName);
107  }
108  complete(fsm);
109  return writeAut(fsm,output,suffixes);
110 }
111 
119 size_t completeDdaut(const std::string & fileName, const std::string & output)
120 {
121  DdAutFileDescriptor descriptor;
122  DdAutEventManager eManager;
123  DdAutStateManager sManager;
124 
125  ifstream file(fileName.c_str());
126  if(file.is_open())
127  {
128  auto loaded = descriptor.readStream(file);
129  file.close();
130  if(!loaded)
131  {
132  return printCommandLineError(Msg("Error when loading the 'ddaut' automaton file %1%")%fileName);
133  }
134  }
135  else
136  {
137  return printCommandLineError(Msg("Error when opening the 'ddaut' automaton file %1%")%fileName);
138  }
139  if (descriptor.acceptorBegin()!=descriptor.acceptorEnd())
140  {
141  // it is a finite automaton
142  DdAutFA fa;
143  bool result = faFromDescriptor(descriptor,fa, sManager, eManager);
144  if(!result)
145  {
146  return printCommandLineError(Msg("Error when converting the DdAutFileDescriptor from %1% to a Finite Automaton")%fileName);
147  }
148  complete(fa);
149  return writeFiniteAutomaton({fa,sManager,eManager},output,suffixes);
150  }
151  else
152  {
153  // it is a finite state machine
154  DdAutFsm fsm;
155  bool result = fsmFromDescriptor(descriptor,fsm, sManager, eManager);
156  if(!result)
157  {
158  return printCommandLineError(Msg("Error when converting the DdAutFileDescriptor from %1% to a Finite State Machine")%fileName);
159  }
160  complete(fsm);
161  return writeFiniteStateMachine({fsm,sManager,eManager},output,suffixes);
162  }
163  return false;
164 }
165 
166 
174 size_t completeFsm(const std::string & fileName, const std::string & output)
175 {
176 
177  if (suffixes.match(fileName, "aut")) {
178  return completeAut(fileName,output);
179  }
180  else
181  {
182  if(suffixes.match(fileName, "ddaut"))
183  {
184  return completeDdaut(fileName,output);
185  }
186  else
187  {
188  return printCommandLineError(Msg("Expecting a file with a name ending with .aut, but I read %1%") % fileName);
189  }
190  }
192 }
193 
194 
195 
196 
197 
204 int main(int argc, char** argv)
205 {
206  std::string fileName, output;
207  try
208  {
209  Poptions::options_description desc("Options");
210  Poptions::variables_map vm;
211  initialiseOptions(argc, argv, desc, vm);
212  if(vm.count("help"))
213  {
214  return printUsage(program,desc);
215  }
216  if(vm.count("file"))
217  {
218  fileName = vm["file"].as<std::string>();
219  }
220  if(vm.count("output"))
221  {
222  output = vm["output"].as<std::string>();
223  }
224  }
225  catch(Poptions::required_option & e)
226  {
227  return printCommandLineError(e.what());
228  }
229  catch(Poptions::error & e)
230  {
231  return printCommandLineError(e.what());
232  }
233  return completeFsm(fileName,output);
234 }
235 
size_t writeAut(const Diades::Automata::Experimental::AutFsm &fsm, const std::string &output, const FileSuffixes &suffixes)
StateMachine< AutStateId, AutEventId > AutFsm
Definition: AutFile.hh:45
StatePropertyManager< DdAutStateLabel, DdAutStateId > DdAutStateManager
Definition: DdAutFile.hh:63
size_t completeAut(const std::string &fileName, const std::string &output)
Definition: Complete.cc:90
void complete(Fsm &machine)
Definition: Complete.hh:58
size_t writeFiniteAutomaton(const Diades::Automata::Experimental::ConstManagedDdAutFA &mfa, const std::string &output, const FileSuffixes &suffixes)
bool fsmFromDescriptor(const DdAutFileDescriptor &descriptor, DdAutFsm &fsm, DdAutStateManager &sManager, DdAutEventManager &eManager)
const size_t ERROR_UNHANDLED_EXCEPTION
Definition: CmdInterface.hh:35
size_t printCommandLineError(const string &msg)
Definition: CmdInterface.cc:98
bool faFromDescriptor(const DdAutFileDescriptor &descriptor, DdAutFA &fa, DdAutStateManager &sManager, DdAutEventManager &eManager)
int main(int argc, char **argv)
Definition: Complete.cc:204
size_t completeDdaut(const std::string &fileName, const std::string &output)
Definition: Complete.cc:119
size_t completeFsm(const std::string &fileName, const std::string &output)
Definition: Complete.cc:174
STL namespace.
vector< string > options(numberOfOptions)
bool match(const std::string &fileName, const std::string &suffix) const
Definition: CmdInterface.cc:54
void initialiseOptions(int argc, char *argv[], Poptions::options_description &desc, Poptions::variables_map &vm)
Definition: Complete.cc:58
size_t writeFiniteStateMachine(const Diades::Automata::Experimental::ConstManagedDdAutFsm &mfsm, const std::string &output, const FileSuffixes &suffixes)
EventManager< DdAutEventLabel, DdAutEventId > DdAutEventManager
Definition: DdAutFile.hh:68
FileSuffixes suffixes({"aut","ddaut"})
bool fromAutFile(std::istream &stream, AutFsm &fsm)
StateMachine< DdAutStateId, DdAutEventId > DdAutFsm
Definition: DdAutFile.hh:42
boost::format Msg
Definition: Verbose.hh:42
const string program("dd-complete")
virtual bool readStream(std::istream &stream)
void printUsage(const po::options_description &desc)