1 | #ifndef PASTRID_H |
---|
2 | #define PASTRID_H |
---|
3 | |
---|
4 | static inline int64_t pastri_double_quantize(double x, double binSize){ |
---|
5 | //Add or sub 0.5, depending on the sign: |
---|
6 | x=x/binSize; |
---|
7 | |
---|
8 | u_UI64I64D u1,half; |
---|
9 | u1.d=x; |
---|
10 | |
---|
11 | half.d=0.5; |
---|
12 | |
---|
13 | // //printf("pastri_double_quantize:\nx=%lf x=0x%lx\n",x,(*((uint64_t *)(&x)))); |
---|
14 | // //printf("sign(x):0x%lx\n", x); |
---|
15 | // //printf("0.5:0x%lx\n", (*((uint64_t *)(&half)))); |
---|
16 | half.ui64 |= (u1.ui64 & (uint64_t)0x8000000000000000); |
---|
17 | // //printf("sign(x)*0.5:0x%lx\n", (*((uint64_t *)(&half)))); |
---|
18 | return (int64_t)(x + half.d); |
---|
19 | } |
---|
20 | |
---|
21 | static inline void pastri_double_PatternMatch(double*data,pastri_params* p,pastri_blockParams* bp,int64_t* patternQ,int64_t *scalesQ, int64_t* ECQ){ |
---|
22 | //Find the pattern. |
---|
23 | //First, find the extremum point: |
---|
24 | double absExt=0; //Absolute value of Extremum |
---|
25 | int extIdx=-1; //Index of Extremum |
---|
26 | bp->nonZeros=0; |
---|
27 | int i,sb; |
---|
28 | for(i=0;i<p->bSize;i++){ |
---|
29 | // //printf("data[%d] = %.16lf\n",i,data[i]);//DEBUG |
---|
30 | if(abs_FastD(data[i])>p->usedEb){ |
---|
31 | bp->nonZeros++; |
---|
32 | ////if(DEBUG)printf("data[%d]:%.6e\n",i,data[i]); //DEBUG |
---|
33 | } |
---|
34 | if(abs_FastD(data[i])>absExt){ |
---|
35 | absExt=abs_FastD(data[i]); |
---|
36 | extIdx=i; |
---|
37 | } |
---|
38 | } |
---|
39 | int patternIdx; //Starting Index of Pattern |
---|
40 | patternIdx=(extIdx/p->sbSize)*p->sbSize; |
---|
41 | |
---|
42 | double patternExt=data[extIdx]; |
---|
43 | bp->binSize=2*p->usedEb; |
---|
44 | |
---|
45 | ////if(DEBUG){printf("Extremum : data[%d] = %.6e\n",extIdx,patternExt);} //DEBUG |
---|
46 | ////if(DEBUG){printf("patternIdx: %d\n",patternIdx);} //DEBUG |
---|
47 | |
---|
48 | ////if(DEBUG){for(i=0;i<p->sbSize;i++){printf("pattern[%d]=data[%d]=%.6e Quantized:%d\n",i,patternIdx+i,data[patternIdx+i],pastri_double_quantize(data[patternIdx+i]/binSize) );} }//DEBUG |
---|
49 | |
---|
50 | //int64_t *patternQ=(int64_t*)(outBuf+15); //Possible Improvement! |
---|
51 | |
---|
52 | |
---|
53 | for(i=0;i<p->sbSize;i++){ |
---|
54 | patternQ[i]=pastri_double_quantize(data[patternIdx+i],bp->binSize); |
---|
55 | //if(D_W){printf("patternQ[%d]=%ld\n",i,patternQ[i]);} |
---|
56 | } |
---|
57 | |
---|
58 | bp->patternBits=bitsNeeded_double((abs_FastD(patternExt)/bp->binSize)+1)+1; |
---|
59 | bp->scaleBits=bp->patternBits; |
---|
60 | bp->scalesBinSize=1/(double)(((uint64_t)1<<(bp->scaleBits-1))-1); |
---|
61 | ////if(DEBUG){printf("(patternExt/binSize)+1: %.6e\n",(patternExt/binSize)+1);} //DEBUG |
---|
62 | ////if(DEBUG){printf("scaleBits=patternBits: %d\n",scaleBits);} //DEBUG |
---|
63 | //if(D_W){printf("scalesBinSize: %.6e\n",bp->scalesBinSize);} //DEBUG |
---|
64 | |
---|
65 | //Calculate Scales. |
---|
66 | //The index part of the input buffer will be reused to hold Scale, Pattern, etc. values. |
---|
67 | int localExtIdx=extIdx%p->sbSize; //Local extremum index. This is not the actual extremum of the current sb, but rather the index that correspond to the global (block) extremum. |
---|
68 | //int64_t *scalesQ=(int64_t*)(outBuf+15+p->sbSize*8); //Possible Improvement! |
---|
69 | int patternExtZero=(patternExt==0); |
---|
70 | ////if(DEBUG){printf("patternExtZero: %d\n",patternExtZero);} //DEBUG |
---|
71 | for(sb=0;sb<p->sbNum;sb++){ |
---|
72 | //scales[sb]=data[sb*p->sbSize+localExtIdx]/patternExt; |
---|
73 | //scales[sb]=patternExtZero ? 0 : data[sb*p->sbSize+localExtIdx]/patternExt; |
---|
74 | //assert(scales[sb]<=1); |
---|
75 | scalesQ[sb]=pastri_double_quantize((patternExtZero ? 0 : data[sb*p->sbSize+localExtIdx]/patternExt),bp->scalesBinSize); |
---|
76 | //if(D_W){printf("scalesQ[%d]=%ld\n",sb,scalesQ[sb]);} |
---|
77 | } |
---|
78 | ////if(DEBUG){for(i=0;i<p->sbSize;i++){printf("scalesQ[%d]=%ld \n",i,scalesQ[i]);}} //DEBUG |
---|
79 | |
---|
80 | //int64_t *ECQ=(int64_t*)(outBuf+p->bSize*8); //ECQ is written into outBuf, just be careful when handling it. |
---|
81 | |
---|
82 | //uint64_t wVal; |
---|
83 | bp->ECQExt=0; |
---|
84 | int _1DIdx; |
---|
85 | bp->ECQ1s=0; |
---|
86 | bp->ECQOthers=0; |
---|
87 | double PS_binSize=bp->scalesBinSize*bp->binSize; |
---|
88 | for(sb=0;sb<p->sbNum;sb++){ |
---|
89 | for(i=0;i<p->sbSize;i++){ |
---|
90 | _1DIdx=sb*p->sbSize+i; |
---|
91 | ECQ[_1DIdx]=pastri_double_quantize( (scalesQ[sb]*patternQ[i]*PS_binSize-data[_1DIdx]),bp->binSize ); |
---|
92 | double absECQ=abs_FastD(ECQ[_1DIdx]); |
---|
93 | if(absECQ > bp->ECQExt) |
---|
94 | bp->ECQExt=absECQ; |
---|
95 | ////if(DEBUG){printf("EC[%d]: %.6e Quantized:%ld \n",_1DIdx,(scalesQ[sb]*patternQ[i]*scalesBinSize*binSize-data[_1DIdx]),ECQ[_1DIdx]);} //DEBUG |
---|
96 | switch (ECQ[_1DIdx]){ |
---|
97 | case 0: |
---|
98 | //ECQ0s++; //Currently not needed |
---|
99 | break; |
---|
100 | case 1: |
---|
101 | bp->ECQ1s++; |
---|
102 | break; |
---|
103 | case -1: |
---|
104 | bp->ECQ1s++; |
---|
105 | break; |
---|
106 | default: |
---|
107 | bp->ECQOthers++; |
---|
108 | break; |
---|
109 | } |
---|
110 | } |
---|
111 | } |
---|
112 | |
---|
113 | /* |
---|
114 | //DEBUG: Self-check. Remove this later. |
---|
115 | for(sb=0;sb<p->sbNum;sb++){ |
---|
116 | for(i=0;i<p->sbSize;i++){ |
---|
117 | _1DIdx=sb*p->sbSize+i; |
---|
118 | double decompressed=scalesQ[sb]*patternQ[i]*scalesBinSize*binSize-ECQ[_1DIdx]*binSize; |
---|
119 | if(abs_FastD(decompressed-data[_1DIdx])>(p->usedEb)){ |
---|
120 | //printf("p->usedEb=%.6e\n",p->usedEb); |
---|
121 | //printf("data[%d]=%.6e decompressed[%d]=%.6e diff=%.6e\n",_1DIdx,data[_1DIdx],_1DIdx,decompressed,abs_FastD(data[_1DIdx]-decompressed)); |
---|
122 | assert(0); |
---|
123 | } |
---|
124 | } |
---|
125 | } |
---|
126 | */ |
---|
127 | } |
---|
128 | |
---|
129 | static inline void pastri_double_Encode(double *data,int64_t* patternQ,int64_t* scalesQ,int64_t* ECQ,pastri_params *p,pastri_blockParams* bp,unsigned char* outBuf,int *numOutBytes){ |
---|
130 | bp->ECQBits=bitsNeeded_UI64(bp->ECQExt)+1; |
---|
131 | bp->_1DIdxBits=bitsNeeded_UI64(p->bSize); |
---|
132 | //(*numOutBytes)=0; |
---|
133 | |
---|
134 | int i; |
---|
135 | |
---|
136 | //Encode: 3 options: |
---|
137 | //Compressed, Sparse ECQ |
---|
138 | //Compressed, Non-Sparse ECQ |
---|
139 | //Uncompressed, Sparse Data |
---|
140 | //Uncompressed, Non-spsarse Data |
---|
141 | |
---|
142 | unsigned int UCSparseBits; //Uncompressed, Sparse bits. Just like the original GAMESS data. Includes: mode, nonZeros, {indexes, data} |
---|
143 | unsigned int UCNonSparseBits; //Uncompressed, NonSparse bits. Includes: mode, data |
---|
144 | unsigned int CSparseBits; //Includes: mode, compressedBytes, patternBits, ECQBits,numOutliers,P, S, {Indexes(Sparse), ECQ} |
---|
145 | unsigned int CNonSparseBits; //Includes: mode, compressedBytes, patternBits, ECQBits,P, S, {ECQ} |
---|
146 | //int BOOKKEEPINGBITS=120; //Includes: mode, compressedBytes, patternBits, ECQBits (8+64+32+8+8) //Moved to much earlier! |
---|
147 | |
---|
148 | //Consider: ECQ0s, ECQ1s, ECQOthers. Number of following values in ECQ: {0}, {1,-1}, { val<=-2, val>=2} |
---|
149 | //ECQ0s is actually not needed, but others are needed. |
---|
150 | |
---|
151 | UCSparseBits = p->dataSize*(1 + 2 + bp->nonZeros*16); //64 bits for 4 indexes, 64 bit for data. |
---|
152 | UCNonSparseBits = p->dataSize*(1 + p->bSize*8); |
---|
153 | bp->numOutliers=bp->ECQ1s+bp->ECQOthers; |
---|
154 | if(bp->ECQBits==2){ |
---|
155 | CSparseBits = p->dataSize*(1+4+1+1+2) + bp->patternBits*p->sbSize + bp->scaleBits*p->sbNum + bp->ECQ1s*(1+bp->_1DIdxBits); |
---|
156 | CNonSparseBits = p->dataSize*(1+4+1+1) + bp->patternBits*p->sbSize + bp->scaleBits*p->sbNum + p->bSize + bp->ECQ1s ; //Or: ECQ0s+ECQ1s*2; |
---|
157 | }else{ //ECQBits>2 |
---|
158 | CSparseBits = p->dataSize*(1+4+1+1+2) + bp->patternBits*p->sbSize + bp->scaleBits*p->sbNum + bp->ECQ1s*(2+bp->_1DIdxBits) + bp->ECQOthers*(1+bp->_1DIdxBits+bp->ECQBits); |
---|
159 | //CNonSparseBits = 8+32+8+8+ patternBits*p->sbSize + scaleBits*p->sbNum + p->bSize + ECQ0s + ECQ1s*3 + ECQOthers*(2+ECQBits); |
---|
160 | CNonSparseBits = p->dataSize*(1+4+1+1)+ bp->patternBits*p->sbSize + bp->scaleBits*p->sbNum + p->bSize + bp->ECQ1s*2 + bp->ECQOthers*(1+bp->ECQBits); |
---|
161 | } |
---|
162 | |
---|
163 | int UCSparseBytes=(UCSparseBits+7)/8; |
---|
164 | int UCNonSparseBytes=(UCNonSparseBits+7)/8; |
---|
165 | int CSparseBytes=(CSparseBits+7)/8; |
---|
166 | int CNonSparseBytes=(CNonSparseBits+7)/8; |
---|
167 | uint64_t bitPos=0; |
---|
168 | uint64_t bytePos=0; |
---|
169 | int i0,i1,i2,i3; |
---|
170 | int _1DIdx; |
---|
171 | |
---|
172 | //*(uint16_t*)(&outBuf[1])=p->idxOffset[0]; |
---|
173 | //*(uint16_t*)(&outBuf[3])=p->idxOffset[1]; |
---|
174 | //*(uint16_t*)(&outBuf[5])=p->idxOffset[2]; |
---|
175 | //*(uint16_t*)(&outBuf[7])=p->idxOffset[3]; |
---|
176 | |
---|
177 | //if(D_W){printf("ECQ0s:%d ECQ1s:%d ECQOthers:%d Total:%d\n",p->bSize-bp->ECQ1s-bp->ECQOthers,bp->ECQ1s,bp->ECQOthers,p->bSize);} //DEBUG |
---|
178 | //if(D_W){printf("numOutliers:%d\n",bp->numOutliers);} //DEBUG |
---|
179 | |
---|
180 | //**************************************************************************************** |
---|
181 | //if(0){ //DEBUG |
---|
182 | //W:UCSparse |
---|
183 | if((UCSparseBytes<UCNonSparseBytes) && (UCSparseBytes<CSparseBytes) && (UCSparseBytes<CNonSparseBytes) ){ |
---|
184 | //Uncompressed, Sparse bits. Just like the original GAMESS data. Includes: mode, indexOffsets, nonZeros, indexes, data |
---|
185 | *numOutBytes=UCSparseBytes; |
---|
186 | //if(D_G){printf("UCSparse\n");} //DEBUG |
---|
187 | //if(D_G)printf("ECQBits:%d\n",bp->ECQBits); //DEBUG |
---|
188 | outBuf[0]=0; //mode |
---|
189 | |
---|
190 | //*(uint16_t*)(&outBuf[9])=nonZeros; |
---|
191 | //bytePos=11;//0:mode, 1-8:indexOffsets 9-10:NonZeros. So start from 11. |
---|
192 | *(uint16_t*)(&outBuf[1])=bp->nonZeros; |
---|
193 | bytePos=3;//0:mode, 2-3:NonZeros. So start from 3. |
---|
194 | |
---|
195 | for(i0=0;i0<p->idxRange[0];i0++) |
---|
196 | for(i1=0;i1<p->idxRange[1];i1++) |
---|
197 | for(i2=0;i2<p->idxRange[2];i2++) |
---|
198 | for(i3=0;i3<p->idxRange[3];i3++){ |
---|
199 | _1DIdx=p->idxRange[3]*(i2+p->idxRange[2]*(i1+i0*p->idxRange[1]))+i3; |
---|
200 | if(abs_FastD(data[_1DIdx])>p->usedEb){ |
---|
201 | //*(uint16_t*)(&outBuf[bytePos])=i0+1+p->idxOffset[0]; |
---|
202 | *(uint16_t*)(&outBuf[bytePos])=i0; |
---|
203 | bytePos+=2; |
---|
204 | //*(uint16_t*)(&outBuf[bytePos])=i1+1+p->idxOffset[1]; |
---|
205 | *(uint16_t*)(&outBuf[bytePos])=i1; |
---|
206 | bytePos+=2; |
---|
207 | //*(uint16_t*)(&outBuf[bytePos])=i2+1+p->idxOffset[2]; |
---|
208 | *(uint16_t*)(&outBuf[bytePos])=i2; |
---|
209 | bytePos+=2; |
---|
210 | //*(uint16_t*)(&outBuf[bytePos])=i3+1+p->idxOffset[3]; |
---|
211 | *(uint16_t*)(&outBuf[bytePos])=i3; |
---|
212 | bytePos+=2; |
---|
213 | |
---|
214 | *(double*)(&outBuf[bytePos])=data[_1DIdx]; |
---|
215 | bytePos+=p->dataSize; |
---|
216 | } |
---|
217 | } |
---|
218 | |
---|
219 | //if(D_G)printf("UCSparseBytes:%d \n",UCSparseBytes); //DEBUG |
---|
220 | |
---|
221 | //**************************************************************************************** |
---|
222 | //}else if(0){ //DEBUG |
---|
223 | //W:UCNonSparse |
---|
224 | }else if((UCNonSparseBytes<UCSparseBytes) && (UCNonSparseBytes<CSparseBytes) && (UCNonSparseBytes<CNonSparseBytes) ){ |
---|
225 | //Uncompressed, NonSparse bits. Includes: mode, indexOffsets, data |
---|
226 | *numOutBytes=UCNonSparseBytes; |
---|
227 | //if(D_G){printf("UCNonSparse\n");} //DEBUG |
---|
228 | //if(D_G)printf("ECQBits:%d\n",bp->ECQBits); //DEBUG |
---|
229 | outBuf[0]=1; //mode |
---|
230 | |
---|
231 | //memcpy(&outBuf[9], &inBuf[p->bSize*8], UCNonSparseBytes-9); |
---|
232 | memcpy(&outBuf[1], data, p->bSize*p->dataSize); |
---|
233 | |
---|
234 | //if(D_G)printf("UCNonSparseBytes:%d \n",UCNonSparseBytes); //DEBUG |
---|
235 | /* |
---|
236 | for(i=0;i<UCNonSparseBytes-17;i++){ |
---|
237 | //printf("%d ",inBuf[p->bSize*8+i]); |
---|
238 | } |
---|
239 | //printf("\n"); |
---|
240 | for(i=0;i<UCNonSparseBytes-17;i++){ |
---|
241 | //printf("%d ",outBuf[17+i]); |
---|
242 | } |
---|
243 | //printf("\n"); |
---|
244 | */ |
---|
245 | //**************************************************************************************** |
---|
246 | //}else if(1){ //DEBUG |
---|
247 | //W:CSparse |
---|
248 | }else if((CSparseBytes<UCNonSparseBytes) && (CSparseBytes<UCSparseBytes) && (CSparseBytes<CNonSparseBytes) ){ |
---|
249 | //Includes: mode, indexOffsets, compressedBytes, patternBits, ECQBits,numOutliers,P, S, {Indexes(Sparse), ECQ} |
---|
250 | *numOutBytes=CSparseBytes; |
---|
251 | //if(D_G){printf("CSparse\n");} //DEBUG |
---|
252 | //if(D_G)printf("ECQBits:%d\n",bp->ECQBits); //DEBUG |
---|
253 | ////if(DEBUG){printf("patternBits:%d _1DIdxBits:%d\n",patternBits,_1DIdxBits);} //DEBUG |
---|
254 | outBuf[0]=2; //mode |
---|
255 | |
---|
256 | ////outBuf bytes [1:8] are indexOffsets, which are already written. outBuf bytes [9:12] are reserved for compressedBytes. |
---|
257 | //outBuf[13]=patternBits; |
---|
258 | //outBuf[14]=ECQBits; |
---|
259 | ////Currently, we are at the end of 15th byte. |
---|
260 | //*(uint16_t*)(&outBuf[15])=numOutliers; |
---|
261 | //bitPos=17*8; //Currently, we are at the end of 17th byte. |
---|
262 | |
---|
263 | //outBuf bytes [1:4] are reserved for compressedBytes. |
---|
264 | outBuf[5]=bp->patternBits; |
---|
265 | outBuf[6]=bp->ECQBits; |
---|
266 | //Currently, we are at the end of 7th byte. |
---|
267 | |
---|
268 | *(uint16_t*)(&outBuf[7])=bp->numOutliers; |
---|
269 | //Now, we are at the end of 9th byte. |
---|
270 | bitPos=9*8; |
---|
271 | |
---|
272 | ////if(DEBUG){printf("bitPos_B:%ld\n",bitPos);} //DEBUG |
---|
273 | |
---|
274 | for(i=0;i<p->sbSize;i++){ |
---|
275 | writeBits_Fast(outBuf,&bitPos,bp->patternBits,patternQ[i]);//Pattern point |
---|
276 | } |
---|
277 | ////if(DEBUG){printf("bitPos_P:%ld\n",bitPos);} //DEBUG |
---|
278 | for(i=0;i<p->sbNum;i++){ |
---|
279 | writeBits_Fast(outBuf,&bitPos,bp->scaleBits,scalesQ[i]);//Scale |
---|
280 | } |
---|
281 | ////if(DEBUG){printf("bitPos_S:%ld\n",bitPos);} //DEBUG |
---|
282 | ////if(DEBUG)printf("ECQBits:%d\n",ECQBits); |
---|
283 | switch(bp->ECQBits){ |
---|
284 | case 2: |
---|
285 | for(i=0;i<p->bSize;i++){ |
---|
286 | switch(ECQ[i]){ |
---|
287 | case 0: |
---|
288 | break; |
---|
289 | case 1: |
---|
290 | ////if(DEBUG)printf("Index:%d ECQ:%ld Written:0x0\n",i,ECQ[i]); //DEBUG |
---|
291 | writeBits_Fast(outBuf,&bitPos,bp->_1DIdxBits,i); |
---|
292 | //writeBits_Fast(outBuf,&bitPos,2,0x10); |
---|
293 | //writeBits_Fast(outBuf,&bitPos,2,0);//0x00 |
---|
294 | //writeBits_Fast(outBuf,&bitPos,2,0);//0x00 |
---|
295 | writeBits_Fast(outBuf,&bitPos,1,0);//0x00 |
---|
296 | break; |
---|
297 | case -1: |
---|
298 | ////if(DEBUG)printf("Index:%d ECQ:%ld Written:0x1\n",i,ECQ[i]); //DEBUG |
---|
299 | writeBits_Fast(outBuf,&bitPos,bp->_1DIdxBits,i); |
---|
300 | //writeBits_Fast(outBuf,&bitPos,2,0x11); |
---|
301 | //writeBits_Fast(outBuf,&bitPos,2,1);//0x01 |
---|
302 | //writeBits_Fast(outBuf,&bitPos,1,0); |
---|
303 | writeBits_Fast(outBuf,&bitPos,1,1); |
---|
304 | break; |
---|
305 | default: |
---|
306 | assert(0); |
---|
307 | break; |
---|
308 | } |
---|
309 | } |
---|
310 | break; |
---|
311 | default: //ECQBits>2 |
---|
312 | for(i=0;i<p->bSize;i++){ |
---|
313 | switch(ECQ[i]){ |
---|
314 | case 0: |
---|
315 | break; |
---|
316 | case 1: |
---|
317 | ////if(DEBUG)printf("Index:%d ECQ:%ld Written:0x00\n",i,ECQ[i]); //DEBUG |
---|
318 | writeBits_Fast(outBuf,&bitPos,bp->_1DIdxBits,i); |
---|
319 | //writeBits_Fast(outBuf,&bitPos,3,0);//0x000 |
---|
320 | //writeBits_Fast(outBuf,&bitPos,1,0); |
---|
321 | writeBits_Fast(outBuf,&bitPos,1,0); |
---|
322 | writeBits_Fast(outBuf,&bitPos,1,0); |
---|
323 | break; |
---|
324 | case -1: |
---|
325 | ////if(DEBUG)printf("Index:%d ECQ:%ld Written:0x01\n",i,ECQ[i]); //DEBUG |
---|
326 | writeBits_Fast(outBuf,&bitPos,bp->_1DIdxBits,i); |
---|
327 | //writeBits_Fast(outBuf,&bitPos,3,1);//0x001 |
---|
328 | //writeBits_Fast(outBuf,&bitPos,1,0); |
---|
329 | writeBits_Fast(outBuf,&bitPos,1,0); |
---|
330 | writeBits_Fast(outBuf,&bitPos,1,1); |
---|
331 | break; |
---|
332 | default: |
---|
333 | ////if(DEBUG)printf("Index:%d ECQ:%ld Written:0x1 0x%lx\n",i,ECQ[i],ECQ[i]); //DEBUG |
---|
334 | writeBits_Fast(outBuf,&bitPos,bp->_1DIdxBits,i); |
---|
335 | //writeBits_Fast(outBuf,&bitPos,2+ECQBits,((uint64_t)0x11<<ECQBits)|ECQ[i]); |
---|
336 | //writeBits_Fast(outBuf,&bitPos,2+ECQBits,(ECQ[i]&((uint64_t)0x00<<ECQBits))|((uint64_t)0x01<<ECQBits)); |
---|
337 | //writeBits_Fast(outBuf,&bitPos,1,0); |
---|
338 | writeBits_Fast(outBuf,&bitPos,1,1); |
---|
339 | writeBits_Fast(outBuf,&bitPos,bp->ECQBits,ECQ[i]); |
---|
340 | break; |
---|
341 | } |
---|
342 | } |
---|
343 | break; |
---|
344 | } |
---|
345 | |
---|
346 | ////if(DEBUG){printf("bitPos_E:%ld\n",bitPos);} //DEBUG |
---|
347 | //if(D_C){if(!((bp->ECQBits>=2)||((bp->ECQBits==1) && (bp->numOutliers==0)))){printf("ERROR: ECQBits:%d numOutliers:%d This should not have happened!\n",bp->ECQBits,bp->numOutliers);assert(0);}} //DEBUG |
---|
348 | |
---|
349 | |
---|
350 | uint32_t bytePos=(bitPos+7)/8; |
---|
351 | //*(uint32_t*)(&outBuf[9])=bytePos; |
---|
352 | *(uint32_t*)(&outBuf[1])=bytePos; |
---|
353 | |
---|
354 | //if(D_G)printf("bitPos:%ld CSparseBits:%d bytePos:%d CSparseBytes:%d\n",bitPos,CSparseBits,bytePos,CSparseBytes); //DEBUG |
---|
355 | if(D_G){assert(bitPos==CSparseBits);} |
---|
356 | |
---|
357 | //**************************************************************************************** |
---|
358 | //W:CNonSparse |
---|
359 | }else { |
---|
360 | //Includes: mode, indexOffsets, compressedBytes, patternBits, ECQBits,P, S, {ECQ} |
---|
361 | *numOutBytes=CNonSparseBytes; |
---|
362 | //if(D_G){printf("CNonSparse\n");} //DEBUG |
---|
363 | //if(D_G)printf("ECQBits:%d\n",bp->ECQBits); //DEBUG |
---|
364 | ////if(DEBUG){printf("patternBits:%d _1DIdxBits:%d\n",patternBits,_1DIdxBits);} //DEBUG |
---|
365 | outBuf[0]=3; //mode |
---|
366 | |
---|
367 | ////outBuf bytes [1:8] are indexOffsets, which are already written. outBuf bytes [9:12] are reserved for compressedBytes. |
---|
368 | //outBuf[13]=patternBits; |
---|
369 | //outBuf[14]=ECQBits; |
---|
370 | //bitPos=15*8; //Currently, we are at the end of 15th byte. |
---|
371 | |
---|
372 | //outBuf bytes [1:4] are reserved for compressedBytes. |
---|
373 | outBuf[5]=bp->patternBits; |
---|
374 | outBuf[6]=bp->ECQBits; |
---|
375 | bitPos=7*8; //Currently, we are at the end of 7th byte. |
---|
376 | |
---|
377 | ////if(DEBUG){printf("bitPos_B:%ld\n",bitPos);} //DEBUG |
---|
378 | |
---|
379 | for(i=0;i<p->sbSize;i++){ |
---|
380 | writeBits_Fast(outBuf,&bitPos,bp->patternBits,patternQ[i]);//Pattern point |
---|
381 | } |
---|
382 | ////if(DEBUG){printf("bitPos_P:%ld\n",bitPos);} //DEBUG |
---|
383 | for(i=0;i<p->sbNum;i++){ |
---|
384 | writeBits_Fast(outBuf,&bitPos,bp->scaleBits,scalesQ[i]);//Scale |
---|
385 | } |
---|
386 | ////if(DEBUG){printf("bitPos_S:%ld\n",bitPos);} //DEBUG |
---|
387 | ////if(DEBUG)printf("ECQBits:%d\n",ECQBits); |
---|
388 | switch(bp->ECQBits){ |
---|
389 | case 2: |
---|
390 | for(i=0;i<p->bSize;i++){ |
---|
391 | switch(ECQ[i]){ |
---|
392 | case 0: |
---|
393 | ////if(DEBUG)printf("Index:%d ECQ:%d Written:0x1\n",i,ECQ[i]); //DEBUG |
---|
394 | writeBits_Fast(outBuf,&bitPos,1,1);//0x1 |
---|
395 | break; |
---|
396 | case 1: |
---|
397 | ////if(DEBUG)printf("Index:%d ECQ:%d Written:0x00\n",i,ECQ[i]); //DEBUG |
---|
398 | //writeBits_Fast(outBuf,&bitPos,2,0);//0x00 |
---|
399 | writeBits_Fast(outBuf,&bitPos,1,0); |
---|
400 | writeBits_Fast(outBuf,&bitPos,1,0); |
---|
401 | break; |
---|
402 | case -1: |
---|
403 | ////if(DEBUG)printf("Index:%d ECQ:%d Written:0x01\n",i,ECQ[i]); //DEBUG |
---|
404 | //writeBits_Fast(outBuf,&bitPos,2,2); //0x01 |
---|
405 | writeBits_Fast(outBuf,&bitPos,1,0); |
---|
406 | writeBits_Fast(outBuf,&bitPos,1,1); |
---|
407 | break; |
---|
408 | default: |
---|
409 | assert(0); |
---|
410 | break; |
---|
411 | } |
---|
412 | } |
---|
413 | break; |
---|
414 | default: //ECQBits>2 |
---|
415 | ////if(DEBUG) printf("AMG_W1:bitPos:%ld\n",bitPos); //DEBUG |
---|
416 | for(i=0;i<p->bSize;i++){ |
---|
417 | ////if(DEBUG){printf("AMG_W3:bitPos:%ld buffer[%ld]=0x%lx\n",bitPos,bitPos/8,*(uint64_t*)(&outBuf[bitPos/8]));}; //DEBUG |
---|
418 | ////if(DEBUG) printf("AMG_W2:bitPos:%ld\n",bitPos); //DEBUG |
---|
419 | ////if(DEBUG) printf("ECQ[%d]:%ld\n",i,ECQ[i]); //DEBUG |
---|
420 | switch(ECQ[i]){ |
---|
421 | case 0: |
---|
422 | ////if(DEBUG)printf("Index:%d ECQ:%ld Written:0x1\n",i,ECQ[i]); //DEBUG |
---|
423 | ////if(DEBUG){printf("AMG_WB3:bitPos:%ld buffer[%ld]=0x%lx\n",bitPos,bitPos/8,*(uint64_t*)(&outBuf[bitPos/8]));}; //DEBUG |
---|
424 | //temp1=bitPos; |
---|
425 | writeBits_Fast(outBuf,&bitPos,1,1); //0x1 |
---|
426 | //wVal=1; writeBits_Fast(outBuf,&bitPos,1,wVal); //0x1 |
---|
427 | ////if(DEBUG){printf("AMG_WA3:bitPos:%ld buffer[%ld]=0x%lx\n",temp1,temp1/8,*(uint64_t*)(&outBuf[temp1/8]));}; //DEBUG |
---|
428 | break; |
---|
429 | case 1: |
---|
430 | ////if(DEBUG)printf("Index:%d ECQ:%ld Written:0x000\n",i,ECQ[i]); //DEBUG |
---|
431 | ////if(DEBUG){printf("AMG_WB3:bitPos:%ld buffer[%ld]=0x%lx\n",bitPos,bitPos/8,*(uint64_t*)(&outBuf[bitPos/8]));}; //DEBUG |
---|
432 | //temp1=bitPos; |
---|
433 | //writeBits_Fast(outBuf,&bitPos,3,0); //0x000 |
---|
434 | writeBits_Fast(outBuf,&bitPos,1,0); |
---|
435 | writeBits_Fast(outBuf,&bitPos,1,0); |
---|
436 | writeBits_Fast(outBuf,&bitPos,1,0); |
---|
437 | //wVal=0; writeBits_Fast(outBuf,&bitPos,3,wVal); //0x000 |
---|
438 | ////if(DEBUG){printf("AMG_WA3:bitPos:%ld buffer[%ld]=0x%lx\n",temp1,temp1/8,*(uint64_t*)(&outBuf[temp1/8]));}; //DEBUG |
---|
439 | break; |
---|
440 | case -1: |
---|
441 | ////if(DEBUG)printf("Index:%d ECQ:%ld Written:0x001\n",i,ECQ[i]); //DEBUG |
---|
442 | ////if(DEBUG){printf("AMG_WB3:bitPos:%ld buffer[%ld]=0x%lx\n",bitPos,bitPos/8,*(uint64_t*)(&outBuf[bitPos/8]));}; //DEBUG |
---|
443 | //temp1=bitPos; |
---|
444 | //writeBits_Fast(outBuf,&bitPos,3,8); //0x001 |
---|
445 | writeBits_Fast(outBuf,&bitPos,1,0); |
---|
446 | writeBits_Fast(outBuf,&bitPos,1,0); |
---|
447 | writeBits_Fast(outBuf,&bitPos,1,1); |
---|
448 | //wVal=8; writeBits_Fast(outBuf,&bitPos,3,wVal); //0x001 |
---|
449 | ////if(DEBUG){printf("AMG_WA3:bitPos:%ld buffer[%ld]=0x%lx\n",temp1,temp1/8,*(uint64_t*)(&outBuf[temp1/8]));}; //DEBUG |
---|
450 | break; |
---|
451 | default: |
---|
452 | ////if(DEBUG)printf("Index:%d ECQ:%ld Written:0x01 0x%lx\n",i,ECQ[i]); //DEBUG |
---|
453 | ////if(DEBUG){printf("AMG_WB3:bitPos:%ld buffer[%ld]=0x%lx\n",bitPos,bitPos/8,*(uint64_t*)(&outBuf[bitPos/8]));}; //DEBUG |
---|
454 | //temp1=bitPos; |
---|
455 | //writeBits_Fast(outBuf,&bitPos,2,2); //0x01 |
---|
456 | writeBits_Fast(outBuf,&bitPos,1,0); |
---|
457 | writeBits_Fast(outBuf,&bitPos,1,1); |
---|
458 | //wVal=2; writeBits_Fast(outBuf,&bitPos,2,wVal); //0x01 |
---|
459 | writeBits_Fast(outBuf,&bitPos,bp->ECQBits,ECQ[i]); |
---|
460 | ////if(DEBUG){printf("AMG_WA3:bitPos:%ld buffer[%ld]=0x%lx\n",temp1,temp1/8,*(uint64_t*)(&outBuf[temp1/8]));}; //DEBUG |
---|
461 | break; |
---|
462 | } |
---|
463 | } |
---|
464 | break; |
---|
465 | } |
---|
466 | |
---|
467 | ////if(DEBUG){printf("bitPos_E:%ld\n",bitPos);} //DEBUG |
---|
468 | //if(D_C){if(!((bp->ECQBits>=2)||((bp->ECQBits==1) && (bp->numOutliers==0)))){printf("ERROR: ECQBits:%d numOutliers:%d This should not have happened!\n",bp->ECQBits,bp->numOutliers);assert(0);}} //DEBUG |
---|
469 | |
---|
470 | |
---|
471 | |
---|
472 | uint32_t bytePos=(bitPos+7)/8; |
---|
473 | //*(uint32_t*)(&outBuf[9])=bytePos; |
---|
474 | *(uint32_t*)(&outBuf[1])=bytePos; |
---|
475 | |
---|
476 | //if(D_G)printf("bitPos:%ld CNonSparseBits:%d bytePos:%d CNonSparseBytes:%d\n",bitPos,CNonSparseBits,bytePos,CNonSparseBytes); //DEBUG |
---|
477 | if(D_G){assert(bitPos==CNonSparseBits);} |
---|
478 | |
---|
479 | } |
---|
480 | ////for(i=213;i<233;i++)if(DEBUG)printf("AMG_WE:bitPos:%d buffer[%d]=0x%lx\n",i*8,i,*(uint64_t*)(&outBuf[i])); //DEBUG |
---|
481 | |
---|
482 | } |
---|
483 | static inline int pastri_double_Compress(unsigned char*inBuf,pastri_params *p,unsigned char*outBuf,int *numOutBytes){ |
---|
484 | pastri_blockParams bp; |
---|
485 | |
---|
486 | //if(D_G2){printf("Parameters: dataSize:%d\n",p->dataSize);} //DEBUG |
---|
487 | //if(D_G2){printf("Parameters: bfs:%d %d %d %d originalEb:%.3e\n",p->bf[0],p->bf[1],p->bf[2],p->bf[3],p->usedEb);} //DEBUG |
---|
488 | //if(D_G2){printf("Parameters: idxRanges:%d %d %d %d\n",p->idxRange[0],p->idxRange[1],p->idxRange[2],p->idxRange[3]);} //DEBUG |
---|
489 | //if(D_G2){printf("Parameters: sbSize:%d sbNum:%d bSize:%d\n",p->sbSize,p->sbNum,p->bSize); }//DEBUG |
---|
490 | |
---|
491 | int64_t patternQ[MAX_PS_SIZE]; |
---|
492 | int64_t scalesQ[MAX_PS_SIZE]; |
---|
493 | int64_t ECQ[MAX_BLOCK_SIZE]; |
---|
494 | |
---|
495 | double *data; |
---|
496 | data=(double*)inBuf; |
---|
497 | |
---|
498 | //STEP 0: PREPROCESSING: |
---|
499 | //This step can include flattening the block, determining the period, etc. |
---|
500 | //Currently not needed. |
---|
501 | |
---|
502 | //STEP 1: PATTERN MATCH |
---|
503 | pastri_double_PatternMatch(data,p,&bp,patternQ,scalesQ,ECQ); |
---|
504 | |
---|
505 | //STEP 2: ENCODING(Include QUANTIZE) |
---|
506 | pastri_double_Encode(data,patternQ,scalesQ,ECQ,p,&bp,outBuf,numOutBytes); |
---|
507 | |
---|
508 | |
---|
509 | return 0; |
---|
510 | } |
---|
511 | |
---|
512 | static inline double pastri_double_InverseQuantization(int64_t q, double binSize){ |
---|
513 | return q*binSize; |
---|
514 | } |
---|
515 | |
---|
516 | static inline void pastri_double_PredictData(pastri_params *p,pastri_blockParams *bp,double *data,int64_t* patternQ,int64_t* scalesQ,int64_t* ECQ){ |
---|
517 | int j; |
---|
518 | double PS_binSize=bp->scalesBinSize*bp->binSize; |
---|
519 | for(j=0;j<p->bSize;j++){ |
---|
520 | //data[j]=scalesQ[j/p->sbSize]*patternQ[j%p->sbSize]*PS_binSize - ECQ[j]*bp->binSize; |
---|
521 | data[j]=pastri_double_InverseQuantization(scalesQ[j/p->sbSize]*patternQ[j%p->sbSize],PS_binSize) - pastri_double_InverseQuantization(ECQ[j],bp->binSize); |
---|
522 | } |
---|
523 | } |
---|
524 | |
---|
525 | static inline void pastri_double_Decode(unsigned char*inBuf,pastri_params *p,pastri_blockParams *bp,unsigned char*outBuf,int *numReadBytes,int64_t* patternQ,int64_t* scalesQ,int64_t* ECQ){ |
---|
526 | int j; |
---|
527 | bp->_1DIdxBits=bitsNeeded_UI64(p->bSize); |
---|
528 | //double *data=(double*)(outBuf+p->bSize*8); |
---|
529 | double *data=(double*)(outBuf); |
---|
530 | int i0,i1,i2,i3; |
---|
531 | //uint16_t *idx0,*idx1,*idx2,*idx3; |
---|
532 | int _1DIdx; |
---|
533 | |
---|
534 | int64_t ECQTemp; |
---|
535 | uint64_t bytePos=0; |
---|
536 | uint64_t bitPos=0; |
---|
537 | uint64_t temp,temp2; |
---|
538 | //int sb,localIdx; |
---|
539 | |
---|
540 | |
---|
541 | //idx0=(uint16_t*)(outBuf ); |
---|
542 | //idx1=(uint16_t*)(outBuf+p->bSize*2); |
---|
543 | //idx2=(uint16_t*)(outBuf+p->bSize*4); |
---|
544 | //idx3=(uint16_t*)(outBuf+p->bSize*6); |
---|
545 | //p->idxOffset[0]=*(uint32_t*)(&inBuf[1]); |
---|
546 | //p->idxOffset[1]=*(uint32_t*)(&inBuf[3]); |
---|
547 | //p->idxOffset[2]=*(uint32_t*)(&inBuf[5]); |
---|
548 | //p->idxOffset[3]=*(uint32_t*)(&inBuf[7]); |
---|
549 | /* |
---|
550 | for(i0=0;i0<p->idxRange[0];i0++) |
---|
551 | for(i1=0;i1<p->idxRange[1];i1++) |
---|
552 | for(i2=0;i2<p->idxRange[2];i2++) |
---|
553 | for(i3=0;i3<p->idxRange[3];i3++){ |
---|
554 | //_1DIdx=i0*p->idxRange[1]*p->idxRange[2]*p->idxRange[3]+i1*p->idxRange[2]*p->idxRange[3]+i2*p->idxRange[3]+i3; |
---|
555 | _1DIdx=p->idxRange[3]*(i2+p->idxRange[2]*(i1+i0*p->idxRange[1]))+i3; |
---|
556 | idx0[_1DIdx]=i0+1+p->idxOffset[0]; |
---|
557 | idx1[_1DIdx]=i1+1+p->idxOffset[1]; |
---|
558 | idx2[_1DIdx]=i2+1+p->idxOffset[2]; |
---|
559 | idx3[_1DIdx]=i3+1+p->idxOffset[3]; |
---|
560 | } |
---|
561 | */ |
---|
562 | |
---|
563 | //*numOutBytes=p->bSize*16; |
---|
564 | |
---|
565 | //inBuf[0] is "mode" |
---|
566 | switch(inBuf[0]){ |
---|
567 | //R:UCSparse |
---|
568 | case 0: |
---|
569 | //if(D_G){printf("\nDC:UCSparse\n");} //DEBUG |
---|
570 | //bp->nonZeros=*(uint16_t*)(&inBuf[9]); |
---|
571 | //bytePos=11; |
---|
572 | bp->nonZeros=*(uint16_t*)(&inBuf[1]); |
---|
573 | bytePos=3; |
---|
574 | for(j=0;j<p->bSize;j++){ |
---|
575 | data[j]=0; |
---|
576 | } |
---|
577 | for(j=0;j<bp->nonZeros;j++){ |
---|
578 | //i0=*(uint16_t*)(&inBuf[bytePos])-1-p->idxOffset[0]; //i0 |
---|
579 | i0=*(uint16_t*)(&inBuf[bytePos]); //i0 |
---|
580 | bytePos+=2; |
---|
581 | //i1=*(uint16_t*)(&inBuf[bytePos])-1-p->idxOffset[1]; //i1 |
---|
582 | i1=*(uint16_t*)(&inBuf[bytePos]); //i1 |
---|
583 | bytePos+=2; |
---|
584 | //i2=*(uint16_t*)(&inBuf[bytePos])-1-p->idxOffset[2]; //i2 |
---|
585 | i2=*(uint16_t*)(&inBuf[bytePos]); //i2 |
---|
586 | bytePos+=2; |
---|
587 | //i3=*(uint16_t*)(&inBuf[bytePos])-1-p->idxOffset[3]; //i3 |
---|
588 | i3=*(uint16_t*)(&inBuf[bytePos]); //i3 |
---|
589 | bytePos+=2; |
---|
590 | _1DIdx=p->idxRange[3]*(i2+p->idxRange[2]*(i1+i0*p->idxRange[1]))+i3; |
---|
591 | data[_1DIdx]=*(double*)(&inBuf[bytePos]); |
---|
592 | bytePos+=8; |
---|
593 | } |
---|
594 | //if(D_G){printf("\nDC:bytePos:%ld\n",bytePos);} //DEBUG |
---|
595 | break; |
---|
596 | //R:UCNonSparse |
---|
597 | case 1: |
---|
598 | //if(D_G){printf("\nDC:UCNonSparse\n");} //DEBUG |
---|
599 | //memcpy(&outBuf[p->bSize*8], &inBuf[9], p->bSize*8); |
---|
600 | memcpy(data, &inBuf[1], p->bSize*8); |
---|
601 | bytePos=p->bSize*8; |
---|
602 | //if(D_G){printf("\nDC:bytePos:%ld\n",bytePos);} //DEBUG |
---|
603 | break; |
---|
604 | //R:CSparse |
---|
605 | case 2: |
---|
606 | //if(D_G){printf("\nDC:CSparse\n");} //DEBUG |
---|
607 | //for(j=0;j<p->bSize;j++){ |
---|
608 | // data[j]=0; |
---|
609 | //} |
---|
610 | |
---|
611 | //bp->patternBits=inBuf[13]; |
---|
612 | //bp->ECQBits=inBuf[14]; |
---|
613 | |
---|
614 | bp->patternBits=inBuf[5]; |
---|
615 | bp->ECQBits=inBuf[6]; |
---|
616 | |
---|
617 | //if(D_R){printf("bp->patternBits:%d bp->ECQBits:%d bp->_1DIdxBits:%d\n",bp->patternBits,bp->ECQBits,bp->_1DIdxBits);} //DEBUG |
---|
618 | |
---|
619 | //bp->numOutliers=*(uint16_t*)(&inBuf[15]); |
---|
620 | //bitPos=17*8; |
---|
621 | bp->numOutliers=*(uint16_t*)(&inBuf[7]); |
---|
622 | bitPos=9*8; |
---|
623 | //if(D_R){printf("bp->numOutliers:%d\n",bp->numOutliers);} //DEBUG |
---|
624 | |
---|
625 | bp->scalesBinSize=1/(double)(((uint64_t)1<<(bp->patternBits-1))-1); |
---|
626 | |
---|
627 | bp->binSize=p->usedEb*2; |
---|
628 | |
---|
629 | //if(D_R){printf("bp->scalesBinSize:%.6e bp->binSize:%.6e bp->scalesBinSize*bp->binSize:%.6e\n",bp->scalesBinSize,bp->binSize,bp->scalesBinSize*bp->binSize);} //DEBUG |
---|
630 | |
---|
631 | for(j=0;j<p->sbSize;j++){ |
---|
632 | patternQ[j]=readBits_I64(inBuf,&bitPos,bp->patternBits);//Pattern point |
---|
633 | //if(D_R){printf("R:patternQ[%d]=%ld\n",j,patternQ[j]);} |
---|
634 | } |
---|
635 | for(j=0;j<p->sbNum;j++){ |
---|
636 | scalesQ[j]=readBits_I64(inBuf,&bitPos,bp->patternBits);//Scale |
---|
637 | //if(D_R){printf("R:scalesQ[%d]=%ld\n",j,scalesQ[j]);} |
---|
638 | } |
---|
639 | |
---|
640 | /* //Splitting |
---|
641 | for(j=0;j<p->bSize;j++){ |
---|
642 | data[j]=scalesQ[j/p->sbSize]*patternQ[j%p->sbSize]*bp->scalesBinSize*bp->binSize; |
---|
643 | } |
---|
644 | */ |
---|
645 | for(j=0;j<p->bSize;j++){ |
---|
646 | ECQ[j]=0; |
---|
647 | } |
---|
648 | switch(bp->ECQBits){ |
---|
649 | case 2: |
---|
650 | for(j=0;j<bp->numOutliers;j++){ |
---|
651 | ////if(DEBUG){printf("readBits_UI64:%ld\n",readBits_UI64(inBuf,&bitPos,bp->_1DIdxBits));} //DEBUG |
---|
652 | ////if(DEBUG){printf("readBits_UI64:%ld\n",readBits_I64(inBuf,&bitPos,2));} //DEBUG |
---|
653 | |
---|
654 | _1DIdx=readBits_UI64(inBuf,&bitPos,bp->_1DIdxBits); |
---|
655 | ECQTemp=readBits_I64(inBuf,&bitPos,1); |
---|
656 | ECQTemp= ((ECQTemp<<63)>>63)|(uint64_t)0x1; |
---|
657 | ////if(D_R)printf("R:ECQ[%d]: %ld \n",_1DIdx,ECQTemp); |
---|
658 | //continue; |
---|
659 | //sb=_1DIdx/p->sbSize; |
---|
660 | //localIdx=_1DIdx%p->sbSize; |
---|
661 | |
---|
662 | ////data[_1DIdx]-=ECQTemp*bp->binSize;//Splitting |
---|
663 | ECQ[_1DIdx]=ECQTemp; |
---|
664 | |
---|
665 | ////if(DEBUG){printf("decompressed[%d]:%.6e\n",_1DIdx,data[_1DIdx]);} //DEBUG |
---|
666 | } |
---|
667 | break; |
---|
668 | default: //bp->ECQBits>2 |
---|
669 | //if(D_C){if(!((bp->ECQBits>=2)||((bp->ECQBits==1) && (bp->numOutliers==0)))){printf("ERROR: bp->ECQBits:%d bp->numOutliers:%d This should not have happened!\n",bp->ECQBits,bp->numOutliers);assert(0);}} //DEBUG |
---|
670 | |
---|
671 | for(j=0;j<bp->numOutliers;j++){ |
---|
672 | _1DIdx=readBits_UI64(inBuf,&bitPos,bp->_1DIdxBits); |
---|
673 | //sb=_1DIdx/p->sbSize; |
---|
674 | //localIdx=_1DIdx%p->sbSize; |
---|
675 | temp=readBits_UI64(inBuf,&bitPos,1); |
---|
676 | ////if(DEBUG){printf("temp:%ld\n",temp);} //DEBUG |
---|
677 | switch(temp){ |
---|
678 | case 0: //+-1 |
---|
679 | ECQTemp=readBits_I64(inBuf,&bitPos,1); |
---|
680 | ECQTemp= ((ECQTemp<<63)>>63)|(uint64_t)0x1; |
---|
681 | ////if(DEBUG){printf("_1DIdx:%ld ECQTemp:0x%ld\n",_1DIdx,ECQTemp);} //DEBUG |
---|
682 | ////if(D_R)printf("R:ECQ[%d]: %ld \n",_1DIdx,ECQTemp); |
---|
683 | break; |
---|
684 | case 1: //Others |
---|
685 | ECQTemp=readBits_I64(inBuf,&bitPos,bp->ECQBits); |
---|
686 | ////if(DEBUG){printf("_1DIdx:%ld ECQTemp:0x%ld\n",_1DIdx,ECQTemp);} //DEBUG |
---|
687 | ////if(D_R)printf("R:ECQ[%d]: %ld \n",_1DIdx,ECQTemp); |
---|
688 | break; |
---|
689 | //default: |
---|
690 | //// printf("ERROR: Bad 2-bit value: 0x%lx",temp); |
---|
691 | // assert(0); //AMG |
---|
692 | // break; |
---|
693 | } |
---|
694 | |
---|
695 | //data[_1DIdx]-=ECQTemp*bp->binSize;//Splitting |
---|
696 | ECQ[_1DIdx]=ECQTemp; |
---|
697 | |
---|
698 | ////if(DEBUG){printf("decompressed[%d]:%.6e\n",_1DIdx,data[_1DIdx]);} //DEBUG |
---|
699 | } |
---|
700 | break; |
---|
701 | } |
---|
702 | //static inline uint64_t readBits_UI64(unsigned char* buffer,uint64_t *bitPosPtr,uint64_t numBits){ // numBits must be in range [0:56] |
---|
703 | //patternQ=(int64_t*)(inBuf+15); |
---|
704 | //scalesQ=(int64_t*)(inBuf+15+p->sbSize*8); |
---|
705 | |
---|
706 | bytePos=(bitPos+7)/8; |
---|
707 | //if(D_G){printf("\nDC:bytePos:%ld\n",bytePos);} //DEBUG |
---|
708 | |
---|
709 | //STEP 2: PREDICT DATA(Includes INVERSE QUANTIZATION) |
---|
710 | pastri_double_PredictData(p,bp,data,patternQ,scalesQ,ECQ); |
---|
711 | |
---|
712 | break; |
---|
713 | //R:CNonSparse |
---|
714 | case 3: |
---|
715 | //if(D_G){printf("\nDC:CNonSparse\n");} //DEBUG |
---|
716 | |
---|
717 | //for(j=0;j<p->bSize;j++){ |
---|
718 | // data[j]=0; |
---|
719 | //} |
---|
720 | |
---|
721 | //bp->patternBits=inBuf[13]; |
---|
722 | //bp->ECQBits=inBuf[14]; |
---|
723 | |
---|
724 | bp->patternBits=inBuf[5]; |
---|
725 | bp->ECQBits=inBuf[6]; |
---|
726 | |
---|
727 | //if(D_R){printf("bp->patternBits:%d bp->ECQBits:%d bp->_1DIdxBits:%d\n",bp->patternBits,bp->ECQBits,bp->_1DIdxBits);} //DEBUG |
---|
728 | |
---|
729 | //bitPos=15*8; |
---|
730 | bitPos=7*8; |
---|
731 | |
---|
732 | bp->scalesBinSize=1/(double)(((uint64_t)1<<(bp->patternBits-1))-1); |
---|
733 | bp->binSize=p->usedEb*2; |
---|
734 | |
---|
735 | //if(D_R){printf("bp->scalesBinSize:%.6e bp->binSize:%.6e bp->scalesBinSize*bp->binSize:%.6e\n",bp->scalesBinSize,bp->binSize,bp->scalesBinSize*bp->binSize);} //DEBUG |
---|
736 | |
---|
737 | for(j=0;j<p->sbSize;j++){ |
---|
738 | patternQ[j]=readBits_I64(inBuf,&bitPos,bp->patternBits);//Pattern point |
---|
739 | //if(D_R){printf("R:patternQ[%d]=%ld\n",j,patternQ[j]);} |
---|
740 | } |
---|
741 | for(j=0;j<p->sbNum;j++){ |
---|
742 | scalesQ[j]=readBits_I64(inBuf,&bitPos,bp->patternBits);//Scale |
---|
743 | //if(D_R){printf("R:scalesQ[%d]=%ld\n",j,scalesQ[j]);} |
---|
744 | } |
---|
745 | /* //Splitting |
---|
746 | for(j=0;j<p->bSize;j++){ |
---|
747 | data[j]=scalesQ[j/p->sbSize]*patternQ[j%p->sbSize]*bp->scalesBinSize*bp->binSize; |
---|
748 | ////if(DEBUG){printf("DC:PS[%d]=%.6e\n",j,data[j]);} |
---|
749 | } |
---|
750 | */ |
---|
751 | switch(bp->ECQBits){ |
---|
752 | case 2: |
---|
753 | for(j=0;j<p->bSize;j++){ |
---|
754 | ////if(DEBUG){printf("readBits_UI64:%ld\n",readBits_UI64(inBuf,&bitPos,bp->_1DIdxBits));} //DEBUG |
---|
755 | ////if(DEBUG){printf("readBits_UI64:%ld\n",readBits_I64(inBuf,&bitPos,2));} //DEBUG |
---|
756 | //_1DIdx=readBits_UI64(inBuf,&bitPos,bp->_1DIdxBits); |
---|
757 | temp=readBits_UI64(inBuf,&bitPos,1); |
---|
758 | switch(temp){ |
---|
759 | case 0: |
---|
760 | ECQTemp=readBits_I64(inBuf,&bitPos,1); |
---|
761 | ECQTemp= ((ECQTemp<<63)>>63)|(uint64_t)0x1; |
---|
762 | break; |
---|
763 | case 1: |
---|
764 | ECQTemp=0; |
---|
765 | break; |
---|
766 | default: |
---|
767 | assert(0); |
---|
768 | break; |
---|
769 | } |
---|
770 | |
---|
771 | ////if(DEBUG){printf("_1DIdx:%ld ECQTemp:0x%ld\n",_1DIdx,ECQTemp);} //DEBUG |
---|
772 | //continue; |
---|
773 | //sb=_1DIdx/p->sbSize; |
---|
774 | //localIdx=_1DIdx%p->sbSize; |
---|
775 | |
---|
776 | //data[j]-=ECQTemp*bp->binSize; //Splitting |
---|
777 | ECQ[j]=ECQTemp; |
---|
778 | |
---|
779 | ////if(DEBUG){printf("decompressed[%d]:%.6e\n",_1DIdx,data[_1DIdx]);} //DEBUG |
---|
780 | } |
---|
781 | break; |
---|
782 | default: //bp->ECQBits>2 |
---|
783 | ////if(DEBUG)printf("AMG_R1:bitPos: %ld\n",bitPos); |
---|
784 | |
---|
785 | for(j=0;j<p->bSize;j++){ |
---|
786 | ////if(DEBUG){printf("AMG_R3:bitPos:%ld buffer[%ld]=0x%lx\n",bitPos,bitPos/8,*(uint64_t*)(&inBuf[bitPos/8]));}; //DEBUG |
---|
787 | ////if(DEBUG)printf("AMG_R2:bitPos: %ld\n",bitPos); |
---|
788 | |
---|
789 | ////if(DEBUG){printf("readBits_UI64:%ld\n",readBits_UI64(inBuf,&bitPos,bp->_1DIdxBits));} //DEBUG |
---|
790 | ////if(DEBUG){printf("readBits_UI64:%ld\n",readBits_I64(inBuf,&bitPos,2));} //DEBUG |
---|
791 | //_1DIdx=readBits_UI64(inBuf,&bitPos,bp->_1DIdxBits); |
---|
792 | temp=readBits_UI64(inBuf,&bitPos,1); |
---|
793 | ////if(DEBUG){printf("AMG_R3:bitPos:%ld buffer[%ld]=0x%lx\n",bitPos,bitPos/8,*(uint64_t*)(&inBuf[bitPos/8]));}; //DEBUG |
---|
794 | switch(temp){ |
---|
795 | case 0: |
---|
796 | ////if(DEBUG)printf("Read:0"); |
---|
797 | temp2=readBits_UI64(inBuf,&bitPos,1); |
---|
798 | switch(temp2){ |
---|
799 | case 0: |
---|
800 | ////if(DEBUG)printf("0"); |
---|
801 | ECQTemp=readBits_I64(inBuf,&bitPos,1); |
---|
802 | ////if(DEBUG){printf("AMG_R3:bitPos:%ld buffer[%ld]=0x%lx\n",bitPos,bitPos/8,*(uint64_t*)(&inBuf[bitPos/8]));}; //DEBUG |
---|
803 | ////if(DEBUG)printf("R:ECQTemp:%ld\n",ECQTemp); |
---|
804 | ECQTemp= ((ECQTemp<<63)>>63)|(uint64_t)0x1; |
---|
805 | ////if(DEBUG)printf("R:ECQ[%d]: %ld\n",j,ECQTemp); |
---|
806 | break; |
---|
807 | case 1: |
---|
808 | ////if(DEBUG)printf("1\n"); |
---|
809 | ECQTemp=readBits_I64(inBuf,&bitPos,bp->ECQBits); |
---|
810 | ////if(DEBUG){printf("AMG_R3:bitPos:%ld buffer[%ld]=0x%lx\n",bitPos,bitPos/8,*(uint64_t*)(&inBuf[bitPos/8]));}; //DEBUG |
---|
811 | ////if(DEBUG)printf("R:ECQ[%d]: %ld\n",j,ECQTemp); |
---|
812 | break; |
---|
813 | default: |
---|
814 | assert(0); |
---|
815 | break; |
---|
816 | } |
---|
817 | break; |
---|
818 | case 1: |
---|
819 | ////if(DEBUG)printf("Read:1\n"); |
---|
820 | ECQTemp=0; |
---|
821 | ////if(DEBUG)printf("R:ECQ[%d]: %ld\n",j,ECQTemp); |
---|
822 | break; |
---|
823 | default: |
---|
824 | assert(0); |
---|
825 | break; |
---|
826 | } |
---|
827 | |
---|
828 | ////if(DEBUG){printf("_1DIdx:%ld ECQTemp:0x%ld\n",_1DIdx,ECQTemp);} //DEBUG |
---|
829 | //continue; |
---|
830 | //sb=_1DIdx/p->sbSize; |
---|
831 | //localIdx=_1DIdx%p->sbSize; |
---|
832 | |
---|
833 | //data[j]-=ECQTemp*bp->binSize; //Splitting |
---|
834 | ECQ[j]=ECQTemp; |
---|
835 | |
---|
836 | ////if(DEBUG){printf("DC:data[%d]:%.6e\n",j,data[j]);} //DEBUG |
---|
837 | } |
---|
838 | break; |
---|
839 | } |
---|
840 | //static inline uint64_t readBits_UI64(unsigned char* buffer,uint64_t *bitPosPtr,uint64_t numBits){ // numBits must be in range [0:56] |
---|
841 | //patternQ=(int64_t*)(inBuf+15); |
---|
842 | //scalesQ=(int64_t*)(inBuf+15+p->sbSize*8); |
---|
843 | bytePos=(bitPos+7)/8; |
---|
844 | //if(D_G){printf("\nDC:bytePos:%ld\n",bytePos);} //DEBUG |
---|
845 | |
---|
846 | //STEP 2: PREDICT DATA(Includes INVERSE QUANTIZATION) |
---|
847 | pastri_double_PredictData(p,bp,data,patternQ,scalesQ,ECQ); |
---|
848 | break; |
---|
849 | |
---|
850 | default: |
---|
851 | assert(0); |
---|
852 | break; |
---|
853 | } |
---|
854 | (*numReadBytes)=bytePos; |
---|
855 | } |
---|
856 | |
---|
857 | static inline void pastri_double_Decompress(unsigned char*inBuf,int dataSize,pastri_params *p,unsigned char*outBuf,int *numReadBytes){ |
---|
858 | int64_t patternQ[MAX_PS_SIZE]; |
---|
859 | int64_t scalesQ[MAX_PS_SIZE]; |
---|
860 | int64_t ECQ[MAX_BLOCK_SIZE]; |
---|
861 | |
---|
862 | pastri_blockParams bp; |
---|
863 | |
---|
864 | //STEP 1: DECODE (Includes PREDICT DATA(Includes INVERSE QUANTIZATION)) |
---|
865 | //(Further steps are called inside pastri_double_Decode function) |
---|
866 | pastri_double_Decode(inBuf,p,&bp,outBuf,numReadBytes,patternQ,scalesQ,ECQ); |
---|
867 | |
---|
868 | return; |
---|
869 | } |
---|
870 | |
---|
871 | //inBuf vs Decompressed |
---|
872 | static inline int pastri_double_Check(unsigned char*inBuf,int dataSize,unsigned char*DC,pastri_params *p){ |
---|
873 | int i; |
---|
874 | |
---|
875 | double *data=(double*)(inBuf); |
---|
876 | double *data_dc=(double*)(DC); |
---|
877 | |
---|
878 | //Comparing Indexes: |
---|
879 | /* |
---|
880 | for(i=0;i<p->bSize;i++){ |
---|
881 | if(idx0[i]!=idx0_dc[i]){ |
---|
882 | //printf("idx0[%d]=%d != %d=idx0_dc[%d]",i,idx0[i],idx0_dc[i],i); |
---|
883 | assert(0); |
---|
884 | } |
---|
885 | if(idx1[i]!=idx1_dc[i]){ |
---|
886 | //printf("idx1[%d]=%d != %d=idx1_dc[%d]",i,idx1[i],idx1_dc[i],i); |
---|
887 | assert(0); |
---|
888 | } |
---|
889 | if(idx2[i]!=idx2_dc[i]){ |
---|
890 | //printf("idx2[%d]=%d != %d=idx2_dc[%d]",i,idx2[i],idx2_dc[i],i); |
---|
891 | assert(0); |
---|
892 | } |
---|
893 | if(idx3[i]!=idx3_dc[i]){ |
---|
894 | //printf("idx3[%d]=%d != %d=idx3_dc[%d]",i,idx3[i],idx3_dc[i],i); |
---|
895 | assert(0); |
---|
896 | } |
---|
897 | } |
---|
898 | */ |
---|
899 | |
---|
900 | //Comparing Data: |
---|
901 | for(i=0;i<p->bSize;i++){ |
---|
902 | if(abs_FastD(data[i]-data_dc[i])>p->usedEb){ |
---|
903 | //printf("|data[%d]-data_dc[%d]|>originalEb : %.3e - %.3e = %.3e > %.3e\n",i,i,data[i],data_dc[i],abs_FastD(data[i]-data_dc[i]),p->usedEb); |
---|
904 | assert(0); |
---|
905 | } |
---|
906 | } |
---|
907 | return 0; |
---|
908 | } |
---|
909 | |
---|
910 | |
---|
911 | #endif |
---|