Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
04/21/10 15:21:34 (14 years ago)
Author:
gkronber
Message:

Refactored symbolic expression tree encoding and problem classes for symbolic regression. #937 , #938

File:
1 moved

Legend:

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

    r3456 r3462  
    2626using System.Collections.Generic;
    2727using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
    28 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.GeneralSymbols;
     28using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;
    2929using HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols;
     30using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Compiler;
    3031
    3132namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
    3233  [StorableClass]
    33   [Item("SimpleArithmeticExpressionEvaluator", "Default evaluator for arithmetic symbolic expression trees.")]
    34   public class SimpleArithmeticExpressionEvaluator {
     34  [Item("SimpleArithmeticExpressionInterpreter", "Interpreter for arithmetic symbolic expression trees including function calls.")]
     35  public class SimpleArithmeticExpressionInterpreter : Item, ISymbolicExpressionTreeInterpreter {
     36    private class OpCodes {
     37      public const byte Add = 1;
     38      public const byte Sub = 2;
     39      public const byte Mul = 3;
     40      public const byte Div = 4;
     41      public const byte Variable = 5;
     42      public const byte Constant = 6;
     43      public const byte Call = 100;
     44      public const byte Arg = 101;
     45    }
     46
    3547    private Dataset dataset;
    3648    private int row;
    3749    private Instruction[] code;
    3850    private int pc;
    39     public IEnumerable<double> EstimatedValues(SymbolicExpressionTree tree, Dataset dataset, IEnumerable<int> rows) {
     51
     52    public IEnumerable<double> GetSymbolicExpressionTreeValues(SymbolicExpressionTree tree, Dataset dataset, IEnumerable<int> rows) {
    4053      this.dataset = dataset;
    4154      var compiler = new SymbolicExpressionTreeCompiler();
    42       code = compiler.Compile(tree);
     55      compiler.AddInstructionPostProcessingHook(PostProcessInstruction);
     56      code = compiler.Compile(tree, MapSymbolToOpCode);
    4357      foreach (var row in rows) {
    4458        this.row = row;
     
    5165    }
    5266
     67    private Instruction PostProcessInstruction(Instruction instr) {
     68      if (instr.opCode == OpCodes.Variable) {
     69        var variableTreeNode = instr.dynamicNode as VariableTreeNode;
     70        instr.iArg0 = (ushort)dataset.GetVariableIndex(variableTreeNode.VariableName);
     71      }
     72      return instr;
     73    }
     74
     75    private byte MapSymbolToOpCode(SymbolicExpressionTreeNode treeNode) {
     76      if (treeNode.Symbol is Addition) return OpCodes.Add;
     77      if (treeNode.Symbol is Subtraction) return OpCodes.Sub;
     78      if (treeNode.Symbol is Multiplication) return OpCodes.Mul;
     79      if (treeNode.Symbol is Division) return OpCodes.Div;
     80      if (treeNode.Symbol is HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols.Variable) return OpCodes.Variable;
     81      if (treeNode.Symbol is Constant) return OpCodes.Constant;
     82      if (treeNode.Symbol is InvokeFunction) return OpCodes.Call;
     83      if (treeNode.Symbol is Argument) return OpCodes.Arg;
     84      throw new NotSupportedException("Symbol: " + treeNode.Symbol);
     85    }
     86
    5387    private Stack<List<double>> argumentStack = new Stack<List<double>>();
    5488    public double Evaluate() {
    5589      var currentInstr = code[pc++];
    56       switch (currentInstr.symbol) {
    57         case CodeSymbol.Add: {
     90      switch (currentInstr.opCode) {
     91        case OpCodes.Add: {
    5892            double s = 0.0;
    5993            for (int i = 0; i < currentInstr.nArguments; i++) {
     
    6296            return s;
    6397          }
    64         case CodeSymbol.Sub: {
     98        case OpCodes.Sub: {
    6599            double s = Evaluate();
    66100            for (int i = 1; i < currentInstr.nArguments; i++) {
     
    69103            return s;
    70104          }
    71         case CodeSymbol.Mul: {
     105        case OpCodes.Mul: {
    72106            double p = Evaluate();
    73107            for (int i = 1; i < currentInstr.nArguments; i++) {
     
    76110            return p;
    77111          }
    78         case CodeSymbol.Div: {
     112        case OpCodes.Div: {
    79113            double p = Evaluate();
    80114            for (int i = 1; i < currentInstr.nArguments; i++) {
     
    83117            return p;
    84118          }
    85         case CodeSymbol.Call: {
     119        case OpCodes.Call: {
    86120            // save current arguments
    87121            List<double> arguments = new List<double>();
     
    102136            return v;
    103137          }
    104         case CodeSymbol.Arg: {
     138        case OpCodes.Arg: {
    105139            return argumentStack.Peek()[currentInstr.iArg0];
    106140          }
    107         case CodeSymbol.Dynamic: {
     141        case OpCodes.Variable: {
    108142            var variableTreeNode = currentInstr.dynamicNode as VariableTreeNode;
    109             if (variableTreeNode != null) {
    110               return dataset[row, dataset.GetVariableIndex(variableTreeNode.VariableName)] * variableTreeNode.Weight;
    111             }
     143            return dataset[row, currentInstr.iArg0] * variableTreeNode.Weight;
     144          }
     145        case OpCodes.Constant: {
    112146            var constTreeNode = currentInstr.dynamicNode as ConstantTreeNode;
    113             if (constTreeNode != null) {
    114               return constTreeNode.Value;
    115             } else throw new NotSupportedException();
     147            return constTreeNode.Value;
    116148          }
    117149        default: throw new NotSupportedException();
Note: See TracChangeset for help on using the changeset viewer.