Mercurial > pub > ImplabNet
comparison Implab/Automaton/DFATable.cs @ 183:4f82e0f161c3 ref20160224
fixed DFA optimization, JSON is fully functional
author | cin |
---|---|
date | Fri, 25 Mar 2016 02:49:02 +0300 |
parents | 76e8f2ba12b8 |
children | 5f7a3e1d32b9 |
comparison
equal
deleted
inserted
replaced
182:76e8f2ba12b8 | 183:4f82e0f161c3 |
---|---|
139 /// на два подмножества - конечные состояния и все остальные, после чего эти подмножества | 139 /// на два подмножества - конечные состояния и все остальные, после чего эти подмножества |
140 /// будут резделены на более мелкие. Иногда требуется гарантировать различия конечных сосотяний, | 140 /// будут резделены на более мелкие. Иногда требуется гарантировать различия конечных сосотяний, |
141 /// для этого необходимо переопределить даннцю фукнцию, для получения множеств конечных состояний. | 141 /// для этого необходимо переопределить даннцю фукнцию, для получения множеств конечных состояний. |
142 /// </remarks> | 142 /// </remarks> |
143 /// <returns>The final states.</returns> | 143 /// <returns>The final states.</returns> |
144 protected virtual IEnumerable<HashSet<int>> GroupFinalStates() { | 144 protected virtual IEnumerable<HashSet<int>> SplitFinalStates(IEnumerable<int> states) { |
145 return new HashSet<int>[] { m_finalStates }; | 145 return new [] { new HashSet<int>(states) }; |
146 } | 146 } |
147 | 147 |
148 protected void Optimize( | 148 protected void Optimize( |
149 IDFATableBuilder optimalDFA, | 149 IDFATableBuilder optimalDFA, |
150 IDictionary<int,int> alphabetMap, | 150 IDictionary<int,int> alphabetMap, |
161 ); | 161 ); |
162 | 162 |
163 var optimalStates = new HashSet<HashSet<int>>(setComparer); | 163 var optimalStates = new HashSet<HashSet<int>>(setComparer); |
164 var queue = new HashSet<HashSet<int>>(setComparer); | 164 var queue = new HashSet<HashSet<int>>(setComparer); |
165 | 165 |
166 // получаем конечные состояния, сгруппированные по маркерам | 166 optimalStates.Add(new HashSet<int>(FinalStates)); |
167 optimalStates.UnionWith( | |
168 GroupFinalStates() | |
169 ); | |
170 | 167 |
171 var state = new HashSet<int>( | 168 var state = new HashSet<int>( |
172 Enumerable | 169 Enumerable |
173 .Range(0, m_stateCount) | 170 .Range(0, m_stateCount) |
174 .Where(i => !m_finalStates.Contains(i)) | 171 .Where(i => !m_finalStates.Contains(i)) |
188 var stateA = queue.First(); | 185 var stateA = queue.First(); |
189 queue.Remove(stateA); | 186 queue.Remove(stateA); |
190 | 187 |
191 for (int c = 0; c < m_symbolCount; c++) { | 188 for (int c = 0; c < m_symbolCount; c++) { |
192 var stateX = new HashSet<int>(); | 189 var stateX = new HashSet<int>(); |
193 //foreach(var a in stateA.Where(rmap.ContainsKey)) | 190 foreach(var a in stateA.Where(rmap.ContainsKey)) |
194 // stateX.UnionWith(rmap[a][c]); // all states from wich the symbol 'c' leads to the state 'a' | 191 stateX.UnionWith(rmap[a][c]); // all states from wich the symbol 'c' leads to the state 'a' |
195 | |
196 stateX.UnionWith(m_transitions.Where(t => stateA.Contains(t.s2) && t.edge == c).Select(t => t.s1)); | |
197 | 192 |
198 var tmp = optimalStates.ToArray(); | 193 var tmp = optimalStates.ToArray(); |
199 foreach (var stateY in tmp) { | 194 foreach (var stateY in tmp) { |
200 if (stateX.Overlaps(stateY) && !stateY.IsSubsetOf(stateX)) { | 195 var stateR1 = new HashSet<int>(stateY); |
201 var stateR1 = new HashSet<int>(stateY); | 196 var stateR2 = new HashSet<int>(stateY); |
202 var stateR2 = new HashSet<int>(stateY); | 197 |
203 | 198 stateR1.IntersectWith(stateX); |
204 stateR1.IntersectWith(stateX); | 199 stateR2.ExceptWith(stateX); |
205 stateR2.ExceptWith(stateX); | 200 |
201 if (stateR1.Count > 0 && stateR2.Count > 0) { | |
202 | |
206 | 203 |
207 optimalStates.Remove(stateY); | 204 optimalStates.Remove(stateY); |
208 optimalStates.Add(stateR1); | 205 optimalStates.Add(stateR1); |
209 optimalStates.Add(stateR2); | 206 optimalStates.Add(stateR2); |
210 | 207 |
218 } | 215 } |
219 } | 216 } |
220 } | 217 } |
221 } | 218 } |
222 | 219 |
220 // дополнительно разбиваем конечные состояния | |
221 foreach (var final in optimalStates.Where(s => s.Overlaps(m_finalStates)).ToArray()) { | |
222 optimalStates.Remove(final); | |
223 foreach (var split in SplitFinalStates(final)) | |
224 optimalStates.Add(split); | |
225 } | |
226 | |
227 | |
223 // карта получения оптимального состояния по соотвествующему ему простому состоянию | 228 // карта получения оптимального состояния по соотвествующему ему простому состоянию |
224 var nextState = 0; | 229 var nextState = 0; |
225 foreach (var item in optimalStates) { | 230 foreach (var item in optimalStates) { |
226 var id = nextState++; | 231 var id = nextState++; |
227 foreach (var s in item) | 232 foreach (var s in item) |