Changeset 15722 for branches/2886_SymRegGrammarEnumeration/HeuristicLab.Algorithms.DataAnalysis.SymRegGrammarEnumeration/GrammarEnumeration/Grammar.cs
- Timestamp:
- 02/05/18 18:16:25 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2886_SymRegGrammarEnumeration/HeuristicLab.Algorithms.DataAnalysis.SymRegGrammarEnumeration/GrammarEnumeration/Grammar.cs
r15714 r15722 6 6 using HeuristicLab.Algorithms.DataAnalysis.SymRegGrammarEnumeration.GrammarEnumeration; 7 7 using HeuristicLab.Common; 8 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 9 using HeuristicLab.Problems.DataAnalysis.Symbolic; 8 10 9 11 namespace HeuristicLab.Algorithms.DataAnalysis.SymRegGrammarEnumeration { … … 13 15 14 16 #region Symbols 17 15 18 public VariableSymbol Var; 16 19 … … 21 24 public TerminalSymbol Addition; 22 25 public TerminalSymbol Multiplication; 23 #endregion 24 26 27 #endregion 28 29 30 #region HL Symbols for Parsing ExpressionTrees 31 32 private TypeCoherentExpressionGrammar symbolicExpressionGrammar; 33 34 private ISymbol constSy; 35 private ISymbol varSy; 36 37 private ISymbol addSy; 38 private ISymbol mulSy; 39 private ISymbol logSy; 40 private ISymbol expSy; 41 private ISymbol divSy; 42 43 private ISymbol rootSy; 44 private ISymbol startSy; 45 46 #endregion 25 47 26 48 public Grammar(string[] variables) { … … 48 70 Factor.AddProduction(Var); 49 71 #endregion 72 73 #region Parsing to SymbolicExpressionTree 74 symbolicExpressionGrammar = new TypeCoherentExpressionGrammar(); 75 symbolicExpressionGrammar.ConfigureAsDefaultRegressionGrammar(); 76 77 constSy = symbolicExpressionGrammar.Symbols.OfType<Constant>().First(); 78 varSy = symbolicExpressionGrammar.Symbols.OfType<Variable>().First(); 79 addSy = symbolicExpressionGrammar.AllowedSymbols.OfType<Addition>().First(); 80 mulSy = symbolicExpressionGrammar.AllowedSymbols.OfType<Multiplication>().First(); 81 logSy = symbolicExpressionGrammar.AllowedSymbols.OfType<Logarithm>().First(); 82 expSy = symbolicExpressionGrammar.AllowedSymbols.OfType<Exponential>().First(); 83 divSy = symbolicExpressionGrammar.AllowedSymbols.OfType<Division>().First(); 84 85 rootSy = symbolicExpressionGrammar.AllowedSymbols.OfType<ProgramRootSymbol>().First(); 86 startSy = symbolicExpressionGrammar.AllowedSymbols.OfType<StartSymbol>().First(); 87 88 #endregion 50 89 } 51 90 … … 60 99 } 61 100 101 #region Hashing 62 102 private int[] GetSubtreeHashes(TerminalSymbol currentSymbol, Stack<TerminalSymbol> parseStack) { 63 103 List<int> childHashes = null; … … 66 106 childHashes = currentSymbol.StringRepresentation.GetHashCode().ToEnumerable().ToList(); 67 107 68 } else if (ReferenceEquals(currentSymbol, Multiplication)) { // MULTIPLICATION 108 } else if (ReferenceEquals(currentSymbol, Multiplication)) { 109 // MULTIPLICATION 69 110 childHashes = new List<int>(); 70 111 … … 94 135 95 136 96 } else if (ReferenceEquals(currentSymbol, Addition)) { // ADDITION 137 } else if (ReferenceEquals(currentSymbol, Addition)) { 138 // ADDITION 97 139 HashSet<int> uniqueChildHashes = new HashSet<int>(); 98 140 … … 129 171 return hashes.Aggregate(0, (result, ti) => ((result << 5) + result) ^ ti.GetHashCode()); 130 172 } 173 #endregion 174 175 #region Parse to SymbolicExpressionTree 176 public SymbolicExpressionTree ParseSymbolicExpressionTree(SymbolString sentence) { 177 Debug.Assert(sentence.Any(), "Trying to evaluate empty sentence!"); 178 Debug.Assert(sentence.All(s => s is TerminalSymbol), "Trying to evaluate symbol sequence with nonterminalsymbols!"); 179 180 symbolicExpressionGrammar.ConfigureAsDefaultRegressionGrammar(); 181 182 var rootNode = rootSy.CreateTreeNode(); 183 var startNode = startSy.CreateTreeNode(); 184 rootNode.AddSubtree(startNode); 185 186 Stack<TerminalSymbol> parseStack = new Stack<TerminalSymbol>(sentence.OfType<TerminalSymbol>()); 187 startNode.AddSubtree(ParseSymbolicExpressionTree(parseStack)); 188 189 return new SymbolicExpressionTree(rootNode); 190 } 191 192 public ISymbolicExpressionTreeNode ParseSymbolicExpressionTree(Stack<TerminalSymbol> parseStack) { 193 TerminalSymbol currentSymbol = parseStack.Pop(); 194 195 ISymbolicExpressionTreeNode parsedSubTree = null; 196 197 if (ReferenceEquals(currentSymbol, Addition)) { 198 parsedSubTree = addSy.CreateTreeNode(); 199 parsedSubTree.AddSubtree(ParseSymbolicExpressionTree(parseStack)); // left part 200 parsedSubTree.AddSubtree(ParseSymbolicExpressionTree(parseStack)); // right part 201 202 } else if (ReferenceEquals(currentSymbol, Multiplication)) { 203 parsedSubTree = mulSy.CreateTreeNode(); 204 parsedSubTree.AddSubtree(ParseSymbolicExpressionTree(parseStack)); // left part 205 parsedSubTree.AddSubtree(ParseSymbolicExpressionTree(parseStack)); // right part 206 207 } else if (Var.VariableTerminalSymbols.Contains(currentSymbol)) { 208 VariableTreeNode varNode = (VariableTreeNode)varSy.CreateTreeNode(); 209 varNode.Weight = 1.0; 210 varNode.VariableName = currentSymbol.StringRepresentation; 211 parsedSubTree = varNode; 212 } 213 214 Debug.Assert(parsedSubTree != null); 215 return parsedSubTree; 216 } 217 #endregion 131 218 } 132 219 }
Note: See TracChangeset
for help on using the changeset viewer.