|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES All Classes | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectptolemy.kernel.util.NamedObj
ptolemy.kernel.util.Attribute
ptolemy.actor.Director
ptolemy.domains.fsm.kernel.FSMDirector
public class FSMDirector
An FSMDirector governs the execution of a modal model. A modal model is a TypedCompositeActor with a FSMDirector as local director. The mode control logic is captured by a mode controller, an instance of FSMActor contained by the composite actor. Each state of the mode controller represents a mode of operation and can be refined by an opaque CompositeActor contained by the same composite actor.
When a modal model is fired, this director first transfers the input tokens from the outside domain to the mode controller and the refinement of its current state. The preemptive transitions from the current state of the mode controller are examined. If there is more than one transition enabled, and any of the enabled transitions is not marked nondeterministic, an exception is thrown. If there is exactly one preemptive transition enabled then it is chosen. The choice actions (outputActions) contained by the transition are executed. Any output token produced by the mode controller is transferred to both the output ports of the modal model and the input ports of the mode controller. Then the refinements associated with the enabled transition are executed. Any output token produced by the refinements is transferred to both the output ports of the modal model and the input ports of the mode controller. The refinements of the current state will not be fired.
If no preemptive transition is enabled, the refinements of the current state are fired. Any output token produced by the refinements is transferred to both the output ports of the modal model and the input ports of the mode controller. After this, the non-preemptive transitions from the current state of the mode controller are examined. If there is more than one transition enabled, and any of the enabled transitions is not marked nondeterministic, an exception is thrown. If there is exactly one non-preemptive transition enabled then it is chosen and the choice actions contained by the transition are executed. Any output token produced by the mode controller is transferred to the output ports of the modal model and the input ports of the mode controller. Then, the refinements of the enabled transition are executed. Any output token produced by the refinements is transferred to both the output ports of the modal model and the input ports of the mode controller.
At the end of one firing, the modal model transfers its outputs to the outside model. The mode controller does not change state during successive firings in one iteration of the top level in order to support upper level domains that iterate to a fixed point.
When the modal model is postfired, the chosen transition of the latest firing is committed. The commit actions contained by the transition are executed and the current state of the mode controller is set to the destination state of the transition.
FSMActor
,
Serialized Form
Red (hyzheng) |
Yellow (hyzheng) |
Nested Class Summary |
---|
Nested classes/interfaces inherited from class ptolemy.kernel.util.NamedObj |
---|
NamedObj.ContainedObjectsIterator |
Field Summary | |
---|---|
private FSMActor |
_controller
Cached reference to mode controller. |
private long |
_controllerVersion
Version of cached reference to mode controller. |
protected java.util.Map |
_currentLocalReceiverMap
Map from input ports of the modal model to the local receivers for the current state. |
protected java.util.List |
_enabledRefinements
The list of enabled actors that refines the current state. |
protected Transition |
_enabledTransition
cached enabled transition. |
protected java.util.Map |
_localReceiverMaps
Stores for each state of the mode controller the map from input ports of the modal model to the local receivers when the mode controller is in that state. |
private long |
_localReceiverMapsVersion
|
private java.util.List<Actor> |
_stateRefinementsToPostfire
State refinements to postfire(), as determined by the fire() method. |
private java.util.List<Actor> |
_transitionRefinementsToPostfire
Transition refinements to postfire(), as determined by the fire() method. |
StringAttribute |
controllerName
Attribute specifying the name of the mode controller in the container of this director. |
Fields inherited from class ptolemy.actor.Director |
---|
_actorsFinishedExecution, _currentTime, _finishRequested, _initializables, _stopRequested, timeResolution |
Fields inherited from class ptolemy.kernel.util.NamedObj |
---|
_changeListeners, _changeLock, _changeRequests, _debugging, _debugListeners, _elementName, _isPersistent, _verbose, _workspace, ATTRIBUTES, CLASSNAME, COMPLETE, CONTENTS, DEEP, FULLNAME, LINKS |
Fields inherited from interface ptolemy.actor.Executable |
---|
COMPLETED, NOT_READY, STOP_ITERATING |
Constructor Summary | |
---|---|
FSMDirector()
Construct a director in the default workspace with an empty string as its name. |
|
FSMDirector(CompositeEntity container,
java.lang.String name)
Construct a director in the given container with the given name. |
|
FSMDirector(Workspace workspace)
Construct a director in the workspace with an empty name. |
Method Summary | |
---|---|
protected void |
_buildLocalReceiverMaps()
Build for each state of the mode controller the map from input ports of the modal model to the local receivers when the mode controller is in that state. |
private void |
_checkActorsForReceiver(TypedActor[] actors,
Nameable cont,
Receiver receiver,
java.util.List resultsList)
|
protected java.util.List |
_checkTransition(java.util.List transitionList)
Return a list of enabled transitions among the given list of transitions. |
protected Transition |
_chooseTransition(java.util.List transitionList)
Return the enabled transition among the given list of transitions. |
private void |
_createAttribute()
Create the controllerName attribute. |
protected Receiver[][] |
_currentLocalReceivers(IOPort port)
Return the receivers contained by ports connected to the inside of the given input port and on the mode controller or the refinement of its current state. |
protected Transition |
_getLastChosenTransition()
Return the last chosen transition. |
protected void |
_readInputs()
Set the value of the shadow variables for input ports of the controller actor. |
protected void |
_readOutputsFromRefinement()
Set the value of the shadow variables for input ports of the controller actor that are defined by output ports of the refinement. |
protected void |
_setCurrentConnectionMap()
Set the map from input ports to boolean flags indicating whether a channel is connected to an output port of the refinement of the current state. |
protected void |
_setCurrentState(State state)
Set the current state of this actor. |
void |
attributeChanged(Attribute attribute)
React to a change in an attribute. |
java.lang.Object |
clone(Workspace workspace)
Clone the director into the specified workspace. |
Dependency |
defaultDependency()
Return a default dependency to use between input input ports and output ports. |
void |
fire()
Fire the model model for one iteration. |
Time |
fireAt(Actor actor,
Time time)
Schedule a firing of the given actor at the given time. |
Entity |
getContext()
Return the explicit change context. |
FSMActor |
getController()
Return the mode controller of this director. |
Time |
getModelNextIterationTime()
Override the base class so that if any outgoing transition has a guard that evaluates to true, then return the current time. |
java.util.List |
getModifiedVariables()
Return a list of variables that are modified in a modal model. |
ParseTreeEvaluator |
getParseTreeEvaluator()
Return the parse tree evaluator used to evaluate guard expressions. |
boolean |
handleModelError(NamedObj context,
IllegalActionException exception)
Return true if the model errors are handled. |
boolean |
implementsStrictActorSemantics()
Return true if all state refinements have directors that implement the strict actor semantics and if the enclosing executive director also returns true. |
void |
initialize()
Initialize the mode controller and all the refinements by calling the initialize() method in the super class. |
boolean |
isStrict()
Return false if there is any output of the container does not depend directly on all inputs of the container. |
Receiver |
newReceiver()
Return a receiver that is a one-place buffer. |
boolean |
postfire()
Invoke postfire() on any state refinements that were fired, then execute the commit actions contained by the last chosen transition, if any, then invoke postfire() on any transition refinements that were fired, and finally set the current state to the destination state of the transition. |
boolean |
prefire()
Return true if the mode controller is ready to fire. |
void |
setContainer(NamedObj container)
If the container is not null, register this director as the model error handler. |
void |
setModelTime(Time newTime)
Set a new value to the current time of the model, where the new time can be earlier than the current time. |
boolean |
transferInputs(IOPort port)
Transfer data from the input port of the container to the ports connected to the inside of the input port and on the mode controller or the refinement of its current state. |
Methods inherited from class ptolemy.kernel.util.Attribute |
---|
_checkContainer, _getContainedObject, _propagateExistence, getContainer, moveDown, moveToFirst, moveToIndex, moveToLast, moveUp, setName, updateContent |
Methods inherited from class java.lang.Object |
---|
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
Methods inherited from interface ptolemy.kernel.util.Nameable |
---|
description, getContainer, getDisplayName, getFullName, getName, getName, setName |
Field Detail |
---|
public StringAttribute controllerName
protected java.util.Map _currentLocalReceiverMap
protected java.util.List _enabledRefinements
protected Transition _enabledTransition
protected java.util.Map _localReceiverMaps
private FSMActor _controller
private long _controllerVersion
private long _localReceiverMapsVersion
private java.util.List<Actor> _stateRefinementsToPostfire
private java.util.List<Actor> _transitionRefinementsToPostfire
Constructor Detail |
---|
public FSMDirector()
public FSMDirector(Workspace workspace)
workspace
- The workspace of this director.public FSMDirector(CompositeEntity container, java.lang.String name) throws IllegalActionException, NameDuplicationException
container
- Container of this director.name
- Name of this director.
IllegalActionException
- If the name has a period in it, or
the director is not compatible with the specified container.
NameDuplicationException
- If the container not a
CompositeActor and the name collides with an entity in the container.Method Detail |
---|
public void attributeChanged(Attribute attribute) throws IllegalActionException
attributeChanged
in class Director
attribute
- The attribute that changed.
IllegalActionException
- If thrown by the superclass
attributeChanged() method.public java.lang.Object clone(Workspace workspace) throws java.lang.CloneNotSupportedException
clone
in class Attribute
workspace
- The workspace for the new director.
java.lang.CloneNotSupportedException
- If a derived class contains
an attribute that cannot be cloned.NamedObj.exportMoML(Writer, int, String)
,
NamedObj.setDeferringChangeRequests(boolean)
public Dependency defaultDependency()
defaultDependency
in class Director
Dependency
,
CausalityInterface
,
Actor.getCausalityInterface()
public void fire() throws IllegalActionException
fire
in interface Executable
fire
in class Director
IllegalActionException
- If there is more than one
transition enabled and nondeterminism is not permitted,
or there is no controller, or it is thrown by any
choice action.public Time fireAt(Actor actor, Time time) throws IllegalActionException
If there is no executive director, then the request results in model time of this director being set to the specified time. The reason for this latter behavior is to support models where FSM is at the top level. A director inside the state refinements could be timed, and expects time to advance in its environment between firings. It typically makes a call to fireAt() at the conclusion of each iteration to specify the time value it expects to next see. Such directors can thus be used inside top-level FSM models. For example, the DEDirector and SDFDirector behave exactly this way.
fireAt
in class Director
actor
- The actor scheduled to be fired.time
- The scheduled time.
IllegalActionException
- If thrown by the executive director.Director.fireAtCurrentTime(Actor)
public FSMActor getController() throws IllegalActionException
IllegalActionException
- If no controller is found.public Entity getContext()
getContext
in interface ExplicitChangeContext
public Time getModelNextIterationTime()
getModelNextIterationTime
in class Director
Director.getModelTime()
public java.util.List getModifiedVariables() throws IllegalActionException
getModifiedVariables
in interface ExplicitChangeContext
IllegalActionException
- If no controller can be found,
or the variables to be assigned by the actions can not be found.public ParseTreeEvaluator getParseTreeEvaluator()
ParseTreeEvaluator
is returned. The derived classes may need
to override this method to return different parse tree evaluators.
public boolean handleModelError(NamedObj context, IllegalActionException exception) throws IllegalActionException
In this method, model errors including multipleEnabledTransitionException and InvariantViolationException are handled.
In the current design, if multiple enabled transitions are detected, an exception will be thrown. For future designs, different ways to handle this situation will be introduced here.
When an invariant is violated, this method checks whether there exists an enabled (non-preemptive) transition. If there is one, the model error is ignored and this director will handle the enabled transition later. Otherwise, an exception will be thrown.
handleModelError
in interface ModelErrorHandler
handleModelError
in class NamedObj
context
- The context where the model error happens.exception
- An exception that represents the model error.
IllegalActionException
- If multiple enabled transition is
detected, or mode controller can not be found, or can not read
outputs from refinements.NamedObj.setModelErrorHandler(ModelErrorHandler handler)
public boolean implementsStrictActorSemantics()
implementsStrictActorSemantics
in class Director
public void initialize() throws IllegalActionException
initialize
in interface Initializable
initialize
in class Director
IllegalActionException
- If thrown by the initialize() method
of the super class, or can not find mode controller, or can not find
refinement of the current state.public boolean isStrict() throws IllegalActionException
isStrict
in interface Executable
isStrict
in class Director
IllegalActionException
- Thrown if causality interface
cannot be computed.public Receiver newReceiver()
newReceiver
in class Director
public boolean postfire() throws IllegalActionException
If any transition was taken in this iteration, and if there is an executive director, then this method calls fireAtCurrentTime(Actor) on that executive director. This requests a refiring in case the there is an enabled transition. If there is, then the current state is transient, and we will want to spend zero time in it.
postfire
in interface Executable
postfire
in class Director
IllegalActionException
- If thrown by any commit action
or there is no controller.public boolean prefire() throws IllegalActionException
prefire
in interface Executable
prefire
in class Director
IllegalActionException
- If there is no controller.public void setContainer(NamedObj container) throws IllegalActionException, NameDuplicationException
setContainer
in class Director
container
- The proposed container.
IllegalActionException
- If the action would result in a
recursive containment structure, or if this entity and container are
not in the same workspace, or if the protected method _checkContainer()
throws it, or if a contained Settable becomes invalid and the error
handler throws it.
NameDuplicationException
- If the name of this entity
collides with a name already in the container.Attribute.getContainer()
public void setModelTime(Time newTime) throws IllegalActionException
setModelTime
in class Director
newTime
- The new current simulation time.
IllegalActionException
- Not thrown in this base class.Director.getModelTime()
public boolean transferInputs(IOPort port) throws IllegalActionException
transferInputs
in class Director
port
- The input port to transfer tokens from.
IllegalActionException
- If the port is not an opaque
input port.protected void _buildLocalReceiverMaps() throws IllegalActionException
IllegalActionException
- If there is no mode controller,
or can not find refinements for states.protected java.util.List _checkTransition(java.util.List transitionList) throws IllegalActionException
transitionList
- A list of transitions.
IllegalActionException
- If the guard expression of any
transition can not be evaluated.protected Transition _chooseTransition(java.util.List transitionList) throws IllegalActionException
transitionList
- A list of transitions.
IllegalActionException
- If there is more than one
transition enabled, or if thrown by any choice action contained
by the enabled transition, or if there is no controller.protected Receiver[][] _currentLocalReceivers(IOPort port) throws IllegalActionException
port
- An input port of the container of this director.
IllegalActionException
- If there is no controller.protected Transition _getLastChosenTransition() throws IllegalActionException
IllegalActionException
- If there is no controller.protected void _readInputs() throws IllegalActionException
IllegalActionException
- If a shadow variable cannot take
the token read from its corresponding channel (should not occur).protected void _readOutputsFromRefinement() throws IllegalActionException
IllegalActionException
- If a shadow variable cannot take
the token read from its corresponding channel (should not occur).protected void _setCurrentConnectionMap() throws IllegalActionException
IllegalActionException
- If the refinement specified
for one of the states is not valid, or if there is no controller.protected void _setCurrentState(State state) throws IllegalActionException
state
- The state to set.
IllegalActionException
- If there is no controller.private void _checkActorsForReceiver(TypedActor[] actors, Nameable cont, Receiver receiver, java.util.List resultsList)
private void _createAttribute()
|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES All Classes | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |