public static IEnumerable <Regexp> SynthesizeRegexp(HashSet <char> alphabet, Automaton <BDD> dfa, CharSetSolver s, StringBuilder sb, long timeout) { using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"..\..\..\regexpenum.txt")) { solver = s; numStates = dfa.StateCount; alph = alphabet; #region test variables StringBuilder sb1 = new StringBuilder(); int lim = 0; Stopwatch membershipTimer = new Stopwatch(); Stopwatch equivTimer = new Stopwatch(); timer = new Stopwatch(); timer.Start(); #endregion #region TestSets for equiv var mytests = DFAUtilities.MyHillTestGeneration(alphabet, dfa, solver); var posMN = mytests.First; var negMN = mytests.Second; var tests = DFAUtilities.GetTestSets(dfa, alphabet, solver); var positive = tests.First; var negative = tests.Second; foreach (var t in posMN) { positive.Remove(t); } foreach (var t in negMN) { negative.Remove(t); } #endregion #region Sigma Star bool fst = true; foreach (var c in alph) { if (fst) { fst = false; sigmaStar = new RELabel(c); } else { sigmaStar = new REUnion(sigmaStar, new RELabel(c)); } } sigmaPlus = new REPlus(sigmaStar); sigmaStar = new REStar(sigmaStar); #endregion #region Accessories vars maxWidthC = 0; maxSigmaStarC = 0; var isSubset = true; HashSet <string> visited = new HashSet <string>(); HashSet <string> newReg = new HashSet <string>(); currUnionEls = new Dictionary <string, Automaton <BDD> >(); memoDfa = new Dictionary <string, Automaton <BDD> >(); List <Regexp> subsetReg = new List <Regexp>(); #endregion for (maxWidth = 1; true; maxWidth++) { newReg = new HashSet <string>(); maxSigmaStar = 2; foreach (var regexp in EnumerateRegexp()) { #region run for at most timeout if (timer.ElapsedMilliseconds > timeout) { sb.AppendLine("| Timeout"); timer.Stop(); yield break; } #endregion var re = regexp.Normalize(); if (!(visited.Contains(re.ToString()))) { visited.Add(re.ToString()); sb1 = new StringBuilder(); sb1.Append(re.ToString()); file.WriteLine(sb1); lim++; #region Membership test membershipTimer.Start(); isSubset = CorrectOnNegSet(regexp, negMN); membershipTimer.Stop(); #endregion #region equivalence check if (isSubset) { membershipTimer.Start(); if (CorrectOnNegSet(regexp, negative)) { if (CorrectOnPosSet(regexp, posMN) && CorrectOnPosSet(regexp, positive)) { membershipTimer.Stop(); equivTimer.Start(); var rDfa = getDfa(regexp); memoDfa[regexp.ToString()] = rDfa; if (rDfa.IsEquivalentWith(dfa, solver)) { isSubset = false; equivTimer.Stop(); timer.Stop(); sb.Append("| "); regexp.ToString(sb); sb.AppendLine("|"); sb.AppendLine(string.Format("| elapsed time: \t {0} ms", timer.ElapsedMilliseconds)); sb.AppendLine(string.Format("| equivalence cost:\t {0} ms", equivTimer.ElapsedMilliseconds)); sb.AppendLine(string.Format("| membership cost: \t {0} ms", membershipTimer.ElapsedMilliseconds)); sb.AppendLine(string.Format("| attempts: \t {0}", lim)); yield return(regexp); } else { Console.WriteLine("used dfa"); equivTimer.Stop(); } } else { membershipTimer.Stop(); } } else { membershipTimer.Stop(); isSubset = false; } } #endregion //#region Subsets //if (isSubset) //{ // foreach (var reg1 in subsetReg) // { // var union = (reg1.CompareTo(regexp) > 0) ? (new REUnion(reg1, regexp)) : (new REUnion(regexp, reg1)); // visited.Add(union.ToString()); // sb1 = new StringBuilder(); // sb1.Append(union + " From union"); // file.WriteLine(sb1); // lim++; // membershipTimer.Start(); // if (CorrectOnPosSet(union, posMN) && CorrectOnPosSet(union, positive)) // { // membershipTimer.Stop(); // equivTimer.Start(); // var rDfa = getDfa(union); // memoDfa[union.ToString()] = rDfa; // if (rDfa.IsEquivalentWith(dfa, solver)) // { // equivTimer.Stop(); // timer.Stop(); // sb.Append("| "); // union.ToString(sb); // sb.AppendLine("|"); // sb.AppendLine(string.Format("| elapsed time: \t {0} ms", timer.ElapsedMilliseconds)); // sb.AppendLine(string.Format("| equivalence cost:\t {0} ms", equivTimer.ElapsedMilliseconds)); // sb.AppendLine(string.Format("| membership cost: \t {0} ms", membershipTimer.ElapsedMilliseconds)); // sb.AppendLine(string.Format("| attempts: \t {0}", lim)); // yield return union; // } // else // { // Console.WriteLine("used dfa"); // equivTimer.Stop(); // } // } // else // { // membershipTimer.Stop(); // } // } // subsetReg.Add(regexp); //} //#endregion } } visited = new HashSet <string>(visited.Union(newReg)); } } }