Changeset: ed3146037fea for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ed3146037fea
Modified Files:
        monetdb5/modules/mal/mosaic_prefix.c
Branch: mosaic
Log Message:

Fix 64 bits prefix


diffs (truncated from 315 to 300 lines):

diff --git a/monetdb5/modules/mal/mosaic_prefix.c 
b/monetdb5/modules/mal/mosaic_prefix.c
--- a/monetdb5/modules/mal/mosaic_prefix.c
+++ b/monetdb5/modules/mal/mosaic_prefix.c
@@ -234,13 +234,12 @@ MOSestimate_prefix(Client cntxt, MOStask
                        w = v+1;
                        Prefix(bits, mask, val, val2, 64);
                        val = *v & mask;
-                       if( bits > 32) return 1.0;
                        for(i = 0; i < task->elm; w++, i++){
                                if ( val != (*w & mask) )
                                        break;
                        }
                        if ( i > MOSlimit() ) i = MOSlimit();
-                       bits = i * (32 -bits);
+                       bits = i * (64 -bits);
                        store = bits/8 + ((bits % 8) >0);
                        store = MosaicBlkSize + 2 * sizeof(int) + wordaligned( 
store,int);
                        factor = ( (flt)i * sizeof(int))/ store;
@@ -252,13 +251,13 @@ MOSestimate_prefix(Client cntxt, MOStask
        return factor;
 }
 
-#define compress() \
-{      cell = (i * rbits)/32;\
-       lshift= 32 -((i * rbits) % 32) ;\
+#define compress(Bits) \
+{      cell = (i * rbits)/Bits;\
+       lshift= Bits -((i * rbits) % Bits) ;\
        if ( lshift > rbits){\
                base[cell]= base[cell] | (m << (lshift-rbits));\
        }else{ \
-               rshift= 32 -  ((i+1) * rbits) % 32;\
+               rshift= Bits -  ((i+1) * rbits) % Bits;\
                base[cell]= base[cell] | (m >> (rbits-lshift));\
                base[cell+1]= 0 | (m  << rshift);\
        }\
@@ -268,8 +267,6 @@ void
 MOScompress_prefix(Client cntxt, MOStask task)
 {
        BUN i ;
-       unsigned int *base;
-       unsigned int cell, bits, rbits, lshift, rshift;
        int size;
        MosaicBlk blk = task->blk;
 
@@ -285,6 +282,8 @@ MOScompress_prefix(Client cntxt, MOStask
                {       bte *v = (bte*) task->src, *w= v+1, val = *v, val2 = 
*w, mask;
                        bte *dst = (bte*)  (((char*) blk) + MosaicBlkSize);
                        BUN limit = task->elm > MOSlimit()? MOSlimit(): 
task->elm;
+                       unsigned int *base;
+                       unsigned int cell, bits, rbits, lshift, rshift;
                        unsigned int m;
 
                        // search first non-identical value
@@ -304,19 +303,12 @@ MOScompress_prefix(Client cntxt, MOStask
                        *base = 0;
                        
                        val = *v & mask;        //reference value
+                       if( i < limit)
                        for(w = v, i = 0; i < limit; w++, i++){
                                if ( val  != (*w & mask) )
                                        break;
                                m = (unsigned int)( *w & (~mask)); // residu
-                               cell = (i * rbits)/32;
-                               lshift= 32 -((i * rbits) % 32) ;
-                               if ( lshift > rbits){
-                                       base[cell]= base[cell] | (m << 
(lshift-rbits));
-                               }else{ 
-                                       rshift= 32 -  ((i+1) * rbits) % 32;
-                                       base[cell]= base[cell] | (m >> 
(rbits-lshift));
-                                       base[cell+1]= 0 | (m  << rshift);
-                               }
+                               compress(32);
                        }
                        MOSincCnt(blk,i);
                        task->src += i;
@@ -327,6 +319,8 @@ MOScompress_prefix(Client cntxt, MOStask
                {       sht *v = (sht*) task->src, *w= v+1, val = *v, val2 = 
*w, mask;
                        sht *dst = (sht*)  (((char*) blk) + MosaicBlkSize);
                        BUN limit = task->elm > MOSlimit()? MOSlimit(): 
task->elm;
+                       unsigned int *base;
+                       unsigned int cell, bits, rbits, lshift, rshift;
                        unsigned int m;
 
                        // search first non-identical value
@@ -346,75 +340,24 @@ MOScompress_prefix(Client cntxt, MOStask
                        *base = 0;
                        
                        val = *v & mask;        //reference value
+                       if( i < limit)
                        for(w = v, i = 0; i < limit; w++, i++){
                                if ( val  != (*w & mask) )
                                        break;
                                m = (unsigned int)( *w & (~mask)); // residu
-                               cell = (i * rbits)/32;
-                               lshift= 32 -((i * rbits) % 32) ;
-                               if ( lshift > rbits){
-                                       base[cell]= base[cell] | (m << 
(lshift-rbits));
-                               }else{ 
-                                       rshift= 32 -  ((i+1) * rbits) % 32;
-                                       base[cell]= base[cell] | (m >> 
(rbits-lshift));
-                                       base[cell+1]= 0 | (m  << rshift);
-                               }
+                               compress(32);
                        }
                        MOSincCnt(blk,i);
                        task->src += i * 2;
                        task->dst += (i * rbits)/8 + (i %8) != 0;
                }
                break;
-               case 4:
-                       {       unsigned int *v = (unsigned int*) task->src, 
*w= v+1, val = *v, val2 = *w, mask, m;
-                               unsigned int *dst = (unsigned int*)  (((char*) 
blk) + MosaicBlkSize);
-                               BUN limit = task->elm > MOSlimit()? MOSlimit(): 
task->elm;
-
-                               // search first non-identical value
-                               for(i = 0;i < limit;i++, w++)
-                               if( *v != *w ){
-                                       val2 = *w;
-                                       break;
-                               }
-                               w = v+1;
-                               Prefix(bits, mask, val, val2, 32);
-                               rbits = 32-bits;
-                               *dst++ = mask;
-                               *dst = *v & mask;
-                               *dst = *dst | rbits; // bits outside mask
-                               dst++;
-                               base  = (unsigned int*) dst; // start of bit 
vector
-                               *base = 0;
-                               
-                               val = *v & mask;        //reference value
-                               //mnstr_printf(cntxt->fdout,"compress %o %o val 
%d bits %d, %d mask %o\n",*v,*w,val,bits, rbits,mask);
-                               for(w = v, i = 0; i < limit; w++, i++){
-                                       if ( val  != (*w & mask) )
-                                               break;
-                                       m = *w & (~mask); // residu
-                                       //mnstr_printf(cntxt->fdout,"compress 
%d residu %d %o\n",*w,m,m);
-                                       cell = (i * rbits)/32;
-                                       lshift= 32 -((i * rbits) % 32) ;
-                                       if ( lshift > rbits){
-                                               base[cell]= base[cell] | (m << 
(lshift-rbits));
-                                               
//mnstr_printf(cntxt->fdout,"[%d] shift %d rbits %d cell %o\n",cell, lshift, 
rbits, base[cell]);
-                                       }else{ 
-                                               rshift= 32 -  ((i+1) * rbits) % 
32;
-                                               base[cell]= base[cell] | (m >> 
(rbits-lshift));
-                                               base[cell+1]= 0 | (m  << 
rshift);
-                                               
//mnstr_printf(cntxt->fdout,"[%d] shift %d %d cell %o %o val %o %o\n", cell, 
lshift, rshift,
-                                                       
//base[cell],base[cell+1], (m >> (rbits-lshift)),  (m <<rshift));
-                               }
-                       }
-                       MOSincCnt(blk,i);
-                       task->src += i * 4;
-                       task->dst += (i * rbits)/8 + (i %8) != 0;
-               }
-               break;
-       case 8:
-               {       lng *v = (lng*) task->src, *w= v+1, val = *v, val2 = 
*w, mask, m;
-                       lng *dst = (lng*)  (((char*) blk) + MosaicBlkSize);
+       case 4:
+               {       unsigned int *v = (unsigned int*) task->src, *w= v+1, 
val = *v, val2 = *w, mask, m;
+                       unsigned int *dst = (unsigned int*)  (((char*) blk) + 
MosaicBlkSize);
                        BUN limit = task->elm > MOSlimit()? MOSlimit(): 
task->elm;
+                       unsigned int *base;
+                       unsigned int cell, bits, rbits, lshift, rshift;
 
                        // search first non-identical value
                        for(i = 0;i < limit;i++, w++)
@@ -434,6 +377,7 @@ MOScompress_prefix(Client cntxt, MOStask
                        
                        val = *v & mask;        //reference value
                        //mnstr_printf(cntxt->fdout,"compress %o %o val %d bits 
%d, %d mask %o\n",*v,*w,val,bits, rbits,mask);
+                       if( i < limit)
                        for(w = v, i = 0; i < limit; w++, i++){
                                if ( val  != (*w & mask) )
                                        break;
@@ -453,6 +397,43 @@ MOScompress_prefix(Client cntxt, MOStask
                                }
                        }
                        MOSincCnt(blk,i);
+                       task->src += i * 4;
+                       task->dst += (i * rbits)/8 + (i %8) != 0;
+               }
+               break;
+       case 8:
+               {       lng *v = (lng*) task->src, *w= v+1, val = *v, val2 = 
*w, mask, m;
+                       lng *dst = (lng*)  (((char*) blk) + MosaicBlkSize);
+                       BUN limit = task->elm > MOSlimit()? MOSlimit(): 
task->elm;
+                       unsigned long *base;
+                       unsigned long cell, bits, rbits, lshift, rshift;
+
+                       // search first non-identical value
+                       for(i = 0;i < limit;i++, w++)
+                       if( *v != *w ){
+                               val2 = *w;
+                               break;
+                       }
+                       w = v+1;
+                       Prefix(bits, mask, val, val2, 64);
+                       rbits = 64-bits;
+                       *dst++ = mask;
+                       *dst = *v & mask;
+                       *dst = *dst | rbits; // bits outside mask
+                       dst++;
+                       base  = (unsigned long*) dst; // start of bit vector
+                       *base = 0;
+                       
+                       val = *v & mask;        //reference value
+                       //mnstr_printf(cntxt->fdout,"compress %o %o val %d bits 
%d, %d mask %o\n",*v,*w,val,bits, rbits,mask);
+                       if( i < limit)
+                       for(w = v, i = 0; i < limit; w++, i++){
+                               if ( val  != (*w & mask) )
+                                       break;
+                               m = *w & (~mask); // residu
+                               compress(64);
+                       }
+                       MOSincCnt(blk,i);
                        task->src += i * 8 ;
                        task->dst += (i * rbits)/8 + (i %8) != 0;
                }
@@ -462,14 +443,14 @@ MOScompress_prefix(Client cntxt, MOStask
 #endif
 }
 
-#define decompress()\
-{      cell = (i * rbits)/32;\
-       lshift= 32 -((i * rbits) % 32) ;\
+#define decompress(Bits)\
+{      cell = (i * rbits)/Bits;\
+       lshift= Bits -((i * rbits) % Bits) ;\
        if ( lshift >rbits){\
                m1 = (base[cell]>> (lshift-rbits)) & m;\
                v = val  | m1;\
          }else{ \
-               rshift= 32 -  ((i+1) * rbits) % 32;\
+               rshift= Bits -  ((i+1) * rbits) % Bits;\
                m1 =(base[cell] & (m >> (rbits-lshift)));\
                m2 = base[cell+1] >>rshift;\
                v= val | (m1 <<(rbits-lshift)) | m2;\
@@ -481,11 +462,8 @@ MOSdecompress_prefix(Client cntxt, MOSta
 {
        MosaicBlk blk =  ((MosaicBlk) task->blk);
        BUN i;
-       unsigned int *base;
-       unsigned int cell, rbits, lshift, rshift;
        int size;
        (void) cntxt;
-       (void) rshift;
 
        size = ATOMsize(task->type);
        if( ATOMstorage(task->type == TYPE_str))
@@ -496,6 +474,8 @@ MOSdecompress_prefix(Client cntxt, MOSta
                        bte mask = *dst++, val  =  *dst++, v;
                        bte m,m1,m2;
                        BUN lim= MOSgetCnt(blk);
+                       unsigned int *base;
+                       unsigned int cell, rbits, lshift, rshift;
 
                        m = ~mask;
                        rbits = val & m;
@@ -503,7 +483,7 @@ MOSdecompress_prefix(Client cntxt, MOSta
                        base = (unsigned int*) dst;
                        //mnstr_printf(cntxt->fdout,"decompress rbits %d mask 
%o val %d\n",rbits,m,val);
                        for(i = 0; i < lim; i++){
-                               decompress();
+                               decompress(32);
                                ((int*)task->src)[i] = v;
                        }
                        task->src += i;
@@ -514,6 +494,8 @@ MOSdecompress_prefix(Client cntxt, MOSta
                        sht mask = *dst++, val  =  *dst++, v;
                        sht m,m1,m2;
                        BUN lim= MOSgetCnt(blk);
+                       unsigned int *base;
+                       unsigned int cell, rbits, lshift, rshift;
 
                        m = ~mask;
                        rbits = val & m;
@@ -521,7 +503,7 @@ MOSdecompress_prefix(Client cntxt, MOSta
                        base = (unsigned int*) dst;
                        //mnstr_printf(cntxt->fdout,"decompress rbits %d mask 
%o val %d\n",rbits,m,val);
                        for(i = 0; i < lim; i++){
-                               decompress();
+                               decompress(32);
                                ((int*)task->src)[i] = v;
                        }
                        task->src += i * 2;
@@ -532,6 +514,8 @@ MOSdecompress_prefix(Client cntxt, MOSta
                        unsigned int mask = *dst++, val  =  *dst++, v;
                        unsigned int m,m1,m2;
                        BUN lim= MOSgetCnt(blk);
+                       unsigned int *base;
+                       unsigned int cell, rbits, lshift, rshift;
 
                        m = ~mask;
                        rbits = val & m;
@@ -562,14 +546,16 @@ MOSdecompress_prefix(Client cntxt, MOSta
                        lng mask = *dst++, val  =  *dst++, v;
                        lng m,m1,m2;
                        BUN lim= MOSgetCnt(blk);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to