Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
04/13/10 20:44:31 (14 years ago)
Author:
gkronber
Message:

Fixed bugs related to dynamic symbol constraints with ADFs. #290 (Implement ADFs)

File:
1 edited

Legend:

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

    r3294 r3338  
    6161        // no function defining branch => abort
    6262        return false;
    63       var selectedDefunBranch = (DefunTreeNode)SelectRandomBranch(random, functionDefiningBranches);
     63      var selectedDefunBranch = functionDefiningBranches.SelectRandom(random);
    6464      if (selectedDefunBranch.NumberOfArguments <= 1)
    6565        // argument deletion by consolidation is not possible => abort
    6666        return false;
    67       var cutPoints = (from node in IterateNodesPrefix(selectedDefunBranch)
    68                        where node.SubTrees.Count > 0
    69                        from argNode in node.SubTrees.OfType<ArgumentTreeNode>()
    70                        select new { Parent = node, ReplacedChildIndex = node.SubTrees.IndexOf(argNode), ReplacedChild = argNode }).ToList();
    71       if (cutPoints.Count() == 0)
    72         // no cut points found => abort
    73         return false;
    74       var selectedCutPoint = cutPoints[random.Next(cutPoints.Count)];
    75       var removedArgument = selectedCutPoint.ReplacedChild.ArgumentIndex;
     67      var removedArgument = (from sym in selectedDefunBranch.Grammar.Symbols.OfType<Argument>()
     68                             select sym.ArgumentIndex).Distinct().SelectRandom(random);
     69      // find invocations of the manipulated funcion and remove the specified argument tree
    7670      var invocationNodes = from node in symbolicExpressionTree.IterateNodesPrefix().OfType<InvokeFunctionTreeNode>()
    77                             where node.InvokedFunctionName == selectedDefunBranch.Name
     71                            where node.Symbol.FunctionName == selectedDefunBranch.FunctionName
    7872                            select node;
    7973      foreach (var invokeNode in invocationNodes) {
    80         invokeNode.RemoveSubTree(selectedCutPoint.ReplacedChild.ArgumentIndex);
     74        invokeNode.RemoveSubTree(removedArgument);
    8175      }
    8276
    8377      DeleteArgumentByConsolidation(random, selectedDefunBranch, removedArgument);
    8478
    85       selectedDefunBranch.RemoveDynamicSymbol("ARG" + removedArgument);
     79      // delete the dynamic argument symbol that matches the argument to be removed
     80      var matchingSymbol = selectedDefunBranch.Grammar.Symbols.OfType<Argument>().Where(s => s.ArgumentIndex == removedArgument).First();
     81      selectedDefunBranch.Grammar.RemoveSymbol(matchingSymbol);
    8682      // reduce arity in known functions of all root branches
    8783      foreach (var subtree in symbolicExpressionTree.Root.SubTrees) {
    88         if (subtree.DynamicSymbols.Contains(selectedDefunBranch.Name)) {
    89           subtree.SetDynamicSymbolArgumentCount(selectedDefunBranch.Name, selectedDefunBranch.NumberOfArguments - 1);
     84        var matchingInvokeSymbol = subtree.Grammar.Symbols.OfType<InvokeFunction>().Where(s => s.FunctionName == selectedDefunBranch.FunctionName).FirstOrDefault();
     85        if (matchingInvokeSymbol != null) {
     86          subtree.Grammar.SetMinSubtreeCount(matchingInvokeSymbol, selectedDefunBranch.NumberOfArguments - 1);
     87          subtree.Grammar.SetMaxSubtreeCount(matchingInvokeSymbol, selectedDefunBranch.NumberOfArguments - 1);
    9088        }
    9189      }
    9290      selectedDefunBranch.NumberOfArguments--;
    93       Debug.Assert(grammar.IsValidExpression(symbolicExpressionTree));
    9491      return true;
    9592    }
     
    9794    private static void DeleteArgumentByConsolidation(IRandom random, DefunTreeNode branch, int removedArgumentIndex) {
    9895      // replace references to the deleted argument with random references to existing arguments
    99       var possibleArgumentIndexes = (from node in IterateNodesPrefix(branch).OfType<ArgumentTreeNode>()
    100                                      where node.ArgumentIndex != removedArgumentIndex
    101                                      select node.ArgumentIndex).Distinct().ToList();
    102       var argNodes = from node in IterateNodesPrefix(branch).OfType<ArgumentTreeNode>()
    103                      where node.ArgumentIndex == removedArgumentIndex
     96      var possibleArgumentSymbols = (from sym in branch.Grammar.Symbols.OfType<Argument>()
     97                                     where sym.ArgumentIndex != removedArgumentIndex
     98                                     select sym).ToList();
     99      var argNodes = from node in branch.IterateNodesPrefix().OfType<ArgumentTreeNode>()
     100                     where node.Symbol.ArgumentIndex == removedArgumentIndex
    104101                     select node;
    105102      foreach (var argNode in argNodes) {
    106         var replacementArgument = possibleArgumentIndexes[random.Next(possibleArgumentIndexes.Count)];
    107         argNode.ArgumentIndex = replacementArgument;
     103        var replacementSymbol = possibleArgumentSymbols.SelectRandom(random);
     104        argNode.Symbol = replacementSymbol;
    108105      }
    109     }
    110     private static IEnumerable<SymbolicExpressionTreeNode> IterateNodesPrefix(SymbolicExpressionTreeNode tree) {
    111       yield return tree;
    112       foreach (var subTree in tree.SubTrees) {
    113         foreach (var node in IterateNodesPrefix(subTree)) {
    114           yield return node;
    115         }
    116       }
    117     }
    118 
    119     private static SymbolicExpressionTreeNode SelectRandomBranch(IRandom random, IEnumerable<DefunTreeNode> branches) {
    120       var list = branches.ToList();
    121       return list[random.Next(list.Count)];
    122106    }
    123107  }
Note: See TracChangeset for help on using the changeset viewer.