Changeset: 646c8489096d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=646c8489096d
Modified Files:
        gdk/gdk_analytic.h
        gdk/gdk_analytic_func.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_rank.c
        sql/backends/monet5/sql_rank.h
Branch: window-tunning
Log Message:

Updated sum analytical function


diffs (truncated from 948 to 300 lines):

diff --git a/gdk/gdk_analytic.h b/gdk/gdk_analytic.h
--- a/gdk/gdk_analytic.h
+++ b/gdk/gdk_analytic.h
@@ -32,8 +32,8 @@ gdk_export gdk_return GDKanalyticalnthva
 gdk_export gdk_return GDKanalyticalmin(BAT *r, BAT *p, BAT *b, BAT *s, BAT *e, 
int tpe, int frame_type);
 gdk_export gdk_return GDKanalyticalmax(BAT *r, BAT *p, BAT *b, BAT *s, BAT *e, 
int tpe, int frame_type);
 gdk_export gdk_return GDKanalyticalcount(BAT *r, BAT *p, BAT *b, BAT *s, BAT 
*e, bit ignore_nils, int tpe, int frame_type);
-gdk_export gdk_return GDKanalyticalsum(BAT *r, BAT *b, BAT *s, BAT *e, int 
tp1, int tp2);
-gdk_export gdk_return GDKanalyticalprod(BAT *r, BAT *b, BAT *s, BAT *e, int 
tp1, int tp2);
+gdk_export gdk_return GDKanalyticalsum(BAT *r, BAT *p, BAT *b, BAT *s, BAT *e, 
int tp1, int tp2, int frame_type);
+gdk_export gdk_return GDKanalyticalprod(BAT *r, BAT *p, BAT *b, BAT *s, BAT 
*e, int tp1, int tp2, int frame_type);
 gdk_export gdk_return GDKanalyticalavg(BAT *r, BAT *b, BAT *s, BAT *e, int 
tpe);
 gdk_export gdk_return GDKanalyticalavginteger(BAT *r, BAT *b, BAT *s, BAT *e, 
int tpe);
 
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
@@ -1543,22 +1543,86 @@ GDKanalyticalcount(BAT *r, BAT *p, BAT *
        return GDK_SUCCEED;
 }
 
-#define ANALYTICAL_SUM_IMP_NUM(TPE1, TPE2)                             \
-       do {                                                            \
-               TPE1 *bs, *be, v;                                       \
-               for (; i < cnt; i++, rb++) {                            \
-                       bs = bp + start[i];                             \
-                       be = bp + end[i];                               \
-                       for (; bs < be; bs++) {                         \
-                               v = *bs;                                \
+/* sum on fixed size integers */
+#define ANALYTICAL_SUM_IMP_NUM_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                            \
+                                       ADD_WITH_CHECK(v, curval, TPE2, curval, 
GDK_##TPE2##_max, goto calc_overflow); \
+                       }                                       \
+                       rb[k] = curval; \
+                       has_nils |= is_##TPE2##_nil(curval);    \
+               } \
+       } while (0)
+
+#define ANALYTICAL_SUM_IMP_NUM_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                            \
+                                       ADD_WITH_CHECK(v, curval, TPE2, curval, 
GDK_##TPE2##_max, goto calc_overflow); \
+                       }                                       \
+                       rb[j] = curval; \
+                       has_nils |= is_##TPE2##_nil(curval);    \
+               } \
+               k = i; \
+       } while (0)
+
+#define ANALYTICAL_SUM_IMP_NUM_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_IMP_NUM_CURRENT_ROW(TPE1, TPE2) \
+       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_SUM_IMP_NUM_OTHERS(TPE1, TPE2)      \
+       do { \
+               TPE2 curval = TPE2##_nil; \
+               for (; k < i; k++) {            \
+                       TPE1 *bs = bp + start[k];               \
+                       TPE1 *be = bp + end[k];         \
+                       for (; bs < be; bs++) {                 \
+                               TPE1 v = *bs;                           \
                                if (!is_##TPE1##_nil(v)) {              \
                                        if (is_##TPE2##_nil(curval))    \
-                                               curval = (TPE2) v;      \
+                                               curval = (TPE2) v;      \
                                        else                            \
                                                ADD_WITH_CHECK(v, curval, TPE2, 
curval, GDK_##TPE2##_max, goto calc_overflow); \
                                }                                       \
                        }                                               \
-                       *rb = curval;                                   \
+                       rb[k] = curval;                                 \
                        if (is_##TPE2##_nil(curval))                    \
                                has_nils = true;                        \
                        else                                            \
@@ -1566,14 +1630,94 @@ GDKanalyticalcount(BAT *r, BAT *p, BAT *
                }                                                       \
        } while (0)
 
-#define ANALYTICAL_SUM_IMP_FP(TPE1, TPE2)                              \
+/* 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; k++) { \
+                       TPE1 v = bp[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); \
+                       }                                       \
+                       rb[k] = curval; \
+                       has_nils |= is_##TPE2##_nil(curval);    \
+               } \
+       } while (0)
+
+#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; 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); \
+                       }                                       \
+                       rb[j] = curval; \
+                       has_nils |= is_##TPE2##_nil(curval);    \
+               } \
+               k = i; \
+       } while (0)
+
+#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; \
+               if (dofsum(bs, 0,                       \
+                               &(struct canditer){.tpe = cand_dense, .ncand = 
parcel,}, \
+                               parcel, &curval, 1, TYPE_##TPE1, \
+                               TYPE_##TPE2, NULL, 0, 0, true, \
+                               false, true) == BUN_NONE) {     \
+                       goto bailout;                   \
+               }       \
+               for (; k < i; k++) \
+                       rb[k] = curval; \
+               has_nils |= is_##TPE2##_nil(curval);    \
+       } while (0)
+
+#define ANALYTICAL_SUM_IMP_FP_CURRENT_ROW(TPE1, TPE2)  \
+       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_SUM_IMP_FP_OTHERS(TPE1, TPE2)                               
\
        do {                                                            \
-               TPE1 *bs;                                               \
-               BUN parcel;                                             \
-               for (; i < cnt; i++, rb++) {                            \
-                       if (end[i] > start[i]) {                        \
-                               bs = bp + start[i];                     \
-                               parcel = (BUN)(end[i] - start[i]);      \
+               TPE2 curval = TPE2##_nil; \
+               for (; k < i; k++) {            \
+                       if (end[k] > start[k]) {                        \
+                               TPE1 *bs = bp + start[k];                       
\
+                               BUN parcel = (BUN)(end[k] - start[k]);  \
                                if (dofsum(bs, 0,                       \
                                           &(struct canditer){.tpe = 
cand_dense, .ncand = parcel,}, \
                                           parcel, &curval, 1, TYPE_##TPE1, \
@@ -1582,7 +1726,7 @@ GDKanalyticalcount(BAT *r, BAT *p, BAT *
                                        goto bailout;                   \
                                }                                       \
                        }                                               \
-                       *rb = curval;                                   \
+                       rb[k] = curval;                                 \
                        if (is_##TPE2##_nil(curval))                    \
                                has_nils = true;                        \
                        else                                            \
@@ -1592,132 +1736,165 @@ GDKanalyticalcount(BAT *r, BAT *p, BAT *
 
 #define ANALYTICAL_SUM_CALC(TPE1, TPE2, IMP)           \
        do {                                            \
-               TPE1 *bp = (TPE1*)Tloc(b, 0);           \
-               TPE2 *restrict rb, curval = TPE2##_nil; \
-               rb = (TPE2*)Tloc(r, 0);                 \
-               IMP(TPE1, TPE2);                        \
+               TPE1 *bp = (TPE1*)Tloc(b, 0);    \
+               TPE2 *restrict rb = (TPE2*)Tloc(r, 0); \
+               if (p) {                                        \
+                       for (; i < cnt; i++) {          \
+                               if (np[i])                      \
+                                       IMP(TPE1, TPE2);        \
+                       }                                               \
+                       i = cnt;                        \
+                       IMP(TPE1, TPE2);        \
+               } else {                                \
+                       i = cnt;                                        \
+                       IMP(TPE1, TPE2);        \
+               }                                                       \
+       } while (0)
+
+#if HAVE_HGE
+#define ANALYTICAL_SUM_LIMIT(IMP)      \
+       case TYPE_hge:{         \
+               switch (tp1) {          \
+               case TYPE_bte:          \
+                       ANALYTICAL_SUM_CALC(bte, hge, 
ANALYTICAL_SUM_IMP_NUM_##IMP);            \
+                       break;                  \
+               case TYPE_sht:          \
+                       ANALYTICAL_SUM_CALC(sht, hge, 
ANALYTICAL_SUM_IMP_NUM_##IMP);            \
+                       break;                  \
+               case TYPE_int:          \
+                       ANALYTICAL_SUM_CALC(int, hge, 
ANALYTICAL_SUM_IMP_NUM_##IMP);            \
+                       break;                  \
+               case TYPE_lng:          \
+                       ANALYTICAL_SUM_CALC(lng, hge, 
ANALYTICAL_SUM_IMP_NUM_##IMP);            \
+                       break;                  \
+               case TYPE_hge:          \
+                       ANALYTICAL_SUM_CALC(hge, hge, 
ANALYTICAL_SUM_IMP_NUM_##IMP);            \
+                       break;          \
+               default:                \
+                       goto nosupport;         \
+               }                       \
+               break;          \
+       }
+#else
+#define ANALYTICAL_SUM_LIMIT(IMP)
+#endif
+
+#define ANALYTICAL_SUM_BRANCHES(IMP)           \
+       do { \
+               switch (tp2) {          \
+               case TYPE_bte:{         \
+                       switch (tp1) {          \
+                       case TYPE_bte:          \
+                               ANALYTICAL_SUM_CALC(bte, bte, 
ANALYTICAL_SUM_IMP_NUM_##IMP);    \
+                               break;          \
+                       default:                \
+                               goto nosupport;         \
+                       }               \
+                       break;          \
+               }               \
+               case TYPE_sht:{         \
+                       switch (tp1) {          \
+                       case TYPE_bte:          \
+                               ANALYTICAL_SUM_CALC(bte, sht, 
ANALYTICAL_SUM_IMP_NUM_##IMP);    \
+                               break;          \
+                       case TYPE_sht:          \
+                               ANALYTICAL_SUM_CALC(sht, sht, 
ANALYTICAL_SUM_IMP_NUM_##IMP);    \
+                               break;          \
+                       default:                \
+                               goto nosupport;         \
+                       }               \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to