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

* fixed the reconstruction of values (decompressInt)


Unterschiede (60 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
@@ -205,30 +205,41 @@ str BWDLeftJoinApproximate(bat * res, ba
        return MAL_SUCCEED;
 };
 
-static inline int decompressIntValue(const int approximationI, const int 
approximationbits, const int offsetBits, const clTail* compressedTail, const 
unsigned int* residuals, const int residualI){
-       /* const int index = compressedHead->positions[i];                      
                 */
-       const int residualBits = 32-approximationbits;
+static inline int decompressIntValue(const int approximationI, const int 
approximationBits, const int offsetBits, const clTail* compressedTail, const 
unsigned int* residuals, const int residualI){
+       const int residualBits = 32-approximationBits-offsetBits;
        const unsigned int residualMask = (1 << residualBits)-1;
-       /* const unsigned int residualBytes = residualBits/8; */
-       const int approximationBytes = approximationbits/8-offsetBits/8;
-       const int approximationMask = (1<<(approximationBytes*8))-1;
+       const int approximationBytes = approximationBits/8-offsetBits/8;
+       const int approximationMask = (1<<(approximationBits))-1;
+       const unsigned int* vals = (unsigned int*) compressedTail->elements;
+       const unsigned int targetTypeBits = sizeof(int)*8;
 
 
-       const int slotI =  
(approximationBytes*8)*approximationI/(sizeof(int)*8);
-       const int offset = 
((approximationBytes*8)*approximationI)%(sizeof(int)*8);
-       const unsigned int compressedValue = (((unsigned 
int*)compressedTail->elements)[slotI] >> 
(8*sizeof(int)-offset-(approximationBytes*8))) & approximationMask;
+       const unsigned int slotI =  
(approximationBytes*8)*approximationI/(sizeof(int)*8);
+       const unsigned int offset = 
((approximationBytes*8)*approximationI)%(sizeof(int)*8);
+
+       const unsigned int compressedValue =
+               (((offset+approximationBits)<=targetTypeBits)*
+                (vals[slotI] >> (targetTypeBits-offset-approximationBits)) & 
approximationMask)
+               +       (((offset+approximationBits)>targetTypeBits)?
+                        
(((vals[slotI]<<(approximationBits-targetTypeBits+offset))
+                                + 
(vals[slotI+1]>>(targetTypeBits-(approximationBits-targetTypeBits+offset))))&approximationMask):0);
+
+       
        const size_t residualSlotI = (residualI*residualBits)/32;
        const unsigned int residualOffset = (residualI*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 int deCompressedValue =   compressedTail->base+
                (compressedValue << residualBits)
                + residual;
 
-
-       /* const int offset = approximationBytes*i;  */
-       /* const int compressedValue = 
*(int*)&(compressedTail->elements[offset]) & approximationMask;  */
-       /* const int deCompressedValue = compressedTail->base + 
(compressedValue << residualBits) + (*(int*)&residuals[residualI*residualBytes] 
& residualMask); */
        return deCompressedValue;
 }
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to