Changeset 5373 for trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/SimpleArithmeticExpressionInterpreter.cs
- Timestamp:
- 01/25/11 16:51:30 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/SimpleArithmeticExpressionInterpreter.cs
r5288 r5373 67 67 68 68 public const byte Power = 22; 69 public const byte TimeLag = 23; 70 public const byte Integral = 24; 71 public const byte Derivative = 25; 69 72 } 70 73 … … 92 95 { typeof(Argument), OpCodes.Arg }, 93 96 { typeof(Power),OpCodes.Power}, 97 { typeof(TimeLag), OpCodes.TimeLag}, 98 { typeof(Integral), OpCodes.Integral}, 99 {typeof(Derivative), OpCodes.Derivative}, 94 100 }; 95 101 private const int ARGUMENT_STACK_SIZE = 1024; … … 244 250 else return -1.0; 245 251 } 252 case OpCodes.TimeLag: { 253 var timeLagTreeNode = (LaggedTreeNode)currentInstr.dynamicNode; 254 if (row + timeLagTreeNode.Lag < 0 || row + timeLagTreeNode.Lag >= dataset.Rows) 255 return double.NaN; 256 257 row += timeLagTreeNode.Lag; 258 double result = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer); 259 row -= timeLagTreeNode.Lag; 260 return result; 261 } 262 case OpCodes.Integral: { 263 int nextPc = pc; 264 var timeLagTreeNode = (LaggedTreeNode)currentInstr.dynamicNode; 265 if (row + timeLagTreeNode.Lag < 0 || row + timeLagTreeNode.Lag >= dataset.Rows) 266 return double.NaN; 267 double sum = 0.0; 268 for (int i = 0; i < Math.Abs(timeLagTreeNode.Lag); i++) { 269 row += Math.Sign(timeLagTreeNode.Lag); 270 sum += Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer); 271 pc = nextPc; 272 } 273 row -= timeLagTreeNode.Lag; 274 sum += Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer); 275 return sum; 276 } 277 278 //mkommend: derivate calculation taken from: 279 //http://www.holoborodko.com/pavel/numerical-methods/numerical-derivative/smooth-low-noise-differentiators/ 280 //one sided smooth differentiatior, N = 4 281 // y' = 1/8h (f_i + 2f_i-1, -2 f_i-3 - f_i-4) 282 case OpCodes.Derivative: { 283 if (row - 4 < 0) return double.NaN; 284 int nextPc = pc; 285 double f_0 = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer); ; row--; 286 pc = nextPc; 287 double f_1 = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer); ; row -= 2; 288 pc = nextPc; 289 double f_3 = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer); ; row--; 290 pc = nextPc; 291 double f_4 = Evaluate(dataset, ref row, code, ref pc, argumentStack, ref argStackPointer); ; 292 row += 4; 293 294 return (f_0 + 2 * f_1 - 2 * f_3 - f_4) / 8; // h = 1 295 } 246 296 case OpCodes.Call: { 247 297 // evaluate sub-trees
Note: See TracChangeset
for help on using the changeset viewer.