1 | //CHECK: |
---|
2 | //What happens when ECQBits==1, or ECQBits==0 or ECQBits<0? |
---|
3 | //Rounding? Scale originalEb by 0.99? |
---|
4 | |
---|
5 | //Possible improvement: Change GAMESS format: {i i i i d} -> {i}{i}{i}{i}{d} |
---|
6 | //Possible improvement: Optimize bookkeeping bits |
---|
7 | //Possible improvement: Guess the type (C/UC, Sparse/Not) |
---|
8 | //Possible improvement: Get rid of writing/reading some of the indexes to in/out buffers |
---|
9 | //Possible improvement: Get rid of all debug stuff, including Makefile debug flags |
---|
10 | //Possible improvement: Get rid of "compressedBytes" |
---|
11 | //Possible improvement: SparseCompressed, ECQBits=2: 1's and -1's can be represented by just 0 and 1, instead 10 and 11. |
---|
12 | //Possible improvement: SparseCompressed, ECQBits>2: Again: 1: 10, -1:11, Others: 0XX...XX |
---|
13 | //Possible improvement: WriteBitsFast: maybe remove some masks? |
---|
14 | //Possible improvement: WriteBitsFast: Get rid of multiple calls! |
---|
15 | //Possible improvement: UCSparse: Indexes use 64 bits. It can be lowered to _1DIdxBits |
---|
16 | //Possible improvement: Parameters: Smaller data sizes may be possible! |
---|
17 | |
---|
18 | |
---|
19 | |
---|
20 | #ifndef PASTRI_H |
---|
21 | #define PASTRI_H |
---|
22 | |
---|
23 | #include <stdio.h> |
---|
24 | #include <stdlib.h> |
---|
25 | #include <stdint.h> |
---|
26 | #include <string.h> |
---|
27 | #include <math.h> |
---|
28 | #include <assert.h> //Just for debugging purposes! |
---|
29 | |
---|
30 | //#define DATASIZE 8 //Bytes per input data point. |
---|
31 | //We have only 1 double per data point, so it is 8 bytes. |
---|
32 | |
---|
33 | #define MAX_PS_SIZE 100 |
---|
34 | #define MAX_BLOCK_SIZE 10000 |
---|
35 | #define MAX_BUFSIZE 160000 //Should be a multiple of 8 |
---|
36 | #define D_W 0 //Debug switch: Write (input block) |
---|
37 | #define D_R 0 //Debug switch: Read (compressed block) |
---|
38 | #define D_G 0 //Debug switch: General |
---|
39 | #define D_G2 0 //Debug switch: General 2 (a little more detail) |
---|
40 | #define D_C 0 //Debug switch: C |
---|
41 | //#define DEBUG 1 //Debug switch |
---|
42 | |
---|
43 | //#define BOOKKEEPINGBITS 0 //Currently unused |
---|
44 | //#define BOOKKEEPINGBITS 120 //Includes: mode, indexOffsets, compressedBytes, Pb_, ECQBits_ (8+64+32+8+8) |
---|
45 | //BOOKKEEPINGBITS is defined here, because if P & S is going to be used, they appear just after the bookkeeping part. |
---|
46 | //This allows us to write P and S directly onto using outBuf. |
---|
47 | |
---|
48 | |
---|
49 | // IMPORTANT NOTE: |
---|
50 | //Read/Write up to 56 bits. |
---|
51 | //More than that is not supported! |
---|
52 | |
---|
53 | |
---|
54 | /********************************************************************/ |
---|
55 | //Datatype Declarations: |
---|
56 | /********************************************************************/ |
---|
57 | typedef struct pastri_params{ |
---|
58 | double originalEb; //Error Bound entered by the user |
---|
59 | double usedEb; //Error Bound used during compression/deceompression |
---|
60 | |
---|
61 | int numBlocks; //Number of blocks to be compressed |
---|
62 | int dataSize; //8(=Double) or 4(=Float) |
---|
63 | |
---|
64 | int bf[4]; //Orbital types (basis function types). Typically in range [0,3] |
---|
65 | int idxRange[4]; //Ranges of indexes. idxRange[i]=(bf[i]+1)*(bf[i]+2)/2; |
---|
66 | |
---|
67 | int sbSize; //=idxRange[2]*idxRange[3]; |
---|
68 | int sbNum; //=idxRange[0]*idxRange[1]; |
---|
69 | int bSize; //=sbSize*sbNum; |
---|
70 | |
---|
71 | //uint16_t idxOffset[4]; //Index offset values. No longer used. |
---|
72 | |
---|
73 | }pastri_params; |
---|
74 | |
---|
75 | //Block-specific stuff: |
---|
76 | typedef struct pastri_blockParams{ |
---|
77 | uint16_t nonZeros; |
---|
78 | //int ECQ0s; //= p->bSize - numOutliers //OR: p->bSize=ECQ0s+ECQ1s+ECQOthers |
---|
79 | int ECQ1s; |
---|
80 | int ECQOthers; |
---|
81 | int numOutliers; //=ECQ1s+ECQOthers |
---|
82 | int patternBits; |
---|
83 | int scaleBits; |
---|
84 | double binSize; |
---|
85 | double scalesBinSize; |
---|
86 | uint64_t ECQExt; |
---|
87 | int ECQBits; |
---|
88 | int _1DIdxBits; |
---|
89 | }pastri_blockParams; |
---|
90 | |
---|
91 | typedef union u_UI64I64D{ |
---|
92 | uint64_t ui64; |
---|
93 | int64_t i64; |
---|
94 | double d; |
---|
95 | } u_UI64I64D; |
---|
96 | |
---|
97 | /********************************************************************/ |
---|
98 | //Function Prototypes: |
---|
99 | /********************************************************************/ |
---|
100 | void SZ_pastriReadParameters(char paramsFilename[512],pastri_params *paramsPtr); |
---|
101 | //Read the basic PaSTRI parameters from a file, speficied by paramsFilename. |
---|
102 | |
---|
103 | void SZ_pastriPreprocessParameters(pastri_params *p); |
---|
104 | //Using basic PaSTRI parameters, generate the others. |
---|
105 | //For example, block and sub-block sizes are generated by using basis function types. |
---|
106 | |
---|
107 | void SZ_pastriCompressBatch(pastri_params *p,unsigned char *originalBuf, unsigned char** compressedBufP,size_t *compressedBytes); |
---|
108 | //INPUTS: p, originalBuf |
---|
109 | //OUTPUTS: compressedBufP, compressedBytes |
---|
110 | //Using the inputs, compressedBufP is allocated and populated by the compressed data. Compressed size is written into compressedBytes. |
---|
111 | //Parameters are also stored at the beginning part of the compressedBuf |
---|
112 | |
---|
113 | void SZ_pastriDecompressBatch(unsigned char*compressedBuf, pastri_params *p, unsigned char** decompressedBufP ,size_t *decompressedBytes); |
---|
114 | //INPUTS: compressedBuf |
---|
115 | //OUTPUTS: p, decompressedBufP, decompressedBytes |
---|
116 | //First, parameters are read from compressedBuf and written into p. |
---|
117 | //Then, decompressedBufP is allocated and populated by the decompressed data. Decompressed size is written into decompressedBytes. |
---|
118 | |
---|
119 | void SZ_pastriCheckBatch(pastri_params *p,unsigned char*originalBuf,unsigned char*decompressedBuf); |
---|
120 | //INPUTS: p, originalBuf, decompressedBuf |
---|
121 | //OUTPUTS: None (Just some on-screen messages) |
---|
122 | //Compares originalBuf with decompressedBuf. Checks whether the absolute error condition is satisfied or not. |
---|
123 | |
---|
124 | /********************************************************************/ |
---|
125 | //Other Includes: |
---|
126 | /********************************************************************/ |
---|
127 | |
---|
128 | |
---|
129 | |
---|
130 | #include "pastriGeneral.h" //General tools |
---|
131 | #include "pastriD.h" //Compression/Decompression for Double data |
---|
132 | #include "pastriF.h" //Compression/Decompression for Float data |
---|
133 | |
---|
134 | |
---|
135 | #endif |
---|
136 | |
---|
137 | |
---|
138 | |
---|
139 | |
---|
140 | |
---|