Changeset 13222 for branches/HeuristicLab.LinqExpressionTreeInterpreter/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionTreeILEmittingInterpreter.cs
- Timestamp:
- 11/17/15 16:21:29 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.LinqExpressionTreeInterpreter/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/SymbolicDataAnalysisExpressionTreeILEmittingInterpreter.cs
r13141 r13222 69 69 70 70 private const string CheckExpressionsWithIntervalArithmeticParameterName = "CheckExpressionsWithIntervalArithmetic"; 71 private const string CheckExpressionsWithIntervalArithmeticParameterDescription = "Switch that determines if the interpreter checks the validity of expressions with interval arithmetic before evaluating the expression."; 71 72 private const string EvaluatedSolutionsParameterName = "EvaluatedSolutions"; 72 73 … … 124 125 [StorableHook(HookType.AfterDeserialization)] 125 126 private void AfterDeserialization() { 126 Parameters.Remove(EvaluatedSolutionsParameterName); 127 Parameters.Add(new FixedValueParameter<IntValue>(EvaluatedSolutionsParameterName, "A counter for the total number of solutions the interpreter has evaluated", new IntValue(0))); 128 129 Parameters.Remove(CheckExpressionsWithIntervalArithmeticParameterName); 130 Parameters.Add(new FixedValueParameter<BoolValue>(CheckExpressionsWithIntervalArithmeticParameterName, 131 "Switch that determines if the interpreter checks the validity of expressions with interval arithmetic before evaluating the expression.", new BoolValue(false))); 127 var evaluatedSolutions = new IntValue(0); 128 var checkExpressionsWithIntervalArithmetic = new BoolValue(false); 129 if (Parameters.ContainsKey(EvaluatedSolutionsParameterName)) { 130 var evaluatedSolutionsParameter = (IValueParameter<IntValue>)Parameters[EvaluatedSolutionsParameterName]; 131 evaluatedSolutions = evaluatedSolutionsParameter.Value; 132 Parameters.Remove(EvaluatedSolutionsParameterName); 133 } 134 Parameters.Add(new FixedValueParameter<IntValue>(EvaluatedSolutionsParameterName, "A counter for the total number of solutions the interpreter has evaluated", evaluatedSolutions)); 135 if (Parameters.ContainsKey(CheckExpressionsWithIntervalArithmeticParameterName)) { 136 var checkExpressionsWithIntervalArithmeticParameter = (IValueParameter<BoolValue>)Parameters[CheckExpressionsWithIntervalArithmeticParameterName]; 137 Parameters.Remove(CheckExpressionsWithIntervalArithmeticParameterName); 138 checkExpressionsWithIntervalArithmetic = checkExpressionsWithIntervalArithmeticParameter.Value; 139 } 140 Parameters.Add(new FixedValueParameter<BoolValue>(CheckExpressionsWithIntervalArithmeticParameterName, CheckExpressionsWithIntervalArithmeticParameterDescription, checkExpressionsWithIntervalArithmetic)); 132 141 } 133 142 134 143 #region IStatefulItem 135 136 144 public void InitializeState() { 137 145 EvaluatedSolutions = 0; … … 140 148 public void ClearState() { 141 149 } 142 143 150 #endregion 144 151 … … 192 199 193 200 switch (currentInstr.opCode) { 194 case OpCodes.Add: 195 { 201 case OpCodes.Add: { 196 202 if (nArgs > 0) { 197 203 CompileInstructions(il, state, ds); … … 203 209 return; 204 210 } 205 case OpCodes.Sub: 206 { 211 case OpCodes.Sub: { 207 212 if (nArgs == 1) { 208 213 CompileInstructions(il, state, ds); … … 219 224 return; 220 225 } 221 case OpCodes.Mul: 222 { 226 case OpCodes.Mul: { 223 227 if (nArgs > 0) { 224 228 CompileInstructions(il, state, ds); … … 230 234 return; 231 235 } 232 case OpCodes.Div: 233 { 236 case OpCodes.Div: { 234 237 if (nArgs == 1) { 235 238 il.Emit(System.Reflection.Emit.OpCodes.Ldc_R8, 1.0); … … 247 250 return; 248 251 } 249 case OpCodes.Average: 250 { 252 case OpCodes.Average: { 251 253 CompileInstructions(il, state, ds); 252 254 for (int i = 1; i < nArgs; i++) { … … 258 260 return; 259 261 } 260 case OpCodes.Cos: 261 { 262 case OpCodes.Cos: { 262 263 CompileInstructions(il, state, ds); 263 264 il.Emit(System.Reflection.Emit.OpCodes.Call, cos); 264 265 return; 265 266 } 266 case OpCodes.Sin: 267 { 267 case OpCodes.Sin: { 268 268 CompileInstructions(il, state, ds); 269 269 il.Emit(System.Reflection.Emit.OpCodes.Call, sin); 270 270 return; 271 271 } 272 case OpCodes.Tan: 273 { 272 case OpCodes.Tan: { 274 273 CompileInstructions(il, state, ds); 275 274 il.Emit(System.Reflection.Emit.OpCodes.Call, tan); 276 275 return; 277 276 } 278 case OpCodes.Power: 279 { 277 case OpCodes.Power: { 280 278 CompileInstructions(il, state, ds); 281 279 CompileInstructions(il, state, ds); … … 284 282 return; 285 283 } 286 case OpCodes.Root: 287 { 284 case OpCodes.Root: { 288 285 CompileInstructions(il, state, ds); 289 286 il.Emit(System.Reflection.Emit.OpCodes.Ldc_R8, 1.0); // 1 / round(...) … … 294 291 return; 295 292 } 296 case OpCodes.Exp: 297 { 293 case OpCodes.Exp: { 298 294 CompileInstructions(il, state, ds); 299 295 il.Emit(System.Reflection.Emit.OpCodes.Call, exp); 300 296 return; 301 297 } 302 case OpCodes.Log: 303 { 298 case OpCodes.Log: { 304 299 CompileInstructions(il, state, ds); 305 300 il.Emit(System.Reflection.Emit.OpCodes.Call, log); 306 301 return; 307 302 } 308 case OpCodes.Square: 309 { 303 case OpCodes.Square: { 310 304 CompileInstructions(il, state, ds); 311 305 il.Emit(System.Reflection.Emit.OpCodes.Ldc_R8, 2.0); … … 313 307 return; 314 308 } 315 case OpCodes.SquareRoot: 316 { 309 case OpCodes.SquareRoot: { 317 310 CompileInstructions(il, state, ds); 318 311 il.Emit(System.Reflection.Emit.OpCodes.Call, sqrt); 319 312 return; 320 313 } 321 case OpCodes.AiryA: 322 { 314 case OpCodes.AiryA: { 323 315 CompileInstructions(il, state, ds); 324 316 il.Emit(System.Reflection.Emit.OpCodes.Call, airyA); 325 317 return; 326 318 } 327 case OpCodes.AiryB: 328 { 319 case OpCodes.AiryB: { 329 320 CompileInstructions(il, state, ds); 330 321 il.Emit(System.Reflection.Emit.OpCodes.Call, airyB); 331 322 return; 332 323 } 333 case OpCodes.Bessel: 334 { 324 case OpCodes.Bessel: { 335 325 CompileInstructions(il, state, ds); 336 326 il.Emit(System.Reflection.Emit.OpCodes.Call, bessel); 337 327 return; 338 328 } 339 case OpCodes.CosineIntegral: 340 { 329 case OpCodes.CosineIntegral: { 341 330 CompileInstructions(il, state, ds); 342 331 il.Emit(System.Reflection.Emit.OpCodes.Call, cosIntegral); 343 332 return; 344 333 } 345 case OpCodes.Dawson: 346 { 334 case OpCodes.Dawson: { 347 335 CompileInstructions(il, state, ds); 348 336 il.Emit(System.Reflection.Emit.OpCodes.Call, dawson); 349 337 return; 350 338 } 351 case OpCodes.Erf: 352 { 339 case OpCodes.Erf: { 353 340 CompileInstructions(il, state, ds); 354 341 il.Emit(System.Reflection.Emit.OpCodes.Call, erf); 355 342 return; 356 343 } 357 case OpCodes.ExponentialIntegralEi: 358 { 344 case OpCodes.ExponentialIntegralEi: { 359 345 CompileInstructions(il, state, ds); 360 346 il.Emit(System.Reflection.Emit.OpCodes.Call, expIntegralEi); 361 347 return; 362 348 } 363 case OpCodes.FresnelCosineIntegral: 364 { 349 case OpCodes.FresnelCosineIntegral: { 365 350 CompileInstructions(il, state, ds); 366 351 il.Emit(System.Reflection.Emit.OpCodes.Call, fresnelCosIntegral); 367 352 return; 368 353 } 369 case OpCodes.FresnelSineIntegral: 370 { 354 case OpCodes.FresnelSineIntegral: { 371 355 CompileInstructions(il, state, ds); 372 356 il.Emit(System.Reflection.Emit.OpCodes.Call, fresnelSinIntegral); 373 357 return; 374 358 } 375 case OpCodes.Gamma: 376 { 359 case OpCodes.Gamma: { 377 360 CompileInstructions(il, state, ds); 378 361 il.Emit(System.Reflection.Emit.OpCodes.Call, gamma); 379 362 return; 380 363 } 381 case OpCodes.HyperbolicCosineIntegral: 382 { 364 case OpCodes.HyperbolicCosineIntegral: { 383 365 CompileInstructions(il, state, ds); 384 366 il.Emit(System.Reflection.Emit.OpCodes.Call, hypCosIntegral); 385 367 return; 386 368 } 387 case OpCodes.HyperbolicSineIntegral: 388 { 369 case OpCodes.HyperbolicSineIntegral: { 389 370 CompileInstructions(il, state, ds); 390 371 il.Emit(System.Reflection.Emit.OpCodes.Call, hypSinIntegral); 391 372 return; 392 373 } 393 case OpCodes.Norm: 394 { 374 case OpCodes.Norm: { 395 375 CompileInstructions(il, state, ds); 396 376 il.Emit(System.Reflection.Emit.OpCodes.Call, norm); 397 377 return; 398 378 } 399 case OpCodes.Psi: 400 { 379 case OpCodes.Psi: { 401 380 CompileInstructions(il, state, ds); 402 381 il.Emit(System.Reflection.Emit.OpCodes.Call, psi); 403 382 return; 404 383 } 405 case OpCodes.SineIntegral: 406 { 384 case OpCodes.SineIntegral: { 407 385 CompileInstructions(il, state, ds); 408 386 il.Emit(System.Reflection.Emit.OpCodes.Call, sinIntegral); 409 387 return; 410 388 } 411 case OpCodes.IfThenElse: 412 { 389 case OpCodes.IfThenElse: { 413 390 Label end = il.DefineLabel(); 414 391 Label c1 = il.DefineLabel(); … … 424 401 return; 425 402 } 426 case OpCodes.AND: 427 { 403 case OpCodes.AND: { 428 404 Label falseBranch = il.DefineLabel(); 429 405 Label end = il.DefineLabel(); … … 446 422 return; 447 423 } 448 case OpCodes.OR: 449 { 424 case OpCodes.OR: { 450 425 Label trueBranch = il.DefineLabel(); 451 426 Label end = il.DefineLabel(); … … 475 450 return; 476 451 } 477 case OpCodes.NOT: 478 { 452 case OpCodes.NOT: { 479 453 CompileInstructions(il, state, ds); 480 454 il.Emit(System.Reflection.Emit.OpCodes.Ldc_I4_0); // > 0 … … 487 461 return; 488 462 } 489 case OpCodes.XOR: 490 { 463 case OpCodes.XOR: { 491 464 CompileInstructions(il, state, ds); 492 465 il.Emit(System.Reflection.Emit.OpCodes.Ldc_I4_0); … … 505 478 return; 506 479 } 507 case OpCodes.GT: 508 { 480 case OpCodes.GT: { 509 481 CompileInstructions(il, state, ds); 510 482 CompileInstructions(il, state, ds); … … 517 489 return; 518 490 } 519 case OpCodes.LT: 520 { 491 case OpCodes.LT: { 521 492 CompileInstructions(il, state, ds); 522 493 CompileInstructions(il, state, ds); … … 528 499 return; 529 500 } 530 case OpCodes.TimeLag: 531 { 501 case OpCodes.TimeLag: { 532 502 LaggedTreeNode laggedTreeNode = (LaggedTreeNode)currentInstr.dynamicNode; 533 503 il.Emit(System.Reflection.Emit.OpCodes.Ldarg_0); // row -= lag … … 545 515 return; 546 516 } 547 case OpCodes.Integral: 548 { 517 case OpCodes.Integral: { 549 518 int savedPc = state.ProgramCounter; 550 519 LaggedTreeNode laggedTreeNode = (LaggedTreeNode)currentInstr.dynamicNode; … … 573 542 //one sided smooth differentiatior, N = 4 574 543 // y' = 1/8h (f_i + 2f_i-1, -2 f_i-3 - f_i-4) 575 case OpCodes.Derivative: 576 { 544 case OpCodes.Derivative: { 577 545 int savedPc = state.ProgramCounter; 578 546 CompileInstructions(il, state, ds); … … 616 584 return; 617 585 } 618 case OpCodes.Call: 619 { 586 case OpCodes.Call: { 620 587 throw new NotSupportedException( 621 588 "Automatically defined functions are not supported by the SymbolicDataAnalysisTreeILEmittingInterpreter. Either turn of ADFs or change the interpeter."); 622 589 } 623 case OpCodes.Arg: 624 { 590 case OpCodes.Arg: { 625 591 throw new NotSupportedException( 626 592 "Automatically defined functions are not supported by the SymbolicDataAnalysisTreeILEmittingInterpreter. Either turn of ADFs or change the interpeter."); 627 593 } 628 case OpCodes.Variable: 629 { 594 case OpCodes.Variable: { 630 595 VariableTreeNode varNode = (VariableTreeNode)currentInstr.dynamicNode; 631 596 il.Emit(System.Reflection.Emit.OpCodes.Ldarg_1); // load columns array … … 659 624 return; 660 625 } 661 case OpCodes.LagVariable: 662 { 626 case OpCodes.LagVariable: { 663 627 var nanResult = il.DefineLabel(); 664 628 var normalResult = il.DefineLabel(); … … 688 652 return; 689 653 } 690 case OpCodes.Constant: 691 { 654 case OpCodes.Constant: { 692 655 ConstantTreeNode constNode = (ConstantTreeNode)currentInstr.dynamicNode; 693 656 il.Emit(System.Reflection.Emit.OpCodes.Ldc_R8, constNode.Value); … … 697 660 //mkommend: this symbol uses the logistic function f(x) = 1 / (1 + e^(-alpha * x) ) 698 661 //to determine the relative amounts of the true and false branch see http://en.wikipedia.org/wiki/Logistic_function 699 case OpCodes.VariableCondition: 700 { 662 case OpCodes.VariableCondition: { 701 663 throw new NotSupportedException("Interpretation of symbol " + currentInstr.dynamicNode.Symbol.Name + 702 664 " is not supported by the SymbolicDataAnalysisTreeILEmittingInterpreter");
Note: See TracChangeset
for help on using the changeset viewer.