Changeset 3360 for trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureAlteringOperators/ArgumentCreater.cs
- Timestamp:
- 04/15/10 19:58:42 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureAlteringOperators/ArgumentCreater.cs
r3338 r3360 96 96 // append a new argument branch after expanding all argument nodes 97 97 var clonedBranch = (SymbolicExpressionTreeNode)replacedBranch.Clone(); 98 ReplaceArgumentsInBranch(clonedBranch, invocationNode.SubTrees);98 clonedBranch = ReplaceArgumentsInBranch(clonedBranch, invocationNode.SubTrees); 99 99 invocationNode.InsertSubTree(newArgumentIndex, clonedBranch); 100 100 } … … 113 113 foreach (var subtree in symbolicExpressionTree.Root.SubTrees) { 114 114 // when the changed function is known in the branch then update the number of arguments 115 var matchingSymbol = subtree.Grammar.Symbols. Where(s => s.Name == selectedDefunBranch.FunctionName).SingleOrDefault();115 var matchingSymbol = subtree.Grammar.Symbols.OfType<InvokeFunction>().Where(s => s.FunctionName == selectedDefunBranch.FunctionName).SingleOrDefault(); 116 116 if (matchingSymbol != null) { 117 117 subtree.Grammar.SetMinSubtreeCount(matchingSymbol, selectedDefunBranch.NumberOfArguments); 118 118 subtree.Grammar.SetMaxSubtreeCount(matchingSymbol, selectedDefunBranch.NumberOfArguments); 119 foreach (var child in subtree.GetAllowedSymbols(0)) { 120 for (int i = 0; i < subtree.Grammar.GetMaxSubtreeCount(matchingSymbol); i++) { 121 subtree.Grammar.SetAllowedChild(matchingSymbol, child, i); 122 } 123 } 119 124 } 120 125 } … … 122 127 } 123 128 124 private static voidReplaceArgumentsInBranch(SymbolicExpressionTreeNode branch, IList<SymbolicExpressionTreeNode> argumentTrees) {125 // check if any subtree is an argument node126 for (int subtreeIndex = 0; subtreeIndex < branch.SubTrees.Count; subtreeIndex++) {127 var subtree = branch.SubTrees[subtreeIndex];128 var argNode = subtree as ArgumentTreeNode;129 if (argNode != null){130 // replace argument nodes by a clone of the original subtree that provided the result for the argument node131 branch.SubTrees[subtreeIndex] = (SymbolicExpressionTreeNode)argumentTrees[argNode.Symbol.ArgumentIndex].Clone();132 } else {133 // recursively replace arguments in all branches134 ReplaceArgumentsInBranch(subtree, argumentTrees);129 private static SymbolicExpressionTreeNode ReplaceArgumentsInBranch(SymbolicExpressionTreeNode branch, IList<SymbolicExpressionTreeNode> argumentTrees) { 130 if (branch is ArgumentTreeNode) { 131 var argNode = branch as ArgumentTreeNode; 132 // replace argument nodes by a clone of the original subtree that provided the result for the argument node 133 return (SymbolicExpressionTreeNode)argumentTrees[argNode.Symbol.ArgumentIndex].Clone(); 134 } else { 135 // call recursively for all subtree 136 List<SymbolicExpressionTreeNode> subtrees = new List<SymbolicExpressionTreeNode>(branch.SubTrees); 137 while (branch.SubTrees.Count > 0) branch.SubTrees.RemoveAt(0); 138 foreach (var subtree in subtrees) { 139 branch.AddSubTree(ReplaceArgumentsInBranch(subtree, argumentTrees)); 135 140 } 141 return branch; 136 142 } 137 143 }
Note: See TracChangeset
for help on using the changeset viewer.