Changeset 6409 for branches/GP.Grammar.Editor/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionGrammarBase.cs
- Timestamp:
- 06/14/11 10:57:27 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/GP.Grammar.Editor/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionGrammarBase.cs
r6403 r6409 131 131 #region protected grammar manipulation methods 132 132 protected void AddSymbol(ISymbol symbol) { 133 AddSymbolToDictionaries(symbol); 134 var groupSymbol = symbol as GroupSymbol; 135 if (groupSymbol != null) { 136 foreach (ISymbol s in groupSymbol.Flatten()) 137 AddSymbolToDictionaries(s); 138 } 133 foreach (ISymbol s in symbol.Flatten()) 134 AddSymbolToDictionaries(s); 139 135 140 136 ClearCaches(); … … 148 144 149 145 protected void RemoveSymbol(ISymbol symbol) { 150 RemoveSymbolFromDictionaries(symbol); 151 var groupSymbol = symbol as GroupSymbol; 152 if (groupSymbol != null) { 153 foreach (ISymbol s in groupSymbol.Flatten()) 154 RemoveSymbolFromDictionaries(s); 155 } 146 foreach (ISymbol s in symbol.Flatten()) 147 RemoveSymbolFromDictionaries(s); 156 148 157 149 foreach (GroupSymbol group in symbols.Values.OfType<GroupSymbol>()) … … 188 180 189 181 protected void AddAllowedChildSymbol(ISymbol parent, ISymbol child) { 190 List<ISymbol> parents;191 List<ISymbol> childs;192 182 bool changed = false; 193 183 194 var parentGroup = parent as GroupSymbol; 195 if (parentGroup != null) parents = parentGroup.Flatten().Where(p => !(p is GroupSymbol)).ToList(); 196 else parents = new List<ISymbol>() { parent }; 197 var childGroup = child as GroupSymbol; 198 if (childGroup != null) childs = childGroup.Flatten().Where(c => !(c is GroupSymbol)).ToList(); 199 else childs = new List<ISymbol>() { child }; 200 201 foreach (ISymbol p in parents) { 202 foreach (ISymbol c in childs) { 203 changed |= AddAllowedChildSymbolToDictionaries(p, c); 204 } 205 } 184 foreach (ISymbol p in parent.Flatten().Where(p => !(p is GroupSymbol))) 185 changed |= AddAllowedChildSymbolToDictionaries(p, child); 206 186 207 187 if (changed) { … … 229 209 230 210 protected void AddAllowedChildSymbol(ISymbol parent, ISymbol child, int argumentIndex) { 231 List<ISymbol> parents;232 List<ISymbol> childs;233 211 bool changed = false; 234 212 235 var parentGroup = parent as GroupSymbol; 236 if (parentGroup != null) parents = parentGroup.Flatten().Where(p => !(p is GroupSymbol)).ToList(); 237 else parents = new List<ISymbol>() { parent }; 238 var childGroup = child as GroupSymbol; 239 if (childGroup != null) childs = childGroup.Flatten().Where(c => !(c is GroupSymbol)).ToList(); 240 else childs = new List<ISymbol>() { child }; 241 242 foreach (ISymbol p in parents) { 243 foreach (ISymbol c in childs) { 244 changed |= AddAllowedChildSymbolToDictionaries(p, c, argumentIndex); 245 } 246 } 213 foreach (ISymbol p in parent.Flatten().Where(p => !(p is GroupSymbol))) 214 changed |= AddAllowedChildSymbolToDictionaries(p, child, argumentIndex); 247 215 248 216 if (changed) { … … 255 223 private bool AddAllowedChildSymbolToDictionaries(ISymbol parent, ISymbol child, int argumentIndex) { 256 224 List<string> childSymbols; 257 if (allowedChildSymbols.TryGetValue(parent.Name, out childSymbols)) 258 if (childSymbols.Contains(child.Name)) return false; 225 if (!allowedChildSymbols.TryGetValue(parent.Name, out childSymbols)) { 226 childSymbols = new List<string>(); 227 allowedChildSymbols.Add(parent.Name, childSymbols); 228 } 229 if (childSymbols.Contains(child.Name)) return false; 230 259 231 260 232 var key = Tuple.Create(parent.Name, argumentIndex); … … 263 235 allowedChildSymbolsPerIndex.Add(key, childSymbols); 264 236 } 237 265 238 if (childSymbols.Contains(child.Name)) return false; 266 239 … … 314 287 315 288 protected void SetSubtreeCount(ISymbol symbol, int minimumSubtreeCount, int maximumSubtreeCount) { 316 var groupSymbol = symbol as GroupSymbol; 317 if (groupSymbol != null) { 318 var symbols = groupSymbol.Flatten().Where(s => !(s is GroupSymbol)); 319 if (symbols.Any(s => s.MinimumArity > minimumSubtreeCount)) throw new ArgumentException("Invalid minimum subtree count " + minimumSubtreeCount + " for " + symbol); 320 if (symbols.Any(s => s.MaximumArity < maximumSubtreeCount)) throw new ArgumentException("Invalid minimum subtree count " + minimumSubtreeCount + " for " + symbol); 321 foreach (ISymbol s in symbols) 322 SetSubTreeCountInDictionaries(s, minimumSubtreeCount, maximumSubtreeCount); 323 } else { 324 if (symbol.MinimumArity > minimumSubtreeCount) throw new ArgumentException("Invalid minimum subtree count " + minimumSubtreeCount + " for " + symbol); 325 if (symbol.MaximumArity < maximumSubtreeCount) throw new ArgumentException("Invalid minimum subtree count " + minimumSubtreeCount + " for " + symbol); 326 SetSubTreeCountInDictionaries(symbol, minimumSubtreeCount, maximumSubtreeCount); 327 } 289 var symbols = symbol.Flatten().Where(s => !(s is GroupSymbol)); 290 if (symbols.Any(s => s.MinimumArity > minimumSubtreeCount)) throw new ArgumentException("Invalid minimum subtree count " + minimumSubtreeCount + " for " + symbol); 291 if (symbols.Any(s => s.MaximumArity < maximumSubtreeCount)) throw new ArgumentException("Invalid minimum subtree count " + minimumSubtreeCount + " for " + symbol); 292 293 foreach (ISymbol s in symbols) 294 SetSubTreeCountInDictionaries(s, minimumSubtreeCount, maximumSubtreeCount); 328 295 329 296 ClearCaches(); … … 355 322 356 323 List<string> temp; 357 if (allowedChildSymbols.TryGetValue(parent.Name, out temp)) 358 return temp.Contains(child.Name); 324 if (allowedChildSymbols.TryGetValue(parent.Name, out temp)) { 325 if (temp.Contains(child.Name)) return true; 326 if (temp.SelectMany(s => GetSymbol(s).Flatten().Select(n => n.Name)).Contains(child.Name)) return true; 327 } 359 328 return false; 360 329 } … … 362 331 public virtual bool IsAllowedChildSymbol(ISymbol parent, ISymbol child, int argumentIndex) { 363 332 if (!child.Enabled) return false; 333 if (IsAllowedChildSymbol(parent, child)) return true; 364 334 365 335 List<string> temp; 366 if (allowedChildSymbols.TryGetValue(parent.Name, out temp)) 336 var key = Tuple.Create(parent.Name, argumentIndex); 337 if (allowedChildSymbolsPerIndex.TryGetValue(key, out temp)) { 367 338 if (temp.Contains(child.Name)) return true; 368 369 var key = Tuple.Create(parent.Name, argumentIndex); 370 if (allowedChildSymbolsPerIndex.TryGetValue(key, out temp)) 371 return temp.Contains(child.Name); 339 if (temp.SelectMany(s => GetSymbol(s).Flatten().Select(n => n.Name)).Contains(child.Name)) return true; 340 } 372 341 return false; 373 342 } … … 375 344 public virtual IEnumerable<ISymbol> GetAllowedChildSymbols(ISymbol parent) { 376 345 List<string> childs; 377 if (allowedChildSymbols.TryGetValue(parent.Name, out childs)) 378 return childs.Select(s => GetSymbol(s)).Where(s => s.Enabled); 379 return Enumerable.Empty<ISymbol>(); 346 if (!allowedChildSymbols.TryGetValue(parent.Name, out childs)) 347 return Enumerable.Empty<ISymbol>(); 348 349 return childs.Select(x => GetSymbol(x)).Where(s => s.Enabled); 380 350 } 381 351 … … 452 422 } 453 423 454 455 424 #region events 456 425 private void RegisterSymbolEvents(ISymbol symbol) {
Note: See TracChangeset
for help on using the changeset viewer.