@Override public void add(double x, int w) { add(x, w, (List<Double>) null); }
@Override void add(double x, int w, Centroid base) { if (x != base.mean() || w != base.count()) { throw new IllegalArgumentException(); } add(x, w, base.data()); }
@Override public void add(List<? extends TDigest> others) { for (TDigest other : others) { setMinMax(Math.min(min, other.getMin()), Math.max(max, other.getMax())); for (Centroid centroid : other.centroids()) { add(centroid.mean(), centroid.count(), recordAllData ? centroid.data() : null); } } }
@Override public void add(double x, int w) { m_delegate.add(x, w); }
@Override public void add(double x, int w) { add(x, w, (List<Double>) null); }
protected static AVLTreeDigest delegateMerge(double compression, List<AVLTreeDigest> subData) { int n = Math.max(1, subData.size() / 4); AVLTreeDigest r = new AVLTreeDigest(compression); if (subData.get(0).isRecording()) { r.recordAllData(); } for (int i = 0; i < subData.size(); i += n) { if (n > 1) { r.add(delegateMerge(compression, subData.subList(i, Math.min(i + n, subData.size())))); } else { r.add(subData.get(i)); } } return r; } }
@Override void add(double x, int w, Centroid base) { if (x != base.mean() || w != base.count()) { throw new IllegalArgumentException(); } add(x, w, base.data()); }
@Override public void compress() { if (summary.size() <= 1) { return; } AVLGroupTree centroids = summary; this.summary = new AVLGroupTree(recordAllData); final int[] nodes = new int[centroids.size()]; nodes[0] = centroids.first(); for (int i = 1; i < nodes.length; ++i) { nodes[i] = centroids.next(nodes[i-1]); assert nodes[i] != IntAVLTree.NIL; } assert centroids.next(nodes[nodes.length - 1]) == IntAVLTree.NIL; for (int i = centroids.size() - 1; i > 0; --i) { final int other = gen.nextInt(i + 1); final int tmp = nodes[other]; nodes[other] = nodes[i]; nodes[i] = tmp; } for (int node : nodes) { add(centroids.mean(node), centroids.count(node), centroids.data(node)); } }