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