4 #include <unordered_map> 5 #include <unordered_set> 25 const set<Event> & faults):
26 _type(
Comp),_faultEvents(faults),
27 _globalModel(0),_diagnoser(0),_globalComposableModel(0),
29 _currentFaults(0),_currentGlobalStates()
36 vector<ObservableComponent::InitialStateIterator> its(
_models.size());
37 bool finished =
false;
39 for(
unsigned i = 0; i < models.size(); ++i)
41 its[i] = models[i]->initialStateBegin();
44 ( models[i]->initialStateBegin() == models[i]->initialStateEnd());
51 for(
unsigned i = 0; i <
_models.size(); ++i)
57 while((j < (
_models.size() - 1))
59 (its[j] ==
_models[j]->endOfInitialStates()))
61 its[j] =
_models[j]->beginOfInitialStates();
70 for(
unsigned i = 0; i < models.size(); ++i)
96 require(
Exception,diagnoser.valid(),
"FaultDiagnosis::constructor: invalid diagnoser");
119 require(
Exception,globalModel.valid(),
"FaultDiagnosis::constructor: invalid global model");
132 vector<State> globalState(1);
133 globalState[0] = *it;
134 _currentState->push_back(globalState);
162 list< vector<State> >::const_iterator currentStateIt =
_currentState->begin();
163 list< set<Event> >::const_iterator currentFaultsIt =
_currentFaults->begin();
168 vector<Diades::Graph::NodeId> state;
169 state.push_back(currentStateIt->front().id());
170 vector< set<Event> > faults;
171 faults.push_back(*currentFaultsIt);
185 cout <<
"UNKNOWN ALGORITHM" << endl;
221 cout <<
"HEY MAN, I ALREADY TOLD YOU IT WAS NOT IMPLEMENTED" << endl;
241 unordered_map< State, list< pair<State,set<Event> > > > solutions;
247 list< pair<State,set<Event> > > visitingStates;
253 set<State> noSolutions;
254 bool thereIsSolution =
false;
262 unordered_multimap< State , set<Event> > visitedOrVisitingStates;
266 if(noSolutions.find(*stateIt) == noSolutions.end())
268 visitingStates.push_back( make_pair(*stateIt, set<Event>()) );
269 visitedOrVisitingStates.insert(visitingStates.back());
273 while(!visitingStates.empty())
276 State & currentState = visitingStates.front().first;
278 set<Event> & currentFaults = visitingStates.front().second;
282 bool noSolutionForThisState =
true;
290 thereIsSolution =
true;
291 noSolutionForThisState =
false;
294 solutions[*stateIt].push_back(make_pair(outTransIt->target(), currentFaults) );
306 if(noSolutions.find(outTransIt->target()) == noSolutions.end())
310 noSolutionForThisState =
false;
311 set<Event> newCurrentFaults = currentFaults;
322 typedef unordered_multimap <State, set<Event> >::const_iterator
MapIterator;
323 pair< MapIterator, MapIterator > range = visitedOrVisitingStates.equal_range(outTransIt->target());
326 MapIterator visitedIt = range.first;
327 while( (!found) && (visitedIt != range.second) )
329 found = visitedIt->second == newCurrentFaults;
337 visitingStates.push_back(make_pair(outTransIt->target(),newCurrentFaults));
338 visitedOrVisitingStates.insert(visitingStates.back());
344 if(noSolutionForThisState)
349 noSolutions.insert(currentState);
352 visitingStates.pop_front();
360 cout <<
"No solution found for the following problem" << endl;
361 cout <<
"Observation = " << obs.
label() << endl;
362 cout <<
"Previous Diagnosis = " << endl;
365 cout << diagnosis << endl;
381 list< vector<State> > * previousCurrentState =
_currentState;
389 list< vector<State> >::const_iterator previousCurrentStateIt = previousCurrentState->begin();
390 list< set<Event> >::const_iterator previousCurrentFaultsIt = previousCurrentFaults->begin();
391 while((previousCurrentStateIt != previousCurrentState->end())
393 (previousCurrentFaultsIt != previousCurrentFaults->end()))
395 State previousState = previousCurrentStateIt->front();
398 list< pair< State,set<Event> > > & futureStates = solutions[previousState];
399 for(list< pair<
State,set<Event> > >::const_iterator futureStateIt = futureStates.begin();
400 futureStateIt != futureStates.end(); ++futureStateIt)
403 State futureState = futureStateIt->first;
406 set<Event> futureFaults = *previousCurrentFaultsIt;
407 for(set<Event>::const_iterator codeIt = futureStateIt->second.begin();
408 codeIt != futureStateIt->second.end();
411 futureFaults.insert(*codeIt);
415 list< vector<State> >::const_iterator currentStateIt =
_currentState->begin();
416 list< set<Event> >::const_iterator currentFaultsIt =
_currentFaults->begin();
423 found = (currentStateIt->front() == futureState)
424 && (*currentFaultsIt == futureFaults);
437 ++previousCurrentFaultsIt;
438 ++previousCurrentStateIt;
442 for(list< vector<State> >::iterator it = previousCurrentState->begin();
443 it != previousCurrentState->end();
449 delete previousCurrentFaults;
450 delete previousCurrentState;
453 ensure(
Exception,thereIsSolution,
"_globalModelDiagnose: cannot determine a solution (bug or check scenario)");
484 unordered_map< State, list< pair<State,set<Event> > > > solutions;
490 list< pair<State,set<Event> > > visitingStates;
496 set<State> noSolutions;
497 bool thereIsSolution =
false;
505 unordered_multimap< State , set<Event> > visitedOrVisitingStates;
509 if(noSolutions.find(*stateIt) == noSolutions.end())
511 visitingStates.push_back( make_pair(*stateIt, set<Event>()) );
512 visitedOrVisitingStates.insert(visitingStates.back());
516 while(!visitingStates.empty())
519 State & currentState = visitingStates.front().first;
521 set<Event> & currentFaults = visitingStates.front().second;
525 bool noSolutionForThisState =
true;
533 thereIsSolution =
true;
534 noSolutionForThisState =
false;
537 solutions[*stateIt].push_back(make_pair(outTransIt->target(), currentFaults) );
549 if(noSolutions.find(outTransIt->target()) == noSolutions.end())
553 noSolutionForThisState =
false;
554 set<Event> newCurrentFaults = currentFaults;
565 typedef unordered_multimap <State, set<Event> >::const_iterator
MapIterator;
566 pair< MapIterator, MapIterator > range = visitedOrVisitingStates.equal_range(outTransIt->target());
569 MapIterator visitedIt = range.first;
570 while( (!found) && (visitedIt != range.second) )
572 found = visitedIt->second == newCurrentFaults;
580 visitingStates.push_back(make_pair(outTransIt->target(),newCurrentFaults));
581 visitedOrVisitingStates.insert(visitingStates.back());
587 if(noSolutionForThisState)
592 noSolutions.insert(currentState);
595 visitingStates.pop_front();
603 cout <<
"No solution found for the following problem" << endl;
604 cout <<
"Observation = " << obs.
label() << endl;
605 cout <<
"Previous Diagnosis = " << endl;
608 cout << diagnosis << endl;
624 list< vector<State> > * previousCurrentState =
_currentState;
632 list< vector<State> >::const_iterator previousCurrentStateIt = previousCurrentState->begin();
633 list< set<Event> >::const_iterator previousCurrentFaultsIt = previousCurrentFaults->begin();
634 while((previousCurrentStateIt != previousCurrentState->end())
636 (previousCurrentFaultsIt != previousCurrentFaults->end()))
638 State previousState = previousCurrentStateIt->front();
641 list< pair< State,set<Event> > > & futureStates = solutions[previousState];
642 for(list< pair<
State,set<Event> > >::const_iterator futureStateIt = futureStates.begin();
643 futureStateIt != futureStates.end(); ++futureStateIt)
646 State futureState = futureStateIt->first;
649 set<Event> futureFaults = *previousCurrentFaultsIt;
650 for(set<Event>::const_iterator codeIt = futureStateIt->second.begin();
651 codeIt != futureStateIt->second.end();
654 futureFaults.insert(*codeIt);
658 list< vector<State> >::const_iterator currentStateIt =
_currentState->begin();
659 list< set<Event> >::const_iterator currentFaultsIt =
_currentFaults->begin();
666 found = (currentStateIt->front() == futureState)
667 && (*currentFaultsIt == futureFaults);
680 ++previousCurrentFaultsIt;
681 ++previousCurrentStateIt;
685 for(list< vector<State> >::iterator it = previousCurrentState->begin();
686 it != previousCurrentState->end();
692 delete previousCurrentFaults;
693 delete previousCurrentState;
696 ensure(
Exception,thereIsSolution,
"_globalModelDiagnose: cannot determine a solution (bug or check scenario)");
const Label & label() const
void getDiagnosis(Diagnosis &diagnosis) const
list< vector< State > > * _currentState
const ObservableComponent * _globalModel
unordered_set< Event >::const_iterator beginOfDiagnosedEvents() const
void diagnoserDiagnose(const Event &obs)
FaultDiagnosis(const vector< const ObservableComponent *> models, const SynchronisationRules &rules, const set< Event > &faults)
#define ensure(Exception, expr, message)
list< set< Event > > * _currentFaults
void diagnose(const Event &obs)
set< State > _currentGlobalStates
void addCandidate(const Candidate &candidate)
unordered_set< State >::const_iterator InitialStateIterator
InitialStateIterator initialStateEnd() const
An observable Component defined as a automaton.
void getDiagnosis(Diagnosis &diagnosis)
ComposableModel * _globalComposableModel
InitialStateIterator initialStateBegin() const
const SynchronisationRules * _rules
#define require(Exception, expr, message)
Diades::Graph::OutEdgeIterator OutputTransitionIterator
Namespace of the Diades project.
ClassicalDiagnoser * _diagnoser
OutputTransitionIterator outputTransitionBegin(State s) const
const ObservableMask & mask() const
unordered_set< Event >::const_iterator endOfDiagnosedEvents() const
void componentDiagnose(const Event &obs)
bool isObservable(const Event &e) const
LocalCandidate< LocalStateInfoId, EvSet > Candidate
const Event & getEvent(Transition t) const
Diades::Graph::Node State
vector< const ComposableModel * > _models
typename Map< Key, Value >::iterator MapIterator
void globalModelDiagnose(const Event &obs)
OutputTransitionIterator outputTransitionEnd(State s) const
void diagnose(const Event &obs)
set< Event > _faultEvents