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

Reply via email to