Changeset: c267865589c3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c267865589c3
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 avg analytical function
diffs (truncated from 766 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
@@ -34,8 +34,8 @@ gdk_export gdk_return GDKanalyticalmax(B
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 *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);
+gdk_export gdk_return GDKanalyticalavg(BAT *r, BAT *p, BAT *b, BAT *s, BAT *e,
int tpe, int frame_type);
+gdk_export gdk_return GDKanalyticalavginteger(BAT *r, BAT *p, BAT *b, BAT *s,
BAT *e, int tpe, int frame_type);
gdk_export gdk_return GDKanalytical_stddev_samp(BAT *r, BAT *b, BAT *s, BAT
*e, int tpe);
gdk_export gdk_return GDKanalytical_stddev_pop(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
@@ -2192,22 +2192,22 @@ GDKanalyticalprod(BAT *r, BAT *p, BAT *b
return GDK_FAIL;
}
-#define ANALYTICAL_AVERAGE_CALC_NUM(TPE,lng_hge) \
- do { \
- TPE *bp = (TPE*)Tloc(b, 0), *bs, *be, v, a = 0; \
- for (; i < cnt; i++, rb++) { \
- bs = bp + start[i]; \
- be = bp + end[i]; \
- for (; bs < be; bs++) { \
- v = *bs; \
- if (!is_##TPE##_nil(v)) { \
- ADD_WITH_CHECK(v, sum, lng_hge, sum,
GDK_##lng_hge##_max, goto avg_overflow##TPE); \
- /* count only when no overflow occurs
*/ \
- n++; \
- } \
- } \
+#ifdef HAVE_HGE
+#define LNG_HGE hge
+#else
+#define LNG_HGE lng
+#endif
+
+#define ANALYTICAL_AVERAGE_CALC_NUM_STEP1(TPE, IMP, PART, LNG_HGE) \
+ if (!is_##TPE##_nil(v)) { \
+ ADD_WITH_CHECK(v, sum, LNG_HGE, sum, GDK_##LNG_HGE##_max, goto
avg_overflow##TPE##IMP##PART); \
+ /* count only when no overflow occurs */ \
+ n++; \
+ }
+
+#define ANALYTICAL_AVERAGE_CALC_NUM_STEP2(TPE, IMP, PART) \
if (0) { \
-avg_overflow##TPE: \
+avg_overflow##TPE##IMP##PART:
\
assert(n > 0); \
if (sum >= 0) { \
a = (TPE) (sum / n); \
@@ -2220,102 +2220,277 @@ avg_overflow##TPE:
\
a--; \
rr = n - rr; \
} \
- } \
- for (; bs < be; bs++) { \
- v = *bs; \
- if (is_##TPE##_nil(v)) \
- continue; \
- AVERAGE_ITER(TPE, v, a, rr, n); \
- } \
+ }
+
+#define ANALYTICAL_AVERAGE_CALC_NUM_STEP3(TPE, IMP, PART) \
curval = a + (dbl) rr / n; \
- goto calc_done##TPE; \
+ goto calc_done##TPE##IMP##PART;
\
} \
curval = n > 0 ? (dbl) sum / n : dbl_nil; \
-calc_done##TPE:
\
- *rb = curval; \
+calc_done##TPE##IMP##PART:
+
+#define ANALYTICAL_AVG_IMP_NUM_UNBOUNDED_TILL_CURRENT_ROW(TPE, IMP, PART,
LNG_HGE) \
+ do { \
+ for (; k < i; k++) { \
+ v = bp[k]; \
+ ANALYTICAL_AVERAGE_CALC_NUM_STEP1(TPE, IMP, PART,
LNG_HGE) \
+ ANALYTICAL_AVERAGE_CALC_NUM_STEP2(TPE, IMP, PART) \
+ for (; k < i; k++) { \
+ v = bp[k]; \
+ if (is_##TPE##_nil(v)) \
+ continue; \
+ AVERAGE_ITER(TPE, v, a, rr, n); \
+ } \
+ ANALYTICAL_AVERAGE_CALC_NUM_STEP3(TPE, IMP, PART) \
+ rb[k] = curval; \
+ has_nils = has_nils || (n == 0); \
+ } \
+ n = 0; \
+ sum = 0; \
+ a = 0; \
+ } while (0)
+
+#define ANALYTICAL_AVG_IMP_NUM_CURRENT_ROW_TILL_UNBOUNDED(TPE, IMP, PART,
LNG_HGE) \
+ do { \
+ for (j = i - 1; j >= k; j--) { \
+ v = bp[j]; \
+ ANALYTICAL_AVERAGE_CALC_NUM_STEP1(TPE, IMP, PART,
LNG_HGE) \
+ ANALYTICAL_AVERAGE_CALC_NUM_STEP2(TPE, IMP, PART) \
+ for (; j >= k; j--) { \
+ v = bp[j]; \
+ if (is_##TPE##_nil(v)) \
+ continue; \
+ AVERAGE_ITER(TPE, v, a, rr, n); \
+ } \
+ ANALYTICAL_AVERAGE_CALC_NUM_STEP3(TPE, IMP, PART) \
+ rb[j] = curval; \
has_nils = has_nils || (n == 0); \
- n = 0; \
- sum = 0; \
+ } \
+ n = 0; \
+ sum = 0; \
+ a = 0; \
+ k = i; \
+ } while (0)
+
+#define ANALYTICAL_AVG_IMP_NUM_ALL_ROWS(TPE, IMP, PART, LNG_HGE) \
+ do { \
+ dbl dr = 0; \
+ for (; j < i; j++) { \
+ v = bp[j]; \
+ ANALYTICAL_AVERAGE_CALC_NUM_STEP1(TPE, IMP, PART,
LNG_HGE) \
+ ANALYTICAL_AVERAGE_CALC_NUM_STEP2(TPE, IMP, PART) \
+ for (; j < i; j++) { \
+ v = bp[j]; \
+ if (is_##TPE##_nil(v)) \
+ continue; \
+ AVERAGE_ITER(TPE, v, a, rr, n); \
+ } \
+ ANALYTICAL_AVERAGE_CALC_NUM_STEP3(TPE, IMP, PART) \
+ dr = curval; \
+ } \
+ for (; k < i; k++) \
+ rb[k] = dr; \
+ has_nils = has_nils || (n == 0); \
+ n = 0; \
+ sum = 0; \
+ a = 0; \
+ } while (0)
+
+#define ANALYTICAL_AVG_IMP_NUM_CURRENT_ROW(TPE, IMP, PART, LNG_HGE) \
+ do { \
+ for (; k < i; k++) { \
+ v = bp[k]; \
+ if (is_##TPE##_nil(v)) { \
+ rb[k] = dbl_nil; \
+ has_nils = true; \
+ } else { \
+ rb[k] = (dbl) v; \
+ } \
+ } \
+ } while (0)
+
+#define ANALYTICAL_AVG_IMP_NUM_OTHERS(TPE, IMP, PART, LNG_HGE) \
+ do { \
+ TPE *be = 0, *bs = 0; \
+ for (; k < i; k++) { \
+ bs = bp + start[k]; \
+ be = bp + end[k]; \
+ for (; bs < be; bs++) { \
+ v = *bs; \
+ ANALYTICAL_AVERAGE_CALC_NUM_STEP1(TPE, IMP,
PART, LNG_HGE) \
+ } \
+ ANALYTICAL_AVERAGE_CALC_NUM_STEP2(TPE, IMP, PART) \
+ for (; bs < be; bs++) { \
+ v = *bs; \
+ if (is_##TPE##_nil(v)) \
+ continue; \
+ AVERAGE_ITER(TPE, v, a, rr, n); \
+ } \
+ ANALYTICAL_AVERAGE_CALC_NUM_STEP3(TPE, IMP, PART) \
+ rb[k] = curval; \
+ has_nils = has_nils || (n == 0); \
+ n = 0; \
+ sum = 0; \
+ a = 0; \
} \
} while (0)
-#ifdef HAVE_HGE
-#define ANALYTICAL_AVERAGE_LNG_HGE(TPE) ANALYTICAL_AVERAGE_CALC_NUM(TPE,hge)
-#else
-#define ANALYTICAL_AVERAGE_LNG_HGE(TPE) ANALYTICAL_AVERAGE_CALC_NUM(TPE,lng)
-#endif
+#define ANALYTICAL_AVG_IMP_FP_UNBOUNDED_TILL_CURRENT_ROW(TPE, IMP, PART,
LNG_HGE) \
+ do { \
+ for (; k < i; k++) { \
+ v = bp[k]; \
+ if (!is_##TPE##_nil(v)) \
+ AVERAGE_ITER_FLOAT(TPE, v, a, n); \
+ rb[k] = curval; \
+ has_nils = has_nils || (n == 0); \
+ } \
+ n = 0; \
+ a = 0; \
+ } while (0)
-#define ANALYTICAL_AVERAGE_CALC_FP(TPE)
\
+#define ANALYTICAL_AVG_IMP_FP_CURRENT_ROW_TILL_UNBOUNDED(TPE, IMP, PART,
LNG_HGE) \
+ do { \
+ for (j = i - 1; j >= k; j--) { \
+ v = bp[j]; \
+ if (!is_##TPE##_nil(v)) \
+ AVERAGE_ITER_FLOAT(TPE, v, a, n); \
+ rb[j] = curval; \
+ has_nils = has_nils || (n == 0); \
+ } \
+ n = 0; \
+ a = 0; \
+ k = i; \
+ } while (0)
+
+#define ANALYTICAL_AVG_IMP_FP_ALL_ROWS(TPE, IMP, PART, LNG_HGE) \
+ do { \
+ for (; j < i; j++) { \
+ v = bp[j]; \
+ if (!is_##TPE##_nil(v)) \
+ AVERAGE_ITER_FLOAT(TPE, v, a, n); \
+ } \
+ curval = (n > 0) ? a : dbl_nil; \
+ for (; k < i; k++) \
+ rb[k] = curval; \
+ has_nils = has_nils || (n == 0); \
+ n = 0; \
+ a = 0; \
+ } while (0)
+
+#define ANALYTICAL_AVG_IMP_FP_CURRENT_ROW(TPE, IMP, PART, LNG_HGE)
ANALYTICAL_AVG_IMP_NUM_CURRENT_ROW(TPE, IMP, PART, LNG_HGE)
+
+#define ANALYTICAL_AVG_IMP_FP_OTHERS(TPE, IMP, PART, LNG_HGE)
\
do { \
- TPE *bp = (TPE*)Tloc(b, 0), *bs, *be, v; \
- dbl a = 0; \
- for (; i < cnt; i++, rb++) { \
- bs = bp + start[i]; \
- be = bp + end[i]; \
+ TPE *be = 0, *bs = 0; \
+ for (; k < i; k++) { \
+ bs = bp + start[k]; \
+ be = bp + end[k]; \
for (; bs < be; bs++) { \
v = *bs; \
if (!is_##TPE##_nil(v)) \
AVERAGE_ITER_FLOAT(TPE, v, a, n); \
} \
curval = (n > 0) ? a : dbl_nil; \
- *rb = curval; \
+ rb[k] = curval; \
has_nils = has_nils || (n == 0); \
- n = 0; \
- a = 0; \
+ n = 0; \
+ a = 0; \
+ } \
+ } while (0)
+
+#define ANALYTICAL_AVG_PARTITIONS(TPE, IMP, LNG_HGE, REAL_IMP) \
+ do { \
+ TPE *bp = (TPE*)Tloc(b, 0), v = 0; \
+ if (p) { \
+ for (; i < cnt; i++) { \
+ if (np[i]) \
+ REAL_IMP(TPE, IMP, P1, LNG_HGE);
\
+ } \
+ i = cnt; \
+ REAL_IMP(TPE, IMP, P2, LNG_HGE); \
+ } else { \
+ i = cnt; \
+ REAL_IMP(TPE, IMP, P3, LNG_HGE); \
} \
} while (0)
+#if HAVE_HGE
+#define ANALYTICAL_AVG_LIMIT(IMP, LNG_HGE) \
+ case TYPE_hge: \
+ ANALYTICAL_AVG_PARTITIONS(hge, IMP, LNG_HGE,
ANALYTICAL_AVG_IMP_NUM_##IMP); \
+ break;
+#else
+#define ANALYTICAL_PROD_LIMIT(IMP, LNG_HGE)
+#endif
+
+#define ANALYTICAL_AVG_BRANCHES(IMP, LNG_HGE) \
+ do { \
+ switch (tpe) { \
+ case TYPE_bte: \
+ ANALYTICAL_AVG_PARTITIONS(bte, IMP, LNG_HGE,
ANALYTICAL_AVG_IMP_NUM_##IMP); \
+ break; \
+ case TYPE_sht: \
+ ANALYTICAL_AVG_PARTITIONS(sht, IMP, LNG_HGE,
ANALYTICAL_AVG_IMP_NUM_##IMP); \
+ break; \
+ case TYPE_int: \
+ ANALYTICAL_AVG_PARTITIONS(int, IMP, LNG_HGE,
ANALYTICAL_AVG_IMP_NUM_##IMP); \
+ break; \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list