Changeset 3369 for trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/DefaultSymbolicExpressionGrammar.cs
- Timestamp:
- 04/16/10 12:12:29 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/DefaultSymbolicExpressionGrammar.cs
r3360 r3369 30 30 31 31 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding { 32 /// <summary> 33 /// The default symbolic expression grammar stores symbols and syntactic constraints for symbols. 34 /// Symbols are treated as equvivalent if they have the same name. 35 /// Syntactic constraints limit the number of allowed sub trees for a node with a symbol and which symbols are allowed 36 /// in the sub-trees of a symbol (can be specified for each sub-tree index separately). 37 /// </summary> 32 38 [StorableClass] 33 39 [Item("DefaultSymbolicExpressionGrammar", "Represents a grammar that defines the syntax of symbolic expression trees.")] … … 40 46 private Dictionary<string, List<HashSet<string>>> allowedChildSymbols; 41 47 [Storable] 42 private HashSet<Symbol> allSymbols;48 private Dictionary<string, Symbol> allSymbols; 43 49 44 50 public DefaultSymbolicExpressionGrammar() … … 66 72 maxSubTreeCount = new Dictionary<string, int>(); 67 73 allowedChildSymbols = new Dictionary<string, List<HashSet<string>>>(); 68 allSymbols = new HashSet<Symbol>();74 allSymbols = new Dictionary<string, Symbol>(); 69 75 cachedMinExpressionLength = new Dictionary<string, int>(); 70 76 cachedMaxExpressionLength = new Dictionary<string, int>(); … … 74 80 75 81 public void AddSymbol(Symbol symbol) { 76 if ( allSymbols.Any(s => s.Name == symbol.Name)) throw new ArgumentException("Symbol " + symbol + " is already defined.");77 allSymbols.Add(symbol );82 if (ContainsSymbol(symbol)) throw new ArgumentException("Symbol " + symbol + " is already defined."); 83 allSymbols.Add(symbol.Name, symbol); 78 84 allowedChildSymbols[symbol.Name] = new List<HashSet<string>>(); 79 85 ClearCaches(); … … 86 92 allowedChildSymbols[parent.Name][i].Remove(symbol.Name); 87 93 } 88 allSymbols.Remove Where(s => s.Name ==symbol.Name);94 allSymbols.Remove(symbol.Name); 89 95 minSubTreeCount.Remove(symbol.Name); 90 96 maxSubTreeCount.Remove(symbol.Name); … … 94 100 95 101 public IEnumerable<Symbol> Symbols { 96 get { return allSymbols.AsEnumerable(); } 102 get { return allSymbols.Values.AsEnumerable(); } 103 } 104 105 public bool ContainsSymbol(Symbol symbol) { 106 return allSymbols.ContainsKey(symbol.Name); 97 107 } 98 108 99 109 public void SetAllowedChild(Symbol parent, Symbol child, int argumentIndex) { 100 if (! allSymbols.Any(s => s.Name == parent.Name)) throw new ArgumentException("Unknown symbol: " + parent, "parent");101 if (! allSymbols.Any(s => s.Name == child.Name)) throw new ArgumentException("Unknown symbol: " + child, "child");110 if (!ContainsSymbol(parent)) throw new ArgumentException("Unknown symbol: " + parent, "parent"); 111 if (!ContainsSymbol(child)) throw new ArgumentException("Unknown symbol: " + child, "child"); 102 112 if (argumentIndex >= GetMaxSubtreeCount(parent)) throw new ArgumentException("Symbol " + parent + " can have only " + GetMaxSubtreeCount(parent) + " subtrees."); 103 113 allowedChildSymbols[parent.Name][argumentIndex].Add(child.Name); … … 106 116 107 117 public bool IsAllowedChild(Symbol parent, Symbol child, int argumentIndex) { 108 if (! allSymbols.Any(s => s.Name == parent.Name)) throw new ArgumentException("Unknown symbol: " + parent, "parent");109 if (! allSymbols.Any(s => s.Name == child.Name)) throw new ArgumentException("Unknown symbol: " + child, "child");118 if (!ContainsSymbol(parent)) throw new ArgumentException("Unknown symbol: " + parent, "parent"); 119 if (!ContainsSymbol(child)) throw new ArgumentException("Unknown symbol: " + child, "child"); 110 120 if (argumentIndex >= GetMaxSubtreeCount(parent)) throw new ArgumentException("Symbol " + parent + " can have only " + GetMaxSubtreeCount(parent) + " subtrees."); 111 if (allowedChildSymbols.ContainsKey(parent.Name)) return allowedChildSymbols[parent.Name][argumentIndex].Contains(child.Name); 112 return false; 121 return allowedChildSymbols[parent.Name][argumentIndex].Contains(child.Name); 113 122 } 114 123 115 124 private Dictionary<string, int> cachedMinExpressionLength; 116 125 public int GetMinExpressionLength(Symbol symbol) { 117 if (! allSymbols.Any(s => s.Name == symbol.Name)) throw new ArgumentException("Unknown symbol: " + symbol);126 if (!ContainsSymbol(symbol)) throw new ArgumentException("Unknown symbol: " + symbol); 118 127 if (!cachedMinExpressionLength.ContainsKey(symbol.Name)) { 119 128 cachedMinExpressionLength[symbol.Name] = int.MaxValue; // prevent infinite recursion 120 129 long sumOfMinExpressionLengths = 1 + (from argIndex in Enumerable.Range(0, GetMinSubtreeCount(symbol)) 121 let minForSlot = (long)(from s in allSymbols130 let minForSlot = (long)(from s in Symbols 122 131 where IsAllowedChild(symbol, s, argIndex) 123 132 select GetMinExpressionLength(s)).DefaultIfEmpty(0).Min() … … 131 140 private Dictionary<string, int> cachedMaxExpressionLength; 132 141 public int GetMaxExpressionLength(Symbol symbol) { 133 if (! allSymbols.Any(s => s.Name == symbol.Name)) throw new ArgumentException("Unknown symbol: " + symbol);142 if (!ContainsSymbol(symbol)) throw new ArgumentException("Unknown symbol: " + symbol); 134 143 if (!cachedMaxExpressionLength.ContainsKey(symbol.Name)) { 135 144 cachedMaxExpressionLength[symbol.Name] = int.MaxValue; // prevent infinite recursion 136 145 long sumOfMaxTrees = 1 + (from argIndex in Enumerable.Range(0, GetMaxSubtreeCount(symbol)) 137 let maxForSlot = (long)(from s in allSymbols146 let maxForSlot = (long)(from s in Symbols 138 147 where IsAllowedChild(symbol, s, argIndex) 139 148 select GetMaxExpressionLength(s)).DefaultIfEmpty(0).Max() … … 147 156 private Dictionary<string, int> cachedMinExpressionDepth; 148 157 public int GetMinExpressionDepth(Symbol symbol) { 149 if (! allSymbols.Any(s => s.Name == symbol.Name)) throw new ArgumentException("Unknown symbol: " + symbol);158 if (!ContainsSymbol(symbol)) throw new ArgumentException("Unknown symbol: " + symbol); 150 159 if (!cachedMinExpressionDepth.ContainsKey(symbol.Name)) { 151 160 cachedMinExpressionDepth[symbol.Name] = int.MaxValue; // prevent infinite recursion 152 161 cachedMinExpressionDepth[symbol.Name] = 1 + (from argIndex in Enumerable.Range(0, GetMinSubtreeCount(symbol)) 153 let minForSlot = (from s in allSymbols162 let minForSlot = (from s in Symbols 154 163 where IsAllowedChild(symbol, s, argIndex) 155 164 select GetMinExpressionDepth(s)).DefaultIfEmpty(0).Min() … … 160 169 161 170 public void SetMaxSubtreeCount(Symbol symbol, int nSubTrees) { 162 if (! allSymbols.Any(s => s.Name == symbol.Name)) throw new ArgumentException("Unknown symbol: " + symbol);171 if (!ContainsSymbol(symbol)) throw new ArgumentException("Unknown symbol: " + symbol); 163 172 maxSubTreeCount[symbol.Name] = nSubTrees; 164 173 while (allowedChildSymbols[symbol.Name].Count <= nSubTrees) … … 171 180 172 181 public void SetMinSubtreeCount(Symbol symbol, int nSubTrees) { 173 if (! allSymbols.Any(s => s.Name == symbol.Name)) throw new ArgumentException("Unknown symbol: " + symbol);182 if (!ContainsSymbol(symbol)) throw new ArgumentException("Unknown symbol: " + symbol); 174 183 minSubTreeCount[symbol.Name] = nSubTrees; 175 184 ClearCaches(); … … 177 186 178 187 public int GetMinSubtreeCount(Symbol symbol) { 179 if (! allSymbols.Any(s => s.Name == symbol.Name)) throw new ArgumentException("Unknown symbol: " + symbol);188 if (!ContainsSymbol(symbol)) throw new ArgumentException("Unknown symbol: " + symbol); 180 189 return minSubTreeCount[symbol.Name]; 181 190 } 182 191 183 192 public int GetMaxSubtreeCount(Symbol symbol) { 184 if (! allSymbols.Any(s => s.Name == symbol.Name)) throw new ArgumentException("Unknown symbol: " + symbol);193 if (!ContainsSymbol(symbol)) throw new ArgumentException("Unknown symbol: " + symbol); 185 194 return maxSubTreeCount[symbol.Name]; 186 195 } … … 193 202 cachedMinExpressionDepth.Clear(); 194 203 } 195 196 //private void symbol_ToStringChanged(object sender, EventArgs e) {197 // OnToStringChanged();198 //}199 200 //private bool IsValidExpression(SymbolicExpressionTreeNode root) {201 // if (root.SubTrees.Count < root.GetMinSubtreeCount()) return false;202 // else if (root.SubTrees.Count > root.GetMaxSubtreeCount()) return false;203 // else for (int i = 0; i < root.SubTrees.Count; i++) {204 // if (!root.GetAllowedSymbols(i).Select(x => x.Name).Contains(root.SubTrees[i].Symbol.Name)) return false;205 // if (!IsValidExpression(root.SubTrees[i])) return false;206 // }207 // return true;208 //}209 204 210 205 public override IDeepCloneable Clone(Cloner cloner) { … … 220 215 } 221 216 } 222 clone.allSymbols = new HashSet<Symbol>(allSymbols);217 clone.allSymbols = new Dictionary<string, Symbol>(allSymbols); 223 218 return clone; 224 219 }
Note: See TracChangeset
for help on using the changeset viewer.