Changeset 5686 for branches/DataAnalysis Refactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/ArchitectureManipulators/GrammarModifier.cs
- Timestamp:
- 03/15/11 13:34:38 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/DataAnalysis Refactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/ArchitectureManipulators/GrammarModifier.cs
r5499 r5686 21 21 22 22 using System.Collections.Generic; 23 using System.Linq; 23 24 24 25 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding { 25 26 public static class GrammarModifier { 26 public static void AddDynamicSymbol(ISymbolicExpressionTreeGrammar grammar, ISymbol classRepresentative, string symbolName, int nArgs) {27 var invokeSym = new InvokeFunction( symbolName);27 internal static void AddInvokeSymbol(ISymbolicExpressionTreeGrammar grammar, string functionName, int nArgs, CutPoint startCutPoint, IEnumerable<CutPoint> argumentCutPoints) { 28 var invokeSym = new InvokeFunction(functionName); 28 29 grammar.AddSymbol(invokeSym); 29 grammar.SetMinSubtreeCount(invokeSym, nArgs); 30 grammar.SetMaxSubtreeCount(invokeSym, nArgs); 31 SetSyntaxConstraints(grammar, classRepresentative, invokeSym); 32 } 30 grammar.SetSubtreeCount(invokeSym, nArgs, nArgs); 33 31 32 //allow invoke symbol everywhere, where the child of the startCutPoint was allowed 33 foreach (ISymbol parent in grammar.Symbols) { 34 if (grammar.IsAllowedChildSymbol(parent, startCutPoint.Child.Symbol)) 35 grammar.AddAllowedChildSymbol(parent, invokeSym); 36 else { 37 for (int i = 0; i < grammar.GetMaximumSubtreeCount(parent); i++) { 38 if (grammar.IsAllowedChildSymbol(parent, startCutPoint.Child.Symbol, i)) 39 grammar.AddAllowedChildSymbol(parent, invokeSym, i); 40 } 41 } 42 } 34 43 35 public static void AddDynamicArguments(ISymbolicExpressionTreeGrammar grammar, ISymbol classRepresentative, IEnumerable<int> argumentIndexes) { 36 foreach (int argIndex in argumentIndexes) { 37 var argSymbol = new Argument(argIndex); 38 grammar.AddSymbol(argSymbol); 39 grammar.SetMinSubtreeCount(argSymbol, 0); 40 grammar.SetMaxSubtreeCount(argSymbol, 0); 41 SetSyntaxConstraints(grammar, classRepresentative, argSymbol); 44 if (nArgs > 0) { 45 //set allowed child symbols of invoke symbol 46 foreach (ISymbol child in grammar.Symbols) { 47 if (argumentCutPoints.All(x => grammar.IsAllowedChildSymbol(x.Parent.Symbol, child))) 48 grammar.AddAllowedChildSymbol(invokeSym, child); 49 else { 50 int i = 0; 51 foreach (CutPoint argumentCutPoint in argumentCutPoints) { 52 if (grammar.IsAllowedChildSymbol(argumentCutPoint.Parent.Symbol, child, argumentCutPoint.ChildIndex)) 53 grammar.AddAllowedChildSymbol(invokeSym, child, i); 54 i++; 55 } 56 } 57 } 42 58 } 43 59 } 44 60 45 private static void SetSyntaxConstraints(ISymbolicExpressionTreeGrammar grammar, ISymbol classRepresentative, Symbol newSymbol) { 46 // allow symbol as child of the representative first to make sure that the symbol 47 // is in the list of parents and children 48 for (int i = 0; i < grammar.GetMaxSubtreeCount(classRepresentative); i++) { 49 grammar.SetAllowedChild(classRepresentative, newSymbol, i); 50 } 51 // for all available symbols add the new symbol as allowed child iff the available symbol is an allowed child of the class representative 52 foreach (var parent in grammar.Symbols) { 53 if (grammar.IsAllowedChild(classRepresentative, parent, 0)) 54 for (int arg = 0; arg < grammar.GetMaxSubtreeCount(parent); arg++) { 55 grammar.SetAllowedChild(parent, newSymbol, arg); 61 internal static void AddArgumentSymbol(ISymbolicExpressionTreeGrammar originalGrammar, ISymbolicExpressionTreeGrammar grammar, IEnumerable<int> argumentIndexes, IEnumerable<CutPoint> argumentCutPoints) { 62 foreach (var pair in argumentIndexes.Zip(argumentCutPoints, (a, b) => new { Index = a, CutPoint = b })) { 63 var argSymbol = new Argument(pair.Index); 64 grammar.AddSymbol(argSymbol); 65 grammar.SetSubtreeCount(argSymbol, 0, 0); 66 67 foreach (ISymbol parent in originalGrammar.Symbols) { 68 if (parent is StartSymbol || parent is ProgramRootSymbol) continue; 69 if (originalGrammar.IsAllowedChildSymbol(parent, pair.CutPoint.Child.Symbol)) 70 grammar.AddAllowedChildSymbol(parent, argSymbol); 71 else { 72 for (int i = 0; i < originalGrammar.GetMaximumSubtreeCount(parent); i++) { 73 if (originalGrammar.IsAllowedChildSymbol(parent, pair.CutPoint.Child.Symbol, i)) 74 grammar.AddAllowedChildSymbol(parent, argSymbol, i); 75 } 56 76 } 57 } 58 // for all available symbols add the new symbol as allowed parent iff the available symbol is an allowed child of the class representative 59 foreach (var child in grammar.Symbols) { 60 if (grammar.IsAllowedChild(classRepresentative, child, 0)) 61 for (int arg = 0; arg < grammar.GetMaxSubtreeCount(newSymbol); arg++) { 62 grammar.SetAllowedChild(newSymbol, child, arg); 63 } 77 } 64 78 } 65 79 } 66 67 80 } 68 81 }
Note: See TracChangeset
for help on using the changeset viewer.