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/ArgumentDuplicater.cs

    r3338 r3360  
    6464        return false;
    6565
    66       var selectedDefunBranch = SelectRandomBranch(random, functionDefiningBranches);
    67       var argumentNodes = from node in IterateNodesPrefix(selectedDefunBranch)
    68                           where node is ArgumentTreeNode
    69                           select (ArgumentTreeNode)node;
    70       if (argumentNodes.Count() == 0 || argumentNodes.Count() >= maxFunctionArguments)
     66      var selectedDefunBranch = functionDefiningBranches.SelectRandom(random);
     67      var argumentSymbols = selectedDefunBranch.Grammar.Symbols.OfType<Argument>();
     68      if (argumentSymbols.Count() == 0 || argumentSymbols.Count() >= maxFunctionArguments)
    7169        // when no argument or number of arguments is already at max allowed value => abort
    7270        return false;
    73       var distinctArgumentIndexes = (from node in argumentNodes
    74                                      select node.ArgumentIndex).Distinct().ToList();
    75       var selectedArgumentIndex = distinctArgumentIndexes[random.Next(distinctArgumentIndexes.Count)];
    76       var newArgumentIndex = allowedArgumentIndexes.Except(from argNode in argumentNodes select argNode.ArgumentIndex).First();
     71      var selectedArgumentSymbol = argumentSymbols.SelectRandom(random);
     72      var takenIndexes = argumentSymbols.Select(s => s.ArgumentIndex);
     73      var newArgumentIndex = allowedArgumentIndexes.Except(takenIndexes).First();
     74
     75      var newArgSymbol = new Argument(newArgumentIndex);
     76
    7777      // replace existing references to the original argument with references to the new argument randomly in the selectedBranch
     78      var argumentNodes = selectedDefunBranch.IterateNodesPrefix().OfType<ArgumentTreeNode>();
    7879      foreach (var argNode in argumentNodes) {
    79         if (argNode.ArgumentIndex == selectedArgumentIndex) {
     80        if (argNode.Symbol == selectedArgumentSymbol) {
    8081          if (random.NextDouble() < 0.5) {
    81             argNode.ArgumentIndex = newArgumentIndex;
     82            argNode.Symbol = newArgSymbol;
    8283          }
    8384        }
    8485      }
    8586      // find invocations of the functions and duplicate the matching argument branch
    86       var invocationNodes = from node in symbolicExpressionTree.IterateNodesPrefix()
    87                             let invokeNode = node as InvokeFunctionTreeNode
    88                             where invokeNode != null
    89                             where invokeNode.InvokedFunctionName == selectedDefunBranch.Name
    90                             select invokeNode;
     87      var invocationNodes = from node in symbolicExpressionTree.IterateNodesPrefix().OfType<InvokeFunctionTreeNode>()
     88                            where node.Symbol.FunctionName == selectedDefunBranch.FunctionName
     89                            select node;
    9190      foreach (var invokeNode in invocationNodes) {
    92         var argumentBranch = invokeNode.SubTrees[selectedArgumentIndex];
     91        var argumentBranch = invokeNode.SubTrees[selectedArgumentSymbol.ArgumentIndex];
    9392        var clonedArgumentBranch = (SymbolicExpressionTreeNode)argumentBranch.Clone();
    9493        invokeNode.InsertSubTree(newArgumentIndex, clonedArgumentBranch);
    9594      }
    96       // register the new argument node and increase the number of arguments of the ADF
    97       selectedDefunBranch.AddDynamicSymbol("ARG" + newArgumentIndex);
     95      // register the new argument symbol and increase the number of arguments of the ADF
     96      selectedDefunBranch.Grammar.AddSymbol(newArgSymbol);
     97      selectedDefunBranch.Grammar.SetMinSubtreeCount(newArgSymbol, 0);
     98      selectedDefunBranch.Grammar.SetMaxSubtreeCount(newArgSymbol, 0);
     99      // allow the argument as child of any other symbol
     100      foreach (var symb in selectedDefunBranch.Grammar.Symbols)
     101        for (int i = 0; i < selectedDefunBranch.Grammar.GetMaxSubtreeCount(symb); i++) {
     102          selectedDefunBranch.Grammar.SetAllowedChild(symb, newArgSymbol, i);
     103        }
    98104      selectedDefunBranch.NumberOfArguments++;
     105
    99106      // increase the arity of the changed ADF in all branches that can use this ADF
    100107      foreach (var subtree in symbolicExpressionTree.Root.SubTrees) {
    101         if (subtree.DynamicSymbols.Contains(selectedDefunBranch.Name)) {
    102           subtree.SetDynamicSymbolArgumentCount(selectedDefunBranch.Name, selectedDefunBranch.NumberOfArguments);
     108        var matchingInvokeSymbol = (from symb in subtree.Grammar.Symbols.OfType<InvokeFunction>()
     109                                    where symb.FunctionName == selectedDefunBranch.FunctionName
     110                                    select symb).SingleOrDefault();
     111        if (matchingInvokeSymbol != null) {
     112          subtree.Grammar.SetMinSubtreeCount(matchingInvokeSymbol, selectedDefunBranch.NumberOfArguments);
     113          subtree.Grammar.SetMaxSubtreeCount(matchingInvokeSymbol, selectedDefunBranch.NumberOfArguments);
     114          foreach (var child in subtree.GetAllowedSymbols(0)) {
     115            for (int i = 0; i < subtree.Grammar.GetMaxSubtreeCount(matchingInvokeSymbol); i++) {
     116              subtree.Grammar.SetAllowedChild(matchingInvokeSymbol, child, i);
     117            }
     118          }
    103119        }
    104120      }
    105       Debug.Assert(grammar.IsValidExpression(symbolicExpressionTree));
    106121      return true;
    107122    }
Note: See TracChangeset for help on using the changeset viewer.