This is an automated email from the ASF dual-hosted git repository.

alsay pushed a commit to branch packing_equivalence
in repository https://gitbox.apache.org/repos/asf/datasketches-java.git

commit 2f2e5e592dfcc810a552e6917b1fdd7cdf665025
Author: AlexanderSaydakov <[email protected]>
AuthorDate: Mon Jan 27 19:41:40 2025 -0800

    test equivalence of packing blocks and single values
---
 .../apache/datasketches/theta/BitPackingTest.java  | 65 ++++++++++++++++++++++
 1 file changed, 65 insertions(+)

diff --git a/src/test/java/org/apache/datasketches/theta/BitPackingTest.java 
b/src/test/java/org/apache/datasketches/theta/BitPackingTest.java
index a961bffc..c155bef7 100644
--- a/src/test/java/org/apache/datasketches/theta/BitPackingTest.java
+++ b/src/test/java/org/apache/datasketches/theta/BitPackingTest.java
@@ -40,6 +40,7 @@ public class BitPackingTest {
           input[i] = value & mask;
           value += Util.INVERSE_GOLDEN_U64;
         }
+
         byte[] bytes = new byte[8 * Long.BYTES];
         int bitOffset = 0;
         int bufOffset = 0;
@@ -57,6 +58,7 @@ public class BitPackingTest {
           bufOffset += (bitOffset + bits) >>> 3;
           bitOffset = (bitOffset + bits) & 7;
         }
+
         for (int i = 0; i < 8; ++i) {
           assertEquals(output[i], input[i]);
         }
@@ -76,6 +78,7 @@ public class BitPackingTest {
           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); }
@@ -91,6 +94,68 @@ public class BitPackingTest {
     }
   }
 
+  @Test
+  public void packBitsUnpackBlocks() {
+    long value = 0; // 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];
+        BitPacking.unpackBitsBlock8(output, 0, bytes, 0, bits);
+
+        for (int i = 0; i < 8; ++i) {
+          assertEquals(output[i], input[i]);
+        }
+      }
+    }
+  }
+
+  @Test
+  public void packBlocksUnpackBits() {
+    long value = 123L; // 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];
+        BitPacking.packBitsBlock8(input, 0, bytes, 0, bits);
+
+        long[] output = new long[8];
+        int bitOffset = 0;
+        int 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]);
+        }
+      }
+    }
+  }
+
   void hexDump(byte[] bytes) {
     for (int i = 0; i < bytes.length; i++) {
       System.out.print(String.format("%02x ", bytes[i]));


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to