Changeset 3360 for trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/ArchitectureAlteringOperators/ArgumentDuplicater.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/ArgumentDuplicater.cs
r3338 r3360 64 64 return false; 65 65 66 var selectedDefunBranch = SelectRandomBranch(random, functionDefiningBranches); 67 var argumentNodes = from node in IterateNodesPrefix(selectedDefunBranch) 68 where node is ArgumentTreeNode 69 select (ArgumentTreeNode)node; 70 if (argumentNodes.Count() == 0 || argumentNodes.Count() >= maxFunctionArguments) 66 var selectedDefunBranch = functionDefiningBranches.SelectRandom(random); 67 var argumentSymbols = selectedDefunBranch.Grammar.Symbols.OfType<Argument>(); 68 if (argumentSymbols.Count() == 0 || argumentSymbols.Count() >= maxFunctionArguments) 71 69 // when no argument or number of arguments is already at max allowed value => abort 72 70 return false; 73 var distinctArgumentIndexes = (from node in argumentNodes 74 select node.ArgumentIndex).Distinct().ToList(); 75 var selectedArgumentIndex = distinctArgumentIndexes[random.Next(distinctArgumentIndexes.Count)]; 76 var newArgumentIndex = allowedArgumentIndexes.Except(from argNode in argumentNodes select argNode.ArgumentIndex).First(); 71 var selectedArgumentSymbol = argumentSymbols.SelectRandom(random); 72 var takenIndexes = argumentSymbols.Select(s => s.ArgumentIndex); 73 var newArgumentIndex = allowedArgumentIndexes.Except(takenIndexes).First(); 74 75 var newArgSymbol = new Argument(newArgumentIndex); 76 77 77 // replace existing references to the original argument with references to the new argument randomly in the selectedBranch 78 var argumentNodes = selectedDefunBranch.IterateNodesPrefix().OfType<ArgumentTreeNode>(); 78 79 foreach (var argNode in argumentNodes) { 79 if (argNode. ArgumentIndex == selectedArgumentIndex) {80 if (argNode.Symbol == selectedArgumentSymbol) { 80 81 if (random.NextDouble() < 0.5) { 81 argNode. ArgumentIndex = newArgumentIndex;82 argNode.Symbol = newArgSymbol; 82 83 } 83 84 } 84 85 } 85 86 // find invocations of the functions and duplicate the matching argument branch 86 var invocationNodes = from node in symbolicExpressionTree.IterateNodesPrefix() 87 let invokeNode = node as InvokeFunctionTreeNode 88 where invokeNode != null 89 where invokeNode.InvokedFunctionName == selectedDefunBranch.Name 90 select invokeNode; 87 var invocationNodes = from node in symbolicExpressionTree.IterateNodesPrefix().OfType<InvokeFunctionTreeNode>() 88 where node.Symbol.FunctionName == selectedDefunBranch.FunctionName 89 select node; 91 90 foreach (var invokeNode in invocationNodes) { 92 var argumentBranch = invokeNode.SubTrees[selectedArgument Index];91 var argumentBranch = invokeNode.SubTrees[selectedArgumentSymbol.ArgumentIndex]; 93 92 var clonedArgumentBranch = (SymbolicExpressionTreeNode)argumentBranch.Clone(); 94 93 invokeNode.InsertSubTree(newArgumentIndex, clonedArgumentBranch); 95 94 } 96 // register the new argument node and increase the number of arguments of the ADF 97 selectedDefunBranch.AddDynamicSymbol("ARG" + newArgumentIndex); 95 // register the new argument symbol and increase the number of arguments of the ADF 96 selectedDefunBranch.Grammar.AddSymbol(newArgSymbol); 97 selectedDefunBranch.Grammar.SetMinSubtreeCount(newArgSymbol, 0); 98 selectedDefunBranch.Grammar.SetMaxSubtreeCount(newArgSymbol, 0); 99 // allow the argument as child of any other symbol 100 foreach (var symb in selectedDefunBranch.Grammar.Symbols) 101 for (int i = 0; i < selectedDefunBranch.Grammar.GetMaxSubtreeCount(symb); i++) { 102 selectedDefunBranch.Grammar.SetAllowedChild(symb, newArgSymbol, i); 103 } 98 104 selectedDefunBranch.NumberOfArguments++; 105 99 106 // increase the arity of the changed ADF in all branches that can use this ADF 100 107 foreach (var subtree in symbolicExpressionTree.Root.SubTrees) { 101 if (subtree.DynamicSymbols.Contains(selectedDefunBranch.Name)) { 102 subtree.SetDynamicSymbolArgumentCount(selectedDefunBranch.Name, selectedDefunBranch.NumberOfArguments); 108 var matchingInvokeSymbol = (from symb in subtree.Grammar.Symbols.OfType<InvokeFunction>() 109 where symb.FunctionName == selectedDefunBranch.FunctionName 110 select symb).SingleOrDefault(); 111 if (matchingInvokeSymbol != null) { 112 subtree.Grammar.SetMinSubtreeCount(matchingInvokeSymbol, selectedDefunBranch.NumberOfArguments); 113 subtree.Grammar.SetMaxSubtreeCount(matchingInvokeSymbol, selectedDefunBranch.NumberOfArguments); 114 foreach (var child in subtree.GetAllowedSymbols(0)) { 115 for (int i = 0; i < subtree.Grammar.GetMaxSubtreeCount(matchingInvokeSymbol); i++) { 116 subtree.Grammar.SetAllowedChild(matchingInvokeSymbol, child, i); 117 } 118 } 103 119 } 104 120 } 105 Debug.Assert(grammar.IsValidExpression(symbolicExpressionTree));106 121 return true; 107 122 }
Note: See TracChangeset
for help on using the changeset viewer.