public void ChooseUnifromlyTest() { CharSetSolver solver = new CharSetSolver(BitWidth.BV16); BDD set1 = solver.MkRangeConstraint('\0', '\x01', true); BDD set2 = solver.MkRangeConstraint('\u0FFF', '\u0FFF'); string set2str = solver.PrettyPrint(set2); BDD set3 = solver.MkRangeConstraint('\u00FF', '\u00FF'); BDD set4 = solver.MkRangeConstraint('\u000F', '\u000F'); BDD set = solver.MkOr(new BDD[] { set2, set3, set4, set1 }); string setstr = solver.PrettyPrint(set); set.ToDot(@"foo.dot"); var map = new Dictionary <char, int>(); map['\0'] = 0; map['\x01'] = 0; map['\u0FFF'] = 0; map['\u00FF'] = 0; map['\u000F'] = 0; for (int i = 0; i < 50000; i++) { var c = solver.ChooseUniformly(set); map[c] += 1; } foreach (var kv in map) { Assert.IsTrue(kv.Value > 9700); } }
public void ChooseTest2() { CharSetSolver solver = new CharSetSolver(BitWidth.BV16); BDD set1 = solver.MkRangeConstraint('a', 'a', true); string set1str = solver.PrettyPrint(set1); BDD set2 = solver.MkRangeConstraint('a', 'a'); string set2str = solver.PrettyPrint(set2); BDD set3 = solver.MkRangeConstraint('A', 'A'); string set3str = solver.PrettyPrint(set3); BDD set1a = solver.MkOr(set2, set3); Assert.AreEqual<string>("[Aa]", set1str); Assert.AreEqual<string>("a", set2str); Assert.AreEqual<string>("A", set3str); }
public void ChooseTest() { for (int i = 0; i < 10; i++) { CharSetSolver solver = new CharSetSolver(BitWidth.BV16); BDD set1 = solver.MkRangeConstraint('a', 'c', true); string set1str = solver.PrettyPrint(set1); BDD set2 = solver.MkRangeConstraint('a', 'c'); string set2str = solver.PrettyPrint(set2); BDD set3 = solver.MkRangeConstraint('A', 'C'); string set3str = solver.PrettyPrint(set3); BDD set1a = solver.MkOr(set2, set3); Assert.AreEqual <string>("[A-Ca-c]", set1str); Assert.AreEqual <string>("[a-c]", set2str); Assert.AreEqual <string>("[A-C]", set3str); int h1 = set1.GetHashCode(); int h2 = set1a.GetHashCode(); bool same = (h1 == h2); Assert.AreSame(set1, set1a); Assert.IsTrue(same); Assert.IsTrue(solver.AreEquivalent(set1, set1a)); //int seed = solver.Chooser.RandomSeed; char choice1 = (char)solver.Choose(set1); char choice2 = (char)solver.Choose(set1); char choice3 = (char)solver.Choose(set1); char choice4 = (char)solver.Choose(set1); //solver.Chooser.RandomSeed = seed; //char choice1a = solver.Choose(set1a); //char choice2a = solver.Choose(set1a); //char choice3a = solver.Choose(set1a); //char choice4a = solver.Choose(set1a); //string s = new String(new char[] { choice1, choice2, choice3, choice4 }); //string sa = new String(new char[] { choice1a, choice2a, choice3a, choice4a }); //Assert.AreEqual<string>(s, sa); } }
public void ChooseTest2() { CharSetSolver solver = new CharSetSolver(BitWidth.BV16); BDD set1 = solver.MkRangeConstraint('a', 'a', true); string set1str = solver.PrettyPrint(set1); BDD set2 = solver.MkRangeConstraint('a', 'a'); string set2str = solver.PrettyPrint(set2); BDD set3 = solver.MkRangeConstraint('A', 'A'); string set3str = solver.PrettyPrint(set3); BDD set1a = solver.MkOr(set2, set3); Assert.AreEqual <string>("[Aa]", set1str); Assert.AreEqual <string>("a", set2str); Assert.AreEqual <string>("A", set3str); }
public void ChooseTest() { for (int i = 0; i < 10; i++) { CharSetSolver solver = new CharSetSolver(BitWidth.BV16); BDD set1 = solver.MkRangeConstraint('a', 'c', true); string set1str = solver.PrettyPrint(set1); BDD set2 = solver.MkRangeConstraint('a', 'c'); string set2str = solver.PrettyPrint(set2); BDD set3 = solver.MkRangeConstraint( 'A', 'C'); string set3str = solver.PrettyPrint(set3); BDD set1a = solver.MkOr(set2, set3); Assert.AreEqual<string>("[A-Ca-c]",set1str); Assert.AreEqual<string>("[a-c]", set2str); Assert.AreEqual<string>("[A-C]", set3str); int h1 = set1.GetHashCode(); int h2 = set1a.GetHashCode(); bool same = (h1 == h2); Assert.AreSame(set1, set1a); Assert.IsTrue(same); Assert.IsTrue(solver.AreEquivalent(set1, set1a)); //int seed = solver.Chooser.RandomSeed; char choice1 = (char)solver.Choose(set1); char choice2 = (char)solver.Choose(set1); char choice3 = (char)solver.Choose(set1); char choice4 = (char)solver.Choose(set1); //solver.Chooser.RandomSeed = seed; //char choice1a = solver.Choose(set1a); //char choice2a = solver.Choose(set1a); //char choice3a = solver.Choose(set1a); //char choice4a = solver.Choose(set1a); //string s = new String(new char[] { choice1, choice2, choice3, choice4 }); //string sa = new String(new char[] { choice1a, choice2a, choice3a, choice4a }); //Assert.AreEqual<string>(s, sa); } }
private string PrintEpsilon(BvSet cond, CharSetSolver slvr) { if (cond == null) { return("E"); } else { return(slvr.PrettyPrint(cond)); } }
public void ChooseUnifromlyTest() { CharSetSolver solver = new CharSetSolver(BitWidth.BV16); BDD set1 = solver.MkRangeConstraint('\0', '\x01', true); BDD set2 = solver.MkRangeConstraint( '\u0FFF', '\u0FFF'); string set2str = solver.PrettyPrint(set2); BDD set3 = solver.MkRangeConstraint( '\u00FF', '\u00FF'); BDD set4 = solver.MkRangeConstraint( '\u000F', '\u000F'); BDD set = solver.MkOr(new BDD[]{set2, set3, set4, set1}); string setstr = solver.PrettyPrint(set); set.ToDot(@"foo.dot"); var map = new Dictionary<char, int>(); map['\0'] = 0; map['\x01'] = 0; map['\u0FFF'] = 0; map['\u00FF'] = 0; map['\u000F'] = 0; for (int i = 0; i < 50000; i++) { var c = solver.ChooseUniformly(set); map[c] += 1; } foreach (var kv in map) Assert.IsTrue(kv.Value > 9700); }
private string PrintEpsilon(BvSet cond, CharSetSolver slvr) { if (cond == null) { return "E"; } else return slvr.PrettyPrint(cond); }
private Automaton<BvSet> BuildAutomaton(Graph<int> graph, Dictionary<Tuple<int, int>, string> edgeLabels, List<int> initialStates, List<int> finalStates, Implementation ytypeChecked, int yTypeCheckCurrentPhaseNum) { List<int[]> transitions = new List<int[]>(); foreach (Tuple<int, int> e in graph.Edges) { if (edgeLabels[e] == "3") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 51; // ASCII 3 transition[2] = 51; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "1") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 49; // ASCII 1 transition[2] = 49; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "7") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 55; // ASCII 7 transition[2] = 55; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "5") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 53; // ASCII 5 transition[2] = 53; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "9") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 57; // ASCII 9 transition[2] = 57; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "A") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 65; // ASCII A transition[2] = 65; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "D") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 68; // ASCII D transition[2] = 68; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "4") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 52; // ASCII 4 transition[2] = 52; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "2") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 50; // ASCII 2 transition[2] = 50; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "8") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 56; // ASCII 8 transition[2] = 56; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "6") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 54; // ASCII 6 transition[2] = 54; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "C") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 67; // ASCII C transition[2] = 67; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "B") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 66; // ASCII B transition[2] = 66; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "E") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = -1; transition[2] = -1; transition[3] = e.Item2; transitions.Add(transition); } } #if (DEBUG && !DEBUG_DETAIL) Console.Write(" \n Transitions before EPSILONS are added\n "); for (int i = 0; i < transitions.Count; i++) { int[] trans = transitions[i]; Console.Write("\n From : " + trans[0].ToString() + "--- " + trans[1] + " --- " + " to : " + trans[3].ToString()); } #endif #if DEBUG && !DEBUG_DETAIL Console.WriteLine(" ******* Printing initial states\n"); foreach (int inits in initialStates) { Console.WriteLine("initial state is " + inits.ToString()); } #endif // get final states int[] finalSts = ComputeFinalStates(finalStates); #if DEBUG && !DEBUG_DETAIL Console.WriteLine("\n*****Printing Finals states\n"); foreach (int finals in finalSts) { Console.WriteLine(" final state " + finals.ToString()); } #endif int dummyInitial = Math.Abs(Guid.NewGuid().GetHashCode()); foreach (int s in initialStates) { int[] transition = new int[4]; transition[0] = dummyInitial; transition[1] = -1; transition[2] = -1; transition[3] = s; transitions.Add(transition); } #if (DEBUG && !DEBUG_DETAIL) Console.Write(" \n Transitions are\n "); for (int i = 0; i < transitions.Count; i++) { int[] trans = transitions[i]; Console.Write("\n From : " + trans[0].ToString() + "--- " + trans[1] + " --- " + " to : " + trans[3].ToString()); } #endif var solver = new CharSetSolver(BitWidth.BV7); // create Automaton Automaton<BvSet> yieldTypeCheckAutomaton = solver.ReadFromRanges(dummyInitial, finalSts, transitions); #if DEBUG && !DEBUG_DETAIL Console.WriteLine("\n--Implementation Automaton--"); foreach (var move in yieldTypeCheckAutomaton.GetMoves()) { Console.WriteLine("\n "+ move.SourceState.ToString() + " -- " + this.PrintEpsilon(move.Condition,solver)+ " --> " + move.TargetState.ToString() +" \n"); } string implAutomatonGraphName = ytypeChecked.Proc.Name + "phaseNum__" + yTypeCheckCurrentPhaseNum.ToString(); solver.ShowGraph(yieldTypeCheckAutomaton, implAutomatonGraphName+".dmgl"); #endif #if DEBUG && !DEBUG_DETAIL Console.WriteLine("\n--Epsilons Reduced Automaton--"); foreach (var move in epsilonReducedAtutomaton.GetMoves()) { Console.WriteLine("\n "+ move.SourceState.ToString() + " -- " + solver.PrettyPrint(move.Condition)+ " --> " + move.TargetState.ToString() +" \n"); } #endif return yieldTypeCheckAutomaton; }
private Automaton <BvSet> BuildAutomaton(Graph <int> graph, Dictionary <Tuple <int, int>, string> edgeLabels, List <int> initialStates, List <int> finalStates, Implementation ytypeChecked, int yTypeCheckCurrentPhaseNum) { List <int[]> transitions = new List <int[]>(); foreach (Tuple <int, int> e in graph.Edges) { if (edgeLabels[e] == "3") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 51; // ASCII 3 transition[2] = 51; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "1") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 49; // ASCII 1 transition[2] = 49; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "7") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 55; // ASCII 7 transition[2] = 55; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "5") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 53; // ASCII 5 transition[2] = 53; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "9") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 57; // ASCII 9 transition[2] = 57; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "A") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 65; // ASCII A transition[2] = 65; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "D") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 68; // ASCII D transition[2] = 68; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "4") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 52; // ASCII 4 transition[2] = 52; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "2") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 50; // ASCII 2 transition[2] = 50; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "8") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 56; // ASCII 8 transition[2] = 56; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "6") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 54; // ASCII 6 transition[2] = 54; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "C") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 67; // ASCII C transition[2] = 67; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "B") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = 66; // ASCII B transition[2] = 66; transition[3] = e.Item2; transitions.Add(transition); } else if (edgeLabels[e] == "E") { int[] transition = new int[4]; transition[0] = e.Item1; transition[1] = -1; transition[2] = -1; transition[3] = e.Item2; transitions.Add(transition); } } #if (DEBUG && !DEBUG_DETAIL) Console.Write(" \n Transitions before EPSILONS are added\n "); for (int i = 0; i < transitions.Count; i++) { int[] trans = transitions[i]; Console.Write("\n From : " + trans[0].ToString() + "--- " + trans[1] + " --- " + " to : " + trans[3].ToString()); } #endif #if DEBUG && !DEBUG_DETAIL Console.WriteLine(" ******* Printing initial states\n"); foreach (int inits in initialStates) { Console.WriteLine("initial state is " + inits.ToString()); } #endif // get final states int[] finalSts = ComputeFinalStates(finalStates); #if DEBUG && !DEBUG_DETAIL Console.WriteLine("\n*****Printing Finals states\n"); foreach (int finals in finalSts) { Console.WriteLine(" final state " + finals.ToString()); } #endif int dummyInitial = Math.Abs(Guid.NewGuid().GetHashCode()); foreach (int s in initialStates) { int[] transition = new int[4]; transition[0] = dummyInitial; transition[1] = -1; transition[2] = -1; transition[3] = s; transitions.Add(transition); } #if (DEBUG && !DEBUG_DETAIL) Console.Write(" \n Transitions are\n "); for (int i = 0; i < transitions.Count; i++) { int[] trans = transitions[i]; Console.Write("\n From : " + trans[0].ToString() + "--- " + trans[1] + " --- " + " to : " + trans[3].ToString()); } #endif var solver = new CharSetSolver(BitWidth.BV7); // create Automaton Automaton <BvSet> yieldTypeCheckAutomaton = solver.ReadFromRanges(dummyInitial, finalSts, transitions); #if DEBUG && !DEBUG_DETAIL Console.WriteLine("\n--Implementation Automaton--"); foreach (var move in yieldTypeCheckAutomaton.GetMoves()) { Console.WriteLine("\n " + move.SourceState.ToString() + " -- " + this.PrintEpsilon(move.Condition, solver) + " --> " + move.TargetState.ToString() + " \n"); } string implAutomatonGraphName = ytypeChecked.Proc.Name + "phaseNum__" + yTypeCheckCurrentPhaseNum.ToString(); solver.ShowGraph(yieldTypeCheckAutomaton, implAutomatonGraphName + ".dmgl"); #endif #if DEBUG && !DEBUG_DETAIL Console.WriteLine("\n--Epsilons Reduced Automaton--"); foreach (var move in epsilonReducedAtutomaton.GetMoves()) { Console.WriteLine("\n " + move.SourceState.ToString() + " -- " + solver.PrettyPrint(move.Condition) + " --> " + move.TargetState.ToString() + " \n"); } #endif return(yieldTypeCheckAutomaton); }