Changeset: 8d16b6a626e4 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8d16b6a626e4 Modified Files: gdk/gdk_analytic.h gdk/gdk_analytic_func.c sql/backends/monet5/sql_rank.c sql/backends/monet5/sql_rank.h sql/backends/monet5/sql_rank.mal sql/backends/monet5/sql_rank.mal.sh sql/backends/monet5/sql_rank_hge.mal sql/backends/monet5/sql_rank_hge.mal.sh sql/backends/monet5/sql_upgrades.c sql/scripts/39_analytics.sql sql/test/analytics/Tests/analytics14.sql sql/test/analytics/Tests/analytics14.stable.out Branch: statistics-analytics Log Message:
Removed median, median_avg, quantile and quantile_avg window functions. They require input order to be computed which may not be achieved on window functions, which make them pointless to exist diffs (truncated from 2371 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 @@ -45,7 +45,4 @@ gdk_export gdk_return GDKanalytical_vari gdk_export gdk_return GDKanalytical_covariance_pop(BAT *r, BAT *b1, BAT *b2, BAT *s, BAT *e, int tpe); gdk_export gdk_return GDKanalytical_covariance_samp(BAT *r, BAT *b1, BAT *b2, BAT *s, BAT *e, int tpe); -gdk_export gdk_return GDKanalytical_quantile(BAT *r, BAT *b, BAT *s, BAT *e, BAT *q, const void *restrict quantile, int tp1, int tp2); -gdk_export gdk_return GDKanalytical_quantile_avg(BAT *r, BAT *b, BAT *s, BAT *e, BAT *q, const void *restrict quantile, int tp1, int tp2); - #endif //_GDK_ANALYTIC_H_ 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 @@ -1882,311 +1882,3 @@ GDKanalytical_##NAME(BAT *r, BAT *b1, BA GDK_ANALYTICAL_COVARIANCE(covariance_samp, 1, m2 / (n - 1)) GDK_ANALYTICAL_COVARIANCE(covariance_pop, 0, m2 / n) - -/* There will be always at least one value for the quantile, because we don't implement the exclude clause yet */ - -#define ANALYTICAL_QUANTILE_IMP_FIXED(TPE1, TPE2, NEXT_QUA) \ - do { \ - TPE1 *restrict bp = (TPE1*)Tloc(b, 0), *restrict rb = (TPE1*)Tloc(r, 0), v; \ - for (; i < cnt; i++, rb++) { \ - TPE2 nqua = NEXT_QUA; \ - if (is_##TPE2##_nil(nqua)) { \ - *rb = TPE1##_nil; \ - has_nils = true; \ - } else { \ - ss = (BUN) start[i]; \ - ee = (BUN) end[i]; \ - f = (ee - ss - 1) * nqua; \ - qindex = ss + ee - (BUN) (ee + 0.5f - f); \ - assert(qindex >= ss && qindex < ee); \ - v = bp[qindex]; \ - *rb = v; \ - has_nils |= (is_##TPE1##_nil(v)); \ - } \ - } \ - } while (0) - -#define ANALYTICAL_QUANTILE_IMP_VARSIZED(TPE2, NEXT_QUA) \ - do { \ - BATiter bpi = bat_iterator(b); \ - for (; i < cnt; i++) { \ - TPE2 nqua = NEXT_QUA; \ - if (is_##TPE2##_nil(nqua)) { \ - curval = (void *) nil; \ - has_nils = true; \ - } else { \ - ss = (BUN) start[i]; \ - ee = (BUN) end[i]; \ - f = (ee - ss - 1) * nqua; \ - qindex = ss + ee - (BUN) (ee + 0.5f - f); \ - assert(qindex >= ss && qindex < ee); \ - curval = BUNtail(bpi, qindex); \ - has_nils |= atomcmp(curval, nil) == 0; \ - } \ - if (BUNappend(r, curval, false) != GDK_SUCCEED) \ - goto allocation_error; \ - } \ - } while (0) - -#define ANALYTICAL_QUANTILE_CALC_MULTI(TPE1) \ - do { \ - switch (tp2) { \ - case TYPE_flt: { \ - flt *restrict qp = (flt*)Tloc(q, 0); \ - ANALYTICAL_QUANTILE_IMP_FIXED(TPE1, flt, qp[i]); \ - } break; \ - case TYPE_dbl: { \ - dbl *restrict qp = (dbl*)Tloc(q, 0); \ - ANALYTICAL_QUANTILE_IMP_FIXED(TPE1, dbl, qp[i]); \ - } break; \ - default: \ - goto quantile_nosupport; \ - } \ - } while (0) - -gdk_return -GDKanalytical_quantile(BAT *r, BAT *b, BAT *s, BAT *e, BAT *q, const void *restrict quantile, int tp1, int tp2) -{ - BUN i = 0, cnt = BATcount(b), qindex, ss, ee; - lng *restrict start, *restrict end; - dbl qua = 0, f; - bool has_nils = false; - const void *restrict nil = ATOMnilptr(tp1); - int (*atomcmp) (const void *, const void *) = ATOMcompare(tp1); - void *curval; - - assert(s && e && ((q && !quantile) || (!q && quantile))); - start = (lng *) Tloc(s, 0); - end = (lng *) Tloc(e, 0); - - if (quantile) { - switch (tp2) { - case TYPE_flt:{ - flt val = *(flt *) quantile; - qua = !is_flt_nil(val) ? (dbl) val : dbl_nil; - } break; - case TYPE_dbl:{ - qua = *(dbl *) quantile; - } break; - default: - goto quantile_nosupport; - } - switch (tp1) { - case TYPE_bit: - ANALYTICAL_QUANTILE_IMP_FIXED(bit, dbl, qua); - break; - case TYPE_bte: - ANALYTICAL_QUANTILE_IMP_FIXED(bte, dbl, qua); - break; - case TYPE_sht: - ANALYTICAL_QUANTILE_IMP_FIXED(sht, dbl, qua); - break; - case TYPE_int: - ANALYTICAL_QUANTILE_IMP_FIXED(int, dbl, qua); - break; - case TYPE_lng: - ANALYTICAL_QUANTILE_IMP_FIXED(lng, dbl, qua); - break; -#ifdef HAVE_HGE - case TYPE_hge: - ANALYTICAL_QUANTILE_IMP_FIXED(hge, dbl, qua); - break; -#endif - case TYPE_flt: - ANALYTICAL_QUANTILE_IMP_FIXED(flt, dbl, qua); - break; - case TYPE_dbl: - ANALYTICAL_QUANTILE_IMP_FIXED(dbl, dbl, qua); - break; - default: - ANALYTICAL_QUANTILE_IMP_VARSIZED(dbl, qua); - } - } else { - switch (tp1) { - case TYPE_bit: - ANALYTICAL_QUANTILE_CALC_MULTI(bit); - break; - case TYPE_bte: - ANALYTICAL_QUANTILE_CALC_MULTI(bte); - break; - case TYPE_sht: - ANALYTICAL_QUANTILE_CALC_MULTI(sht); - break; - case TYPE_int: - ANALYTICAL_QUANTILE_CALC_MULTI(int); - break; - case TYPE_lng: - ANALYTICAL_QUANTILE_CALC_MULTI(lng); - break; -#ifdef HAVE_HGE - case TYPE_hge: - ANALYTICAL_QUANTILE_CALC_MULTI(hge); - break; -#endif - case TYPE_flt: - ANALYTICAL_QUANTILE_CALC_MULTI(flt); - break; - case TYPE_dbl: - ANALYTICAL_QUANTILE_CALC_MULTI(dbl); - break; - default: { - switch (tp2) { - case TYPE_flt: { - flt *restrict qp = (flt*)Tloc(q, 0); - ANALYTICAL_QUANTILE_IMP_VARSIZED(flt, qp[i]); - } break; - case TYPE_dbl: { - dbl *restrict qp = (dbl*)Tloc(q, 0); - ANALYTICAL_QUANTILE_IMP_VARSIZED(dbl, qp[i]); - } break; - default: - goto quantile_nosupport; - } - } - } - } - BATsetcount(r, cnt); - r->tnonil = !has_nils; - r->tnil = has_nils; - return GDK_SUCCEED; -allocation_error: - GDKerror("%s: malloc failure\n", __func__); - return GDK_FAIL; -quantile_nosupport: - GDKerror("%s: type %s not supported for the quantile.\n", __func__, ATOMname(tp2)); - return GDK_FAIL; -} - -#define ANALYTICAL_QUANTILE_AVG_IMP(TPE1, TPE2, NEXT_QUA) \ - do { \ - TPE1 *restrict bp = (TPE1*)Tloc(b, 0), ns, ne; \ - for (; i < cnt; i++, rb++) { \ - TPE2 nqua = NEXT_QUA; \ - if (is_##TPE2##_nil(nqua)) { \ - *rb = dbl_nil; \ - has_nils = true; \ - } else { \ - ss = (BUN) start[i]; \ - ee = (BUN) end[i]; \ - f = (ee - ss - 1) * nqua; \ - lo = floor(f); \ - hi = ceil(f); \ - ns = bp[ss + (BUN) hi]; \ - ne = bp[ss + (BUN) lo]; \ - if (is_##TPE1##_nil(ns) || is_##TPE1##_nil(ne)) { \ - v = dbl_nil; \ - has_nils = true; \ - } else \ - v = (f - lo) * ns + (lo + 1 - f) * ne; \ - *rb = v; \ - } \ - } \ - } while (0) - -#define ANALYTICAL_QUANTILE_AVG_CALC_MULTI(TPE1) \ - do { \ - switch (tp2) { \ - case TYPE_flt: { \ - flt *restrict qp = (flt*)Tloc(q, 0); \ - ANALYTICAL_QUANTILE_AVG_IMP(TPE1, flt, qp[i]); \ - } break; \ - case TYPE_dbl: { \ - dbl *restrict qp = (dbl*)Tloc(q, 0); \ - ANALYTICAL_QUANTILE_AVG_IMP(TPE1, dbl, qp[i]); \ - } break; \ - default: \ - goto quantile_nosupport; \ - } \ - } while (0) - -gdk_return -GDKanalytical_quantile_avg(BAT *r, BAT *b, BAT *s, BAT *e, BAT *q, const void *restrict quantile, int tp1, int tp2) -{ - BUN i = 0, cnt = BATcount(b), ss, ee; - lng *restrict start, *restrict end; - dbl qua = 0, f, *restrict rb = (dbl*) Tloc(r, 0), v, lo, hi; - bool has_nils = false; - - assert(s && e && ((q && !quantile) || (!q && quantile))); - start = (lng *) Tloc(s, 0); - end = (lng *) Tloc(e, 0); - - if (quantile) { - switch (tp2) { - case TYPE_flt:{ - flt val = *(flt *) quantile; - qua = !is_flt_nil(val) ? (dbl) val : dbl_nil; - } break; - case TYPE_dbl:{ - qua = *(dbl *) quantile; - } break; - default: - goto quantile_nosupport; - } - switch (tp1) { - case TYPE_bte: - ANALYTICAL_QUANTILE_AVG_IMP(bte, dbl, qua); - break; - case TYPE_sht: - ANALYTICAL_QUANTILE_AVG_IMP(sht, dbl, qua); - break; - case TYPE_int: - ANALYTICAL_QUANTILE_AVG_IMP(int, dbl, qua); - break; - case TYPE_lng: - ANALYTICAL_QUANTILE_AVG_IMP(lng, dbl, qua); - break; -#ifdef HAVE_HGE - case TYPE_hge: - ANALYTICAL_QUANTILE_AVG_IMP(hge, dbl, qua); - break; -#endif - case TYPE_flt: - ANALYTICAL_QUANTILE_AVG_IMP(flt, dbl, qua); - break; - case TYPE_dbl: - ANALYTICAL_QUANTILE_AVG_IMP(dbl, dbl, qua); - break; - default: - goto input_nosupport; - } - } else { - switch (tp1) { - case TYPE_bte: - ANALYTICAL_QUANTILE_AVG_CALC_MULTI(bte); - break; - case TYPE_sht: - ANALYTICAL_QUANTILE_AVG_CALC_MULTI(sht); - break; - case TYPE_int: - ANALYTICAL_QUANTILE_AVG_CALC_MULTI(int); - break; - case TYPE_lng: - ANALYTICAL_QUANTILE_AVG_CALC_MULTI(lng); - break; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list