Changeset: 6301a4a0a2c4 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6301a4a0a2c4 Modified Files: gdk/gdk_analytic_func.c Branch: window-tunning Log Message:
Fixed current row until unbounded implementation diffs (truncated from 513 to 300 lines): diff --git a/gdk/gdk_analytic_func.c b/gdk/gdk_analytic_func.c --- a/gdk/gdk_analytic_func.c +++ b/gdk/gdk_analytic_func.c @@ -810,21 +810,22 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p #define ANALYTICAL_MIN_MAX_CALC_FIXED_CURRENT_ROW_TILL_UNBOUNDED(TPE, MIN_MAX) \ do { \ TPE curval = TPE##_nil; \ - for (j = i - 1; j >= k; ) { \ - l = j; \ - do { \ - if (!is_##TPE##_nil(bp[j])) { \ - if (is_##TPE##_nil(curval)) \ - curval = bp[j]; \ - else \ - curval = MIN_MAX(bp[j], curval); \ - } \ - j--; \ - } while (j >= k && !op[j]); \ - m = MAX(k, j); \ - for (; l >= m; l--) \ - rb[l] = curval; \ - has_nils |= is_##TPE##_nil(curval); \ + l = i - 1; \ + for (j = l; ; j--) { \ + if (!is_##TPE##_nil(bp[j])) { \ + if (is_##TPE##_nil(curval)) \ + curval = bp[j]; \ + else \ + curval = MIN_MAX(bp[j], curval); \ + } \ + if (op[j] || j == k) { \ + for (; l >= j; l--) \ + rb[l] = curval; \ + has_nils |= is_##TPE##_nil(curval); \ + if (j == k) \ + break; \ + l = j - 1; \ + } \ } \ k = i; \ } while (0) @@ -903,23 +904,24 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p #define ANALYTICAL_MIN_MAX_CALC_VARSIZED_CURRENT_ROW_TILL_UNBOUNDED(GT_LT) \ do { \ const void *curval = nil; \ - for (j = i - 1; j >= k; ) { \ - l = j; \ - do { \ - void *next = BUNtail(bpi, j); \ - if (atomcmp(next, nil) != 0) { \ - if (atomcmp(curval, nil) == 0) \ - curval = next; \ - else \ - curval = atomcmp(next, curval) GT_LT 0 ? curval : next; \ - } \ - j--; \ - } while (j >= k && !op[j]); \ - m = MAX(k, j); \ - for (; l >= m; l--) \ - if (tfastins_nocheckVAR(r, l, curval, Tsize(r)) != GDK_SUCCEED) \ - return GDK_FAIL; \ - has_nils |= atomcmp(curval, nil) == 0; \ + l = i - 1; \ + for (j = l; ; j--) { \ + void *next = BUNtail(bpi, j); \ + if (atomcmp(next, nil) != 0) { \ + if (atomcmp(curval, nil) == 0) \ + curval = next; \ + else \ + curval = atomcmp(next, curval) GT_LT 0 ? curval : next; \ + } \ + if (op[j] || j == k) { \ + for (; l >= j; l--) \ + if (tfastins_nocheckVAR(r, l, curval, Tsize(r)) != GDK_SUCCEED) \ + return GDK_FAIL; \ + has_nils |= atomcmp(curval, nil) == 0; \ + if (j == k) \ + break; \ + l = j - 1; \ + } \ } \ k = i; \ } while (0) @@ -1036,7 +1038,7 @@ gdk_return \ GDKanalytical##OP(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tpe, int frame_type) \ { \ bool has_nils = false; \ - lng i = 0, j = 0, k = 0, l = 0, m = 0, cnt = (lng) BATcount(b); \ + lng i = 0, j = 0, k = 0, l = 0, cnt = (lng) BATcount(b); \ lng *restrict start = s ? (lng*)Tloc(s, 0) : NULL, *restrict end = e ? (lng*)Tloc(e, 0) : NULL; \ bit *restrict np = p ? Tloc(p, 0) : NULL, *restrict op = o ? Tloc(o, 0) : NULL; \ BATiter bpi = bat_iterator(b); \ @@ -1099,27 +1101,28 @@ ANALYTICAL_MIN_MAX(max, MAX, <) #define ANALYTICAL_COUNT_FIXED_CURRENT_ROW_TILL_UNBOUNDED(TPE) \ do { \ curval = 0; \ + l = i - 1; \ if (count_all) { \ - for (j = i - 1; j >= k; ) { \ - l = j; \ - do { \ - curval++; \ - j--; \ - } while (j >= k && !op[j]); \ - m = MAX(k, j); \ - for (; l >= m; l--) \ - rb[l] = curval; \ + for (j = l; ; j--) { \ + curval++; \ + if (op[j] || j == k) { \ + for (; l >= j; l--) \ + rb[l] = curval; \ + if (j == k) \ + break; \ + l = j - 1; \ + } \ } \ } else { \ - for (j = i - 1; j >= k; ) { \ - l = j; \ - do { \ - curval += !is_##TPE##_nil(bp[j]); \ - j--; \ - } while (j >= k && !op[j]); \ - m = MAX(k, j); \ - for (; l >= m; l--) \ - rb[l] = curval; \ + for (j = l; ; j--) { \ + curval += !is_##TPE##_nil(bp[j]); \ + if (op[j] || j == k) { \ + for (; l >= j; l--) \ + rb[l] = curval; \ + if (j == k) \ + break; \ + l = j - 1; \ + } \ } \ } \ k = i; \ @@ -1199,27 +1202,28 @@ ANALYTICAL_MIN_MAX(max, MAX, <) #define ANALYTICAL_COUNT_OTHERS_CURRENT_ROW_TILL_UNBOUNDED \ do { \ curval = 0; \ + l = i - 1; \ if (count_all) { \ - for (j = i - 1; j >= k; ) { \ - l = j; \ - do { \ - curval++; \ - j--; \ - } while (j >= k && !op[j]); \ - m = MAX(k, j); \ - for (; l >= m; l--) \ - rb[l] = curval; \ + for (j = l; ; j--) { \ + curval++; \ + if (op[j] || j == k) { \ + for (; l >= j; l--) \ + rb[l] = curval; \ + if (j == k) \ + break; \ + l = j - 1; \ + } \ } \ } else { \ - for (j = i - 1; j >= k; ) { \ - l = j; \ - do { \ - curval += cmp(BUNtail(bpi, j), nil) != 0; \ - j--; \ - } while (j >= k && !op[j]); \ - m = MAX(k, j); \ - for (; l >= m; l--) \ - rb[l] = curval; \ + for (j = l; ; j--) { \ + curval += cmp(BUNtail(bpi, j), nil) != 0; \ + if (op[j] || j == k) { \ + for (; l >= j; l--) \ + rb[l] = curval; \ + if (j == k) \ + break; \ + l = j - 1; \ + } \ } \ } \ k = i; \ @@ -1328,7 +1332,7 @@ ANALYTICAL_MIN_MAX(max, MAX, <) gdk_return GDKanalyticalcount(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, bit ignore_nils, int tpe, int frame_type) { - lng i = 0, j = 0, k = 0, l = 0, m = 0, curval = 0, cnt = (lng) BATcount(b); + lng i = 0, j = 0, k = 0, l = 0, curval = 0, cnt = (lng) BATcount(b); lng *restrict start = s ? (lng*)Tloc(s, 0) : NULL, *restrict end = e ? (lng*)Tloc(e, 0) : NULL, *restrict rb = (lng *) Tloc(r, 0); bit *restrict np = p ? Tloc(p, 0) : NULL, *restrict op = o ? Tloc(o, 0) : NULL; const void *restrict nil = ATOMnilptr(tpe); @@ -1384,21 +1388,22 @@ GDKanalyticalcount(BAT *r, BAT *p, BAT * #define ANALYTICAL_SUM_IMP_NUM_CURRENT_ROW_TILL_UNBOUNDED(TPE1, TPE2) \ do { \ TPE2 curval = TPE2##_nil; \ - for (j = i - 1; j >= k; ) { \ - l = j; \ - do { \ - if (!is_##TPE1##_nil(bp[j])) { \ - if (is_##TPE2##_nil(curval)) \ - curval = (TPE2) bp[j]; \ - else \ - ADD_WITH_CHECK(bp[j], curval, TPE2, curval, GDK_##TPE2##_max, goto calc_overflow); \ - } \ - j--; \ - } while (j >= k && !op[j]); \ - m = MAX(k, j); \ - for (; l >= m; l--) \ - rb[l] = curval; \ - has_nils |= is_##TPE2##_nil(curval); \ + l = i - 1; \ + for (j = l; ; j--) { \ + if (!is_##TPE1##_nil(bp[j])) { \ + if (is_##TPE2##_nil(curval)) \ + curval = (TPE2) bp[j]; \ + else \ + ADD_WITH_CHECK(bp[j], curval, TPE2, curval, GDK_##TPE2##_max, goto calc_overflow); \ + } \ + if (op[j] || j == k) { \ + for (; l >= j; l--) \ + rb[l] = curval; \ + has_nils |= is_##TPE2##_nil(curval); \ + if (j == k) \ + break; \ + l = j - 1; \ + } \ } \ k = i; \ } while (0) @@ -1479,22 +1484,23 @@ GDKanalyticalcount(BAT *r, BAT *p, BAT * #define ANALYTICAL_SUM_IMP_FP_CURRENT_ROW_TILL_UNBOUNDED(TPE1, TPE2) /* TODO go through a version of dofsum which returns the current partials */ \ do { \ - TPE2 curval = TPE2##_nil; \ - for (j = i - 1; j >= k; ) { \ - l = j; \ - do { \ - if (!is_##TPE1##_nil(bp[j])) { \ - if (is_##TPE2##_nil(curval)) \ - curval = (TPE2) bp[j]; \ - else \ - ADD_WITH_CHECK(bp[j], curval, TPE2, curval, GDK_##TPE2##_max, goto calc_overflow); \ - } \ - j--; \ - } while (j >= k && !op[j]); \ - m = MAX(k, j); \ - for (; l >= m; l--) \ - rb[l] = curval; \ - has_nils |= is_##TPE2##_nil(curval); \ + TPE2 curval = TPE2##_nil; \ + l = i - 1; \ + for (j = l; ; j--) { \ + if (!is_##TPE1##_nil(bp[j])) { \ + if (is_##TPE2##_nil(curval)) \ + curval = (TPE2) bp[j]; \ + else \ + ADD_WITH_CHECK(bp[j], curval, TPE2, curval, GDK_##TPE2##_max, goto calc_overflow); \ + } \ + if (op[j] || j == k) { \ + for (; l >= j; l--) \ + rb[l] = curval; \ + has_nils |= is_##TPE2##_nil(curval); \ + if (j == k) \ + break; \ + l = j - 1; \ + } \ } \ k = i; \ } while (0) @@ -1688,7 +1694,7 @@ gdk_return GDKanalyticalsum(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tp1, int tp2, int frame_type) { bool has_nils = false; - lng i = 0, j = 0, k = 0, l = 0, m = 0, cnt = (lng) BATcount(b); + lng i = 0, j = 0, k = 0, l = 0, cnt = (lng) BATcount(b); lng *restrict start = s ? (lng*)Tloc(s, 0) : NULL, *restrict end = e ? (lng*)Tloc(e, 0) : NULL; bit *restrict np = p ? Tloc(p, 0) : NULL, *restrict op = o ? Tloc(o, 0) : NULL; int abort_on_error = 1; @@ -1755,16 +1761,17 @@ GDKanalyticalsum(BAT *r, BAT *p, BAT *o, #define ANALYTICAL_PROD_CALC_NUM_CURRENT_ROW_TILL_UNBOUNDED(TPE1, TPE2, TPE3) \ do { \ TPE2 curval = TPE2##_nil; \ - for (j = i - 1; j >= k; ) { \ - l = j; \ - do { \ - PROD_NUM(TPE1, TPE2, TPE3, bp[j]); \ - j--; \ - } while (j >= k && !op[j]); \ - m = MAX(k, j); \ - for (; l >= m; l--) \ - rb[l] = curval; \ - has_nils |= is_##TPE2##_nil(curval); \ + l = i - 1; \ + for (j = l; ; j--) { \ + PROD_NUM(TPE1, TPE2, TPE3, bp[j]); \ + if (op[j] || j == k) { \ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list