Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
04/09/10 17:28:32 (14 years ago)
Author:
gkronber
Message:

Added first version of architecture altering operators for ADFs. #290 (Implement ADFs)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/SimpleArithmeticExpressionEvaluator.cs

    r3269 r3294  
    3030
    3131namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic {
    32   /// <summary>
    33   /// Evaluates FunctionTrees recursively by interpretation of the function symbols in each node.
    34   /// Simple unoptimized code, arithmetic expressions only.
    35   /// Not thread-safe!
    36   /// </summary>
    3732  [StorableClass]
    3833  [Item("SimpleArithmeticExpressionEvaluator", "Default evaluator for arithmetic symbolic expression trees.")]
    39   public class SimpleArithmeticExpressionEvaluator : GeneralSymbolicExpressionTreeEvaluator {
     34  public class SimpleArithmeticExpressionEvaluator {
    4035    private Dataset dataset;
    4136    private int row;
     37    private Instruction[] code;
     38    private int pc;
    4239    public IEnumerable<double> EstimatedValues(SymbolicExpressionTree tree, Dataset dataset, IEnumerable<int> rows) {
    4340      this.dataset = dataset;
     41      var compiler = new SymbolicExpressionTreeCompiler();
     42      code = compiler.Compile(tree);
    4443      foreach (var row in rows) {
    4544        this.row = row;
    46         var estimatedValue = Evaluate(tree.Root.SubTrees[0]);
     45        pc = 0;
     46        var estimatedValue = Evaluate();
    4747        if (double.IsNaN(estimatedValue) || double.IsInfinity(estimatedValue)) yield return 0.0;
    4848        else yield return estimatedValue;
     
    5050    }
    5151
    52     public override double Evaluate(SymbolicExpressionTreeNode node) {
    53       if (node.Symbol is HeuristicLab.Problems.DataAnalysis.Regression.Symbolic.Symbols.Variable) {
    54         var variableTreeNode = node as VariableTreeNode;
    55         return dataset[row, dataset.VariableIndex(variableTreeNode.VariableName)] * variableTreeNode.Weight;
    56       } else if (node.Symbol is Constant) {
    57         return ((ConstantTreeNode)node).Value;
    58       } else {
    59         return base.Evaluate(node);
     52    public double Evaluate() {
     53      var currentInstr = code[pc++];
     54      switch (currentInstr.symbol) {
     55        case CodeSymbol.Add: {
     56            double s = 0.0;
     57            for (int i = 0; i < currentInstr.nArguments; i++) {
     58              s += Evaluate();
     59            }
     60            return s;
     61          }
     62        case CodeSymbol.Sub: {
     63            double s = Evaluate();
     64            for (int i = 1; i < currentInstr.nArguments; i++) {
     65              s -= Evaluate();
     66            }
     67            return s;
     68          }
     69        case CodeSymbol.Mul: {
     70            double p = Evaluate();
     71            for (int i = 1; i < currentInstr.nArguments; i++) {
     72              p *= Evaluate();
     73            }
     74            return p;
     75          }
     76        case CodeSymbol.Div: {
     77            double p = Evaluate();
     78            for (int i = 1; i < currentInstr.nArguments; i++) {
     79              p /= Evaluate();
     80            }
     81            return p;
     82          }
     83        case CodeSymbol.Dynamic: {
     84            if (currentInstr.dynamicNode is VariableTreeNode) {
     85              var variableTreeNode = currentInstr.dynamicNode as VariableTreeNode;
     86              return dataset[row, dataset.GetVariableIndex(variableTreeNode.VariableName)] * variableTreeNode.Weight;
     87            } else if (currentInstr.dynamicNode is ConstantTreeNode) {
     88              return ((ConstantTreeNode)currentInstr.dynamicNode).Value;
     89            } else throw new NotSupportedException();
     90          }
     91        default: throw new NotSupportedException();
    6092      }
    6193    }
Note: See TracChangeset for help on using the changeset viewer.