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

* fixed single sided selections


Unterschiede (73 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,11 +434,13 @@ 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){
+       
        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];        
                                        \
@@ -465,14 +467,20 @@ static inline unsigned int refinementLoo
                        i++;                                                    
                                                                                
                                                                                
                                \
                }                                                               
                                                                                
                                                                                
                                                \
        }
+
 #define refineLoopSingleOperator(comparator, positionIsTruePositiveCondition, 
residualPosition) \
        while(i < candidateCount) {                                             
                                                                                
                                                \
-       const unsigned int index = compressedHead->positions[i];                
                                        \
-       const unsigned int offset = (tailApproximationBytes)*i;                 
                                        \
-       const int compressedValue = *(int*)&(compressedTail->elements[offset])  
& tailApproximationMask; \
-       const int deCompressedValue = compressedTail->base+                     
                                                        \
-               (compressedValue << tailResidualBits)                           
                                                                                
                \
-               + (*(unsigned int*)&residuals[residualPosition*residualBytes] & 
residualMask); \
+               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;                                             
                                                                                
                                                                                
                \
        {                                                                       
                                                                                
                                                                                
                                                \
        const int positionIsCorrectPositive =                                   
                                                                                
                \
                (positionIsTruePositiveCondition);                              
                                                                                
                        \
@@ -482,7 +490,8 @@ static inline unsigned int refinementLoo
        inputPositionsI += positionIsCorrectPositive;                           
                                                                        \
        i++;                                                                    
                                                                                
                                                                                
                                \
 }                                                                              
                                                                                
                                                                                
                                                \
-}
+       }
+               
 #define refineLoop(comparator, comparator2, positionIsTruePositiveCondition, 
residualPosition) \
        if(comparator2 == NULL) {                                               
                                                                                
                                                        \
                refineLoopSingleOperator(comparator, 
positionIsTruePositiveCondition, residualPosition); \
@@ -506,6 +515,7 @@ static inline unsigned int refinementLoo
                        refineLoopDoubleOperator(comparator, ==, 
positionIsTruePositiveCondition, residualPosition); \
                }                                                               
                                                                                
                                                                                
                                                \
        }
+               
        switch (OP[0]){
 case '<':
        switch(OP[1]){
@@ -533,7 +543,8 @@ case '=': {
        if(inputPositions == NULL) {refineLoop(==, OP2, 1, index);}
        else {refineLoop(==, OP2, (index == inputPositions[inputPositionsI]), 
inputPositionsI)};
 }
-}
+       }
+       
 #undef refineLoop
 #undef refineLoopSingleOperator
 #undef refineLoopDoubleOperator
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to