Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
02/23/18 18:10:30 (7 years ago)
Author:
lkammere
Message:

#2886: Performance Improvements - Only store hash of archived phrases and reduce number of enumerators.

Location:
branches/2886_SymRegGrammarEnumeration
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/2886_SymRegGrammarEnumeration

    • Property svn:ignore
      •  

        old new  
        11TestResults
         2*.gitignore
    • Property svn:global-ignores set to
      .git
  • branches/2886_SymRegGrammarEnumeration/HeuristicLab.Algorithms.DataAnalysis.SymRegGrammarEnumeration/GrammarEnumeration/Grammar.cs

    r15806 r15812  
    143143    }
    144144
    145     private int CalcHashCode<THashType>(SymbolString sentence, Func<Symbol, IEnumerable<THashType>, THashType> aggregateFunction) {
     145    private int CalcHashCode<THashType>(SymbolString sentence, Func<Symbol, THashType[], THashType> aggregateFunction) {
    146146      Debug.Assert(sentence.Any(), "Trying to evaluate empty sentence!");
    147147
     
    152152    }
    153153
    154     private THashType[] GetSubtreeHashes<THashType>(Stack<Symbol> parseStack, Func<Symbol, IEnumerable<THashType>, THashType> aggregateHashes) {
     154    private THashType[] GetSubtreeHashes<THashType>(Stack<Symbol> parseStack, Func<Symbol, THashType[], THashType> aggregateHashes) {
    155155      Symbol currentSymbol = parseStack.Pop();
    156156
     
    207207
    208208          var currFactor = childHashes[i];
    209           var invFactor = aggregateHashes(Inv, currFactor.ToEnumerable());
     209          var invFactor = aggregateHashes(Inv, new[] { currFactor });
    210210
    211211          int indexOfInv = childHashes.IndexOf(invFactor);
     
    228228
    229229      // var or nonterminal symbol
    230       return new[] { aggregateHashes(currentSymbol, Enumerable.Empty<THashType>()) };
    231     }
    232 
    233     private string AggregateStringHashes(Symbol operatorSym, IEnumerable<string> hashes) {
     230      return new[] { aggregateHashes(currentSymbol, new THashType[0]) };
     231    }
     232
     233    private string AggregateStringHashes(Symbol operatorSym, string[] hashes) {
    234234      var hashesArray = hashes.ToArray();
    235235
     
    237237        return hashesArray[0];
    238238      }
    239       if (operatorSym is NonterminalSymbol || Var.VariableTerminalSymbols.Contains(operatorSym)) {
     239      if (operatorSym is NonterminalSymbol || ((TerminalSymbol)operatorSym).IsVariable) {
    240240        return operatorSym.StringRepresentation;
    241241      }
     
    244244    }
    245245
    246     private int AggregateIntHashes(Symbol operatorSym, IEnumerable<int> hashes) {
    247       var hashesArray = hashes.ToArray();
    248 
     246    private int AggregateIntHashes(Symbol operatorSym, int[] hashes) {
    249247      int start;
    250248      if ((ReferenceEquals(operatorSym, Addition) || ReferenceEquals(operatorSym, Multiplication)) &&
    251           hashesArray.Count() <= 1) {
     249          hashes.Length <= 1) {
    252250        start = 0;
    253251
    254       } else if (operatorSym is NonterminalSymbol || Var.VariableTerminalSymbols.Contains(operatorSym)) {
     252      } else if (operatorSym is NonterminalSymbol || ((TerminalSymbol)operatorSym).IsVariable) {
    255253        return operatorSym.StringRepresentation.GetHashCode();
    256254
     
    259257      }
    260258
    261       return hashesArray.Aggregate(start, (result, ti) => ((result << 5) + result) ^ ti.GetHashCode());
     259      for (int i = 0; i < hashes.Length; i++) {
     260        start = ((start << 5) + start) ^ hashes[i];
     261      }
     262      return start;
    262263    }
    263264    #endregion
     
    314315        parsedSubTree.AddSubtree(ParseSymbolicExpressionTree(parseStack));
    315316
    316       } else if (Var.VariableTerminalSymbols.Contains(currentSymbol)) {
     317      } else if (currentSymbol.IsVariable) {
    317318        VariableTreeNode varNode = (VariableTreeNode)varSy.CreateTreeNode();
    318319        varNode.Weight = 1.0;
     
    337338      Symbol head = parseStack.Pop();
    338339
    339       SymbolString result = new SymbolString();
     340      SymbolString result = new SymbolString(parseStack.Count);
    340341
    341342      if (ReferenceEquals(head, Addition) || ReferenceEquals(head, Multiplication)) {
Note: See TracChangeset for help on using the changeset viewer.