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