Ejemplo n.º 1
0
        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));
                    }
                }
            }
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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));
                        }
                    }
                }
            }
        }