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

Updated prod analytical function


diffs (truncated from 678 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
@@ -1666,23 +1666,6 @@ GDKanalyticalcount(BAT *r, BAT *p, BAT *
 
 #define ANALYTICAL_SUM_IMP_FP_ALL_ROWS(TPE1, TPE2)     \
        do { \
-               TPE2 curval = TPE2##_nil; \
-               for (; j < i; j++) { \
-                       TPE1 v = bp[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); \
-                       }                                       \
-               } \
-               for (; k < i; k++) \
-                       rb[k] = curval; \
-               has_nils |= is_##TPE2##_nil(curval);    \
-       } while (0)
-
-#define ANALYTICAL_SUM_FP_NUM_ALL_ROWS(TPE1, TPE2)     \
-       do { \
                TPE1 *bs = &(bp[k]);    \
                BUN parcel = (BUN)(i - k);      \
                TPE2 curval = TPE2##_nil; \
@@ -1911,25 +1894,86 @@ GDKanalyticalsum(BAT *r, BAT *p, BAT *b,
        return GDK_FAIL;
 }
 
-#define ANALYTICAL_PROD_CALC_NUM(TPE1, TPE2, TPE3)                     \
+/* product on integers */
+#define ANALYTICAL_PROD_CALC_NUM_UNBOUNDED_TILL_CURRENT_ROW(TPE1, TPE2, TPE3) \
+       do { \
+               TPE2 curval = TPE2##_nil; \
+               for (; k < i; k++) { \
+                       TPE1 v = bp[k]; \
+                       if (!is_##TPE1##_nil(v)) {              \
+                               if (is_##TPE2##_nil(curval))    \
+                                       curval = (TPE2) v;      \
+                               else                            \
+                                       MUL4_WITH_CHECK(v, curval, TPE2, 
curval, GDK_##TPE2##_max, TPE3, goto calc_overflow); \
+                       }                                       \
+                       rb[k] = curval; \
+                       has_nils |= is_##TPE2##_nil(curval);    \
+               } \
+       } while (0)
+
+#define ANALYTICAL_PROD_CALC_NUM_CURRENT_ROW_TILL_UNBOUNDED(TPE1, TPE2, TPE3) \
+       do { \
+               TPE2 curval = TPE2##_nil; \
+               for (j = i - 1; j >= k; j--) { \
+                       TPE1 v = bp[j]; \
+                       if (!is_##TPE1##_nil(v)) {              \
+                               if (is_##TPE2##_nil(curval))    \
+                                       curval = (TPE2) v;      \
+                               else                            \
+                                       MUL4_WITH_CHECK(v, curval, TPE2, 
curval, GDK_##TPE2##_max, TPE3, goto calc_overflow); \
+                       }                                       \
+                       rb[j] = curval; \
+                       has_nils |= is_##TPE2##_nil(curval);    \
+               } \
+               k = i; \
+       } while (0)
+
+#define ANALYTICAL_PROD_CALC_NUM_ALL_ROWS(TPE1, TPE2, TPE3)    \
+       do { \
+               TPE2 curval = TPE2##_nil; \
+               for (; j < i; j++) { \
+                       TPE1 v = bp[j]; \
+                       if (!is_##TPE1##_nil(v)) {              \
+                               if (is_##TPE2##_nil(curval))    \
+                                       curval = (TPE2) v;      \
+                               else                            \
+                                       MUL4_WITH_CHECK(v, curval, TPE2, 
curval, GDK_##TPE2##_max, TPE3, goto calc_overflow); \
+                       }                                       \
+               } \
+               for (; k < i; k++) \
+                       rb[k] = curval; \
+               has_nils |= is_##TPE2##_nil(curval);    \
+       } while (0)
+
+#define ANALYTICAL_PROD_CALC_NUM_CURRENT_ROW(TPE1, TPE2, TPE3) \
        do {                                                            \
-               TPE1 *bp = (TPE1*)Tloc(b, 0), *bs, *be, v;              \
-               TPE2 *restrict rb, curval = TPE2##_nil;                 \
-               rb = (TPE2*)Tloc(r, 0);                                 \
-               for (; i < cnt; i++, rb++) {                            \
-                       bs = bp + start[i];                             \
-                       be = bp + end[i];                               \
+               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];                               
\
+                       TPE1 *be = bp + end[k];                         \
                        for (; bs < be; bs++) {                         \
-                               v = *bs;                                \
+                               TPE1 v = *bs;                           \
                                if (!is_##TPE1##_nil(v)) {              \
                                        if (is_##TPE2##_nil(curval))    \
                                                curval = (TPE2) v;      \
                                        else                            \
-                                               MUL4_WITH_CHECK(v, curval, 
TPE2, curval, GDK_##TPE2##_max, TPE3, \
-                                                                               
goto calc_overflow); \
+                                               MUL4_WITH_CHECK(v, curval, 
TPE2, curval, GDK_##TPE2##_max, TPE3, goto calc_overflow); \
                                }                                       \
                        }                                               \
-                       *rb = curval;                                   \
+                       rb[k] = curval;                                 \
                        if (is_##TPE2##_nil(curval))                    \
                                has_nils = true;                        \
                        else                                            \
@@ -1937,24 +1981,86 @@ GDKanalyticalsum(BAT *r, BAT *p, BAT *b,
                }                                                       \
        } while (0)
 
-#define ANALYTICAL_PROD_CALC_NUM_LIMIT(TPE1, TPE2, REAL_IMP)           \
+/* product on integers while checking for overflows on the output  */
+#define ANALYTICAL_PROD_CALC_NUM_LIMIT_UNBOUNDED_TILL_CURRENT_ROW(TPE1, TPE2, 
REAL_IMP) \
+       do { \
+               TPE2 curval = TPE2##_nil; \
+               for (; k < i; k++) { \
+                       TPE1 v = bp[k]; \
+                       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); \
+                       }                                       \
+                       rb[k] = curval; \
+                       has_nils |= is_##TPE2##_nil(curval);    \
+               } \
+       } while (0)
+
+#define ANALYTICAL_PROD_CALC_NUM_LIMIT_CURRENT_ROW_TILL_UNBOUNDED(TPE1, TPE2, 
REAL_IMP) \
+       do { \
+               TPE2 curval = TPE2##_nil; \
+               for (j = i - 1; j >= k; j--) { \
+                       TPE1 v = bp[j]; \
+                       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); \
+                       }                                       \
+                       rb[j] = curval; \
+                       has_nils |= is_##TPE2##_nil(curval);    \
+               } \
+               k = i; \
+       } while (0)
+
+#define ANALYTICAL_PROD_CALC_NUM_LIMIT_ALL_ROWS(TPE1, TPE2, REAL_IMP)  \
+       do { \
+               TPE2 curval = TPE2##_nil; \
+               for (; j < i; j++) { \
+                       TPE1 v = bp[j]; \
+                       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); \
+                       }                                       \
+               } \
+               for (; k < i; k++) \
+                       rb[k] = curval; \
+               has_nils |= is_##TPE2##_nil(curval);    \
+       } while (0)
+
+#define ANALYTICAL_PROD_CALC_NUM_LIMIT_CURRENT_ROW(TPE1, TPE2, REAL_IMP)       
\
        do {                                                            \
-               TPE1 *bp = (TPE1*)Tloc(b, 0), *bs, *be, v;              \
-               TPE2 *restrict rb, curval = TPE2##_nil;                 \
-               rb = (TPE2*)Tloc(r, 0);                                 \
-               for (; i < cnt; i++, rb++) {                            \
-                       bs = bp + start[i];                             \
-                       be = bp + end[i];                               \
+               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_LIMIT_OTHERS(TPE1, TPE2, REAL_IMP)    \
+       do {                                                            \
+               TPE2 curval = TPE2##_nil;                       \
+               for (; k < i; k++) {                            \
+                       TPE1 *bs = bp + start[k];                               
\
+                       TPE1 *be = bp + end[k];                         \
                        for (; bs < be; bs++) {                         \
-                               v = *bs;                                \
+                               TPE1 v = *bs;                           \
                                if (!is_##TPE1##_nil(v)) {              \
                                        if (is_##TPE2##_nil(curval))    \
-                                               curval = (TPE2) v;      \
+                                               curval = (TPE2) v;      \
                                        else                            \
                                                REAL_IMP(v, curval, curval, 
GDK_##TPE2##_max, goto calc_overflow); \
                                }                                       \
                        }                                               \
-                       *rb = curval;                                   \
+                       rb[k] = curval;                                 \
                        if (is_##TPE2##_nil(curval))                    \
                                has_nils = true;                        \
                        else                                            \
@@ -1962,16 +2068,96 @@ GDKanalyticalsum(BAT *r, BAT *p, BAT *b,
                }                                                       \
        } while (0)
 
-#define ANALYTICAL_PROD_CALC_FP(TPE1, TPE2)                            \
+/* product on floating-points */
+#define ANALYTICAL_PROD_CALC_FP_UNBOUNDED_TILL_CURRENT_ROW(TPE1, TPE2) \
+       do { \
+               TPE2 curval = TPE2##_nil; \
+               for (; k < i; k++) { \
+                       TPE1 v = bp[k]; \
+                       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;            \
+                               }                               \
+                       }                                       \
+                       rb[k] = curval; \
+                       has_nils |= is_##TPE2##_nil(curval);    \
+               } \
+       } while (0)
+
+#define ANALYTICAL_PROD_CALC_FP_CURRENT_ROW_TILL_UNBOUNDED(TPE1, TPE2) \
+       do { \
+               TPE2 curval = TPE2##_nil; \
+               for (j = i - 1; j >= k; j--) { \
+                       TPE1 v = bp[j]; \
+                       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;            \
+                               }                               \
+                       }                                       \
+                       rb[j] = curval; \
+                       has_nils |= is_##TPE2##_nil(curval);    \
+               } \
+               k = i; \
+       } while (0)
+
+#define ANALYTICAL_PROD_CALC_FP_ALL_ROWS(TPE1, TPE2)   \
+       do { \
+               TPE2 curval = TPE2##_nil; \
+               for (; j < i; j++) { \
+                       TPE1 v = bp[j]; \
+                       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;            \
+                               }                               \
+                       }                                       \
+               } \
+               for (; k < i; k++) \
+                       rb[k] = curval; \
+               has_nils |= is_##TPE2##_nil(curval);    \
+       } while (0)
+
+#define ANALYTICAL_PROD_CALC_FP_CURRENT_ROW(TPE1, TPE2)        \
        do {                                                            \
-               TPE1 *bp = (TPE1*)Tloc(b, 0), *bs, *be, v;              \
-               TPE2 *restrict rb, curval = TPE2##_nil;                 \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to