Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
04/15/10 19:58:42 (14 years ago)
Author:
gkronber
Message:

Fixed bugs in ADF operators and added test classes for ADF operators. #290 (Implement ADFs)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureAlteringOperators/ArgumentCreater.cs

    r3338 r3360  
    9696        // append a new argument branch after expanding all argument nodes
    9797        var clonedBranch = (SymbolicExpressionTreeNode)replacedBranch.Clone();
    98         ReplaceArgumentsInBranch(clonedBranch, invocationNode.SubTrees);
     98        clonedBranch = ReplaceArgumentsInBranch(clonedBranch, invocationNode.SubTrees);
    9999        invocationNode.InsertSubTree(newArgumentIndex, clonedBranch);
    100100      }
     
    113113      foreach (var subtree in symbolicExpressionTree.Root.SubTrees) {
    114114        // when the changed function is known in the branch then update the number of arguments
    115         var matchingSymbol = subtree.Grammar.Symbols.Where(s => s.Name == selectedDefunBranch.FunctionName).SingleOrDefault();
     115        var matchingSymbol = subtree.Grammar.Symbols.OfType<InvokeFunction>().Where(s => s.FunctionName == selectedDefunBranch.FunctionName).SingleOrDefault();
    116116        if (matchingSymbol != null) {
    117117          subtree.Grammar.SetMinSubtreeCount(matchingSymbol, selectedDefunBranch.NumberOfArguments);
    118118          subtree.Grammar.SetMaxSubtreeCount(matchingSymbol, selectedDefunBranch.NumberOfArguments);
     119          foreach (var child in subtree.GetAllowedSymbols(0)) {
     120            for (int i = 0; i < subtree.Grammar.GetMaxSubtreeCount(matchingSymbol); i++) {
     121              subtree.Grammar.SetAllowedChild(matchingSymbol, child, i);
     122            }
     123          }
    119124        }
    120125      }
     
    122127    }
    123128
    124     private static void ReplaceArgumentsInBranch(SymbolicExpressionTreeNode branch, IList<SymbolicExpressionTreeNode> argumentTrees) {
    125       // check if any subtree is an argument node
    126       for (int subtreeIndex = 0; subtreeIndex < branch.SubTrees.Count; subtreeIndex++) {
    127         var subtree = branch.SubTrees[subtreeIndex];
    128         var argNode = subtree as ArgumentTreeNode;
    129         if (argNode != null) {
    130           // replace argument nodes by a clone of the original subtree that provided the result for the argument node
    131           branch.SubTrees[subtreeIndex] = (SymbolicExpressionTreeNode)argumentTrees[argNode.Symbol.ArgumentIndex].Clone();
    132         } else {
    133           // recursively replace arguments in all branches
    134           ReplaceArgumentsInBranch(subtree, argumentTrees);
     129    private static SymbolicExpressionTreeNode ReplaceArgumentsInBranch(SymbolicExpressionTreeNode branch, IList<SymbolicExpressionTreeNode> argumentTrees) {
     130      if (branch is ArgumentTreeNode) {
     131        var argNode = branch as ArgumentTreeNode;
     132        // replace argument nodes by a clone of the original subtree that provided the result for the argument node
     133        return (SymbolicExpressionTreeNode)argumentTrees[argNode.Symbol.ArgumentIndex].Clone();
     134      } else {
     135        // call recursively for all subtree
     136        List<SymbolicExpressionTreeNode> subtrees = new List<SymbolicExpressionTreeNode>(branch.SubTrees);
     137        while (branch.SubTrees.Count > 0) branch.SubTrees.RemoveAt(0);
     138        foreach (var subtree in subtrees) {
     139          branch.AddSubTree(ReplaceArgumentsInBranch(subtree, argumentTrees));
    135140        }
     141        return branch;
    136142      }
    137143    }
Note: See TracChangeset for help on using the changeset viewer.