protected Index computeNext() { if (page >= data.size()) { return end; } else { Page current = data.get(page); if (subPage >= current.active) { subPage = 0; page++; return computeNext(); } else { Index r = new Index(page, subPage); subPage++; return r; } } } };
while (true) { next = it.next(); final double nextIndex = total + (next.count() - 1.0) / 2; if (nextIndex >= index) { if (Double.isNaN(previousMean)) { return next.mean(); final double nextIndex2 = total + next.count() + (next2.count() - 1.0) / 2; previousMean = (nextIndex2 * next.mean() - nextIndex * next2.mean()) / (nextIndex2 - nextIndex); return quantile(previousIndex, index, nextIndex, previousMean, next.mean()); } else if (!it.hasNext()) { final double nextMean2 = (next.mean() * (nextIndex2 - previousIndex) - previousMean * (nextIndex2 - nextIndex)) / (nextIndex - previousIndex); return quantile(nextIndex, index, nextIndex2, next.mean(), nextMean2); total += next.count(); previousMean = next.mean(); previousIndex = nextIndex;
double left = (b.mean() - a.mean()) / 2; double right = left; if (x < a.mean() + right) { return (r + a.count() * AbstractTDigest.interpolate(x, a.mean() - left, a.mean() + right)) / totalWeight; r += a.count(); right = (b.mean() - a.mean()) / 2; if (x < a.mean() + right) { return (r + a.count() * AbstractTDigest.interpolate(x, a.mean() - left, a.mean() + right)) / totalWeight; } else { return 1;
protected Index computeNext() { if (page < 0) { return end; } else { if (subPage < 0) { page--; if (page >= 0) { subPage = data.get(page).active - 1; } return computeNext(); } else { Index r = new Index(page, subPage); subPage--; return r; } } } };
public Index increment(Index x, int delta) { int i = x.page; int j = x.subPage + delta; while (i < data.size() && j >= data.get(i).active) { j -= data.get(i).active; i++; } while (i > 0 && j < 0) { i--; j += data.get(i).active; } return new Index(i, j); }