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