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);
        }