syn_supreduce.cpp
Go to the documentation of this file.
114 std::cout << "sup state: " << rsIt->first << " plant states " << rsIt->second.mPlantStates.ToString() << std::endl;*/ // REMOVE
117 rsIt->second.mEnabledEvents = rSupGen.ActiveEventSet(rsIt->first); // all events enabled at current state2Class
122 rsIt->second.mDisabledEvents = rsIt->second.mDisabledEvents + rPlantGen.ActiveEventSet(*sIt); // compute active events in plant_det for state *sIt
123 rsIt->second.mPlantMarked = rsIt->second.mPlantMarked || rPlantGen.ExistsMarkedState(*sIt); // compute colors of corresponding plant states
126 rsIt->second.mDisabledEvents = rsIt->second.mDisabledEvents - rsIt->second.mEnabledEvents; // compute disable events (events that are not enabled
128 alwaysEnabledEvents = alwaysEnabledEvents - rsIt->second.mDisabledEvents; // subtract disabled events from always enabled events
139 std::cout << "state: " << rsIt->first << " enabled: " << rsIt->second.mEnabledEvents.ToString() << " disabled: " << rsIt->second.mDisabledEvents.ToString() << std::endl;*/ // REMOVE
143 for( ; eIt != alwaysEnabledEvents.End(); eIt++)// map that indicates if always enabled event is relevant for supervisor (true) or not (false)
164 // Evaluate min{k \in I | x_k \in [x_i]}; since StateSets are ordered by index, this simply means finding the first state in the class of x_i
165 if( mIt->first > *class2States[mIt->second].Begin() ){// state is already in other equivalence class
185 bool flag = CheckMergibility(mIt->first,mbIt->first,waitList,mIt->first, rSupGen, supStateInfo, state2Class, class2States);
193 if(state2Class[*wlIt->begin() ] == state2Class[*(++(wlIt->begin() ) ) ])// no action is required if the states are already in the same class
195 class2States[state2Class[*wlIt->begin() ] ] = class2States[state2Class[*wlIt->begin()] ] + class2States[state2Class[*(++(wlIt->begin() ) ) ] ]; // union of state sets of both classes
200 state2Class[*sIt] = state2Class[*wlIt->begin() ]; // change class of all states that were merged
220 // Every state corresponds to a class that we found and we try to avoid adding trnasitions with always enabled events
253 newGoalState = class2ReducedStates[state2Class[tIt->X2] ]; // goal state of transition in the reduced supervisor
254 if(alwaysEnabledEvents.Exists(tIt->Ev) == true && newGoalState != newStateIdx )// always enabled event changes class and is thus relevant for supervisor
263 for(; uIt != usedEventsMap.end(); uIt++){// delete the unused events from the reduced supervisor
278 bool CheckMergibility(Idx stateI, Idx stateJ, std::vector<std::set<Idx> >& rWaitList, Idx cNode, const System& rSupGen,
279 const std::map<Idx,ReductionStateInfo>& rSupStateInfo, const std::map<Idx,Idx>& rState2Class, const std::vector<StateSet>& rClass2States){
286 statesI = rClass2States[rState2Class.find(stateI)->second]; // all states of the class of stateI
287 statesJ = rClass2States[rState2Class.find(stateJ)->second ]; // all states of the class of stateJ
292 statesI = statesI + rClass2States[rState2Class.find(*(++rWaitList[i].begin() ) )->second]; // add classes for corresponding state on waitList
294 statesI = statesI + rClass2States[rState2Class.find(*rWaitList[i].begin() )->second]; // add classes for corresponding state on waitList
297 statesJ = statesJ + rClass2States[rState2Class.find(*(++rWaitList[i].begin() ) )->second]; // add classes for corresponding state on waitList
299 statesJ = statesJ + rClass2States[rState2Class.find(*rWaitList[i].begin() )->second]; // add classes for corresponding state on waitList
301 //std::cout << "statesI " << statesI.ToString() << " stateJ " << statesJ.ToString() << std::endl;// REMOVE
335 // E(*siIt) \cap D(*sjIt) = E(*sjIt) \cap D(*siIt) = \emptyset and C(*siIt) = C(*sjIt) \Rightarrow M(*siIt) = M(*sjIt)
349 // E(*siIt) \cap D(*sjIt) = E(*sjIt) \cap D(*siIt) = \emptyset and C(*siIt) = C(*sjIt) \Rightarrow M(*siIt) = M(*sjIt)
350 if( !(rSupStateInfo.at(*siIt).mEnabledEvents * rSupStateInfo.at(*sjIt).mDisabledEvents).Empty() ||
355 if( (rSupStateInfo.at(*siIt).mPlantMarked == rSupStateInfo.at(*sjIt).mPlantMarked) && (rSupStateInfo.at(*siIt).mPlantMarked != rSupStateInfo.at(*sjIt).mPlantMarked) )
371 if(*rState2Class.find( goalStateI ) == *rState2Class.find( goalStateJ ) )// event leads to same class
390 bool flag = CheckMergibility(goalStateI, goalStateJ, rWaitList, cNode, rSupGen, rSupStateInfo, rState2Class, rClass2States);
libFAUDES 2.26g --- 2015.08.17 --- c++ api documentaion by doxygen |