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); }
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); }
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)); }
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)); }
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); }
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); } } }
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); } } }