Changeset: 9152661c1011 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9152661c1011 Modified Files: monetdb5/extras/bwd/operations.c Branch: bwd Log Message:
* bitwise projecting residuals correctly now
Unterschiede (130 Zeilen):
diff --git a/monetdb5/extras/bwd/operations.c b/monetdb5/extras/bwd/operations.c
--- a/monetdb5/extras/bwd/operations.c
+++ b/monetdb5/extras/bwd/operations.c
@@ -764,13 +764,21 @@ str BWDSemijoinApproximate(int *res, int
if (synchronousGPU) clFinish(getCommandQueue());
}
- {
- BAT* approximation = right;
+ if(1){
+ BAT* approximation = result;
clHead* supersetPositionsColumn;
size_t bufferSize;
getPositionsColumn(batTailPositions(approximation), NULL, &bufferSize);
supersetPositionsColumn =
getPositionsColumn(batTailPositions(approximation), malloc(bufferSize),
&bufferSize);
- if(0) printf ("first position: %d\n",
supersetPositionsColumn->positions[0]);
+ {
+ size_t bufferSize;
+ clTail*
supersetApproximateValuesColumn;
+
+
getApproximateValuesColumn(batTailApproximation(approximation), NULL,
&bufferSize);
+ supersetApproximateValuesColumn =
getApproximateValuesColumn(batTailApproximation(approximation),
malloc(bufferSize), &bufferSize);
+ if(1) printf ("first position: %d\n",
supersetPositionsColumn->positions[0]);
+ }
+
}
BBPkeepref((*res = result->batCacheid));
}
@@ -838,17 +846,18 @@ str BWDSemijoinRefine(int *res, int *lid
// if the approximation is empty, the
memory objects are NULL
int* refinementRegion = (int*)
Tloc(refinement, BUNfirst(refinement));
const unsigned int* residuals =
(unsigned int*)batTailResiduals(left);
- const unsigned int
residualBytes = Tsize(left)-approximationBits/8;
- const unsigned int residualBits
= 8*Tsize(left)-approximationBits;
+ const unsigned int residualBits
= 8*Tsize(left)-approximationBits-offsetBits;
- const unsigned int residualMask
= (1 << (32-approximationBits))-1;
+ const unsigned int residualMask
= (1 << (32-approximationBits-offsetBits))-1;
- if(residualBytes > 0){
+ if(residualBits > 0){
unsigned int i,j;
size_t refinementCount
= 0;
- filteredResiduals =
calloc((supersetPositionsColumn->count)*residualBytes + sizeof(size_t), 1);
+ filteredResiduals =
calloc(ceil((supersetPositionsColumn->count)*residualBits/8) + sizeof(size_t),
1);
- if(0){
+ if(1){
+ const unsigned
int targetTypeBits = sizeof(int)*8;
+
#define projectResidualsLoop(residualPosition)
\
for ( i = j =
0; j < BATcount(right); ++j) { \
while(supersetPositionsColumn->positions[i]
\
@@ -858,13 +867,23 @@ str BWDSemijoinRefine(int *res, int *lid
{
\
const size_t residualSlotI = (residualPosition*residualBits)/32; \
const unsigned int residualOffset = (residualPosition*residualBits)%32; \
-
const unsigned int residual = (((unsigned int*)residuals)[residualSlotI] \
-
>>
(32-residualOffset-residualBits))&residualMask; \
-
\
+
const unsigned int residual =
\
+
(residualOffset+residualBits <= targetTypeBits)* \
+
((residuals[residualSlotI]
\
+
>> (targetTypeBits-residualOffset-residualBits))&residualMask) \
+
+ (residualOffset+residualBits > targetTypeBits)* \
+
(((residuals[residualSlotI]<<(residualBits-targetTypeBits+residualOffset)) \
+
+ (residuals[residualSlotI+1] >>
\
+
(targetTypeBits-(residualBits-targetTypeBits+residualOffset))) )&
residualMask); \
const size_t outResidualSlotI = (refinementCount*residualBits)/32; \
const size_t outResidualOffset = (refinementCount*residualBits)%32; \
-
filteredResiduals[outResidualSlotI] |=
\
-
(residual<<(32-outResidualOffset-residualBits)); \
+
\
+
if(outResidualOffset+residualBits <= targetTypeBits) { \
+
filteredResiduals[outResidualSlotI] |=
(residual<<(targetTypeBits-outResidualOffset-residualBits)); \
+
} else {
\
+
filteredResiduals[outResidualSlotI] |=
(residual>>(residualBits-(targetTypeBits-outResidualOffset))); \
+
filteredResiduals[outResidualSlotI] |=
(residual<<(targetTypeBits-(residualBits-(targetTypeBits-outResidualOffset))));
\
+
}
\
if(refinementCount<10)
\
printf ("projected residual %u from %u to %lu, slot %lu: %d\n", \
residual, residualPosition,
refinementCount, \
@@ -875,45 +894,13 @@ str BWDSemijoinRefine(int *res, int *lid
offsetBits, supersetApproximateValuesColumn, \
residuals, supersetPositionsColumn->positions[i]); \
}
- if
(BAThdense(left)) { // dense headed but, thus we use the positions for residual
lookups
+
+ if
(BAThdense(left)) { // dense headed bat, thus we use the positions for residual
lookups
projectResidualsLoop(supersetPositionsColumn->positions[i]);
} else { // bat
is oid-headed, thus we use the iterator
projectResidualsLoop(i);
}
#undef projectResidualsLoop
- } else
{
- if
(BAThdense(left)) {
- //dense
headed but, thus we use the positions for residual lookups
-
for (i = j = 0; j < BATcount(right); ++j) {
-
while (supersetPositionsColumn->positions[i] != ((oid *)
right->H->heap.base)[j])
-
i++; {
-
const size_t residualSlotI =
(supersetPositionsColumn->positions[i] * residualBits) / 32;
-
const unsigned int residualOffset =
(supersetPositionsColumn->positions[i] * residualBits) % 32;
-
const unsigned int residual = (((unsigned int
*)residuals)[residualSlotI] >> (32 - residualOffset - residualBits)) &
residualMask;
-
const size_t outResidualSlotI = (refinementCount *
residualBits) / 32;
-
const size_t outResidualOffset = (refinementCount *
residualBits) % 32;
-
filteredResiduals[outResidualSlotI] |= (residual << (32 -
outResidualOffset - residualBits));
-
if (refinementCount < 10)
-
printf("projected residual %u from %u to %lu, slot %lu:
%u\n", residual, supersetPositionsColumn->positions[i], refinementCount,
outResidualSlotI, filteredResiduals[outResidualSlotI]);
-
} refinementRegion[refinementCount++] = decompressIntValue(i,
approximationBits, offsetBits, supersetApproximateValuesColumn, residuals,
supersetPositionsColumn->positions[i]);
-
};
- } else {
- //bat
is oid - headed, thus we use the iterator
-
for (i = j = 0; j < BATcount(right); ++j) {
-
while (supersetPositionsColumn->positions[i] != ((oid *)
right->H->heap.base)[j])
-
i++; {
-
const size_t residualSlotI = (i * residualBits) / 32;
-
const unsigned int residualOffset = (i * residualBits) % 32;
-
const unsigned int residual = (((unsigned int
*)residuals)[residualSlotI] >> (32 - residualOffset - residualBits)) &
residualMask;
-
const size_t outResidualSlotI = (refinementCount * residualBits) /
32;
-
const size_t outResidualOffset = (refinementCount * residualBits) %
32;
-
filteredResiduals[outResidualSlotI] |= (residual << (32 -
outResidualOffset - residualBits));
-
if (refinementCount < 10)
-
printf("projected residual %u from %u to %lu, slot %lu: %d\n",
residual, i, refinementCount, outResidualSlotI,
filteredResiduals[outResidualSlotI]);
-
} refinementRegion[refinementCount++] = decompressIntValue(i,
approximationBits, offsetBits, supersetApproximateValuesColumn, residuals,
supersetPositionsColumn->positions[i]);
- };
- }
-
}
BATsetcount(refinement,
refinementCount);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list
