Changeset 16899 for branches/2988_ModelsOfModels2/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionCompiledTreeInterpreter.cs
- Timestamp:
- 05/06/19 14:20:06 (5 years ago)
- Location:
- branches/2988_ModelsOfModels2/HeuristicLab.Problems.DataAnalysis.Symbolic
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2988_ModelsOfModels2/HeuristicLab.Problems.DataAnalysis.Symbolic
- Property svn:mergeinfo changed
/trunk/HeuristicLab.Problems.DataAnalysis.Symbolic merged: 16737,16740,16758,16762,16764,16768,16802,16822,16839,16858,16868
- Property svn:mergeinfo changed
-
branches/2988_ModelsOfModels2/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionCompiledTreeInterpreter.cs
r16722 r16899 154 154 private static readonly PropertyInfo Indexer = typeof(IList<double>).GetProperty("Item"); 155 155 private static Expression MakeExpr(ISymbolicExpressionTreeNode node, Dictionary<string, int> variableIndices, Expression row, Expression columns) { 156 var opcode = OpCode s.MapSymbolToOpCode(node);156 var opcode = OpCode.MapSymbolToOpCode(node); 157 157 #region switch opcode 158 158 switch (opcode) { 159 case OpCode s.Constant: {159 case OpCode.Constant: { 160 160 var constantTreeNode = (ConstantTreeNode)node; 161 161 return Expression.Constant(constantTreeNode.Value); 162 162 } 163 case OpCode s.Variable: {163 case OpCode.Variable: { 164 164 var variableTreeNode = (VariableTreeNode)node; 165 165 var variableWeight = Expression.Constant(variableTreeNode.Weight); … … 169 169 return Expression.Multiply(variableWeight, Expression.Property(valuesExpr, Indexer, row)); 170 170 } 171 case OpCode s.Add: {171 case OpCode.Add: { 172 172 Expression result = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 173 173 for (int i = 1; i < node.SubtreeCount; ++i) { … … 176 176 return result; 177 177 } 178 case OpCode s.Sub: {178 case OpCode.Sub: { 179 179 Expression result = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 180 180 if (node.SubtreeCount == 1) … … 185 185 return result; 186 186 } 187 case OpCode s.Mul: {187 case OpCode.Mul: { 188 188 Expression result = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 189 189 for (int i = 1; i < node.SubtreeCount; ++i) { … … 192 192 return result; 193 193 } 194 case OpCode s.Div: {194 case OpCode.Div: { 195 195 Expression result = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 196 196 if (node.SubtreeCount == 1) … … 201 201 return result; 202 202 } 203 case OpCode s.Average: {203 case OpCode.Average: { 204 204 Expression result = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 205 205 for (int i = 1; i < node.SubtreeCount; ++i) { … … 208 208 return Expression.Divide(result, Expression.Constant((double)node.SubtreeCount)); 209 209 } 210 case OpCode s.Absolute: {210 case OpCode.Absolute: { 211 211 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 212 212 return Expression.Call(Abs, arg); 213 213 } 214 case OpCode s.Cos: {214 case OpCode.Cos: { 215 215 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 216 216 return Expression.Call(Cos, arg); 217 217 } 218 case OpCode s.Sin: {218 case OpCode.Sin: { 219 219 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 220 220 return Expression.Call(Sin, arg); 221 221 } 222 case OpCode s.Tan: {222 case OpCode.Tan: { 223 223 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 224 224 return Expression.Call(Tan, arg); 225 225 } 226 case OpCode s.Tanh: {226 case OpCode.Tanh: { 227 227 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 228 228 return Expression.Call(Tanh, arg); 229 229 } 230 case OpCode s.Square: {230 case OpCode.Square: { 231 231 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 232 232 return Expression.Power(arg, Expression.Constant(2.0)); 233 233 } 234 case OpCode s.Cube: {234 case OpCode.Cube: { 235 235 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 236 236 return Expression.Power(arg, Expression.Constant(3.0)); 237 237 } 238 case OpCode s.Power: {238 case OpCode.Power: { 239 239 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 240 240 var power = MakeExpr(node.GetSubtree(1), variableIndices, row, columns); 241 241 return Expression.Power(arg, Expression.Call(Round, power)); 242 242 } 243 case OpCode s.SquareRoot: {243 case OpCode.SquareRoot: { 244 244 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 245 245 return Expression.Call(Sqrt, arg); 246 246 } 247 case OpCode s.CubeRoot: {247 case OpCode.CubeRoot: { 248 248 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 249 249 return Expression.Power(arg, Expression.Constant(1.0 / 3.0)); 250 250 } 251 case OpCode s.Root: {251 case OpCode.Root: { 252 252 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 253 253 var power = MakeExpr(node.GetSubtree(1), variableIndices, row, columns); 254 254 return Expression.Power(arg, Expression.Divide(Expression.Constant(1.0), Expression.Call(Round, power))); 255 255 } 256 case OpCode s.Exp: {256 case OpCode.Exp: { 257 257 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 258 258 return Expression.Call(Exp, arg); 259 259 } 260 case OpCode s.Log: {260 case OpCode.Log: { 261 261 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 262 262 return Expression.Call(Log, arg); 263 263 } 264 case OpCode s.Gamma: {264 case OpCode.Gamma: { 265 265 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 266 266 var isNaN = Expression.Call(IsNaN, arg); … … 278 278 return expr; 279 279 } 280 case OpCode s.Psi: {280 case OpCode.Psi: { 281 281 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 282 282 var isNaN = Expression.Call(IsNaN, arg); … … 300 300 return expr; 301 301 } 302 case OpCode s.Dawson: {302 case OpCode.Dawson: { 303 303 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 304 304 var isNaN = Expression.Call(IsNaN, arg); … … 314 314 return expr; 315 315 } 316 case OpCode s.ExponentialIntegralEi: {316 case OpCode.ExponentialIntegralEi: { 317 317 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 318 318 var isNaN = Expression.Call(IsNaN, arg); … … 328 328 return expr; 329 329 } 330 case OpCode s.SineIntegral: {330 case OpCode.SineIntegral: { 331 331 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 332 332 var isNaN = Expression.Call(IsNaN, arg); … … 348 348 return expr; 349 349 } 350 case OpCode s.CosineIntegral: {350 case OpCode.CosineIntegral: { 351 351 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 352 352 var isNaN = Expression.Call(IsNaN, arg); … … 368 368 return expr; 369 369 } 370 case OpCode s.HyperbolicSineIntegral: {370 case OpCode.HyperbolicSineIntegral: { 371 371 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 372 372 var isNaN = Expression.Call(IsNaN, arg); … … 388 388 return expr; 389 389 } 390 case OpCode s.HyperbolicCosineIntegral: {390 case OpCode.HyperbolicCosineIntegral: { 391 391 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 392 392 var isNaN = Expression.Call(IsNaN, arg); … … 408 408 return expr; 409 409 } 410 case OpCode s.FresnelSineIntegral: {410 case OpCode.FresnelSineIntegral: { 411 411 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 412 412 var isNaN = Expression.Call(IsNaN, arg); … … 424 424 return expr; 425 425 } 426 case OpCode s.FresnelCosineIntegral: {426 case OpCode.FresnelCosineIntegral: { 427 427 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 428 428 var isNaN = Expression.Call(IsNaN, arg); … … 440 440 return expr; 441 441 } 442 case OpCode s.AiryA: {442 case OpCode.AiryA: { 443 443 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 444 444 var isNaN = Expression.Call(IsNaN, arg); … … 458 458 return expr; 459 459 } 460 case OpCode s.AiryB: {460 case OpCode.AiryB: { 461 461 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 462 462 var isNaN = Expression.Call(IsNaN, arg); … … 476 476 return expr; 477 477 } 478 case OpCode s.Norm: {478 case OpCode.Norm: { 479 479 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 480 480 var result = Expression.Variable(typeof(double)); … … 487 487 result); 488 488 } 489 case OpCode s.Erf: {489 case OpCode.Erf: { 490 490 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 491 491 var isNaN = Expression.Call(IsNaN, arg); … … 499 499 result); 500 500 } 501 case OpCode s.Bessel: {501 case OpCode.Bessel: { 502 502 var arg = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 503 503 var isNaN = Expression.Call(IsNaN, arg); … … 511 511 result); 512 512 } 513 case OpCode s.AnalyticQuotient: {513 case OpCode.AnalyticQuotient: { 514 514 var x1 = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 515 515 var x2 = MakeExpr(node.GetSubtree(1), variableIndices, row, columns); … … 520 520 Expression.Multiply(x2, x2)))); 521 521 } 522 case OpCode s.IfThenElse: {522 case OpCode.IfThenElse: { 523 523 var test = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 524 524 var result = Expression.Variable(typeof(double)); … … 528 528 return Expression.Block(new[] { result }, condition, result); 529 529 } 530 case OpCode s.AND: {530 case OpCode.AND: { 531 531 var result = Expression.Variable(typeof(double)); 532 532 var expr = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); … … 553 553 ); 554 554 } 555 case OpCode s.OR: {555 case OpCode.OR: { 556 556 var result = Expression.Variable(typeof(double)); 557 557 var expr = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); … … 578 578 ); 579 579 } 580 case OpCode s.NOT: {580 case OpCode.NOT: { 581 581 var value = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 582 582 var result = Expression.Variable(typeof(double)); … … 586 586 return Expression.Block(new[] { result }, condition, result); 587 587 } 588 case OpCode s.XOR: {588 case OpCode.XOR: { 589 589 var ps = Expression.Variable(typeof(int)); 590 590 var block = Expression.Block( … … 617 617 return xorExpr; 618 618 } 619 case OpCode s.GT: {619 case OpCode.GT: { 620 620 var left = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 621 621 var right = MakeExpr(node.GetSubtree(1), variableIndices, row, columns); … … 629 629 result); 630 630 } 631 case OpCode s.LT: {631 case OpCode.LT: { 632 632 var left = MakeExpr(node.GetSubtree(0), variableIndices, row, columns); 633 633 var right = MakeExpr(node.GetSubtree(1), variableIndices, row, columns); … … 638 638 return Expression.Block(new[] { result }, condition, result); 639 639 } 640 case OpCode s.VariableCondition: {640 case OpCode.VariableCondition: { 641 641 var variableConditionTreeNode = (VariableConditionTreeNode)node; 642 642 if (variableConditionTreeNode.Symbol.IgnoreSlope) throw new NotSupportedException("Strict variable conditionals are not supported");
Note: See TracChangeset
for help on using the changeset viewer.