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