Skip to content

Commit 5753fbd

Browse files
Merge pull request #645 from apache/packing_equivalence
test equivalence of packing blocks and single values
2 parents 186fb22 + 2f2e5e5 commit 5753fbd

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed

src/test/java/org/apache/datasketches/theta/BitPackingTest.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public void packUnpackBits() {
4040
input[i] = value & mask;
4141
value += Util.INVERSE_GOLDEN_U64;
4242
}
43+
4344
byte[] bytes = new byte[8 * Long.BYTES];
4445
int bitOffset = 0;
4546
int bufOffset = 0;
@@ -57,6 +58,7 @@ public void packUnpackBits() {
5758
bufOffset += (bitOffset + bits) >>> 3;
5859
bitOffset = (bitOffset + bits) & 7;
5960
}
61+
6062
for (int i = 0; i < 8; ++i) {
6163
assertEquals(output[i], input[i]);
6264
}
@@ -76,6 +78,7 @@ public void packUnpackBlocks() {
7678
input[i] = value & mask;
7779
value += Util.INVERSE_GOLDEN_U64;
7880
}
81+
7982
byte[] bytes = new byte[8 * Long.BYTES];
8083
BitPacking.packBitsBlock8(input, 0, bytes, 0, bits);
8184
if (enablePrinting) { hexDump(bytes); }
@@ -91,6 +94,68 @@ public void packUnpackBlocks() {
9194
}
9295
}
9396

97+
@Test
98+
public void packBitsUnpackBlocks() {
99+
long value = 0; // arbitrary starting value
100+
for (int n = 0; n < 10000; n++) {
101+
for (int bits = 1; bits <= 63; bits++) {
102+
final long mask = (1 << bits) - 1;
103+
long[] input = new long[8];
104+
for (int i = 0; i < 8; ++i) {
105+
input[i] = value & mask;
106+
value += Util.INVERSE_GOLDEN_U64;
107+
}
108+
109+
byte[] bytes = new byte[8 * Long.BYTES];
110+
int bitOffset = 0;
111+
int bufOffset = 0;
112+
for (int i = 0; i < 8; ++i) {
113+
BitPacking.packBits(input[i], bits, bytes, bufOffset, bitOffset);
114+
bufOffset += (bitOffset + bits) >>> 3;
115+
bitOffset = (bitOffset + bits) & 7;
116+
}
117+
118+
long[] output = new long[8];
119+
BitPacking.unpackBitsBlock8(output, 0, bytes, 0, bits);
120+
121+
for (int i = 0; i < 8; ++i) {
122+
assertEquals(output[i], input[i]);
123+
}
124+
}
125+
}
126+
}
127+
128+
@Test
129+
public void packBlocksUnpackBits() {
130+
long value = 123L; // arbitrary starting value
131+
for (int n = 0; n < 10000; n++) {
132+
for (int bits = 1; bits <= 63; bits++) {
133+
final long mask = (1 << bits) - 1;
134+
long[] input = new long[8];
135+
for (int i = 0; i < 8; ++i) {
136+
input[i] = value & mask;
137+
value += Util.INVERSE_GOLDEN_U64;
138+
}
139+
140+
byte[] bytes = new byte[8 * Long.BYTES];
141+
BitPacking.packBitsBlock8(input, 0, bytes, 0, bits);
142+
143+
long[] output = new long[8];
144+
int bitOffset = 0;
145+
int bufOffset = 0;
146+
for (int i = 0; i < 8; ++i) {
147+
BitPacking.unpackBits(output, i, bits, bytes, bufOffset, bitOffset);
148+
bufOffset += (bitOffset + bits) >>> 3;
149+
bitOffset = (bitOffset + bits) & 7;
150+
}
151+
152+
for (int i = 0; i < 8; ++i) {
153+
assertEquals(output[i], input[i]);
154+
}
155+
}
156+
}
157+
}
158+
94159
void hexDump(byte[] bytes) {
95160
for (int i = 0; i < bytes.length; i++) {
96161
System.out.print(String.format("%02x ", bytes[i]));

0 commit comments

Comments
 (0)