Changeset: ac4d2dd9fb12 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ac4d2dd9fb12 Modified Files: gdk/gdk_analytic.c Branch: analytics Log Message:
Continuing the code cleanup.
The range overlap now becomes easier to implement.
diffs (truncated from 1742 to 300 lines):
diff --git a/gdk/gdk_analytic.c b/gdk/gdk_analytic.c
--- a/gdk/gdk_analytic.c
+++ b/gdk/gdk_analytic.c
@@ -38,10 +38,10 @@ gdk_return
GDKanalyticaldiff(BAT *r, BAT *b, BAT *c, int tpe)
{
BUN i, cnt = BATcount(b);
- bit *rb = (bit*)Tloc(r, 0), *rp = c ? (bit*)Tloc(c, 0) : NULL;
+ bit *restrict rb = (bit*)Tloc(r, 0), *restrict rp = c ? (bit*)Tloc(c,
0) : NULL;
int (*atomcmp)(const void *, const void *);
- switch(ATOMstorage(tpe)) {
+ switch(tpe) {
case TYPE_bit:
ANALYTICAL_DIFF_IMP(bit)
break;
@@ -266,8 +266,8 @@ GDKanalyticalfirst(BAT *r, BAT *b, BAT *
bit *np, *pnp, *end;
gdk_return gdk_res = GDK_SUCCEED;
- (void)o;
- switch(ATOMstorage(tpe)) {
+ (void) o;
+ switch(tpe) {
case TYPE_bit:
ANALYTICAL_FIRST_IMP(bit)
break;
@@ -386,8 +386,8 @@ GDKanalyticallast(BAT *r, BAT *b, BAT *p
bit *np, *pnp, *end;
gdk_return gdk_res = GDK_SUCCEED;
- (void)o;
- switch(ATOMstorage(tpe)) {
+ (void) o;
+ switch(tpe) {
case TYPE_bit:
ANALYTICAL_LAST_IMP(bit)
break;
@@ -877,7 +877,7 @@ finish:
#undef LEAD_CALC
#undef ANALYTICAL_LEAD_OTHERS
-#define ANALYTICAL_LIMIT_IMP_NO_OVERLAP(TPE, IMP) \
+#define ANALYTICAL_MIN_MAX_IMP_NO_OVERLAP(TPE, IMP) \
do { \
curval = *pbp; \
pbp++; \
@@ -896,7 +896,7 @@ finish:
has_nils = true; \
} while(0);
-#define ANALYTICAL_LIMIT_IMP_OVERLAP(TPE, IMP) \
+#define ANALYTICAL_MIN_MAX_IMP_ROWS(TPE, IMP) \
do { \
TPE *bs, *bl, *be; \
bl = pbp; \
@@ -921,7 +921,7 @@ finish:
} \
} while(0);
-#define ANALYTICAL_LIMIT_IMP(TPE, IMP, REAL) \
+#define ANALYTICAL_MIN_MAX_CALC(TPE, IMP, REAL) \
do { \
TPE *rp, *rb, *pbp, *bp, *rend, curval, v; \
rb = rp = (TPE*)Tloc(r, 0); \
@@ -959,15 +959,15 @@ finish:
} while(0);
#ifdef HAVE_HUGE
-#define ANALYTICAL_LIMIT_IMP_HUGE(IMP, REAL) \
- case TYPE_hge: \
- ANALYTICAL_LIMIT_IMP(hge, IMP, REAL) \
+#define ANALYTICAL_MIN_MAX_LIMIT(IMP, REAL) \
+ case TYPE_hge: \
+ ANALYTICAL_MIN_MAX_CALC(hge, IMP, REAL) \
break;
#else
-#define ANALYTICAL_LIMIT_IMP_HUGE(IMP, REAL)
+#define ANALYTICAL_MIN_MAX_LIMIT(IMP, REAL)
#endif
-#define ANALYTICAL_LIMIT_IMP_OTHERS_NO_OVERLAP(SIGN_OP) \
+#define ANALYTICAL_MIN_MAX_OTHERS_IMP_NO_OVERLAP(SIGN_OP) \
do {
\
l = j;
\
curval = BUNtail(bpi, j);
\
@@ -990,7 +990,7 @@ finish:
has_nils = true;
\
} while(0);
-#define ANALYTICAL_LIMIT_IMP_OTHERS_OVERLAP(SIGN_OP)
\
+#define ANALYTICAL_MIN_MAX_OTHERS_IMP_ROWS(SIGN_OP)
\
do {
\
m = k;
\
for(;k<i;k++) {
\
@@ -1014,7 +1014,7 @@ finish:
}
\
} while(0);
-#define ANALYTICAL_LIMIT_IMP_OTHERS(SIGN_OP, REAL) \
+#define ANALYTICAL_MIN_MAX_OTHERS_CALC(SIGN_OP, REAL) \
do { \
BATiter bpi = bat_iterator(b);
\
void *restrict curval = BUNtail(bpi, 0);
\
@@ -1046,98 +1046,77 @@ finish:
}
\
} while(0);
-#define ANALYTICAL_LIMIT(OP, IMP, SIGN_OP)
\
-gdk_return
\
+#define ANALYTICAL_MIN_MAX_BRANCHES(OP, IMP, SIGN_OP, FRAME) \
+ switch(tpe) { \
+ case TYPE_bit: \
+ ANALYTICAL_MIN_MAX_CALC(bit, IMP,
ANALYTICAL_MIN_MAX_IMP##FRAME) \
+ break; \
+ case TYPE_bte: \
+ ANALYTICAL_MIN_MAX_CALC(bte, IMP,
ANALYTICAL_MIN_MAX_IMP##FRAME) \
+ break; \
+ case TYPE_sht: \
+ ANALYTICAL_MIN_MAX_CALC(sht, IMP,
ANALYTICAL_MIN_MAX_IMP##FRAME) \
+ break; \
+ case TYPE_int: \
+ ANALYTICAL_MIN_MAX_CALC(int, IMP,
ANALYTICAL_MIN_MAX_IMP##FRAME) \
+ break; \
+ case TYPE_lng: \
+ ANALYTICAL_MIN_MAX_CALC(lng, IMP,
ANALYTICAL_MIN_MAX_IMP##FRAME) \
+ break; \
+ ANALYTICAL_MIN_MAX_LIMIT(IMP, ANALYTICAL_MIN_MAX_IMP##FRAME) \
+ case TYPE_flt: \
+ ANALYTICAL_MIN_MAX_CALC(flt, IMP,
ANALYTICAL_MIN_MAX_IMP##FRAME) \
+ break; \
+ case TYPE_dbl: \
+ ANALYTICAL_MIN_MAX_CALC(dbl, IMP,
ANALYTICAL_MIN_MAX_IMP##FRAME) \
+ break; \
+ default: \
+ ANALYTICAL_MIN_MAX_OTHERS_CALC(SIGN_OP,
ANALYTICAL_MIN_MAX_OTHERS_IMP##FRAME) \
+ }
+
+#define ANALYTICAL_MIN_MAX(OP, IMP, SIGN_OP) \
+gdk_return \
GDKanalytical##OP(BAT *r, BAT *b, BAT *p, BAT *o, bit force_order, int tpe,
BUN start, BUN end) \
-{
\
- int (*atomcmp)(const void *, const void *);
\
- const void* restrict nil;
\
- bool has_nils = false;
\
- BUN i = 0, j = 0, l = 0, k = 0, m = 0, ncnt, cnt = BATcount(b);
\
- bit *np, *pnp, *nend;
\
- gdk_return gdk_res = GDK_SUCCEED;
\
-
\
- if(start == 0 && end == 0) {
\
- switch(ATOMstorage(tpe)) {
\
- case TYPE_bit:
\
- ANALYTICAL_LIMIT_IMP(bit, IMP,
ANALYTICAL_LIMIT_IMP_NO_OVERLAP) \
- break;
\
- case TYPE_bte:
\
- ANALYTICAL_LIMIT_IMP(bte, IMP,
ANALYTICAL_LIMIT_IMP_NO_OVERLAP) \
- break;
\
- case TYPE_sht:
\
- ANALYTICAL_LIMIT_IMP(sht, IMP,
ANALYTICAL_LIMIT_IMP_NO_OVERLAP) \
- break;
\
- case TYPE_int:
\
- ANALYTICAL_LIMIT_IMP(int, IMP,
ANALYTICAL_LIMIT_IMP_NO_OVERLAP) \
- break;
\
- case TYPE_lng:
\
- ANALYTICAL_LIMIT_IMP(lng, IMP,
ANALYTICAL_LIMIT_IMP_NO_OVERLAP) \
- break;
\
- ANALYTICAL_LIMIT_IMP_HUGE(IMP,
ANALYTICAL_LIMIT_IMP_NO_OVERLAP) \
- case TYPE_flt:
\
- ANALYTICAL_LIMIT_IMP(flt, IMP,
ANALYTICAL_LIMIT_IMP_NO_OVERLAP) \
- break;
\
- case TYPE_dbl:
\
- ANALYTICAL_LIMIT_IMP(dbl, IMP,
ANALYTICAL_LIMIT_IMP_NO_OVERLAP) \
- break;
\
- default:
\
- ANALYTICAL_LIMIT_IMP_OTHERS(SIGN_OP,
ANALYTICAL_LIMIT_IMP_OTHERS_NO_OVERLAP) \
- }
\
- } else {
\
- switch(ATOMstorage(tpe)) {
\
- case TYPE_bit:
\
- ANALYTICAL_LIMIT_IMP(bit, IMP,
ANALYTICAL_LIMIT_IMP_OVERLAP) \
- break;
\
- case TYPE_bte:
\
- ANALYTICAL_LIMIT_IMP(bte, IMP,
ANALYTICAL_LIMIT_IMP_OVERLAP) \
- break;
\
- case TYPE_sht:
\
- ANALYTICAL_LIMIT_IMP(sht, IMP,
ANALYTICAL_LIMIT_IMP_OVERLAP) \
- break;
\
- case TYPE_int:
\
- ANALYTICAL_LIMIT_IMP(int, IMP,
ANALYTICAL_LIMIT_IMP_OVERLAP) \
- break;
\
- case TYPE_lng:
\
- ANALYTICAL_LIMIT_IMP(lng, IMP,
ANALYTICAL_LIMIT_IMP_OVERLAP) \
- break;
\
- ANALYTICAL_LIMIT_IMP_HUGE(IMP,
ANALYTICAL_LIMIT_IMP_OVERLAP) \
- case TYPE_flt:
\
- ANALYTICAL_LIMIT_IMP(flt, IMP,
ANALYTICAL_LIMIT_IMP_OVERLAP) \
- break;
\
- case TYPE_dbl:
\
- ANALYTICAL_LIMIT_IMP(dbl, IMP,
ANALYTICAL_LIMIT_IMP_OVERLAP) \
- break;
\
- default:
\
- ANALYTICAL_LIMIT_IMP_OTHERS(SIGN_OP,
ANALYTICAL_LIMIT_IMP_OTHERS_OVERLAP) \
- }
\
- }
\
-finish:
\
- BATsetcount(r, cnt);
\
- r->tnonil = !has_nils;
\
- r->tnil = has_nils;
\
- return gdk_res;
\
+{ \
+ int (*atomcmp)(const void *, const void *); \
+ const void* restrict nil; \
+ bool has_nils = false; \
+ BUN i = 0, j = 0, l = 0, k = 0, m = 0, ncnt, cnt = BATcount(b); \
+ bit *np, *pnp, *nend; \
+ gdk_return gdk_res = GDK_SUCCEED; \
+ \
+ if(start == 0 && end == 0) { \
+ ANALYTICAL_MIN_MAX_BRANCHES(OP, IMP, SIGN_OP, _NO_OVERLAP) \
+ } else { \
+ ANALYTICAL_MIN_MAX_BRANCHES(OP, IMP, SIGN_OP, _ROWS) \
+ } \
+finish: \
+ BATsetcount(r, cnt); \
+ r->tnonil = !has_nils; \
+ r->tnil = has_nils; \
+ return gdk_res; \
}
-ANALYTICAL_LIMIT(min, MIN, >)
-ANALYTICAL_LIMIT(max, MAX, <)
+ANALYTICAL_MIN_MAX(min, MIN, >)
+ANALYTICAL_MIN_MAX(max, MAX, <)
-#undef ANALYTICAL_LIMIT
-#undef ANALYTICAL_LIMIT_IMP_HUGE
-#undef ANALYTICAL_LIMIT_IMP
-#undef ANALYTICAL_LIMIT_IMP_OVERLAP
-#undef ANALYTICAL_LIMIT_IMP_NO_OVERLAP
-#undef ANALYTICAL_LIMIT_IMP_OTHERS
-#undef ANALYTICAL_LIMIT_IMP_OTHERS_OVERLAP
-#undef ANALYTICAL_LIMIT_IMP_OTHERS_NO_OVERLAP
+#undef ANALYTICAL_MIN_MAX_CALC
+#undef ANALYTICAL_MIN_MAX_IMP_ROWS
+#undef ANALYTICAL_MIN_MAX_IMP_NO_OVERLAP
+#undef ANALYTICAL_MIN_MAX_OTHERS_CALC
+#undef ANALYTICAL_MIN_MAX_OTHERS_IMP_ROWS
+#undef ANALYTICAL_MIN_MAX_OTHERS_IMP_NO_OVERLAP
+#undef ANALYTICAL_MIN_MAX
+#undef ANALYTICAL_MIN_MAX_BRANCHES
+#undef ANALYTICAL_MIN_MAX_LIMIT
-#define ANALYTICAL_COUNT_IGNORE_NILS_NO_OVERLAP \
- do { \
- for (;rb < rp; rb++) \
- *rb = curval; \
+#define ANALYTICAL_COUNT_IGNORE_NILS_IMP_NO_OVERLAP \
+ do { \
+ for (;rb < rp; rb++) \
+ *rb = curval; \
} while(0);
-#define ANALYTICAL_COUNT_IGNORE_NILS_OVERLAP \
+#define ANALYTICAL_COUNT_IGNORE_NILS_IMP_ROWS \
do { \
lng *rs = rb, *fs, *fe; \
for(; rb<rp;rb++) { \
@@ -1147,32 +1126,32 @@ ANALYTICAL_LIMIT(max, MAX, <)
} \
} while(0);
-#define ANALYTICAL_COUNT_IGNORE_NILS_IMP(IMP) \
- do { \
- lng *rp, *rb, curval = 0; \
- rb = rp = (lng*)Tloc(r, 0); \
- if (p) { \
- np = pnp = (bit*)Tloc(p, 0); \
- nend = np + cnt; \
- for(; np < nend; np++) { \
- if (*np) { \
- curval = np - pnp; \
- rp += curval; \
- IMP \
- pnp = np; \
- } \
- } \
- curval = np - pnp; \
- rp += curval; \
- IMP \
- } else { \
- curval = cnt; \
- rp += curval; \
- IMP \
- } \
+#define ANALYTICAL_COUNT_IGNORE_NILS_CALC(FRAME) \
+ do { \
+ lng *rp, *rb, curval = 0; \
+ rb = rp = (lng*)Tloc(r, 0); \
+ if (p) { \
+ np = pnp = (bit*)Tloc(p, 0); \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list
