Changeset: 769cf7d281a8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/769cf7d281a8
Modified Files:
clients/Tests/exports.stable.out
gdk/gdk_aggr.c
gdk/gdk_calc.h
monetdb5/modules/kernel/aggr.c
Branch: pushcands
Log Message:
covariance/correlation aggregates with candidate list now has two candidate
lists.
diffs (truncated from 612 to 300 lines):
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -128,10 +128,10 @@ const char *BATgroupaggrinit(BAT *b, BAT
gdk_return BATgroupavg(BAT **bnp, BAT **cntsp, BAT *b, BAT *g, BAT *e, BAT *s,
int tp, bool skip_nils, bool abort_on_error, int scale);
gdk_return BATgroupavg3(BAT **avgp, BAT **remp, BAT **cntp, BAT *b, BAT *g,
BAT *e, BAT *s, bool skip_nils);
BAT *BATgroupavg3combine(BAT *avg, BAT *rem, BAT *cnt, BAT *g, BAT *e, bool
skip_nils);
-BAT *BATgroupcorrelation(BAT *b1, BAT *b2, BAT *g, BAT *e, BAT *s, int tp,
bool skip_nils, bool abort_on_error);
+BAT *BATgroupcorrelation(BAT *b1, BAT *b2, BAT *g, BAT *e, BAT *s1, BAT *s2,
int tp, bool skip_nils, bool abort_on_error);
BAT *BATgroupcount(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils,
bool abort_on_error);
-BAT *BATgroupcovariance_population(BAT *b1, BAT *b2, BAT *g, BAT *e, BAT *s,
int tp, bool skip_nils, bool abort_on_error);
-BAT *BATgroupcovariance_sample(BAT *b1, BAT *b2, BAT *g, BAT *e, BAT *s, int
tp, bool skip_nils, bool abort_on_error);
+BAT *BATgroupcovariance_population(BAT *b1, BAT *b2, BAT *g, BAT *e, BAT *s1,
BAT *s2, int tp, bool skip_nils, bool abort_on_error);
+BAT *BATgroupcovariance_sample(BAT *b1, BAT *b2, BAT *g, BAT *e, BAT *s1, BAT
*s2, int tp, bool skip_nils, bool abort_on_error);
BAT *BATgroupmax(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils, bool
abort_on_error);
BAT *BATgroupmedian(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils,
bool abort_on_error);
BAT *BATgroupmedian_avg(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool
skip_nils, bool abort_on_error);
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -4630,75 +4630,76 @@ BATgroupvariance_population(BAT *b, BAT
do { \
const TYPE *vals1 = (const TYPE *) Tloc(b1, 0); \
const TYPE *vals2 = (const TYPE *) Tloc(b2, 0); \
- while (ncand > 0) { \
- ncand--; \
- gid = gids ? gids[ci.next] : (oid) ci.next + min; \
- i = canditer_next(&ci) - b1->hseqbase; \
+ for (BUN ctr = 0; ctr < ncand; ctr++) { \
+ gid = gids ? gids[ctr] : (oid) ctr + min; \
+ i1 = canditer_next(&ci1) - b1->hseqbase; \
+ i2 = canditer_next(&ci2) - b2->hseqbase; \
if (gid >= min && gid <= max) { \
gid -= min; \
- if (is_##TYPE##_nil(vals1[i]) ||
is_##TYPE##_nil(vals2[i])) { \
+ if (is_##TYPE##_nil(vals1[i1]) ||
is_##TYPE##_nil(vals2[i2])) { \
if (!skip_nils) \
cnts[gid] = BUN_NONE; \
} else if (cnts[gid] != BUN_NONE) { \
cnts[gid]++; \
- delta1[gid] = (dbl) vals1[i] -
mean1[gid]; \
+ delta1[gid] = (dbl) vals1[i1] -
mean1[gid]; \
mean1[gid] += delta1[gid] / cnts[gid]; \
- delta2[gid] = (dbl) vals2[i] -
mean2[gid]; \
+ delta2[gid] = (dbl) vals2[i2] -
mean2[gid]; \
mean2[gid] += delta2[gid] / cnts[gid]; \
- m2[gid] += delta1[gid] * ((dbl)
vals2[i] - mean2[gid]); \
+ m2[gid] += delta1[gid] * ((dbl)
vals2[i2] - mean2[gid]); \
} \
} \
} \
- for (i = 0; i < ngrp; i++) { \
- if (cnts[i] == 0 || cnts[i] == BUN_NONE) { \
- dbls[i] = dbl_nil; \
+ for (i1 = 0; i1 < ngrp; i1++) { \
+ if (cnts[i1] == 0 || cnts[i1] == BUN_NONE) { \
+ dbls[i1] = dbl_nil; \
nils++; \
- } else if (cnts[i] == 1) { \
- dbls[i] = issample ? dbl_nil : 0; \
+ } else if (cnts[i1] == 1) { \
+ dbls[i1] = issample ? dbl_nil : 0; \
nils2++; \
- } else if (isinf(m2[i])) { \
- goto overflow; \
+ } else if (isinf(m2[i1])) { \
+ goto overflow; \
} else { \
- dbls[i] = m2[i] / (cnts[i] - issample); \
+ dbls[i1] = m2[i1] / (cnts[i1] - issample); \
} \
} \
} while (0)
static BAT *
-dogroupcovariance(BAT *b1, BAT *b2, BAT *g, BAT *e, BAT *s, int tp,
+dogroupcovariance(BAT *b1, BAT *b2, BAT *g, BAT *e, BAT *s1, BAT *s2, int tp,
bool skip_nils, bool issample, const char *func)
{
const oid *restrict gids;
oid gid, min, max;
- BUN i, ngrp, nils = 0, nils2 = 0, ncand;
+ BUN i1, i2, ngrp, nils = 0, nils2 = 0, ncand;
BUN *restrict cnts = NULL;
dbl *restrict dbls, *restrict mean1, *restrict mean2, *restrict delta1,
*restrict delta2, *restrict m2;
BAT *bn = NULL;
- struct canditer ci;
+ struct canditer ci1, ci2;
const char *err;
lng t0 = 0;
TRC_DEBUG_IF(ALGO) t0 = GDKusec();
- assert(tp == TYPE_dbl && BATcount(b1) == BATcount(b2) && b1->ttype ==
b2->ttype && BATtdense(b1) == BATtdense(b2));
- (void) tp;
-
- if ((err = BATgroupaggrinit(b1, g, e, s, &min, &max, &ngrp, &ci,
&ncand)) != NULL) {
+ if (tp != TYPE_dbl) {
+ GDKerror("incompatible return type: must be dbl\n");
+ return NULL;
+ }
+ if ((err = BATgroupaggrinit(b1, g, e, s1, &min, &max, &ngrp, &ci1,
&ncand)) != NULL) {
GDKerror("%s: %s\n", func, err);
return NULL;
}
- if (g == NULL) {
+ canditer_init(&ci2, b2, s2);
+ if (ci2.ncand != ci1.ncand || g == NULL || BATcount(g) != ci1.ncand) {
GDKerror("%s: b1, b2 and g must be aligned\n", func);
return NULL;
}
- if (BATcount(b1) == 0 || ngrp == 0) {
+ if (ci1.ncand == 0 || ngrp == 0) {
bn = BATconstant(ngrp == 0 ? 0 : min, TYPE_dbl, &dbl_nil, ngrp,
TRANSIENT);
goto doreturn;
}
- if ((e == NULL ||
- (BATcount(e) == BATcount(b1) && (e->hseqbase == b1->hseqbase ||
e->hseqbase == b2->hseqbase))) &&
+ if ((e == NULL || BATcount(e) == ci1.ncand) &&
(BATtdense(g) || (g->tkey && g->tnonil)) &&
(issample || (b1->tnonil && b2->tnonil))) {
/* trivial: singleton groups, so all results are equal
@@ -4718,10 +4719,10 @@ dogroupcovariance(BAT *b1, BAT *b2, BAT
if (mean1 == NULL || mean2 == NULL || delta1 == NULL || delta2 == NULL
|| m2 == NULL || cnts == NULL)
goto alloc_fail;
- for (i = 0; i < ngrp; i++) {
- m2[i] = 0;
- mean1[i] = 0;
- mean2[i] = 0;
+ for (i1 = 0; i1 < ngrp; i1++) {
+ m2[i1] = 0;
+ mean1[i1] = 0;
+ mean2[i1] = 0;
}
bn = COLnew(min, TYPE_dbl, ngrp, TRANSIENT);
@@ -4786,11 +4787,11 @@ dogroupcovariance(BAT *b1, BAT *b2, BAT
bn->tnonil = nils == 0;
doreturn:
TRC_DEBUG(ALGO, "b1=" ALGOBATFMT ",b2=" ALGOBATFMT ",g=" ALGOBATFMT
- ",e=" ALGOOPTBATFMT ",s=" ALGOOPTBATFMT
+ ",e=" ALGOOPTBATFMT ",s1=" ALGOOPTBATFMT ",s2=" ALGOOPTBATFMT
",skip_nils=%s,issample=%s -> " ALGOOPTBATFMT
" (%s -- " LLFMT " usec)\n",
ALGOBATPAR(b1), ALGOBATPAR(b2), ALGOBATPAR(g),
- ALGOOPTBATPAR(e), ALGOOPTBATPAR(s),
+ ALGOOPTBATPAR(e), ALGOOPTBATPAR(s1), ALGOOPTBATPAR(s2),
skip_nils ? "true" : "false",
issample ? "true" : "false",
ALGOOPTBATPAR(bn),
@@ -4810,18 +4811,21 @@ dogroupcovariance(BAT *b1, BAT *b2, BAT
}
BAT *
-BATgroupcovariance_sample(BAT *b1, BAT *b2, BAT *g, BAT *e, BAT *s, int tp,
bool skip_nils, bool abort_on_error)
+BATgroupcovariance_sample(BAT *b1, BAT *b2, BAT *g, BAT *e, BAT *s1, BAT *s2,
+ int tp, bool skip_nils, bool abort_on_error)
{
(void) abort_on_error;
- return dogroupcovariance(b1, b2, g, e, s, tp, skip_nils, true,
+ return dogroupcovariance(b1, b2, g, e, s1, s2, tp, skip_nils, true,
__func__);
}
BAT *
-BATgroupcovariance_population(BAT *b1, BAT *b2, BAT *g, BAT *e, BAT *s, int
tp, bool skip_nils, bool abort_on_error)
+BATgroupcovariance_population(BAT *b1, BAT *b2, BAT *g, BAT *e,
+ BAT *s1, BAT *s2, int tp,
+ bool skip_nils, bool abort_on_error)
{
(void) abort_on_error;
- return dogroupcovariance(b1, b2, g, e, s, tp, skip_nils, false,
+ return dogroupcovariance(b1, b2, g, e, s1, s2, tp, skip_nils, false,
__func__);
}
@@ -4829,76 +4833,78 @@ BATgroupcovariance_population(BAT *b1, B
do { \
const TYPE *vals1 = (const TYPE *) Tloc(b1, 0); \
const TYPE *vals2 = (const TYPE *) Tloc(b2, 0); \
- while (ncand > 0) { \
- ncand--; \
- gid = gids ? gids[ci.next] : (oid) ci.next + min; \
- i = canditer_next(&ci) - b1->hseqbase; \
+ for (BUN ctr = 0; ctr < ncand; ctr++) { \
+ gid = gids ? gids[ctr] : (oid) ctr + min; \
+ i1 = canditer_next(&ci1) - b1->hseqbase; \
+ i2 = canditer_next(&ci2) - b2->hseqbase; \
if (gid >= min && gid <= max) { \
gid -= min; \
- if (is_##TYPE##_nil(vals1[i]) ||
is_##TYPE##_nil(vals2[i])) { \
+ if (is_##TYPE##_nil(vals1[i1]) ||
is_##TYPE##_nil(vals2[i2])) { \
if (!skip_nils) \
cnts[gid] = BUN_NONE; \
} else if (cnts[gid] != BUN_NONE) { \
cnts[gid]++; \
- delta1[gid] = (dbl) vals1[i] -
mean1[gid]; \
+ delta1[gid] = (dbl) vals1[i1] -
mean1[gid]; \
mean1[gid] += delta1[gid] / cnts[gid]; \
- delta2[gid] = (dbl) vals2[i] -
mean2[gid]; \
+ delta2[gid] = (dbl) vals2[i2] -
mean2[gid]; \
mean2[gid] += delta2[gid] / cnts[gid]; \
- aux = (dbl) vals2[i] - mean2[gid]; \
+ aux = (dbl) vals2[i2] - mean2[gid]; \
up[gid] += delta1[gid] * aux; \
- down1[gid] += delta1[gid] * ((dbl)
vals1[i] - mean1[gid]); \
+ down1[gid] += delta1[gid] * ((dbl)
vals1[i1] - mean1[gid]); \
down2[gid] += delta2[gid] * aux; \
} \
} \
} \
- for (i = 0; i < ngrp; i++) { \
- if (cnts[i] <= 1 || cnts[i] == BUN_NONE || down1[i] ==
0 || down2[i] == 0) { \
- dbls[i] = dbl_nil; \
+ for (i1 = 0; i1 < ngrp; i1++) { \
+ if (cnts[i1] <= 1 || cnts[i1] == BUN_NONE || down1[i1]
== 0 || down2[i1] == 0) { \
+ dbls[i1] = dbl_nil; \
nils++; \
- } else if (isinf(up[i]) || isinf(down1[i]) ||
isinf(down2[i])) { \
- goto overflow; \
+ } else if (isinf(up[i1]) || isinf(down1[i1]) ||
isinf(down2[i1])) { \
+ goto overflow; \
} else { \
- dbls[i] = (up[i] / cnts[i]) / (sqrt(down1[i] /
cnts[i]) * sqrt(down2[i] / cnts[i])); \
- assert(!is_dbl_nil(dbls[i])); \
+ dbls[i1] = (up[i1] / cnts[i1]) /
(sqrt(down1[i1] / cnts[i1]) * sqrt(down2[i1] / cnts[i1])); \
+ assert(!is_dbl_nil(dbls[i1])); \
} \
} \
} while (0)
BAT *
-BATgroupcorrelation(BAT *b1, BAT *b2, BAT *g, BAT *e, BAT *s, int tp, bool
skip_nils, bool abort_on_error)
+BATgroupcorrelation(BAT *b1, BAT *b2, BAT *g, BAT *e, BAT *s1, BAT *s2, int
tp, bool skip_nils, bool abort_on_error)
{
const oid *restrict gids;
oid gid, min, max;
- BUN i, ngrp, nils = 0, ncand;
+ BUN i1, i2, ngrp, nils = 0, ncand;
BUN *restrict cnts = NULL;
dbl *restrict dbls, *restrict mean1, *restrict mean2, *restrict delta1,
*restrict delta2, *restrict up, *restrict down1, *restrict down2, aux;
BAT *bn = NULL;
- struct canditer ci;
+ struct canditer ci1, ci2;
const char *err;
lng t0 = 0;
TRC_DEBUG_IF(ALGO) t0 = GDKusec();
- assert(tp == TYPE_dbl && BATcount(b1) == BATcount(b2) && b1->ttype ==
b2->ttype && BATtdense(b1) == BATtdense(b2));
- (void) tp;
(void) abort_on_error;
- if ((err = BATgroupaggrinit(b1, g, e, s, &min, &max, &ngrp, &ci,
&ncand)) != NULL) {
+ if (tp != TYPE_dbl) {
+ GDKerror("incompatible return type: must be dbl\n");
+ return NULL;
+ }
+ if ((err = BATgroupaggrinit(b1, g, e, s1, &min, &max, &ngrp, &ci1,
&ncand)) != NULL) {
GDKerror("%s\n", err);
return NULL;
}
- if (g == NULL) {
- GDKerror("b1, b2 and g must be aligned\n");
+ canditer_init(&ci2, b2, s2);
+ if (ci2.ncand != ci1.ncand || g == NULL || BATcount(g) != ci1.ncand) {
+ GDKerror("b1, b2 (with candidate lists) and g must be
aligned\n");
return NULL;
}
- if (BATcount(b1) == 0 || ngrp == 0) {
+ if (ci1.ncand == 0 || ngrp == 0) {
bn = BATconstant(ngrp == 0 ? 0 : min, TYPE_dbl, &dbl_nil, ngrp,
TRANSIENT);
goto doreturn;
}
- if ((e == NULL ||
- (BATcount(e) == BATcount(b1) && (e->hseqbase == b1->hseqbase ||
e->hseqbase == b2->hseqbase))) &&
+ if ((e == NULL || BATcount(e) == ci1.ncand) &&
(BATtdense(g) || (g->tkey && g->tnonil))) {
dbl v = dbl_nil;
bn = BATconstant(min, TYPE_dbl, &v, ngrp, TRANSIENT);
@@ -4914,15 +4920,17 @@ BATgroupcorrelation(BAT *b1, BAT *b2, BA
mean1 = GDKmalloc(ngrp * sizeof(dbl));
mean2 = GDKmalloc(ngrp * sizeof(dbl));
- if (mean1 == NULL || mean2 == NULL || delta1 == NULL || delta2 == NULL
|| up == NULL || down1 == NULL || down2 == NULL || cnts == NULL)
+ if (mean1 == NULL || mean2 == NULL ||
+ delta1 == NULL || delta2 == NULL ||
+ up == NULL || down1 == NULL || down2 == NULL || cnts == NULL)
goto alloc_fail;
- for (i = 0; i < ngrp; i++) {
- up[i] = 0;
- down1[i] = 0;
- down2[i] = 0;
- mean1[i] = 0;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list