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:39 UTC
(datasketches-java) 07/14: changes from 496
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 8523eb079b9e2957d9dbddbb22cb03fafdd7cc8d
Author: Lee Rhodes <le...@gmail.com>
AuthorDate: Fri Mar 29 12:22:43 2024 -0700
changes from 496
---
.../kll/KllDirectCompactItemsSketch.java | 2 +-
.../datasketches/kll/KllDirectDoublesSketch.java | 16 ++++---
.../datasketches/kll/KllDirectFloatsSketch.java | 4 +-
.../apache/datasketches/kll/KllDoublesHelper.java | 12 ++---
.../apache/datasketches/kll/KllDoublesSketch.java | 36 +++++++++------
.../apache/datasketches/kll/KllFloatsHelper.java | 2 +-
.../datasketches/kll/KllHeapDoublesSketch.java | 10 +++--
.../datasketches/kll/KllHeapFloatsSketch.java | 2 +-
.../datasketches/kll/KllHeapItemsSketch.java | 4 +-
.../org/apache/datasketches/kll/KllHelper.java | 1 +
.../apache/datasketches/kll/KllItemsHelper.java | 2 +-
.../org/apache/datasketches/kll/KllSketch.java | 2 +-
.../kll/KllDirectDoublesSketchTest.java | 12 ++---
.../kll/KllDirectFloatsSketchTest.java | 2 +-
.../datasketches/kll/KllDoublesSketchTest.java | 52 +++++++++++++++++++++-
.../datasketches/kll/KllItemsSketchTest.java | 20 ++++-----
16 files changed, 120 insertions(+), 59 deletions(-)
diff --git a/src/main/java/org/apache/datasketches/kll/KllDirectCompactItemsSketch.java b/src/main/java/org/apache/datasketches/kll/KllDirectCompactItemsSketch.java
index bf4c49fa..d5a364da 100644
--- a/src/main/java/org/apache/datasketches/kll/KllDirectCompactItemsSketch.java
+++ b/src/main/java/org/apache/datasketches/kll/KllDirectCompactItemsSketch.java
@@ -235,7 +235,7 @@ final class KllDirectCompactItemsSketch<T> extends KllItemsSketch<T> {
}
@Override
- void incN() {
+ void incN(final int increment) {
throw new SketchesArgumentException(UNSUPPORTED_MSG);
}
diff --git a/src/main/java/org/apache/datasketches/kll/KllDirectDoublesSketch.java b/src/main/java/org/apache/datasketches/kll/KllDirectDoublesSketch.java
index 21128ef0..4f951c51 100644
--- a/src/main/java/org/apache/datasketches/kll/KllDirectDoublesSketch.java
+++ b/src/main/java/org/apache/datasketches/kll/KllDirectDoublesSketch.java
@@ -284,9 +284,9 @@ class KllDirectDoublesSketch extends KllDoublesSketch {
}
@Override
- void incN() {
+ void incN(final int increment) {
if (readOnly) { throw new SketchesArgumentException(TGT_IS_READ_ONLY_MSG); }
- setMemoryN(wmem, getMemoryN(wmem) + 1);
+ setMemoryN(wmem, getMemoryN(wmem) + increment);
}
@Override
@@ -316,6 +316,13 @@ class KllDirectDoublesSketch extends KllDoublesSketch {
wmem.putDouble(offset, item);
}
+ @Override
+ void setDoubleItemsArrayAt(final int index, final double[] items, final int srcOffset, final int length) {
+ if (readOnly) { throw new SketchesArgumentException(TGT_IS_READ_ONLY_MSG); }
+ final int offset = DATA_START_ADR + getLevelsArrSizeBytes(sketchStructure) + (index + 2) * ITEM_BYTES;
+ wmem.putDoubleArray(offset, items, srcOffset, length);
+ }
+
@Override
void setLevelZeroSorted(final boolean sorted) {
if (readOnly) { throw new SketchesArgumentException(TGT_IS_READ_ONLY_MSG); }
@@ -369,9 +376,4 @@ class KllDirectDoublesSketch extends KllDoublesSketch {
}
}
- @Override //VECTOR UPDATE NOT SUPPORTED
- void addN(final int numItems) {
- throw new UnsupportedOperationException(UNSUPPORTED_MSG);
- }
-
}
diff --git a/src/main/java/org/apache/datasketches/kll/KllDirectFloatsSketch.java b/src/main/java/org/apache/datasketches/kll/KllDirectFloatsSketch.java
index 9f611e9b..c9be0687 100644
--- a/src/main/java/org/apache/datasketches/kll/KllDirectFloatsSketch.java
+++ b/src/main/java/org/apache/datasketches/kll/KllDirectFloatsSketch.java
@@ -284,9 +284,9 @@ class KllDirectFloatsSketch extends KllFloatsSketch {
}
@Override
- void incN() {
+ void incN(final int increment) {
if (readOnly) { throw new SketchesArgumentException(TGT_IS_READ_ONLY_MSG); }
- setMemoryN(wmem, getMemoryN(wmem) + 1);
+ setMemoryN(wmem, getMemoryN(wmem) + increment);
}
@Override
diff --git a/src/main/java/org/apache/datasketches/kll/KllDoublesHelper.java b/src/main/java/org/apache/datasketches/kll/KllDoublesHelper.java
index dd6fc87f..07a5b137 100644
--- a/src/main/java/org/apache/datasketches/kll/KllDoublesHelper.java
+++ b/src/main/java/org/apache/datasketches/kll/KllDoublesHelper.java
@@ -323,7 +323,7 @@ final class KllDoublesHelper {
freeSpace = dblSk.levelsArr[0];
assert (freeSpace > 0);
}
- dblSk.incN();
+ dblSk.incN(1);
dblSk.setLevelZeroSorted(false);
final int nextPos = freeSpace - 1;
dblSk.setLevelsArrayAt(0, nextPos);
@@ -343,8 +343,8 @@ 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) {
+ 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) {
@@ -356,11 +356,11 @@ final class KllDoublesHelper {
assert (freeSpace > 0);
final int numItemsToCopy = Math.min(spaceNeeded, freeSpace);
final int dstOffset = freeSpace - numItemsToCopy;
- System.arraycopy(items, offset + count, dblSk.getDoubleItemsArray(), dstOffset, numItemsToCopy);
- count += numItemsToCopy;
- dblSk.addN(numItemsToCopy);
+ dblSk.incN(numItemsToCopy);
dblSk.setLevelZeroSorted(false);
dblSk.setLevelsArrayAt(0, dstOffset);
+ dblSk.setDoubleItemsArrayAt(dstOffset, items, offset + count, numItemsToCopy);
+ count += numItemsToCopy;
//System.out.println(dblSk.toString(true, true));
}
}
diff --git a/src/main/java/org/apache/datasketches/kll/KllDoublesSketch.java b/src/main/java/org/apache/datasketches/kll/KllDoublesSketch.java
index c48682f0..5828cf72 100644
--- a/src/main/java/org/apache/datasketches/kll/KllDoublesSketch.java
+++ b/src/main/java/org/apache/datasketches/kll/KllDoublesSketch.java
@@ -351,10 +351,9 @@ public abstract class KllDoublesSketch extends KllSketch implements QuantilesDou
* @param length the number of items
*/
public void update(final double[] items, final int offset, final int length) {
- if (this instanceof KllDirectDoublesSketch) {
- throw new UnsupportedOperationException(UNSUPPORTED_MSG);
- }
+ //TODO will this work for direct?
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++) {
@@ -365,8 +364,7 @@ public abstract class KllDoublesSketch extends KllSketch implements QuantilesDou
if (allNaNs) { return; }
else if (!hasNaN) { // fast path
KllDoublesHelper.updateDouble(this, items, offset, length);
- }
- else {
+ } else {
for (int i = 0; i < length; i++) {
final double v = items[offset + i];
if (!Double.isNaN(v)) {
@@ -379,15 +377,6 @@ public abstract class KllDoublesSketch extends KllSketch implements QuantilesDou
//restricted
- abstract void addN(int numItems);
-
- void updateMinMax(final double[] items, final int offset, final int length) {
- final int end = offset + length;
- for (int i = offset; i < end; i++) {
- updateMinMax(items[i]);
- }
- }
-
// END VECTOR UPDATE
/**
@@ -445,6 +434,8 @@ public abstract class KllDoublesSketch extends KllSketch implements QuantilesDou
abstract void setDoubleItemsArrayAt(int index, double item);
+ abstract void setDoubleItemsArrayAt(int index, double[] items, int offset, int length);
+
abstract void setMaxItem(double item);
abstract void setMinItem(double item);
@@ -459,6 +450,23 @@ public abstract class KllDoublesSketch extends KllSketch implements QuantilesDou
}
}
+ void updateMinMax(final double[] items, final int offset, final int length) {
+ double min = items[offset];
+ double max = min;
+ for (int i = 1; i < length; i++) {
+ final double v = items[offset + i];
+ min = Math.min(min, v);
+ max = Math.max(max, v);
+ }
+ if (isEmpty()) {
+ setMinItem(min);
+ setMaxItem(max);
+ } else {
+ setMinItem(Math.min(getMinItem(), min));
+ setMaxItem(Math.max(getMaxItem(), max));
+ }
+ }
+
private final DoublesSketchSortedView refreshSortedView() {
if (doublesSV == null) {
final CreateSortedView csv = new CreateSortedView();
diff --git a/src/main/java/org/apache/datasketches/kll/KllFloatsHelper.java b/src/main/java/org/apache/datasketches/kll/KllFloatsHelper.java
index 53f1e35f..1a71c344 100644
--- a/src/main/java/org/apache/datasketches/kll/KllFloatsHelper.java
+++ b/src/main/java/org/apache/datasketches/kll/KllFloatsHelper.java
@@ -323,7 +323,7 @@ final class KllFloatsHelper {
freeSpace = fltSk.levelsArr[0];
assert (freeSpace > 0);
}
- fltSk.incN();
+ fltSk.incN(1);
fltSk.setLevelZeroSorted(false);
final int nextPos = freeSpace - 1;
fltSk.setLevelsArrayAt(0, nextPos);
diff --git a/src/main/java/org/apache/datasketches/kll/KllHeapDoublesSketch.java b/src/main/java/org/apache/datasketches/kll/KllHeapDoublesSketch.java
index 7ded5c79..b23b5763 100644
--- a/src/main/java/org/apache/datasketches/kll/KllHeapDoublesSketch.java
+++ b/src/main/java/org/apache/datasketches/kll/KllHeapDoublesSketch.java
@@ -198,9 +198,6 @@ final class KllHeapDoublesSketch extends KllDoublesSketch {
//restricted
- @Override //VECTOR UPDATE
- void addN(final int numItems) { n += numItems; }
-
@Override
double[] getDoubleItemsArray() { return doubleItems; }
@@ -258,7 +255,7 @@ final class KllHeapDoublesSketch extends KllDoublesSketch {
}
@Override
- void incN() { n++; }
+ void incN(final int increment) { n += increment; }
@Override
void incNumLevels() {
@@ -274,6 +271,11 @@ final class KllHeapDoublesSketch extends KllDoublesSketch {
@Override
void setDoubleItemsArrayAt(final int index, final double item) { this.doubleItems[index] = item; }
+ @Override
+ void setDoubleItemsArrayAt(final int index, final double[] items, final int offset, final int length) {
+ System.arraycopy(items, offset, doubleItems, index, length);
+ }
+
@Override
void setLevelZeroSorted(final boolean sorted) { this.isLevelZeroSorted = sorted; }
diff --git a/src/main/java/org/apache/datasketches/kll/KllHeapFloatsSketch.java b/src/main/java/org/apache/datasketches/kll/KllHeapFloatsSketch.java
index cc39cce7..cafefde7 100644
--- a/src/main/java/org/apache/datasketches/kll/KllHeapFloatsSketch.java
+++ b/src/main/java/org/apache/datasketches/kll/KllHeapFloatsSketch.java
@@ -255,7 +255,7 @@ final class KllHeapFloatsSketch extends KllFloatsSketch {
}
@Override
- void incN() { n++; }
+ void incN(final int increment) { n += increment; }
@Override
void incNumLevels() {
diff --git a/src/main/java/org/apache/datasketches/kll/KllHeapItemsSketch.java b/src/main/java/org/apache/datasketches/kll/KllHeapItemsSketch.java
index 83ba7790..e58516fd 100644
--- a/src/main/java/org/apache/datasketches/kll/KllHeapItemsSketch.java
+++ b/src/main/java/org/apache/datasketches/kll/KllHeapItemsSketch.java
@@ -266,9 +266,7 @@ final class KllHeapItemsSketch<T> extends KllItemsSketch<T> {
}
@Override
- void incN() {
- n++;
- }
+ void incN(final int increment) { n += increment; }
@Override
boolean isLevelZeroSorted() {
diff --git a/src/main/java/org/apache/datasketches/kll/KllHelper.java b/src/main/java/org/apache/datasketches/kll/KllHelper.java
index 6b7d1138..9161f28e 100644
--- a/src/main/java/org/apache/datasketches/kll/KllHelper.java
+++ b/src/main/java/org/apache/datasketches/kll/KllHelper.java
@@ -688,6 +688,7 @@ final class KllHelper {
itmSk.setMaxItem(maxItem);
itmSk.setItemsArray(myNewItemsArr);
}
+
}
/**
diff --git a/src/main/java/org/apache/datasketches/kll/KllItemsHelper.java b/src/main/java/org/apache/datasketches/kll/KllItemsHelper.java
index b79f30a0..00b8c7d3 100644
--- a/src/main/java/org/apache/datasketches/kll/KllItemsHelper.java
+++ b/src/main/java/org/apache/datasketches/kll/KllItemsHelper.java
@@ -325,7 +325,7 @@ final class KllItemsHelper {
freeSpace = itmSk.levelsArr[0];
assert (freeSpace > 0);
}
- itmSk.incN();
+ itmSk.incN(1);
itmSk.setLevelZeroSorted(false);
final int nextPos = freeSpace - 1;
itmSk.setLevelsArrayAt(0, nextPos);
diff --git a/src/main/java/org/apache/datasketches/kll/KllSketch.java b/src/main/java/org/apache/datasketches/kll/KllSketch.java
index 2d7385f6..4ce15aba 100644
--- a/src/main/java/org/apache/datasketches/kll/KllSketch.java
+++ b/src/main/java/org/apache/datasketches/kll/KllSketch.java
@@ -434,7 +434,7 @@ public abstract class KllSketch implements QuantilesAPI {
*/
abstract WritableMemory getWritableMemory();
- abstract void incN();
+ abstract void incN(int increment);
abstract void incNumLevels();
diff --git a/src/test/java/org/apache/datasketches/kll/KllDirectDoublesSketchTest.java b/src/test/java/org/apache/datasketches/kll/KllDirectDoublesSketchTest.java
index b5ec618b..996b57ce 100644
--- a/src/test/java/org/apache/datasketches/kll/KllDirectDoublesSketchTest.java
+++ b/src/test/java/org/apache/datasketches/kll/KllDirectDoublesSketchTest.java
@@ -616,13 +616,13 @@ public class KllDirectDoublesSketchTest {
boolean bool = true;
KllDoublesSketch sk = KllDoublesSketch.newHeapInstance(k);
KllDoublesSketch sk2 = KllDoublesSketch.wrap(Memory.wrap(sk.toByteArray()));
- try { sk2.incN(); fail(); } catch (SketchesArgumentException e) { }
+ try { sk2.incN(1); fail(); } catch (SketchesArgumentException e) { }
try { sk2.incNumLevels(); fail(); } catch (SketchesArgumentException e) { }
- try { sk2.setDoubleItemsArray(dblArr); fail(); } catch (SketchesArgumentException e) { }
- try { sk2.setDoubleItemsArrayAt(idx, dblV); fail(); } catch (SketchesArgumentException e) { }
+ try { sk2.setDoubleItemsArray(dblArr); fail(); } catch (SketchesArgumentException e) { }
+ try { sk2.setDoubleItemsArrayAt(idx, dblV); fail(); } catch (SketchesArgumentException e) { }
try { sk2.setLevelZeroSorted(bool); fail(); } catch (SketchesArgumentException e) { }
- try { sk2.setMaxItem(dblV); fail(); } catch (SketchesArgumentException e) { }
- try { sk2.setMinItem(dblV); fail(); } catch (SketchesArgumentException e) { }
+ try { sk2.setMaxItem(dblV); fail(); } catch (SketchesArgumentException e) { }
+ try { sk2.setMinItem(dblV); fail(); } catch (SketchesArgumentException e) { }
try { sk2.setMinK(idx); fail(); } catch (SketchesArgumentException e) { }
try { sk2.setN(idx); fail(); } catch (SketchesArgumentException e) { }
try { sk2.setNumLevels(idx); fail(); } catch (SketchesArgumentException e) { }
@@ -672,7 +672,7 @@ public class KllDirectDoublesSketchTest {
return ddsk;
}
- private final static boolean enablePrinting = true;
+ private final static boolean enablePrinting = false;
/**
* @param o the Object to println
diff --git a/src/test/java/org/apache/datasketches/kll/KllDirectFloatsSketchTest.java b/src/test/java/org/apache/datasketches/kll/KllDirectFloatsSketchTest.java
index 3013e629..8ab61edd 100644
--- a/src/test/java/org/apache/datasketches/kll/KllDirectFloatsSketchTest.java
+++ b/src/test/java/org/apache/datasketches/kll/KllDirectFloatsSketchTest.java
@@ -616,7 +616,7 @@ public class KllDirectFloatsSketchTest {
boolean bool = true;
KllFloatsSketch sk = KllFloatsSketch.newHeapInstance(k);
KllFloatsSketch sk2 = KllFloatsSketch.wrap(Memory.wrap(sk.toByteArray()));
- try { sk2.incN(); fail(); } catch (SketchesArgumentException e) { }
+ try { sk2.incN(1); fail(); } catch (SketchesArgumentException e) { }
try { sk2.incNumLevels(); fail(); } catch (SketchesArgumentException e) { }
try { sk2.setFloatItemsArray(fltArr); fail(); } catch (SketchesArgumentException e) { }
try { sk2.setFloatItemsArrayAt(idx, fltV); fail(); } catch (SketchesArgumentException e) { }
diff --git a/src/test/java/org/apache/datasketches/kll/KllDoublesSketchTest.java b/src/test/java/org/apache/datasketches/kll/KllDoublesSketchTest.java
index 2539101c..5620006b 100644
--- a/src/test/java/org/apache/datasketches/kll/KllDoublesSketchTest.java
+++ b/src/test/java/org/apache/datasketches/kll/KllDoublesSketchTest.java
@@ -187,6 +187,56 @@ public class KllDoublesSketchTest {
}
}
+ @Test
+ public void vectorizedUpdates() {
+ final int trials = 1000;
+ final int M = 1000;
+ final int N = 1000;
+ final long startTime = System.currentTimeMillis();
+ 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;
+ }
+ sketch.update(values, 0, N);
+ }
+ assertEquals(sketch.getN(), M * N);
+ 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);
+ }
+ final long endTime = System.currentTimeMillis();
+ 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();
+ 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;
+ }
+ for (int i = 0; i < N; i++) {
+ sketch.update(values[i]);
+ }
+ }
+ assertEquals(sketch.getN(), M * N);
+ 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);
+ }
+ final long endTime = System.currentTimeMillis();
+ System.out.println("nonVectorizedUpdates: " + (endTime - startTime) + " ms");
+ }
+
@Test
public void getRankGetCdfGetPmfConsistency() {
final KllDoublesSketch sketch = KllDoublesSketch.newHeapInstance();
@@ -631,7 +681,7 @@ public class KllDoublesSketchTest {
println("");
}
- private final static boolean enablePrinting = true;
+ private final static boolean enablePrinting = false;
/**
* @param format the format
diff --git a/src/test/java/org/apache/datasketches/kll/KllItemsSketchTest.java b/src/test/java/org/apache/datasketches/kll/KllItemsSketchTest.java
index 74f69f54..00028e34 100644
--- a/src/test/java/org/apache/datasketches/kll/KllItemsSketchTest.java
+++ b/src/test/java/org/apache/datasketches/kll/KllItemsSketchTest.java
@@ -715,19 +715,19 @@ public class KllItemsSketchTest {
@Test
public void checkExceptions() {
final KllItemsSketch<String> sk = KllItemsSketch.newHeapInstance(20, Comparator.naturalOrder(), serDe);
- try { sk.getTotalItemsByteArr(); fail(); } catch (SketchesArgumentException e) { }
- try { sk.getTotalItemsNumBytes(); fail(); } catch (SketchesArgumentException e) { }
- try { sk.setWritableMemory(null); fail(); } catch (SketchesArgumentException e) { }
+ try { sk.getTotalItemsByteArr(); fail(); } catch (SketchesArgumentException e) { }
+ try { sk.getTotalItemsNumBytes(); fail(); } catch (SketchesArgumentException e) { }
+ try { sk.setWritableMemory(null); fail(); } catch (SketchesArgumentException e) { }
byte[] byteArr = sk.toByteArray();
final KllItemsSketch<String> sk2 = KllItemsSketch.wrap(Memory.wrap(byteArr), Comparator.naturalOrder(), serDe);
- try { sk2.incN(); fail(); } catch (SketchesArgumentException e) { }
- try { sk2.setItemsArray(null); fail(); } catch (SketchesArgumentException e) { }
- try { sk2.setItemsArrayAt(0, null); fail(); } catch (SketchesArgumentException e) { }
+ try { sk2.incN(1); fail(); } catch (SketchesArgumentException e) { }
+ try { sk2.setItemsArray(null); fail(); } catch (SketchesArgumentException e) { }
+ try { sk2.setItemsArrayAt(0, null); fail(); } catch (SketchesArgumentException e) { }
try { sk2.setLevelZeroSorted(false); fail(); } catch (SketchesArgumentException e) { }
- try { sk2.setMaxItem(null); fail(); } catch (SketchesArgumentException e) { }
- try { sk2.setMinItem(null); fail(); } catch (SketchesArgumentException e) { }
- try { sk2.setMinK(0); fail(); } catch (SketchesArgumentException e) { }
- try { sk2.setN(0); fail(); } catch (SketchesArgumentException e) { }
+ try { sk2.setMaxItem(null); fail(); } catch (SketchesArgumentException e) { }
+ try { sk2.setMinItem(null); fail(); } catch (SketchesArgumentException e) { }
+ try { sk2.setMinK(0); fail(); } catch (SketchesArgumentException e) { }
+ try { sk2.setN(0); fail(); } catch (SketchesArgumentException e) { }
}
@Test
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datasketches.apache.org
For additional commands, e-mail: commits-help@datasketches.apache.org