Пример #1
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");
        }
Пример #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 TestDAGserializationSimple2()
        {
            var r1 = @"^([\d]{1,3})$"; //sequences of 1 up to 3 digits

            var rex          = new Microsoft.Automata.Rex.RexEngine(BitWidth.BV7);
            var sfa          = rex.CreateFromRegexes(r1);
            var sfa_min_orig = rex.Minimize(sfa);

            var sfa_min = rex.DeserializeDAG(rex.SerializeDAG(sfa_min_orig));

            // rex.Solver.ShowDAG(sfa_min, "test");

            var frequency = new Dictionary <string, int>();

            for (int i = 0; i < 10; i++)
            {
                frequency[i.ToString()] = 0;
            }

            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    frequency[i.ToString() + j.ToString()] = 0;
                }
            }

            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    for (int k = 0; k < 10; k++)
                    {
                        frequency[i.ToString() + j.ToString() + k.ToString()] = 0;
                    }
                }
            }

            int time = System.Environment.TickCount;

            for (int i = 0; i < 1000000; i++)
            {
                var sample = rex.GenerateMemberUniformly(sfa_min);
                frequency[sample] += 1;
            }
            time = System.Environment.TickCount - time;

            int total    = 10 + 100 + 1000;
            int avg      = 1000000 / total;
            int avg_low  = (avg * 80) / 100;
            int avg_high = (avg * 120) / 100;

            foreach (var kv in frequency)
            {
                Assert.IsTrue(kv.Value > avg_low);
                Assert.IsTrue(kv.Value < avg_high);
            }
        }
Пример #4
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);
        }
Пример #5
0
        public void TestDAGserializationSimple()
        {
            var r1 = @"^(a|ab|abc|abcd|abcde)$";

            var rex          = new Microsoft.Automata.Rex.RexEngine(BitWidth.BV7);
            var sfa          = rex.CreateFromRegexes(r1);
            var sfa_min_orig = rex.Minimize(sfa);

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

            //rex.Solver.ShowDAG(sfa_min, "test");

            var frequency = new Dictionary <string, int>();

            frequency["a"]     = 0;
            frequency["ab"]    = 0;
            frequency["abc"]   = 0;
            frequency["abcd"]  = 0;
            frequency["abcde"] = 0;
            for (int i = 0; i < 100000; i++)
            {
                var sample = rex.GenerateMemberUniformly(sfa_min);
                frequency[sample] += 1;
            }

            foreach (var kv in frequency)
            {
                Assert.IsTrue(kv.Value > 19500); //roughly, each one should be equally likely
            }

            var m1 = sfa_min.GetMoveFrom(sfa_min.InitialState);

            Assert.AreEqual <double>(1.0, sfa_min.GetProbability(m1));
            Assert.AreEqual <double>(0.2, sfa_min.GetProbability(m1.TargetState));
            var m2 = sfa_min.GetMoveFrom(m1.TargetState);

            Assert.AreEqual <double>(0.8, sfa_min.GetProbability(m2));
            Assert.AreEqual <double>(0.25, sfa_min.GetProbability(m2.TargetState));
            var m3 = sfa_min.GetMoveFrom(m2.TargetState);

            Assert.AreEqual <double>(0.75, sfa_min.GetProbability(m3));
            Assert.AreEqual <double>(Math.Round(((double)1.0) / 3.0, 10), sfa_min.GetProbability(m3.TargetState));
            var m4 = sfa_min.GetMoveFrom(m3.TargetState);

            Assert.AreEqual <double>(Math.Round(((double)2.0) / 3.0, 10), sfa_min.GetProbability(m4));
            Assert.AreEqual <double>(0.5, sfa_min.GetProbability(m4.TargetState));
            var m5 = sfa_min.GetMoveFrom(m4.TargetState);

            Assert.AreEqual <double>(0.5, sfa_min.GetProbability(m5));
            Assert.AreEqual <double>(1.0, sfa_min.GetProbability(m5.TargetState));
        }
Пример #6
0
        public void TestDag()
        {
            var r1 = @"^\w{2,3}$";                                        //between 2 and 3 word letters
            var r2 = @"\d";                                               //contains a digit

            var rex = new Microsoft.Automata.Rex.RexEngine(BitWidth.BV7); //using ascii
            var sfa = rex.Minimize(rex.CreateFromRegexes(r1, r2));

            string dag  = rex.SerializeDAG(sfa);
            var    sfa1 = rex.DeserializeDAG(dag);

            //rex.Solver.ShowDAG(sfa1, "test");
        }
Пример #7
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);
        }
Пример #8
0
        public void TestDAGserializationSimple2()
        {
            var r1 = @"^([\d]{1,3})$"; //sequences of 1 up to 3 digits

            var rex = new Microsoft.Automata.Rex.RexEngine(BitWidth.BV7);
            var sfa = rex.CreateFromRegexes(r1);
            var sfa_min_orig = rex.Minimize(sfa);

            var sfa_min = rex.DeserializeDAG(rex.SerializeDAG(sfa_min_orig));

               // rex.Solver.ShowDAG(sfa_min, "test");

            var frequency = new Dictionary<string, int>();

            for (int i = 0; i < 10; i++)
                    frequency[i.ToString()] = 0;

            for (int i = 0; i < 10; i++)
                for (int j = 0; j < 10; j++)
                        frequency[i.ToString() + j.ToString()] = 0;

            for (int i = 0; i < 10; i++)
                for (int j = 0; j < 10; j++)
                    for (int k = 0; k < 10; k++)
                        frequency[i.ToString() + j.ToString() + k.ToString()] = 0;

            int time = System.Environment.TickCount;
            for (int i = 0; i < 1000000; i++)
            {
                var sample = rex.GenerateMemberUniformly(sfa_min);
                frequency[sample] += 1;
            }
            time = System.Environment.TickCount - time;

            int total = 10 + 100 + 1000;
            int avg = 1000000 / total;
            int avg_low = (avg * 80) / 100;
            int avg_high = (avg * 120) / 100;

            foreach (var kv in frequency)
            {
                Assert.IsTrue(kv.Value > avg_low);
                Assert.IsTrue(kv.Value < avg_high);
            }
        }
Пример #9
0
        public void TestDAGserializationSimple()
        {
            var r1 = @"^(a|ab|abc|abcd|abcde)$";

            var rex = new Microsoft.Automata.Rex.RexEngine(BitWidth.BV7);
            var sfa = rex.CreateFromRegexes(r1);
            var sfa_min_orig = rex.Minimize(sfa);

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

            //rex.Solver.ShowDAG(sfa_min, "test");

            var frequency = new Dictionary<string, int>();
            frequency["a"] = 0;
            frequency["ab"] = 0;
            frequency["abc"] = 0;
            frequency["abcd"] = 0;
            frequency["abcde"] = 0;
            for (int i = 0; i < 100000; i++)
            {
                var sample = rex.GenerateMemberUniformly(sfa_min);
                frequency[sample] += 1;
            }

            foreach (var kv in frequency)
            {
                Assert.IsTrue(kv.Value > 19500); //roughly, each one should be equally likely
            }

            var m1 = sfa_min.GetMoveFrom(sfa_min.InitialState);
            Assert.AreEqual<double>(1.0, sfa_min.GetProbability(m1));
            Assert.AreEqual<double>(0.2, sfa_min.GetProbability(m1.TargetState));
            var m2 = sfa_min.GetMoveFrom(m1.TargetState);
            Assert.AreEqual<double>(0.8, sfa_min.GetProbability(m2));
            Assert.AreEqual<double>(0.25, sfa_min.GetProbability(m2.TargetState));
            var m3 = sfa_min.GetMoveFrom(m2.TargetState);
            Assert.AreEqual<double>(0.75, sfa_min.GetProbability(m3));
            Assert.AreEqual<double>(Math.Round(((double)1.0) / 3.0, 10), sfa_min.GetProbability(m3.TargetState));
            var m4 = sfa_min.GetMoveFrom(m3.TargetState);
            Assert.AreEqual<double>(Math.Round(((double)2.0) / 3.0, 10), sfa_min.GetProbability(m4));
            Assert.AreEqual<double>(0.5, sfa_min.GetProbability(m4.TargetState));
            var m5 = sfa_min.GetMoveFrom(m4.TargetState);
            Assert.AreEqual<double>(0.5, sfa_min.GetProbability(m5));
            Assert.AreEqual<double>(1.0, sfa_min.GetProbability(m5.TargetState));
        }
Пример #10
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");
        }
Пример #11
0
        public void TestDag()
        {
            var r1 = @"^\w{2,3}$"; //between 2 and 3 word letters
            var r2 = @"\d"; //contains a digit

            var rex = new Microsoft.Automata.Rex.RexEngine(BitWidth.BV7); //using ascii
            var sfa = rex.Minimize(rex.CreateFromRegexes(r1, r2));

            string dag = rex.SerializeDAG(sfa);
            var sfa1 = rex.DeserializeDAG(dag);

            //rex.Solver.ShowDAG(sfa1, "test");
        }