Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.LinqExpressionTreeInterpreter/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/OpCodes.cs @ 13141

Last change on this file since 13141 was 13141, checked in by bburlacu, 8 years ago

#2442: Merged files from trunk and updated project file. Implemented missing operations in the CompiledTreeInterpreter: Integral, Derivative, Lag, TimeLag. Adapted lambda signature to accept an array of List<double> in order to make it easier to work with compiled trees. Changed value parameters to fixed value parameters and adjusted interpreter constructors and after serialization hooks. Removed function symbol.

From the performance point of view, compiling the tree into a lambda accepting a double[][] parameter (an array of arrays for the values of each double variable), accessed with Expression.ArrayIndex is the fastest, but it can be cumbersome to provide the data as a double[][]. Therefore the variant with List<double>[] was chosen. Internally, for each variable node the List's underlying double array is used, result in an overall decent speed compromise.

File size: 5.2 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
25
26namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
27  public static class OpCodes {
28    public const byte Add = 1;
29    public const byte Sub = 2;
30    public const byte Mul = 3;
31    public const byte Div = 4;
32
33    public const byte Sin = 5;
34    public const byte Cos = 6;
35    public const byte Tan = 7;
36
37    public const byte Log = 8;
38    public const byte Exp = 9;
39
40    public const byte IfThenElse = 10;
41
42    public const byte GT = 11;
43    public const byte LT = 12;
44
45    public const byte AND = 13;
46    public const byte OR = 14;
47    public const byte NOT = 15;
48    public const byte XOR = 45;
49
50
51    public const byte Average = 16;
52
53    public const byte Call = 17;
54
55    public const byte Variable = 18;
56    public const byte LagVariable = 19;
57    public const byte Constant = 20;
58    public const byte Arg = 21;
59
60    public const byte Power = 22;
61    public const byte Root = 23;
62    public const byte TimeLag = 24;
63    public const byte Integral = 25;
64    public const byte Derivative = 26;
65
66    public const byte VariableCondition = 27;
67
68    public const byte Square = 28;
69    public const byte SquareRoot = 29;
70    public const byte Gamma = 30;
71    public const byte Psi = 31;
72    public const byte Dawson = 32;
73    public const byte ExponentialIntegralEi = 33;
74    public const byte CosineIntegral = 34;
75    public const byte SineIntegral = 35;
76    public const byte HyperbolicCosineIntegral = 36;
77    public const byte HyperbolicSineIntegral = 37;
78    public const byte FresnelCosineIntegral = 38;
79    public const byte FresnelSineIntegral = 39;
80    public const byte AiryA = 40;
81    public const byte AiryB = 41;
82    public const byte Norm = 42;
83    public const byte Erf = 43;
84    public const byte Bessel = 44;
85
86    private static Dictionary<Type, byte> symbolToOpcode = new Dictionary<Type, byte>() {
87       { typeof(Addition), OpCodes.Add },
88      { typeof(Subtraction), OpCodes.Sub },
89      { typeof(Multiplication), OpCodes.Mul },
90      { typeof(Division), OpCodes.Div },
91      { typeof(Sine), OpCodes.Sin },
92      { typeof(Cosine), OpCodes.Cos },
93      { typeof(Tangent), OpCodes.Tan },
94      { typeof(Logarithm), OpCodes.Log },
95      { typeof(Exponential), OpCodes.Exp },
96      { typeof(IfThenElse), OpCodes.IfThenElse },
97      { typeof(GreaterThan), OpCodes.GT },
98      { typeof(LessThan), OpCodes.LT },
99      { typeof(And), OpCodes.AND },
100      { typeof(Or), OpCodes.OR },
101      { typeof(Not), OpCodes.NOT},
102      { typeof(Xor),OpCodes.XOR},
103      { typeof(Average), OpCodes.Average},
104      { typeof(InvokeFunction), OpCodes.Call },
105      { typeof(Variable), OpCodes.Variable },
106      { typeof(LaggedVariable), OpCodes.LagVariable },
107      { typeof(AutoregressiveTargetVariable),OpCodes.LagVariable},
108      { typeof(Constant), OpCodes.Constant },
109      { typeof(Argument), OpCodes.Arg },
110      { typeof(Power),OpCodes.Power},
111      { typeof(Root),OpCodes.Root},
112      { typeof(TimeLag), OpCodes.TimeLag},
113      { typeof(Integral), OpCodes.Integral},
114      { typeof(Derivative), OpCodes.Derivative},
115      { typeof(VariableCondition),OpCodes.VariableCondition},
116      { typeof(Square),OpCodes.Square},
117      { typeof(SquareRoot),OpCodes.SquareRoot},
118      { typeof(Gamma), OpCodes.Gamma },
119      { typeof(Psi), OpCodes.Psi },
120      { typeof(Dawson), OpCodes.Dawson},
121      { typeof(ExponentialIntegralEi), OpCodes.ExponentialIntegralEi },
122      { typeof(CosineIntegral), OpCodes.CosineIntegral },
123      { typeof(SineIntegral), OpCodes.SineIntegral },
124      { typeof(HyperbolicCosineIntegral), OpCodes.HyperbolicCosineIntegral },
125      { typeof(HyperbolicSineIntegral), OpCodes.HyperbolicSineIntegral },
126      { typeof(FresnelCosineIntegral), OpCodes.FresnelCosineIntegral },
127      { typeof(FresnelSineIntegral), OpCodes.FresnelSineIntegral },
128      { typeof(AiryA), OpCodes.AiryA },
129      { typeof(AiryB), OpCodes.AiryB },
130      { typeof(Norm), OpCodes.Norm},
131      { typeof(Erf), OpCodes.Erf},
132      { typeof(Bessel), OpCodes.Bessel},
133    };
134
135    public static byte MapSymbolToOpCode(ISymbolicExpressionTreeNode treeNode) {
136      byte opCode;
137      if (symbolToOpcode.TryGetValue(treeNode.Symbol.GetType(), out opCode)) return opCode;
138      else throw new NotSupportedException("Symbol: " + treeNode.Symbol);
139    }
140  }
141}
Note: See TracBrowser for help on using the repository browser.