28 EventSet gObservableEvents, gUnobservableEvents;
32 Idx gStateEstimate = 0;
34 map<Idx,multimap<Idx,DiagLabelSet> > reachMap;
35 map<Idx,multimap<Idx,DiagLabelSet> >::iterator it;
36 multimap<Idx,DiagLabelSet>::iterator mmit, mmit2;
37 pair<Idx,DiagLabelSet> reachMapPair;
42 StateSet::Iterator stateIt, initStateIt;
47 FD_DD(
"ComputeGobs()");
55 FD_DD(
"Observable events: " << gObservableEvents.
ToString() );
59 FD_DD(
"Unobservable events: " << gUnobservableEvents.ToString() );
62 for (initStateIt = rGenMarkedNonSpecBehaviour.
InitStatesBegin(); initStateIt != rGenMarkedNonSpecBehaviour.
InitStatesEnd(); initStateIt++) {
63 newGobsStates.
Clear();
68 newLabel.
Insert(DiagLabelSet::IndexOfLabelN());
72 gObsStates = rGobs.
States();
73 stateIt = gObsStates.
Begin();
74 while (stateIt != gObsStates.
End()) {
76 FD_DD(
"Statelabel " << *initStateIt <<
"N already exists at state " << *stateIt <<
" --> make it init state.");
83 if (stateIt == gObsStates.
End()) {
87 newGobsStates.
Insert(currDState);
91 while (!newGobsStates.
Empty()) {
93 currDState = *newGobsStates.
Begin();
96 pDiagState = rGobs.
StateAttribute(currDState).DiagnoserStateMapp();
97 gStateEstimate = *(pDiagState->
Begin());
101 ComputeReachability(rGenMarkedNonSpecBehaviour, gUnobservableEvents, gStateEstimate, reachMap);
104 #ifdef FAUDES_DEBUG_DIAGNOSIS
106 for (it = reachMap.begin(); it != reachMap.end(); it++) {
108 FD_DD(
"_" << rGenMarkedNonSpecBehaviour.
EventName(it->first) <<
" ("<< it->second.size() <<
" state estimates)");
109 for (mmit = it->second.begin(); mmit != it->second.end(); mmit++) {
110 FD_DD(mmit->first <<
" " << mmit->second.ToString());
116 for (it = reachMap.begin(); it != reachMap.end(); it++) {
117 #ifdef FAUDES_DEBUG_DIAGNOSIS
119 FD_DD(
"Parsing reachMap: " <<
"_" << rGenMarkedNonSpecBehaviour.
EventName(it->first));
120 for (mmit = it->second.begin(); mmit != it->second.end(); mmit++) {
121 FD_DD(mmit->first <<
" " << mmit->second.ToString());
129 for (mmit = it->second.begin(); mmit != it->second.end(); mmit++) {
130 newState = mmit->first;
131 FD_DD(
"new state: " << newState);
132 occFailureTypes = mmit->second;
133 FD_DD(
"failure types occurred: " << occFailureTypes.
ToString());
140 gObsStates = rGobs.
States();
141 stateIt = gObsStates.
Begin();
142 while (stateIt != gObsStates.
End()) {
144 FD_DD(
"realising as back- or self-loop to existing state " << *stateIt);
156 if (stateIt == gObsStates.
End()) {
159 FD_DD(
"Create new state " << nextDState <<
" and transition " << currDState <<
" --" << rGenMarkedNonSpecBehaviour.
EventName(it->first) <<
"--> " << nextDState);
160 newGobsStates.
Insert(nextDState);
174 newGobsStates.
Erase(currDState);
181 map<
Idx,multimap<Idx,DiagLabelSet> >& rReachabilityMap) {
183 FD_DD(
"ComputeReachability() for state " << State <<
"...");
187 rReachabilityMap.clear();
189 FD_DD(
"ComputeReachability for state " << State <<
": done");
191 #ifdef FAUDES_DEBUG_DIAGNOSIS
192 map<Idx,multimap<Idx,DiagLabelSet> >::iterator it;
193 multimap<Idx,DiagLabelSet>::iterator mmLabelIt;
194 FD_DD(
"rReachabilityMap: ");
195 for (it = rReachabilityMap.begin(); it != rReachabilityMap.end(); it++) {
197 FD_DD(
"_" << rGen.
EventName(it->first) <<
" ("<< it->second.size() <<
" state estimates)");
198 for (mmLabelIt = it->second.begin(); mmLabelIt != it->second.end(); mmLabelIt++) {
199 FD_DD(mmLabelIt->first <<
" " << mmLabelIt->second.ToString());
208 map<
Idx,multimap<Idx,DiagLabelSet> >& rReachabilityMap) {
212 EventSet::Iterator evIt;
213 multimap<Idx,DiagLabelSet> stateFailureTypeMap;
214 multimap<Idx,DiagLabelSet>::iterator mmLabelIt;
215 map<Idx,multimap<Idx,DiagLabelSet> >::iterator it;
220 FD_DD(
"State " << State <<
" has already been processed." );
225 FD_DD(
"ComputeReachabilityRecursive() for state " << State <<
": Events in ActiveTransSet: ");
227 for (tIt = trans.
Begin(); tIt != trans.
End(); tIt++) {
228 FD_DD(tIt->X1 <<
"--" << rGen.
EventName(tIt->Ev) <<
"-->" << tIt->X2);
230 if (rUnobsEvents.
Exists(tIt->Ev)) {
237 FD_DD(rGen.
EventName(tIt->Ev) <<
" is observable: add it to rReachabilityMap ");
239 stateFailureTypeMap.clear();
240 if (rReachabilityMap.find(tIt->Ev) != rReachabilityMap.end()) {
241 stateFailureTypeMap = rReachabilityMap[tIt->Ev];
242 #ifdef FAUDES_DEBUG_DIAGNOSIS
243 FD_DD(
"old entry of rReachabilityMap for " << rGen.
EventName(tIt->Ev));
244 for (mmLabelIt = stateFailureTypeMap.begin(); mmLabelIt != stateFailureTypeMap.end(); mmLabelIt++) {
245 FD_DD(mmLabelIt->first <<
" " << mmLabelIt->second.ToString());
252 newFT.
Insert(DiagLabelSet::IndexOfLabelSpecViolated());
256 newFT.
Insert(DiagLabelSet::IndexOfLabelRelN());
259 mappingExists =
false;
260 for (mmLabelIt = stateFailureTypeMap.lower_bound(tIt->X2); mmLabelIt != stateFailureTypeMap.upper_bound(tIt->X2); mmLabelIt++) {
261 if (mmLabelIt->second == newFT) {
262 mappingExists =
true;
266 if (!mappingExists) {
267 stateFailureTypeMap.insert(pair<Idx,DiagLabelSet>(tIt->X2,newFT));
268 rReachabilityMap[tIt->Ev] = stateFailureTypeMap;
276 System genMarkedNonSpecBehaviour, specComplement;
279 FD_DD(
"LanguageDiagnoser()");
289 StateSet::Iterator sit;
297 FD_DD(
"diffEventsGenAndSpec: " << diffEventsGenAndSpec.
ToString() );
303 specComplement = spec;
306 Parallel(gen, specComplement, rcmap, genMarkedNonSpecBehaviour);
309 #ifdef FAUDES_DEBUG_DIAGNOSIS
310 genMarkedNonSpecBehaviour.
GraphWrite(
"tmp_wrtb_Gtilde_spec.png");
311 genMarkedNonSpecBehaviour.
Write(
"tmp_wrtb_Gtilde_spec.gen");
327 #ifdef FAUDES_DEBUG_DIAGNOSIS
342 #ifdef FAUDES_CHECKED
344 std::stringstream errstr;
345 errstr <<
"Diagnosis: Internal Error: Go must have one initial state only" << std::endl;
346 throw Exception(
"LanguageDiagnoser()", errstr.str(), 301);
354 std::multimap<Idx,Idx> dgmap;
355 dgmap.insert(std::pair<Idx,Idx>(dInitState,gInitState));
363 dStates.
Insert(dInitState);
364 while (!dStates.
Empty()) {
368 std::multimap<Idx,Idx> gSuccessors;
370 std::multimap<Idx,Idx>::iterator gsit= dgmap.lower_bound(dstate);
371 std::multimap<Idx,Idx>::iterator gsit_end= dgmap.upper_bound(dstate);
372 for(;gsit!=gsit_end; gsit++) {
373 Idx gState = gsit->second;
377 for(; tit!=tit_end; tit++)
378 gSuccessors.insert(std::pair<Idx,Idx>(tit->Ev,tit->X2));
381 gsit= gSuccessors.begin();
382 gsit_end= gSuccessors.end();
383 std::multimap<Idx,Idx>::iterator gsit_beg= gsit;
385 while(gsit!=gsit_end) {
391 for(; lit!=lit_end; lit++) {
399 if(gsit== gsit_end) nextev=
true;
400 if(gsit!= gsit_end)
if(gsit->first!=ev) nextev=
true;
401 if(!nextev)
continue;
406 StateSet::Iterator sit_end= rDiagGen.
StatesEnd();
407 for(; sit!=sit_end; sit++) {
409 FD_DD(
"LanguageDiagnoser(): insert diag transition " << rDiagGen.
TStr(
Transition(dstate,ev,*sit)));
417 dStates.
Insert(newDState);
419 FD_DD(
"LanguageDiagnoser(): insert state with attr " << newDAttr.
Str());
421 std::multimap<Idx,Idx>::iterator gesit= gsit_beg;
422 for(;gesit!=gsit;gesit++) {
423 FD_DD(
"LanguageDiagnoser(): corresponding gstate " << gesit->second);
424 dgmap.insert(std::pair<Idx,Idx>(newDState,gesit->second));
427 FD_DD(
"LanguageDiagnoser(): insert diag transition " << rDiagGen.
TStr(
Transition(dstate,ev,newDState)));
435 dStates.
Erase(dstate);
438 #ifdef FAUDES_DEBUG_DIAGNOSIS
446 FD_DD(
"IsLanguageDiagnosable()");
448 #ifdef FAUDES_DEBUG_DIAGNOSIS
457 map<Idx, VerifierState> stateToVerifierMap;
458 map<VerifierState, Idx> verifierToStateMap;
459 stack<pair<Idx, VerifierState> > waitingStates;
463 EventSet::Iterator eIt, eEndIt;
464 eEndIt = fullAlphabet.
End();
468 stateToVerifierMap[newState] = newVerifierState;
469 verifierToStateMap[newVerifierState ] = newState;
470 waitingStates.push(make_pair(newState, newVerifierState) );
472 pair<Idx, VerifierState> currentState;
475 map<VerifierState, Idx>::const_iterator vsIt;
479 while(waitingStates.empty() ==
false){
481 currentState = waitingStates.top();
483 doneStates.
Insert(currentState.first);
484 FD_DD(
"currentState: " +
ToStringInteger(currentState.first) +
" VerifierState: (" + rSpec.
StateName(currentState.second.mSpec1State) +
"," + rSpec.
StateName(currentState.second.mSpec2State) +
"," + rGen.
StateName(currentState.second.mPlantState) +
"," +
ToStringInteger(currentState.second.mLabel) +
")");
486 eIt = fullAlphabet.
Begin();
487 for(; eIt != eEndIt; eIt++){
489 if(obsEvents.
Exists(*eIt) ==
false){
490 tIt = rSpec.
TransRelBegin(currentState.second.mSpec1State,*eIt);
492 if(tIt != rSpec.
TransRelEnd(currentState.second.mSpec1State,*eIt) ){
493 if(currentState.second.mLabel ==
NORMAL ){
494 newVerifierState =
VerifierState(tIt->X2, currentState.second.mSpec2State, currentState.second.mPlantState,
NORMAL);
497 newVerifierState =
VerifierState(tIt->X2, currentState.second.mSpec2State, currentState.second.mPlantState,
CONFUSED);
499 vsIt = verifierToStateMap.find(newVerifierState);
501 if(vsIt == verifierToStateMap.end() ){
504 verifier.
SetTransition(currentState.first,nullEvent,newState);
506 verifierToStateMap[newVerifierState] = newState;
507 stateToVerifierMap[newState] = newVerifierState;
508 if(doneStates.
Exists(newState) ==
false)
509 waitingStates.push(make_pair(newState,newVerifierState) );
514 verifier.
SetTransition(currentState.first,nullEvent,vsIt->second);
518 tIt = rGen.
TransRelBegin(currentState.second.mPlantState,*eIt);
520 if(tIt != rGen.
TransRelEnd(currentState.second.mPlantState,*eIt) ){
522 if(currentState.second.mLabel ==
CONFUSED)
523 newVerifierState =
VerifierState(currentState.second.mSpec1State, currentState.second.mSpec2State, X2,
CONFUSED);
525 tIt = rSpec.
TransRelBegin(currentState.second.mSpec2State,*eIt);
526 if(tIt == rSpec.
TransRelEnd(currentState.second.mSpec2State,*eIt) ){
527 newVerifierState =
VerifierState(currentState.second.mSpec1State, currentState.second.mSpec2State, X2,
CONFUSED);
534 vsIt = verifierToStateMap.find(newVerifierState);
536 if(vsIt == verifierToStateMap.end() ){
539 verifierToStateMap[newVerifierState] = newState;
540 stateToVerifierMap[newState] = newVerifierState;
541 if(doneStates.
Exists(newState) ==
false)
542 waitingStates.push(make_pair(newState,newVerifierState) );
545 newState = vsIt->second;
549 verifier.
SetTransition(currentState.first,nullEvent,newState);
553 verifier.
SetTransition(currentState.first,negEvent,newState);
560 tIt = rSpec.
TransRelBegin(currentState.second.mSpec1State, *eIt);
561 plantIt= rGen.
TransRelBegin(currentState.second.mPlantState, *eIt);
562 specIt = rSpec.
TransRelBegin(currentState.second.mSpec2State, *eIt);
563 if(tIt != rSpec.
TransRelEnd(currentState.second.mSpec1State, *eIt) && plantIt != rGen.
TransRelEnd(currentState.second.mPlantState, *eIt) ){
564 if(currentState.second.mLabel ==
NORMAL && specIt != rSpec.
TransRelEnd(currentState.second.mSpec2State, *eIt) ){
566 eventIdx = nullEvent;
568 else if(currentState.second.mLabel ==
NORMAL){
577 vsIt = verifierToStateMap.find(newVerifierState);
579 if(vsIt == verifierToStateMap.end() ){
582 verifierToStateMap[newVerifierState] = newState;
583 stateToVerifierMap[newState] = newVerifierState;
584 if(doneStates.
Exists(newState) ==
false)
585 waitingStates.push(make_pair(newState,newVerifierState) );
588 newState = vsIt->second;
592 verifier.
SetTransition(currentState.first,eventIdx,newState);
599 verifier.
SetTransition(currentState.first,nullEvent,blockingState);
602 FD_DD(
"Blocking State Reachable");
606 #ifdef FAUDES_DEBUG_DIAGNOSIS
611 list<StateSet> sccList;
616 list<StateSet>::const_iterator sccIt, sccEndIt;
617 sccIt = sccList.begin();
618 sccEndIt = sccList.end();
619 StateSet::Iterator stIt, stEndIt;
620 bool existsCycle =
false;
621 for( ; sccIt != sccEndIt; sccIt++){
622 #ifdef FAUDES_DEBUG_DIAGNOSIS
625 stIt = sccIt->Begin();
626 stEndIt = sccIt->End();
627 for(; stIt != stEndIt; stIt++){
629 if(tIt != verifier.
TransRelEnd(*stIt, negEvent) && sccIt->Exists(tIt->X2) ){
630 FD_DD(
"Confused Cycle Found");
635 if(existsCycle ==
true)
638 if(block ==
true || existsCycle ==
true)
649 FD_DD(
"IsLoopPreservingObserver()");
653 if(
IsObs(genCopy,rHighAlph) ==
false){
654 FD_DD(
"Observer Condition violated");
657 FD_DD(
"Observer Condition fulfilled");
661 if (rHighAlph.
Exists(tit->Ev))
667 std::list<StateSet> sccList;
670 std::list<StateSet>::const_iterator sIt = sccList.begin();
671 for( ; sIt != sccList.end(); sIt++){
673 #ifdef FAUDES_DEBUG_DIAGNOSIS
674 cout <<
"Bad states that form a cycle with abstracted events: " << endl;
675 StateSet::Iterator stIt = sIt->Begin();
676 for(; stIt != sIt->End(); stIt++)
677 cout << *stIt <<
" ";
689 rHighAlph = rInitialHighAlph;
690 rHighAlph.
Name(
"HiAlph");
691 FD_DD(
"LoopPreservingObserver()");
697 EventSet::Iterator eIt = diffSet.
Begin();
698 std::vector<Idx> diffVector;
699 for( ; eIt != diffSet.
End(); eIt++)
700 diffVector.push_back(*eIt);
702 for(
Idx numberEvents = 1; numberEvents <= diffVector.size(); numberEvents++){
704 Idx currentNumberEvents = 1;
705 Idx currentLocation = 0;
711 rHighAlph.
Name(
"HiAlph");
716 FD_DD(
"rec_ComputeLoopPreservingObserver()");
718 for(
Idx i = currentLocation; i < rDiffVector.size(); i++){
719 FD_DD(
"currentNumberEvents: " +
ToStringInteger(currentNumberEvents) +
"currentLocation: " +
ToStringInteger(i) +
" event: " + SymbolTable::GlobalEventSymbolTablep()->Symbol(rDiffVector[i]));
720 chosenEvents.
Insert(rDiffVector[i]);
721 rHighAlph = rInitialHighAlph + chosenEvents;
722 if(currentNumberEvents == numberEvents){
728 else if(rDiffVector.size() - 1 - i < numberEvents - currentNumberEvents){
738 chosenEvents.Erase(rDiffVector[i]);