Changeset: 52eb4938ea71 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=52eb4938ea71
Modified Files:
        gdk/gdk_analytic_func.c
Branch: window-tunning
Log Message:

More cleanup, I had to undo one of the previous commits because it was becoming 
difficult to manage many nested macros


diffs (truncated from 612 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
@@ -793,16 +793,10 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
 
 #define ANALYTICAL_MIN_MAX_CALC_FIXED_UNBOUNDED_TILL_CURRENT_ROW(TPE, 
NAN_CHECK, MIN_MAX)      \
        do { \
-               TPE curval = TPE##_nil; \
                for (; k < i;) { \
                        TPE v = bp[k]; \
+                       TPE curval = v; \
                        j = k++; \
-                       if (!is_##TPE##_nil(v)) {               \
-                               if (is_##TPE##_nil(curval))     \
-                                       curval = v;     \
-                               else                            \
-                                       curval = MIN_MAX(v, curval); \
-                       }                                       \
                        while (k < i && (bp[k] == v NAN_CHECK(TPE, k))) { \
                                k++; \
                                if (!is_##TPE##_nil(bp[k])) {           \
@@ -820,16 +814,10 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
 
 #define ANALYTICAL_MIN_MAX_CALC_FIXED_CURRENT_ROW_TILL_UNBOUNDED(TPE, 
NAN_CHECK, MIN_MAX)      \
        do { \
-               TPE curval = TPE##_nil; \
                for (j = i - 1; j >= k; ) { \
                        TPE v = bp[j]; \
+                       TPE curval = v; \
                        l = j--; \
-                       if (!is_##TPE##_nil(v)) {               \
-                               if (is_##TPE##_nil(curval))     \
-                                       curval = v;     \
-                               else                            \
-                                       curval = MIN_MAX(v, curval); \
-                       }                                       \
                        while (j >= k && (bp[j] == v NAN_CHECK(TPE, j))) { \
                                j--; \
                                if (!is_##TPE##_nil(bp[j])) {           \
@@ -898,16 +886,9 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
 
 #define ANALYTICAL_MIN_MAX_CALC_VARSIZED_UNBOUNDED_TILL_CURRENT_ROW(GT_LT)     
\
        do { \
-               void *curval = (void*) nil; \
                for (; k < i;) { \
-                       void *next = BUNtail(bpi, k);   \
+                       void *next = BUNtail(bpi, k), *curval = next;   \
                        j = k++; \
-                       if (atomcmp(next, nil) != 0) {          \
-                               if (atomcmp(curval, nil) == 0)  \
-                                       curval = next;          \
-                               else                            \
-                                       curval = atomcmp(next, curval) GT_LT 0 
? curval : next; \
-                       }                                       \
                        while (k < i && atomcmp(BUNtail(bpi, k), next) == 0) { \
                                k++; \
                                void *nnext = BUNtail(bpi, k); \
@@ -927,16 +908,9 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
 
 #define ANALYTICAL_MIN_MAX_CALC_VARSIZED_CURRENT_ROW_TILL_UNBOUNDED(GT_LT)     
\
        do { \
-               void *curval = (void*) nil; \
                for (j = i - 1; j >= k; ) { \
-                       void *next = BUNtail(bpi, j);   \
+                       void *next = BUNtail(bpi, j), *curval = next;   \
                        l = j--; \
-                       if (atomcmp(next, nil) != 0) {          \
-                               if (atomcmp(curval, nil) == 0)  \
-                                       curval = next;          \
-                               else                            \
-                                       curval = atomcmp(next, curval) GT_LT 0 
? curval : next; \
-                       }                                       \
                        while (j >= k && atomcmp(BUNtail(bpi, j), next) == 0) { 
\
                                j--; \
                                void *nnext = BUNtail(bpi, j); \
@@ -1490,16 +1464,10 @@ GDKanalyticalcount(BAT *r, BAT *p, BAT *
 /* sum on fixed size integers */
 #define ANALYTICAL_SUM_IMP_NUM_UNBOUNDED_TILL_CURRENT_ROW(TPE1, TPE2) \
        do { \
-               TPE2 curval = TPE2##_nil; \
                for (; k < i;) { \
                        TPE1 v = bp[k]; \
+                       TPE2 curval = is_##TPE1##_nil(v) ? TPE2##_nil : (TPE2) 
v;       \
                        j = k++; \
-                       if (!is_##TPE1##_nil(v)) {              \
-                               if (is_##TPE2##_nil(curval))    \
-                                       curval = (TPE2) v;      \
-                               else                            \
-                                       ADD_WITH_CHECK(v, curval, TPE2, curval, 
GDK_##TPE2##_max, goto calc_overflow); \
-                       }                                       \
                        while (k < i && bp[k] == v) { \
                                k++; \
                                if (!is_##TPE1##_nil(bp[k])) {          \
@@ -1517,16 +1485,10 @@ 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; ) { \
                        TPE1 v = bp[j]; \
+                       TPE2 curval = is_##TPE1##_nil(v) ? TPE2##_nil : (TPE2) 
v;       \
                        l = j--; \
-                       if (!is_##TPE1##_nil(v)) {              \
-                               if (is_##TPE2##_nil(curval))    \
-                                       curval = (TPE2) v;      \
-                               else                            \
-                                       ADD_WITH_CHECK(v, curval, TPE2, curval, 
GDK_##TPE2##_max, goto calc_overflow); \
-                       }                                       \
                        while (j >= k && bp[j] == v) { \
                                j--; \
                                if (!is_##TPE1##_nil(bp[j])) {          \
@@ -1600,16 +1562,10 @@ GDKanalyticalcount(BAT *r, BAT *p, BAT *
 /* sum on floating-points */
 #define ANALYTICAL_SUM_IMP_FP_UNBOUNDED_TILL_CURRENT_ROW(TPE1, TPE2) /* TODO 
go through a version of dofsum which returns the current partials */ \
        do { \
-               TPE2 curval = TPE2##_nil; \
                for (; k < i;) { \
                        TPE1 v = bp[k]; \
+                       TPE2 curval = is_##TPE1##_nil(v) ? TPE2##_nil : (TPE2) 
v;       \
                        j = k++; \
-                       if (!is_##TPE1##_nil(v)) {              \
-                               if (is_##TPE2##_nil(curval))    \
-                                       curval = (TPE2) v;      \
-                               else                            \
-                                       ADD_WITH_CHECK(v, curval, TPE2, curval, 
GDK_##TPE2##_max, goto calc_overflow); \
-                       }                                       \
                        while (k < i && (bp[k] == v NAN_CHECK(TPE1, k))) { \
                                k++; \
                                if (!is_##TPE1##_nil(bp[k])) {          \
@@ -1627,16 +1583,10 @@ 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; ) { \
                        TPE1 v = bp[j]; \
+                       TPE2 curval = is_##TPE1##_nil(v) ? TPE2##_nil : (TPE2) 
v;       \
                        l = j--; \
-                       if (!is_##TPE1##_nil(v)) {              \
-                               if (is_##TPE2##_nil(curval))    \
-                                       curval = (TPE2) v;      \
-                               else                            \
-                                       ADD_WITH_CHECK(v, curval, TPE2, curval, 
GDK_##TPE2##_max, goto calc_overflow); \
-                       }                                       \
                        while (j >= k && (bp[j] == v NAN_CHECK(TPE1, j))) { \
                                j--; \
                                if (!is_##TPE1##_nil(bp[j])) {          \
@@ -1882,80 +1832,150 @@ GDKanalyticalsum(BAT *r, BAT *p, BAT *b,
 }
 
 /* product on integers */
-#define PROD_NUM(TPE1, TPE2, TPE3) \
+#define PROD_NUM(TPE1, TPE2, TPE3, ARG) \
        do {    \
-               if (!is_##TPE1##_nil(v)) {              \
+               if (!is_##TPE1##_nil(ARG)) {            \
                        if (is_##TPE2##_nil(curval))    \
-                               curval = (TPE2) v;      \
+                               curval = (TPE2) ARG;    \
                        else                            \
-                               MUL4_WITH_CHECK(v, curval, TPE2, curval, 
GDK_##TPE2##_max, TPE3, goto calc_overflow); \
+                               MUL4_WITH_CHECK(ARG, curval, TPE2, curval, 
GDK_##TPE2##_max, TPE3, goto calc_overflow); \
                }                               \
        } while(0)
 
-/* product on integers while checking for overflows on the output  */
-#define PROD_NUM_LIMIT(TPE1, TPE2, REAL_IMP) \
-       do {    \
-               if (!is_##TPE1##_nil(v)) {              \
-                       if (is_##TPE2##_nil(curval))    \
-                               curval = (TPE2) v;      \
-                       else                            \
-                               REAL_IMP(v, curval, curval, GDK_##TPE2##_max, 
goto calc_overflow); \
-               }                                       \
-       } while(0)
-
-/* product on floating-points */
-#define PROD_FP(TPE1, TPE2, ARG3) \
-       do {    \
-               if (!is_##TPE1##_nil(v)) {              \
-                       if (is_##TPE2##_nil(curval)) {  \
-                               curval = (TPE2) v;      \
-                       } else if (ABSOLUTE(curval) > 1 && GDK_##TPE2##_max / 
ABSOLUTE(v) < ABSOLUTE(curval)) { \
-                               if (abort_on_error)     \
-                                       goto calc_overflow; \
-                               curval = TPE2##_nil;    \
-                               nils++;                 \
-                       } else {                        \
-                               curval *= v;            \
-                       }                       \
-               }                       \
-       } while(0)
-
-#define ANALYTICAL_PROD_CALC_NUM_UNBOUNDED_TILL_CURRENT_ROW(TPE1, TPE2, 
REAL_IMP) \
+#define ANALYTICAL_PROD_CALC_NUM_UNBOUNDED_TILL_CURRENT_ROW(TPE1, TPE2, TPE3) \
        do { \
-               TPE2 curval = TPE2##_nil; \
-               for (; k < i; k++) { \
+               for (; k < i;) { \
                        TPE1 v = bp[k]; \
-                       REAL_IMP; \
-                       rb[k] = curval; \
+                       TPE2 curval = is_##TPE1##_nil(v) ? TPE2##_nil : (TPE2) 
v;       \
+                       j = k++; \
+                       while (k < i && bp[k] == v) { \
+                               k++; \
+                               PROD_NUM(TPE1, TPE2, TPE3, bp[k]); \
+                       } \
+                       for (; j < k; j++) \
+                               rb[j] = curval; \
                        has_nils |= is_##TPE2##_nil(curval);    \
                } \
        } while (0)
 
-#define ANALYTICAL_PROD_CALC_NUM_CURRENT_ROW_TILL_UNBOUNDED(TPE1, TPE2, 
REAL_IMP) \
+#define ANALYTICAL_PROD_CALC_NUM_CURRENT_ROW_TILL_UNBOUNDED(TPE1, TPE2, TPE3) \
        do { \
-               TPE2 curval = TPE2##_nil; \
-               for (j = i - 1; j >= k; j--) { \
+               for (j = i - 1; j >= k; ) { \
                        TPE1 v = bp[j]; \
-                       REAL_IMP; \
-                       rb[j] = curval; \
+                       TPE2 curval = is_##TPE1##_nil(v) ? TPE2##_nil : (TPE2) 
v;       \
+                       l = j--; \
+                       while (j >= k && bp[j] == v) { \
+                               j--; \
+                               PROD_NUM(TPE1, TPE2, TPE3, bp[j]); \
+                       } \
+                       m = MAX(k, j); \
+                       for (; l >= m; l--) \
+                               rb[l] = curval; \
                        has_nils |= is_##TPE2##_nil(curval);    \
-               } \
+               }       \
                k = i; \
        } while (0)
 
-#define ANALYTICAL_PROD_CALC_NUM_ALL_ROWS(TPE1, TPE2, REAL_IMP)        \
+#define ANALYTICAL_PROD_CALC_NUM_ALL_ROWS(TPE1, TPE2, TPE3)    \
        do { \
                TPE2 curval = TPE2##_nil; \
                for (; j < i; j++) { \
                        TPE1 v = bp[j]; \
-                       REAL_IMP; \
+                       PROD_NUM(TPE1, TPE2, TPE3, v); \
                } \
                for (; k < i; k++) \
                        rb[k] = curval; \
                has_nils |= is_##TPE2##_nil(curval);    \
        } while (0)
 
-#define ANALYTICAL_PROD_CALC_NUM_CURRENT_ROW(TPE1, TPE2, REAL_IMP)     \
+#define ANALYTICAL_PROD_CALC_NUM_CURRENT_ROW(TPE1, TPE2, TPE3) \
+       do {                                                            \
+               for (; k < i; k++) { \
+                       TPE1 v = bp[k]; \
+                       if (is_##TPE1##_nil(v)) {       \
+                               rb[k] = TPE2##_nil; \
+                               has_nils = true; \
+                       } else  {               \
+                               rb[k] = (TPE2) v; \
+                       } \
+               } \
+       } while (0)
+
+#define ANALYTICAL_PROD_CALC_NUM_OTHERS(TPE1, TPE2, TPE3)      \
+       do {                                                            \
+               TPE2 curval = TPE2##_nil;                       \
+               for (; k < i; k++) {                            \
+                       TPE1 *bs = bp + start[k], *be = bp + end[k];            
                \
+                       for (; bs < be; bs++) {                         \
+                               TPE1 v = *bs;                           \
+                               PROD_NUM(TPE1, TPE2, TPE3, v); \
+                       }                                               \
+                       rb[k] = curval;                                 \
+                       if (is_##TPE2##_nil(curval))                    \
+                               has_nils = true;                        \
+                       else                                            \
+                               curval = TPE2##_nil;    /* For the next 
iteration */    \
+               }                                                       \
+       } while (0)
+
+/* product on integers while checking for overflows on the output  */
+#define PROD_NUM_LIMIT(TPE1, TPE2, REAL_IMP, ARG) \
+       do {    \
+               if (!is_##TPE1##_nil(ARG)) {            \
+                       if (is_##TPE2##_nil(curval))    \
+                               curval = (TPE2) ARG;    \
+                       else                            \
+                               REAL_IMP(ARG, curval, curval, GDK_##TPE2##_max, 
goto calc_overflow); \
+               }                                       \
+       } while(0)
+
+#define ANALYTICAL_PROD_CALC_NUM_LIMIT_UNBOUNDED_TILL_CURRENT_ROW(TPE1, TPE2, 
REAL_IMP) \
+       do { \
+               for (; k < i;) { \
+                       TPE1 v = bp[k]; \
+                       TPE2 curval = is_##TPE1##_nil(v) ? TPE2##_nil : (TPE2) 
v;       \
+                       j = k++; \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to