コード例 #1
0
ファイル: WS1S.cs プロジェクト: EgorGumin/Automata
        internal override Automaton <BDD> getAutomaton(SimpleList <string> variables, CharSetSolver solver)
        {
            var pos1 = variables.IndexOf(var1) + ((int)solver.Encoding);
            var pos2 = variables.IndexOf(var2) + ((int)solver.Encoding);

            //var trueBv = MkTrue(variables, solver);
            var pos1is0 = solver.MkBitFalse(pos1);
            var pos1is1 = solver.MkBitTrue(pos1);
            var pos2is0 = solver.MkBitFalse(pos2);
            var pos2is1 = solver.MkBitTrue(pos2);

            var both0      = solver.MkAnd(pos1is0, pos2is0);
            var pos11pos20 = solver.MkAnd(pos1is1, pos2is0);
            var pos10pos21 = solver.MkAnd(pos1is0, pos2is1);

            //Create automaton for condition
            var moves = new Move <BDD>[] {
                new Move <BDD>(0, 0, both0),
                new Move <BDD>(0, 1, pos11pos20),
                new Move <BDD>(1, 1, both0),
                new Move <BDD>(1, 2, pos10pos21),
                new Move <BDD>(2, 2, both0),
            };

            return(Automaton <BDD> .Create(solver, 0, new int[] { 2 }, moves));//.Determinize(solver).Minimize(solver);
        }
コード例 #2
0
ファイル: WS1S.cs プロジェクト: EgorGumin/Automata
        internal override Automaton <BDD> getAutomaton(SimpleList <string> variables, CharSetSolver solver)
        {
            var pos1 = variables.IndexOf(var1) + ((int)solver.Encoding);
            var pos2 = variables.IndexOf(var2) + ((int)solver.Encoding);

            var both1  = solver.MkAnd(solver.MkBitTrue(pos1), solver.MkBitTrue(pos2));
            var both0  = solver.MkAnd(solver.MkBitFalse(pos1), solver.MkBitFalse(pos2));
            var eqCond = solver.MkOr(both0, both1);

            //Create automaton for condition
            var moves = new Move <BDD>[] { new Move <BDD>(0, 0, eqCond) };

            return(Automaton <BDD> .Create(solver, 0, new int[] { 0 }, moves));//.Determinize(solver).Minimize(solver);
        }
コード例 #3
0
ファイル: WS1S.cs プロジェクト: EgorGumin/Automata
        internal override Automaton <BDD> getAutomaton(SimpleList <string> variables, CharSetSolver solver)
        {
            var k = variables.IndexOf(var) + ((int)solver.Encoding);
            //var trueBv = MkTrue(variables, solver);

            //Compute predicates for k-th bit is 0 or 1
            //var posIs1 = solver.MkAnd(new BDD[] { trueBv, solver.MkSetWithBitTrue(k), solver.ShiftLeft(pred, variables.Count) });
            //var posIs0 = solver.MkAnd(trueBv, solver.MkSetWithBitFalse(k));
            var posIs1 = solver.MkAnd(solver.MkBitTrue(k), pred);
            var posIs0 = solver.MkBitFalse(k);
            var psi    = solver.MkOr(posIs0, posIs1);

            //Create automaton for condition
            var moves = new Move <BDD>[] { new Move <BDD>(0, 0, psi) };

            return(Automaton <BDD> .Create(solver, 0, new int[] { 0 }, moves));
        }
コード例 #4
0
ファイル: WS1S.cs プロジェクト: EgorGumin/Automata
        internal override Automaton <BDD> getAutomaton(SimpleList <string> variables, CharSetSolver solver)
        {
            var pos = variables.IndexOf(var) + ((int)solver.Encoding);

            //var trueBv = MkTrue(variables, solver);
            var posIs1 = solver.MkBitTrue(pos);
            var posIs0 = solver.MkBitFalse(pos);

            //Create automaton for condition
            var moves = new Move <BDD>[] {
                new Move <BDD>(0, 0, posIs0),
                new Move <BDD>(0, 1, posIs1),
                new Move <BDD>(1, 1, posIs0)
            };

            return(Automaton <BDD> .Create(solver, 0, new int[] { 1 }, moves));
        }
コード例 #5
0
ファイル: WS1S.cs プロジェクト: EgorGumin/Automata
        internal override Automaton <BDD> getAutomaton(SimpleList <string> variables, CharSetSolver solver)
        {
            var pos1 = variables.IndexOf(X1) + ((int)solver.Encoding);
            var pos2 = variables.IndexOf(X2) + ((int)solver.Encoding);

            //pos1is1 implies pos2is1
            //  is equivalent to
            //not(pos1is1) or pos2is1
            //  is equivalent to
            //pos1is0 or pos2is1
            //var trueBv = MkTrue(variables, solver);
            var pos2is1    = solver.MkBitTrue(pos2);
            var pos1is0    = solver.MkBitFalse(pos1);
            var subsetCond = solver.MkOr(pos1is0, pos2is1);


            //Create automaton for condition
            var moves = new Move <BDD>[] { new Move <BDD>(0, 0, subsetCond) };

            return(Automaton <BDD> .Create(solver, 0, new int[] { 0 }, moves));//.Determinize(solver).Minimize(solver);
        }
コード例 #6
0
ファイル: LargeMinterm.cs プロジェクト: wellsoftware/Automata
        public static void Run()
        {
            var sw = new Stopwatch();

            //ex x1 x2... a(x1) /\ a(x2).../\ x1<x2...
            using (System.IO.StreamWriter file =
                       new System.IO.StreamWriter(@"..\mso-minterm-p1.csv"))
            {
                file.WriteLine("k, old, cartesian, trie, minterm");
                for (int size = 2; size < kminterm; size++)
                {
                    var solver           = new CharSetSolver(BitWidth.BV64);
                    MSOFormula <BDD> phi = new MSOTrue <BDD>();

                    //x1<x2 /\...
                    for (int k = 1; k < size; k++)
                    {
                        var leq = new MSOSuccN <BDD>(new Variable("x" + (k - 1), true), new Variable("x" + k, true), 1);
                        phi = new MSOAnd <BDD>(phi, leq);
                    }

                    //ai(xi) /\ ...
                    for (int k = 0; k < size; k++)
                    {
                        var axk = new MSOPredicate <BDD>(solver.MkBitTrue(k), new Variable("x" + k, true));
                        phi = new MSOAnd <BDD>(phi, axk);
                    }
                    phi = new MSOAnd <BDD>(new MSOeqN <BDD>(new Variable("x" + 0, true), 0), phi);
                    for (int k = size - 1; k >= 0; k--)
                    {
                        phi = new MSOExists <BDD>(new Variable("x" + k, true), phi);
                    }

                    //Old
                    sw.Restart();
                    for (int t = 0; t < numTests; t++)
                    {
                        var aut = phi.GetAutomaton(solver);
                    }

                    var told = sw.ElapsedMilliseconds;

                    //BDD
                    sw.Restart();
                    for (int t = 0; t < numTests; t++)
                    {
                        var aut = phi.GetAutomaton(new CartesianAlgebraBDD <BDD>(solver));
                    }
                    sw.Stop();

                    var t1 = sw.ElapsedMilliseconds;

                    //Trie
                    sw.Restart();
                    for (int t = 0; t < numTests; t++)
                    {
                        var aut = phi.GetAutomaton(new BDDAlgebra <BDD>(solver), false);
                    }

                    var t2 = sw.ElapsedMilliseconds;

                    //Tminterm
                    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 t3 = 60000L * numTests;
                    if (size <= maxmint)
                    {
                        sw.Restart();
                        for (int t = 0; t < numTests; t++)
                        {
                            var mint = solver.GenerateMinterms(predicates).ToList();
                        }
                        sw.Stop();
                        t3 = sw.ElapsedMilliseconds;
                    }

                    file.WriteLine(size + ", " + (double)told / numTests + ", " + (double)t1 / numTests + ", " + (double)t2 / numTests + ", " + (double)t3 / numTests);
                    Console.WriteLine(size + ", " + (double)told / numTests + ", " + (double)t1 / numTests + ", " + (double)t2 / numTests + ", " + (double)t3 / numTests);
                }
            }

            //ex x1 x2... a(x1) /\ a(x2)...
            using (System.IO.StreamWriter file =
                       new System.IO.StreamWriter(@"..\mso-minterm-p2.csv"))
            {
                file.WriteLine("k, old, cartesian, trie, minterm");
                for (int size = 2; size < 10; size++)
                {
                    // Tsolve force
                    var solver = new CharSetSolver();

                    MSOFormula <BDD> phi = new MSOTrue <BDD>();

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

                    //Old
                    sw.Restart();
                    for (int t = 0; t < numTests; t++)
                    {
                        var aut = phi.GetAutomaton(solver);
                    }

                    var told = sw.ElapsedMilliseconds;

                    //Cartesian
                    var t1 = 60000L * numTests;
                    if (size <= 7)
                    {
                        sw.Restart();
                        for (int t = 0; t < numTests; t++)
                        {
                            phi.GetAutomaton(new CartesianAlgebraBDD <BDD>(solver));
                        }
                        sw.Stop();

                        t1 = sw.ElapsedMilliseconds;
                    }


                    //Trie
                    var t2 = 60000L * numTests;
                    sw.Restart();
                    for (int t = 0; t < numTests; t++)
                    {
                        phi.GetAutomaton(new BDDAlgebra <BDD>(solver), false);
                    }
                    sw.Stop();

                    t2 = sw.ElapsedMilliseconds;

                    //Tminterm
                    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 t3 = 60000L * numTests;
                    if (size <= maxmint)
                    {
                        sw.Restart();
                        for (int t = 0; t < numTests; t++)
                        {
                            var mint = solver.GenerateMinterms(predicates).ToList();
                        }
                        sw.Stop();
                        t3 = sw.ElapsedMilliseconds;
                    }

                    file.WriteLine(size + ", " + (double)told / numTests + ", " + (double)t1 / numTests + ", " + (double)t2 / numTests + ", " + (double)t3 / numTests);
                    Console.WriteLine(size + ", " + (double)told / numTests + ", " + (double)t1 / numTests + ", " + (double)t2 / numTests + ", " + (double)t3 / numTests);
                }
            }
        }
コード例 #7
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);
                }
            }
        }