|
|
Go to the documentation of this file.
15 FD_DF( "ExtractEventAttributes()");
17 rControllableEvents. Clear();
18 rObservableEvents. Clear();
26 FD_DF( "ExtractEventAttributes: controllable events: " << rControllableEvents. ToString());
27 FD_DF( "ExtractEventAttributes: observable events: " << rObservableEvents. ToString());
35 FD_DF( "RabinCtrlPartialObsConsistencyCheck()");
41 only_in_plant. Name( "OnlyInPlant");
42 only_in_spec. Name( "OnlyInSpec");
43 std::stringstream errstr;
44 errstr << "Alphabets of plant and specification do not match.";
45 if(!only_in_plant. Empty())
46 errstr << " " << only_in_plant. ToString() << ".";
47 if(!only_in_spec. Empty())
48 errstr << " " << only_in_spec. ToString() << ".";
49 throw Exception( "RabinCtrlPartialObs", errstr.str(), 100);
53 if (!(rControllableEvents <= rPlant. Alphabet())) {
55 std::stringstream errstr;
56 errstr << "Controllable events not subset of alphabet: "
58 throw Exception( "RabinCtrlPartialObs", errstr.str(), 305);
62 if (!(rObservableEvents <= rPlant. Alphabet())) {
64 std::stringstream errstr;
65 errstr << "Observable events not subset of alphabet: "
67 throw Exception( "RabinCtrlPartialObs", errstr.str(), 306);
74 if (!plant_det && !spec_det) {
76 "Both plant and specification must be deterministic", 204);
77 } else if (!plant_det) {
79 "Plant must be deterministic", 201);
80 } else if (!spec_det) {
82 "Specification must be deterministic", 203);
85 FD_DF( "RabinCtrlPartialObsConsistencyCheck: passed all checks");
96 FD_DF( "RabinCtrlPartialObs: System interface");
99 EventSet controllableEvents, observableEvents;
106 controllableEvents, observableEvents, rSpec, rSupervisor);
111 const EventSet& rControllableEvents,
115 FD_DF( "RabinCtrlPartialObs: explicit event sets");
118 if (rControllableEvents. Empty()) {
119 throw Exception( "RabinCtrlPartialObs", "Empty controllable event set", 300);
122 if (rObservableEvents. Empty()) {
123 throw Exception( "RabinCtrlPartialObs", "Empty observable event set", 301);
127 throw Exception( "RabinCtrlPartialObs", "Empty specification language", 302);
134 if (&rSupervisor == &rPlant || &rSupervisor == &rSpec) {
137 pSupervisor-> Clear();
138 pSupervisor-> Name( "RabinCtrlPartialObs(" + rPlant. Name() + "," + rSpec. Name() + ")");
141 FD_DF( "RabinCtrlPartialObs: Starting synthesis algorithm");
144 FD_DF( "RabinCtrlPartialObs: Step 1 - Computing product");
150 "Product of plant and specification is empty", 302);
153 FD_DF( "RabinCtrlPartialObs: Product computed, states: " << Product.Size());
156 FD_DF( "RabinCtrlPartialObs: Step 2 - Applying epsilon observation directly on product");
162 Product.ClrObservable(allProductEvents);
163 Product.SetObservable(rObservableEvents);
167 if (epsObserved. Empty()) {
169 "Epsilon observation resulted in empty automaton", 303);
172 FD_DF( "RabinCtrlPartialObs: Epsilon observation applied, states: " << epsObserved. Size());
175 FD_DF( "RabinCtrlPartialObs: Step 3 - Pseudo-determinization");
178 if (pSupervisor-> Empty()) {
180 "Pseudo-determinization resulted in empty automaton", 303);
183 FD_DF( "RabinCtrlPartialObs: Pseudo-determinization completed, states: " << pSupervisor-> Size());
188 FD_DF( "RabinCtrlPartialObs: Synthesis completed successfully");
191 FD_DF( "RabinCtrlPartialObs: Exception caught: " << ex. What());
194 if (pSupervisor != &rSupervisor) {
201 if (pSupervisor != &rSupervisor) {
202 rSupervisor = *pSupervisor;
206 FD_DF( "RabinCtrlPartialObs: completed");
213 FD_DF( "ControlAut()");
217 if (&rRes == &rsDRA) {
221 pRes-> Name( "ControlAut(" + rsDRA. Name() + ")");
227 StateSet::Iterator sit;
229 if (rController. Exists(*sit)) {
235 StateSet::Iterator iit;
237 if (rController. Exists(*iit)) {
250 EventSet::Iterator eit;
251 for (eit = unobservableEvents. Begin(); eit != unobservableEvents. End(); ++eit) {
253 FD_DF( "ControlAut: Adding unobservable self-loop " << *sit << " --" <<
254 rsDRA. EventName(*eit) << "--> " << *sit);
263 Idx nextState = tit->X2;
266 if (rController. Exists(state)) {
269 if (allowedEvents. Exists(event)) {
271 FD_DF( "ControlAut: Adding transition " << state << " --" <<
272 rsDRA. EventName(event) << "--> " << nextState);
274 FD_DF( "ControlAut: Filtering out transition " << state << " --" <<
275 rsDRA. EventName(event) << "--> " << nextState << " (not allowed by controller)");
279 FD_DF( "ControlAut: Skipping transition " << state << " --" <<
280 rsDRA. EventName(event) << "--> " << nextState << " (state not in controller)");
291 FD_DF( "ControlAut: Generated Buchi automaton with " << rRes. Size() <<
292 " states and " << rRes. TransRelSize() << " transitions");
307 if(unobservableEvents. Size() == 0) {
312 std::string epsEventName = "eps";
324 for(tit = originalTransitions. Begin(); tit != originalTransitions. End(); ++tit) {
325 if(unobservableEvents. Exists(tit->Ev)) {
337 EventSet::Iterator uit;
338 for(uit = unobservableEvents. Begin(); uit != unobservableEvents. End(); ++uit) {
350 if(unobservableEvents. Size() == 0) {
355 std::string epsEventName = "eps";
367 for(tit = originalTransitions. Begin(); tit != originalTransitions. End(); ++tit) {
368 if(unobservableEvents. Exists(tit->Ev)) {
380 EventSet::Iterator uit;
381 for(uit = unobservableEvents. Begin(); uit != unobservableEvents. End(); ++uit) {
396 if (rStatesToMute. Exists(tit->X1) || rStatesToMute. Exists(tit->X2)) {
406 StateSet::Iterator sit;
407 for (sit = rStatesToMute. Begin(); sit != rStatesToMute. End(); ++sit) {
417 FD_DF( "RabinLanguageInclusion(): Starting language inclusion verification");
427 if (!genL_trim_result) {
428 FD_DF( "RabinLanguageInclusion(): genL trim failed");
432 if (!rabK_trim_result) {
433 FD_DF( "RabinLanguageInclusion(): rabK trim failed");
444 if (closure_inclusion) {
445 std::cout << "✓ closure(SupervisedSystem) ⊆ closure(specification)" << std::endl;
449 std::cout << "RabinLanguageInclusion(): Closure inclusion failed - bailing out" << std::endl;
461 FD_DF( "RabinLanguageInclusion(): Step 5: Made automata complete - genL: " << genL_full. Size()
462 << " states, rabK: " << rabK_full. Size() << " states");
467 rgProduct. Name( "Product System (rabK x genL)");
469 if (rgProduct. Size() == 0) {
470 FD_DF( "RabinLanguageInclusion(): Empty product system - languages are disjoint");
481 StateSet::Iterator sit;
484 lMarkedInProduct. Insert(*sit);
488 FD_DF( "RabinLanguageInclusion(): Found " << lMarkedInProduct. Size() << " L-marked states in product");
492 RabinAcceptance::CIterator rait;
494 for (rait = acceptance. Begin(); rait != acceptance. End(); ++rait) {
498 FD_DF( "RabinLanguageInclusion(): Processing Rabin pair: R=" << R. ToString() << ", I=" << I. ToString());
501 StateSet statesToMute = lMarkedInProduct;
506 statesToMute. Insert(*sit);
510 FD_DF( "RabinLanguageInclusion(): Muting " << statesToMute. Size() << " states (L-marked + complement of I)");
515 if (mutedProduct. Size() == 0) {
516 FD_DF( "RabinLanguageInclusion(): Muted product is empty - continuing to next Rabin pair");
521 std::list<StateSet> sccList;
525 FD_DF( "RabinLanguageInclusion(): Found " << sccList.size() << " SCCs in muted system");
528 bool foundProblematicSCC = false;
529 std::list<StateSet>::iterator sccIt;
531 for (sccIt = sccList.begin(); sccIt != sccList.end(); ++sccIt, ++sccIndex) {
532 bool hasRMarked = false;
533 StateSet::Iterator sccit;
534 for (sccit = sccIt->Begin(); sccit != sccIt->End(); ++sccit) {
541 if (hasRMarked && sccIt->Size() > 1) {
542 FD_DF( "RabinLanguageInclusion(): Found problematic SCC " << sccIndex << " with R-marked states");
543 foundProblematicSCC = true;
548 if (foundProblematicSCC) {
549 FD_DF( "RabinLanguageInclusion(): Language inclusion violated for Rabin pair");
554 FD_DF( "RabinLanguageInclusion(): All tests passed - language inclusion L ⊆ K holds");
virtual const char * What() const
const std::string & Name(void) const
bool Exists(const Idx &rIndex) const
Iterator Begin(void) const
const TaStateSet< StateAttr > & States(void) const
const TaEventSet< EventAttr > & Alphabet(void) const
bool SetTransition(Idx x1, Idx ev, Idx x2)
const ATransSet & TransRel(void) const
const Attr & Attribute(const Idx &rElem) const
void ClrControllable(Idx index)
void ClrObservable(Idx index)
EventSet ControllableEvents(void) const
void SetControllable(Idx index)
void ClrForcible(Idx index)
EventSet UnobservableEvents(void) const
EventSet ObservableEvents(void) const
void RabinAcceptance(const faudes::RabinAcceptance &rRabAcc)
std::string ToString(const std::string &rLabel="", const Type *pContext=0) const
StateSet::Iterator StatesBegin(void) const
StateSet::Iterator InitStatesBegin(void) const
bool SetTransition(Idx x1, Idx ev, Idx x2)
TransSet::Iterator TransRelBegin(void) const
void ClrTransition(Idx x1, Idx ev, Idx x2)
void InjectMarkedStates(const StateSet &rNewMarkedStates)
Idx MarkedStatesSize(void) const
void SetInitState(Idx index)
bool ExistsState(Idx index) const
StateSet::Iterator StatesEnd(void) const
TransSet::Iterator TransRelEnd(void) const
bool IsDeterministic(void) const
void SetMarkedState(Idx index)
StateSet::Iterator InitStatesEnd(void) const
Idx TransRelSize(void) const
std::string EventName(Idx index) const
bool ExistsMarkedState(Idx index) const
const StateSet & States(void) const
void InjectAlphabet(const EventSet &rNewalphabet)
bool Exists(const T &rElem) const
Iterator Begin(void) const
bool LanguageInclusion(const Generator &rGen1, const Generator &rGen2)
bool ComputeScc(const Generator &rGen, const SccFilter &rFilter, std::list< StateSet > &rSccList, StateSet &rRoots)
void Product(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void RabinBuechiAutomaton(const RabinAutomaton &rRAut, const Generator &rBAut, RabinAutomaton &rRes)
void RabinBuechiProduct(const RabinAutomaton &rRAut, const Generator &rBAut, RabinAutomaton &rRes)
bool IsRabinTrim(const RabinAutomaton &rRAut)
void PseudoDet(const RabinAutomaton &rGen, RabinAutomaton &rRes)
void RabinCtrlPartialObs(const System &rPlant, const RabinAutomaton &rSpec, RabinAutomaton &rSupervisor) Rabin control synthesis under partial observation (System interface)
void ExtractEventAttributes(const System &rSys, EventSet &rControllableEvents, EventSet &rObservableEvents) Extract controllable and observable events from System attributes.
bool RabinLanguageInclusion(const System &rGenL, const RabinAutomaton &rRabK) Verify language inclusion for Rabin automata.
void ControlAut(const RabinAutomaton &rsDRA, const TaIndexSet< EventSet > &rController, Generator &rRes) Apply controller to filter transitions and create Buchi automaton.
TrGenerator< RabinAcceptance, AttributeVoid, AttributeCFlags, AttributeVoid > RabinAutomaton
Generator CreateMutedAutomaton(const Generator &rOriginal, const StateSet &rStatesToMute) Create muted automaton by removing specified states and their transitions.
bool IsBuechiTrim(const vGenerator &rGen)
void RabinCtrlPartialObsConsistencyCheck(const RabinAutomaton &rPlant, const RabinAutomaton &rSpec, const EventSet &rControllableEvents, const EventSet &rObservableEvents) Check consistency of control problem setup.
void EpsObservation(const RabinAutomaton &rGen, RabinAutomaton &rRes) Epsilon observation for Rabin automata.
libFAUDES 2.33k
--- 2025.09.16
--- c++ api documentaion by doxygen
|