コード例 #1
0
        public void BooleanAlgebraZ3_test2()
        {
            var ctx         = new Context();
            var sort        = ctx.IntSort;
            var solver      = new Z3BoolAlg(ctx, sort);
            var alg         = new BDDAlgebra <BoolExpr>(solver);
            var x           = new Variable("x", true);
            var y           = new Variable("y", true);
            var z           = new Variable("z", true);
            var xLTy        = new MSOLt <BoolExpr>(x, y);
            var xLTzLTy     = new MSOAnd <BoolExpr>((new MSOLt <BoolExpr>(x, z)), (new MSOLt <BoolExpr>(z, y)));
            var Ez          = new MSOExists <BoolExpr>(z, xLTzLTy);
            var notEz       = new MSONot <BoolExpr>(Ez);
            var xSyDef      = new MSOAnd <BoolExpr>(xLTy, notEz);
            var aut_xSyDef  = xSyDef.GetAutomaton(alg);
            var aut_xLTzLTy = xLTzLTy.GetAutomaton(alg);
            var aut_Ez      = Ez.GetAutomaton(alg);
            var aut_notEz   = notEz.GetAutomaton(alg);
            var aut_xLTy    = xLTy.GetAutomaton(alg);

            //aut_xSyDef.ShowGraph("aut_xSyDEf");
            //aut_xLTzLTy.ShowGraph("aut_xLTzLTy");
            //aut_Ez.ShowGraph("aut_Ez");
            //aut_notEz.ShowGraph("aut_notEz");

            var xSyPrim     = new MSOSuccN <BoolExpr>(x, y, 1);
            var aut_xSyPrim = xSyPrim.GetAutomaton(alg);
            var equiv       = aut_xSyPrim.IsEquivalentWith(aut_xSyDef);

            Assert.IsTrue(equiv);
        }
コード例 #2
0
        public void BooleanAlgebraZ3_test2()
        {
            var ctx         = new Context();
            var sort        = ctx.IntSort;
            var solver      = new Z3BoolAlg(ctx, sort);
            var alg         = new BDDAlgebra <BoolExpr>(solver);
            var x           = new WS1SVariable <BoolExpr>("x");
            var y           = new WS1SVariable <BoolExpr>("y");
            var z           = new WS1SVariable <BoolExpr>("z");
            var xLTy        = x < y;
            var xLTzLTy     = (x < z) & (z < y);
            var Ez          = new WS1SExists <BoolExpr>(z, xLTzLTy);
            var notEz       = new WS1SNot <BoolExpr>(Ez);
            var xSyDef      = new WS1SAnd <BoolExpr>(xLTy, notEz);
            var aut_xSyDef  = xSyDef.GetAutomaton(alg, x, y);
            var aut_xLTzLTy = xLTzLTy.GetAutomaton(alg, x, y, z);
            var aut_Ez      = Ez.GetAutomaton(alg, x, y);
            var aut_notEz   = notEz.GetAutomaton(alg, x, y);
            var aut_xLTy    = xLTy.GetAutomaton(alg, x, y);

            //aut_xSyDef.ShowGraph("aut_xSyDEf");
            //aut_xLTzLTy.ShowGraph("aut_xLTzLTy");
            //aut_Ez.ShowGraph("aut_Ez");
            //aut_notEz.ShowGraph("aut_notEz");

            var xSyPrim     = new WS1SSuccN <BoolExpr>(x, y, 1);
            var aut_xSyPrim = xSyPrim.GetAutomaton(alg, x, y);
            var equiv       = aut_xSyPrim.IsEquivalentWith(aut_xSyDef, alg);

            Assert.IsTrue(equiv);
        }
コード例 #3
0
ファイル: MonaTests.cs プロジェクト: michkot/Automata
        public void Mona2AutomatonTest2()
        {
            BDDAlgebra solver = new BDDAlgebra();

            string      source1 = @"
m2l-str;
var1 x,y;
y = x + 1;
";
            string      source2 = @"
m2l-str;
var1 x,y;
x < y & ~ex1 z: x<z & z<y;
";
            MonaProgram pgm1    = MonaParser.Parse(source1);
            var         mso1    = pgm1.ToMSO();
            var         aut1    = mso1.GetAutomaton(solver);

            //aut1.ShowGraph("aut1");

            MonaProgram pgm2 = MonaParser.Parse(source2);
            var         mso2 = pgm2.ToMSO();
            var         aut2 = mso2.GetAutomaton(solver);

            //aut2.ShowGraph("aut2");

            Assert.IsTrue(aut1.IsEquivalentWith(aut2));
        }
コード例 #4
0
ファイル: MonaTests.cs プロジェクト: AutomataDotNet/Automata
        public void Mona2AutomatonTest2()
        {
            BDDAlgebra solver = new BDDAlgebra();

            string source1 = @"
            m2l-str;
            var1 x,y;
            y = x + 1;
            ";
            string source2 = @"
            m2l-str;
            var1 x,y;
            x < y & ~ex1 z: x<z & z<y;
            ";
            MonaProgram pgm1 = MonaParser.Parse(source1);
            var mso1 = pgm1.ToMSO();
            var aut1 = mso1.GetAutomaton(solver);

            //aut1.ShowGraph("aut1");

            MonaProgram pgm2 = MonaParser.Parse(source2);
            var mso2 = pgm2.ToMSO();
            var aut2 = mso2.GetAutomaton(solver);

            //aut2.ShowGraph("aut2");

            Assert.IsTrue(aut1.IsEquivalentWith(aut2));
        }
コード例 #5
0
ファイル: MonaTests.cs プロジェクト: AutomataDotNet/Automata
        public void Mona2AutomatonTest3(bool singletonSetSemantics)
        {
            BDDAlgebra solver = new BDDAlgebra();

            string source1 = @"
            m2l-str;
            var1 x,y;
            y = x + 2;
            ";
            string source2 = @"
            m2l-str;
            var1 x,y;
            ex1 z: x<z & z<y;
            x < y & ~ex1 z1,z2: x<z1 & z1<y & x<z2 & z2<y & z1 ~= z2;
            ";
            MonaProgram pgm1 = MonaParser.Parse(source1);
            var mso1 = pgm1.ToMSO();
            var aut1 = mso1.GetAutomaton(solver, 0, singletonSetSemantics);

            //aut1.ShowGraph("aut1");

            MonaProgram pgm2 = MonaParser.Parse(source2);
            var mso2 = pgm2.ToMSO();
            var aut2 = mso2.GetAutomaton(solver, 0, singletonSetSemantics);

            //aut2.ShowGraph("aut2");

            Assert.IsTrue(aut1.IsEquivalentWith(aut2));
        }
コード例 #6
0
ファイル: MonaTests.cs プロジェクト: michkot/Automata
        public void Mona2AutomatonTest_pred1(bool useSingletonSetSemantics)
        {
            BDDAlgebra solver = new BDDAlgebra();

            string source1 =
                @"m2l-str;
pred succ(var1 x,y) = x < y & ~ex1 z:(x < z & z < y);
var1 x,y,z;
succ(x,y) & succ(y,z);
";

            string source2 =
                @"m2l-str;
var1 x,y,z;
y = x+1 & z = y + 1;
";

            MonaProgram pgm1 = MonaParser.Parse(source1);
            var         mso1 = pgm1.ToMSO();
            var         aut1 = mso1.GetAutomaton(solver, 0, useSingletonSetSemantics);

            MonaProgram pgm2 = MonaParser.Parse(source2);
            var         mso2 = pgm2.ToMSO();
            var         aut2 = mso2.GetAutomaton(solver, 0, useSingletonSetSemantics);

            Assert.IsTrue(aut1.IsEquivalentWith(aut2));
        }
コード例 #7
0
ファイル: MonaTests.cs プロジェクト: michkot/Automata
        public void Mona2AutomatonTest3(bool singletonSetSemantics)
        {
            BDDAlgebra solver = new BDDAlgebra();

            string      source1 = @"
m2l-str;
var1 x,y;
y = x + 2;
";
            string      source2 = @"
m2l-str;
var1 x,y;
ex1 z: x<z & z<y;
x < y & ~ex1 z1,z2: x<z1 & z1<y & x<z2 & z2<y & z1 ~= z2;
";
            MonaProgram pgm1    = MonaParser.Parse(source1);
            var         mso1    = pgm1.ToMSO();
            var         aut1    = mso1.GetAutomaton(solver, 0, singletonSetSemantics);

            //aut1.ShowGraph("aut1");

            MonaProgram pgm2 = MonaParser.Parse(source2);
            var         mso2 = pgm2.ToMSO();
            var         aut2 = mso2.GetAutomaton(solver, 0, singletonSetSemantics);

            //aut2.ShowGraph("aut2");

            Assert.IsTrue(aut1.IsEquivalentWith(aut2));
        }
コード例 #8
0
        void TestMintermExplosion(int bitWidth, bool useBDD = false)
        {
            TestContext.WriteLine("----------------");
            TestContext.WriteLine(bitWidth.ToString());

            if (useBDD)
            {
                //var S = new CharSetSolver(BitWidth.BV32);
                var S = new BDDAlgebra();

                TestContext.WriteLine("BDD");
                int t    = System.Environment.TickCount;
                var aut1 = CreateAutomaton1 <BDD>(S.MkBitTrue, bitWidth, S);
                var aut2 = CreateAutomaton2 <BDD>(S.MkBitTrue, bitWidth, S);
                var aut3 = CreateAutomaton3 <BDD>(S.MkBitTrue, bitWidth, S);
                t = System.Environment.TickCount - t;
                TestContext.WriteLine(t + "ms");
                //aut.ShowGraph("aut" + bitWidth);
            }
            else
            {
                TestContext.WriteLine("Z3");
                Z3Provider       Z    = new Z3Provider(BitWidth.BV7);
                var              x    = Z.MkConst("x", Z.IntSort);
                Func <int, Expr> f    = (i => Z.MkEq((Z.MkInt(1)), Z.MkMod(Z.MkDiv(x, Z.MkInt(1 << (i % 32))), Z.MkInt(2))));
                int              t    = System.Environment.TickCount;
                var              aut1 = CreateAutomaton1 <Expr>(f, bitWidth, Z);
                var              aut2 = CreateAutomaton2 <Expr>(f, bitWidth, Z);
                var              aut3 = CreateAutomaton3 <Expr>(f, bitWidth, Z);
                t = System.Environment.TickCount - t;
                TestContext.WriteLine(t + "ms");
                //aut.ShowGraph("aut" + bitWidth);
            }
        }
コード例 #9
0
ファイル: MonaTests.cs プロジェクト: michkot/Automata
        public void Mona2AutomatonTest_pred3()
        {
            BDDAlgebra solver = new BDDAlgebra();

            string source1 =
                @"m2l-str;
pred belongs(var1 x, var2 X) = x in X;
pred subs(var2 X, Y) = all1 x: belongs(x,X) => belongs(x,Y);
pred equal(var2 X,Y) = subs(X,Y) & subs(Y,X);
var2 X, Y;
equal(X,Y);
";

            string source2 =
                @"m2l-str;
var2 Y, X;
Y = X;
";

            MonaProgram pgm1 = MonaParser.Parse(source1);
            var         mso1 = pgm1.ToMSO();
            var         aut1 = mso1.GetAutomaton(solver);

            MonaProgram pgm2 = MonaParser.Parse(source2);
            var         mso2 = pgm2.ToMSO();
            var         aut2 = mso2.GetAutomaton(solver);

            Assert.IsTrue(aut1.IsEquivalentWith(aut2));
        }
コード例 #10
0
ファイル: MSOPopl14.cs プロジェクト: wellsoftware/Automata
        //Run the test on each phi in phis and store result in infFile
        static void RunTest(System.IO.StreamWriter outFile, List <Pair <MSOFormula <BDD>, CharSetSolver> > phis, int stop1At = 100, int stop2At = 100, int stop3At = 100)
        {
            var sw = new Stopwatch();

            using (System.IO.StreamWriter file = outFile)
            {
                file.WriteLine("k, old, cartesian-bdd, cartesian-product");
                int to = 2;
                foreach (var p in phis)
                {
                    // T1
                    var t1 = timeout;
                    if (to < stop1At)
                    {
                        sw.Restart();
                        for (int t = 0; t < numTests; t++)
                        {
                            p.First.GetAutomaton(p.Second);
                        }
                        sw.Stop();
                        t1 = sw.ElapsedMilliseconds;
                    }

                    //T2
                    var t2 = timeout;
                    if (to < stop1At)
                    {
                        var cartesianBDD = new CartesianAlgebraBDD <BDD>(p.Second);

                        sw.Restart();
                        for (int t = 0; t < numTests; t++)
                        {
                            p.First.GetAutomaton(cartesianBDD);
                        }
                        sw.Stop();
                        t2 = sw.ElapsedMilliseconds;
                    }

                    // T3
                    var t3 = timeout;
                    if (to < stop3At)
                    {
                        BDDAlgebra <BDD> cartesianProduct = new BDDAlgebra <BDD>(p.Second);

                        sw.Restart();
                        for (int t = 0; t < numTests; t++)
                        {
                            p.First.GetAutomaton(cartesianProduct, false);
                        }
                        sw.Stop();

                        t3 = sw.ElapsedMilliseconds;
                    }

                    file.WriteLine(to + "," + (double)t1 / numTests + "," + (double)t2 / numTests + "," + (double)t3 / numTests);
                    Console.WriteLine(to + "," + (double)t1 / numTests + "," + (double)t2 / numTests + "," + (double)t3 / numTests);
                    to++;
                }
            }
        }
コード例 #11
0
ファイル: LTLMSO.cs プロジェクト: teodorov/Automata-1
        //LTL over finite traces
        private static void AutomatarkMsoFormulasTest(string inputDir, string outFile)
        {
            Console.WriteLine("fileName , generic-bdd, product");
            using (System.IO.StreamWriter file =
                       new System.IO.StreamWriter(outFile))
            {
                var files = new List <string>(Directory.EnumerateFiles(inputDir, "*.mona", SearchOption.AllDirectories));
                files.Sort((s1, s2) => cmp(s1, s2));
                foreach (string fileName in files)
                {
                    string      contents = File.ReadAllText(fileName);
                    MonaProgram pgm1     = MonaParser.Parse(contents);
                    phi = pgm1.ToMSO();

                    var bv7 = new CharSetSolver(BitWidth.BV7);
                    bddSolver = new BDDAlgebra <BDD>(bv7);
                    var sw = new Stopwatch();
                    sw.Restart();
                    Thread t = new Thread(BDDSolver);
                    t.Start();
                    long t1 = 5000;
                    if (!t.Join(TimeSpan.FromSeconds(5)))
                    {
                        t.Abort();
                        t1 = 5000;
                    }
                    else
                    {
                        sw.Stop();
                        t1 = sw.ElapsedMilliseconds;
                    }

                    bv7        = new CharSetSolver(BitWidth.BV7);
                    cartSolver = new CartesianAlgebraBDD <BDD>(bv7);

                    sw.Restart();
                    t = new Thread(CartesianSolver);
                    t.Start();
                    long t2 = 5000;
                    if (!t.Join(TimeSpan.FromSeconds(5)))
                    {
                        t.Abort();
                        t2 = 5000;
                    }
                    else
                    {
                        sw.Stop();
                        t2 = sw.ElapsedMilliseconds;
                    }

                    //if (t2 > 5000)
                    //    t2 = 5000;

                    file.WriteLine(fileName + "," + (double)t1 / numTests + "," + (double)t2 / numTests);
                    Console.WriteLine(fileName + "," + (double)t1 / numTests + "," + (double)t2 / numTests);
                }
            }
        }
コード例 #12
0
 public void TestShiftRight2()
 {
     BDDAlgebra solver = new BDDAlgebra();
     BDD cond = solver.MkSetFromElements(new uint[] {0, 15}, 3);
     Assert.AreEqual<int>(9, cond.CountNodes());
     //Automata.Internal.DirectedGraphs.DotWriter.CharSetToDot(cond, "TestShiftRight", "c:/tmp/TestShiftRight2.dot", Internal.DirectedGraphs.DotWriter.RANKDIR.TB, 12);
     var sr = solver.ShiftRight(cond);
     Assert.AreEqual<int>(7, sr.CountNodes());
     //Automata.Internal.DirectedGraphs.DotWriter.CharSetToDot(sr, "TestShiftRight", "c:/tmp/TestShiftRight2res.dot", Internal.DirectedGraphs.DotWriter.RANKDIR.TB, 12);
 }
コード例 #13
0
ファイル: CharSetTests.cs プロジェクト: wellsoftware/Automata
        public void TestBvSetSolver2()
        {
            var   solver   = new BDDAlgebra();
            var   set      = solver.MkNot(solver.MkOr(solver.MkSetFromRange(10001, uint.MaxValue, 31), solver.MkSetFromRange(5, 1004, 31)));
            ulong elems    = solver.ComputeDomainSize(set, 31);
            int   nodes    = set.CountNodes();
            uint  expected = 10000 - 1000 + 1;

            Assert.AreEqual <ulong>(expected, elems);
        }
コード例 #14
0
 public void TestShiftLeft1()
 {
     BDDAlgebra solver = new BDDAlgebra();
     BDD cond = solver.MkSetFromElements(new uint[] { 0, 15 }, 3);
     //Automata.Internal.DirectedGraphs.DotWriter.CharSetToDot(cond, "TestShiftLeft", "c:/tmp/TestShiftLeftIn.dot", Internal.DirectedGraphs.DotWriter.RANKDIR.TB, 12);
     //BvSet bvs = solver.ShiftLeft(cond, 30);
     //Assert.AreEqual<int>(5, bvs.CountNodes());
     BDD bvs2 = solver.ShiftLeft(cond, 28);
     Assert.AreEqual<int>(9, bvs2.CountNodes());
     //Automata.Internal.DirectedGraphs.DotWriter.CharSetToDot(bvs, "TestShiftLeft", "c:/tmp/TestShiftLeftOut.dot", Internal.DirectedGraphs.DotWriter.RANKDIR.TB, 12);
 }
コード例 #15
0
 public void TestShiftRight1()
 {
     BDDAlgebra solver = new BDDAlgebra();
     BDD cond1 = solver.MkSetFromRange(0, 7, 3);
     BDD cond2 = solver.MkSetFromElements(new uint[] {9, 10, 12, 15}, 3);
     BDD cond = solver.MkOr(cond1, cond2);
     Assert.AreEqual<int>(8, cond.CountNodes());
     //Automata.Internal.DirectedGraphs.DotWriter.CharSetToDot(cond, "TestShiftRight", "c:/tmp/TestShiftRight1.dot", Internal.DirectedGraphs.DotWriter.RANKDIR.TB, 12);
     BDD sr = solver.ShiftRight(cond);
     Assert.AreEqual<BDD>(solver.True, sr);
 }
コード例 #16
0
 public void BooleanAlgebraZ3_test1()
 {
     var ctx    = new Context();
     var sort   = ctx.IntSort;
     var solver = new Z3BoolAlg(ctx, sort);
     var alg    = new BDDAlgebra <BoolExpr>(solver);
     var x      = new Variable("x", true);
     var pred   = new MSOPredicate <BoolExpr>(ctx.MkEq(solver.x, ctx.MkNumeral(42, sort)), x);
     MSOFormula <BoolExpr> phi = new MSOExists <BoolExpr>(x, pred);
     var pred_aut = pred.GetAutomaton(alg);
     //pred_aut.ShowGraph("pred_aut");
 }
コード例 #17
0
 public void TestShiftLeftThenRight()
 {
     BDDAlgebra solver = new BDDAlgebra();
     BDD cond = solver.MkSetFromElements(new uint[] { 0, 15 }, 3);
     //Automata.Internal.DirectedGraphs.DotWriter.CharSetToDot(cond, "TestShiftLeft2_cond", "c:/tmp/TestShiftLeft2_cond.dot", Internal.DirectedGraphs.DotWriter.RANKDIR.TB, 12);
     BDD bvs = solver.ShiftLeft(cond, 4);
     BDD concat = solver.MkAnd(bvs, cond);
     Assert.AreEqual<int>(16, concat.CountNodes());
     BDD cond1 = solver.ShiftRight(solver.ShiftRight(solver.ShiftRight(solver.ShiftRight(concat))));
     Assert.AreEqual<BDD>(cond1, cond);
     //Automata.Internal.DirectedGraphs.DotWriter.CharSetToDot(concat, "TestShiftLeft2_concat", "c:/tmp/TestShiftLeft2_concat.dot", Internal.DirectedGraphs.DotWriter.RANKDIR.TB, 12);
 }
コード例 #18
0
 public void TestUlongBvsSetCreation()
 {
     BDDAlgebra solver = new BDDAlgebra();
     BDD cond = solver.MkSetFromElements(new ulong[] { 0UL, (ulong)0xFFFFFFFF }, 31);
     BDD bvs = solver.ShiftLeft(cond, 4);
     var ranges = solver.ToRanges64(bvs, bvs.Ordinal);
     Assert.AreEqual<int>(2, ranges.Length);
     Assert.AreEqual<ulong>(0UL, ranges[0].First);
     Assert.AreEqual<ulong>(0xFUL, ranges[0].Second);
     Assert.AreEqual<ulong>((ulong)0xFFFFFFFF0, ranges[1].First);
     Assert.AreEqual<ulong>((ulong)0xFFFFFFFFF, ranges[1].Second);
 }
コード例 #19
0
ファイル: CharSetTests.cs プロジェクト: wellsoftware/Automata
        public void TestShiftLeft1()
        {
            BDDAlgebra solver = new BDDAlgebra();
            BDD        cond   = solver.MkSetFromElements(new uint[] { 0, 15 }, 3);
            //Automata.Internal.DirectedGraphs.DotWriter.CharSetToDot(cond, "TestShiftLeft", "c:/tmp/TestShiftLeftIn.dot", Internal.DirectedGraphs.DotWriter.RANKDIR.TB, 12);
            //BvSet bvs = solver.ShiftLeft(cond, 30);
            //Assert.AreEqual<int>(5, bvs.CountNodes());
            BDD bvs2 = solver.ShiftLeft(cond, 28);

            Assert.AreEqual <int>(9, bvs2.CountNodes());
            //Automata.Internal.DirectedGraphs.DotWriter.CharSetToDot(bvs, "TestShiftLeft", "c:/tmp/TestShiftLeftOut.dot", Internal.DirectedGraphs.DotWriter.RANKDIR.TB, 12);
        }
コード例 #20
0
ファイル: CharSetTests.cs プロジェクト: wellsoftware/Automata
        public void TestShiftRight2()
        {
            BDDAlgebra solver = new BDDAlgebra();
            BDD        cond   = solver.MkSetFromElements(new uint[] { 0, 15 }, 3);

            Assert.AreEqual <int>(9, cond.CountNodes());
            //Automata.Internal.DirectedGraphs.DotWriter.CharSetToDot(cond, "TestShiftRight", "c:/tmp/TestShiftRight2.dot", Internal.DirectedGraphs.DotWriter.RANKDIR.TB, 12);
            var sr = solver.ShiftRight(cond);

            Assert.AreEqual <int>(7, sr.CountNodes());
            //Automata.Internal.DirectedGraphs.DotWriter.CharSetToDot(sr, "TestShiftRight", "c:/tmp/TestShiftRight2res.dot", Internal.DirectedGraphs.DotWriter.RANKDIR.TB, 12);
        }
コード例 #21
0
ファイル: CharSetTests.cs プロジェクト: wellsoftware/Automata
        public void TestShiftRight1()
        {
            BDDAlgebra solver = new BDDAlgebra();
            BDD        cond1  = solver.MkSetFromRange(0, 7, 3);
            BDD        cond2  = solver.MkSetFromElements(new uint[] { 9, 10, 12, 15 }, 3);
            BDD        cond   = solver.MkOr(cond1, cond2);

            Assert.AreEqual <int>(8, cond.CountNodes());
            //Automata.Internal.DirectedGraphs.DotWriter.CharSetToDot(cond, "TestShiftRight", "c:/tmp/TestShiftRight1.dot", Internal.DirectedGraphs.DotWriter.RANKDIR.TB, 12);
            BDD sr = solver.ShiftRight(cond);

            Assert.AreEqual <BDD>(solver.True, sr);
        }
コード例 #22
0
ファイル: CharSetTests.cs プロジェクト: wellsoftware/Automata
        public void TestUlongBvsSetCreation()
        {
            BDDAlgebra solver = new BDDAlgebra();
            BDD        cond   = solver.MkSetFromElements(new ulong[] { 0UL, (ulong)0xFFFFFFFF }, 31);
            BDD        bvs    = solver.ShiftLeft(cond, 4);
            var        ranges = solver.ToRanges64(bvs, bvs.Ordinal);

            Assert.AreEqual <int>(2, ranges.Length);
            Assert.AreEqual <ulong>(0UL, ranges[0].First);
            Assert.AreEqual <ulong>(0xFUL, ranges[0].Second);
            Assert.AreEqual <ulong>((ulong)0xFFFFFFFF0, ranges[1].First);
            Assert.AreEqual <ulong>((ulong)0xFFFFFFFFF, ranges[1].Second);
        }
コード例 #23
0
ファイル: MSOZ3Test.cs プロジェクト: OlliSaarikivi/Automata
        public void TestWS1S_Forall_x_Exists_y_x_lt_y()
        {
            var triv   = new TrivialBooleanAlgebra();
            var ca     = new BDDAlgebra <bool>(triv);
            var x      = new Variable("x", false);
            var y      = new Variable("y", false);
            var x_lt_y = new WS1SLt <bool>(x, y);
            var psi4   = ~(new WS1SExists <bool>(x, new WS1SSingleton <bool>(x) & ~(new WS1SExists <bool>(y, new WS1SSingleton <bool>(y) & (x_lt_y)))));
            var aut    = psi4.GetAutomaton(ca, x, y);

            //aut.ShowGraph("aut");
            //accepts only the empty word
            Assert.IsTrue(aut.StateCount == 1 && aut.IsFinalState(aut.InitialState) && aut.MoveCount == 0);
        }
コード例 #24
0
ファイル: MSOZ3Test.cs プロジェクト: michkot/Automata
 public void TestWS1S_Forall_x_Exists_y_x_lt_y() 
 {
     var triv = new TrivialBooleanAlgebra();
     var ca = new BDDAlgebra<bool>(triv); 
     var x = new Variable("x", true);
     var y = new Variable("y", true);
     var x_lt_y = new MSOLt<bool>(x, y);
     var aut_x_lt_y = x_lt_y.GetAutomaton(ca);
     //aut_x_lt_y.ShowGraph("aut_x_lt_y");
     var psi4 = new MSOForall<bool>(x, new MSOExists<bool>(y, (x_lt_y)));
     var aut = psi4.GetAutomaton(ca);
     //accepts only the empty word
     Assert.IsTrue(aut.StateCount == 1 && aut.IsFinalState(aut.InitialState) && aut.MoveCount == 0);
 }
コード例 #25
0
ファイル: MonaTests.cs プロジェクト: AutomataDotNet/Automata
 public void Mona2AutomatonTest1()
 {
     string source = @"
     m2l-str;
     var1 x,y;
     x < y;
     ";
     MonaProgram pgm = MonaParser.Parse(source);
     var mso = pgm.ToMSO();
     BDDAlgebra solver = new BDDAlgebra();
     var aut = mso.GetAutomaton(solver);
     //aut.ShowGraph();
     Assert.IsTrue(aut.StateCount == 3);
 }
コード例 #26
0
        public void TestWS1S_Forall_x_Exists_y_x_lt_y()
        {
            var triv = new TrivialBooleanAlgebra();
            var ca   = new BDDAlgebra <bool>(triv);
            var x    = new WS1SVariable <bool>("x");
            var y    = new WS1SVariable <bool>("y");
            // Forall x.Exists y.x < y
            var psi4 = ~(x ^ !x & ~(y ^ (x < y)));
            var aut  = psi4.GetAutomaton(ca, x, y);

            //aut.ShowGraph("aut");
            //accepts only the empty word
            Assert.IsTrue(aut.StateCount == 1 && aut.IsFinalState(aut.InitialState) && aut.MoveCount == 0);
        }
コード例 #27
0
ファイル: MonaTests.cs プロジェクト: michkot/Automata
        public void Mona2AutomatonTest4()
        {
            BDDAlgebra solver = new BDDAlgebra();

            string source1 = @"
m2l-str;
var2 X,Y;
Y = X;
";
            string source2 = @"
m2l-str;
var2 X,Y;
all1 z: z in X <=> z in Y;
";

            string source3 = @"
m2l-str;
var2 X,Y;
Y sub X & X sub Y;
";

            string      source4 = @"
m2l-str;
var2 X,Y;
Y\X = empty & X\Y = empty;
";
            MonaProgram pgm1    = MonaParser.Parse(source1);
            var         mso1    = pgm1.ToMSO();
            var         aut1    = mso1.GetAutomaton(solver);

            //aut1.ShowGraph("aut1");

            MonaProgram pgm2 = MonaParser.Parse(source2);
            var         mso2 = pgm2.ToMSO();
            var         aut2 = mso2.GetAutomaton(solver);

            //aut2.ShowGraph("aut2");

            MonaProgram pgm3 = MonaParser.Parse(source3);
            var         mso3 = pgm3.ToMSO();
            var         aut3 = mso3.GetAutomaton(solver);

            MonaProgram pgm4 = MonaParser.Parse(source4);
            var         mso4 = pgm4.ToMSO();
            var         aut4 = mso4.GetAutomaton(solver);

            Assert.IsTrue(aut1.IsEquivalentWith(aut2));
            Assert.IsTrue(aut1.IsEquivalentWith(aut3));
            Assert.IsTrue(aut1.IsEquivalentWith(aut4));
        }
コード例 #28
0
ファイル: CharSetTests.cs プロジェクト: wellsoftware/Automata
        public void TestShiftLeftThenRight()
        {
            BDDAlgebra solver = new BDDAlgebra();
            BDD        cond   = solver.MkSetFromElements(new uint[] { 0, 15 }, 3);
            //Automata.Internal.DirectedGraphs.DotWriter.CharSetToDot(cond, "TestShiftLeft2_cond", "c:/tmp/TestShiftLeft2_cond.dot", Internal.DirectedGraphs.DotWriter.RANKDIR.TB, 12);
            BDD bvs    = solver.ShiftLeft(cond, 4);
            BDD concat = solver.MkAnd(bvs, cond);

            Assert.AreEqual <int>(16, concat.CountNodes());
            BDD cond1 = solver.ShiftRight(solver.ShiftRight(solver.ShiftRight(solver.ShiftRight(concat))));

            Assert.AreEqual <BDD>(cond1, cond);
            //Automata.Internal.DirectedGraphs.DotWriter.CharSetToDot(concat, "TestShiftLeft2_concat", "c:/tmp/TestShiftLeft2_concat.dot", Internal.DirectedGraphs.DotWriter.RANKDIR.TB, 12);
        }
コード例 #29
0
ファイル: MonaTests.cs プロジェクト: michkot/Automata
        public void Mona2AutomatonTest1()
        {
            string      source = @"
m2l-str;
var1 x,y;
x < y;
";
            MonaProgram pgm    = MonaParser.Parse(source);
            var         mso    = pgm.ToMSO();
            BDDAlgebra  solver = new BDDAlgebra();
            var         aut    = mso.GetAutomaton(solver);

            //aut.ShowGraph();
            Assert.IsTrue(aut.StateCount == 3);
        }
コード例 #30
0
ファイル: CharSetTests.cs プロジェクト: wellsoftware/Automata
        public void TestBvSetSolver5()
        {
            var solver = new BDDAlgebra();
            var a      = solver.MkSetFromRange(0, 3, 6);
            var b      = solver.MkSetFromRange(0x40, 0x43, 6);
            var c      = solver.MkSetFromRange(0x20, 0x23, 6);
            var d      = solver.MkSetFromRange(0x60, 0x63, 6);

            var all = new BDD[] { a, b, c, d };

            //a.ToDot("_0_3.dot");
            //b.ToDot("_10_13.dot");

            var a_size = solver.ComputeDomainSize(a, 6);
            var b_size = solver.ComputeDomainSize(b, 6);

            var x = solver.MkAnd(a, b);

            var u      = solver.MkOr(all);
            var u_size = solver.ComputeDomainSize(u, 6);

            //u.ToDot("_0_3_u_10_13.dot");

            var u_compl = solver.MkNot(u);
            //u_compl.ToDot("_0_3_u_10_13_compl.dot");


            var u_compl_size = solver.ComputeDomainSize(u_compl, 6);


            Assert.AreEqual <ulong>(4, a_size);
            Assert.AreEqual <ulong>(4, b_size);
            Assert.IsTrue(x.IsEmpty);
            Assert.AreEqual <ulong>(16, u_size);

            var ranges = solver.ToRanges(u, 6);

            Assert.AreEqual <int>(4, ranges.Length);
            Assert.AreEqual <uint>(0, ranges[0].First);
            Assert.AreEqual <uint>(3, ranges[0].Second);
            Assert.AreEqual <uint>(0x20, ranges[1].First);
            Assert.AreEqual <uint>(0x23, ranges[1].Second);
            Assert.AreEqual <uint>(0x40, ranges[2].First);
            Assert.AreEqual <uint>(0x43, ranges[2].Second);
            Assert.AreEqual <uint>(0x60, ranges[3].First);
            Assert.AreEqual <uint>(0x63, ranges[3].Second);
        }
コード例 #31
0
ファイル: CharSetTests.cs プロジェクト: wellsoftware/Automata
        public void TestBvSetSolver3()
        {
            var solver         = new BDDAlgebra();
            var letters_ASCII  = solver.MkOr(solver.MkSetFromRange('a', 'z', 6), solver.MkSetFromRange('A', 'Z', 6));
            var letters_eASCII = solver.MkOr(solver.MkSetFromRange('a', 'z', 7), solver.MkSetFromRange('A', 'Z', 7));

            Assert.AreEqual <ulong>(52, solver.ComputeDomainSize(letters_ASCII, 6));
            Assert.AreEqual <ulong>(52, solver.ComputeDomainSize(letters_eASCII, 7));

            var   set7      = solver.MkNot(letters_ASCII);
            ulong elems7    = solver.ComputeDomainSize(set7, 6);
            uint  expected7 = (1 << 7) - 52;

            Assert.AreEqual <ulong>(expected7, elems7);

            var   set8      = solver.MkNot(letters_eASCII);
            ulong elems8    = solver.ComputeDomainSize(set8, 7);
            ulong expected8 = (1 << 8) - 52;

            Assert.AreEqual <ulong>(expected8, elems8);
        }
コード例 #32
0
ファイル: MonaTests.cs プロジェクト: michkot/Automata
        public void Mona2AutomatonTest_pred2()
        {
            BDDAlgebra solver = new BDDAlgebra();

            string source =
                @"m2l-str;
pred succ(var1 x,y) = x < y & ~ex1 z:(x < z & z < y);
var1 x,y,z;
succ(x,y) & succ(y,z);
";

            MonaProgram pgm1 = MonaParser.Parse(source);
            var         mso1 = pgm1.ToMSO();
            var         aut1 = mso1.GetAutomaton(solver, 0, true);

            MonaProgram pgm2 = MonaParser.Parse(source);
            var         mso2 = pgm2.ToMSO();
            var         aut2 = mso2.GetAutomaton(solver, 0, false);

            Assert.IsFalse(aut1.IsEquivalentWith(aut2));
        }
コード例 #33
0
ファイル: CharSetTests.cs プロジェクト: wellsoftware/Automata
        public void TestBvSetSolver4()
        {
            var solver = new BDDAlgebra();
            var _0_3   = solver.MkSetFromRange(0, 3, 6);
            var _10_13 = solver.MkSetFromRange(0x40, 0x43, 6);

            //_0_3.ToDot("_0_3.dot");
            //_10_13.ToDot("_10_13.dot");

            var _0_3_size   = solver.ComputeDomainSize(_0_3, 6);
            var _10_13_size = solver.ComputeDomainSize(_10_13, 6);

            var x = solver.MkAnd(_0_3, _10_13);

            var _0_3_u_10_13      = solver.MkOr(_0_3, _10_13);
            var _0_3_u_10_13_size = solver.ComputeDomainSize(_0_3_u_10_13, 6);

            //_0_3_u_10_13.ToDot("_0_3_u_10_13.dot");

            var _0_3_u_10_13_compl = solver.MkNot(_0_3_u_10_13);
            //_0_3_u_10_13_compl.ToDot("_0_3_u_10_13_compl.dot");


            var _0_3_u_10_13_compl_size = solver.ComputeDomainSize(_0_3_u_10_13_compl, 6);


            Assert.AreEqual <ulong>(4, _0_3_size);
            Assert.AreEqual <ulong>(4, _10_13_size);
            Assert.IsTrue(x.IsEmpty);
            Assert.AreEqual <ulong>(8, _0_3_u_10_13_size);

            var ranges = solver.ToRanges(_0_3_u_10_13, 6);

            Assert.AreEqual <int>(2, ranges.Length);
            Assert.AreEqual <uint>(0, ranges[0].First);
            Assert.AreEqual <uint>(3, ranges[0].Second);
            Assert.AreEqual <uint>(0x40, ranges[1].First);
            Assert.AreEqual <uint>(0x43, ranges[1].Second);
        }
コード例 #34
0
ファイル: LTLMSO.cs プロジェクト: AutomataDotNet/Automata
        //LTL over finite traces
        private static void AutomatarkMsoFormulasTest(string inputDir, string outFile)
        {
            Console.WriteLine("fileName , generic-bdd, product");
            using (System.IO.StreamWriter file =
               new System.IO.StreamWriter(outFile))
            {
                var files = new List<string>(Directory.EnumerateFiles(inputDir, "*.mona", SearchOption.AllDirectories));
                files.Sort((s1, s2) => cmp(s1, s2));
                foreach (string fileName in files)
                {
                    string contents = File.ReadAllText(fileName);
                    MonaProgram pgm1 = MonaParser.Parse(contents);
                    phi = pgm1.ToMSO();

                    var bv7 = new CharSetSolver(BitWidth.BV7);
                    bddSolver = new BDDAlgebra<BDD>(bv7);
                    var sw = new Stopwatch();
                    sw.Restart();
                    Thread t = new Thread(BDDSolver);
                    t.Start();
                    long t1 = 5000;
                    if (!t.Join(TimeSpan.FromSeconds(5)))
                    {
                        t.Abort();
                        t1 = 5000;
                    }
                    else {
                        sw.Stop();
                        t1 = sw.ElapsedMilliseconds;
                    }

                    bv7 = new CharSetSolver(BitWidth.BV7);
                    cartSolver = new CartesianAlgebraBDD<BDD>(bv7);

                    sw.Restart();
                    t = new Thread(CartesianSolver);
                    t.Start();
                    long t2 = 5000;
                    if (!t.Join(TimeSpan.FromSeconds(5)))
                    {
                        t.Abort();
                        t2 = 5000;
                    }
                    else {
                        sw.Stop();
                        t2 = sw.ElapsedMilliseconds;
                    }

                    //if (t2 > 5000)
                    //    t2 = 5000;

                    file.WriteLine(fileName + "," + (double)t1 / numTests + "," + (double)t2 / numTests);
                    Console.WriteLine(fileName + "," + (double)t1 / numTests + "," + (double)t2 / numTests);
                }
            }
        }
コード例 #35
0
 public CartesianAlgebraBDD(BDDAlgebra bddAlg, IBooleanAlgebra <T> nodeAlg) :
     base(bddAlg, nodeAlg)
 {
 }
コード例 #36
0
ファイル: MSOPopl14.cs プロジェクト: AutomataDotNet/Automata
        //Run the test on each phi in phis and store result in infFile
        static void RunTest(System.IO.StreamWriter outFile, List<Pair<MSOFormula<BDD>, CharSetSolver>> phis, int stop1At = 100, int stop2At = 100, int stop3At = 100)
        {
            var sw = new Stopwatch();

            using (System.IO.StreamWriter file = outFile)
            {
                Console.WriteLine("k, old, cartesian, generic-bdd");
                file.WriteLine("k, old, cartesian, generic-bdd");
                int to = 2;
                foreach (var p in phis)
                {
                    // T1
                    var t1 = timeout;
                    if (to < stop1At)
                    {
                        try
                        {
                            sw.Restart();
                            for (int t = 0; t < numTests; t++)
                            {
                                p.First.GetAutomaton(p.Second);
                            }
                            sw.Stop();
                            t1 = sw.ElapsedMilliseconds;
                        }
                        catch (OutOfMemoryException)
                        {
                            t1 = timeout * numTests;
                        }
                    }

                    //T2
                    var t2 = timeout;
                    if (to < stop1At)
                    {
                        var cartesianBDD = new CartesianAlgebraBDD<BDD>(p.Second);

                        try
                        {
                            sw.Restart();
                            for (int t = 0; t < numTests; t++)
                            {
                                p.First.GetAutomaton(cartesianBDD);
                            }
                            sw.Stop();
                            t2 = sw.ElapsedMilliseconds;

                        }
                        catch (OutOfMemoryException)
                        {
                            t2 = timeout * numTests;
                        }
                    }

                    // T3
                    var t3 = timeout;
                    if (to < stop3At)
                    {
                        BDDAlgebra<BDD> cartesianProduct = new BDDAlgebra<BDD>(p.Second);

                        try
                        {
                            sw.Restart();
                            for (int t = 0; t < numTests; t++)
                            {
                                p.First.GetAutomaton(cartesianProduct, false);
                            }
                            sw.Stop();

                            t3 = sw.ElapsedMilliseconds;
                        }
                        catch (OutOfMemoryException)
                        {
                            t3 = timeout * numTests;
                        }
                    }

                    file.WriteLine(to + "," + (double)t1 / numTests + "," + (double)t2 / numTests + "," + (double)t3 / numTests);
                    Console.WriteLine(to + "," + (double)t1 / numTests + "," + (double)t2 / numTests + "," + (double)t3 / numTests);
                    to++;
                }
            }
        }
コード例 #37
0
        public void TestBvSetSolver5()
        {
            var solver = new BDDAlgebra();
            var a = solver.MkSetFromRange(0, 3, 6);
            var b = solver.MkSetFromRange(0x40, 0x43, 6);
            var c = solver.MkSetFromRange(0x20, 0x23, 6);
            var d = solver.MkSetFromRange(0x60, 0x63, 6);

            var all = new BDD[] { a, b, c, d };

            //a.ToDot("_0_3.dot");
            //b.ToDot("_10_13.dot");

            var a_size = solver.ComputeDomainSize(a, 6);
            var b_size = solver.ComputeDomainSize(b, 6);

            var x = solver.MkAnd(a, b);

            var u = solver.MkOr(all);
            var u_size = solver.ComputeDomainSize(u, 6);

            //u.ToDot("_0_3_u_10_13.dot");

            var u_compl = solver.MkNot(u);
            //u_compl.ToDot("_0_3_u_10_13_compl.dot");

            var u_compl_size = solver.ComputeDomainSize(u_compl, 6);

            Assert.AreEqual<ulong>(4, a_size);
            Assert.AreEqual<ulong>(4, b_size);
            Assert.IsTrue(x.IsEmpty);
            Assert.AreEqual<ulong>(16, u_size);

            var ranges = solver.ToRanges(u, 6);
            Assert.AreEqual<int>(4, ranges.Length);
            Assert.AreEqual<uint>(0, ranges[0].First);
            Assert.AreEqual<uint>(3, ranges[0].Second);
            Assert.AreEqual<uint>(0x20, ranges[1].First);
            Assert.AreEqual<uint>(0x23, ranges[1].Second);
            Assert.AreEqual<uint>(0x40, ranges[2].First);
            Assert.AreEqual<uint>(0x43, ranges[2].Second);
            Assert.AreEqual<uint>(0x60, ranges[3].First);
            Assert.AreEqual<uint>(0x63, ranges[3].Second);
        }
コード例 #38
0
ファイル: MonaTests.cs プロジェクト: AutomataDotNet/Automata
        public void Mona2AutomatonTest4()
        {
            BDDAlgebra solver = new BDDAlgebra();

            string source1 = @"
            m2l-str;
            var2 X,Y;
            Y = X;
            ";
            string source2 = @"
            m2l-str;
            var2 X,Y;
            all1 z: z in X <=> z in Y;
            ";

            string source3 = @"
            m2l-str;
            var2 X,Y;
            Y sub X & X sub Y;
            ";

            string source4 = @"
            m2l-str;
            var2 X,Y;
            Y\X = empty & X\Y = empty;
            ";
            MonaProgram pgm1 = MonaParser.Parse(source1);
            var mso1 = pgm1.ToMSO();
            var aut1 = mso1.GetAutomaton(solver);

            //aut1.ShowGraph("aut1");

            MonaProgram pgm2 = MonaParser.Parse(source2);
            var mso2 = pgm2.ToMSO();
            var aut2 = mso2.GetAutomaton(solver);

            //aut2.ShowGraph("aut2");

            MonaProgram pgm3 = MonaParser.Parse(source3);
            var mso3 = pgm3.ToMSO();
            var aut3 = mso3.GetAutomaton(solver);

            MonaProgram pgm4 = MonaParser.Parse(source4);
            var mso4 = pgm4.ToMSO();
            var aut4 = mso4.GetAutomaton(solver);

            Assert.IsTrue(aut1.IsEquivalentWith(aut2));
            Assert.IsTrue(aut1.IsEquivalentWith(aut3));
            Assert.IsTrue(aut1.IsEquivalentWith(aut4));
        }
コード例 #39
0
        public void TestBvSetSolver4()
        {
            var solver = new BDDAlgebra();
            var _0_3 = solver.MkSetFromRange(0, 3, 6);
            var _10_13 = solver.MkSetFromRange(0x40, 0x43, 6);

            //_0_3.ToDot("_0_3.dot");
            //_10_13.ToDot("_10_13.dot");

            var _0_3_size = solver.ComputeDomainSize(_0_3, 6);
            var _10_13_size = solver.ComputeDomainSize(_10_13, 6);

            var x = solver.MkAnd(_0_3, _10_13);

            var _0_3_u_10_13 = solver.MkOr(_0_3, _10_13);
            var _0_3_u_10_13_size = solver.ComputeDomainSize(_0_3_u_10_13, 6);

            //_0_3_u_10_13.ToDot("_0_3_u_10_13.dot");

            var _0_3_u_10_13_compl = solver.MkNot(_0_3_u_10_13);
            //_0_3_u_10_13_compl.ToDot("_0_3_u_10_13_compl.dot");

            var _0_3_u_10_13_compl_size = solver.ComputeDomainSize(_0_3_u_10_13_compl, 6);

            Assert.AreEqual<ulong>(4, _0_3_size);
            Assert.AreEqual<ulong>(4, _10_13_size);
            Assert.IsTrue(x.IsEmpty);
            Assert.AreEqual<ulong>(8, _0_3_u_10_13_size);

            var ranges = solver.ToRanges(_0_3_u_10_13, 6);
            Assert.AreEqual<int>(2, ranges.Length);
            Assert.AreEqual<uint>(0, ranges[0].First);
            Assert.AreEqual<uint>(3, ranges[0].Second);
            Assert.AreEqual<uint>(0x40, ranges[1].First);
            Assert.AreEqual<uint>(0x43, ranges[1].Second);
        }
コード例 #40
0
ファイル: Run.cs プロジェクト: OlliSaarikivi/Automata
        public static void MintermTest()
        {
            var sw = new Stopwatch();

            using (System.IO.StreamWriter file =
                       new System.IO.StreamWriter(@"..\msomintermp1s1.txt"))
            {
                for (int size = 2; size < kminterm; size++)
                {
                    // Tsolve no force
                    var s1     = new CharSetSolver(BitWidth.BV64);
                    var solver = new CartesianAlgebraBDD <BDD>(s1);

                    WS1SFormula <BDD> phi = new WS1STrue <BDD>();

                    for (int k = 1; k < size; k++)
                    {
                        var leq = new WS1SLt <BDD>(new Variable <BDD>("x" + (k - 1)), new Variable <BDD>("x" + k));
                        phi = new WS1SAnd <BDD>(phi, leq);
                    }
                    for (int k = 0; k < size; k++)
                    {
                        var axk = new WS1SPred <BDD>(s1.MkBitTrue(k), new Variable <BDD>("x" + k));
                        phi = new WS1SAnd <BDD>(phi, axk);
                    }
                    for (int k = size - 1; k >= 0; k--)
                    {
                        phi = new WS1SExists <BDD>(new Variable <BDD>("x" + k), phi);
                    }

                    sw.Restart();
                    for (int t = 0; t < numTests; t++)
                    {
                        phi.GetAutomaton(solver);
                    }
                    sw.Stop();

                    var t1 = sw.ElapsedMilliseconds;

                    file.WriteLine((double)t1 / numTests);
                    Console.WriteLine((double)t1 / numTests);
                }
            }
            using (System.IO.StreamWriter file =
                       new System.IO.StreamWriter(@"..\msomintermp2s1.txt"))
            {
                for (int size = 2; size < kminterm; size++)
                {
                    // Tsolve force
                    var s1     = new CharSetSolver(BitWidth.BV64);
                    var solver = new CartesianAlgebraBDD <BDD>(s1);

                    WS1SFormula <BDD> phi = new WS1STrue <BDD>();

                    for (int k = 0; k < size; k++)
                    {
                        var axk = new WS1SPred <BDD>(s1.MkBitTrue(k), new Variable <BDD>("x" + k));
                        phi = new WS1SAnd <BDD>(phi, axk);
                    }
                    for (int k = size - 1; k >= 0; k--)
                    {
                        phi = new WS1SExists <BDD>(new Variable <BDD>("x" + k), phi);
                    }

                    var t1 = 60000L;
                    if (size <= maxmint)
                    {
                        sw.Restart();
                        for (int t = 0; t < numTests; t++)
                        {
                            phi.GetAutomaton(solver);
                        }
                        sw.Stop();

                        t1 = sw.ElapsedMilliseconds;
                    }
                    file.WriteLine((double)t1 / numTests);
                    Console.WriteLine((double)t1 / numTests);
                }
            }
            using (System.IO.StreamWriter file =
                       new System.IO.StreamWriter(@"..\msomintermp1s2.txt"))
            {
                for (int size = 2; size < kminterm; size++)
                {
                    // Tsolve solver 2
                    var solver = new CharSetSolver(BitWidth.BV64);
                    var alg    = new BDDAlgebra <BDD>(solver);

                    WS1SFormula <BDD> phi = new WS1STrue <BDD>();

                    for (int k = 1; k < size; k++)
                    {
                        var leq = new WS1SLt <BDD>(new Variable <BDD>("x" + (k - 1)), new Variable <BDD>("x" + k));
                        phi = new WS1SAnd <BDD>(phi, leq);
                    }
                    for (int k = 0; k < size; k++)
                    {
                        var axk = new WS1SPred <BDD>(solver.MkBitTrue(k), new Variable <BDD>("x" + k));
                        phi = new WS1SAnd <BDD>(phi, axk);
                    }
                    for (int k = size - 1; k >= 0; k--)
                    {
                        phi = new WS1SExists <BDD>(new Variable <BDD>("x" + k), phi);
                    }

                    var t1 = 60000L;


                    sw.Restart();
                    for (int t = 0; t < numTests; t++)
                    {
                        phi.GetAutomaton(alg);
                    }
                    sw.Stop();

                    t1 = sw.ElapsedMilliseconds;

                    file.WriteLine((double)t1 / numTests);
                    Console.WriteLine((double)t1 / numTests);
                }
            }
            using (System.IO.StreamWriter file =
                       new System.IO.StreamWriter(@"..\msomintermp2s2.txt"))
            {
                for (int size = 2; size < kminterm; size++)
                {
                    var solver = new CharSetSolver(BitWidth.BV64);
                    var alg    = new BDDAlgebra <BDD>(solver);
                    //Tforce sol 2


                    WS1SFormula <BDD> phi = new WS1STrue <BDD>();

                    for (int k = 0; k < size; k++)
                    {
                        var axk = new WS1SPred <BDD>(solver.MkBitTrue(k), new Variable <BDD>("x" + k));
                        phi = new WS1SAnd <BDD>(phi, axk);
                    }
                    for (int k = size - 1; k >= 0; k--)
                    {
                        phi = new WS1SExists <BDD>(new Variable <BDD>("x" + k), phi);
                    }

                    var t1 = 60000L;
                    if (size <= maxmint)
                    {
                        sw.Restart();
                        for (int t = 0; t < numTests; t++)
                        {
                            phi.GetAutomaton(alg);
                        }
                        sw.Stop();
                        t1 = sw.ElapsedMilliseconds;
                    }
                    file.WriteLine((double)t1 / numTests);
                    Console.WriteLine((double)t1 / numTests);
                }
            }
            using (System.IO.StreamWriter file =
                       new System.IO.StreamWriter(@"..\msominterm.txt"))
            {
                for (int size = 2; size < kminterm; size++)
                {
                    //Tminterm
                    var   solver     = new CharSetSolver(BitWidth.BV64);
                    BDD[] predicates = new BDD[size];
                    solver.GenerateMinterms();
                    for (int k = 0; k < size; k++)
                    {
                        predicates[k] = solver.MkBitTrue(k);
                    }

                    var t1 = 60000L * numTests;
                    if (size <= maxmint)
                    {
                        sw.Restart();
                        for (int t = 0; t < numTests; t++)
                        {
                            var mint = solver.GenerateMinterms(predicates).ToList();
                        }
                        sw.Stop();
                        t1 = sw.ElapsedMilliseconds;
                    }

                    file.WriteLine((double)t1 / numTests);
                    Console.WriteLine((double)t1 / numTests);
                }
            }
        }
コード例 #41
0
ファイル: MonaTests.cs プロジェクト: AutomataDotNet/Automata
        public void Mona2AutomatonTest_pred1(bool useSingletonSetSemantics)
        {
            BDDAlgebra solver = new BDDAlgebra();

            string source1 =
            @"m2l-str;
            pred succ(var1 x,y) = x < y & ~ex1 z:(x < z & z < y);
            var1 x,y,z;
            succ(x,y) & succ(y,z);
            ";

            string source2 =
            @"m2l-str;
            var1 x,y,z;
            y = x+1 & z = y + 1;
            ";

            MonaProgram pgm1 = MonaParser.Parse(source1);
            var mso1 = pgm1.ToMSO();
            var aut1 = mso1.GetAutomaton(solver,0, useSingletonSetSemantics);

            MonaProgram pgm2 = MonaParser.Parse(source2);
            var mso2 = pgm2.ToMSO();
            var aut2 = mso2.GetAutomaton(solver,0, useSingletonSetSemantics);

            Assert.IsTrue(aut1.IsEquivalentWith(aut2));
        }
コード例 #42
0
        public static void Run()
        {
            using (System.IO.StreamWriter file =
               new System.IO.StreamWriter(@"randomMSOInt.csv", false))
            {
                Console.WriteLine("num-predicates, num-minterms, minterm-time, generic-bdd, product ");
                file.WriteLine("num-predicates, num-minterms, minterm-time, generic-bdd, product ");
            }
            random = new Random(0);

            currSeed = 0;

            for (int maxConst = 3; maxConst < 4; maxConst++)
                for (int phisize = 5; phisize < 8; phisize += 1)
                {
                    //Console.WriteLine(maxConst + "," + phisize);

                    for (int i = 0; i < howMany; i++)
                    {
                        c = new Context();
                        z3 = new Z3BoolAlg(c, c.IntSort, timeout);
                        size = phisize;
                        try
                        {
                            var pair = GenerateMSOZ3Formula();

                        if (maxConst == 4 && phisize > 5)
                            break;

                            formula = pair.First;
                            predicates = pair.Second;
                            if (predicates.Count > 2)
                            {
                                var bddsolver = new BDDAlgebra<BoolExpr>(z3);
                                var sw = new Stopwatch();
                                sw.Restart();

                                long tbdd = timeout;

                                try
                                {
                                    formula.GetAutomaton(bddsolver, false);
                                    sw.Stop();
                                    tbdd = sw.ElapsedMilliseconds;
                                    if (tbdd > timeout)
                                        tbdd = timeout;
                                }
                                catch (Z3Exception e)
                                {
                                    tbdd = timeout;
                                }
                                catch (AutomataException e)
                                {
                                    tbdd = timeout;
                                }

                                if (tbdd != timeout)
                                {
                                    long tcart = timeout;
                                    try
                                    {
                                        var bdd = new BDDAlgebra();
                                        solver = new CartesianAlgebraBDD<BoolExpr>(bdd, z3);
                                        sw.Restart();
                                        formula.GetAutomaton(solver);
                                        sw.Stop();
                                        tcart = sw.ElapsedMilliseconds;
                                        if (tcart > timeout)
                                            tcart = timeout;
                                    }
                                    catch (Z3Exception e)
                                    {
                                        tcart = timeout;
                                    }
                                    catch (AutomataException e)
                                    {
                                        tcart = timeout;
                                    }

                                    sw.Restart();
                                    long tminterm = timeout;
                                    List<Pair<bool[], BoolExpr>> mint = new List<Pair<bool[], BoolExpr>>();
                                    try
                                    {
                                        mint = z3.GenerateMinterms(predicates.ToArray()).ToList();
                                        sw.Stop();
                                        tminterm = sw.ElapsedMilliseconds;
                                        if (tminterm > timeout)
                                            tminterm = timeout;
                                    }
                                    catch (Z3Exception e)
                                    {

                                        tminterm = timeout;

                                    }
                                    using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"randomMSOInt.csv", true))
                                    {
                                        Console.WriteLine(predicates.Count + ", " + (tminterm == timeout ? (int)Math.Pow(2, predicates.Count) : mint.Count) + ",  " + (double)tminterm + ", " + (double)tbdd + ", " + (double)tcart);
                                        file.WriteLine(predicates.Count + ", " + (tminterm == timeout ? (int)Math.Pow(2, predicates.Count) : mint.Count) + ", " + (double)tminterm + ", " + (double)tbdd + ", " + (double)tcart);
                                    }
                                }
                                else {
                                    //Console.WriteLine("moving to next one");

                                }
                            }
                            else
                            {
                               // Console.WriteLine("moving to next one");

                            }
                        }
                        catch (Z3Exception e)
                        {
                            Console.WriteLine("Z3 out of memory");
                            return;

                        }
                        catch (OutOfMemoryException e)
                        {
                            Console.WriteLine("Out of memory");
                            return;

                        }
                    }
                }
        }
コード例 #43
0
ファイル: MonaTests.cs プロジェクト: AutomataDotNet/Automata
        public void Mona2AutomatonTest_pred2()
        {
            BDDAlgebra solver = new BDDAlgebra();

            string source =
            @"m2l-str;
            pred succ(var1 x,y) = x < y & ~ex1 z:(x < z & z < y);
            var1 x,y,z;
            succ(x,y) & succ(y,z);
            ";

            MonaProgram pgm1 = MonaParser.Parse(source);
            var mso1 = pgm1.ToMSO();
            var aut1 = mso1.GetAutomaton(solver,0, true);

            MonaProgram pgm2 = MonaParser.Parse(source);
            var mso2 = pgm2.ToMSO();
            var aut2 = mso2.GetAutomaton(solver,0, false);

            Assert.IsFalse(aut1.IsEquivalentWith(aut2));
        }
コード例 #44
0
ファイル: MonaTests.cs プロジェクト: AutomataDotNet/Automata
        public void Mona2AutomatonTest_pred3()
        {
            BDDAlgebra solver = new BDDAlgebra();

            string source1 =
            @"m2l-str;
            pred belongs(var1 x, var2 X) = x in X;
            pred subs(var2 X, Y) = all1 x: belongs(x,X) => belongs(x,Y);
            pred equal(var2 X,Y) = subs(X,Y) & subs(Y,X);
            var2 X, Y;
            equal(X,Y);
            ";

            string source2 =
            @"m2l-str;
            var2 Y, X;
            Y = X;
            ";

            MonaProgram pgm1 = MonaParser.Parse(source1);
            var mso1 = pgm1.ToMSO();
            var aut1 = mso1.GetAutomaton(solver);

            MonaProgram pgm2 = MonaParser.Parse(source2);
            var mso2 = pgm2.ToMSO();
            var aut2 = mso2.GetAutomaton(solver);

            Assert.IsTrue(aut1.IsEquivalentWith(aut2));
        }
コード例 #45
0
        public static void Run()
        {
            using (System.IO.StreamWriter file =
                       new System.IO.StreamWriter(@"randomMSOInt.csv", false))
            {
                Console.WriteLine("num-predicates, num-minterms, minterm-time, generic-bdd, product ");
                file.WriteLine("num-predicates, num-minterms, minterm-time, generic-bdd, product ");
            }
            random = new Random(0);

            currSeed = 0;


            for (int maxConst = 3; maxConst < 4; maxConst++)
            {
                for (int phisize = 5; phisize < 8; phisize += 1)
                {
                    //Console.WriteLine(maxConst + "," + phisize);


                    for (int i = 0; i < howMany; i++)
                    {
                        c    = new Context();
                        z3   = new Z3BoolAlg(c, c.IntSort, timeout);
                        size = phisize;
                        try
                        {
                            var pair = GenerateMSOZ3Formula();

                            if (maxConst == 4 && phisize > 5)
                            {
                                break;
                            }



                            formula    = pair.First;
                            predicates = pair.Second;
                            if (predicates.Count > 2)
                            {
                                var bddsolver = new BDDAlgebra <BoolExpr>(z3);
                                var sw        = new Stopwatch();
                                sw.Restart();

                                long tbdd = timeout;

                                try
                                {
                                    formula.GetAutomaton(bddsolver, false);
                                    sw.Stop();
                                    tbdd = sw.ElapsedMilliseconds;
                                    if (tbdd > timeout)
                                    {
                                        tbdd = timeout;
                                    }
                                }
                                catch (Z3Exception e)
                                {
                                    tbdd = timeout;
                                }
                                catch (AutomataException e)
                                {
                                    tbdd = timeout;
                                }



                                if (tbdd != timeout)
                                {
                                    long tcart = timeout;
                                    try
                                    {
                                        var bdd = new BDDAlgebra();
                                        solver = new CartesianAlgebraBDD <BoolExpr>(bdd, z3);
                                        sw.Restart();
                                        formula.GetAutomaton(solver);
                                        sw.Stop();
                                        tcart = sw.ElapsedMilliseconds;
                                        if (tcart > timeout)
                                        {
                                            tcart = timeout;
                                        }
                                    }
                                    catch (Z3Exception e)
                                    {
                                        tcart = timeout;
                                    }
                                    catch (AutomataException e)
                                    {
                                        tcart = timeout;
                                    }

                                    sw.Restart();
                                    long tminterm = timeout;
                                    List <Pair <bool[], BoolExpr> > mint = new List <Pair <bool[], BoolExpr> >();
                                    try
                                    {
                                        mint = z3.GenerateMinterms(predicates.ToArray()).ToList();
                                        sw.Stop();
                                        tminterm = sw.ElapsedMilliseconds;
                                        if (tminterm > timeout)
                                        {
                                            tminterm = timeout;
                                        }
                                    }
                                    catch (Z3Exception e)
                                    {
                                        tminterm = timeout;
                                    }
                                    using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"randomMSOInt.csv", true))
                                    {
                                        Console.WriteLine(predicates.Count + ", " + (tminterm == timeout ? (int)Math.Pow(2, predicates.Count) : mint.Count) + ",  " + (double)tminterm + ", " + (double)tbdd + ", " + (double)tcart);
                                        file.WriteLine(predicates.Count + ", " + (tminterm == timeout ? (int)Math.Pow(2, predicates.Count) : mint.Count) + ", " + (double)tminterm + ", " + (double)tbdd + ", " + (double)tcart);
                                    }
                                }
                                else
                                {
                                    //Console.WriteLine("moving to next one");
                                }
                            }
                            else
                            {
                                // Console.WriteLine("moving to next one");
                            }
                        }
                        catch (Z3Exception e)
                        {
                            Console.WriteLine("Z3 out of memory");
                            return;
                        }
                        catch (OutOfMemoryException e)
                        {
                            Console.WriteLine("Out of memory");
                            return;
                        }
                    }
                }
            }
        }
コード例 #46
0
ファイル: Run.cs プロジェクト: OlliSaarikivi/Automata
        public static void POPLTestsNewSolver2()
        {
            var sw = new Stopwatch();

            using (System.IO.StreamWriter file =
                       new System.IO.StreamWriter(@"..\msobddsol2.txt"))
            {
                for (int to = 2; to < kpopl; to++)
                {
                    // T1
                    var s1     = new CharSetSolver(BitWidth.BV64);
                    var solver = new BDDAlgebra <BDD>(s1);


                    WS1SFormula <BDD> phi = new WS1STrue <BDD>();

                    for (int k = 1; k < to; k++)
                    {
                        var leq = new WS1SLt <BDD>(new Variable <BDD>("x" + (k - 1)), new Variable <BDD>("x" + k));
                        phi = new WS1SAnd <BDD>(phi, leq);
                    }
                    for (int k = to - 1; k >= 0; k--)
                    {
                        phi = new WS1SExists <BDD>(new Variable <BDD>("x" + k), phi);
                    }

                    sw.Restart();
                    for (int t = 0; t < numTests; t++)
                    {
                        phi.GetAutomaton(solver);
                    }
                    sw.Stop();

                    var t1 = sw.ElapsedMilliseconds;

                    //T2
                    s1     = new CharSetSolver(BitWidth.BV64);
                    solver = new BDDAlgebra <BDD>(s1);
                    phi    = new WS1STrue <BDD>();

                    for (int k = 1; k < to; k++)
                    {
                        var leq = new WS1SLt <BDD>(new Variable <BDD>("x" + (k - 1)), new Variable <BDD>("x" + k));
                        phi = new WS1SAnd <BDD>(phi, leq);
                    }
                    for (int k = 0; k < to; k++)
                    {
                        var axk = new WS1SPred <BDD>(s1.MkCharConstraint('a', false), new Variable <BDD>("x" + k));
                        phi = new WS1SAnd <BDD>(phi, axk);
                    }
                    for (int k = to - 1; k >= 0; k--)
                    {
                        phi = new WS1SExists <BDD>(new Variable <BDD>("x" + k), phi);
                    }

                    sw.Restart();
                    for (int t = 0; t < numTests; t++)
                    {
                        phi.GetAutomaton(solver);
                    }
                    sw.Stop();

                    var t2 = sw.ElapsedMilliseconds;

                    // T3
                    s1     = new CharSetSolver(BitWidth.BV64);
                    solver = new BDDAlgebra <BDD>(s1);
                    phi    = new WS1STrue <BDD>();

                    for (int k = 1; k < to; k++)
                    {
                        var leq = new WS1SLt <BDD>(new Variable <BDD>("x" + (k - 1)), new Variable <BDD>("x" + k));
                        phi = new WS1SAnd <BDD>(phi, leq);
                    }
                    for (int k = 0; k < to; k++)
                    {
                        var axk = new WS1SPred <BDD>(s1.MkCharConstraint('a', false), new Variable <BDD>("x" + k));
                        phi = new WS1SAnd <BDD>(phi, axk);
                    }
                    for (int k = to - 1; k >= 0; k--)
                    {
                        phi = new WS1SExists <BDD>(new Variable <BDD>("x" + k), phi);
                    }

                    var exycy = new WS1SExists <BDD>(new Variable <BDD>("y"), new WS1SPred <BDD>(s1.MkCharConstraint('c', false), new Variable <BDD>("y")));
                    phi = new WS1SAnd <BDD>(phi, exycy);

                    sw.Restart();
                    for (int t = 0; t < numTests; t++)
                    {
                        phi.GetAutomaton(solver);
                    }
                    sw.Stop();

                    var t3 = sw.ElapsedMilliseconds;

                    //T4
                    s1     = new CharSetSolver(BitWidth.BV64);
                    solver = new BDDAlgebra <BDD>(s1);
                    phi    = new WS1STrue <BDD>();

                    for (int k = 1; k < to; k++)
                    {
                        var leq   = new WS1SLt <BDD>(new Variable <BDD>("x" + (k - 1)), new Variable <BDD>("x" + k));
                        var axk   = new WS1SPred <BDD>(s1.MkCharConstraint('a', false), new Variable <BDD>("x" + (k - 1)));
                        var cxk   = new WS1SPred <BDD>(s1.MkCharConstraint('c', false), new Variable <BDD>("x" + (k - 1)));
                        var inter = new WS1SOr <BDD>(new WS1SAnd <BDD>(leq, axk), cxk);
                        phi = new WS1SAnd <BDD>(phi, inter);
                    }
                    for (int k = to - 1; k >= 0; k--)
                    {
                        phi = new WS1SExists <BDD>(new Variable <BDD>("x" + k), phi);
                    }

                    exycy = new WS1SExists <BDD>(new Variable <BDD>("y"), new WS1SPred <BDD>(s1.MkCharConstraint('c', false), new Variable <BDD>("y")));
                    phi   = new WS1SAnd <BDD>(phi, exycy);

                    var t4 = 60000L * numTests;
                    if (to <= maxmphipop)
                    {
                        sw.Restart();
                        for (int t = 0; t < numTests; t++)
                        {
                            phi.GetAutomaton(solver);
                        }
                        sw.Stop();
                        t4 = sw.ElapsedMilliseconds;
                    }

                    file.WriteLine(to + "," + (double)t1 / numTests + "," + (double)t2 / numTests + "," + (double)t3 / numTests + "," + (double)t4 / numTests);
                    Console.WriteLine(to + "," + (double)t1 / numTests + "," + (double)t2 / numTests + "," + (double)t3 / numTests + "," + (double)t4 / numTests);
                }
            }
        }
コード例 #47
0
        //Run the test on each phi in phis and store result in infFile
        static void RunTest(System.IO.StreamWriter outFile, List <Tuple <MSOFormula <BDD>, CharSetSolver> > phis, int stop1At = 100, int stop2At = 100, int stop3At = 100)
        {
            var sw = new Stopwatch();

            using (System.IO.StreamWriter file = outFile)
            {
                Console.WriteLine("k, old, cartesian, generic-bdd");
                file.WriteLine("k, old, cartesian, generic-bdd");
                int to = 2;
                foreach (var p in phis)
                {
                    // T1
                    var t1 = timeout;
                    if (to < stop1At)
                    {
                        try
                        {
                            sw.Restart();
                            for (int t = 0; t < numTests; t++)
                            {
                                p.Item1.GetAutomaton(p.Item2);
                            }
                            sw.Stop();
                            t1 = sw.ElapsedMilliseconds;
                        }
                        catch (OutOfMemoryException)
                        {
                            t1 = timeout * numTests;
                        }
                    }

                    //T2
                    var t2 = timeout;
                    if (to < stop1At)
                    {
                        var cartesianBDD = new CartesianAlgebraBDD <BDD>(p.Item2);

                        try
                        {
                            sw.Restart();
                            for (int t = 0; t < numTests; t++)
                            {
                                p.Item1.GetAutomaton(cartesianBDD);
                            }
                            sw.Stop();
                            t2 = sw.ElapsedMilliseconds;
                        }
                        catch (OutOfMemoryException)
                        {
                            t2 = timeout * numTests;
                        }
                    }

                    // T3
                    var t3 = timeout;
                    if (to < stop3At)
                    {
                        BDDAlgebra <BDD> cartesianProduct = new BDDAlgebra <BDD>(p.Item2);

                        try
                        {
                            sw.Restart();
                            for (int t = 0; t < numTests; t++)
                            {
                                p.Item1.GetAutomaton(cartesianProduct, false);
                            }
                            sw.Stop();

                            t3 = sw.ElapsedMilliseconds;
                        }
                        catch (OutOfMemoryException)
                        {
                            t3 = timeout * numTests;
                        }
                    }

                    file.WriteLine(to + "," + (double)t1 / numTests + "," + (double)t2 / numTests + "," + (double)t3 / numTests);
                    Console.WriteLine(to + "," + (double)t1 / numTests + "," + (double)t2 / numTests + "," + (double)t3 / numTests);
                    to++;
                }
            }
        }
コード例 #48
0
 public void TestBvSetSolver()
 {
     var solver = new BDDAlgebra();
     var set = solver.MkOr(solver.MkSetFromRange(10001, uint.MaxValue, 31),solver.MkSetFromRange(5, 1004, 31));
     ulong elems = solver.ComputeDomainSize(set,31);
     int nodes = set.CountNodes();
     uint expected = (uint.MaxValue - 10000) + 1000;
     Assert.AreEqual<ulong>(expected, elems);
 }
コード例 #49
0
        public void TestBvSetSolver3()
        {
            var solver = new BDDAlgebra();
            var letters_ASCII = solver.MkOr(solver.MkSetFromRange('a', 'z', 6), solver.MkSetFromRange('A', 'Z', 6));
            var letters_eASCII = solver.MkOr(solver.MkSetFromRange('a', 'z', 7), solver.MkSetFromRange('A', 'Z', 7));

            Assert.AreEqual<ulong>(52, solver.ComputeDomainSize(letters_ASCII, 6));
            Assert.AreEqual<ulong>(52, solver.ComputeDomainSize(letters_eASCII, 7));

            var set7 = solver.MkNot(letters_ASCII);
            ulong elems7 = solver.ComputeDomainSize(set7, 6);
            uint expected7 = (1<<7) - 52;
            Assert.AreEqual<ulong>(expected7, elems7);

            var set8 = solver.MkNot(letters_eASCII);
            ulong elems8 = solver.ComputeDomainSize(set8, 7);
            ulong expected8 = (1<<8) - 52;
            Assert.AreEqual<ulong>(expected8, elems8);
        }