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
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to