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)); } } }
/// <summary> /// Recursively generate the FSM /// </summary> /// <param name="par"></param> private static void generateFSM(FSM_Node <VectorizeState> par, string[][] indices) { var p = par.GetValue(); for (int ar = 0; ar < indices.Length; ar++) { string[] select = indices[ar]; if (p.States[ar] == select.Length) { continue; } var tmp = new FSM_Node <VectorizeState>(p.IncrementState(ar)); par.AddNeighbor(tmp, select[p.States[ar]]); } foreach (var n in par.GetNeighbors()) { generateFSM((FSM_Node <VectorizeState>)n, indices); } }