This is an automated email from the ASF dual-hosted git repository.
leerho pushed a commit to branch 6.1.X
in repository https://gitbox.apache.org/repos/asf/datasketches-java.git
The following commit(s) were added to refs/heads/6.1.X by this push:
new 42fac17d cherry pick changes to BitPacking into 6.1.X
42fac17d is described below
commit 42fac17d45ff4bb55a3b930a971c37ed326285df
Author: Lee Rhodes <[email protected]>
AuthorDate: Fri Jan 10 15:29:39 2025 -0800
cherry pick changes to BitPacking into 6.1.X
---
.../org/apache/datasketches/theta/BitPacking.java | 8 +-
.../apache/datasketches/theta/BitPackingTest.java | 92 +++++++++++-----------
2 files changed, 51 insertions(+), 49 deletions(-)
diff --git a/src/main/java/org/apache/datasketches/theta/BitPacking.java
b/src/main/java/org/apache/datasketches/theta/BitPacking.java
index ca70dafa..99bcfb10 100644
--- a/src/main/java/org/apache/datasketches/theta/BitPacking.java
+++ b/src/main/java/org/apache/datasketches/theta/BitPacking.java
@@ -152,7 +152,7 @@ public class BitPacking {
case 61: packBits61(values, i, buf, off); break;
case 62: packBits62(values, i, buf, off); break;
case 63: packBits63(values, i, buf, off); break;
- default: throw new SketchesArgumentException("wrong number of bits " +
bits);
+ default: throw new SketchesArgumentException("wrong number of bits in
packBitsBlock8: " + bits);
}
}
@@ -221,7 +221,7 @@ public class BitPacking {
case 61: unpackBits61(values, i, buf, off); break;
case 62: unpackBits62(values, i, buf, off); break;
case 63: unpackBits63(values, i, buf, off); break;
- default: throw new SketchesArgumentException("wrong number of bits " +
bits);
+ default: throw new SketchesArgumentException("wrong number of bits
unpackBitsBlock8: " + bits);
}
}
@@ -482,7 +482,7 @@ public class BitPacking {
buf[off++] = (byte) (values[i + 3] >>> 4);
- buf[off] = (byte) (values[i + 3] >>> 4);
+ buf[off] = (byte) (values[i + 3] << 4);
buf[off++] |= values[i + 4] >>> 9;
buf[off++] = (byte) (values[i + 4] >>> 1);
@@ -4449,7 +4449,7 @@ public class BitPacking {
values[i + 1] |= Byte.toUnsignedLong(buf[off++]) << 6;
values[i + 1] |= Byte.toUnsignedLong(buf[off]) >>> 2;
- values[i + 2] = (Byte.toUnsignedLong(buf[off++]) & 2) << 33;
+ values[i + 2] = (Byte.toUnsignedLong(buf[off++]) & 3) << 33;
values[i + 2] |= (Byte.toUnsignedLong(buf[off++])) << 25;
values[i + 2] |= Byte.toUnsignedLong(buf[off++]) << 17;
values[i + 2] |= Byte.toUnsignedLong(buf[off++]) << 9;
diff --git a/src/test/java/org/apache/datasketches/theta/BitPackingTest.java
b/src/test/java/org/apache/datasketches/theta/BitPackingTest.java
index 152bee03..a961bffc 100644
--- a/src/test/java/org/apache/datasketches/theta/BitPackingTest.java
+++ b/src/test/java/org/apache/datasketches/theta/BitPackingTest.java
@@ -31,60 +31,62 @@ public class BitPackingTest {
@Test
public void packUnpackBits() {
- for (int bits = 1; bits <= 63; bits++) {
- final long mask = (1 << bits) - 1;
- long[] input = new long[8];
- final long golden64 = Util.INVERSE_GOLDEN_U64;
- long value = 0xaa55aa55aa55aa55L; // arbitrary starting value
- for (int i = 0; i < 8; ++i) {
- input[i] = value & mask;
- value += golden64;
- }
- byte[] bytes = new byte[8 * Long.BYTES];
- int bitOffset = 0;
- int bufOffset = 0;
- for (int i = 0; i < 8; ++i) {
- BitPacking.packBits(input[i], bits, bytes, bufOffset, bitOffset);
- bufOffset += (bitOffset + bits) >>> 3;
- bitOffset = (bitOffset + bits) & 7;
- }
+ long value = 0xaa55aa55aa55aa55L; // arbitrary starting value
+ for (int n = 0; n < 10000; n++) {
+ for (int bits = 1; bits <= 63; bits++) {
+ final long mask = (1 << bits) - 1;
+ long[] input = new long[8];
+ for (int i = 0; i < 8; ++i) {
+ input[i] = value & mask;
+ value += Util.INVERSE_GOLDEN_U64;
+ }
+ byte[] bytes = new byte[8 * Long.BYTES];
+ int bitOffset = 0;
+ int bufOffset = 0;
+ for (int i = 0; i < 8; ++i) {
+ BitPacking.packBits(input[i], bits, bytes, bufOffset, bitOffset);
+ bufOffset += (bitOffset + bits) >>> 3;
+ bitOffset = (bitOffset + bits) & 7;
+ }
- long[] output = new long[8];
- bitOffset = 0;
- bufOffset = 0;
- for (int i = 0; i < 8; ++i) {
- BitPacking.unpackBits(output, i, bits, bytes, bufOffset, bitOffset);
- bufOffset += (bitOffset + bits) >>> 3;
- bitOffset = (bitOffset + bits) & 7;
- }
- for (int i = 0; i < 8; ++i) {
- assertEquals(output[i], input[i]);
+ long[] output = new long[8];
+ bitOffset = 0;
+ bufOffset = 0;
+ for (int i = 0; i < 8; ++i) {
+ BitPacking.unpackBits(output, i, bits, bytes, bufOffset, bitOffset);
+ bufOffset += (bitOffset + bits) >>> 3;
+ bitOffset = (bitOffset + bits) & 7;
+ }
+ for (int i = 0; i < 8; ++i) {
+ assertEquals(output[i], input[i]);
+ }
}
}
}
@Test
public void packUnpackBlocks() {
- for (int bits = 1; bits <= 63; bits++) {
- if (enablePrinting) { System.out.println("bits " + bits); }
- final long mask = (1L << bits) - 1;
- long[] input = new long[8];
- final long golden64 = Util.INVERSE_GOLDEN_U64;
- long value = 0xaa55aa55aa55aa55L; // arbitrary starting value
- for (int i = 0; i < 8; ++i) {
- input[i] = value & mask;
- value += golden64;
- }
- byte[] bytes = new byte[8 * Long.BYTES];
- BitPacking.packBitsBlock8(input, 0, bytes, 0, bits);
- if (enablePrinting) { hexDump(bytes); }
+ long value = 0xaa55aa55aa55aa55L; // arbitrary starting value
+ for (int n = 0; n < 10000; n++) {
+ for (int bits = 1; bits <= 63; bits++) {
+ if (enablePrinting) { System.out.println("bits " + bits); }
+ final long mask = (1L << bits) - 1;
+ long[] input = new long[8];
+ for (int i = 0; i < 8; ++i) {
+ input[i] = value & mask;
+ value += Util.INVERSE_GOLDEN_U64;
+ }
+ byte[] bytes = new byte[8 * Long.BYTES];
+ BitPacking.packBitsBlock8(input, 0, bytes, 0, bits);
+ if (enablePrinting) { hexDump(bytes); }
- long[] output = new long[8];
- BitPacking.unpackBitsBlock8(output, 0, bytes, 0, bits);
+ long[] output = new long[8];
+ BitPacking.unpackBitsBlock8(output, 0, bytes, 0, bits);
- for (int i = 0; i < 8; ++i) {
- if (enablePrinting) { System.out.println("checking value " + i); }
- assertEquals(output[i], input[i]);
+ for (int i = 0; i < 8; ++i) {
+ if (enablePrinting) { System.out.println("checking value " + i); }
+ assertEquals(output[i], input[i]);
+ }
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]