Changeset 12969 for branches/gteufl/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/GrowTreeCreator.cs
- Timestamp:
- 09/25/15 14:39:59 (9 years ago)
- Location:
- branches/gteufl
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/gteufl
- Property svn:ignore
-
old new 8 8 FxCopResults.txt 9 9 Google.ProtocolBuffers-0.9.1.dll 10 Google.ProtocolBuffers-2.4.1.473.dll 10 11 HeuristicLab 3.3.5.1.ReSharper.user 11 12 HeuristicLab 3.3.6.0.ReSharper.user 12 13 HeuristicLab.4.5.resharper.user 13 14 HeuristicLab.ExtLibs.6.0.ReSharper.user 15 HeuristicLab.Scripting.Development 14 16 HeuristicLab.resharper.user 15 17 ProtoGen.exe … … 17 19 _ReSharper.HeuristicLab 18 20 _ReSharper.HeuristicLab 3.3 21 _ReSharper.HeuristicLab 3.3 Tests 19 22 _ReSharper.HeuristicLab.ExtLibs 20 23 bin 21 24 protoc.exe 22 _ReSharper.HeuristicLab 3.3 Tests 23 Google.ProtocolBuffers-2.4.1.473.dll 25 obj
-
- Property svn:mergeinfo changed
-
Property
svn:global-ignores
set to
*.nuget
packages
- Property svn:ignore
-
branches/gteufl/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding
- Property svn:mergeinfo changed
-
branches/gteufl/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Creators/GrowTreeCreator.cs
r9456 r12969 1 1 #region License Information 2 2 /* HeuristicLab 3 * Copyright (C) 2002-201 3Heuristic and Evolutionary Algorithms Laboratory (HEAL)3 * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 4 4 * 5 5 * This file is part of HeuristicLab. … … 24 24 using HeuristicLab.Common; 25 25 using HeuristicLab.Core; 26 using HeuristicLab.Data;27 using HeuristicLab.Parameters;28 26 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 29 27 using HeuristicLab.PluginInfrastructure; … … 33 31 [StorableClass] 34 32 [Item("GrowTreeCreator", "An operator that creates new symbolic expression trees using the 'Grow' method")] 35 public class GrowTreeCreator : SymbolicExpressionTreeCreator, 36 ISymbolicExpressionTreeSizeConstraintOperator, 37 ISymbolicExpressionTreeGrammarBasedOperator { 38 private const string MaximumSymbolicExpressionTreeLengthParameterName = "MaximumSymbolicExpressionTreeLength"; 39 private const string MaximumSymbolicExpressionTreeDepthParameterName = "MaximumSymbolicExpressionTreeDepth"; 40 private const string SymbolicExpressionTreeGrammarParameterName = "SymbolicExpressionTreeGrammar"; 41 private const string ClonedSymbolicExpressionTreeGrammarParameterName = "ClonedSymbolicExpressionTreeGrammar"; 42 43 #region Parameter Properties 44 public IValueLookupParameter<IntValue> MaximumSymbolicExpressionTreeLengthParameter { 45 get { return (IValueLookupParameter<IntValue>)Parameters[MaximumSymbolicExpressionTreeLengthParameterName]; } 46 } 47 48 public IValueLookupParameter<IntValue> MaximumSymbolicExpressionTreeDepthParameter { 49 get { return (IValueLookupParameter<IntValue>)Parameters[MaximumSymbolicExpressionTreeDepthParameterName]; } 50 } 51 52 public IValueLookupParameter<ISymbolicExpressionGrammar> SymbolicExpressionTreeGrammarParameter { 53 get { return (IValueLookupParameter<ISymbolicExpressionGrammar>)Parameters[SymbolicExpressionTreeGrammarParameterName]; } 54 } 55 56 public ILookupParameter<ISymbolicExpressionGrammar> ClonedSymbolicExpressionTreeGrammarParameter { 57 get { return (ILookupParameter<ISymbolicExpressionGrammar>)Parameters[ClonedSymbolicExpressionTreeGrammarParameterName]; } 58 } 59 60 #endregion 61 #region Properties 62 public IntValue MaximumSymbolicExpressionTreeDepth { 63 get { return MaximumSymbolicExpressionTreeDepthParameter.ActualValue; } 64 } 65 66 public IntValue MaximumSymbolicExpressionTreeLength { 67 get { return MaximumSymbolicExpressionTreeLengthParameter.ActualValue; } 68 } 69 70 public ISymbolicExpressionGrammar ClonedSymbolicExpressionTreeGrammar { 71 get { return ClonedSymbolicExpressionTreeGrammarParameter.ActualValue; } 72 } 73 74 #endregion 75 33 public class GrowTreeCreator : SymbolicExpressionTreeCreator { 76 34 [StorableConstructor] 77 35 protected GrowTreeCreator(bool deserializing) : base(deserializing) { } 78 36 protected GrowTreeCreator(GrowTreeCreator original, Cloner cloner) : base(original, cloner) { } 79 37 80 public GrowTreeCreator() 81 : base() { 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.")); 90 } 38 public GrowTreeCreator() : base() { } 91 39 92 40 public override IDeepCloneable Clone(Cloner cloner) { … … 94 42 } 95 43 96 public override IOperation Apply() {97 if (ClonedSymbolicExpressionTreeGrammarParameter.ActualValue == null) {98 SymbolicExpressionTreeGrammarParameter.ActualValue.ReadOnly = true;99 IScope globalScope = ExecutionContext.Scope;100 while (globalScope.Parent != null)101 globalScope = globalScope.Parent;102 103 globalScope.Variables.Add(new Variable(ClonedSymbolicExpressionTreeGrammarParameterName,104 (ISymbolicExpressionGrammar)SymbolicExpressionTreeGrammarParameter.ActualValue.Clone()));105 }106 return base.Apply();107 }108 44 109 45 protected override ISymbolicExpressionTree Create(IRandom random) { 110 return Create(random, ClonedSymbolicExpressionTreeGrammar ,111 MaximumSymbolicExpressionTreeLength .Value, MaximumSymbolicExpressionTreeDepth.Value);46 return Create(random, ClonedSymbolicExpressionTreeGrammarParameter.ActualValue, 47 MaximumSymbolicExpressionTreeLengthParameter.ActualValue.Value, MaximumSymbolicExpressionTreeDepthParameter.ActualValue.Value); 112 48 } 113 49 … … 128 64 var tree = new SymbolicExpressionTree(); 129 65 var rootNode = (SymbolicExpressionTreeTopLevelNode)grammar.ProgramRootSymbol.CreateTreeNode(); 130 rootNode.SetGrammar(new SymbolicExpressionTreeGrammar(grammar));131 66 if (rootNode.HasLocalParameters) rootNode.ResetLocalParameters(random); 67 rootNode.SetGrammar(grammar.CreateExpressionTreeGrammar()); 68 132 69 133 70 var startNode = (SymbolicExpressionTreeTopLevelNode)grammar.StartSymbol.CreateTreeNode(); 134 71 if (startNode.HasLocalParameters) startNode.ResetLocalParameters(random); 135 startNode.SetGrammar( new SymbolicExpressionTreeGrammar(grammar));72 startNode.SetGrammar(grammar.CreateExpressionTreeGrammar()); 136 73 137 74 rootNode.AddSubtree(startNode); 138 75 139 Create(random, startNode, maxTreeDepth - 2);76 Create(random, startNode, maxTreeDepth - 1); 140 77 tree.Root = rootNode; 141 78 return tree; … … 152 89 throw new ArgumentException("Cannot grow tree. Seed node shouldn't have arity zero."); 153 90 154 var allowedSymbols = seedNode.Grammar.AllowedSymbols 155 .Where(s => s.InitialFrequency > 0.0) 156 .ToList(); 91 var allowedSymbols = seedNode.Grammar.AllowedSymbols.Where(s => s.InitialFrequency > 0.0).ToList(); 157 92 158 93 for (var i = 0; i < arity; i++) { 159 var possibleSymbols = allowedSymbols 160 .Where(s => seedNode.Grammar.IsAllowedChildSymbol(seedNode.Symbol, s, i)) 161 .ToList(); 94 var possibleSymbols = allowedSymbols.Where(s => seedNode.Grammar.IsAllowedChildSymbol(seedNode.Symbol, s, i)).ToList(); 162 95 var weights = possibleSymbols.Select(s => s.InitialFrequency).ToList(); 96 97 #pragma warning disable 612, 618 163 98 var selectedSymbol = possibleSymbols.SelectRandom(weights, random); 99 #pragma warning restore 612, 618 100 164 101 var tree = selectedSymbol.CreateTreeNode(); 165 102 if (tree.HasLocalParameters) tree.ResetLocalParameters(random); … … 176 113 private static void RecursiveCreate(IRandom random, ISymbolicExpressionTreeNode root, int currentDepth, int maxDepth) { 177 114 var arity = SampleArity(random, root); 178 if (arity <= 0)179 throw new ArgumentException("Cannot grow node of arity zero. Expected a function node.");115 if (arity == 0) 116 return; 180 117 181 118 var allowedSymbols = root.Grammar.AllowedSymbols.Where(s => s.InitialFrequency > 0.0).ToList(); 182 119 183 120 for (var i = 0; i < arity; i++) { 184 var possibleSymbols = allowedSymbols 185 .Where(s => root.Grammar.IsAllowedChildSymbol(root.Symbol, s, i) && 186 root.Grammar.GetMinimumExpressionDepth(s) - 1 <= maxDepth - currentDepth) 187 .ToList(); 121 var possibleSymbols = allowedSymbols.Where(s => root.Grammar.IsAllowedChildSymbol(root.Symbol, s, i) && 122 root.Grammar.GetMinimumExpressionDepth(s) - 1 <= maxDepth - currentDepth).ToList(); 188 123 189 124 if (!possibleSymbols.Any()) 190 125 throw new InvalidOperationException("No symbols are available for the tree."); 126 191 127 var weights = possibleSymbols.Select(s => s.InitialFrequency).ToList(); 128 #pragma warning disable 612, 618 192 129 var selectedSymbol = possibleSymbols.SelectRandom(weights, random); 130 #pragma warning restore 612, 618 131 193 132 var tree = selectedSymbol.CreateTreeNode(); 194 133 if (tree.HasLocalParameters) tree.ResetLocalParameters(random); … … 196 135 } 197 136 198 foreach (var subTree in root.Subtrees) 199 if (subTree.Grammar.GetMaximumSubtreeCount(subTree.Symbol) != 0) 200 RecursiveCreate(random, subTree, currentDepth + 1, maxDepth); 137 if (maxDepth > currentDepth) 138 foreach (var subTree in root.Subtrees) 139 if (subTree.Grammar.GetMaximumSubtreeCount(subTree.Symbol) != 0) 140 RecursiveCreate(random, subTree, currentDepth + 1, maxDepth); 201 141 } 202 142
Note: See TracChangeset
for help on using the changeset viewer.