Пример #1
0
        public void TestMinimizationForRegexCausingBug()
        {
            var rex    = new Microsoft.Automata.Rex.RexEngine(BitWidth.BV7);
            var regex  = "^.*(([01]|[1]0)0)$";
            var autom0 = rex.CreateFromRegexes(RegexOptions.Singleline, regex).RemoveEpsilons();
            var autom  = autom0.Determinize();

            //rex.Solver.ShowGraph(autom0, "NFA");
            //rex.Solver.ShowGraph(autom, "DFA");
            autom.CheckDeterminism(true);
            Assert.IsTrue(autom.IsDeterministic, "autom must be deterministic here");

            var automM  = RunMinimize1(rex, autom);
            var automM2 = RunMinimize2(rex, autom);
            var automM3 = RunMinimize3(rex, autom);
            //rex.Solver.ShowGraph(automM, "automM");
            //rex.Solver.ShowGraph(automM2, "automM2");
            //rex.Solver.ShowGraph(automM3, "automM3");
            var s  = automM.StateCount;
            var m  = automM.MoveCount;
            var s2 = automM2.StateCount;
            var m2 = automM2.MoveCount;
            var s3 = automM3.StateCount;
            var m3 = automM3.MoveCount;

            Assert.IsTrue(rex.AreEquivalent(autom, automM2));
            Assert.IsTrue(rex.AreEquivalent(autom, automM3));
            Assert.IsTrue(rex.AreEquivalent(autom, automM));
            Assert.AreEqual <int>(s, s2);
            Assert.AreEqual <int>(m, m2);
            Assert.AreEqual <int>(s, s3);
            Assert.AreEqual <int>(m, m3);
        }
Пример #2
0
        public void TestLongPasswordAutomatonCreationTime()
        {
            var rex = new Microsoft.Automata.Rex.RexEngine(BitWidth.BV7); //rex for ascii range

            int passwlength = 200;

            var r1 = @"^[\x21-\x7E]{" + passwlength + "}$";
            var r2 = "[A-Z]";
            var r3 = "[a-z]";
            var r4 = "[0-9]";
            var r5 = @"[\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]";

            var time = System.Environment.TickCount;
            //var a1 = rex.Minimize(rex.CreateFromRegexes(r1));
            var sfa2 = rex.Minimize(rex.CreateFromRegexes(r1, r2, r3, r4, r5));

            //var sfa2 = rex.Intersect(a1, a2);
            time = System.Environment.TickCount - time;

            var timeToMin = System.Environment.TickCount;
            var sfa_min   = rex.Minimize(sfa2);

            timeToMin = System.Environment.TickCount - timeToMin;

            string dag  = rex.SerializeDAG(sfa2);
            var    sfa3 = rex.DeserializeDAG(dag);

            System.IO.File.WriteAllText("dag.txt", dag);

            Assert.IsTrue(rex.AreEquivalent(sfa3, sfa2));

            Assert.IsTrue(rex.AreEquivalent(sfa3, sfa_min));

            Console.WriteLine("time:{0} size:{1} | timeToMin:{2} sizeMin:{3}", time, sfa2.StateCount, timeToMin, sfa_min.StateCount);
        }
Пример #3
0
        public void TestMinimization()
        {
            var rex = new Microsoft.Automata.Rex.RexEngine(BitWidth.BV7); //rex for ascii range

            int passwlength = 10;

            var r1 = @"^[\x21-\x7E]{" + passwlength + "}$";
            var r2 = "[A-Z].*[A-Z]";
            var r3 = "[A-Z][A-Z][A-Z]";
            var r4 = "[0-9].*[0-9]";
            var r5 = @"[\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]";

            var time = System.Environment.TickCount;
            var a1   = rex.Minimize(rex.CreateFromRegexes(r1));
            var a2   = rex.Minimize(rex.CreateFromRegexes(r2));
            var a3   = rex.Minimize(rex.CreateFromRegexes(r3));
            var a4   = rex.Minimize(rex.CreateFromRegexes(r4));
            var a5   = rex.Minimize(rex.CreateFromRegexes(r5));
            var sfa2 = rex.Intersect(a1, a2, a3, a4, a5);

            time = System.Environment.TickCount - time;

            string dag  = rex.SerializeDAG(sfa2);
            var    sfa3 = rex.DeserializeDAG(dag);
            //rex.Solver.ShowGraph(sfa3, "sfa");

            var timeToMin = System.Environment.TickCount;
            var sfa_min   = sfa2.MinimizeMoore();

            timeToMin = System.Environment.TickCount - timeToMin;


            var timeToMinB = System.Environment.TickCount;
            var sfa_minB   = sfa3.MinimizeHopcroft();

            timeToMinB = System.Environment.TickCount - timeToMinB;


            System.IO.File.WriteAllText("dag.txt", dag);

            //Assert.IsTrue(rex.AreEquivalent(sfa3, sfa_min));

            //rex.Solver.ShowGraph(sfa_min, "sfa_min");
            //rex.Solver.ShowGraph(sfa_minB, "sfa_minB");

            Assert.IsTrue(rex.AreEquivalent(sfa_minB, sfa_min));

            Assert.AreEqual(sfa_min.StateCount, sfa_minB.StateCount);

            Assert.IsTrue(rex.AreEquivalent(sfa3, sfa_minB));

            //rex.Solver.ShowGraph(sfa_min,"TestMinimization");

            Console.WriteLine("time:{0} size:{1} | timeToMin:{2} sizeMin:{3} | timeToMin:{4} sizeMin:{5}", time, sfa2.StateCount, timeToMin, sfa_min.StateCount, timeToMinB, sfa_minB.StateCount);
        }
Пример #4
0
        public void TestDAGserialization()
        {
            var r1 = @"^[\x21-\x7E]{8}$";
            var r2 = @"[A-Z].*[A-Z]";
            var r3 = "^.+[a-z].*[a-z]";
            var r4 = "^(...[@#$%&]|....[@#$%&]|.....[@#$%&])";
            var r5 = @"^[\D]";
            var r6 = "^[^AbkG]*$";

            var rex     = new Microsoft.Automata.Rex.RexEngine(BitWidth.BV16);
            var sfa     = rex.CreateFromRegexes(r1, r2, r3, r4, r5, r6);
            var sfa_min = rex.Minimize(sfa);

            string dag      = rex.SerializeDAG(sfa_min);
            var    sfa_min1 = rex.DeserializeDAG(dag);

            bool equiv = rex.AreEquivalent(sfa_min, sfa_min1);

            Assert.IsTrue(equiv);

            string dag2 = rex.SerializeDAG(sfa_min1);

            Assert.AreEqual <string>(dag, dag2);

            Console.WriteLine(rex.GenerateMemberUniformly(sfa_min1));
            Console.WriteLine(rex.GenerateMemberUniformly(sfa_min1));
            Console.WriteLine(rex.GenerateMemberUniformly(sfa_min1));

            //rex.Solver.ShowGraph(sfa_min1, "test");
        }
Пример #5
0
        public void TestMinimizationBugFix()
        {
            var rex = new Microsoft.Automata.Rex.RexEngine(BitWidth.BV7);

            var regex   = "^0*(0|1)01$";
            var sfa     = rex.CreateFromRegexes(regex).RemoveEpsilons();
            var sfa_det = sfa.Determinize();
            //rex.Solver.ShowGraph(sfa_det, "sfa_det");
            var sfa_min_cl = sfa_det.MinimizeMoore();
            //rex.Solver.ShowGraph(sfa_min_cl, "sfa_min_cl");

            var sfa_min = sfa_det.MinimizeHopcroft();

            //rex.Solver.ShowGraph(sfa_min, "sfa_min");

            Assert.IsTrue(rex.AreEquivalent(sfa, sfa_min_cl));
            Assert.IsTrue(rex.AreEquivalent(sfa, sfa_min));
            Assert.AreEqual(sfa_min_cl.StateCount, sfa_min.StateCount);
        }
Пример #6
0
        public void TestMinimizationOfSampleICSTregexes()
        {
            var rex = new Microsoft.Automata.Rex.RexEngine(BitWidth.BV16);

            string[] regexes = SampleRegexes.regexes;
            for (int i = 0; i < regexes.Length; i++)
            {
                string regex = regexes[i];
                var    sfa   = rex.CreateFromRegexes(regex);
                var    msfa  = rex.Minimize(sfa);
                //var msfa2 = sfa.Determinize(rex.Solver).MinimizeClassical(rex.Solver);
                //Assert.IsTrue(rex.AreEquivalent(sfa, msfa2));
                bool eq = rex.AreEquivalent(sfa, msfa);
                Assert.IsTrue(eq);
            }
        }
Пример #7
0
        void RunMinimize()
        {
            try
            {
                var rex   = new Microsoft.Automata.Rex.RexEngine(BitWidth.BV16);
                var autom = rex.CreateFromRegexes(RegexOptions.Singleline, regex).Determinize();

                //---------------------
                var automM = RunMinimize1(rex, autom);
                //---------------------
                //---------------------
                var automM2 = RunMinimize2(rex, autom);
                //---------------------
                //---------------------
                var automM3 = RunMinimize3(rex, autom);
                //---------------------
                var s  = automM.StateCount;
                var m  = automM.MoveCount;
                var s2 = automM2.StateCount;
                var m2 = automM2.MoveCount;
                var s3 = automM3.StateCount;
                var m3 = automM3.MoveCount;
                if (s != s2)
                {
                    stateCount = -3;
                }
                else if (m != m2)
                {
                    stateCount = -3;
                }
                else if (s != s3)
                {
                    stateCount = -3;
                }
                else if (m != m3)
                {
                    stateCount = -3;
                }
                else if (!rex.AreEquivalent(autom, automM))
                {
                    stateCount = -3;
                }
                else if (!rex.AreEquivalent(autom, automM2))
                {
                    stateCount = -3;
                }
                else if (!rex.AreEquivalent(autom, automM3))
                {
                    stateCount = -3;
                }
                else
                {
                    stateCount     = automM2.StateCount;
                    origStateCount = autom.StateCount;
                }
            }
            catch
            {
                stateCount = -2;
            }
        }
Пример #8
0
        void RunMinimize()
        {
            try
            {
                var rex = new Microsoft.Automata.Rex.RexEngine(BitWidth.BV16);
                var autom = rex.CreateFromRegexes(RegexOptions.Singleline, regex).Determinize();

                //---------------------
                var automM = RunMinimize1(rex, autom);
                //---------------------
                //---------------------
                var automM2 = RunMinimize2(rex, autom);
                //---------------------
                //---------------------
                var automM3 = RunMinimize3(rex, autom);
                //---------------------
                var s = automM.StateCount;
                var m = automM.MoveCount;
                var s2 = automM2.StateCount;
                var m2 = automM2.MoveCount;
                var s3 = automM3.StateCount;
                var m3 = automM3.MoveCount;
                if (s != s2)
                    stateCount = -3;
                else if (m != m2)
                    stateCount = -3;
                else if (s != s3)
                    stateCount = -3;
                else if (m != m3)
                    stateCount = -3;
                else if (!rex.AreEquivalent(autom, automM))
                    stateCount = -3;
                else if (!rex.AreEquivalent(autom, automM2))
                    stateCount = -3;
                else if (!rex.AreEquivalent(autom, automM3))
                    stateCount = -3;
                else
                {
                    stateCount = automM2.StateCount;
                    origStateCount = autom.StateCount;
                }
            }
            catch (Exception e)
            {
                stateCount = -2;
            }
        }
Пример #9
0
        public void TestMinimizationForRegexCausingBug()
        {
            var rex = new Microsoft.Automata.Rex.RexEngine(BitWidth.BV7);
            var regex = "^.*(([01]|[1]0)0)$";
            var autom0 = rex.CreateFromRegexes(RegexOptions.Singleline, regex).RemoveEpsilons();
            var autom = autom0.Determinize();
            //rex.Solver.ShowGraph(autom0, "NFA");
            //rex.Solver.ShowGraph(autom, "DFA");
            autom.CheckDeterminism(true);
            Assert.IsTrue(autom.IsDeterministic, "autom must be deterministic here");

            var automM = RunMinimize1(rex, autom);
            var automM2 = RunMinimize2(rex, autom);
            var automM3 = RunMinimize3(rex, autom);
            //rex.Solver.ShowGraph(automM, "automM");
            //rex.Solver.ShowGraph(automM2, "automM2");
            //rex.Solver.ShowGraph(automM3, "automM3");
            var s = automM.StateCount;
            var m = automM.MoveCount;
            var s2 = automM2.StateCount;
            var m2 = automM2.MoveCount;
            var s3 = automM3.StateCount;
            var m3 = automM3.MoveCount;
            Assert.IsTrue(rex.AreEquivalent(autom, automM2));
            Assert.IsTrue(rex.AreEquivalent(autom, automM3));
            Assert.IsTrue(rex.AreEquivalent(autom, automM));
            Assert.AreEqual<int>(s, s2);
            Assert.AreEqual<int>(m, m2);
            Assert.AreEqual<int>(s, s3);
            Assert.AreEqual<int>(m, m3);
        }
Пример #10
0
        public void TestLongPasswordAutomatonCreationTime()
        {
            var rex = new Microsoft.Automata.Rex.RexEngine(BitWidth.BV7); //rex for ascii range

            int passwlength = 200;

            var r1 = @"^[\x21-\x7E]{" + passwlength + "}$";
            var r2 = "[A-Z]";
            var r3 = "[a-z]";
            var r4 = "[0-9]";
            var r5 = @"[\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]";

            var time = System.Environment.TickCount;
            //var a1 = rex.Minimize(rex.CreateFromRegexes(r1));
            var sfa2 = rex.Minimize(rex.CreateFromRegexes(r1, r2, r3, r4, r5));
            //var sfa2 = rex.Intersect(a1, a2);
            time = System.Environment.TickCount - time;

            var timeToMin = System.Environment.TickCount;
            var sfa_min = rex.Minimize(sfa2);
            timeToMin = System.Environment.TickCount - timeToMin;

            string dag = rex.SerializeDAG(sfa2);
            var sfa3 = rex.DeserializeDAG(dag);
            System.IO.File.WriteAllText("dag.txt", dag);

            Assert.IsTrue(rex.AreEquivalent(sfa3, sfa2));

            Assert.IsTrue(rex.AreEquivalent(sfa3, sfa_min));

            Console.WriteLine("time:{0} size:{1} | timeToMin:{2} sizeMin:{3}", time, sfa2.StateCount, timeToMin, sfa_min.StateCount);
        }
Пример #11
0
        public void TestDAGserialization()
        {
            var r1 = @"^[\x21-\x7E]{8}$";
            var r2 = @"[A-Z].*[A-Z]";
            var r3 = "^.+[a-z].*[a-z]";
            var r4 = "^(...[@#$%&]|....[@#$%&]|.....[@#$%&])";
            var r5 = @"^[\D]";
            var r6 = "^[^AbkG]*$";

            var rex = new Microsoft.Automata.Rex.RexEngine(BitWidth.BV16);
            var sfa = rex.CreateFromRegexes(r1, r2, r3, r4, r5, r6);
            var sfa_min = rex.Minimize(sfa);

            string dag = rex.SerializeDAG(sfa_min);
            var sfa_min1 = rex.DeserializeDAG(dag);

            bool equiv = rex.AreEquivalent(sfa_min, sfa_min1);

            Assert.IsTrue(equiv);

            string dag2 = rex.SerializeDAG(sfa_min1);

            Assert.AreEqual<string>(dag, dag2);

            Console.WriteLine(rex.GenerateMemberUniformly(sfa_min1));
            Console.WriteLine(rex.GenerateMemberUniformly(sfa_min1));
            Console.WriteLine(rex.GenerateMemberUniformly(sfa_min1));

            //rex.Solver.ShowGraph(sfa_min1, "test");
        }