private static void ReadStateTransition(XmlReader reader, DfaState state, Dictionary <int, DfaState> states) { reader.MoveToElement(); if (reader.IsEmptyElement) { reader.Read(); } else { reader.ReadStartElement("Transitions"); reader.MoveToElement(); while (reader.IsStartElement("Transition")) { int character = Convert.ToInt32(reader.GetAttribute("char")); int nextIndex = Convert.ToInt32(reader.GetAttribute("stateId")); state.AddTransition((byte)character, GetOrCreateState(states, nextIndex)); reader.Read(); reader.MoveToElement(); } reader.ReadEndElement(); } }
public static State Substract(State nfa1, State nfa2) { nfa1.FindEnd().AddMark(Marks.Service1); nfa2.FindEnd().AddMark(Marks.Service2); int count; var dfa1 = nfa1.ToDfa3(out count, false); var dfa2 = nfa2.ToDfa3(out count, false); dfa1.Minimize(false); dfa2.Minimize(false); var error = new DfaState(new[] { new State().Id, }); for (int i = 0; i <= 255; i++) error.AddTransition((byte)i, error); dfa2.ForEachNR((state) => { if (state != error) { for (int i = 0; i <= 255; i++) { byte key = (byte)i; if (state.Transition[i] == null) state.AddTransition(key, error); } } }); var nfa3 = DfaIntersect.Intersect(dfa1, dfa2).ToNfa2(); var ends = new List<State>(); nfa3.ForEach((state) => { bool s1 = false, s2 = false; state.RemoveAllMarks((mark) => { if (mark.Mark == Marks.Service1) s1 = true; if (mark.Mark == Marks.Service2) s2 = true; return mark.Mark == Marks.Service1 || mark.Mark == Marks.Service2; }); if (s1 == true && s2 == false) ends.Add(state); }); var end = new State(); foreach (var item in ends) item.Transition.Add(Epsilon, end); return nfa3; }
private static void ReadStateTransition(XmlReader reader, DfaState state, Dictionary<int, DfaState> states) { reader.MoveToElement(); if (reader.IsEmptyElement) { reader.Read(); } else { reader.ReadStartElement("Transitions"); reader.MoveToElement(); while (reader.IsStartElement("Transition")) { int character = Convert.ToInt32(reader.GetAttribute("char")); int nextIndex = Convert.ToInt32(reader.GetAttribute("stateId")); state.AddTransition((byte)character, GetOrCreateState(states, nextIndex)); reader.Read(); reader.MoveToElement(); } reader.ReadEndElement(); } }
private static void ToDfaThread(Object stateInfo) { var p = stateInfo as ThreadParams; int i = 0; int time = Environment.TickCount; var allChars = new bool[byte.MaxValue + 1]; long memStart = 0; if (p.Main) { GC.Collect(); GC.WaitForFullGCComplete(); GC.WaitForPendingFinalizers(); memStart = GC.GetTotalMemory(true); } else { Thread.Sleep(20000); } int memPerState = 0; for (; ; i++) { DfaState t = null; lock (p.NotMarkedSync) { if (p.NotMarkedStates.Count <= 0) { break; } t = p.NotMarkedStates.Dequeue(); } if (p.ShowProgress && (i % 100) == 0) { if ((i % 25000) == 0 && i > 0) { memPerState = (int)((GC.GetTotalMemory(true) - memStart) / (long)p.DfaStates.Count); } int time1 = Environment.TickCount; Console.Write("{2}\t({3} ms)\t\t{0} ({4} b)\t\t{1} ", p.DfaStates.Count, p.NotMarkedStates.Count, p.DfaStates.Count - p.NotMarkedStates.Count, time1 - time, memPerState); Console.Write("\r"); time = time1; } if (t != null) { for (int j = 0; j <= byte.MaxValue; j++) { allChars[j] = false; } foreach (var nfaState in t.NfaStates) { nfaState.Transition.ForEachNotNullKeys((nb) => { allChars[(int)nb] = true; }); } for (int j = 0; j <= byte.MaxValue; j++) { if (allChars[j]) { byte char1 = (byte)j; var uUnique = t.NfaStates.GetSortedMoveEclosureIds(char1); DfaState u; lock (p.DfaStatesSync) { if (p.DfaStates.TryGetValue(uUnique, out u) == false) { u = new DfaState(uUnique); p.DfaStates.Add(uUnique, u); lock (p.NotMarkedSync) p.NotMarkedStates.Enqueue(u); } } t.AddTransition(char1, u); } } if (p.Main) { if (i % 10000 == 0) { GC.Collect(); GC.WaitForFullGCComplete(); GC.WaitForPendingFinalizers(); } } } } }
public static DfaState ToDfa2(this State start, out int dfaCount, bool showProgress) { DfaState dfaStart; if (showProgress) { Console.WriteLine("NFA to DFA v.2 Converting..."); Console.WriteLine("{0}", DateTime.Now); } var dfaStates = new Dictionary <int[], DfaState>(3000000, new IntArrayComparer()); var notMarkedStates = new Queue <DfaState>(500000); dfaStart = new DfaState(DfaState.GetNfaIds(start.Eclosure())); dfaStates.Add(dfaStart.NfaIds, dfaStart); notMarkedStates.Enqueue(dfaStart); int i = 0; int time = Environment.TickCount; var allChars = new bool[byte.MaxValue + 1]; GC.Collect(); long memStart = GC.GetTotalMemory(true); while (notMarkedStates.Count > 0) { DfaState t = notMarkedStates.Dequeue(); if (showProgress && i++ % 100 == 0) { int memPerState = (int)((GC.GetTotalMemory(true) - memStart) / (long)dfaStates.Count); int time1 = Environment.TickCount; Console.Write("{2}\t({3} ms)\t\t{0} ({4} b)\t\t{1}\t\t", dfaStates.Count, notMarkedStates.Count, dfaStates.Count - notMarkedStates.Count, time1 - time, memPerState); Console.Write("\r"); time = time1; } if (t != null) { for (int j = 0; j <= byte.MaxValue; j++) { allChars[j] = false; } foreach (var nfaState in t.NfaStates) { nfaState.Transition.ForEachNotNullKeys((nb) => { allChars[(int)nb] = true; }); } for (int j = 0; j <= byte.MaxValue; j++) { if (allChars[j]) { byte char1 = (byte)j; var states = t.NfaStates.GetMove2(char1).GetEclosure(); var uUnique = DfaState.GetNfaIds(states); DfaState u; if (dfaStates.TryGetValue(uUnique, out u) == false) { u = new DfaState(uUnique); dfaStates.Add(uUnique, u); notMarkedStates.Enqueue(u); } t.AddTransition(char1, u); } } if (i % 1000 == 0) { GC.Collect(); GC.WaitForFullGCComplete(); GC.WaitForPendingFinalizers(); } } } dfaCount = dfaStates.Count; if (showProgress) { Console.WriteLine("Done ({0})\t\t\t\t\t\t\t\t", dfaCount); } return(dfaStart); }
public static State Substract(State nfa1, State nfa2) { nfa1.FindEnd().AddMark(Marks.Service1); nfa2.FindEnd().AddMark(Marks.Service2); int count; var dfa1 = nfa1.ToDfa3(out count, false); var dfa2 = nfa2.ToDfa3(out count, false); dfa1.Minimize(false); dfa2.Minimize(false); var error = new DfaState(new[] { new State().Id, }); for (int i = 0; i <= 255; i++) { error.AddTransition((byte)i, error); } dfa2.ForEachNR((state) => { if (state != error) { for (int i = 0; i <= 255; i++) { byte key = (byte)i; if (state.Transition[i] == null) { state.AddTransition(key, error); } } } }); var nfa3 = DfaIntersect.Intersect(dfa1, dfa2).ToNfa2(); var ends = new List <State>(); nfa3.ForEach((state) => { bool s1 = false, s2 = false; state.RemoveAllMarks((mark) => { if (mark.Mark == Marks.Service1) { s1 = true; } if (mark.Mark == Marks.Service2) { s2 = true; } return(mark.Mark == Marks.Service1 || mark.Mark == Marks.Service2); }); if (s1 == true && s2 == false) { ends.Add(state); } }); var end = new State(); foreach (var item in ends) { item.Transition.Add(Epsilon, end); } return(nfa3); }