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)