public void TestStateDistinguisherH() { var solver = new CharSetSolver(); var A = solver.Convert("A").Determinize().RemoveEpsilons(); var B = solver.Convert("B.*B").Determinize().RemoveEpsilons(); var AB = A.Intersect(B); var states = new List <int>(AB.GetStates()); var dist = new StateDistinguisher <BDD>(AB); //check suffix-closedness var ABMin = AB.Minimize(); var diststr = dist.GetAllDistinguishingSequences(); //here we know that the minimization algorithm keeps the same state ids Func <int, int, Tuple <int, int> > MkPair = (x, y) => (x <= y ? new Tuple <int, int>(x, y) : new Tuple <int, int>(y, x)); foreach (var p in ABMin.States) { foreach (var q in ABMin.States) { if (p != q) { var d = dist.GetDistinguishingSequence(p, q); Assert.IsTrue(d != null); //check that d distinguishes p from q var p1 = p; var q1 = q; for (int i = 0; i < d.Length; i++) { p1 = AB.GetTargetState(p1, d[i]); q1 = AB.GetTargetState(q1, d[i]); } Assert.IsTrue(AB.IsFinalState(p1) != AB.IsFinalState(q1)); } } } }
public void TestStateDistinguisherH2() { 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); int minimalStateCount = mfa.StateCount; var witnesses = dist.GetAllDistinguishingSequences(); AssertIsSuffixClosed(witnesses); //var w = dist.GetDistinguishingSequence(1, 10); int distinguisherCount = witnesses.Length; Assert.IsTrue(distinguisherCount < minimalStateCount + 1); CheckAllStatePairDistinguishers(dfa, mfa, dist); }
private static void ValidateDistinguishers(Automaton <BDD> aut, Automaton <BDD> autMin, StateDistinguisher <BDD> dist, int i, string regex) { var distseqs = dist.GetAllDistinguishingSequences(); if (distseqs.Length > autMin.StateCount) { Console.WriteLine(string.Format("{0}, {1}, {2}", i, distseqs.Length - autMin.StateCount, regex)); } foreach (var p in autMin.States) { foreach (var q in autMin.States) { if (p != q) { var d = dist.GetDistinguishingSequence(p, q); Assert.IsTrue(d != null); //check that d distinguishes p from q int p1; int q1; //aut may be partial, if false is returned it means that the implicit sink state was reached bool pok = aut.TryGetTargetState(p, out p1, d.ToArray()); bool qok = aut.TryGetTargetState(q, out q1, d.ToArray()); Assert.IsTrue(pok || qok); if (!pok) { Assert.IsTrue(aut.IsFinalState(q1)); } else if (!qok) { Assert.IsTrue(aut.IsFinalState(p1)); } else { Assert.IsTrue(aut.IsFinalState(q1) != aut.IsFinalState(p1)); } } } } }