Пример #1
0
        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();
            }
        }
Пример #2
0
		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;
		}
Пример #3
0
		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();
			}
		}
Пример #4
0
        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();
                        }
                    }
                }
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }