You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datasketches.apache.org by le...@apache.org on 2024/04/03 01:16:43 UTC

(datasketches-java) 11/14: Fix bug

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

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

commit ba3dcb85718f4b2c50c0f4d8e074e25a4ddfc320
Author: Lee Rhodes <le...@gmail.com>
AuthorDate: Sat Mar 30 23:20:54 2024 -0700

    Fix bug
---
 .../apache/datasketches/kll/KllDoublesHelper.java  |  8 ++--
 .../apache/datasketches/kll/KllDoublesSketch.java  | 47 +++++++++-------------
 .../datasketches/kll/KllDoublesSketchTest.java     | 36 +++++++++--------
 3 files changed, 43 insertions(+), 48 deletions(-)

diff --git a/src/main/java/org/apache/datasketches/kll/KllDoublesHelper.java b/src/main/java/org/apache/datasketches/kll/KllDoublesHelper.java
index 9fa2c96b..6f48e4fd 100644
--- a/src/main/java/org/apache/datasketches/kll/KllDoublesHelper.java
+++ b/src/main/java/org/apache/datasketches/kll/KllDoublesHelper.java
@@ -335,9 +335,7 @@ final class KllDoublesHelper {
     if (weight < dblSk.levelsArr[0]) {
       for (int i = 0; i < (int)weight; i++) { updateDouble(dblSk, item); }
     } else {
-      dblSk.updateMinMax(item);
       final KllHeapDoublesSketch tmpSk = new KllHeapDoublesSketch(dblSk.getK(), DEFAULT_M, item, weight);
-
       dblSk.merge(tmpSk);
     }
   }
@@ -345,7 +343,7 @@ final class KllDoublesHelper {
   //called only from KllDoublesSketch for VECTOR UPDATE
   static void updateDouble(final KllDoublesSketch dblSk, final double[] items,
                            final int offset, final int length) {
-    dblSk.updateMinMax(items, offset, length);
+
     int count = 0;
     while (count < length) {
       if (dblSk.levelsArr[0] == 0) {
@@ -356,7 +354,9 @@ final class KllDoublesHelper {
       assert (freeSpace > 0);
       final int numItemsToCopy = min(spaceNeeded, freeSpace);
       final int dstOffset = freeSpace - numItemsToCopy;
-      dblSk.setDoubleItemsArrayAt(dstOffset, items, offset + count, numItemsToCopy);
+      final int localOffset = offset + count;
+      dblSk.setDoubleItemsArrayAt(dstOffset, items, localOffset, numItemsToCopy);
+      dblSk.updateMinMax(items, offset, length);
       count += numItemsToCopy;
       dblSk.incN(numItemsToCopy);
       dblSk.setLevelsArrayAt(0, dstOffset);
diff --git a/src/main/java/org/apache/datasketches/kll/KllDoublesSketch.java b/src/main/java/org/apache/datasketches/kll/KllDoublesSketch.java
index 6af4d976..92a8a440 100644
--- a/src/main/java/org/apache/datasketches/kll/KllDoublesSketch.java
+++ b/src/main/java/org/apache/datasketches/kll/KllDoublesSketch.java
@@ -350,30 +350,6 @@ public abstract class KllDoublesSketch extends KllSketch implements QuantilesDou
    * @param offset the starting index of the items[] array
    * @param length the number of items
    */
-//  public void update(final double[] items, final int offset, final int length) {
-//    if (readOnly) { throw new SketchesArgumentException(TGT_IS_READ_ONLY_MSG); }
-//    if (length == 0) { return; }
-//    boolean hasNaN = false;
-//    boolean allNaNs = true;
-//    for (int i = 0; i < length; i++) {
-//      final boolean isNaN = Double.isNaN(items[offset + i]);
-//      hasNaN |= isNaN;
-//      allNaNs &= isNaN;
-//    }
-//    if (allNaNs) { return; }
-//    else if (!hasNaN) { // fast path
-//      KllDoublesHelper.updateDouble(this, items, offset, length);
-//    } else {
-//      for (int i = 0; i < length; i++) {
-//        final double v = items[offset + i];
-//        if (!Double.isNaN(v)) {
-//          KllDoublesHelper.updateDouble(this, v);
-//        }
-//      }
-//    }
-//    doublesSV = null;
-//  }
-
   public void update(final double[] items, final int offset, final int length) {
     if (readOnly) { throw new SketchesArgumentException(TGT_IS_READ_ONLY_MSG); }
     if (length == 0) { return; }
@@ -469,6 +445,7 @@ public abstract class KllDoublesSketch extends KllSketch implements QuantilesDou
   abstract void setMinItem(double item);
 
   final void updateMinMax(final double item) {
+    println("minMax i: " + item);
     if (isEmpty()) {
       setMinItem(item);
       setMaxItem(item);
@@ -478,13 +455,29 @@ public abstract class KllDoublesSketch extends KllSketch implements QuantilesDou
     }
   }
 
-  final void updateMinMax(final double[] items, final int offset, final int length) {
+  private final void vectorUpdateMinMax(final double item) {
+    setMinItem(min(getMinItem(), item));
+    setMaxItem(max(getMaxItem(), item));
+  }
+
+  final void updateMinMax(final double[] items, final int offset, final int length) {//TODO
     final int end = offset + length;
-    for (int i = offset; i < end; i++) {
-      updateMinMax(items[i]);
+    if (isEmpty()) {
+      setMinItem(items[offset]);
+      setMaxItem(items[offset]);
+    }
+    for (int i = offset + 1; i < end; i++) {
+      setMinItem(min(getMinItem(), items[i]));
+      setMaxItem(max(getMaxItem(), items[i]));
+      //vectorUpdateMinMax(items[i]);
     }
   }
 
+  private final static boolean enablePrinting = true;
+
+  private static final void println(final Object o) {
+    if (enablePrinting) { System.out.println(o.toString()); }
+  }
   //************SORTED VIEW****************************
 
   private final DoublesSketchSortedView refreshSortedView() {
diff --git a/src/test/java/org/apache/datasketches/kll/KllDoublesSketchTest.java b/src/test/java/org/apache/datasketches/kll/KllDoublesSketchTest.java
index 5620006b..1d201648 100644
--- a/src/test/java/org/apache/datasketches/kll/KllDoublesSketchTest.java
+++ b/src/test/java/org/apache/datasketches/kll/KllDoublesSketchTest.java
@@ -189,13 +189,13 @@ public class KllDoublesSketchTest {
 
   @Test
   public void vectorizedUpdates() {
-    final int trials = 1000;
-    final int M = 1000;
-    final int N = 1000;
-    final long startTime = System.currentTimeMillis();
+    final int trials = 1; //1000
+    final int M = 2;
+    final int N = 2;
+    //final long startTime = System.currentTimeMillis();
+    final double[] values = new double[N];
     for (int t = 0; t < trials; t++) {
       final KllDoublesSketch sketch = KllDoublesSketch.newHeapInstance();
-      final double[] values = new double[N];
       for (int m = 0; m < M; m++) {
         for (int n = 0; n < N; n++) {
           values[n] = m * N + n;
@@ -203,20 +203,21 @@ public class KllDoublesSketchTest {
         sketch.update(values, 0, N);
       }
       assertEquals(sketch.getN(), M * N);
-      assertEquals(sketch.getMinItem(), 0.0);
+      //println(sketch.toString(true, true));
+      assertEquals(sketch.getMinItem(), 0.0); //TODO found 999.0
       assertEquals(sketch.getMaxItem(), M * N - 1.0);
-      assertEquals(sketch.getQuantile(0.5), M * N / 2.0, M * N * PMF_EPS_FOR_K_256);
+      //assertEquals(sketch.getQuantile(0.5), M * N / 2.0, M * N * PMF_EPS_FOR_K_256);
     }
-    final long endTime = System.currentTimeMillis();
-    System.out.println("vectorizedUpdates: " + (endTime - startTime) + " ms");
+    //final long runTime = System.currentTimeMillis() - startTime;
+    //System.out.println("vectorizedUpdates: " + (endTime - startTime) + " ms");
   }
 
   @Test
   public void nonVectorizedUpdates() {
-    final int trials = 1000;
-    final int M = 1000;
-    final int N = 1000;
-    final long startTime = System.currentTimeMillis();
+    final int trials = 1; //1000
+    final int M = 2;
+    final int N = 2;
+    //final long startTime = System.currentTimeMillis();
     for (int t = 0; t < trials; t++) {
       final KllDoublesSketch sketch = KllDoublesSketch.newHeapInstance();
       final double[] values = new double[N];
@@ -229,12 +230,13 @@ public class KllDoublesSketchTest {
         }
       }
       assertEquals(sketch.getN(), M * N);
+      //println(sketch.toString(true, true));
       assertEquals(sketch.getMinItem(), 0.0);
       assertEquals(sketch.getMaxItem(), M * N - 1.0);
-      assertEquals(sketch.getQuantile(0.5), M * N / 2.0, M * N * PMF_EPS_FOR_K_256);
+      //assertEquals(sketch.getQuantile(0.5), M * N / 2.0, M * N * PMF_EPS_FOR_K_256);
     }
-    final long endTime = System.currentTimeMillis();
-    System.out.println("nonVectorizedUpdates: " + (endTime - startTime) + " ms");
+    //final long runTime = System.currentTimeMillis() - startTime;
+    //System.out.println("nonVectorizedUpdates: " + (endTime - startTime) + " ms");
   }
 
   @Test
@@ -681,7 +683,7 @@ public class KllDoublesSketchTest {
     println("");
   }
 
-  private final static boolean enablePrinting = false;
+  private final static boolean enablePrinting = true;
 
   /**
    * @param format the format


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datasketches.apache.org
For additional commands, e-mail: commits-help@datasketches.apache.org