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