DiaDes  0.1
DIAgnosis of Discrete-Event System
Diagnosis.hh
Go to the documentation of this file.
1 #ifndef __DIADES__AUTOMATA__DIAGNOSIS__HH__
2 #define __DIADES__AUTOMATA__DIAGNOSIS__HH__
3 
13 #include<set>
14 #include<list>
15 #include<vector>
16 #include <boost/archive/text_oarchive.hpp>
17 #include <boost/archive/text_iarchive.hpp>
18 #include <diades/utils/Measures.hh>
20 #include <diades/automata/Event.hh>
23 
24 
25 using namespace Diades::Utils;
26 
27 namespace Diades
28 {
29  namespace Automata
30  {
31 
41  class Diagnosis
42  {
43 
44  public:
45  static string typeName() { return "Automata::Diagnosis"; }
47  public:
52  typedef set<Candidate>::size_type SizeType;
56  typedef set<Candidate>::const_iterator CandidateIterator;
60  typedef list< vector< Candidate::StateId > >::const_iterator StateIdIterator;
64  typedef set< set<Event> >::const_iterator FaultCandidateIterator;
65  private:
66  set<Candidate> _candidates;
67  list< vector<Candidate::StateId> > _bs;
68  set< set<Event> > _faults;
69  public:
74  Diagnosis():_candidates(),_bs(),_faults(){}
75 
81  Diagnosis(const Diagnosis & diagnosis):_candidates(diagnosis._candidates),_bs(diagnosis._bs),_faults(diagnosis._faults){}
83  typedef vector < unordered_map<StateId,unordered_set<StateId> > > Dict;
84 
90  Diagnosis(const Diagnosis & diagnosis,
91  const Dict & dict);
92 
98  void addCandidate(const Candidate & candidate);
99 
108  void deleteCandidate(const Candidate & candidate);
109 
116  SizeType numberOfCandidates() const { return _candidates.size(); }
117 
124  CandidateIterator begin() const { return _candidates.begin(); }
125 
132  CandidateIterator end() const { return _candidates.end(); }
133 
140  SizeType bsSize() const { return _bs.size(); }
141 
148  StateIdIterator bsBegin() const { return _bs.begin(); }
149 
150 
157  StateIdIterator bsEnd() const { return _bs.end(); }
158 
159 
166  FaultCandidateIterator fcBegin() const { return _faults.begin(); }
167 
174  FaultCandidateIterator fcEnd() const { return _faults.end(); }
175 
183  bool operator==(const Diagnosis & diag) const
184  {
185  return _candidates == diag._candidates;
186  }
187 
188 
196  bool operator!=(const Diagnosis & diag) const
197  {
198  return !(_candidates == diag._candidates);
199  }
200 
201 
205  void clear();
206 
215  friend ostream & operator<<(ostream & os, const Diagnosis & diagnosis);
216 
217 
218  private:
219  friend class boost::serialization::access;
220 
229  template<class Archive>
230  void serialize(Archive & ar, const unsigned int version)
231  {
232  ar & _candidates;
233  ar & _bs;
234  ar & _faults;
235  }
236  };
237 
238 
239  template<typename T>
241  {
242  typedef T ValueType;
243  };
244 
252  struct Distance : public ReturnedType<int>
253  {
255  {
256  return orderedHamming(diag1.begin(),diag1.end(),diag2.begin(),diag2.end());
257  }
258  };
259 
260 
268  struct FcDistance : public ReturnedType<int>
269  {
271  {
272  set<Event> faults1;
274  it != diag1.fcEnd();
275  ++it)
276  {
277  faults1.insert(it->begin(),it->end());
278  }
279 
280  set<Event> faults2;
282  it != diag2.fcEnd();
283  ++it)
284  {
285  faults2.insert(it->begin(),it->end());
286  }
287 
288  return orderedHamming(faults1.begin(),faults1.end(),faults2.begin(),faults2.end());
289  }
290  };
291 
299  struct BsDistance : public ReturnedType<int>
300  {
302  {
303  set<string> bs1;
304  set<string> bs2;
305  for(Diagnosis::StateIdIterator it = diag1.bsBegin();
306  it != diag1.bsEnd();
307  ++it)
308  {
309  stringstream stream;
310  for(unsigned i = 0; i < it->size(); ++i)
311  {
312  stream << (*it)[i] << '_';
313  }
314  bs1.insert(stream.str());
315  }
316 
317  for(Diagnosis::StateIdIterator it = diag2.bsBegin();
318  it != diag2.bsEnd();
319  ++it)
320  {
321  stringstream stream;
322  for(unsigned i = 0; i < it->size(); ++i)
323  {
324  stream << (*it)[i] << '_';
325  }
326  bs2.insert(stream.str());
327  }
328  return orderedHamming(bs1.begin(),bs1.end(),bs2.begin(),bs2.end());
329  }
330  };
331 
339  struct CommonFaults : public ReturnedType<int>
340  {
342  {
343  set<Event> faults1;
345  it != diag1.fcEnd();
346  ++it)
347  {
348  faults1.insert(it->begin(),it->end());
349  }
350 
351  set<Event> faults2;
353  it != diag2.fcEnd();
354  ++it)
355  {
356  faults2.insert(it->begin(),it->end());
357  }
358 
359  return intersectionSize(faults1.begin(),faults1.end(),faults2.begin(),faults2.end());
360  }
361  };
362 
370  struct NonCommonFaults : public ReturnedType<int>
371  {
373  {
374  set<Event> faults1;
376  it != diag1.fcEnd();
377  ++it)
378  {
379  faults1.insert(it->begin(),it->end());
380  }
381 
382  set<Event> faults2;
384  it != diag2.fcEnd();
385  ++it)
386  {
387  faults2.insert(it->begin(),it->end());
388  }
389 
390  return differenceSize(faults1.begin(),faults1.end(),faults2.begin(),faults2.end());
391  }
392  };
393 
394 
395 
396  struct Accuracy : public ReturnedType<double>
397  {
398  ReturnedType::ValueType operator() (const Diagnosis & diag1, const Diagnosis & diag2)
399  {
400  double intersection = intersectionSize(diag1.begin(),diag1.end(),diag2.begin(),diag2.end());
401  double unionSize = diag1.numberOfCandidates() + diag2.numberOfCandidates() - intersection;
402  return intersection / unionSize;
403  }
404 
405  };
406 
407 
408 
409 
410  struct BsAccuracy : public ReturnedType<double>
411  {
412  ReturnedType::ValueType operator() (const Diagnosis & diag1, const Diagnosis & diag2)
413  {
414  set<string> bs1;
415  set<string> bs2;
416  for(Diagnosis::StateIdIterator it = diag1.bsBegin();
417  it != diag1.bsEnd();
418  ++it)
419  {
420  stringstream stream;
421  for(unsigned i = 0; i < it->size(); ++i)
422  {
423  stream << (*it)[i] << '_';
424  }
425  bs1.insert(stream.str());
426  }
427 
428  for(Diagnosis::StateIdIterator it = diag2.bsBegin();
429  it != diag2.bsEnd();
430  ++it)
431  {
432  stringstream stream;
433  for(unsigned i = 0; i < it->size(); ++i)
434  {
435  stream << (*it)[i] << '_';
436  }
437  bs2.insert(stream.str());
438  }
439  double intersection = intersectionSize(bs1.begin(),bs1.end(),bs2.begin(),bs2.end());
440  double unionSize = bs1.size() + bs2.size() - intersection;
441  return intersection / unionSize;
442  }
443 
444  };
445 
446 
447  struct FcAccuracy: public ReturnedType<double>
448  {
449  ReturnedType::ValueType operator() (const Diagnosis & diag1, const Diagnosis & diag2)
450  {
451  set<Event> faults1;
453  it != diag1.fcEnd();
454  ++it)
455  {
456  faults1.insert(it->begin(),it->end());
457  }
458 
459  set<Event> faults2;
461  it != diag2.fcEnd();
462  ++it)
463  {
464  faults2.insert(it->begin(),it->end());
465  }
466  double intersection = intersectionSize(faults1.begin(),faults1.end(),faults2.begin(),faults2.end());
467  double unionSize = faults1.size() + faults2.size() - intersection;
468  return intersection / unionSize;
469  }
470 
471  };
472 
473 
474  struct Precision: public ReturnedType<double>
475  {
476  ReturnedType::ValueType operator() (const Diagnosis & diag1, const Diagnosis & diag2)
477  {
478  return min( (double)diag1.numberOfCandidates() / (double)diag2.numberOfCandidates(),
479  (double)diag2.numberOfCandidates() / (double)diag1.numberOfCandidates());
480  }
481 
482  };
483 
484 
485  struct BsPrecision: public ReturnedType<double>
486  {
487  ReturnedType::ValueType operator() (const Diagnosis & diag1, const Diagnosis & diag2)
488  {
489  set<string> bs1;
490  set<string> bs2;
491  for(Diagnosis::StateIdIterator it = diag1.bsBegin();
492  it != diag1.bsEnd();
493  ++it)
494  {
495  stringstream stream;
496  for(unsigned i = 0; i < it->size(); ++i)
497  {
498  stream << (*it)[i] << '_';
499  }
500  bs1.insert(stream.str());
501  }
502 
503  for(Diagnosis::StateIdIterator it = diag2.bsBegin();
504  it != diag2.bsEnd();
505  ++it)
506  {
507  stringstream stream;
508  for(unsigned i = 0; i < it->size(); ++i)
509  {
510  stream << (*it)[i] << '_';
511  }
512  bs2.insert(stream.str());
513  }
514  return min( (double) bs1.size() / (double) bs2.size(), (double) bs2.size() / (double) bs1.size());
515  }
516 
517  };
518 
519 
520 
521  struct FcPrecision: public ReturnedType<double>
522  {
523  ReturnedType::ValueType operator() (const Diagnosis & diag1, const Diagnosis & diag2)
524  {
525  set<Event> faults1;
527  it != diag1.fcEnd();
528  ++it)
529  {
530  faults1.insert(it->begin(),it->end());
531  }
532 
533  set<Event> faults2;
535  it != diag2.fcEnd();
536  ++it)
537  {
538  faults2.insert(it->begin(),it->end());
539  }
540  return min( (double) faults1.size() / (double) faults2.size(), (double) faults2.size() / (double) faults1.size());
541  }
542 
543  };
544 
545 
546 
547 
548 
549 
550 
551  };
552 };
553 
554 
555 #endif
CandidateIterator begin() const
Definition: Diagnosis.hh:124
set< set< Event > > _faults
Definition: Diagnosis.hh:68
SizeType numberOfCandidates() const
Definition: Diagnosis.hh:116
list< vector< Candidate::StateId > >::const_iterator StateIdIterator
Definition: Diagnosis.hh:60
int intersectionSize(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2)
Definition: Measures.hh:126
FaultCandidateIterator fcBegin() const
Definition: Diagnosis.hh:166
Candidate class.
list< vector< Candidate::StateId > > _bs
Definition: Diagnosis.hh:67
static string typeName()
Definition: Diagnosis.hh:45
ReturnedType::ValueType operator()(const Diagnosis &diag1, const Diagnosis &diag2)
Definition: Diagnosis.hh:270
int differenceSize(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2)
Definition: Measures.hh:171
FaultCandidateIterator fcEnd() const
Definition: Diagnosis.hh:174
CandidateIterator end() const
Definition: Diagnosis.hh:132
ReturnedType::ValueType operator()(const Diagnosis &diag1, const Diagnosis &diag2)
Definition: Diagnosis.hh:254
ReturnedType::ValueType operator()(const Diagnosis &diag1, const Diagnosis &diag2)
Definition: Diagnosis.hh:301
Diagnosis(const Diagnosis &diagnosis)
Definition: Diagnosis.hh:81
set< set< Event > >::const_iterator FaultCandidateIterator
Definition: Diagnosis.hh:64
Diades::Utils::Exception< Diagnosis > Exception
Definition: Diagnosis.hh:46
ReturnedType::ValueType operator()(const Diagnosis &diag1, const Diagnosis &diag2)
Definition: Diagnosis.hh:341
ReturnedType::ValueType operator()(const Diagnosis &diag1, const Diagnosis &diag2)
Definition: Diagnosis.hh:372
bool operator==(const Diagnosis &diag) const
Definition: Diagnosis.hh:183
StateIdIterator bsBegin() const
Definition: Diagnosis.hh:148
set< Candidate > _candidates
Definition: Diagnosis.hh:66
Namespace of the Diades project.
int orderedHamming(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2)
Definition: Measures.hh:71
bool operator!=(const Diagnosis &diag) const
Definition: Diagnosis.hh:196
std::ostream & operator<<(std::ostream &os, const Identifier &identifier)
Definition: Identifier.hh:501
Candidate::StateId StateId
Definition: Diagnosis.hh:82
void serialize(Archive &ar, const unsigned int version)
Definition: Diagnosis.hh:230
vector< unordered_map< StateId, unordered_set< StateId > > > Dict
Definition: Diagnosis.hh:83
Diades::Graph::Node::NodeId StateId
Definition: Candidate.hh:44
set< Candidate >::const_iterator CandidateIterator
Definition: Diagnosis.hh:56
StateIdIterator bsEnd() const
Definition: Diagnosis.hh:157
set< Candidate >::size_type SizeType
Definition: Diagnosis.hh:52
some tools for measurements
SizeType bsSize() const
Definition: Diagnosis.hh:140