public void TestWS1S_SuccDef_GetAutomaton() { var solver = new CharSetSolver(BitWidth.BV7); var x = new Variable("x", true); var y = new Variable("y", true); var z = new Variable("z", true); var xLTy = new WS1SLt <BDD>(x, y); var xLTzLTy = (new WS1SLt <BDD>(x, z)) & (new WS1SLt <BDD>(z, y)); var Ez = new WS1SExists <BDD>(z, xLTzLTy); var notEz = new WS1SNot <BDD>(Ez); var xSyDef = new WS1SAnd <BDD>(xLTy, notEz); var ca = new CartesianAlgebraBDD <BDD>(solver); var aut_xSyDef = xSyDef.GetAutomaton(ca, x, y); var aut_xLTzLTy = xLTzLTy.GetAutomaton(ca, x, y, z); var aut_Ez = Ez.GetAutomaton(ca, x, y); var aut_notEz = notEz.GetAutomaton(ca, x, y); var aut_xLTy = xLTy.GetAutomaton(ca, 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 <BDD>(x, y, 1); var aut_xSyPrim = xSyPrim.GetAutomaton(ca, x, y); var equiv = aut_xSyPrim.IsEquivalentWith(aut_xSyDef, ca); Assert.IsTrue(equiv); }
public void TestWS1S_GetAutomatonBDD_eq_GetAutomaton() { var solver = new CharSetSolver(BitWidth.BV7); var nrOfLabelBits = (int)BitWidth.BV7; var isDigit = solver.MkCharSetFromRegexCharClass(@"\d"); var isLetter = solver.MkCharSetFromRegexCharClass(@"(c|C)"); var x = new Variable("x", false); var y = new Variable("y", false); var z = new Variable("z", false); var X = new Variable("X", false); //there are at least two distinct positions x and y var xy = (new WS1SNot <BDD>(new WS1SEq <BDD>(x, y)) & new WS1SSingleton <BDD>(x) & new WS1SSingleton <BDD>(y)); //there is a set X containing x and y and all positions z in X have characters that satisfy isWordLetter var x_sub_X = new WS1SSubset <BDD>(x, X); var y_sub_X = new WS1SSubset <BDD>(y, X); var z_sub_X = new WS1SSubset <BDD>(z, X); var isletter_z = new WS1SPred <BDD>(isLetter, z); var psi = new WS1SExists <BDD>(X, (x_sub_X & y_sub_X & ~(new WS1SExists <BDD>(z, ~(~(new WS1SSingleton <BDD>(z) & z_sub_X) | isletter_z))))); var atLeast2w = xy & psi; var atLeast2wEE = new WS1SExists <BDD>(x, (new WS1SExists <BDD>(y, atLeast2w))); var autBDD = atLeast2w.GetAutomatonBDD(solver, nrOfLabelBits, x, y); var ca = new CartesianAlgebraBDD <BDD>(solver); var autPROD = atLeast2w.GetAutomaton(ca, x, y); //autBDD.ShowGraph("autBDD"); //autPROD.ShowGraph("autPROD"); var aut_atLeast2wEE1 = BasicAutomata.Restrict(atLeast2wEE.GetAutomaton(ca)); var aut_atLeast2wEE2 = atLeast2wEE.GetAutomatonBDD(solver, nrOfLabelBits); //aut_atLeast2wEE1.ShowGraph("aut_atLeast2wEE1"); //aut_atLeast2wEE2.ShowGraph("aut_atLeast2wEE2"); Assert.IsTrue(aut_atLeast2wEE1.IsEquivalentWith(aut_atLeast2wEE2, solver)); }
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 WS1SLt <BoolExpr>(x, y); var xLTzLTy = (new WS1SLt <BoolExpr>(x, z)) & (new WS1SLt <BoolExpr>(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); }
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); } } }
public static void POPLTestsNew() { var sw = new Stopwatch(); using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"..\msobdd.txt")) { for (int to = 2; to < kpopl; to++) { // T1 var s1 = new CharSetSolver(BitWidth.BV64); var solver = new CartesianAlgebraBDD <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 CartesianAlgebraBDD <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 CartesianAlgebraBDD <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 CartesianAlgebraBDD <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); } } }