Changeset 3338 for trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeNode.cs
- Timestamp:
- 04/13/10 20:44:31 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeNode.cs
r3294 r3338 38 38 private Symbol symbol; 39 39 40 public SymbolicExpressionTreeNode() { } 40 public SymbolicExpressionTreeNode() { 41 subTrees = new List<SymbolicExpressionTreeNode>(); 42 } 41 43 42 public SymbolicExpressionTreeNode(Symbol symbol) {43 subTrees = new List<SymbolicExpressionTreeNode>();44 public SymbolicExpressionTreeNode(Symbol symbol) 45 : this() { 44 46 this.symbol = symbol; 45 47 } … … 49 51 symbol = original.symbol; 50 52 subTrees = new List<SymbolicExpressionTreeNode>(); 53 grammar = original.grammar; 51 54 foreach (var subtree in original.SubTrees) { 52 AddSubTree((SymbolicExpressionTreeNode)subtree.Clone());55 SubTrees.Add((SymbolicExpressionTreeNode)subtree.Clone()); 53 56 } 54 dynamicSymbols = new Dictionary<string, int>(original.dynamicSymbols);55 57 } 56 58 … … 68 70 } 69 71 72 private ISymbolicExpressionGrammar grammar; 73 public virtual ISymbolicExpressionGrammar Grammar { 74 get { return grammar; } 75 set { 76 grammar = value; 77 foreach (var subtree in subTrees) 78 subtree.Grammar = value; 79 } 80 } 81 70 82 public int GetSize() { 71 83 int size = 1; … … 80 92 } 81 93 82 [Storable]83 private Dictionary<string, int> dynamicSymbols = new Dictionary<string, int>();84 public void AddDynamicSymbol(string symbolName) {85 Debug.Assert(!dynamicSymbols.ContainsKey(symbolName));86 dynamicSymbols[symbolName] = 0;87 }88 89 public void AddDynamicSymbol(string symbolName, int nArguments) {90 AddDynamicSymbol(symbolName);91 SetDynamicSymbolArgumentCount(symbolName, nArguments);92 }93 94 public void RemoveDynamicSymbol(string symbolName) {95 dynamicSymbols.Remove(symbolName);96 }97 98 public IEnumerable<string> DynamicSymbols {99 get { return dynamicSymbols.Keys; }100 }101 102 public int GetDynamicSymbolArgumentCount(string symbolName) {103 return dynamicSymbols[symbolName];104 }105 public void SetDynamicSymbolArgumentCount(string symbolName, int nArguments) {106 Debug.Assert(dynamicSymbols.ContainsKey(symbolName));107 dynamicSymbols[symbolName] = nArguments;108 }109 110 94 public virtual void ResetLocalParameters(IRandom random) { } 111 95 public virtual void ShakeLocalParameters(IRandom random, double shakingFactor) { } 112 96 113 p rotected internalvirtual void AddSubTree(SymbolicExpressionTreeNode tree) {97 public virtual void AddSubTree(SymbolicExpressionTreeNode tree) { 114 98 SubTrees.Add(tree); 99 //if (tree != null) 100 tree.Grammar = Grammar; 115 101 } 116 102 117 p rotected internalvirtual void InsertSubTree(int index, SymbolicExpressionTreeNode tree) {103 public virtual void InsertSubTree(int index, SymbolicExpressionTreeNode tree) { 118 104 SubTrees.Insert(index, tree); 105 //if (tree != null) 106 tree.Grammar = Grammar; 119 107 } 120 108 121 protected internal virtual void RemoveSubTree(int index) { 109 public virtual void RemoveSubTree(int index) { 110 //if (SubTrees[index] != null) 111 SubTrees[index].Grammar = null; 122 112 SubTrees.RemoveAt(index); 123 113 } 114 115 public IEnumerable<SymbolicExpressionTreeNode> IterateNodesPrefix() { 116 yield return this; 117 foreach (var subtree in subTrees) { 118 foreach (var n in subtree.IterateNodesPrefix()) 119 yield return n; 120 } 121 } 122 123 public IEnumerable<SymbolicExpressionTreeNode> IterateNodesPostfix() { 124 foreach (var subtree in subTrees) { 125 foreach (var n in subtree.IterateNodesPrefix()) 126 yield return n; 127 } 128 yield return this; 129 } 130 //public int GetMinExpressionLength() { 131 // return Grammar.GetMinExpressionLength(Symbol); 132 //} 133 //public int GetMaxExpressionLength() { 134 // return Grammar.GetMaxExpressionLength(Symbol); 135 //} 136 //public int GetMinExpressionDepth() { 137 // return Grammar.GetMinExpressionDepth(Symbol); 138 //} 139 public IEnumerable<Symbol> GetAllowedSymbols(int argumentIndex) { 140 return Grammar.Symbols.Where(s => Grammar.IsAllowedChild(Symbol, s, argumentIndex)); 141 } 142 public int GetMinSubtreeCount() { 143 return Grammar.GetMinSubtreeCount(Symbol); 144 } 145 public int GetMaxSubtreeCount() { 146 return Grammar.GetMaxSubtreeCount(Symbol); 147 } 148 //public int GetMaxExpressionLength(Symbol s) { 149 // return Grammar.GetMaxExpressionLength(s); 150 //} 151 //public int GetMinExpressionLength(Symbol s) { 152 // return Grammar.GetMinExpressionLength(s); 153 //} 154 //public int GetMinExpressionDepth(Symbol s) { 155 // return Grammar.GetMinExpressionDepth(s); 156 //} 124 157 125 158 #region ICloneable Members … … 130 163 131 164 #endregion 165 166 167 public bool IsValidTree() { 168 var matchingSymbol = (from symb in Grammar.Symbols 169 where symb.Name == Symbol.Name 170 select symb).SingleOrDefault(); 171 172 if (SubTrees.Count < Grammar.GetMinSubtreeCount(matchingSymbol)) return false; 173 else if (SubTrees.Count > Grammar.GetMaxSubtreeCount(matchingSymbol)) return false; 174 else for (int i = 0; i < SubTrees.Count; i++) { 175 if (!GetAllowedSymbols(i).Select(x => x.Name).Contains(SubTrees[i].Symbol.Name)) return false; 176 if (!SubTrees[i].IsValidTree()) return false; 177 } 178 return true; 179 } 132 180 } 133 181 }
Note: See TracChangeset
for help on using the changeset viewer.