DiaDes  0.1
DIAgnosis of Discrete-Event System
ObservableMask.hh
Go to the documentation of this file.
1 #ifndef __DIADES__AUTOMATA__OBSERVABLEMASK__HH
2 #define __DIADES__AUTOMATA__OBSERVABLEMASK__HH
3 
11 #include <boost/archive/text_oarchive.hpp>
12 #include <boost/archive/text_iarchive.hpp>
13 #include <boost/serialization/vector.hpp>
14 #include <boost/serialization/set.hpp>
15 #include <boost/serialization/map.hpp>
16 #include <unordered_map>
17 #include <set>
18 #include <diades/automata/Event.hh>
20 
21 using std::set;
22 
23 namespace Diades
24 {
25 
26  namespace Automata
27  {
28  class ObservableComponent;
29  using Diades::Utils::Msg;
45 
46 
47  public:
48  static string typeName() { return "Automata::ObservableMask"; }
50 
51 
52  public:
53  typedef set<Event>::const_iterator ObservableEventIterator;
54  typedef set<Event>::const_iterator EventIterator;
55 
56  private:
57  unordered_map<Event,set<Event> > _eventOfObservable; // store for each observable event, the set of events that may produce them
58  unordered_map<Event,set<Event> > _observableOfEvent; // store for each event, the set of observable events, including noEvent()
59  Event _noEvent; // the unobservable event (epsilon)
60  set<Event> _observableEvents;
61  unsigned _nbIdentifiable;
62  set<Event> _events;
63  vector<bool> _detectable;
64  vector<bool> _identifiable;
65 
66  public:
67  template<class Archive>
68  void serialize(Archive & ar, const unsigned int version)
69  {
70  ar & _eventOfObservable;
72  ar & _noEvent;
73  ar & _observableEvents;
74  ar & _nbIdentifiable;
75  ar & _events;
76  ar & _detectable;
77  ar & _identifiable;
78  }
79 
80 
81 
82  public:
83 
89 
90 
91 
96  ObservableMask(const ObservableMask & mask);
97 
98 
99  ObservableMask(const SynchronisationRules & rules,
100  const vector<const ObservableComponent *> & components);
101 
109  ObservableMask & operator= (const ObservableMask & mask);
110 
115  void clear();
116 
117 
118 
127  void project(const ObservableMask & mask, const set<Event> & events);
128 
129 
134  unsigned numberOfObservableEvents() const
135  {
136  return _observableEvents.size();
137  }
142  unsigned numberOfIdentifiableEvents() const
143  {
144  return _nbIdentifiable;
145  }
146 
153  EventIterator eventBegin() const{
154  return _events.begin();
155  }
156 
157 
164  EventIterator eventEnd() const {
165  return _events.end();
166  }
167 
168 
176  ObservableEventIterator observableBegin() const{
177  return _observableEvents.begin();
178  }
179 
180 
188  ObservableEventIterator observableEnd() const {
189  return _observableEvents.end();
190  }
191 
199  bool containsEvent(const Event & e) const
200  {
201  return _observableOfEvent.find(e) != _observableOfEvent.end();
202  }
203 
204 
212  bool containsObservableEvent(const Event & obs) const
213  {
214  return _eventOfObservable.find(obs) != _eventOfObservable.end();
215  }
216 
217 
229  bool sometimesObservable(const Event & e) const;
230 
231 
240  bool matches(const Event & e,const Event & obs) const;
241 
242 
252  bool isUnobservable(const Event & e) const;
253 
254 
264  bool isObservable(const Event & e) const;
265 
275  bool isIdentifiable(const Event & e) const
276  {
277  require(Exception,containsEvent(e),
278  Msg("isIdentifiable: event %1% must be in the mask") % e);
279  return (_identifiable.size() > e.id()) && (_identifiable[e.id()]);
280  }
281 
282 
283 
293  bool isDetectable(const Event & e) const
294  {
295  require(Exception,containsEvent(e),
296  Msg("isDetectable: event %1% must be in the mask") % e);
297  return (_detectable.size() > e.id()) && (_detectable[e.id()]);
298  }
299 
300 
301 
311  ObservableEventIterator observableBegin(const Event & e) const;
312 
313 
323  ObservableEventIterator observableEnd(const Event & e) const;
324 
325 
326 
327 
328 
337  EventIterator beginOfSourceEvent(const Event & obs) const;
338 
339 
340 
341 
342 
343 
344 
353  EventIterator endOfSourceEvent(const Event & obs) const;
354 
355 
362  const Event & noEvent() const { return _noEvent; }
363 
364 
371  void addMask(const Event & e, const Event & obs);
372 
373 
380  void removeMask(const Event & e, const Event & obs);
381 
382 
391  unsigned numberOfAssociatedEvents(const Event & e) const;
392 
393 
400  void makeUnobservable(const Event & e);
401 
402 
403  };
404 
405 
406 
407 
408 
409 
413  struct IsObservable: public std::unary_function<Event,bool>
414  {
416  IsObservable(const ObservableMask & mask):_mask(mask){}
417  bool operator()(const Event & event) const
418  {
419  return _mask.isObservable(event);
420  }
421  };
422 
423 
424 
425 
426 
430  struct IsUnobservable: public std::unary_function<Event,bool>
431  {
433  IsUnobservable(const ObservableMask & mask):_mask(mask){}
434  bool operator()(const Event & event) const
435  {
436  return _mask.isUnobservable(event);
437  }
438  };
439 
440 
441 
447  struct IsIdentifiable: public std::unary_function<Event,bool>
448  {
450  IsIdentifiable(const ObservableMask & mask):_mask(mask){}
451  bool operator()(const Event & event) const
452  {
453  return _mask.isIdentifiable(event);
454  }
455  };
456 
464  struct IsNonIdentifiable: public std::unary_function<Event,bool>
465  {
467  IsNonIdentifiable(const ObservableMask & mask):_mask(mask){}
468  bool operator()(const Event & event) const
469  {
470  return !_mask.isIdentifiable(event);
471  }
472  };
473 
474  };
475 
476 };
477 
478 #endif
479 
const ObservableMask & _mask
EventIterator eventBegin() const
unordered_map< Event, set< Event > > _observableOfEvent
bool containsObservableEvent(const Event &obs) const
void project(const ObservableMask &mask, const set< Event > &events)
EventIterator endOfSourceEvent(const Event &obs) const
const ObservableMask & _mask
IsUnobservable(const ObservableMask &mask)
IsObservable(const ObservableMask &mask)
EventIterator beginOfSourceEvent(const Event &obs) const
Diades::Utils::Exception< ObservableMask > Exception
void makeUnobservable(const Event &e)
void removeMask(const Event &e, const Event &obs)
bool operator()(const Event &event) const
set< Event >::const_iterator ObservableEventIterator
unordered_map< Event, set< Event > > _eventOfObservable
bool matches(const Event &e, const Event &obs) const
bool operator()(const Event &event) const
set< Event >::const_iterator EventIterator
unsigned numberOfIdentifiableEvents() const
bool sometimesObservable(const Event &e) const
bool containsEvent(const Event &e) const
#define require(Exception, expr, message)
Definition: Assertion.hh:90
Namespace of the Diades project.
ObservableEventIterator observableBegin() const
bool isDetectable(const Event &e) const
EventIterator eventEnd() const
ObservableMask & operator=(const ObservableMask &mask)
const ObservableMask & _mask
bool isIdentifiable(const Event &e) const
ObservableEventIterator observableEnd() const
bool isObservable(const Event &e) const
IsNonIdentifiable(const ObservableMask &mask)
IsIdentifiable(const ObservableMask &mask)
void serialize(Archive &ar, const unsigned int version)
void addMask(const Event &e, const Event &obs)
bool operator()(const Event &event) const
unsigned numberOfAssociatedEvents(const Event &e) const
bool isUnobservable(const Event &e) const
boost::format Msg
Definition: Verbose.hh:42
unsigned numberOfObservableEvents() const
bool operator()(const Event &event) const