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

Layout


diffs (truncated from 391 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
@@ -232,8 +232,9 @@ MOSestimate_prefix(Client cntxt, MOStask
                                break;
                        }
                        w = v+1;
-                       Prefix(bits, mask, val, val2, 32);
+                       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;
@@ -245,125 +246,125 @@ MOSestimate_prefix(Client cntxt, MOStask
                        factor = ( (flt)i * sizeof(int))/ store;
                }
        }
-       #ifdef _DEBUG_MOSAIC_
-               mnstr_printf(cntxt->fdout,"#estimate rle "BUNFMT" elm %4.3f 
factor\n",i,factor);
-       #endif
-               return factor;
-       }
+#ifdef _DEBUG_MOSAIC_
+       mnstr_printf(cntxt->fdout,"#estimate rle "BUNFMT" elm %4.3f 
factor\n",i,factor);
+#endif
+       return factor;
+}
 
-       #define compress() \
-       {       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);\
-               }\
-       }
+#define compress() \
+{      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);\
+       }\
+}
 
-       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;
+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;
 
-               (void) cntxt;
-               MOSsetTag(blk, MOSAIC_PREFIX);
+       (void) cntxt;
+       MOSsetTag(blk, MOSAIC_PREFIX);
 
-               size = ATOMsize(task->type);
-               if( ATOMstorage(task->type == TYPE_str))
-                               size =task->b->T->width;
-               if( task->elm >=2 )
-               switch(size){
-               case 1:
-                       {       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 m;
+       size = ATOMsize(task->type);
+       if( ATOMstorage(task->type == TYPE_str))
+                       size =task->b->T->width;
+       if( task->elm >=2 )
+       switch(size){
+       case 1:
+               {       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 m;
 
-                               // search first non-identical value
-                               for(i = 0;i < limit;i++, w++)
-                               if( *v != *w ){
-                                       val2 = *w;
+                       // 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, 8);
+                       rbits = 8-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
+                       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);
                                }
-                               w = v+1;
-                               Prefix(bits, mask, val, val2, 8);
-                               rbits = 8-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
-                               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);
-                                       }
+                       }
+                       MOSincCnt(blk,i);
+                       task->src += i;
+                       task->dst += (i * rbits)/8 + (i %8) != 0;
+               }
+               break;
+       case 2:
+               {       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 m;
+
+                       // 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, 16);
+                       rbits = 16-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
+                       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);
                                }
-                               MOSincCnt(blk,i);
-                               task->src += i * sizeof(int);
-                               task->dst += (i * rbits)/8 + (i %8) != 0;
                        }
-                       break;
-               case 2:
-                       {       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 m;
-
-                               // 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, 16);
-                               rbits = 16-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
-                               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);
-                                       }
-                               }
-                               MOSincCnt(blk,i);
-                               task->src += i * sizeof(int);
-                               task->dst += (i * rbits)/8 + (i %8) != 0;
-                       }
-                       break;
+                       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);
@@ -406,7 +407,7 @@ MOSestimate_prefix(Client cntxt, MOStask
                                }
                        }
                        MOSincCnt(blk,i);
-                       task->src += i * sizeof(int);
+                       task->src += i * 4;
                        task->dst += (i * rbits)/8 + (i %8) != 0;
                }
                break;
@@ -452,7 +453,7 @@ MOSestimate_prefix(Client cntxt, MOStask
                                }
                        }
                        MOSincCnt(blk,i);
-                       task->src += i * sizeof(int);
+                       task->src += i * 8 ;
                        task->dst += (i * rbits)/8 + (i %8) != 0;
                }
        }
@@ -465,7 +466,7 @@ MOSestimate_prefix(Client cntxt, MOStask
 {      cell = (i * rbits)/32;\
        lshift= 32 -((i * rbits) % 32) ;\
        if ( lshift >rbits){\
-               m1 = (base[cell] & (m <<(lshift-rbits)))>> (lshift-rbits);\
+               m1 = (base[cell]>> (lshift-rbits)) & m;\
                v = val  | m1;\
          }else{ \
                rshift= 32 -  ((i+1) * rbits) % 32;\
@@ -495,17 +496,17 @@ MOSdecompress_prefix(Client cntxt, MOSta
                        bte mask = *dst++, val  =  *dst++, v;
                        bte m,m1,m2;
                        BUN lim= MOSgetCnt(blk);
-                       rbits = val & (~mask);
-                       for(m=1, i=1; i < (BUN) rbits; i++)
-                               m= (m << 1) | 1;
+
+                       m = ~mask;
+                       rbits = val & m;
+                       val = val & mask;
                        base = (unsigned int*) dst;
-                       val = val & mask;
                        //mnstr_printf(cntxt->fdout,"decompress rbits %d mask 
%o val %d\n",rbits,m,val);
                        for(i = 0; i < lim; i++){
                                decompress();
                                ((int*)task->src)[i] = v;
                        }
-                       task->src += i * sizeof(int);
+                       task->src += i;
                }
                break;
        case 2:
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to