Changeset: fee541b8dce7 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fee541b8dce7
Modified Files:
gdk/gdk_aggr.c
Branch: arrays
Log Message:
avg aggregates handles groups expressed as arrayBAT
diffs (109 lines):
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -72,7 +72,7 @@ BATgroupaggrinit(BAT *b, BAT *g, BAT *e,
if (b == NULL || !BAThdense(b))
return "b must be dense-headed";
- if (g) {
+ if (g && !isBATarray(g)) {
if (!BAThdense(g) || BATcount(b) != BATcount(g) ||
(BATcount(b) != 0 && b->hseqbase != g->hseqbase))
return "b and g must be aligned";
@@ -1513,40 +1513,88 @@ BATgroupavg(BAT **bnp, BAT **cntsp, BAT
goto alloc_fail;
dbls = (dbl *) Tloc(bn, BUNfirst(bn));
+#define dimensionAggrAvg(TPE) \
+ do {\
+ oid minD, maxD, stepD; \
+ long elR, grpR, el, grp; \
+ BUN elsNum, aggrGrp; \
+ const TPE *restrict vals = (const TPE *) Tloc(b, BUNfirst(b)); \
+ double elsPerAggrGrp =0 ; \
+\
+ dimensionCharacteristics(oid, g, &minD, &maxD, &stepD, &elR,
&grpR); \
+ elsNum = dimensionElementsNum(minD, maxD, stepD); \
+ elsPerAggrGrp = elR*grpR; \
+\
+ for(aggrGrp=0; aggrGrp<elsNum; aggrGrp++) { \
+ oid start = aggrGrp*elR;\
+fprintf(stderr, "%u: %u\n", (unsigned int)aggrGrp, (unsigned int)start); \
+ dbls[aggrGrp] = 0; /*initialise to 0*/\
+ for(grp=0; grp<grpR; grp++) { \
+ for(el=0; el<elR; el++) { \
+ dbls[aggrGrp]+=vals[start+el]; \
+fprintf(stderr, "avg: group %u - (%u,%f) => %f\n", (unsigned int)aggrGrp,
(unsigned int)(start+el), (double)vals[start+el], dbls[aggrGrp]); \
+ }\
+ start+=elsNum*elR; \
+ } \
+ dbls[aggrGrp]/=elsPerAggrGrp; \
+ } \
+ } while(0)
+
if (BATtdense(g))
gids = NULL;
- else
+ else if(!isBATarray(g))
gids = (const oid *) Tloc(g, BUNfirst(g) + start);
switch (b->ttype) {
case TYPE_bte:
- AGGR_AVG(bte);
+ if(isBATarray(g))
+ dimensionAggrAvg(bte);
+ else
+ AGGR_AVG(bte);
break;
case TYPE_sht:
- AGGR_AVG(sht);
+ if(isBATarray(g))
+ dimensionAggrAvg(sht);
+ else
+ AGGR_AVG(sht);
break;
case TYPE_int:
#if SIZEOF_WRD == SIZEOF_INT
case TYPE_wrd:
#endif
- AGGR_AVG(int);
+ if(isBATarray(g))
+ dimensionAggrAvg(int);
+ else
+ AGGR_AVG(int);
break;
case TYPE_lng:
#if SIZEOF_WRD == SIZEOF_LNG
case TYPE_wrd:
#endif
- AGGR_AVG(lng);
+ if(isBATarray(g))
+ dimensionAggrAvg(lng);
+ else
+ AGGR_AVG(lng);
break;
#ifdef HAVE_HGE
case TYPE_hge:
- AGGR_AVG(hge);
+ if(isBATarray(g))
+ dimensionAggrAvg(hge);
+ else
+ AGGR_AVG(hge);
break;
#endif
case TYPE_flt:
- AGGR_AVG_FLOAT(flt);
+ if(isBATarray(g))
+ dimensionAggrAvg(flt);
+ else
+ AGGR_AVG_FLOAT(flt);
break;
case TYPE_dbl:
- AGGR_AVG_FLOAT(dbl);
+ if(isBATarray(g))
+ dimensionAggrAvg(dbl);
+ else
+ AGGR_AVG_FLOAT(dbl);
break;
default:
GDKfree(rems);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list