00001
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "op_obserververification.h"
00032
00033
00034 namespace faudes {
00035
00036 bool IsObs(const Generator& rLowGen, const EventSet& rHighAlph){
00037 OP_DF("IsObs(" << rLowGen.Name() << "," << rHighAlph.Name() << ")");
00038
00039 EventSet newHighAlph = rHighAlph;
00040 EventSet controllableEvents;
00041 map<Transition,Idx> mapChangedTrans;
00042 Generator genDyn(rLowGen);
00043 map<Transition,Transition> mapChangedTransReverse;
00044 vector<Idx> newPartitions;
00045 map<Idx,Idx> mapStateToPartition;
00046 map<Idx, EventSet> mapRelabeledEvents;
00047 bool observer;
00048
00049
00050 calculateDynamicSystemObs(rLowGen, newHighAlph, genDyn);
00051 Generator genPart;
00052
00053 calcBisimulation(genDyn, mapStateToPartition, genPart, newPartitions);
00054
00055
00056 Generator genObs(rLowGen);
00057 observer=relabel(genObs, controllableEvents, newHighAlph, newPartitions, mapStateToPartition, mapChangedTransReverse, mapChangedTrans, mapRelabeledEvents);
00058
00059 return observer;
00060
00061 }
00062
00063 bool IsOCC(const cGenerator& rLowGen, const EventSet& rHighAlph){
00064 OP_DF("IsOCC(" << rLowGen.Name() << "," << rHighAlph.Name() << ")");
00065 EventSet controllableEvents = rLowGen.ControllableEvents();
00066
00067 return IsOCC(rLowGen, controllableEvents, rHighAlph);
00068 }
00069
00070 bool IsOCC(const Generator& rLowGen, const EventSet& rControllableEvents, const EventSet& rHighAlph){
00071 OP_DF("IsOCC(" << rLowGen.Name() << "," << rHighAlph.Name() << ")");
00072
00073 StateSet::Iterator stIt, stEndIt;
00074 stIt = rLowGen.StatesBegin();
00075 stEndIt = rLowGen.StatesEnd();
00076 TransSet::Iterator tIt, tEndIt;
00077
00078 for( ; stIt != stEndIt; stIt++){
00079 tIt = rLowGen.TransRelBegin(*stIt);
00080 tEndIt = rLowGen.TransRelEnd(*stIt);
00081 for( ; tIt != tEndIt; tIt++){
00082 if(rHighAlph.Exists(tIt->Ev) && !rControllableEvents.Exists(tIt->Ev) ){
00083
00084 bool uncontrollable = backwardVerificationOCC(rLowGen, rControllableEvents, rHighAlph, *stIt);
00085
00086 if(uncontrollable == false)
00087 return false;
00088
00089 else
00090 break;
00091 }
00092 }
00093 }
00094 return true;
00095 }
00096
00097 bool backwardVerificationOCC(const Generator& rLowGen, const EventSet& rControllableEvents, const EventSet& rHighAlph, Idx currentState){
00098 OP_DF("backwardVerificationOCC(" << rLowGen.Name() << "," << rControllableEvents.Name() << "," << rHighAlph.Name() << "," << currentState << ")");
00099
00100 TransSetX2EvX1 tset_X2EvX1;
00101 rLowGen.TransRel(tset_X2EvX1);
00102 TransSetX2EvX1::Iterator tsIt, tsEndIt;
00103
00104 std::stack<Idx> todo;
00105
00106
00107 StateSet doneStates;
00108 doneStates.Insert(currentState);
00109 todo.push(currentState);
00110
00111 while( !todo.empty() ){
00112 const Idx current = todo.top();
00113 todo.pop();
00114 tsIt = tset_X2EvX1.BeginByX2(current);
00115 tsEndIt = tset_X2EvX1.EndByX2(current);
00116 for(; tsIt != tsEndIt; tsIt++){
00117
00118
00119 if(rHighAlph.Exists(tsIt->Ev) )
00120 continue;
00121
00122 else if( rControllableEvents.Exists(tsIt->Ev) )
00123 return false;
00124 else if( !doneStates.Exists(tsIt->X1) ){
00125 todo.push(tsIt->X1);
00126 doneStates.Insert(tsIt->X1);
00127 }
00128 }
00129 }
00130 return true;
00131 }
00132
00133
00134 bool IsLCC(const cGenerator& rLowGen, const EventSet& rHighAlph){
00135 OP_DF("IsLCC(" << rLowGen.Name() << "," << rHighAlph.Name() << ")");
00136 EventSet controllableEvents = rLowGen.ControllableEvents();
00137
00138 return IsLCC(rLowGen, controllableEvents, rHighAlph);
00139 }
00140
00141 bool IsLCC(const Generator& rLowGen, const EventSet& rControllableEvents, const EventSet& rHighAlph){
00142 OP_DF("IsLCC(" << rLowGen.Name() << "," << rHighAlph.Name() << ")");
00143
00144 TransSetX2EvX1 tset_X2EvX1;
00145 rLowGen.TransRel(tset_X2EvX1);
00146
00147 StateSet::Iterator stIt, stEndIt;
00148 stIt = rLowGen.StatesBegin();
00149 stEndIt = rLowGen.StatesEnd();
00150 TransSet::Iterator tIt, tEndIt;
00151 StateSet doneStates;
00152 map<Idx, bool> localStatesMap;
00153 map<Idx, bool>::const_iterator lsIt, lsEndIt;
00154
00155 for( ; stIt != stEndIt; stIt++){
00156 tIt = rLowGen.TransRelBegin(*stIt);
00157 tEndIt = rLowGen.TransRelEnd(*stIt);
00158 for( ; tIt != tEndIt; tIt++){
00159 if(rHighAlph.Exists(tIt->Ev) && !rControllableEvents.Exists(tIt->Ev) ){
00160 doneStates.Clear();
00161 localStatesMap.clear();
00162 localStatesMap[*stIt] = false;
00163 doneStates.Insert(*stIt);
00164
00165 backwardVerificationLCC(tset_X2EvX1, rControllableEvents, rHighAlph, *stIt, *stIt, false, localStatesMap, doneStates);
00166
00167 lsIt = localStatesMap.begin();
00168 lsEndIt = localStatesMap.end();
00169 for( ; lsIt != lsEndIt; lsIt++){
00170
00171 if(lsIt->second == true)
00172 return false;
00173 }
00174
00175 break;
00176 }
00177 }
00178 }
00179 return true;
00180 }
00181
00182
00183 void backwardVerificationLCC(const TransSetX2EvX1& rTransSetX2EvX1, const EventSet& rControllableEvents, const EventSet& rHighAlph, Idx exitState, Idx currentState, bool controllablePath, map<Idx, bool>& rLocalStatesMap, StateSet& rDoneStates){
00184 OP_DF("backwardVerificationLCC(rTransSetX2EvX1," << rControllableEvents.Name() << "," << rHighAlph.Name() << "," << exitState << "," << currentState << "," << controllablePath << ",rExitLocalStatesMap, rDoneStates)");
00185
00186
00187
00188
00189 TransSetX2EvX1::Iterator tsIt, tsEndIt;
00190 tsIt = rTransSetX2EvX1.BeginByX2(currentState);
00191 tsEndIt = rTransSetX2EvX1.EndByX2(currentState);
00192 bool currentControllablePath;
00193
00194 for( ;tsIt != tsEndIt; tsIt++){
00195
00196 if( !rHighAlph.Exists(tsIt->Ev) && tsIt->X1 != exitState){
00197
00198 if( !rDoneStates.Exists(tsIt->X1) ){
00199 rDoneStates.Insert(tsIt->X1);
00200
00201 currentControllablePath = rControllableEvents.Exists(tsIt->Ev) || controllablePath;
00202 rLocalStatesMap[tsIt->X1] = currentControllablePath;
00203
00204 backwardVerificationLCC(rTransSetX2EvX1, rControllableEvents, rHighAlph, exitState, tsIt->X1, currentControllablePath, rLocalStatesMap, rDoneStates);
00205 }
00206 else{
00207
00208
00209
00210 currentControllablePath = rControllableEvents.Exists(tsIt->Ev) || controllablePath;
00211 if(rLocalStatesMap[tsIt->X1] != currentControllablePath && currentControllablePath == false){
00212 rLocalStatesMap[tsIt->X1] = false;
00213
00214 backwardVerificationLCC(rTransSetX2EvX1, rControllableEvents, rHighAlph, exitState, tsIt->X1, false, rLocalStatesMap, rDoneStates);
00215 }
00216 }
00217 }
00218 }
00219 }
00220
00221 }