Example #1
0
        public static void Determinize(Automaton a, List <State> initialset)
        {
            var points   = a.GetStartPoints();
            var comparer = new ListEqualityComparer <State>();

            var sets     = new Dictionary <List <State>, List <State> >(comparer);
            var worklist = new LinkedList <List <State> >();
            var newstate = new Dictionary <List <State>, State>(comparer);

            sets.Add(initialset, initialset);
            _         = worklist.AddLast(initialset);
            a.Initial = new State();
            newstate.Add(initialset, a.Initial);

            while (worklist.Count > 0)
            {
                var s = worklist.RemoveAndReturnFirst();
                _ = newstate.TryGetValue(s, out var r);
                foreach (var q in s)
                {
                    if (q.Accept)
                    {
                        r.Accept = true;
                        break;
                    }
                }

                for (var n = 0; n < points.Length; n++)
                {
                    var set = new HashSet <State>();
                    foreach (var c in s)
                    {
                        foreach (var t in c.Transitions)
                        {
                            if (t.Min <= points[n] && points[n] <= t.Max)
                            {
                                _ = set.Add(t.To);
                            }
                        }
                    }

                    var p = set.ToList();

                    if (!sets.ContainsKey(p))
                    {
                        sets.Add(p, p);
                        _ = worklist.AddLast(p);
                        newstate.Add(p, new State());
                    }

                    _ = newstate.TryGetValue(p, out var q);
                    var min = points[n];
                    var max = n + 1 < points.Length ? (char)(points[n + 1] - 1) : char.MaxValue;
                    r.Transitions.Add(new Transition(min, max, q));
                }
            }

            a.IsDeterministic = true;
            a.RemoveDeadTransitions();
        }
        public static void MinimizeHopcroft(Automaton a)
        {
            a.Determinize();
            var tr = a.Initial.Transitions;

            if (tr.Count == 1)
            {
                var t = tr[0];
                if (t.To == a.Initial && t.Min == char.MinValue && t.Max == char.MaxValue)
                {
                    return;
                }
            }

            a.Totalize();

            var ss     = a.GetStates();
            var states = new State[ss.Count];
            var number = 0;

            foreach (var q in ss)
            {
                states[number] = q;
                q.Number       = number++;
            }

            var sigma = a.GetStartPoints();

            var v       = Enumerable.Repeat <LinkedList <State> >(default, sigma.Length);