Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
09/29/11 13:27:46 (13 years ago)
Author:
gkronber
Message:

#1480 experimental change to potentially improve performance of interpreters.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionTreeInterpreter.cs

    r6769 r6849  
    132132
    133133      public const byte VariableCondition = 27;
     134
     135      public const byte UncheckedVariable = 28;
     136      public const byte UncheckedVariableCondition = 29;
    134137    }
    135138    #endregion
    136139
     140    private Dictionary<Type, byte> symbolToUncheckedOpcode = new Dictionary<Type, byte>() {
     141      { typeof(HeuristicLab.Problems.DataAnalysis.Symbolic.Variable), OpCodes.UncheckedVariable },
     142      { typeof(VariableCondition),OpCodes.UncheckedVariableCondition}
     143    };
    137144    private Dictionary<Type, byte> symbolToOpcode = new Dictionary<Type, byte>() {
    138145      { typeof(Addition), OpCodes.Add },
     
    206213      for (int i = 0; i < code.Length; i++) {
    207214        Instruction instr = code[i];
    208         if (instr.opCode == OpCodes.Variable) {
     215        if (instr.opCode == OpCodes.Variable || instr.opCode == OpCodes.UncheckedVariable) {
    209216          var variableTreeNode = instr.dynamicNode as VariableTreeNode;
    210217          instr.iArg0 = dataset.GetReadOnlyDoubleValues(variableTreeNode.VariableName);
     
    214221          instr.iArg0 = dataset.GetReadOnlyDoubleValues(laggedVariableTreeNode.VariableName);
    215222          code[i] = instr;
    216         } else if (instr.opCode == OpCodes.VariableCondition) {
     223        } else if (instr.opCode == OpCodes.VariableCondition || instr.opCode == OpCodes.UncheckedVariableCondition) {
    217224          var variableConditionTreeNode = instr.dynamicNode as VariableConditionTreeNode;
    218225          instr.iArg0 = dataset.GetReadOnlyDoubleValues(variableConditionTreeNode.VariableName);
     
    410417            return ((IList<double>)currentInstr.iArg0)[row] * variableTreeNode.Weight;
    411418          }
     419        case OpCodes.UncheckedVariable: {
     420            var variableTreeNode = (VariableTreeNode)currentInstr.dynamicNode;
     421            return ((IList<double>)currentInstr.iArg0)[row] * variableTreeNode.Weight;
     422          }
    412423        case OpCodes.LagVariable: {
    413424            var laggedVariableTreeNode = (LaggedVariableTreeNode)currentInstr.dynamicNode;
     
    437448            return trueBranch * p + falseBranch * (1 - p);
    438449          }
     450        case OpCodes.UncheckedVariableCondition: {
     451            var variableConditionTreeNode = (VariableConditionTreeNode)currentInstr.dynamicNode;
     452            double variableValue = ((IList<double>)currentInstr.iArg0)[row];
     453            double x = variableValue - variableConditionTreeNode.Threshold;
     454            double p = 1 / (1 + Math.Exp(-variableConditionTreeNode.Slope * x));
     455
     456            double trueBranch = Evaluate(dataset, ref row, state);
     457            double falseBranch = Evaluate(dataset, ref row, state);
     458
     459            return trueBranch * p + falseBranch * (1 - p);
     460          }
    439461        default: throw new NotSupportedException();
    440462      }
     
    442464
    443465    private byte MapSymbolToOpCode(ISymbolicExpressionTreeNode treeNode) {
    444       if (symbolToOpcode.ContainsKey(treeNode.Symbol.GetType()))
    445         return symbolToOpcode[treeNode.Symbol.GetType()];
    446       else
    447         throw new NotSupportedException("Symbol: " + treeNode.Symbol);
     466      if ((treeNode.Symbol.GetType() == typeof(Variable) || treeNode.Symbol.GetType() == typeof(VariableCondition)) && !InLaggedContext(treeNode)) {
     467        return symbolToUncheckedOpcode[treeNode.Symbol.GetType()];
     468      } else {
     469        if (symbolToOpcode.ContainsKey(treeNode.Symbol.GetType()))
     470          return symbolToOpcode[treeNode.Symbol.GetType()];
     471        else
     472          throw new NotSupportedException("Symbol: " + treeNode.Symbol);
     473      }
     474    }
     475
     476    private bool InLaggedContext(ISymbolicExpressionTreeNode treeNode) {
     477      if (treeNode.Parent == null) return false;
     478      if (treeNode.Parent is ILaggedTreeNode) return true;
     479      if (treeNode.Parent.Symbol is Derivative) return true;
     480      return InLaggedContext(treeNode.Parent);
    448481    }
    449482
Note: See TracChangeset for help on using the changeset viewer.