예제 #1
0
        private static void TopologicalSort(string name, Surf.Set dependencyGraph, Surf.Tuple topologicalSort)
        {
            Surf.Set completed = new Surf.Set();
            completed.Add(name);

            while (dependencyGraph.Count > 0)
            {
                for (int i = 0; i < dependencyGraph.Count; i++)
                {
                    Surf.Tuple tuple = (Surf.Tuple)dependencyGraph[i];

                    if (((Surf.Set)tuple[1]).Difference(completed).Count == 0)
                    {
                        topologicalSort.Add(tuple[0]);
                        completed.Add(tuple[0]);
                        dependencyGraph.Remove(i);
                        break;
                    }
                }
            }
        }
예제 #2
0
        // Hopcroft's Algorithm
        public static FiniteAutomaton Minimize(FiniteAutomaton dfa)
        {
            System.Console.WriteLine("START Minimize     " + System.DateTime.Now.ToString());

            Surf.Set dfa_transitions = Set(dfa.Transitions);

            // Split final states and non-final states.
            Surf.Set worklist = new Surf.Set();
            Surf.Set P        = new Surf.Set();

            Surf.Set f = SplitFinalStates(dfa.Tokens);
            foreach (Surf.Set f2 in f)
            {
                worklist.Add(f2);
                P.Add(f2);
            }
            Surf.Set nonFinalStates = new Surf.Set(dfa.States).Difference(new Surf.Set(dfa.FinalStates));
            worklist.Add(nonFinalStates);
            P.Add(nonFinalStates);

            // While there are more states to split.
            while (worklist.Count > 0)
            {
                Surf.Set p = (Surf.Set)worklist[0];
                worklist.Remove(0);

                Surf.Set t = Split(p, dfa_transitions, P);

                if (t.Count > 1)
                {
                    int i = 0;
                    foreach (Surf.Set p2 in P)
                    {
                        if (p2.Equals(p))
                        {
                            P.Remove(i);
                            break;
                        }
                        i++;
                    }
                    foreach (Surf.Set t2 in t)
                    {
                        worklist.Add(t2);
                        P.Add(t2);
                    }
                }
            }

            /*
             * // Split final states and non-final states.
             * Surf.Set P = new Surf.Set();
             * Surf.Set f = SplitFinalStates(dfa.Tokens);
             * foreach (Surf.Set f2 in f)
             * {
             *      P.Add(f2);
             * }
             * P.Add(new Surf.Set(dfa.States).Difference(new Surf.Set(dfa.FinalStates)));
             *
             * // While there are more states to split.
             * bool isChanging = true;
             * while (isChanging)
             * {
             *      isChanging = false;
             *
             *      Surf.Set T = new Surf.Set();
             *      foreach (Surf.Set p in P)
             *      {
             *              Surf.Set t = Split(p, dfa_transitions, P);
             *
             *              if (t.Count > 1)
             *              {
             *                      isChanging = true;
             *              }
             *              foreach (Surf.Set t2 in t)
             *              {
             *                      T.Add(t2);
             *              }
             *      }
             *      P = T;
             * }
             */



            Surf.Set states      = new Surf.Set();
            Surf.Set alphabet    = new Surf.Set();
            Surf.Set transitions = new Surf.Set();
            int      startState;

            Surf.Set finalStates = new Surf.Set();
            Surf.Set tokens      = new Surf.Set();

            Surf.Set P_map = PartitionMap(P);

            foreach (int state in dfa.States)
            {
                states.Add(P_map.Apply(state));
            }
            alphabet = new Surf.Set(dfa.Alphabet);
            foreach (Surf.Tuple transition in dfa_transitions)
            {
                Surf.Tuple input     = (Surf.Tuple)transition[0];
                int        fromState = (int)P_map.Apply(input[0]);
                char       character = (char)input[1];
                int        toState   = (int)P_map.Apply(transition[1]);
                transitions.Add(new Surf.Tuple(new object[] { new Surf.Tuple(new object[] { fromState, character }), toState }));
            }
            startState = (int)P_map.Apply(dfa.StartState);
            foreach (int state in dfa.FinalStates)
            {
                finalStates.Add(P_map.Apply(state));
                if (!tokens.IsDefined(P_map.Apply(state)))
                {
                    tokens.Add(new Surf.Tuple(new object[] { P_map.Apply(state), Lookup(dfa.Tokens, state) }));
                }
            }

            System.Console.WriteLine("END   Minimize     " + System.DateTime.Now.ToString());
            return(Reorder(new FiniteAutomaton(states, alphabet, transitions, startState, finalStates, tokens)));
        }