public void TestStateDistinguisher_EnumerateAllDistinguishingSequences() { var solver = ContextFreeGrammar.GetContext(); var regex = "^([0-9]{4,}|[3-9][0-9]{2}|2[5-9][0-9])$"; string[] regexes = File.ReadAllLines(regexesFile); var nfa = solver.Convert(regex).RemoveEpsilons(); var dfa = nfa.Determinize();//.MakeTotal(); var mfa = dfa.Minimize(); var dist = new StateDistinguisher <BDD>(dfa, x => (char)x.GetMin(), false); int minimalStateCount = mfa.StateCount; var distinguishers = new Dictionary <Tuple <int, int>, List <ConsList <BDD> > >(); foreach (int p in mfa.GetStates()) { foreach (int q in mfa.GetStates()) { if (p != q) { var pq = (p < q ? new Tuple <int, int>(p, q) : new Tuple <int, int>(q, p)); if (!distinguishers.ContainsKey(pq)) { distinguishers[pq] = new List <ConsList <BDD> >(dist.EnumerateAllDistinguishingSequences(p, q)); } } } } Assert.AreEqual <int>((mfa.StateCount * (mfa.StateCount - 1)) / 2, distinguishers.Count); }
public void TestStateDistinguisher_BugRepo2() { var solver = new CharSetSolver(); var regex = @"(^(?:\w\:)?(?:/|\\\\){1}[^/|\\]*(?:/|\\){1})"; var A = solver.Convert(regex).Determinize(); var states = new List <int>(A.GetStates()); var dist = new StateDistinguisher <BDD>(A); var distmap = new List <Tuple <Tuple <int, int>, List <ConsList <BDD> > > >(dist.EnumerateAllDistinguishingSequences()); var AMin = A.Minimize(); ValidateDistinguishers(A, AMin, dist, 0, regex); }