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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list