Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/22/11 15:07:20 (13 years ago)
Author:
mkommend
Message:

#1418: Corrected ADFs and adapted unit tests.

File:
1 edited

Legend:

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

    r5686 r5792  
    2626  public static class GrammarModifier {
    2727    internal static void AddInvokeSymbol(ISymbolicExpressionTreeGrammar grammar, string functionName, int nArgs, CutPoint startCutPoint, IEnumerable<CutPoint> argumentCutPoints) {
     28      if (!grammar.ContainsSymbol(startCutPoint.Child.Symbol)) return;
     29
    2830      var invokeSym = new InvokeFunction(functionName);
    2931      grammar.AddSymbol(invokeSym);
     
    3133
    3234      //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       }
     35      SetAllowedParentSymbols(grammar, startCutPoint.Child.Symbol, invokeSym);
    4336
    4437      if (nArgs > 0) {
    4538        //set allowed child symbols of invoke symbol
    4639        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             }
     40          int i = 0;
     41          foreach (CutPoint argumentCutPoint in argumentCutPoints) {
     42            if (grammar.IsAllowedChildSymbol(argumentCutPoint.Parent.Symbol, child, argumentCutPoint.ChildIndex))
     43              grammar.AddAllowedChildSymbol(invokeSym, child, i);
     44            i++;
    5645          }
    5746        }
    5847      }
    5948    }
     49
     50
    6051
    6152    internal static void AddArgumentSymbol(ISymbolicExpressionTreeGrammar originalGrammar, ISymbolicExpressionTreeGrammar grammar, IEnumerable<int> argumentIndexes, IEnumerable<CutPoint> argumentCutPoints) {
     
    6556        grammar.SetSubtreeCount(argSymbol, 0, 0);
    6657
    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);
     58        foreach (var symb in grammar.Symbols) {
     59          if (symb is ProgramRootSymbol || symb is StartSymbol) continue;
     60          if (originalGrammar.IsAllowedChildSymbol(symb, pair.CutPoint.Child.Symbol))
     61            grammar.AddAllowedChildSymbol(symb, argSymbol);
    7162          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);
     63            for (int i = 0; i < grammar.GetMaximumSubtreeCount(symb); i++) {
     64              if (originalGrammar.IsAllowedChildSymbol(symb, pair.CutPoint.Child.Symbol, i))
     65                grammar.AddAllowedChildSymbol(symb, argSymbol, i);
    7566            }
     67          }
     68        }
     69      }
     70    }
     71
     72    internal static void SetAllowedParentSymbols(ISymbolicExpressionTreeGrammar grammar, ISymbol symbol, ISymbol newSymbol) {
     73      foreach (var symb in grammar.Symbols) {
     74        if (symb is ProgramRootSymbol) continue;
     75        if (newSymbol is Argument && symb is StartSymbol) continue;
     76        if (grammar.IsAllowedChildSymbol(symb, symbol))
     77          grammar.AddAllowedChildSymbol(symb, newSymbol);
     78        else {
     79          for (int i = 0; i < grammar.GetMaximumSubtreeCount(symb); i++) {
     80            if (grammar.IsAllowedChildSymbol(symb, symbol, i))
     81              grammar.AddAllowedChildSymbol(symb, newSymbol, i);
    7682          }
    7783        }
Note: See TracChangeset for help on using the changeset viewer.