Changeset 324
- Timestamp:
- 06/18/08 16:20:26 (16 years ago)
- Location:
- trunk/sources
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Functions/BakedFunctionTree.cs
r323 r324 132 132 } 133 133 134 public int Size { 135 get { 136 if(treesExpanded) { 137 int size = 1; 138 foreach(BakedFunctionTree tree in subTrees) { 139 size += tree.Size; 140 } 141 return size; 142 } else 143 return linearRepresentation.Count; 144 } 145 } 146 147 public int Height { 148 get { 149 if(treesExpanded) { 150 int height = 0; 151 foreach(IFunctionTree subTree in subTrees) { 152 int curHeight = subTree.Height; 153 if(curHeight > height) height = curHeight; 154 } 155 return height+1; 156 } else { 157 int nextBranchStart; 158 return BranchHeight(0, out nextBranchStart); 159 } 160 } 161 } 162 163 private int BranchHeight(int branchStart, out int nextBranchStart) { 164 LightWeightFunction f = linearRepresentation[branchStart]; 165 int height = 0; 166 branchStart++; 167 for(int i = 0; i < f.arity; i++) { 168 int curHeight = BranchHeight(branchStart, out nextBranchStart); 169 if(curHeight > height) height = curHeight; 170 branchStart = nextBranchStart; 171 } 172 nextBranchStart = branchStart; 173 return height + 1; 174 } 175 134 176 public IList<IFunctionTree> SubTrees { 135 177 get { … … 142 184 int length = BranchLength(branchIndex); 143 185 for(int j = branchIndex; j < branchIndex + length; j++) { 144 subTree.linearRepresentation.Add(linearRepresentation[j] .Clone());186 subTree.linearRepresentation.Add(linearRepresentation[j]); 145 187 } 146 188 branchIndex += length; -
trunk/sources/HeuristicLab.Functions/IFunctionTree.cs
r155 r324 28 28 namespace HeuristicLab.Functions { 29 29 public interface IFunctionTree : IItem { 30 int Size { get; } 31 int Height { get; } 30 32 IList<IFunctionTree> SubTrees { get; } 31 33 ICollection<IVariable> LocalVariables { get; } -
trunk/sources/HeuristicLab.StructureIdentification/Manipulation/ChangeNodeTypeManipulation.cs
r238 r324 96 96 // calculate the height and size difference and 97 97 // check if the size of the new tree is still in the allowed bounds 98 int oldChildSize = gardener.GetTreeSize(selectedChild);99 int oldChildHeight = gardener.GetTreeSize(selectedChild);100 int newChildSize = gardener.GetTreeSize(newFunctionTree);101 int newChildHeight = gardener.GetTreeHeight(newFunctionTree);98 int oldChildSize = selectedChild.Size; 99 int oldChildHeight = selectedChild.Height; 100 int newChildSize = newFunctionTree.Size; 101 int newChildHeight = newFunctionTree.Height; 102 102 if((treeHeight.Data - oldChildHeight) + newChildHeight > maxTreeHeight || 103 103 (treeSize.Data - oldChildSize) + newChildSize > maxTreeSize) { … … 118 118 // update size and height 119 119 treeSize.Data = (treeSize.Data - oldChildSize) + newChildSize; 120 treeHeight.Data = gardener.GetTreeHeight(root); // must recalculate height because we can't know wether the manipulated branch was the deepest branch120 treeHeight.Data = root.Height; // must recalculate height because we can't know wether the manipulated branch was the deepest branch 121 121 // check if whole tree is ok 122 122 Debug.Assert(gardener.IsValidTree(root)); -
trunk/sources/HeuristicLab.StructureIdentification/Manipulation/CutOutNodeManipulation.cs
r238 r324 74 74 if (root.SubTrees.Count > 0) { 75 75 root = root.SubTrees[random.Next(root.SubTrees.Count)]; 76 GetVariableValue<IntData>("TreeSize", scope, true).Data = gardener.GetTreeSize(root);77 GetVariableValue<IntData>("TreeHeight", scope, true).Data = gardener.GetTreeHeight(root);76 GetVariableValue<IntData>("TreeSize", scope, true).Data = root.Size; 77 GetVariableValue<IntData>("TreeHeight", scope, true).Data = root.Height; 78 78 // update the variable 79 79 scope.GetVariable(scope.TranslateName("FunctionTree")).Value = root; … … 85 85 IFunctionTree newTree; 86 86 newTree = gardener.CreateRandomTree(gardener.Terminals, 1, 1); 87 GetVariableValue<IntData>("TreeSize", scope, true).Data = gardener.GetTreeSize(newTree);88 GetVariableValue<IntData>("TreeHeight", scope, true).Data = gardener.GetTreeHeight(newTree);87 GetVariableValue<IntData>("TreeSize", scope, true).Data = newTree.Size; 88 GetVariableValue<IntData>("TreeHeight", scope, true).Data = newTree.Height; 89 89 // update the variable 90 90 scope.GetVariable(scope.TranslateName("FunctionTree")).Value = newTree; … … 107 107 Debug.Assert(gardener.IsValidTree(root)); 108 108 // update the size and height of our tree 109 GetVariableValue<IntData>("TreeSize", scope, true).Data = gardener.GetTreeSize(root);110 GetVariableValue<IntData>("TreeHeight", scope, true).Data = gardener.GetTreeHeight(root);109 GetVariableValue<IntData>("TreeSize", scope, true).Data = root.Size; 110 GetVariableValue<IntData>("TreeHeight", scope, true).Data = root.Height; 111 111 // don't need to schedule initialization operations 112 112 return null; … … 118 118 parent.RemoveSubTree(childIndex); 119 119 // then determine the number of nodes left over after the child has been removed! 120 int remainingNodes = gardener.GetTreeSize(root);120 int remainingNodes = root.Size; 121 121 allowedFunctions = gardener.GetAllowedSubFunctions(parent.Function, childIndex); 122 122 IFunctionTree newFunctionTree = gardener.CreateRandomTree(allowedFunctions, maxTreeSize - remainingNodes, maxTreeHeight - parentLevel); 123 123 parent.InsertSubTree(childIndex, newFunctionTree); 124 GetVariableValue<IntData>("TreeSize", scope, true).Data = gardener.GetTreeSize(root);125 GetVariableValue<IntData>("TreeHeight", scope, true).Data = gardener.GetTreeHeight(root);124 GetVariableValue<IntData>("TreeSize", scope, true).Data = root.Size; 125 GetVariableValue<IntData>("TreeHeight", scope, true).Data = root.Height; 126 126 Debug.Assert(gardener.IsValidTree(root)); 127 127 // schedule an initialization operation for the new function-tree -
trunk/sources/HeuristicLab.StructureIdentification/Manipulation/DeleteSubTreeManipulation.cs
r238 r324 64 64 Debug.Assert(gardener.IsValidTree(newTree)); 65 65 // update sizes to match the new tree 66 GetVariableValue<IntData>("TreeSize", scope, true).Data = gardener.GetTreeSize(newTree);67 GetVariableValue<IntData>("TreeHeight", scope, true).Data = gardener.GetTreeHeight(newTree);66 GetVariableValue<IntData>("TreeSize", scope, true).Data = newTree.Size; 67 GetVariableValue<IntData>("TreeHeight", scope, true).Data = newTree.Height; 68 68 scope.GetVariable(scope.TranslateName("FunctionTree")).Value = newTree; 69 69 … … 86 86 87 87 Debug.Assert(gardener.IsValidTree(root)); 88 GetVariableValue<IntData>("TreeSize", scope, true).Data = gardener.GetTreeSize(root);89 GetVariableValue<IntData>("TreeHeight", scope, true).Data = gardener.GetTreeHeight(root);88 GetVariableValue<IntData>("TreeSize", scope, true).Data = root.Size; 89 GetVariableValue<IntData>("TreeHeight", scope, true).Data = root.Height; 90 90 // root hasn't changed so don't need to update 'FunctionTree' variable 91 91 return null; … … 97 97 parent.InsertSubTree(childIndex, newFunctionTree); 98 98 Debug.Assert(gardener.IsValidTree(root)); 99 GetVariableValue<IntData>("TreeSize", scope, true).Data = gardener.GetTreeSize(root);100 GetVariableValue<IntData>("TreeHeight", scope, true).Data = gardener.GetTreeHeight(root);99 GetVariableValue<IntData>("TreeSize", scope, true).Data = root.Size; 100 GetVariableValue<IntData>("TreeHeight", scope, true).Data = root.Height; 101 101 // again the root hasn't changed so we don't need to update the 'FunctionTree' variable 102 102 // but we have to return an initialization operation for the newly created tree -
trunk/sources/HeuristicLab.StructureIdentification/Manipulation/SubstituteSubTreeManipulation.cs
r238 r324 65 65 66 66 // update the variables in the scope with the new values 67 GetVariableValue<IntData>("TreeSize", scope, true).Data = gardener.GetTreeSize(newTree);68 GetVariableValue<IntData>("TreeHeight", scope, true).Data = gardener.GetTreeHeight(newTree);67 GetVariableValue<IntData>("TreeSize", scope, true).Data = newTree.Size; 68 GetVariableValue<IntData>("TreeHeight", scope, true).Data = newTree.Height; 69 69 scope.GetVariable(scope.TranslateName("FunctionTree")).Value = newTree; 70 70 … … 86 86 int parentLevel = gardener.GetBranchLevel(root, parent); 87 87 int maxSubTreeHeight = maxTreeHeight - parentLevel; 88 int maxSubTreeSize = maxTreeSize - (treeSize - gardener.GetTreeSize(parent.SubTrees[childIndex]));88 int maxSubTreeSize = maxTreeSize - (treeSize - parent.SubTrees[childIndex].Size); 89 89 90 90 // create a random function tree … … 95 95 Debug.Assert(gardener.IsValidTree(root)); 96 96 // update the values of treeSize and treeHeight 97 GetVariableValue<IntData>("TreeSize", scope, true).Data = gardener.GetTreeSize(root);98 GetVariableValue<IntData>("TreeHeight", scope, true).Data = gardener.GetTreeHeight(root);97 GetVariableValue<IntData>("TreeSize", scope, true).Data = root.Size; 98 GetVariableValue<IntData>("TreeHeight", scope, true).Data = root.Height; 99 99 // the root hasn't changed so we don't need to update 100 100 // return a CompositeOperation that randomly initializes all nodes of the new subtree -
trunk/sources/HeuristicLab.StructureIdentification/ProbabilisticTreeCreator.cs
r286 r324 58 58 IFunctionTree root = gardener.PTC2(random, treeSize, maxTreeHeight); 59 59 60 int actualTreeSize = gardener.GetTreeSize(root);61 int actualTreeHeight = gardener.GetTreeHeight(root);60 int actualTreeSize = root.Size; 61 int actualTreeHeight = root.Height; 62 62 63 63 scope.AddVariable(new HeuristicLab.Core.Variable(scope.TranslateName("FunctionTree"), root)); -
trunk/sources/HeuristicLab.StructureIdentification/RampedTreeCreator.cs
r286 r324 63 63 } 64 64 65 int actualTreeSize = gardener.GetTreeSize(root);66 int actualTreeHeight = gardener.GetTreeHeight(root);65 int actualTreeSize = root.Size; 66 int actualTreeHeight = root.Height; 67 67 68 68 scope.AddVariable(new HeuristicLab.Core.Variable(scope.TranslateName("FunctionTree"), root)); -
trunk/sources/HeuristicLab.StructureIdentification/Recombination/SizeFairCrossOver.cs
r238 r324 89 89 90 90 91 int newTreeSize = gardener.GetTreeSize(newTree);92 int newTreeHeight = gardener.GetTreeHeight(newTree);91 int newTreeSize = newTree.Size; 92 int newTreeHeight = newTree.Height; 93 93 child.AddVariable(new HeuristicLab.Core.Variable(scope.TranslateName("FunctionTree"), newTree)); 94 94 child.AddVariable(new HeuristicLab.Core.Variable(scope.TranslateName("TreeSize"), new IntData(newTreeSize))); … … 133 133 134 134 // recalculate the size and height of tree1 (the one that we want to insert) because we need to check constraints later on 135 tree1Size = gardener.GetTreeSize(tree1);136 tree1Height = gardener.GetTreeHeight(tree1);135 tree1Size = tree1.Size; 136 tree1Height = tree1.Height; 137 137 138 138 List<int> possibleChildIndices = new List<int>(); … … 143 143 // find the list of allowed indices (regarding allowed sub-trees, maxTreeSize and maxTreeHeight) 144 144 for(int i = 0; i < tree0.SubTrees.Count; i++) { 145 int subTreeSize = gardener.GetTreeSize(tree0.SubTrees[i]);145 int subTreeSize = tree0.SubTrees[i].Size; 146 146 147 147 // the index is ok when the function is allowed as sub-tree and we don't violate the maxSize and maxHeight constraints … … 170 170 // go down in node2: 171 171 tree1 = tree1.SubTrees[random.Next(tree1.SubTrees.Count)]; 172 tree1Size = gardener.GetTreeSize(tree1);173 tree1Height = gardener.GetTreeHeight(tree1);172 tree1Size = tree1.Size; 173 tree1Height = tree1.Height; 174 174 } else { 175 175 // could neither go up or down ... don't know what to do ... give up … … 180 180 possibleChildIndices.Clear(); 181 181 for(int i = 0; i < tree0.SubTrees.Count; i++) { 182 int subTreeSize = gardener.GetTreeSize(tree0.SubTrees[i]);182 int subTreeSize = tree0.SubTrees[i].Size; 183 183 184 184 // when the function is allowed as sub-tree and we don't violate the maxSize and maxHeight constraints -
trunk/sources/HeuristicLab.StructureIdentification/TreeGardener.cs
r289 r324 241 241 242 242 #region tree information gathering 243 internal int GetTreeSize(IFunctionTree tree) {244 return 1 + tree.SubTrees.Sum(f => GetTreeSize(f));245 }246 247 internal int GetTreeHeight(IFunctionTree tree) {248 if(tree.SubTrees.Count == 0) return 1;249 return 1 + tree.SubTrees.Max(f => GetTreeHeight(f));250 }243 //internal int GetTreeSize(IFunctionTree tree) { 244 // return 1 + tree.SubTrees.Sum(f => GetTreeSize(f)); 245 //} 246 247 //internal int GetTreeHeight(IFunctionTree tree) { 248 // if(tree.SubTrees.Count == 0) return 1; 249 // return 1 + tree.SubTrees.Max(f => GetTreeHeight(f)); 250 //} 251 251 252 252 internal IFunctionTree GetRandomParentNode(IFunctionTree tree) {
Note: See TracChangeset
for help on using the changeset viewer.