public void GenerateMintermsTest1() { CharSetSolver bddb = new CharSetSolver(BitWidth.BV16); BDD a = bddb.MkRangeConstraint('a', 'a'); BDD b = bddb.MkRangeConstraint('b', 'b'); BDD c = bddb.MkRangeConstraint('c', 'c'); var combinations = new List <Pair <bool[], BDD> >(bddb.GenerateMinterms(new BDD[] { a, b, c })); Assert.AreEqual <int>(4, combinations.Count); }
public void GenerateMintermsTest3() { CharSetSolver bddb = new CharSetSolver(BitWidth.BV16); BDD A = bddb.MkRangeConstraint('1', '4'); BDD A1 = bddb.MkRangesConstraint(false, new char[][] { new char[] { '1', '3' }, new char[] { '3', '4' } }); BDD B = bddb.MkRangesConstraint(false, new char[][] { new char[] { '2', '3' }, new char[] { '5', '6' }, new char[] { '8', '8' } }); BDD C = bddb.MkRangesConstraint(false, new char[][] { new char[] { '3', '4' }, new char[] { '6', '7' }, new char[] { '9', '9' } }); BDD D = bddb.MkRangesConstraint(false, new char[][] { new char[] { '0', '0' }, new char[] { '8', '9' } }); var combinations = new List <Pair <bool[], BDD> >(bddb.GenerateMinterms(new BDD[] { A, B, C, A1, D })); Assert.AreEqual <int>(11, combinations.Count, "exactly 11 combinations must be possible"); }
public void GenerateMintermsTest2() { CharSetSolver bddb = new CharSetSolver(BitWidth.BV16); BDD a = bddb.MkRangeConstraint('b', 'c'); BDD b = bddb.MkRangeConstraint('b', 'b'); BDD b2 = bddb.MkRangeConstraint('b', 'b'); BDD c = bddb.MkRangeConstraint('c', 'c'); BDD b3 = bddb.MkRangeConstraint('b', 'b'); var combinations = new List <Pair <bool[], BDD> >(bddb.GenerateMinterms(new BDD[] { a, b, b2, c, b3 })); Assert.AreEqual <int>(3, combinations.Count, "only three combinations are possible"); }
public void GenerateMintermsTest4() { CharSetSolver solver = new CharSetSolver(BitWidth.BV7); BDD a = solver.MkRangeConstraint('\0', '\x7E'); BDD b = solver.MkRangeConstraint('1', '1'); BDD c = solver.MkRangeConstraint('1', '3'); var Z = new List <Pair <bool[], BDD> >(solver.GenerateMinterms(new BDD[] { a, b, c })).ToArray(); var Y = Array.ConvertAll(Z, x => x.Second); var X = new HashSet <BDD>(Y); Assert.AreEqual <int>(4, X.Count); Assert.IsTrue(X.Contains(solver.MkRangeConstraint('1', '1'))); Assert.IsTrue(X.Contains(solver.MkRangeConstraint('2', '3'))); Assert.IsTrue(X.Contains(solver.MkRangesConstraint(false, new char[][] { new char[] { '\x7F', '\x7F' } }))); Assert.IsTrue(X.Contains(solver.MkRangesConstraint(false, new char[][] { new char[] { '4', '\x7E' }, new char[] { '\0', '0' } }))); }
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); } } }
public void GenerateMintermsTest4() { CharSetSolver solver = new CharSetSolver(BitWidth.BV7); BDD a = solver.MkRangeConstraint( '\0', '\x7E'); BDD b = solver.MkRangeConstraint( '1', '1'); BDD c = solver.MkRangeConstraint( '1', '3'); var Z = new List<Pair<bool[], BDD>>(solver.GenerateMinterms(new BDD[] { a, b, c })).ToArray(); var Y = Array.ConvertAll(Z, x => x.Second); var X = new HashSet<BDD>(Y); Assert.AreEqual<int>(4, X.Count); Assert.IsTrue(X.Contains(solver.MkRangeConstraint( '1', '1'))); Assert.IsTrue(X.Contains(solver.MkRangeConstraint( '2', '3'))); Assert.IsTrue(X.Contains(solver.MkRangesConstraint(false, new char[][] {new char[] { '\x7F', '\x7F' } }))); Assert.IsTrue(X.Contains(solver.MkRangesConstraint(false, new char[][] { new char[] { '4', '\x7E' }, new char[] { '\0', '0' } }))); }
public void GenerateMintermsTest3() { CharSetSolver bddb = new CharSetSolver(BitWidth.BV16); BDD A = bddb.MkRangeConstraint( '1', '4'); BDD A1 = bddb.MkRangesConstraint(false, new char[][] { new char[] { '1', '3' }, new char[] { '3', '4' }}); BDD B = bddb.MkRangesConstraint(false, new char[][] { new char[] { '2', '3' }, new char[] { '5', '6' }, new char[] { '8', '8' } }); BDD C = bddb.MkRangesConstraint(false, new char[][] { new char[] { '3', '4' }, new char[] { '6', '7' }, new char[] { '9', '9' } }); BDD D = bddb.MkRangesConstraint(false, new char[][] { new char[] { '0', '0' }, new char[] { '8', '9' } }); var combinations = new List<Pair<bool[], BDD>>(bddb.GenerateMinterms(new BDD[] { A, B, C, A1, D })); Assert.AreEqual<int>(11, combinations.Count, "exactly 11 combinations must be possible"); }
public void GenerateMintermsTest2() { CharSetSolver bddb = new CharSetSolver(BitWidth.BV16); BDD a = bddb.MkRangeConstraint( 'b', 'c'); BDD b = bddb.MkRangeConstraint( 'b', 'b'); BDD b2 = bddb.MkRangeConstraint( 'b', 'b'); BDD c = bddb.MkRangeConstraint( 'c', 'c'); BDD b3 = bddb.MkRangeConstraint( 'b', 'b'); var combinations = new List<Pair<bool[], BDD>>(bddb.GenerateMinterms(new BDD[] { a, b, b2, c, b3 })); Assert.AreEqual<int>(3, combinations.Count, "only three combinations are possible"); }
public void GenerateMintermsTest1() { CharSetSolver bddb = new CharSetSolver(BitWidth.BV16); BDD a = bddb.MkRangeConstraint( 'a', 'a'); BDD b = bddb.MkRangeConstraint( 'b', 'b'); BDD c = bddb.MkRangeConstraint( 'c', 'c'); var combinations = new List<Pair<bool[], BDD>>(bddb.GenerateMinterms(new BDD[] { a, b, c })); Assert.AreEqual<int>(4, combinations.Count); }