Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/15/11 13:34:38 (13 years ago)
Author:
mkommend
Message:

#1418: Finally added results from the grammar refactoring.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/DataAnalysis Refactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/ArchitectureManipulators/GrammarModifier.cs

    r5499 r5686  
    2121
    2222using System.Collections.Generic;
     23using System.Linq;
    2324
    2425namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
    2526  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);
    2829      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);
    3331
     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      }
    3443
    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        }
    4258      }
    4359    }
    4460
    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            }
    5676          }
    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        }
    6478      }
    6579    }
    66 
    6780  }
    6881}
Note: See TracChangeset for help on using the changeset viewer.