public static void MakeFSM() { var starting_state = new VectorizeState(0, 0, 0, 0, 0); var starting_node = new FSM_Node <VectorizeState>(starting_state); string[][] transitions = new string[][] { hat, goggles, jacket, pants, grab }; generateFSM(starting_node, transitions); int traces = 0; var queue = new Queue <NodePath <VectorizeState> >(); var root = new NodePath <VectorizeState>(starting_node, null); queue.Enqueue(root); while (!queue.IsEmpty()) { var top = queue.Dequeue(); var top_state = top.Node.GetValue(); traces = checkFinishedTrace(traces, top, top_state, transitions); //add all new nodes to the stack foreach (var neighbor in top.Node.GetNeighbors()) { queue.Enqueue(new NodePath <VectorizeState>(neighbor, top)); } } }
private static int checkFinishedTrace(int traces, NodePath <VectorizeState> top, VectorizeState top_state, string[][] transitions) { for (int ar = 0; ar < transitions.Length; ar++) { if (top_state.States[ar] < transitions[ar].Length) { return(traces); } } var stk = new Stack <NodePath <VectorizeState> >(); NodePath <VectorizeState> ptr = top; while (ptr != null) { stk.Add(ptr); ptr = ptr.Parent; } Console.Write("Trace {0}: ", ++traces); while (!stk.IsEmpty()) { var here = stk.Pop(); if (here.Parent != null) { var msg = ((FSM_Node <VectorizeState>)here.Parent.Node).GetMessage((FSM_Node <VectorizeState>)here.Node); Console.Write(msg); if (!stk.IsEmpty()) { Console.Write(" -> "); } } } Console.WriteLine(); return(traces); }