internal ApplicableSingleOrMultipleTransition(STATE preState, EVENTTYPE eventType , StateMachineFactory.Transition <OPERAND, STATE, EVENTTYPE, EVENT> transition) { this.preState = preState; this.eventType = eventType; this.transition = transition; }
/// <summary>Effect a transition due to the effecting stimulus.</summary> /// <param name="state">current state</param> /// <param name="eventType">trigger to initiate the transition</param> /// <param name="cause">causal eventType context</param> /// <returns>transitioned state</returns> /// <exception cref="Org.Apache.Hadoop.Yarn.State.InvalidStateTransitonException"/> private STATE DoTransition(OPERAND operand, STATE oldState, EVENTTYPE eventType, EVENT @event) { // We can assume that stateMachineTable is non-null because we call // maybeMakeStateMachineTable() when we build an InnerStateMachine , // and this code only gets called from inside a working InnerStateMachine . IDictionary <EVENTTYPE, StateMachineFactory.Transition <OPERAND, STATE, EVENTTYPE, EVENT> > transitionMap = stateMachineTable[oldState]; if (transitionMap != null) { StateMachineFactory.Transition <OPERAND, STATE, EVENTTYPE, EVENT> transition = transitionMap [eventType]; if (transition != null) { return(transition.DoTransition(operand, oldState, @event, eventType)); } } throw new InvalidStateTransitonException(oldState, eventType); }
/// <summary>Generate a graph represents the state graph of this StateMachine</summary> /// <param name="name">graph name</param> /// <returns>Graph object generated</returns> public Graph GenerateStateGraph(string name) { MaybeMakeStateMachineTable(); Graph g = new Graph(name); foreach (STATE startState in stateMachineTable.Keys) { IDictionary <EVENTTYPE, StateMachineFactory.Transition <OPERAND, STATE, EVENTTYPE, EVENT> > transitions = stateMachineTable[startState]; foreach (KeyValuePair <EVENTTYPE, StateMachineFactory.Transition <OPERAND, STATE, EVENTTYPE , EVENT> > entry in transitions) { StateMachineFactory.Transition <OPERAND, STATE, EVENTTYPE, EVENT> transition = entry .Value; if (transition is StateMachineFactory.SingleInternalArc) { StateMachineFactory.SingleInternalArc sa = (StateMachineFactory.SingleInternalArc )transition; Graph.Node fromNode = g.GetNode(startState.ToString()); Graph.Node toNode = g.GetNode(sa.postState.ToString()); fromNode.AddEdge(toNode, entry.Key.ToString()); } else { if (transition is StateMachineFactory.MultipleInternalArc) { StateMachineFactory.MultipleInternalArc ma = (StateMachineFactory.MultipleInternalArc )transition; IEnumerator iter = ma.validPostStates.GetEnumerator(); while (iter.HasNext()) { Graph.Node fromNode = g.GetNode(startState.ToString()); Graph.Node toNode = g.GetNode(iter.Next().ToString()); fromNode.AddEdge(toNode, entry.Key.ToString()); } } } } } return(g); }