Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
02/28/11 17:11:56 (14 years ago)
Author:
gkronber
Message:

#1418 improved ChangeNodeTypeManipulation operator to make unit test succeed.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/DataAnalysis Refactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/ChangeNodeTypeManipulation.cs

    r5529 r5567  
    4646
    4747    public static void ChangeNodeType(IRandom random, ISymbolicExpressionTree symbolicExpressionTree) {
     48      // select any node as parent (except the root node)
     49      var manipulationPoints = (from parent in symbolicExpressionTree.Root.IterateNodesPrefix().Skip(1)
     50                                let subtreeCount = parent.SubTrees.Count()
     51                                from subtreeIndex in Enumerable.Range(0, subtreeCount)
     52                                let subtree = parent.GetSubTree(subtreeIndex)
     53                                let existingSubtreeCount = subtree.SubTrees.Count()
     54                                // find possible symbols for the node (also considering the existing branches below it)
     55                                let allowedSymbols = (from symbol in parent.Grammar.GetAllowedSymbols(parent.Symbol, subtreeIndex)
     56                                                      // do not replace the existing symbol with itself
     57                                                      where symbol.Name != subtree.Symbol.Name
     58                                                      where existingSubtreeCount <= parent.Grammar.GetMaxSubtreeCount(symbol)
     59                                                      where existingSubtreeCount >= parent.Grammar.GetMinSubtreeCount(symbol)
     60                                                      // keep only symbols that are still possible considering the existing sub-trees
     61                                                      where (from existingSubtreeIndex in Enumerable.Range(0, existingSubtreeCount)
     62                                                             let existingSubtree = subtree.GetSubTree(existingSubtreeIndex)
     63                                                             select parent.Grammar.IsAllowedChild(symbol, existingSubtree.Symbol, existingSubtreeIndex))
     64                                                             .All(x => x == true)
     65                                                      select symbol)
     66                                                      .ToList()
     67                                where allowedSymbols.Count() > 0
     68                                select new { Parent = parent, Child = subtree, Index = subtreeIndex, AllowedSymbols = allowedSymbols })
     69                               .ToList();
     70      if (manipulationPoints.Count == 0) { return; }
     71      var selectedManipulationPoint = manipulationPoints.SelectRandom(random);
    4872
    49       // select any node as parent (except the root node)
    50       var manipulationPoint = (from parent in symbolicExpressionTree.Root.IterateNodesPrefix().Skip(1)
    51                                from subtree in parent.SubTrees
    52                                select new { Parent = parent, Node = subtree, Index = parent.IndexOfSubTree(subtree) })
    53                                .SelectRandom(random);
    54       int subTreeCount = manipulationPoint.Node.SubTrees.Count();
    55       // find possible symbols for the node (also considering the existing branches below it)
    56       var allowedSymbols = from symbol in manipulationPoint.Parent.Grammar.GetAllowedSymbols(manipulationPoint.Parent.Symbol, manipulationPoint.Index)
    57                            where subTreeCount <= manipulationPoint.Node.Grammar.GetMaxSubtreeCount(symbol)
    58                            where subTreeCount >= manipulationPoint.Node.Grammar.GetMinSubtreeCount(symbol)
    59                            select symbol;
    60 
    61       if (allowedSymbols.Count() == 0) {
    62         return;
    63       }
    64       var node = manipulationPoint.Node;
    65       // keep only symbols that are still possible considering the existing sub-trees
    66       var constrainedSymbols = (from symbol in allowedSymbols
    67                                 let disallowedSubtrees =
    68                                       from subtree in node.SubTrees
    69                                       where !node.Grammar.IsAllowedChild(symbol, subtree.Symbol, node.IndexOfSubTree(subtree))
    70                                       select subtree
    71                                 where disallowedSubtrees.Count() == 0
    72                                 select symbol)
    73                                .ToList();
    74       if (constrainedSymbols.Count() == 0) {
    75         return;
    76       }
    77       var weights = constrainedSymbols.Select(s => s.InitialFrequency).ToList();
    78       var newSymbol =  constrainedSymbols.SelectRandom(weights, random);
     73      var weights = selectedManipulationPoint.AllowedSymbols.Select(s => s.InitialFrequency).ToList();
     74      var newSymbol = selectedManipulationPoint.AllowedSymbols.SelectRandom(weights, random);
    7975
    8076      // replace the old node with the new node
     
    8278      if (newNode.HasLocalParameters)
    8379        newNode.ResetLocalParameters(random);
    84       foreach (var subtree in node.SubTrees)
     80      foreach (var subtree in selectedManipulationPoint.Child.SubTrees)
    8581        newNode.AddSubTree(subtree);
    86       manipulationPoint.Parent.RemoveSubTree(manipulationPoint.Index);
    87       manipulationPoint.Parent.InsertSubTree(manipulationPoint.Index, newNode);
     82      selectedManipulationPoint.Parent.RemoveSubTree(selectedManipulationPoint.Index);
     83      selectedManipulationPoint.Parent.InsertSubTree(selectedManipulationPoint.Index, newNode);
    8884    }
    8985  }
Note: See TracChangeset for help on using the changeset viewer.