Changeset: 96c196a8c4f1 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=96c196a8c4f1
Modified Files:
        monetdb5/extras/bwd/operations.c
Branch: bwd
Log Message:

* fixed a bug in the alignment of residual and approximation of uselects


Unterschiede (173 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
@@ -434,19 +434,19 @@ static inline unsigned int refinementLoo
                                                                                
                                                                                
        const clHead* compressedHead, const clTail* compressedTail, const 
unsigned char* residuals, const oid* inputPositions,
                                                                                
                                                                                
        const int tailApproximationBytes, const int tailResidualBits, 
                                                                                
                                                                                
        oid* positionRegion){
-/* use cpp | egrep -v "^#" | indent | pbcopy to expand */
        const int tailApproximationMask = (1<<(tailApproximationBytes*8))-1;
        const unsigned int residualMask = (1 << tailResidualBits)-1;
        const unsigned int residualBytes = tailResidualBits/8;
        unsigned int i=0, j=0, inputPositionsI = 0;
+       if(1){/* use cpp | egrep -v "^#" | indent | pbcopy to expand */
 #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 = (index*tailResidualBits)/32;       
                                                                        \
-               const unsigned int residualOffset = 
(index*tailResidualBits)%32;                                                \
+               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+           
                                                        \
@@ -537,8 +537,8 @@ case '=': {
 #undef refineLoop
 #undef refineLoopSingleOperator
 #undef refineLoopDoubleOperator
+       }
        return j;
-       
 }
 
 str uselectrefine(bat *res, bat *bid, ptr val, str OP, ptr val2, str OP2, bat 
*approx, Client context) {
@@ -789,7 +789,7 @@ str BWDSemijoinRefine(int *res, int *lid
                if(BAThvoid(left)  && ATOMstorage(BATttype(left)) == TYPE_int 
&& BAThtype(right) == TYPE_oid){ // TODO: type specific
                        size_t bufferSize;
                        struct timespec before, after;
-                       unsigned char* filteredResiduals = NULL;
+                       unsigned int* filteredResiduals = NULL;
                        clHead* supersetPositionsColumn;
                        clTail* supersetApproximateValuesColumn;                
        
                        refinement = BATnew(TYPE_void, BATttype(left), 
right->batCount);
@@ -810,7 +810,7 @@ str BWDSemijoinRefine(int *res, int *lid
 
                        {
                                if(supersetPositionsColumn){
-                                       { // if the approximation is empty, the 
memory objects are NULL
+                                        // 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;
@@ -823,7 +823,7 @@ str BWDSemijoinRefine(int *res, int *lid
                                                        size_t refinementCount 
= 0;
                                                        filteredResiduals = 
calloc((supersetPositionsColumn->count)*residualBytes + sizeof(size_t), 1);
                                                        
-                                                       {
+                                                       if(0){
 #define projectResidualsLoop(residualPosition)                                 
                                                                \
                                                                for ( i = j = 
0; j < BATcount(right); ++j) {                                            \
                                                                        
while(supersetPositionsColumn->positions[i]                                     
        \
@@ -831,46 +831,74 @@ str BWDSemijoinRefine(int *res, int *lid
                                                                                
i++;                                                                            
                                                                                
                                \
                                                                                
                                                                                
                                                                                
                                                \
                                                                        {       
                                                                                
                                                                                
                                                \
-                                                                       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 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 
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, residualPosition, refinementCount, \
-                                                                               
                                outResidualSlotI, 
filteredResiduals[outResidualSlotI]); \
-                                                       }                       
                                                                                
                                                                                
                                                \
+                                                                               
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, residualPosition, 
refinementCount, \
+                                                                               
                                        outResidualSlotI, 
filteredResiduals[outResidualSlotI]); \
+                                                                       }       
                                                                                
                                                                                
                                                \
                                                                        
refinementRegion[refinementCount++] =                                           
                        \
                                                                                
decompressIntValue(i, approximationBits,                                        
        \
                                                                                
                                                                         
offsetBits, supersetApproximateValuesColumn, \
                                                                                
                                                                         
residuals, supersetPositionsColumn->positions[i]); \
                                                                }
                                                                if 
(BAThdense(left)) { // dense headed but, thus we use the positions for residual 
lookups
-                                                               
projectResidualsLoop(supersetPositionsColumn->positions[i]);
+                                                                       
projectResidualsLoop(supersetPositionsColumn->positions[i]);
                                                                } else { // bat 
is oid-headed, thus we use the iterator
-                                                               
projectResidualsLoop(i);
+                                                                       
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]);
+                                                                       };
+                                                               }
+
                                                        }
-#undef projectResidualsLoop                                                    
        
-                                                       }
+
                                                BATsetcount(refinement, 
refinementCount);
 
                                                } else {
-                                                       const int count = 
BATcount(right);
-                                                       
memcpy(refinementRegion, supersetApproximateValuesColumn->elements, 
count*sizeof(int));
-/* int i; */
-/* #pragma omp parallel for */
-/*                                             for (i = 0; i < count; ++i) { */
-/*                                                     refinementRegion[i] = 
((int*)supersetApproximateValuesColumn->elements)[i]; */
-/*                                             } */
-                                                       BATsetcount(refinement, 
count);
+                                                       
memcpy(refinementRegion, supersetApproximateValuesColumn->elements, 
BATcount(right)*sizeof(int));
+                                                       BATsetcount(refinement, 
BATcount(right));
 
                                                }
-                                       }
+                                       
                                }else {
                                        printf ("uh oh, %s ran into an 
unimplemented case: no approximation provided\n", __func__);
                                }
@@ -882,7 +910,7 @@ str BWDSemijoinRefine(int *res, int *lid
                
                        if(0) printf ("%s setting residuals of %d to %p\n", 
__func__, refinement->batCacheid, getDecomposedBATSlot(refinement)->residuals);
                        BATsetprop(refinement, batRegistryIndex, TYPE_int, 
(int[]){getNextFreeDecomposedBATSlotIndex()});
-                       getDecomposedBATSlot(refinement)->residuals = 
filteredResiduals;
+                       getDecomposedBATSlot(refinement)->residuals = (unsigned 
char*)filteredResiduals;
                        getDecomposedBATSlot(refinement)->approximationBits = 
batTailApproximationBits(left);
                        getDecomposedBATSlot(refinement)->tailOffsetBits = 
batTailOffsetBits(left);
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to