Changeset: a188e7b1868b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a188e7b1868b Modified Files: gdk/gdk_analytic_func.c Branch: window-tunning Log Message:
Updated avg returning int analytical function diffs (244 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 @@ -2198,6 +2198,7 @@ GDKanalyticalprod(BAT *r, BAT *p, BAT *b #define LNG_HGE lng #endif +/* average on integers */ #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); \ @@ -2335,6 +2336,7 @@ calc_done##TPE##IMP##PART: } \ } while (0) +/* average on floating-points */ #define ANALYTICAL_AVG_IMP_FP_UNBOUNDED_TILL_CURRENT_ROW(TPE, IMP, PART, LNG_HGE) \ do { \ for (; k < i; k++) { \ @@ -2381,10 +2383,9 @@ calc_done##TPE##IMP##PART: #define ANALYTICAL_AVG_IMP_FP_OTHERS(TPE, IMP, PART, LNG_HGE) \ do { \ - TPE *be = 0, *bs = 0; \ for (; k < i; k++) { \ - bs = bp + start[k]; \ - be = bp + end[k]; \ + TPE *bs = bp + start[k]; \ + TPE *be = bp + end[k]; \ for (; bs < be; bs++) { \ v = *bs; \ if (!is_##TPE##_nil(v)) \ @@ -2514,23 +2515,94 @@ GDKanalyticalavg(BAT *r, BAT *p, BAT *b, } while(0) #endif -#define ANALYTICAL_AVERAGE_INT_CALC(TPE) \ +#define ANALYTICAL_AVG_INT_UNBOUNDED_TILL_CURRENT_ROW(TPE) \ + do { \ + TPE avg = 0; \ + for (; k < i; k++) { \ + TPE v = bp[k]; \ + if (!is_##TPE##_nil(v)) \ + AVERAGE_ITER(TPE, v, avg, rem, ncnt); \ + if (ncnt == 0) { \ + has_nils = true; \ + rb[k] = TPE##_nil; \ + } else { \ + dbl avgfinal = avg; \ + ANALYTICAL_AVERAGE_INT_CALC_FINALIZE(avgfinal, rem, ncnt); \ + rb[k] = avgfinal; \ + } \ + } \ + rem = 0; \ + ncnt = 0; \ + avg = 0; \ + } while (0) + +#define ANALYTICAL_AVG_INT_CURRENT_ROW_TILL_UNBOUNDED(TPE) \ + do { \ + TPE avg = 0; \ + for (j = i - 1; j >= k; j--) { \ + TPE v = bp[j]; \ + if (!is_##TPE##_nil(v)) \ + AVERAGE_ITER(TPE, v, avg, rem, ncnt); \ + if (ncnt == 0) { \ + has_nils = true; \ + rb[k] = TPE##_nil; \ + } else { \ + dbl avgfinal = avg; \ + ANALYTICAL_AVERAGE_INT_CALC_FINALIZE(avgfinal, rem, ncnt); \ + rb[k] = avgfinal; \ + } \ + } \ + rem = 0; \ + ncnt = 0; \ + avg = 0; \ + k = i; \ + } while (0) + +#define ANALYTICAL_AVG_INT_ALL_ROWS(TPE) \ + do { \ + TPE avg = 0; \ + for (; j < i; j++) { \ + TPE v = bp[j]; \ + if (!is_##TPE##_nil(v)) \ + AVERAGE_ITER(TPE, v, avg, rem, ncnt); \ + } \ + if (ncnt == 0) { \ + has_nils = true; \ + rb[k] = TPE##_nil; \ + } else { \ + ANALYTICAL_AVERAGE_INT_CALC_FINALIZE(avg, rem, ncnt); \ + rb[k] = avg; \ + } \ + rem = 0; \ + ncnt = 0; \ + avg = 0; \ + } while (0) + +#define ANALYTICAL_AVG_INT_CURRENT_ROW(TPE) \ do { \ - TPE *bp = (TPE*)Tloc(b, 0), *restrict rb = (TPE *) Tloc(r, 0), *bs, *be, v, avg = 0; \ - for (; i < cnt; i++) { \ - bs = bp + start[i]; \ - be = bp + end[i]; \ + for (; k < i; k++) { \ + TPE v = bp[k]; \ + rb[k] = bp[k]; \ + has_nils |= is_##TPE##_nil(v); \ + } \ + } while (0) + +#define ANALYTICAL_AVG_INT_OTHERS(TPE) \ + do { \ + TPE avg = 0; \ + for (; k < i; k++) { \ + TPE *bs = bp + start[k], *be = bp + end[k]; \ for (; bs < be; bs++) { \ - v = *bs; \ + TPE v = *bs; \ if (!is_##TPE##_nil(v)) \ AVERAGE_ITER(TPE, v, avg, rem, ncnt); \ } \ if (ncnt == 0) { \ has_nils = true; \ - rb[i] = TPE##_nil; \ + rb[k] = TPE##_nil; \ } else { \ ANALYTICAL_AVERAGE_INT_CALC_FINALIZE(avg, rem, ncnt); \ - rb[i] = avg; \ + rb[k] = avg; \ } \ rem = 0; \ ncnt = 0; \ @@ -2538,41 +2610,79 @@ GDKanalyticalavg(BAT *r, BAT *p, BAT *b, } \ } while (0) +#define ANALYTICAL_AVG_INT_PARTITIONS(TPE, IMP) \ + do { \ + TPE *bp = (TPE*)Tloc(b, 0), *restrict rb = (TPE *) Tloc(r, 0); \ + if (p) { \ + for (; i < cnt; i++) { \ + if (np[i]) \ + IMP(TPE); \ + } \ + i = cnt; \ + IMP(TPE); \ + } else { \ + i = cnt; \ + IMP(TPE); \ + } \ + } while (0) + +#if HAVE_HGE +#define ANALYTICAL_AVG_INT_LIMIT(IMP) \ + case TYPE_hge: \ + ANALYTICAL_AVG_INT_PARTITIONS(hge, ANALYTICAL_AVG_INT_##IMP); \ + break; +#else +#define ANALYTICAL_AVG_INT_LIMIT(IMP) +#endif + +#define ANALYTICAL_AVG_INT_BRANCHES(IMP) \ + do { \ + switch (tpe) { \ + case TYPE_bte: \ + ANALYTICAL_AVG_INT_PARTITIONS(bte, ANALYTICAL_AVG_INT_##IMP); \ + break; \ + case TYPE_sht: \ + ANALYTICAL_AVG_INT_PARTITIONS(sht, ANALYTICAL_AVG_INT_##IMP); \ + break; \ + case TYPE_int: \ + ANALYTICAL_AVG_INT_PARTITIONS(int, ANALYTICAL_AVG_INT_##IMP); \ + break; \ + case TYPE_lng: \ + ANALYTICAL_AVG_INT_PARTITIONS(lng, ANALYTICAL_AVG_INT_##IMP); \ + break; \ + ANALYTICAL_AVG_INT_LIMIT(IMP) \ + default: \ + goto nosupport; \ + } \ + } while (0) + + gdk_return GDKanalyticalavginteger(BAT *r, BAT *p, BAT *b, BAT *s, BAT *e, int tpe, int frame_type) { bool has_nils = false; - BUN i = 0, cnt = BATcount(b); - lng *restrict start, *restrict end, rem = 0, ncnt = 0; - - assert(s && e); - start = (lng *) Tloc(s, 0); - end = (lng *) Tloc(e, 0); - - (void) p; - (void) frame_type; + lng i = 0, j = 0, k = 0, cnt = (lng) BATcount(b), rem = 0, ncnt = 0; + lng *restrict start = s ? (lng*)Tloc(s, 0) : NULL, *restrict end = e ? (lng*)Tloc(e, 0) : NULL; + bit *restrict np = p ? Tloc(p, 0) : NULL; - switch (tpe) { - case TYPE_bte: - ANALYTICAL_AVERAGE_INT_CALC(bte); - break; - case TYPE_sht: - ANALYTICAL_AVERAGE_INT_CALC(sht); - break; - case TYPE_int: - ANALYTICAL_AVERAGE_INT_CALC(int); - break; - case TYPE_lng: - ANALYTICAL_AVERAGE_INT_CALC(lng); - break; -#ifdef HAVE_HGE - case TYPE_hge: - ANALYTICAL_AVERAGE_INT_CALC(hge); - break; -#endif - default: - goto nosupport; + switch (frame_type) { + case 3: /* unbounded until current row */ { + ANALYTICAL_AVG_INT_BRANCHES(UNBOUNDED_TILL_CURRENT_ROW); + } break; + case 4: /* current row until unbounded */ { + ANALYTICAL_AVG_INT_BRANCHES(CURRENT_ROW_TILL_UNBOUNDED); + } break; + case 5: /* all rows */ { + ANALYTICAL_AVG_INT_BRANCHES(ALL_ROWS); + } break; + case 6: /* current row */ { + ANALYTICAL_AVG_INT_BRANCHES(CURRENT_ROW); + } break; + default: { + ANALYTICAL_AVG_INT_BRANCHES(OTHERS); } + } + BATsetcount(r, cnt); r->tnonil = !has_nils; r->tnil = has_nils; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list