DiaDes  0.1
DIAgnosis of Discrete-Event System
AutFile.hh
Go to the documentation of this file.
1 
9 #ifndef __DIADES__AUTOMATA__EXPERIMENTAL__AUTFILE__HH__
10 #define __DIADES__AUTOMATA__EXPERIMENTAL__AUTFILE__HH__
11 
12 #include <istream>
13 #include <string>
14 #include <unordered_set>
15 #include <diades/utils/Label.hh>
22 #include <diades/utils/Range.hh>
24 
25 namespace Diades
26 {
27  namespace Automata
28  {
29  namespace Experimental
30  {
35 
39  using AutEventId = std::string;
40 
41 
46 
53  template<typename Fsm>
54  bool
55  autFsmNeedEncoding(const Fsm & fsm)
56  {
57  std::vector<char> in(fsm.numberOfStates());
58  std::fill(in.begin(), in.end(), 'o');
59  std::for_each(fsm.stateBegin(), fsm.stateEnd(), [&](typename Fsm::State s)
60  {
61  auto sInfo = fsm.getStatePropertyId(s);
62  if(sInfo < in.size())
63  {
64  in[sInfo] = 'i';
65  }
66  });
67  return std::find(in.begin(), in.end(), 'o') != in.end();
68  }
69 
77  template<typename Fsm>
78  void
80  {
81  encoding.init(fsm.behaviour());
83  bool initialStateEncoded = false;
84  std::for_each(fsm.stateBegin(), fsm.stateEnd(),
85  [&](typename Fsm::State s)
86  {
87  if(fsm.isInitial(s) && !initialStateEncoded)
88  {
89  encoding[s] = 0;
90  initialStateEncoded = true;
91  }
92  else
93  {
94  encoding[s] = i;
95  ++i;
96  }
97  });
98  }
99 
100 
107  template<typename Fsm>
108  void
110  {
112  autFileStateEncoding(fsm,encoding);
113 
114  std::for_each(fsm.stateBegin(), fsm.stateEnd(),
115  [&](typename Fsm::State s)
116  {
117  auto s1 = fsm.getState(encoding[s]);
118  if(s1.isValid())
119  {
120  fsm.setStatePropertyId(s1,fsm.nullStatePropertyId);
121  }
122  fsm.setStatePropertyId(s,encoding[s]);
123  });
124  }
125 
126 
127 
128 
129 
130 
164  bool fromAutFile(std::istream& stream, AutFsm & fsm);
165 
166 
167 
181  bool
182  toAutFile(ostream& stream, const AutFsm & fsm, bool enforce = false);
183 
190  class AutStateCreator : public OnlyStateCreator<AutFsm>
191  {
192  public:
194 
195  using State = typename OSC::State;
196  using FsmBs = typename OSC::FsmBs;
197  public:
198 
205  OSC(source, target)
206  {
207  }
208 
217  virtual std::pair<State, bool>
218  newState(const FsmBs & bs)
219  {
220  // why using StateCreation<StateMachine>::_target instead of _target? Does not compile
221  // see https://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html for explanation
222 
223  // here we do not take into account the belief state of source
225  }
226  };
227 
233 
240 
246 
247 
248 
255 
256 
257 
268  template<typename AutFsmRange>
269  bool
270  insertAutFsms(AutFsmRange range, AutFsm & output)
271  {
272  bool result = true;
274  AutFsmStateIdGenerator gen(output, idGen, true);
275  std::list<AutFsmEventInserter> evtInserters;
276  std::list<StateCopy < AutFsm>> stateCopies;
277  std::list<AutFsmStateInserter> stateInserters;
278 
279 
280  std::list<AutFsmTransitionInserter> tInserters;
281 
282  std::for_each(range.begin(), range.end(),
283  [&](const AutFsm & fsm)
284  {
285  evtInserters.emplace_back(fsm, output);
286  stateCopies.emplace_back(fsm, output);
287  stateInserters.emplace_back(gen, stateCopies.back());
288  tInserters.emplace_back(stateInserters.back(),evtInserters.back());
289  });
290 
291  insertRangeOfTransitions(tInserters.begin(),tInserters.end());
292 
293  // now the issue is that the aut format does not allow more than one initial state
294  // i do the merge of initial states the hard way !
295  if(output.numberOfInitialStates() > 1)
296  {
297  // which should be always the case anyway..
298  auto it = output.initialStateBegin();
299  AutFsm::State mergedInitialState = *it;
300  std::list<AutFsm::State> statesToRemove;
301  ++it;
302  while(it != output.initialStateEnd())
303  {
304  std::for_each(output.outputTransitionBegin(*it), output.outputTransitionEnd(*it),
305  [&](const AutFsm::Transition & transition)
306  {
307  if(output.isInitial(transition.target()))
308  {
309  output.newTransition(mergedInitialState, mergedInitialState, output.getEvent(transition));
310  }
311  else
312  {
313  output.newTransition(mergedInitialState, transition.target(), output.getEvent(transition));
314  }
315  });
316  std::for_each(output.inputTransitionBegin(*it), output.inputTransitionEnd(*it),
317  [&](const AutFsm::Transition & transition)
318  {
319  if(!output.isInitial(transition.source()))
320 
321  {
322  output.newTransition(transition.source(), mergedInitialState, output.getEvent(transition));
323  }
324  });
325  statesToRemove.push_back(*it);
326  ++it;
327  }
328  deleteState(output,statesToRemove.begin(),statesToRemove.end());
329  }
330  // the state encoding is certainly not good
331  autFileStateReencoding(output);
332  return result;
333  }
334 
335  }
336  }
337 
338 }
339 #endif /* __DIADES__AUTOMATA__EXPERIMENTAL__AUTFILE__HH__ */
340 
Transition newTransition(State source, State target, const EventPropertyId &event)
FaultyEventStateMachine< CandidateId, EventInfoId > Fsm
void deleteState(StateMachine< StatePropertyId, EventPropertyId, NullStateProperty, NullEventProperty > &m, InputIterator first, InputIterator last)
OutputTransitionIterator outputTransitionBegin(State s) const
AutStateCreator(const AutFsm &source, AutFsm &target)
Definition: AutFile.hh:204
InitialStateIterator initialStateEnd() const
InputTransitionIterator inputTransitionBegin(State s) const
void autFileStateEncoding(const Fsm &fsm, Diades::Graph::ConstNodeMap< AutStateId > &encoding)
Definition: AutFile.hh:79
void insertRangeOfTransitions(TransInserterIterator begin, TransInserterIterator end)
Definition: Union.hh:71
AutFsm::State State
Definition: Run.cc:72
StatePropertyIdAsSizeT AutStateId
Definition: AutFile.hh:34
bool insertAutFsms(AutFsmRange range, AutFsm &output)
Definition: AutFile.hh:270
const EventPropertyId & getEvent(Transition t) const
Namespace of the Diades project.
OutputTransitionIterator outputTransitionEnd(State s) const
InputTransitionIterator inputTransitionEnd(State s) const
bool autFsmNeedEncoding(const Fsm &fsm)
Definition: AutFile.hh:55
bool toAutFile(ostream &stream, const AutFsm &fsm, bool enforce=false)
InitialStateIterator initialStateBegin() const
void autFileStateReencoding(Fsm &fsm)
Definition: AutFile.hh:109
bool fromAutFile(std::istream &stream, AutFsm &fsm)
virtual std::pair< State, bool > newState(const FsmBs &bs)
Definition: AutFile.hh:218
void init(const Graph &g, SizeType capacity=0, ValueType dflt=ValueType())