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]

Reply via email to