Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
01/25/11 16:51:30 (14 years ago)
Author:
mkommend
Message:

ticket #1256 - Merged new timeseries symbols from branch to trunk.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/SimpleArithmeticExpressionInterpreter.cs

    r5288 r5373  
    6767
    6868      public const byte Power = 22;
     69      public const byte TimeLag = 23;
     70      public const byte Integral = 24;
     71      public const byte Derivative = 25;
    6972    }
    7073
     
    9295      { typeof(Argument), OpCodes.Arg },
    9396      { typeof(Power),OpCodes.Power},
     97      { typeof(TimeLag), OpCodes.TimeLag},
     98      { typeof(Integral), OpCodes.Integral},
     99      {typeof(Derivative), OpCodes.Derivative},
    94100    };
    95101    private const int ARGUMENT_STACK_SIZE = 1024;
     
    244250            else return -1.0;
    245251          }
     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          }
    246296        case OpCodes.Call: {
    247297            // evaluate sub-trees
Note: See TracChangeset for help on using the changeset viewer.