Guest User

mmax sped up

a guest
Jun 29th, 2019
298
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.21 KB | None | 0 0
  1.  
  2.  
  3. // m = moving (arg1 = window size; arg2 = values)
  4. // r = range (arg1 = max date range; arg2 = dates; arg3 = values)
  5.  
  6. template<typename LT, bool greater, bool do_index>
  7. K mminmaxtpl(K w0, K left) {
  8.     typedef std::conditional_t<do_index, J, LT> REST;
  9.     typedef std::conditional_t<greater, std::greater<LT>, std::less<LT>> GTLT;
  10.     K rv = ktn(KTY<REST>(), left->n);
  11.     J w = w0->j;
  12.     LT *l = kT<LT>(left);
  13.     REST *dest = kT<REST>(rv);
  14.     int limit = left->n;
  15.     LT lastM = KNULL<LT>();
  16.     GTLT compare;
  17.     J lastMI = -1;
  18.     J mi;
  19.     for(int i=0; i<limit; i++) {
  20.         int s = i-w;
  21.         if (s < 0) {
  22.             s = -1;
  23.         } else {
  24.             if (l[s] == lastM) {
  25.                 lastM = KNULL<LT>();
  26.             }
  27.         }
  28.         F m = l[i];
  29.         if (do_index) {
  30.             mi = i;
  31.         }            
  32.         if (KISNULL<LT>(lastM)) {
  33.             for(int j=i-1; j>s; j--) {
  34.                 F q = l[j];
  35.                 if (compare(q,m)) {
  36.                     m = q;
  37.                     if (do_index) mi = j;
  38.                 }
  39.             }
  40.             lastM = m;
  41.             if (do_index) lastMI = mi;
  42.         } else if (compare(m, lastM)) {
  43.             lastM = m;
  44.             if (do_index) lastMI = mi;
  45.         }
  46.         if (do_index) {
  47.             *(dest++) = lastMI;
  48.         } else {
  49.             *(dest++) = lastM;
  50.         }
  51.     }
  52.     return rv;
  53. }
  54.  
  55. template<bool greater, bool do_index>
  56. K mminmaxtpl1(K w0, K left) {
  57.     if (w0->t != -KJ)  return krr("1st arg must be long.");
  58.     switch(left->t) {
  59.         case KF:
  60.             return mminmaxtpl<F, greater, do_index>(w0, left);
  61.         case KI:
  62.             return mminmaxtpl<I, greater, do_index>(w0, left);
  63.         case KJ:
  64.             return mminmaxtpl<J, greater, do_index>(w0, left);
  65.         default:
  66.             return krr("arg2 type");
  67.     }
  68. }
  69.  
  70. extern "C" K mmax0(K w0, K left) {
  71.     return mminmaxtpl1<true, false>(w0, left);
  72. }
  73. extern "C" K mmin0(K w0, K left) {
  74.     return mminmaxtpl1<false, false>(w0, left);
  75. }
  76. extern "C" K mmaxi(K w0, K left) {
  77.     return mminmaxtpl1<true, true>(w0, left);
  78. }
  79. extern "C" K mmini(K w0, K left) {
  80.     return mminmaxtpl1<false, true>(w0, left);
  81. }
Advertisement
Add Comment
Please, Sign In to add comment