Changeset 7669 for branches/HeuristicLab.Hive.Azure/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding
- Timestamp:
- 03/28/12 15:47:26 (13 years ago)
- Location:
- branches/HeuristicLab.Hive.Azure
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.Hive.Azure
- Property svn:ignore
-
old new 3 3 *.resharper 4 4 *.suo 5 *.user 5 6 *.vsp 6 7 Doxygen 8 FxCopResults.txt 7 9 Google.ProtocolBuffers-0.9.1.dll 8 10 HeuristicLab 3.3.5.1.ReSharper.user
-
- Property svn:mergeinfo changed
- Property svn:ignore
-
branches/HeuristicLab.Hive.Azure/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding
-
Property
svn:mergeinfo
set to
(toggle deleted branches)
/branches/GP.Symbols (TimeLag, Diff, Integral)/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding merged eligible /trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding merged eligible /branches/Benchmarking/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding 6917-7005 /branches/CloningRefactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding 4656-4721 /branches/DataAnalysis Refactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding 5471-5808 /branches/DataAnalysis SolutionEnsembles/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding 5815-6180 /branches/DataAnalysis/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding 4458-4459,4462,4464 /branches/GP.Grammar.Editor/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding 6284-6795 /branches/HeuristicLab.Crossovers/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding 7343-7503 /branches/NET40/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding 5138-5162 /branches/ParallelEngine/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding 5175-5192 /branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding 6350-6627 /branches/Restructure trunk solution/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding 6828 /branches/SuccessProgressAnalysis/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding 5370-5682 /branches/Trunk/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding 6829-6865 /branches/VNS/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding 5594-5752 /branches/histogram/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding 5959-6341
-
Property
svn:mergeinfo
set to
(toggle deleted branches)
-
branches/HeuristicLab.Hive.Azure/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Analyzers/MinAverageMaxSymbolicExpressionTreeLengthAnalyzer.cs
r7270 r7669 73 73 private MinAverageMaxSymbolicExpressionTreeLengthAnalyzer(MinAverageMaxSymbolicExpressionTreeLengthAnalyzer original, Cloner cloner) 74 74 : base(original, cloner) { 75 valueAnalyzer = cloner.Clone(original.valueAnalyzer); 76 subScopesProcessor = cloner.Clone(original.subScopesProcessor); 75 77 AfterDeserialization(); 76 78 } -
branches/HeuristicLab.Hive.Azure/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Analyzers/SymbolicExpressionTreeLengthAnalyzer.cs
r7270 r7669 121 121 Parameters.Add(new ValueParameter<IntValue>(UpdateIntervalParameterName, "The interval in which the tree length analysis should be applied.", new IntValue(1))); 122 122 } 123 //necessary code to correct UpdateCounterParameter - type was changed from LookupParameter to ValueParameter 124 if (Parameters.ContainsKey(UpdateCounterParameterName) && (Parameters[UpdateCounterParameterName] is LookupParameter<IntValue>)) 125 Parameters.Remove(UpdateCounterParameterName); 123 126 if (!Parameters.ContainsKey(UpdateCounterParameterName)) { 124 127 Parameters.Add(new ValueParameter<IntValue>(UpdateCounterParameterName, "The value which counts how many times the operator was called since the last update", new IntValue(0))); -
branches/HeuristicLab.Hive.Azure/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers
-
Property
svn:ignore
set to
*.bak
-
Property
svn:ignore
set to
-
branches/HeuristicLab.Hive.Azure/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/SubtreeCrossover.cs
r7270 r7669 36 36 /// until a valid configuration is found. 37 37 /// </summary> 38 [Item("Subtree Crossover", "An operator which performs subtree swapping crossover.")]38 [Item("SubtreeSwappingCrossover", "An operator which performs subtree swapping crossover.")] 39 39 [StorableClass] 40 public sealedclass SubtreeCrossover : SymbolicExpressionTreeCrossover, ISymbolicExpressionTreeSizeConstraintOperator {40 public class SubtreeCrossover : SymbolicExpressionTreeCrossover, ISymbolicExpressionTreeSizeConstraintOperator { 41 41 private const string InternalCrossoverPointProbabilityParameterName = "InternalCrossoverPointProbability"; 42 42 private const string MaximumSymbolicExpressionTreeLengthParameterName = "MaximumSymbolicExpressionTreeLength"; 43 43 private const string MaximumSymbolicExpressionTreeDepthParameterName = "MaximumSymbolicExpressionTreeDepth"; 44 44 45 #region Parameter Properties 45 46 public IValueLookupParameter<PercentValue> InternalCrossoverPointProbabilityParameter { … … 65 66 #endregion 66 67 [StorableConstructor] 67 pr ivateSubtreeCrossover(bool deserializing) : base(deserializing) { }68 pr ivateSubtreeCrossover(SubtreeCrossover original, Cloner cloner) : base(original, cloner) { }68 protected SubtreeCrossover(bool deserializing) : base(deserializing) { } 69 protected SubtreeCrossover(SubtreeCrossover original, Cloner cloner) : base(original, cloner) { } 69 70 public SubtreeCrossover() 70 71 : base() { … … 78 79 } 79 80 80 p rotected override ISymbolicExpressionTree Cross(IRandom random,81 public override ISymbolicExpressionTree Crossover(IRandom random, 81 82 ISymbolicExpressionTree parent0, ISymbolicExpressionTree parent1) { 82 83 return Cross(random, parent0, parent1, InternalCrossoverPointProbability.Value, … … 94 95 // calculate the max length and depth that the inserted branch can have 95 96 int maxInsertedBranchLength = maxTreeLength - (parent0.Length - childLength); 96 int maxInsertedBranchDepth = maxTreeDepth - GetBranchLevel(parent0.Root,crossoverPoint0.Parent);97 int maxInsertedBranchDepth = maxTreeDepth - parent0.Root.GetBranchLevel(crossoverPoint0.Parent); 97 98 98 99 List<ISymbolicExpressionTreeNode> allowedBranches = new List<ISymbolicExpressionTreeNode>(); 99 100 parent1.Root.ForEachNodePostfix((n) => { 100 101 if (n.GetLength() <= maxInsertedBranchLength && 101 n.GetDepth() <= maxInsertedBranchDepth && 102 IsMatchingPointType(crossoverPoint0, n)) 102 n.GetDepth() <= maxInsertedBranchDepth && crossoverPoint0.IsMatchingPointType(n)) 103 103 allowedBranches.Add(n); 104 104 }); 105 105 // empty branch 106 if ( IsMatchingPointType(crossoverPoint0,null)) allowedBranches.Add(null);106 if (crossoverPoint0.IsMatchingPointType(null)) allowedBranches.Add(null); 107 107 108 108 if (allowedBranches.Count == 0) { … … 128 128 } 129 129 130 private static bool IsMatchingPointType(CutPoint cutPoint, ISymbolicExpressionTreeNode newChild) {131 var parent = cutPoint.Parent;132 if (newChild == null) {133 // make sure that one subtree can be removed and that only the last subtree is removed134 return parent.Grammar.GetMinimumSubtreeCount(parent.Symbol) < parent.SubtreeCount &&135 cutPoint.ChildIndex == parent.SubtreeCount - 1;136 } else {137 // check syntax constraints of direct parent - child relation138 if (!parent.Grammar.ContainsSymbol(newChild.Symbol) ||139 !parent.Grammar.IsAllowedChildSymbol(parent.Symbol, newChild.Symbol, cutPoint.ChildIndex)) return false;140 141 bool result = true;142 // check point type for the whole branch143 newChild.ForEachNodePostfix((n) => {144 result =145 result &&146 parent.Grammar.ContainsSymbol(n.Symbol) &&147 n.SubtreeCount >= parent.Grammar.GetMinimumSubtreeCount(n.Symbol) &&148 n.SubtreeCount <= parent.Grammar.GetMaximumSubtreeCount(n.Symbol);149 });150 return result;151 }152 }153 154 130 private static void SelectCrossoverPoint(IRandom random, ISymbolicExpressionTree parent0, double internalNodeProbability, int maxBranchLength, int maxBranchDepth, out CutPoint crossoverPoint) { 155 131 if (internalNodeProbability < 0.0 || internalNodeProbability > 1.0) throw new ArgumentException("internalNodeProbability"); … … 157 133 List<CutPoint> leafCrossoverPoints = new List<CutPoint>(); 158 134 parent0.Root.ForEachNodePostfix((n) => { 159 if (n.Subtree s.Any()&& n != parent0.Root) {135 if (n.SubtreeCount > 0 && n != parent0.Root) { 160 136 foreach (var child in n.Subtrees) { 161 137 if (child.GetLength() <= maxBranchLength && 162 138 child.GetDepth() <= maxBranchDepth) { 163 if (child.Subtree s.Any())139 if (child.SubtreeCount > 0) 164 140 internalCrossoverPoints.Add(new CutPoint(n, child)); 165 141 else … … 167 143 } 168 144 } 145 169 146 // add one additional extension point if the number of sub trees for the symbol is not full 170 147 if (n.SubtreeCount < n.Grammar.GetMaximumSubtreeCount(n.Symbol)) { … … 173 150 } 174 151 } 175 }); 152 } 153 ); 176 154 177 155 if (random.NextDouble() < internalNodeProbability) { … … 200 178 // select internal node if possible 201 179 allowedInternalBranches = (from branch in branches 202 where branch != null && branch.Subtree s.Any()180 where branch != null && branch.SubtreeCount > 0 203 181 select branch).ToList(); 204 182 if (allowedInternalBranches.Count > 0) { … … 207 185 // no internal nodes allowed => select leaf nodes 208 186 allowedLeafBranches = (from branch in branches 209 where branch == null || !branch.Subtrees.Any()187 where branch == null || branch.SubtreeCount == 0 210 188 select branch).ToList(); 211 189 return allowedLeafBranches.SelectRandom(random); … … 214 192 // select leaf node if possible 215 193 allowedLeafBranches = (from branch in branches 216 where branch == null || !branch.Subtrees.Any()194 where branch == null || branch.SubtreeCount == 0 217 195 select branch).ToList(); 218 196 if (allowedLeafBranches.Count > 0) { … … 220 198 } else { 221 199 allowedInternalBranches = (from branch in branches 222 where branch != null && branch.Subtree s.Any()200 where branch != null && branch.SubtreeCount > 0 223 201 select branch).ToList(); 224 202 return allowedInternalBranches.SelectRandom(random); … … 226 204 } 227 205 } 228 229 private static int GetBranchLevel(ISymbolicExpressionTreeNode root, ISymbolicExpressionTreeNode point) {230 if (root == point) return 0;231 foreach (var subtree in root.Subtrees) {232 int branchLevel = GetBranchLevel(subtree, point);233 if (branchLevel < int.MaxValue) return 1 + branchLevel;234 }235 return int.MaxValue;236 }237 206 } 238 207 } -
branches/HeuristicLab.Hive.Azure/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/SymbolicExpressionTreeCrossover.cs
r7270 r7669 23 23 using HeuristicLab.Common; 24 24 using HeuristicLab.Core; 25 using HeuristicLab.Data;26 25 using HeuristicLab.Parameters; 27 26 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; … … 66 65 throw new ArgumentException("Number of parents must be exactly two for symbolic expression tree crossover operators."); 67 66 68 ISymbolicExpressionTree result = Cross (Random, Parents[0], Parents[1]);67 ISymbolicExpressionTree result = Crossover(Random, Parents[0], Parents[1]); 69 68 70 69 Child = result; … … 72 71 } 73 72 74 protected abstract ISymbolicExpressionTree Cross(IRandom random, 75 ISymbolicExpressionTree parent0, ISymbolicExpressionTree parent1); 73 public abstract ISymbolicExpressionTree Crossover(IRandom random, ISymbolicExpressionTree parent0, ISymbolicExpressionTree parent1); 76 74 } 77 75 } -
branches/HeuristicLab.Hive.Azure/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/CutPoint.cs
r7270 r7669 22 22 23 23 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding { 24 internalclass CutPoint {24 public class CutPoint { 25 25 public ISymbolicExpressionTreeNode Parent { get; set; } 26 26 public ISymbolicExpressionTreeNode Child { get; set; } … … 39 39 this.Child = null; 40 40 } 41 42 public bool IsMatchingPointType(ISymbolicExpressionTreeNode newChild) { 43 var parent = this.Parent; 44 if (newChild == null) { 45 // make sure that one subtree can be removed and that only the last subtree is removed 46 return parent.Grammar.GetMinimumSubtreeCount(parent.Symbol) < parent.SubtreeCount && 47 this.ChildIndex == parent.SubtreeCount - 1; 48 } else { 49 // check syntax constraints of direct parent - child relation 50 if (!parent.Grammar.ContainsSymbol(newChild.Symbol) || 51 !parent.Grammar.IsAllowedChildSymbol(parent.Symbol, newChild.Symbol, this.ChildIndex)) 52 return false; 53 54 bool result = true; 55 // check point type for the whole branch 56 newChild.ForEachNodePostfix((n) => { 57 result = 58 result && 59 parent.Grammar.ContainsSymbol(n.Symbol) && 60 n.SubtreeCount >= parent.Grammar.GetMinimumSubtreeCount(n.Symbol) && 61 n.SubtreeCount <= parent.Grammar.GetMaximumSubtreeCount(n.Symbol); 62 }); 63 return result; 64 } 65 } 41 66 } 42 67 } -
branches/HeuristicLab.Hive.Azure/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Interfaces/ISymbolicExpressionTreeNode.cs
r7270 r7669 32 32 int GetDepth(); 33 33 int GetLength(); 34 int GetBranchLevel(ISymbolicExpressionTreeNode child); 34 35 35 36 IEnumerable<ISymbolicExpressionTreeNode> IterateNodesPostfix(); -
branches/HeuristicLab.Hive.Azure/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Interfaces/Operators/ISymbolicExpressionTreeCrossover.cs
r7270 r7669 30 30 ILookupParameter<ItemArray<ISymbolicExpressionTree>> ParentsParameter { get; } 31 31 ILookupParameter<ISymbolicExpressionTree> ChildParameter { get; } 32 ISymbolicExpressionTree Crossover(IRandom random, ISymbolicExpressionTree parent0, ISymbolicExpressionTree parent1); 32 33 } 33 34 } -
branches/HeuristicLab.Hive.Azure/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/ChangeNodeTypeManipulation.cs
r7270 r7669 24 24 using HeuristicLab.Core; 25 25 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 26 using System.Collections.Generic; 26 27 27 28 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding { … … 29 30 [Item("ChangeNodeTypeManipulation", "Selects a random tree node and changes the symbol.")] 30 31 public sealed class ChangeNodeTypeManipulation : SymbolicExpressionTreeManipulator { 32 private const int MAX_TRIES = 100; 33 31 34 [StorableConstructor] 32 35 private ChangeNodeTypeManipulation(bool deserializing) : base(deserializing) { } … … 43 46 44 47 public static void ChangeNodeType(IRandom random, ISymbolicExpressionTree symbolicExpressionTree) { 45 // select any node as parent (except the root node) 46 var manipulationPoints = (from parent in symbolicExpressionTree.Root.IterateNodesPrefix().Skip(1) 47 let subtreeCount = parent.Subtrees.Count() 48 from subtreeIndex in Enumerable.Range(0, subtreeCount) 49 let subtree = parent.GetSubtree(subtreeIndex) 50 let existingSubtreeCount = subtree.Subtrees.Count() 51 // find possible symbols for the node (also considering the existing branches below it) 52 let allowedSymbols = (from symbol in parent.Grammar.GetAllowedChildSymbols(parent.Symbol, subtreeIndex) 53 // do not replace the existing symbol with itself 54 where symbol.Name != subtree.Symbol.Name 55 where symbol.InitialFrequency > 0 56 where existingSubtreeCount <= parent.Grammar.GetMaximumSubtreeCount(symbol) 57 where existingSubtreeCount >= parent.Grammar.GetMinimumSubtreeCount(symbol) 58 // keep only symbols that are still possible considering the existing sub-trees 59 where (from existingSubtreeIndex in Enumerable.Range(0, existingSubtreeCount) 60 let existingSubtree = subtree.GetSubtree(existingSubtreeIndex) 61 select parent.Grammar.IsAllowedChildSymbol(symbol, existingSubtree.Symbol, existingSubtreeIndex)) 62 .All(x => x == true) 63 select symbol) 64 .ToList() 65 where allowedSymbols.Count() > 0 66 select new { Parent = parent, Child = subtree, Index = subtreeIndex, AllowedSymbols = allowedSymbols }) 67 .ToList(); 68 if (manipulationPoints.Count == 0) { return; } 69 var selectedManipulationPoint = manipulationPoints.SelectRandom(random); 48 List<ISymbol> allowedSymbols = new List<ISymbol>(); 49 ISymbolicExpressionTreeNode parent; 50 int childIndex; 51 ISymbolicExpressionTreeNode child; 52 // repeat until a fitting parent and child are found (MAX_TRIES times) 53 int tries = 0; 54 do { 55 parent = symbolicExpressionTree.Root.IterateNodesPrefix().Skip(1).Where(n => n.SubtreeCount > 0).SelectRandom(random); 56 childIndex = random.Next(parent.SubtreeCount); 70 57 71 var weights = selectedManipulationPoint.AllowedSymbols.Select(s => s.InitialFrequency).ToList(); 72 var newSymbol = selectedManipulationPoint.AllowedSymbols.SelectRandom(weights, random); 58 child = parent.GetSubtree(childIndex); 59 int existingSubtreeCount = child.SubtreeCount; 60 allowedSymbols.Clear(); 61 foreach (var symbol in parent.Grammar.GetAllowedChildSymbols(parent.Symbol, childIndex)) { 62 // check basic properties that the new symbol must have 63 if (symbol.Name != child.Symbol.Name && 64 symbol.InitialFrequency > 0 && 65 existingSubtreeCount <= parent.Grammar.GetMinimumSubtreeCount(symbol) && 66 existingSubtreeCount >= parent.Grammar.GetMaximumSubtreeCount(symbol)) { 67 // check that all existing subtrees are also allowed for the new symbol 68 bool allExistingSubtreesAllowed = true; 69 for (int existingSubtreeIndex = 0; existingSubtreeIndex < existingSubtreeCount && allExistingSubtreesAllowed; existingSubtreeIndex++) { 70 var existingSubtree = child.GetSubtree(existingSubtreeIndex); 71 allExistingSubtreesAllowed &= parent.Grammar.IsAllowedChildSymbol(symbol, existingSubtree.Symbol, existingSubtreeIndex); 72 } 73 if (allExistingSubtreesAllowed) { 74 allowedSymbols.Add(symbol); 75 } 76 } 77 } 78 tries++; 79 } while (tries < MAX_TRIES && allowedSymbols.Count == 0); 73 80 74 // replace the old node with the new node 75 var newNode = newSymbol.CreateTreeNode(); 76 if (newNode.HasLocalParameters) 77 newNode.ResetLocalParameters(random); 78 foreach (var subtree in selectedManipulationPoint.Child.Subtrees) 79 newNode.AddSubtree(subtree); 80 selectedManipulationPoint.Parent.RemoveSubtree(selectedManipulationPoint.Index); 81 selectedManipulationPoint.Parent.InsertSubtree(selectedManipulationPoint.Index, newNode); 81 if (tries < MAX_TRIES) { 82 var weights = allowedSymbols.Select(s => s.InitialFrequency).ToList(); 83 var newSymbol = allowedSymbols.SelectRandom(weights, random); 84 85 // replace the old node with the new node 86 var newNode = newSymbol.CreateTreeNode(); 87 if (newNode.HasLocalParameters) 88 newNode.ResetLocalParameters(random); 89 foreach (var subtree in child.Subtrees) 90 newNode.AddSubtree(subtree); 91 parent.RemoveSubtree(childIndex); 92 parent.InsertSubtree(childIndex, newNode); 93 } 82 94 } 83 95 } -
branches/HeuristicLab.Hive.Azure/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/ReplaceBranchManipulation.cs
r7270 r7669 26 26 using HeuristicLab.Parameters; 27 27 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 28 using System.Collections.Generic; 28 29 29 30 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding { … … 31 32 [Item("ReplaceBranchManipulation", "Selects a branch of the tree randomly and replaces it with a newly initialized branch (using PTC2).")] 32 33 public sealed class ReplaceBranchManipulation : SymbolicExpressionTreeManipulator, ISymbolicExpressionTreeSizeConstraintOperator { 34 private const int MAX_TRIES = 100; 33 35 private const string MaximumSymbolicExpressionTreeLengthParameterName = "MaximumSymbolicExpressionTreeLength"; 34 36 private const string MaximumSymbolicExpressionTreeDepthParameterName = "MaximumSymbolicExpressionTreeDepth"; … … 68 70 69 71 public static void ReplaceRandomBranch(IRandom random, ISymbolicExpressionTree symbolicExpressionTree, int maxTreeLength, int maxTreeDepth) { 70 // select any node as parent (except the root node) 71 var manipulationPoints = (from parent in symbolicExpressionTree.Root.IterateNodesPrefix().Skip(1) 72 from subtree in parent.Subtrees 73 let subtreeIndex = parent.IndexOfSubtree(subtree) 74 let maxLength = maxTreeLength - symbolicExpressionTree.Length + subtree.GetLength() 75 let maxDepth = maxTreeDepth - symbolicExpressionTree.Depth + subtree.GetDepth() 76 // find possible symbols for the node (also considering the existing branches below it) 77 let allowedSymbols = (from symbol in parent.Grammar.GetAllowedChildSymbols(parent.Symbol, subtreeIndex) 78 // do not replace symbol with the same symbol 79 where symbol.Name != subtree.Symbol.Name 80 where symbol.InitialFrequency > 0 81 where parent.Grammar.GetMinimumExpressionDepth(symbol) + 1 <= maxDepth 82 where parent.Grammar.GetMinimumExpressionLength(symbol) <= maxLength 83 select symbol) 84 .ToList() 85 where allowedSymbols.Count > 0 86 select new { 87 Parent = parent, 88 Child = subtree, 89 Index = subtreeIndex, 90 AllowedSymbols = allowedSymbols, 91 MaxLength = maxLength, 92 MaxDepth = maxDepth 93 }) 94 .ToList(); 72 var allowedSymbols = new List<ISymbol>(); 73 ISymbolicExpressionTreeNode parent; 74 int childIndex; 75 int maxLength; 76 int maxDepth; 77 // repeat until a fitting parent and child are found (MAX_TRIES times) 78 int tries = 0; 79 do { 80 parent = symbolicExpressionTree.Root.IterateNodesPrefix().Skip(1).Where(n => n.SubtreeCount > 0).SelectRandom(random); 81 childIndex = random.Next(parent.SubtreeCount); 82 var child = parent.GetSubtree(childIndex); 83 maxLength = maxTreeLength - symbolicExpressionTree.Length + child.GetLength(); 84 maxDepth = maxTreeDepth - symbolicExpressionTree.Depth + child.GetDepth(); 95 85 96 if (manipulationPoints.Count == 0) return; 97 var selectedManipulationPoint = manipulationPoints.SelectRandom(random); 86 allowedSymbols.Clear(); 87 foreach (var symbol in parent.Grammar.GetAllowedChildSymbols(parent.Symbol, childIndex)) { 88 // check basic properties that the new symbol must have 89 if (symbol.Name != child.Symbol.Name && 90 symbol.InitialFrequency > 0 && 91 parent.Grammar.GetMinimumExpressionDepth(symbol) + 1 <= maxDepth && 92 parent.Grammar.GetMinimumExpressionLength(symbol) <= maxLength) { 93 allowedSymbols.Add(symbol); 94 } 95 } 96 tries++; 97 } while (tries < MAX_TRIES && allowedSymbols.Count == 0); 98 98 99 var weights = selectedManipulationPoint.AllowedSymbols.Select(s => s.InitialFrequency).ToList(); 100 var seedSymbol = selectedManipulationPoint.AllowedSymbols.SelectRandom(weights, random); 101 // replace the old node with the new node 102 var seedNode = seedSymbol.CreateTreeNode(); 103 if (seedNode.HasLocalParameters) 104 seedNode.ResetLocalParameters(random); 99 if (tries < MAX_TRIES) { 100 var weights = allowedSymbols.Select(s => s.InitialFrequency).ToList(); 101 var seedSymbol = allowedSymbols.SelectRandom(weights, random); 102 // replace the old node with the new node 103 var seedNode = seedSymbol.CreateTreeNode(); 104 if (seedNode.HasLocalParameters) 105 seedNode.ResetLocalParameters(random); 105 106 106 selectedManipulationPoint.Parent.RemoveSubtree(selectedManipulationPoint.Index); 107 selectedManipulationPoint.Parent.InsertSubtree(selectedManipulationPoint.Index, seedNode); 108 ProbabilisticTreeCreator.PTC2(random, seedNode, selectedManipulationPoint.MaxLength, selectedManipulationPoint.MaxDepth); 107 parent.RemoveSubtree(childIndex); 108 parent.InsertSubtree(childIndex, seedNode); 109 ProbabilisticTreeCreator.PTC2(random, seedNode, maxLength, maxDepth); 110 } 109 111 } 110 112 } -
branches/HeuristicLab.Hive.Azure/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionGrammarBase.cs
r7270 r7669 308 308 } 309 309 public virtual IEnumerable<ISymbol> AllowedSymbols { 310 get { return Symbols.Where(s => s.Enabled); }310 get { foreach (var s in Symbols) if (s.Enabled) yield return s; } 311 311 } 312 312 public virtual bool ContainsSymbol(ISymbol symbol) { … … 316 316 private readonly Dictionary<Tuple<string, string>, bool> cachedIsAllowedChildSymbol; 317 317 public virtual bool IsAllowedChildSymbol(ISymbol parent, ISymbol child) { 318 if (allowedChildSymbols.Count == 0) return false; 318 319 if (!child.Enabled) return false; 319 320 320 321 bool result; 321 if (cachedIsAllowedChildSymbol.TryGetValue(Tuple.Create(parent.Name, child.Name), out result)) return result; 322 var key = Tuple.Create(parent.Name, child.Name); 323 if (cachedIsAllowedChildSymbol.TryGetValue(key, out result)) return result; 324 322 325 List<string> temp; 323 326 if (allowedChildSymbols.TryGetValue(parent.Name, out temp)) { 324 327 //if (temp.Contains(child.Name)) return true; 325 if (temp.SelectMany(s => GetSymbol(s).Flatten()). Where(s => s.Name == child.Name).Any()) {326 cachedIsAllowedChildSymbol.Add( Tuple.Create(parent.Name, child.Name), true);328 if (temp.SelectMany(s => GetSymbol(s).Flatten()).Any(s => s.Name == child.Name)) { 329 cachedIsAllowedChildSymbol.Add(key, true); 327 330 return true; 328 331 } 329 332 } 330 cachedIsAllowedChildSymbol.Add( Tuple.Create(parent.Name, child.Name), false);333 cachedIsAllowedChildSymbol.Add(key, false); 331 334 return false; 332 335 } … … 336 339 if (!child.Enabled) return false; 337 340 if (IsAllowedChildSymbol(parent, child)) return true; 341 if (allowedChildSymbolsPerIndex.Count == 0) return false; 338 342 339 343 bool result; 340 if (cachedIsAllowedChildSymbolIndex.TryGetValue(Tuple.Create(parent.Name, child.Name, argumentIndex), out result)) return result; 344 var key = Tuple.Create(parent.Name, child.Name, argumentIndex); 345 if (cachedIsAllowedChildSymbolIndex.TryGetValue(key, out result)) return result; 346 341 347 List<string> temp; 342 var key = Tuple.Create(parent.Name, argumentIndex); 343 if (allowedChildSymbolsPerIndex.TryGetValue(key, out temp)) { 344 //if (temp.Contains(child.Name)) return true; 345 if (temp.SelectMany(s => GetSymbol(s).Flatten()).Where(s => s.Name == child.Name).Any()) { 346 cachedIsAllowedChildSymbolIndex.Add(Tuple.Create(parent.Name, child.Name, argumentIndex), true); 348 if (allowedChildSymbolsPerIndex.TryGetValue(Tuple.Create(parent.Name, argumentIndex), out temp)) { 349 if (temp.SelectMany(s => GetSymbol(s).Flatten()).Any(s => s.Name == child.Name)) { 350 cachedIsAllowedChildSymbolIndex.Add(key, true); 347 351 return true; 348 352 } 349 353 } 350 cachedIsAllowedChildSymbolIndex.Add( Tuple.Create(parent.Name, child.Name, argumentIndex), false);354 cachedIsAllowedChildSymbolIndex.Add(key, false); 351 355 return false; 352 356 } 353 357 354 358 public IEnumerable<ISymbol> GetAllowedChildSymbols(ISymbol parent) { 355 return from child in AllowedSymbols356 where IsAllowedChildSymbol(parent, child)357 select child;359 foreach (ISymbol child in AllowedSymbols) { 360 if (IsAllowedChildSymbol(parent, child)) yield return child; 361 } 358 362 } 359 363 360 364 public IEnumerable<ISymbol> GetAllowedChildSymbols(ISymbol parent, int argumentIndex) { 361 return from child in AllowedSymbols362 where IsAllowedChildSymbol(parent, child, argumentIndex)363 select child;365 foreach (ISymbol child in AllowedSymbols) { 366 if (IsAllowedChildSymbol(parent, child, argumentIndex)) yield return child; 367 } 364 368 } 365 369 -
branches/HeuristicLab.Hive.Azure/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeGrammar.cs
r7270 r7669 22 22 using System; 23 23 using System.Collections.Generic; 24 using System.Linq;25 24 using HeuristicLab.Common; 26 25 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; … … 51 50 52 51 public override IEnumerable<ISymbol> Symbols { 53 get { return grammar.Symbols.Union(base.Symbols); } 52 get { 53 foreach (var s in grammar.Symbols) yield return s; 54 foreach (var s in base.symbols.Values) yield return s; 55 } 54 56 } 55 57 public override IEnumerable<ISymbol> AllowedSymbols { -
branches/HeuristicLab.Hive.Azure/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeNode.cs
r7270 r7669 55 55 : base() { 56 56 symbol = original.symbol; // symbols are reused 57 length = original.length; 58 depth = original.depth; 57 59 if (original.subtrees != null) { 58 60 subtrees = new List<ISymbolicExpressionTreeNode>(original.subtrees.Count); … … 125 127 } 126 128 129 public int GetBranchLevel(ISymbolicExpressionTreeNode child) { 130 return GetBranchLevel(this, child); 131 } 132 133 private static int GetBranchLevel(ISymbolicExpressionTreeNode root, ISymbolicExpressionTreeNode point) { 134 if (root == point) 135 return 0; 136 foreach (var subtree in root.Subtrees) { 137 int branchLevel = GetBranchLevel(subtree, point); 138 if (branchLevel < int.MaxValue) 139 return 1 + branchLevel; 140 } 141 return int.MaxValue; 142 } 143 127 144 public virtual void ResetLocalParameters(IRandom random) { } 128 145 public virtual void ShakeLocalParameters(IRandom random, double shakingFactor) { }
Note: See TracChangeset
for help on using the changeset viewer.