Changeset 7236
- Timestamp:
- 12/27/11 12:36:14 (13 years ago)
- Location:
- trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/FullTreeCreator.cs
r7108 r7236 68 68 } 69 69 70 public ISymbolicExpressionGrammar SymbolicExpressionTreeGrammar {70 public ISymbolicExpressionGrammar ClonedSymbolicExpressionTreeGrammar { 71 71 get { return ClonedSymbolicExpressionTreeGrammarParameter.ActualValue; } 72 72 } … … 80 80 public FullTreeCreator() 81 81 : 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.")); 86 90 } 87 91 … … 97 101 globalScope = globalScope.Parent; 98 102 99 globalScope.Variables.Add(new Variable(ClonedSymbolicExpressionTreeGrammarParameterName, (ISymbolicExpressionGrammar)SymbolicExpressionTreeGrammarParameter.ActualValue.Clone())); 103 globalScope.Variables.Add(new Variable(ClonedSymbolicExpressionTreeGrammarParameterName, 104 (ISymbolicExpressionGrammar)SymbolicExpressionTreeGrammarParameter.ActualValue.Clone())); 100 105 } 101 106 return base.Apply(); … … 103 108 104 109 protected override ISymbolicExpressionTree Create(IRandom random) { 105 return Create(random, SymbolicExpressionTreeGrammar, MaximumSymbolicExpressionTreeLength.Value, MaximumSymbolicExpressionTreeDepth.Value);110 return Create(random, ClonedSymbolicExpressionTreeGrammar, MaximumSymbolicExpressionTreeLength.Value, MaximumSymbolicExpressionTreeDepth.Value); 106 111 } 107 112 … … 127 132 128 133 var startNode = (SymbolicExpressionTreeTopLevelNode)grammar.StartSymbol.CreateTreeNode(); 134 if (startNode.HasLocalParameters) startNode.ResetLocalParameters(random); 129 135 startNode.SetGrammar(new SymbolicExpressionTreeGrammar(grammar)); 130 if (startNode.HasLocalParameters) startNode.ResetLocalParameters(random);131 136 132 137 rootNode.AddSubtree(startNode); 133 138 134 Grow(random, startNode, maxTreeDepth - 2);139 Create(random, startNode, maxTreeDepth - 2); 135 140 tree.Root = rootNode; 136 141 return tree; 137 142 } 138 143 139 public static void Grow(IRandom random, ISymbolicExpressionTreeNode seedNode, int maxDepth) {144 public static void Create(IRandom random, ISymbolicExpressionTreeNode seedNode, int maxDepth) { 140 145 // make sure it is possible to create a trees smaller than maxDepth 141 146 if (seedNode.Grammar.GetMinimumExpressionDepth(seedNode.Symbol) > maxDepth) … … 148 153 throw new ArgumentException("Cannot grow tree. Seed node shouldn't have arity zero."); 149 154 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(); 154 163 var selectedSymbol = possibleSymbols.SelectRandom(random); 155 164 var tree = selectedSymbol.CreateTreeNode(); … … 160 169 // Only iterate over the non-terminal nodes (those which have arity > 0) 161 170 // 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) { 167 177 var arity = root.Grammar.GetMaximumSubtreeCount(root.Symbol); 168 178 // In the 'Full' grow method, we cannot have terminals on the intermediate tree levels. … … 170 180 throw new ArgumentException("Cannot grow node of arity zero. Expected a function node."); 171 181 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(); 178 192 if (!possibleSymbols.Any()) 179 193 throw new InvalidOperationException("No symbols are available for the tree."); … … 185 199 } 186 200 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); 189 204 } 190 205 } -
trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/GrowTreeCreator.cs
r7108 r7236 68 68 } 69 69 70 public ISymbolicExpressionGrammar SymbolicExpressionTreeGrammar {70 public ISymbolicExpressionGrammar ClonedSymbolicExpressionTreeGrammar { 71 71 get { return ClonedSymbolicExpressionTreeGrammarParameter.ActualValue; } 72 72 } … … 80 80 public GrowTreeCreator() 81 81 : 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.")); 86 90 } 87 91 … … 97 101 globalScope = globalScope.Parent; 98 102 99 globalScope.Variables.Add(new Variable(ClonedSymbolicExpressionTreeGrammarParameterName, (ISymbolicExpressionGrammar)SymbolicExpressionTreeGrammarParameter.ActualValue.Clone())); 103 globalScope.Variables.Add(new Variable(ClonedSymbolicExpressionTreeGrammarParameterName, 104 (ISymbolicExpressionGrammar)SymbolicExpressionTreeGrammarParameter.ActualValue.Clone())); 100 105 } 101 106 return base.Apply(); … … 103 108 104 109 protected override ISymbolicExpressionTree Create(IRandom random) { 105 return Create(random, SymbolicExpressionTreeGrammar, MaximumSymbolicExpressionTreeLength.Value, MaximumSymbolicExpressionTreeDepth.Value); 110 return Create(random, ClonedSymbolicExpressionTreeGrammar, 111 MaximumSymbolicExpressionTreeLength.Value, MaximumSymbolicExpressionTreeDepth.Value); 106 112 } 107 113 … … 126 132 127 133 var startNode = (SymbolicExpressionTreeTopLevelNode)grammar.StartSymbol.CreateTreeNode(); 134 if (startNode.HasLocalParameters) startNode.ResetLocalParameters(random); 128 135 startNode.SetGrammar(new SymbolicExpressionTreeGrammar(grammar)); 129 if (startNode.HasLocalParameters) startNode.ResetLocalParameters(random);130 136 131 137 rootNode.AddSubtree(startNode); 132 138 133 Grow(random, startNode, maxTreeDepth - 2);139 Create(random, startNode, maxTreeDepth - 2); 134 140 tree.Root = rootNode; 135 141 return tree; 136 142 } 137 143 138 public static void Grow(IRandom random, ISymbolicExpressionTreeNode seedNode, int maxDepth) {144 public static void Create(IRandom random, ISymbolicExpressionTreeNode seedNode, int maxDepth) { 139 145 // make sure it is possible to create a trees smaller than maxDepth 140 146 if (seedNode.Grammar.GetMinimumExpressionDepth(seedNode.Symbol) > maxDepth) … … 146 152 throw new ArgumentException("Cannot grow tree. Seed node shouldn't have arity zero."); 147 153 148 var allowedSymbols = seedNode.Grammar.AllowedSymbols.Where(s => s.InitialFrequency > 0.0).ToList(); 149 150 for (var i = 0; i != arity; ++i) { 151 var possibleSymbols = allowedSymbols.Where(s => seedNode.Grammar.IsAllowedChildSymbol(seedNode.Symbol, s, i)).ToList(); 154 var allowedSymbols = seedNode.Grammar.AllowedSymbols 155 .Where(s => s.InitialFrequency > 0.0) 156 .ToList(); 157 158 for (var i = 0; i < arity; i++) { 159 var possibleSymbols = allowedSymbols 160 .Where(s => seedNode.Grammar.IsAllowedChildSymbol(seedNode.Symbol, s, i)) 161 .ToList(); 152 162 var selectedSymbol = possibleSymbols.SelectRandom(random); 153 163 var tree = selectedSymbol.CreateTreeNode(); … … 158 168 // Only iterate over the non-terminal nodes (those which have arity > 0) 159 169 // Start from depth 2 since the first two levels are formed by the rootNode and the seedNode 160 foreach (var subTree in seedNode.Subtrees.Where(subTree => subTree.Grammar.GetMaximumSubtreeCount(subTree.Symbol) > 0)) 161 RecursiveGrow(random, subTree, 2, maxDepth); 162 } 163 164 public static void RecursiveGrow(IRandom random, ISymbolicExpressionTreeNode root, int currentDepth, int maxDepth) { 170 foreach (var subTree in seedNode.Subtrees) 171 if (subTree.Grammar.GetMaximumSubtreeCount(subTree.Symbol) > 0) 172 RecursiveCreate(random, subTree, 2, maxDepth); 173 } 174 175 private static void RecursiveCreate(IRandom random, ISymbolicExpressionTreeNode root, int currentDepth, int maxDepth) { 165 176 var arity = SampleArity(random, root); 166 177 if (arity <= 0) 167 178 throw new ArgumentException("Cannot grow node of arity zero. Expected a function node."); 168 179 169 var allowedSymbols = root.Grammar.AllowedSymbols.Where(s => s.InitialFrequency > 0.0).ToList(); 170 171 for (var i = 0; i != arity; ++i) { 172 var possibleSymbols = allowedSymbols.Where(s => root.Grammar.IsAllowedChildSymbol(root.Symbol, s, i) && root.Grammar.GetMinimumExpressionDepth(s) - 1 <= maxDepth - currentDepth).ToList(); 180 var allowedSymbols = root.Grammar.AllowedSymbols 181 .Where(s => s.InitialFrequency > 0.0) 182 .ToList(); 183 184 for (var i = 0; i < arity; i++) { 185 var possibleSymbols = allowedSymbols 186 .Where(s => root.Grammar.IsAllowedChildSymbol(root.Symbol, s, i) && 187 root.Grammar.GetMinimumExpressionDepth(s) - 1 <= maxDepth - currentDepth) 188 .ToList(); 173 189 if (!possibleSymbols.Any()) 174 190 throw new InvalidOperationException("No symbols are available for the tree."); … … 179 195 } 180 196 181 foreach (var subTree in root.Subtrees.Where(subTree => subTree.Grammar.GetMaximumSubtreeCount(subTree.Symbol) != 0)) 182 RecursiveGrow(random, subTree, currentDepth + 1, maxDepth); 197 foreach (var subTree in root.Subtrees) 198 if (subTree.Grammar.GetMaximumSubtreeCount(subTree.Symbol) != 0) 199 RecursiveCreate(random, subTree, currentDepth + 1, maxDepth); 183 200 } 184 201 -
trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/RampedHalfAndHalfTreeCreator.cs
r7034 r7236 20 20 #endregion 21 21 22 using System;23 using System.Collections.Generic;24 using System.ComponentModel;25 using System.Linq;26 22 using HeuristicLab.Common; 27 23 using HeuristicLab.Core; … … 54 50 public IValueLookupParameter<ISymbolicExpressionGrammar> SymbolicExpressionTreeGrammarParameter { 55 51 get { 56 return 57 (IValueLookupParameter<ISymbolicExpressionGrammar>) 58 Parameters[SymbolicExpressionTreeGrammarParameterName]; 52 return (IValueLookupParameter<ISymbolicExpressionGrammar>)Parameters[SymbolicExpressionTreeGrammarParameterName]; 59 53 } 60 54 } … … 62 56 public ILookupParameter<ISymbolicExpressionGrammar> ClonedSymbolicExpressionTreeGrammarParameter { 63 57 get { 64 return 65 (ILookupParameter<ISymbolicExpressionGrammar>) 66 Parameters[ClonedSymbolicExpressionTreeGrammarParameterName]; 58 return (ILookupParameter<ISymbolicExpressionGrammar>)Parameters[ClonedSymbolicExpressionTreeGrammarParameterName]; 67 59 } 68 60 } … … 78 70 } 79 71 80 public ISymbolicExpressionGrammar SymbolicExpressionTreeGrammar {72 public ISymbolicExpressionGrammar ClonedSymbolicExpressionTreeGrammar { 81 73 get { return ClonedSymbolicExpressionTreeGrammarParameter.ActualValue; } 82 74 } … … 89 81 public RampedHalfAndHalfTreeCreator() 90 82 : base() { 91 Parameters.Add(new ValueLookupParameter<IntValue>(MaximumSymbolicExpressionTreeLengthParameterName, "The maximal length (number of nodes) of the symbolic expression tree.")); 92 Parameters.Add(new ValueLookupParameter<IntValue>(MaximumSymbolicExpressionTreeDepthParameterName, "The maximal depth of the symbolic expression tree (a tree with one node has depth = 0).")); 93 Parameters.Add(new ValueLookupParameter<ISymbolicExpressionGrammar>(SymbolicExpressionTreeGrammarParameterName, "The tree grammar that defines the correct syntax of symbolic expression trees that should be created.")); 94 Parameters.Add(new LookupParameter<ISymbolicExpressionGrammar>(ClonedSymbolicExpressionTreeGrammarParameterName, "An immutable clone of the concrete grammar that is actually used to create and manipulate trees.")); 83 Parameters.Add(new ValueLookupParameter<IntValue>(MaximumSymbolicExpressionTreeLengthParameterName, 84 "The maximal length (number of nodes) of the symbolic expression tree (this parameter is ignored).")); 85 Parameters.Add(new ValueLookupParameter<IntValue>(MaximumSymbolicExpressionTreeDepthParameterName, 86 "The maximal depth of the symbolic expression tree (a tree with one node has depth = 0).")); 87 Parameters.Add(new ValueLookupParameter<ISymbolicExpressionGrammar>(SymbolicExpressionTreeGrammarParameterName, 88 "The tree grammar that defines the correct syntax of symbolic expression trees that should be created.")); 89 Parameters.Add(new LookupParameter<ISymbolicExpressionGrammar>(ClonedSymbolicExpressionTreeGrammarParameterName, 90 "An immutable clone of the concrete grammar that is actually used to create and manipulate trees.")); 95 91 } 96 92 … … 106 102 globalScope = globalScope.Parent; 107 103 108 globalScope.Variables.Add(new Variable(ClonedSymbolicExpressionTreeGrammarParameterName, (ISymbolicExpressionGrammar)SymbolicExpressionTreeGrammarParameter.ActualValue.Clone())); 104 globalScope.Variables.Add(new Variable(ClonedSymbolicExpressionTreeGrammarParameterName, 105 (ISymbolicExpressionGrammar)SymbolicExpressionTreeGrammarParameter.ActualValue.Clone())); 109 106 } 110 107 return base.Apply(); … … 112 109 113 110 protected override ISymbolicExpressionTree Create(IRandom random) { 114 return Create(random, SymbolicExpressionTreeGrammar, MaximumSymbolicExpressionTreeLength.Value, MaximumSymbolicExpressionTreeDepth.Value);111 return Create(random, ClonedSymbolicExpressionTreeGrammar, MaximumSymbolicExpressionTreeLength.Value, MaximumSymbolicExpressionTreeDepth.Value); 115 112 } 116 113 … … 125 122 /// <param name="random">Random generator</param> 126 123 /// <param name="grammar">Available tree grammar</param> 124 /// <param name="maxTreeLength">Maximum tree length (this parameter is ignored)</param> 127 125 /// <param name="maxTreeDepth">Maximum tree depth</param> 128 126 /// <returns></returns> … … 134 132 135 133 var startNode = (SymbolicExpressionTreeTopLevelNode)grammar.StartSymbol.CreateTreeNode(); 134 if (startNode.HasLocalParameters) startNode.ResetLocalParameters(random); 136 135 startNode.SetGrammar(new SymbolicExpressionTreeGrammar(grammar)); 137 if (startNode.HasLocalParameters) startNode.ResetLocalParameters(random);138 136 139 137 rootNode.AddSubtree(startNode); … … 142 140 143 141 if (p < 0.5) 144 GrowTreeCreator. Grow(random, startNode, maxTreeDepth - 2);142 GrowTreeCreator.Create(random, startNode, maxTreeDepth - 2); 145 143 else 146 FullTreeCreator. Grow(random, startNode, maxTreeDepth - 2);144 FullTreeCreator.Create(random, startNode, maxTreeDepth - 2); 147 145 148 146 tree.Root = rootNode; -
trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeGrammar.cs
r7079 r7236 45 45 private ISymbolicExpressionGrammar grammar; 46 46 public SymbolicExpressionTreeGrammar(ISymbolicExpressionGrammar grammar) 47 : base("SymbolicExpressionTreeGrammar", "A grammar that is used held by symbolic expression trees and allows extensions to the wrap ed grammar.") {47 : base("SymbolicExpressionTreeGrammar", "A grammar that is used held by symbolic expression trees and allows extensions to the wrapped grammar.") { 48 48 if (grammar == null) throw new ArgumentNullException(); 49 49 this.grammar = grammar;
Note: See TracChangeset
for help on using the changeset viewer.