Changeset: e6002985f46b for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e6002985f46b Modified Files: monetdb5/extras/bwd/operations.c monetdb5/extras/bwd/utilities.c Branch: bwd Log Message:
* still working on true bitwise processing (single attribute selections work
for all but the last selected value :-))
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
@@ -431,52 +431,66 @@ str BWDThetauselectApproximate(bat *res,
}
static inline unsigned int refinementLoop(str OP, str OP2, const int value1,
const int value2, const size_t candidateCount,
-
const clHead* compressedHead, const clTail* compressedTail, const
unsigned char* residuals, const oid* inputPositions,
-
const int tailApproximationBytes, const int tailResidualBits,
-
oid* positionRegion){
+
const clHead* compressedHead, const clTail* compressedTail, const
unsigned int* residuals, const oid* inputPositions,
+
const int tailApproximationBits, const int tailResidualBits,
+
oid* positionRegion, unsigned int* data){
- const int tailApproximationMask = (1<<(tailApproximationBytes*8))-1;
+ const int tailApproximationMask = (1<<tailApproximationBits)-1;
const unsigned int residualMask = (1 << tailResidualBits)-1;
unsigned int i=0, j=0, inputPositionsI = 0;
if(1){/* use cpp | egrep -v "^#" | indent | pbcopy to expand */
-
+ const unsigned int targetTypeBits = sizeof(int)*8;
+ const unsigned int* vals = (unsigned int*)
compressedTail->elements;
#define refineLoopDoubleOperator(comparator, comparator2,
positionIsTruePositiveCondition, residualPosition) \
- while(i < candidateCount) {
\
- const unsigned int index = compressedHead->positions[i];
\
- const int slotI = tailApproximationBytes*8*i/(sizeof(int)*8);
\
- const int offset =
(tailApproximationBytes*8*i)%(sizeof(int)*8); \
- const unsigned int compressedValue = (((unsigned
int*)compressedTail->elements)[slotI] >>
(8*sizeof(int)-offset-tailApproximationBytes*8)) & tailApproximationMask; \
- const size_t residualSlotI =
(residualPosition*tailResidualBits)/32;
\
- const unsigned int residualOffset =
(residualPosition*tailResidualBits)%32;
\
- const unsigned int residual = (((unsigned
int*)residuals)[residualSlotI] \
-
>>
(32-residualOffset-tailResidualBits))&residualMask; \
- const int deCompressedValue = compressedTail->base+
\
- (compressedValue << tailResidualBits)
\
- + residual;
\
- if(i<10) printf ("%u: %d (residual: %d)\n", index,
\
-
deCompressedValue, residual);
\
- {
\
- const int positionIsCorrectPositive =
\
- (positionIsTruePositiveCondition);
\
- positionRegion[j] = index;
\
- j+= ((deCompressedValue comparator value1) &
\
- (deCompressedValue comparator2 value2)
&
\
- (positionIsCorrectPositive));
\
- inputPositionsI += positionIsCorrectPositive;
\
- i++;
\
- }
\
- }
+ while(i < candidateCount) {
\
+ const unsigned int index =
compressedHead->positions[i]; \
+ const unsigned int slotI =
tailApproximationBits*i/targetTypeBits; \
+ const unsigned int offset =
(tailApproximationBits*i)%targetTypeBits; \
+ const unsigned int compressedValue =
\
+
(((offset+tailApproximationBits)<=targetTypeBits)*
\
+ (vals[slotI] >>
(targetTypeBits-offset-tailApproximationBits)) & tailApproximationMask) \
+ +
\
+
(((offset+tailApproximationBits)>targetTypeBits)?((
\
+ (vals[slotI]<<(tailApproximationBits-targetTypeBits+offset))
\
+ +
(vals[slotI+1]>>(targetTypeBits-(tailApproximationBits-targetTypeBits+offset))))&tailApproximationMask):0)
\
+ ;
\
+ const size_t residualSlotI =
(residualPosition*tailResidualBits)/32; \
+ const unsigned int residualOffset =
(residualPosition*tailResidualBits)%32; \
+ const unsigned int residual =
\
+ (residualOffset+tailResidualBits <=
targetTypeBits)* \
+ ((residuals[residualSlotI]
\
+ >>
(targetTypeBits-residualOffset-tailResidualBits))&residualMask) \
+ + (residualOffset+tailResidualBits > targetTypeBits)*
\
+
(((residuals[residualSlotI]<<(tailResidualBits-targetTypeBits+residualOffset))
\
+ + (residuals[residualSlotI+1] >>
\
+
(targetTypeBits-(tailResidualBits-targetTypeBits+residualOffset))) )&
residualMask); \
+ const int deCompressedValue = compressedTail->base+
\
+ (compressedValue << tailResidualBits)
\
+ + residual;
\
+ if(i<10) printf ("%u: %d (residual: %u)\n", index,
\
+
deCompressedValue, residual);
\
+ {
\
+ const int positionIsCorrectPositive =
\
+ (positionIsTruePositiveCondition);
\
+ positionRegion[j] = index;
\
+ j+= ((deCompressedValue comparator value1) &
\
+ (deCompressedValue comparator2
value2) &
\
+ (positionIsCorrectPositive));
\
+ inputPositionsI += positionIsCorrectPositive;
\
+ i++;
\
+ }
\
+ }
#define refineLoopSingleOperator(comparator, positionIsTruePositiveCondition,
residualPosition) \
while(i < candidateCount) {
\
const unsigned int index = compressedHead->positions[i];
\
- const int slotI = tailApproximationBytes*8*i/(sizeof(int)*8);
\
- const int offset =
(tailApproximationBytes*8*i)%(sizeof(int)*8); \
- const unsigned int compressedValue = (((unsigned
int*)compressedTail->elements)[slotI] >>
(8*sizeof(int)-offset-tailApproximationBytes*8)) & tailApproximationMask; \
+ const int slotI = tailApproximationBits*i/(sizeof(int)*8);
\
+ const int offset = (tailApproximationBits*i)%(sizeof(int)*8);
\
+ const unsigned int compressedValue = (vals[slotI] >>
(8*sizeof(int)-offset-tailApproximationBits)) & tailApproximationMask; \
const size_t residualSlotI =
(residualPosition*tailResidualBits)/32;
\
const unsigned int residualOffset =
(residualPosition*tailResidualBits)%32;
\
- const unsigned int residual = (((unsigned
int*)residuals)[residualSlotI] \
+ const unsigned int residual = (residuals[residualSlotI] \
>>
(32-residualOffset-tailResidualBits))&residualMask; \
const int deCompressedValue = compressedTail->base+
\
(compressedValue << tailResidualBits)
\
@@ -613,10 +627,10 @@ str uselectrefine(bat *res, bat *bid, pt
{
unsigned int j =
refinementLoop(OP, OP2, *(int*)val, val2?*(int*)val2:0, candidateCount,
-
compressedHead, compressedTail, residuals, (oid*) Hloc(data,
BUNfirst(data)),
-
batTailApproximationBits(approximation)/8 -
batTailOffsetBits(approximation)/8,
+
compressedHead, compressedTail, (unsigned int*)residuals,
(oid*) Hloc(data, BUNfirst(data)),
+
batTailApproximationBits(approximation),
batTailResidualBits(approximation),
-
positionRegion);
+
positionRegion, (unsigned int*) data->T->heap.base);
if(1) printf ("%s reduced the
result from %zd to %d\n", __func__, Hloc(data,
BUNfirst(data))?MIN(candidateCount, BATcount(data)):candidateCount, j);
BATsetcount(result, j);
diff --git a/monetdb5/extras/bwd/utilities.c b/monetdb5/extras/bwd/utilities.c
--- a/monetdb5/extras/bwd/utilities.c
+++ b/monetdb5/extras/bwd/utilities.c
@@ -377,7 +377,7 @@ unsigned int decomposeIntArray(const int
{ // residual
const size_t slotI = (i*residualBits)/32;
const unsigned int offset = (i*residualBits)%32;
- if(offset+residualBits < 32) {
+ if(offset+residualBits <= 32) {
((unsigned int*)slot->residuals)[slotI] |=
(((subject[i]-approximation->base)&residualMask)<<(32-offset-residualBits));
} else {
((unsigned int*)slot->residuals)[slotI] |=
(((subject[i]-approximation->base)&residualMask)>>(residualBits-(32-offset)));
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list
