1 #ifndef __DIADES__AUTOMATA__COMPOSABLEMODELSEARCH_HH_ 2 #define __DIADES__AUTOMATA__COMPOSABLEMODELSEARCH_HH_ 41 return os <<
"(state= " << dstate.
state() <<
", nbObs=" << dstate.
obsNb() <<
", faults= " <<
toStream(dstate.
faults().begin(), dstate.
faults().end()) <<
")";
75 return find(_visited[s.
state()][s.
obsNb()].begin(),
84 list< unordered_set<Event> >::iterator it = find(_visited[s.
state()][s.
obsNb()].begin(),
109 const unordered_set<Event> & observables,
110 const vector<EventOccurrence> & observations):_model(model),_observables(observables),_observations(observations){}
111 bool noGood(
unsigned nbObs,
const Edge & t)
const 161 while((_it != _end) && (_cut->
noGood(_nbObs,*_it)))
181 while((_it != _end) && (_cut->
noGood(_nbObs,*_it)))
192 while((_it != _end) && (_cut->
noGood(_nbObs,*_it)))
203 return (_it == it._it) && (_end == it._end) && (_cut == it._cut) && (_nbObs == it._nbObs);
208 return !(*
this == it);
215 _model(model), _dstate(dstate), _cut(cut){}
241 const unordered_set<Event> & observables,
242 const unordered_set<Event> &
faults):_model(model),_observables(observables),_faults(faults){}
244 Node
next(
const Edge & t,
const Node & s)
const 276 IsCandidate(
const vector<EventOccurrence> & observations):_observations(observations){}
277 bool isSolution(
const Node & s){
if(s.
obsNb() == _observations.size()) { cout <<
"Solution part: " << s << endl; }
278 return s.
obsNb() == _observations.size();
289 template<
class Algorithm>
306 _incorrectPath(nullptr),_targetDiagState(nullptr),
307 _diagnosis(),_problem(problem),_model(nullptr),
308 _compModels(),_search(nullptr){}
317 _initialDiagStates.clear();
318 if(_search !=
nullptr)
320 delete _search; _search =
nullptr;
322 if(_isCandidate !=
nullptr)
324 delete _isCandidate; _isCandidate =
nullptr;
326 if(_incorrectPath !=
nullptr)
328 delete _incorrectPath; _incorrectPath =
nullptr;
330 if(_targetDiagState !=
nullptr)
332 delete _targetDiagState; _targetDiagState =
nullptr;
334 if(_model !=
nullptr)
339 if(!_compModels.empty())
341 for(
unsigned i = 0; i < _compModels.size(); ++i)
343 if(_compModels[i] !=
nullptr)
345 delete _compModels[i];
346 _compModels[i]=
nullptr;
356 if(problem().components().size() == 1)
358 _compModels.push_back(
new ComposableModel(*problem().components().begin(),problem().rules()));
359 _model =
new ComposableModel(*problem().components().begin(),problem().rules());
374 _isCandidate =
new typename Algorithm::Search::Solution(problem().observations());
375 _incorrectPath =
new typename Algorithm::Search::PathCut(*_model,problem().observables(),problem().observations());
376 _targetDiagState =
new typename Algorithm::Search::Opposite(*_model,problem().observables(), problem().
faults());
382 _initialDiagStates.push_back(
typename Algorithm::Search::Node(*it,unordered_set<Event>(),0));
386 _search =
new Algorithm(*_model,_initialDiagStates,*_targetDiagState,*_isCandidate,*_incorrectPath,_results);
387 _search->initialize();
390 bool finished()
const {
return (_search !=
nullptr) && _search->finished(); }
391 void next() { _search->next(); }
392 bool updated()
const {
return (_search !=
nullptr) && _search->updated(); }
398 for(
const typename Algorithm::Search::Node &
state : _search->currentResults())
400 vector< set<Event> >
faults(max((
int) _model->
models().size(), 1));
401 if(_model->
models().size() == 0)
403 faults[0].insert(
state.faults().begin(),
state.faults().end());
411 while(!found && (i < _model->models().size()))
413 found = _model->
models().operator[](i)->component().containsEvent(fault);
416 faults[i].insert(fault);
422 vector<Diades::Graph::Node::NodeId> stateIds;
void unmark(const Node &s)
Iterator(const Graph::OutputTransitionIterator &it, const Graph::OutputTransitionIterator &end, unsigned nbObs, const IncorrectPath &cut)
pointer operator->() const
IsCandidate(const vector< EventOccurrence > &observations)
bool isMarked(const Node &s)
ComposableModel::OutputTransitionIterator _end
Diades::Graph::Edge Transition
const unordered_set< Event > & _observables
DiagState(const DiagState &dstate)
Component::OutputTransitionIterator OutputTransitionIterator
bool isSolution(const Node &s)
const State & state() const
bool noGood(unsigned nbObs, const Edge &t) const
Algorithm::Search::Solution * _isCandidate
bool operator==(const self &it) const
Definition of a fault diagnosis problem in a discrete-event system.
void addCandidate(const Candidate &candidate)
ComposableModelSearch(const FaultDiagProblem &problem)
Algorithm::Search::Opposite * _targetDiagState
unordered_set< Event > _faults
An observable Component defined as a automaton.
bool operator!=(const DiagState &dstate) const
reference operator*() const
const FaultDiagProblem & _problem
DiagState(const State &state, const unordered_set< Event > &faults, unsigned obsNb)
OutputTransitionIterator outputTransitionEnd(State s) const
VisitedDiagState(const ComposableModel &model)
std::forward_iterator_tag iterator_category
Definition of a fault diagnosis problem in a discrete-event system.
Namespace of the Diades project.
Diades::Utils::ToStream< InputIterator, Diades::Utils::AlwaysTrue< typename InputIterator::reference > > toStream(InputIterator first, InputIterator last)
const unordered_set< Event > & _observables
ComposableModel::OutputTransitionIterator _it
TargetDiagState(const Graph &model, const unordered_set< Event > &observables, const unordered_set< Event > &faults)
const vector< ConstPointer > & models() const
Algorithm::Search::PathCut * _incorrectPath
bool operator==(const DiagState &dstate) const
const FaultDiagProblem & problem() const
vector< const ComposableModel * > _compModels
void setState(const State &state)
LocalCandidate< LocalStateInfoId, EvSet > Candidate
const Event & getEvent(Transition t) const
const IncorrectPath & _cut
ptrdiff_t difference_type
NextTransitions(const Graph &model, const Node &dstate, const IncorrectPath &cut)
const Component & component() const
const vector< EventOccurrence > & _observations
Diades::Graph::Node State
ostream & operator<<(ostream &os, const DiagState &dstate)
IncorrectPath(const Graph &model, const unordered_set< Event > &observables, const vector< EventOccurrence > &observations)
OutputTransitionIterator outputTransitionBegin(State s) const
InitialStateIterator endOfInitialStates() const
const unordered_set< Event > & faults() const
Node next(const Edge &t, const Node &s) const
list< typename Algorithm::Search::Node > _initialDiagStates
unordered_set< State >::const_iterator InitialStateIterator
Diades::Graph::ConstNodeMap< vector< list< unordered_set< Event > > > > _visited
const vector< EventOccurrence > & _observations
const Diagnosis & diagnosis()
const unordered_set< Event > & _faults
const IncorrectPath * _cut
InitialStateIterator beginOfInitialStates() const
void addFault(const Event &event)
const vector< State > & vectorStateOf(State s) const
list< typename Algorithm::Search::Node > _results