DiaDes  0.1
DIAgnosis of Discrete-Event System
Minimize.cc
Go to the documentation of this file.
1 
10 #include <cstdlib>
11 #include<iostream>
12 #include<fstream>
13 #include<regex>
14 #include<boost/program_options.hpp>
15 
23 #include"../AutomataInterface.hh"
24 
25 using namespace std;
26 using namespace Diades::Automata::Experimental;
27 using namespace Diades::Utils;
28 using namespace Diades::CmdInterface;
29 
30 namespace Poptions = boost::program_options;
31 
32 
33 
38 const string program("dd-minimize");
39 
40 /*
41  * File suffixes
42  */
43 FileSuffixes suffixes({"aut", "ddaut"});
44 
52 void
53 initialiseOptions(int argc, char * argv[],
54  Poptions::options_description & desc,
55  Poptions::variables_map & vm)
56 {
57  desc.add_options()
58  ("help,h", "produce help message")
59  ("file,f", Poptions::value< string >(), "automaton file (.aut/.ddaut format)")
60  ("output,o", Poptions::value< string >(), "outfile name (.aut/.ddaut format)");
61  Poptions::positional_options_description p;
62  p.add("file", 1);
63  Poptions::store(Poptions::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
64  Poptions::notify(vm);
65 }
66 
67 
73 
81 size_t
82 minimizeAut(const std::string & fileName, const std::string & output)
83 {
84 
85  AutFsm fsm;
86  ifstream file(fileName.c_str());
87  if(file.is_open())
88  {
89  auto loaded = fromAutFile(file, fsm);
90  file.close();
91  if(!loaded)
92  {
93  return printCommandLineError(Msg("Error when loading the automaton file %1%") % fileName);
94  }
95  }
96  else
97  {
98  return printCommandLineError(Msg("Error when opening the automaton file %1%") % fileName);
99  }
100  AutFsm minimalFsm;
101  if(!isDeterministic(fsm))
102  {
103  AutFsm detFsm;
104  AutStateCreator detCreator(fsm, detFsm);
105  determine(fsm,
106  detFsm,
107  detCreator);
108  AutStateCreator creator(detFsm, minimalFsm);
109  minimize(detFsm,
110  minimalFsm,
111  creator);
112  }
113  else
114  {
115  AutStateCreator creator(fsm, minimalFsm);
116  minimize(fsm,
117  minimalFsm,
118  creator);
119  }
120 
121  return writeAut(minimalFsm, output, suffixes);
122 }
123 
131 size_t
132 minimizeDdaut(const std::string & fileName, const std::string & output)
133 {
134 
135  DdAutFileDescriptor descriptor;
136  DdAutEventManager eManager;
137  DdAutStateManager sManager;
138  DdAutStateManager sManagerMin;
139  ifstream file(fileName.c_str());
140  if(file.is_open())
141  {
142  auto loaded = descriptor.readStream(file);
143  file.close();
144  if(!loaded)
145  {
146  return printCommandLineError(Msg("Error when loading the 'ddaut' automaton file %1%") % fileName);
147  }
148  }
149  else
150  {
151  return printCommandLineError(Msg("Error when opening the 'ddaut' automaton file %1%") % fileName);
152  }
153  if(descriptor.acceptorBegin() != descriptor.acceptorEnd())
154  {
155  DdAutFA fa;
156  DdAutFA minimalFA;
157  bool result = faFromDescriptor(descriptor, fa, sManager, eManager);
158  if(!result)
159  {
160  return printCommandLineError(Msg("Error when loading the ddaut descriptor of file %1% in a finite automaton") % fileName);
161  }
162  if(!isDeterministic(fa))
163  {
164  DdAutFA detFA;
165 
166  DdAutStateManager sManagerDet;
167  ManagedBeliefStateBasedStateCreator<DdAutFA, DdAutDisjunction> detCreator(fa, detFA, sManager, sManagerDet);
168  determine(fa,
169  detFA,
170  detCreator);
171  ManagedBeliefStateBasedStateCreator<DdAutFA, DdAutDisjunction> creator(detFA, minimalFA, sManagerDet, sManagerMin);
172  minimize(detFA,
173  minimalFA,
174  creator);
175  }
176  else
177  {
178  ManagedBeliefStateBasedStateCreator<DdAutFA, DdAutDisjunction> creator(fa, minimalFA, sManager, sManagerMin);
179  minimize(fa,
180  minimalFA,
181  creator);
182  }
183  return writeFiniteAutomaton({minimalFA, sManagerMin, eManager}, output, suffixes);
184  }
185  else
186  {
187  DdAutFsm fsm;
188  DdAutFsm minimalFsm;
189  bool result = fsmFromDescriptor(descriptor, fsm, sManager, eManager);
190  if(!result)
191  {
192  return printCommandLineError(Msg("Error when loading the ddaut descriptor of file %1% in a finite machine") % fileName);
193  }
194  if(!isDeterministic(fsm))
195  {
196  DdAutFsm detFsm;
197 
198  DdAutStateManager sManagerDet;
199  ManagedBeliefStateBasedStateCreator<DdAutFsm, DdAutDisjunction> detCreator(fsm, detFsm, sManager, sManagerDet);
200  determine(fsm,
201  detFsm,
202  detCreator);
203  ManagedBeliefStateBasedStateCreator<DdAutFsm, DdAutDisjunction> creator(detFsm, minimalFsm, sManagerDet, sManagerMin);
204  minimize(detFsm,
205  minimalFsm,
206  creator);
207  }
208  else
209  {
210  ManagedBeliefStateBasedStateCreator<DdAutFsm, DdAutDisjunction> creator(fsm, minimalFsm, sManager, sManagerMin);
211  minimize(fsm,
212  minimalFsm,
213  creator);
214  }
215  return writeFiniteStateMachine({minimalFsm, sManagerMin, eManager}, output, suffixes);
216  }
217  return false;
218 }
219 
227 size_t
228 minimizeFsm(const std::string & fileName, const std::string & output)
229 {
230 
231  if(suffixes.match(fileName, "aut"))
232  {
233  return minimizeAut(fileName, output);
234  }
235  else
236  {
237  if(suffixes.match(fileName, "ddaut"))
238  {
239  return minimizeDdaut(fileName, output);
240  }
241  else
242  {
243  return printCommandLineError(Msg("Expecting a file with a name ending with .aut, but I read %1%") % fileName);
244  }
245  }
247 }
248 
255 int
256 main(int argc, char** argv)
257 {
258  std::string fileName, output;
259  try
260  {
261  Poptions::options_description desc("Options");
262  Poptions::variables_map vm;
263  initialiseOptions(argc, argv, desc, vm);
264  if(vm.count("help"))
265  {
266  return printUsage(program, desc);
267  }
268  if(vm.count("file"))
269  {
270  fileName = vm["file"].as<std::string>();
271  }
272  if(vm.count("output"))
273  {
274  output = vm["output"].as<std::string>();
275  }
276  }
277  catch(Poptions::required_option & e)
278  {
279  return printCommandLineError(e.what());
280  }
281  catch(Poptions::error & e)
282  {
283  return printCommandLineError(e.what());
284  }
285  return minimizeFsm(fileName, output);
286 }
287 
const string program("dd-minimize")
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 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)
STL namespace.
size_t minimizeFsm(const std::string &fileName, const std::string &output)
Definition: Minimize.cc:228
vector< string > options(numberOfOptions)
FileSuffixes suffixes({"aut", "ddaut"})
void determine(const Fsm &machine, Fsm &deterministicMachine, StateCreator &creator)
Definition: Determine.hh:65
bool match(const std::string &fileName, const std::string &suffix) const
Definition: CmdInterface.cc:54
int main(int argc, char **argv)
Definition: Minimize.cc:256
size_t minimizeAut(const std::string &fileName, const std::string &output)
Definition: Minimize.cc:82
void minimize(const Fsm &machine, Fsm &minimalMachine, StateCreator &creator)
Definition: Minimize.hh:336
size_t writeFiniteStateMachine(const Diades::Automata::Experimental::ConstManagedDdAutFsm &mfsm, const std::string &output, const FileSuffixes &suffixes)
EventManager< DdAutEventLabel, DdAutEventId > DdAutEventManager
Definition: DdAutFile.hh:68
bool isDeterministic(const Fsm &machine)
Definition: Determine.hh:35
bool fromAutFile(std::istream &stream, AutFsm &fsm)
StateMachine< DdAutStateId, DdAutEventId > DdAutFsm
Definition: DdAutFile.hh:42
size_t minimizeDdaut(const std::string &fileName, const std::string &output)
Definition: Minimize.cc:132
boost::format Msg
Definition: Verbose.hh:42
void initialiseOptions(int argc, char *argv[], Poptions::options_description &desc, Poptions::variables_map &vm)
Definition: Minimize.cc:53
virtual bool readStream(std::istream &stream)
void printUsage(const po::options_description &desc)