|
|
||||||
|
|
Control under Partial Observation w.r.t Rabin SpecificationsThis section addresses functions for supervisory controller synthesis under partial observation with Rabin specification. The synthesis approach combines control pattern expansion, epsilon observation, and pseudo-determinization to compute deterministic supervisors that enforce the specifications while respecting controllability and observability constraints. This approach was proposed by Thistle/Lamouchi in [W5].
Partial Observation Control ProblemIn the partial observation setting, the supervisor can only observe a subset of events Sigma_o ⊆ Sigma and control a subset of events Sigma_c ⊆ Sigma. The synthesis problem is to find a supervisor that:
Synthesis AlgorithmThe synthesis algorithm consists of the following steps:
RabinCtrlPartialObsRabin control synthesis under partial observation with control patterns. Signature:RabinCtrlPartialObs(+In+ System GPlant, +In+ RabinAutomaton GSpec, +Out+ RabinAutomaton GSupervisor) RabinCtrlPartialObs(+In+ RabinAutomaton GPlant, +In+ EventSet AContr, +In+ EventSet AObs, +In+ RabinAutomaton GSpec, +Out+ RabinAutomaton GSupervisor) Detailed description:This function performs complete supervisory control synthesis for Rabin automata under partial observation. It automatically extracts controllable and observable events from System attributes or accepts explicit event sets. AlgorithmThe function internally calls RabinProduct, ExpandToControlPatterns, EpsObservation, and PseudoDet in sequence to compute the supervisor. Example// System plant; RabinAutomaton spec, supervisor; // Set up plant with controllable and observable events EventSet controllable; controllable.Insert("a"); plant.SetControllable(controllable); EventSet observable; observable.Insert("a"); observable.Insert("c"); plant.SetObservable(observable); // Read specification spec.Read("specification.gen"); // Synthesize supervisor RabinCtrlPartialObs(plant, spec, supervisor); // Write result supervisor.Write("supervisor.gen"); RabinProductDetailed description:Computes the synchronous product (parallel composition) of two Rabin automata. The result combines the behaviors of both automata with a properly composed Rabin acceptance condition. ExampleRabinAutomaton plant, spec, product; plant.Read("plant.gen"); spec.Read("specification.gen"); RabinProduct(plant, spec, product); product.Write("product.gen"); EpsObservationEpsilon observation for Rabin automata by replacing unobservable events with epsilon events. Signature:EpsObservation(+In+ RabinAutomaton G, +Out+ RabinAutomaton GRes) Detailed description:Performs epsilon observation on a Rabin automaton by replacing unobservable events with epsilon transitions. This transformation preserves the acceptance condition while enabling the handling of partial observability. AlgorithmThe function identifies unobservable events and creates epsilon transitions that maintain the control pattern structure necessary for synthesis. PseudoDetPseudo-determinization algorithm for Rabin automata. Signature:PseudoDet(+In+ RabinAutomaton G, +Out+ RabinAutomaton GRes) Detailed description:Converts a nondeterministic Rabin automaton to an equivalent deterministic Rabin automaton using the pseudo-determinization algorithm. The algorithm uses labeled trees to track acceptance condition during determinization. AlgorithmThe pseudo-determinization algorithm maintains tree structures for each state to track which original states are reachable and their acceptance status. This ensures the Rabin acceptance condition is preserved. ExampleRabinAutomaton nondet, det; nondet.Read("nondeterministic.gen"); PseudoDet(nondet, det); det.Write("deterministic.gen"); Complete Synthesis ExampleThe following example demonstrates the complete synthesis process: // Set up plant model System plant; Generator machine1, machine2; machine1.Read("machine1.gen"); machine2.Read("machine2.gen"); Parallel(machine1, machine2, plant); // Configure controllability EventSet controllable; controllable.Insert("start"); plant.SetControllable(controllable); // Configure observability EventSet observable; observable.Insert("start"); observable.Insert("done"); plant.SetObservable(observable); // Read specification RabinAutomaton spec; spec.Read("specification.gen"); // Synthesize supervisor (one-line solution!) RabinAutomaton supervisor; RabinCtrlPartialObs(plant, spec, supervisor); // Verify and save result if(supervisor.Empty()) { std::cout << "No supervisor exists!" << std::endl; } else { std::cout << "Supervisor generated successfully" << std::endl; supervisor.Write("supervisor.gen"); } libFAUDES 2.33l --- 2025.09.16 --- with "omegaaut-synthesis-observer-observability-diagnosis-hiosys-iosystem-multitasking-coordinationcontrol-timed-simulator-iodevice-priorities-luabindings-hybrid-example-pybindings" |