Skip to content

Commit 42fac17

Browse files
committed
cherry pick changes to BitPacking into 6.1.X
1 parent cb34ae6 commit 42fac17

File tree

2 files changed

+51
-49
lines changed

2 files changed

+51
-49
lines changed

src/main/java/org/apache/datasketches/theta/BitPacking.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ static void packBitsBlock8(final long[] values, final int i, final byte[] buf, f
152152
case 61: packBits61(values, i, buf, off); break;
153153
case 62: packBits62(values, i, buf, off); break;
154154
case 63: packBits63(values, i, buf, off); break;
155-
default: throw new SketchesArgumentException("wrong number of bits " + bits);
155+
default: throw new SketchesArgumentException("wrong number of bits in packBitsBlock8: " + bits);
156156
}
157157
}
158158

@@ -221,7 +221,7 @@ static void unpackBitsBlock8(final long[] values, final int i, final byte[] buf,
221221
case 61: unpackBits61(values, i, buf, off); break;
222222
case 62: unpackBits62(values, i, buf, off); break;
223223
case 63: unpackBits63(values, i, buf, off); break;
224-
default: throw new SketchesArgumentException("wrong number of bits " + bits);
224+
default: throw new SketchesArgumentException("wrong number of bits unpackBitsBlock8: " + bits);
225225
}
226226
}
227227

@@ -482,7 +482,7 @@ static void packBits13(final long[] values, final int i, final byte[] buf, int o
482482

483483
buf[off++] = (byte) (values[i + 3] >>> 4);
484484

485-
buf[off] = (byte) (values[i + 3] >>> 4);
485+
buf[off] = (byte) (values[i + 3] << 4);
486486
buf[off++] |= values[i + 4] >>> 9;
487487

488488
buf[off++] = (byte) (values[i + 4] >>> 1);
@@ -4449,7 +4449,7 @@ static void unpackBits35(final long[] values, final int i, final byte[] buf, int
44494449
values[i + 1] |= Byte.toUnsignedLong(buf[off++]) << 6;
44504450
values[i + 1] |= Byte.toUnsignedLong(buf[off]) >>> 2;
44514451

4452-
values[i + 2] = (Byte.toUnsignedLong(buf[off++]) & 2) << 33;
4452+
values[i + 2] = (Byte.toUnsignedLong(buf[off++]) & 3) << 33;
44534453
values[i + 2] |= (Byte.toUnsignedLong(buf[off++])) << 25;
44544454
values[i + 2] |= Byte.toUnsignedLong(buf[off++]) << 17;
44554455
values[i + 2] |= Byte.toUnsignedLong(buf[off++]) << 9;

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

+47-45
Original file line numberDiff line numberDiff line change
@@ -31,60 +31,62 @@ public class BitPackingTest {
3131

3232
@Test
3333
public void packUnpackBits() {
34-
for (int bits = 1; bits <= 63; bits++) {
35-
final long mask = (1 << bits) - 1;
36-
long[] input = new long[8];
37-
final long golden64 = Util.INVERSE_GOLDEN_U64;
38-
long value = 0xaa55aa55aa55aa55L; // arbitrary starting value
39-
for (int i = 0; i < 8; ++i) {
40-
input[i] = value & mask;
41-
value += golden64;
42-
}
43-
byte[] bytes = new byte[8 * Long.BYTES];
44-
int bitOffset = 0;
45-
int bufOffset = 0;
46-
for (int i = 0; i < 8; ++i) {
47-
BitPacking.packBits(input[i], bits, bytes, bufOffset, bitOffset);
48-
bufOffset += (bitOffset + bits) >>> 3;
49-
bitOffset = (bitOffset + bits) & 7;
50-
}
34+
long value = 0xaa55aa55aa55aa55L; // arbitrary starting value
35+
for (int n = 0; n < 10000; n++) {
36+
for (int bits = 1; bits <= 63; bits++) {
37+
final long mask = (1 << bits) - 1;
38+
long[] input = new long[8];
39+
for (int i = 0; i < 8; ++i) {
40+
input[i] = value & mask;
41+
value += Util.INVERSE_GOLDEN_U64;
42+
}
43+
byte[] bytes = new byte[8 * Long.BYTES];
44+
int bitOffset = 0;
45+
int bufOffset = 0;
46+
for (int i = 0; i < 8; ++i) {
47+
BitPacking.packBits(input[i], bits, bytes, bufOffset, bitOffset);
48+
bufOffset += (bitOffset + bits) >>> 3;
49+
bitOffset = (bitOffset + bits) & 7;
50+
}
5151

52-
long[] output = new long[8];
53-
bitOffset = 0;
54-
bufOffset = 0;
55-
for (int i = 0; i < 8; ++i) {
56-
BitPacking.unpackBits(output, i, bits, bytes, bufOffset, bitOffset);
57-
bufOffset += (bitOffset + bits) >>> 3;
58-
bitOffset = (bitOffset + bits) & 7;
59-
}
60-
for (int i = 0; i < 8; ++i) {
61-
assertEquals(output[i], input[i]);
52+
long[] output = new long[8];
53+
bitOffset = 0;
54+
bufOffset = 0;
55+
for (int i = 0; i < 8; ++i) {
56+
BitPacking.unpackBits(output, i, bits, bytes, bufOffset, bitOffset);
57+
bufOffset += (bitOffset + bits) >>> 3;
58+
bitOffset = (bitOffset + bits) & 7;
59+
}
60+
for (int i = 0; i < 8; ++i) {
61+
assertEquals(output[i], input[i]);
62+
}
6263
}
6364
}
6465
}
6566

6667
@Test
6768
public void packUnpackBlocks() {
68-
for (int bits = 1; bits <= 63; bits++) {
69-
if (enablePrinting) { System.out.println("bits " + bits); }
70-
final long mask = (1L << bits) - 1;
71-
long[] input = new long[8];
72-
final long golden64 = Util.INVERSE_GOLDEN_U64;
73-
long value = 0xaa55aa55aa55aa55L; // arbitrary starting value
74-
for (int i = 0; i < 8; ++i) {
75-
input[i] = value & mask;
76-
value += golden64;
77-
}
78-
byte[] bytes = new byte[8 * Long.BYTES];
79-
BitPacking.packBitsBlock8(input, 0, bytes, 0, bits);
80-
if (enablePrinting) { hexDump(bytes); }
69+
long value = 0xaa55aa55aa55aa55L; // arbitrary starting value
70+
for (int n = 0; n < 10000; n++) {
71+
for (int bits = 1; bits <= 63; bits++) {
72+
if (enablePrinting) { System.out.println("bits " + bits); }
73+
final long mask = (1L << bits) - 1;
74+
long[] input = new long[8];
75+
for (int i = 0; i < 8; ++i) {
76+
input[i] = value & mask;
77+
value += Util.INVERSE_GOLDEN_U64;
78+
}
79+
byte[] bytes = new byte[8 * Long.BYTES];
80+
BitPacking.packBitsBlock8(input, 0, bytes, 0, bits);
81+
if (enablePrinting) { hexDump(bytes); }
8182

82-
long[] output = new long[8];
83-
BitPacking.unpackBitsBlock8(output, 0, bytes, 0, bits);
83+
long[] output = new long[8];
84+
BitPacking.unpackBitsBlock8(output, 0, bytes, 0, bits);
8485

85-
for (int i = 0; i < 8; ++i) {
86-
if (enablePrinting) { System.out.println("checking value " + i); }
87-
assertEquals(output[i], input[i]);
86+
for (int i = 0; i < 8; ++i) {
87+
if (enablePrinting) { System.out.println("checking value " + i); }
88+
assertEquals(output[i], input[i]);
89+
}
8890
}
8991
}
9092
}

0 commit comments

Comments
 (0)