/// <summary>
        /// Minimizes (and determinizes if not already deterministic) the given automaton.
        /// </summary>
        /// <param name="a">The automaton.</param>
        internal static void Minimize(Automaton a)
        {
            if (!a.IsSingleton)
            {
                switch (Automaton.Minimization)
                {
                case Automaton.MinimizeHuffman:
                    MinimizationOperations.MinimizeHuffman(a);
                    break;

                case Automaton.MinimizeBrzozowski:
                    MinimizationOperations.MinimizeBrzozowski(a);
                    break;

                default:
                    MinimizationOperations.MinimizeHopcroft(a);
                    break;
                }
            }

            a.RecomputeHashCode();
        }