Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
02/05/18 18:16:25 (7 years ago)
Author:
lkammere
Message:

#2886: Add evaluation of sentences.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2886_SymRegGrammarEnumeration/HeuristicLab.Algorithms.DataAnalysis.SymRegGrammarEnumeration/GrammarEnumeration/Grammar.cs

    r15714 r15722  
    66using HeuristicLab.Algorithms.DataAnalysis.SymRegGrammarEnumeration.GrammarEnumeration;
    77using HeuristicLab.Common;
     8using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
     9using HeuristicLab.Problems.DataAnalysis.Symbolic;
    810
    911namespace HeuristicLab.Algorithms.DataAnalysis.SymRegGrammarEnumeration {
     
    1315
    1416    #region Symbols
     17
    1518    public VariableSymbol Var;
    1619
     
    2124    public TerminalSymbol Addition;
    2225    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
    2547
    2648    public Grammar(string[] variables) {
     
    4870      Factor.AddProduction(Var);
    4971      #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
    5089    }
    5190
     
    6099    }
    61100
     101    #region Hashing
    62102    private int[] GetSubtreeHashes(TerminalSymbol currentSymbol, Stack<TerminalSymbol> parseStack) {
    63103      List<int> childHashes = null;
     
    66106        childHashes = currentSymbol.StringRepresentation.GetHashCode().ToEnumerable().ToList();
    67107
    68       } else if (ReferenceEquals(currentSymbol, Multiplication)) { // MULTIPLICATION
     108      } else if (ReferenceEquals(currentSymbol, Multiplication)) {
     109        // MULTIPLICATION
    69110        childHashes = new List<int>();
    70111
     
    94135
    95136
    96       } else if (ReferenceEquals(currentSymbol, Addition)) { // ADDITION
     137      } else if (ReferenceEquals(currentSymbol, Addition)) {
     138        // ADDITION
    97139        HashSet<int> uniqueChildHashes = new HashSet<int>();
    98140
     
    129171      return hashes.Aggregate(0, (result, ti) => ((result << 5) + result) ^ ti.GetHashCode());
    130172    }
     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
    131218  }
    132219}
Note: See TracChangeset for help on using the changeset viewer.