Changeset 3462 for trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/SimpleArithmeticExpressionInterpreter.cs
- Timestamp:
- 04/21/10 15:21:34 (14 years ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/SimpleArithmeticExpressionInterpreter.cs
r3456 r3462 26 26 using System.Collections.Generic; 27 27 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 28 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding. GeneralSymbols;28 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols; 29 29 using HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols; 30 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Compiler; 30 31 31 32 namespace HeuristicLab.Problems.DataAnalysis.Symbolic { 32 33 [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 35 47 private Dataset dataset; 36 48 private int row; 37 49 private Instruction[] code; 38 50 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) { 40 53 this.dataset = dataset; 41 54 var compiler = new SymbolicExpressionTreeCompiler(); 42 code = compiler.Compile(tree); 55 compiler.AddInstructionPostProcessingHook(PostProcessInstruction); 56 code = compiler.Compile(tree, MapSymbolToOpCode); 43 57 foreach (var row in rows) { 44 58 this.row = row; … … 51 65 } 52 66 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 53 87 private Stack<List<double>> argumentStack = new Stack<List<double>>(); 54 88 public double Evaluate() { 55 89 var currentInstr = code[pc++]; 56 switch (currentInstr. symbol) {57 case CodeSymbol.Add: {90 switch (currentInstr.opCode) { 91 case OpCodes.Add: { 58 92 double s = 0.0; 59 93 for (int i = 0; i < currentInstr.nArguments; i++) { … … 62 96 return s; 63 97 } 64 case CodeSymbol.Sub: {98 case OpCodes.Sub: { 65 99 double s = Evaluate(); 66 100 for (int i = 1; i < currentInstr.nArguments; i++) { … … 69 103 return s; 70 104 } 71 case CodeSymbol.Mul: {105 case OpCodes.Mul: { 72 106 double p = Evaluate(); 73 107 for (int i = 1; i < currentInstr.nArguments; i++) { … … 76 110 return p; 77 111 } 78 case CodeSymbol.Div: {112 case OpCodes.Div: { 79 113 double p = Evaluate(); 80 114 for (int i = 1; i < currentInstr.nArguments; i++) { … … 83 117 return p; 84 118 } 85 case CodeSymbol.Call: {119 case OpCodes.Call: { 86 120 // save current arguments 87 121 List<double> arguments = new List<double>(); … … 102 136 return v; 103 137 } 104 case CodeSymbol.Arg: {138 case OpCodes.Arg: { 105 139 return argumentStack.Peek()[currentInstr.iArg0]; 106 140 } 107 case CodeSymbol.Dynamic: {141 case OpCodes.Variable: { 108 142 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: { 112 146 var constTreeNode = currentInstr.dynamicNode as ConstantTreeNode; 113 if (constTreeNode != null) { 114 return constTreeNode.Value; 115 } else throw new NotSupportedException(); 147 return constTreeNode.Value; 116 148 } 117 149 default: throw new NotSupportedException();
Note: See TracChangeset
for help on using the changeset viewer.