Implementing other statechart semantics¶
Anatomy of the interpreter¶
An Interpreter
makes use of several private methods for its initialization and computations.
These methods computes the transition(s) that should be processed, the resulting steps, etc.
These methods can be overridden or combined to define variants of statechart semantics.
-
Interpreter.
_select_event
()¶ Return (and consume!) the next available event if any. This method prioritizes internal events over external ones.
Return type: Optional
[Event
]Returns: An instance of Event or None if no event is available
-
Interpreter.
_select_transitions
(event=None)¶ Return a list of transitions that can be triggered according to the given event, or eventless transition if event is None.
Parameters: event ( Optional
[Event
]) – event to considerReturn type: List
[Transition
]Returns: a list of Transition instances
-
Interpreter.
_filter_transitions
(transitions)¶ Given a list of transitions, return a filtered list of transitions with respect to the inner-first/source-state semantic.
Parameters: transitions ( List
[Transition
]) – a list of Transition instancesReturn type: List
[Transition
]Returns: a list of Transition instances
-
Interpreter.
_sort_transitions
(transitions)¶ Given a list of triggered transitions, return a list of transitions in an order that represents the order in which they have to be processed.
Parameters: transitions ( List
[Transition
]) – a list of Transition instancesReturn type: List
[Transition
]Returns: an ordered list of Transition instances Raises: ExecutionError – In case of non-determinism (NonDeterminismError) or conflicting transitions (ConflictingTransitionsError).
-
Interpreter.
_create_steps
(event, transitions)¶ Return a (possibly empty) list of micro steps. Each micro step corresponds to the process of a transition matching given event.
Parameters: - event (
Event
) – the event to consider, if any - transitions (
Iterable
[Transition
]) – the transitions that should be processed
Return type: List
[MicroStep
]Returns: a list of micro steps.
- event (
-
Interpreter.
_create_stabilization_step
(names)¶ Return a stabilization step, ie. a step that lead to a more stable situation for the current statechart. Stabilization means:
- Enter the initial state of a compound state with no active child
- Enter the memory of a history state
- Enter the children of an orthogonal state with no active child
- Exit active states if all “deepest” (leaves) states are final
Parameters: names ( Iterable
[str
]) – List of states to consider (usually, the active configuration)Return type: Optional
[MicroStep
]Returns: A MicroStep instance or None if this statechart can not be more stabilized
-
Interpreter.
_apply_step
(step)¶ Apply given MicroStep on this statechart
Parameters: step ( MicroStep
) – MicroStep instanceReturn type: MicroStep
Returns: a new MicroStep, completed with sent events
These methods are all used (even indirectly) by execute_once
.
See also
Consider looking at the source of execute_once
to understand
how these methods are related and organized.
Pointers for other semantics¶
Outer-first/source-state semantics¶
For example, in order to obtain an outer-first/source-state semantics (instead of the
inner-first/source-state one that Sismic provides by default),
one should subclass Interpreter
and override _filter_transitions
.
Internal events have no priority¶
If you want to change the semantics of Sismic so that internal events no longer have
priority over external events, it suffices to override the _select_event()
method
and to invert the order in which the internal and external events queues are visited.
Dealing with non-determinism¶
If you want to change the way the Sismic deals with non-determinism,
for example because it deviates from the semantics given by SCXML or Rhapsody
(remember Statechart semantics), you can implement your own variant for dealing with non-determinism.
The method _sort_transitions()
is where the whole job is done:
- It looks for non-determinism in (non-parallel) transitions,
- It looks for conflicting transitions in parallel transitions,
- It sorts the kept transitions based on our semantic.
According to your needs, adapt the content of this method.