Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
01/03/12 11:22:21 (12 years ago)
Author:
gkronber
Message:

#1081: merged r7214:7266 from trunk into time series branch.

Location:
branches/HeuristicLab.TimeSeries
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.TimeSeries

  • branches/HeuristicLab.TimeSeries/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/FullTreeCreator.cs

    r7213 r7268  
    11#region License Information
    22/* HeuristicLab
    3  * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
     3 * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
    44 *
    55 * This file is part of HeuristicLab.
     
    6868    }
    6969
    70     public ISymbolicExpressionGrammar SymbolicExpressionTreeGrammar {
     70    public ISymbolicExpressionGrammar ClonedSymbolicExpressionTreeGrammar {
    7171      get { return ClonedSymbolicExpressionTreeGrammarParameter.ActualValue; }
    7272    }
     
    8080    public FullTreeCreator()
    8181      : base() {
    82       Parameters.Add(new ValueLookupParameter<IntValue>(MaximumSymbolicExpressionTreeLengthParameterName, "The maximal length (number of nodes) of the symbolic expression tree."));
    83       Parameters.Add(new ValueLookupParameter<IntValue>(MaximumSymbolicExpressionTreeDepthParameterName, "The maximal depth of the symbolic expression tree (a tree with one node has depth = 0)."));
    84       Parameters.Add(new ValueLookupParameter<ISymbolicExpressionGrammar>(SymbolicExpressionTreeGrammarParameterName, "The tree grammar that defines the correct syntax of symbolic expression trees that should be created."));
    85       Parameters.Add(new LookupParameter<ISymbolicExpressionGrammar>(ClonedSymbolicExpressionTreeGrammarParameterName, "An immutable clone of the concrete grammar that is actually used to create and manipulate trees."));
     82      Parameters.Add(new ValueLookupParameter<IntValue>(MaximumSymbolicExpressionTreeLengthParameterName,
     83        "The maximal length (number of nodes) of the symbolic expression tree (this parameter is ignored)."));
     84      Parameters.Add(new ValueLookupParameter<IntValue>(MaximumSymbolicExpressionTreeDepthParameterName,
     85        "The maximal depth of the symbolic expression tree (a tree with one node has depth = 0)."));
     86      Parameters.Add(new ValueLookupParameter<ISymbolicExpressionGrammar>(SymbolicExpressionTreeGrammarParameterName,
     87        "The tree grammar that defines the correct syntax of symbolic expression trees that should be created."));
     88      Parameters.Add(new LookupParameter<ISymbolicExpressionGrammar>(ClonedSymbolicExpressionTreeGrammarParameterName,
     89        "An immutable clone of the concrete grammar that is actually used to create and manipulate trees."));
    8690    }
    8791
     
    97101          globalScope = globalScope.Parent;
    98102
    99         globalScope.Variables.Add(new Variable(ClonedSymbolicExpressionTreeGrammarParameterName, (ISymbolicExpressionGrammar)SymbolicExpressionTreeGrammarParameter.ActualValue.Clone()));
     103        globalScope.Variables.Add(new Variable(ClonedSymbolicExpressionTreeGrammarParameterName,
     104          (ISymbolicExpressionGrammar)SymbolicExpressionTreeGrammarParameter.ActualValue.Clone()));
    100105      }
    101106      return base.Apply();
     
    103108
    104109    protected override ISymbolicExpressionTree Create(IRandom random) {
    105       return Create(random, SymbolicExpressionTreeGrammar, MaximumSymbolicExpressionTreeLength.Value, MaximumSymbolicExpressionTreeDepth.Value);
     110      return Create(random, ClonedSymbolicExpressionTreeGrammar, MaximumSymbolicExpressionTreeLength.Value, MaximumSymbolicExpressionTreeDepth.Value);
    106111    }
    107112
     
    127132
    128133      var startNode = (SymbolicExpressionTreeTopLevelNode)grammar.StartSymbol.CreateTreeNode();
     134      if (startNode.HasLocalParameters) startNode.ResetLocalParameters(random);
    129135      startNode.SetGrammar(new SymbolicExpressionTreeGrammar(grammar));
    130       if (startNode.HasLocalParameters) startNode.ResetLocalParameters(random);
    131136
    132137      rootNode.AddSubtree(startNode);
    133138
    134       Grow(random, startNode, maxTreeDepth - 2);
     139      Create(random, startNode, maxTreeDepth - 2);
    135140      tree.Root = rootNode;
    136141      return tree;
    137142    }
    138143
    139     public static void Grow(IRandom random, ISymbolicExpressionTreeNode seedNode, int maxDepth) {
     144    public static void Create(IRandom random, ISymbolicExpressionTreeNode seedNode, int maxDepth) {
    140145      // make sure it is possible to create a trees smaller than maxDepth
    141146      if (seedNode.Grammar.GetMinimumExpressionDepth(seedNode.Symbol) > maxDepth)
     
    148153        throw new ArgumentException("Cannot grow tree. Seed node shouldn't have arity zero.");
    149154
    150       var allowedSymbols = seedNode.Grammar.AllowedSymbols.Where(s => s.InitialFrequency > 0.0 && seedNode.Grammar.GetMaximumSubtreeCount(s) > 0).ToList();
    151 
    152       for (var i = 0; i != arity; ++i) {
    153         var possibleSymbols = allowedSymbols.Where(s => seedNode.Grammar.IsAllowedChildSymbol(seedNode.Symbol, s, i)).ToList();
     155      var allowedSymbols = seedNode.Grammar.AllowedSymbols
     156        .Where(s => s.InitialFrequency > 0.0 && seedNode.Grammar.GetMaximumSubtreeCount(s) > 0)
     157        .ToList();
     158
     159      for (var i = 0; i < arity; i++) {
     160        var possibleSymbols = allowedSymbols
     161          .Where(s => seedNode.Grammar.IsAllowedChildSymbol(seedNode.Symbol, s, i))
     162          .ToList();
    154163        var selectedSymbol = possibleSymbols.SelectRandom(random);
    155164        var tree = selectedSymbol.CreateTreeNode();
     
    160169      // Only iterate over the non-terminal nodes (those which have arity > 0)
    161170      // Start from depth 2 since the first two levels are formed by the rootNode and the seedNode
    162       foreach (var subTree in seedNode.Subtrees.Where(subTree => subTree.Grammar.GetMaximumSubtreeCount(subTree.Symbol) > 0))
    163         RecursiveGrowFull(random, subTree, 2, maxDepth);
    164     }
    165 
    166     public static void RecursiveGrowFull(IRandom random, ISymbolicExpressionTreeNode root, int currentDepth, int maxDepth) {
     171      foreach (var subTree in seedNode.Subtrees)
     172        if (subTree.Grammar.GetMaximumSubtreeCount(subTree.Symbol) > 0)
     173          RecursiveCreate(random, subTree, 2, maxDepth);
     174    }
     175
     176    private static void RecursiveCreate(IRandom random, ISymbolicExpressionTreeNode root, int currentDepth, int maxDepth) {
    167177      var arity = root.Grammar.GetMaximumSubtreeCount(root.Symbol);
    168178      // In the 'Full' grow method, we cannot have terminals on the intermediate tree levels.
     
    170180        throw new ArgumentException("Cannot grow node of arity zero. Expected a function node.");
    171181
    172       var allowedSymbols = root.Grammar.AllowedSymbols.Where(s => s.InitialFrequency > 0.0).ToList(); ;
    173 
    174       for (var i = 0; i != arity; ++i) {
    175         var possibleSymbols = allowedSymbols.Where(s => root.Grammar.IsAllowedChildSymbol(root.Symbol, s, i) &&
    176                                                    root.Grammar.GetMinimumExpressionDepth(s) - 1 <= maxDepth - currentDepth &&
    177                                                    root.Grammar.GetMaximumExpressionDepth(s) > maxDepth - currentDepth).ToList();
     182      var allowedSymbols = root.Grammar.AllowedSymbols
     183        .Where(s => s.InitialFrequency > 0.0)
     184        .ToList();
     185
     186      for (var i = 0; i < arity; i++) {
     187        var possibleSymbols = allowedSymbols
     188          .Where(s => root.Grammar.IsAllowedChildSymbol(root.Symbol, s, i) &&
     189            root.Grammar.GetMinimumExpressionDepth(s) - 1 <= maxDepth - currentDepth &&
     190            root.Grammar.GetMaximumExpressionDepth(s) > maxDepth - currentDepth)
     191          .ToList();
    178192        if (!possibleSymbols.Any())
    179193          throw new InvalidOperationException("No symbols are available for the tree.");
     
    185199      }
    186200
    187       foreach (var subTree in root.Subtrees.Where(subTree => subTree.Grammar.GetMaximumSubtreeCount(subTree.Symbol) > 0))
    188         RecursiveGrowFull(random, subTree, currentDepth + 1, maxDepth);
     201      foreach (var subTree in root.Subtrees)
     202        if (subTree.Grammar.GetMaximumSubtreeCount(subTree.Symbol) > 0)
     203          RecursiveCreate(random, subTree, currentDepth + 1, maxDepth);
    189204    }
    190205  }
Note: See TracChangeset for help on using the changeset viewer.