/** * Counts number of full levels in the sketch below tgtLvl. Useful for computing the level * offset in a compact sketch. * @param tgtLvl Target level in the sketch * @return Number of full levels in the sketch below tgtLvl */ private int countValidLevelsBelow(final int tgtLvl) { int count = 0; long bitPattern = ds_.getBitPattern(); for (int i = 0; (i < tgtLvl) && (bitPattern > 0); ++i, bitPattern >>>= 1) { if ((bitPattern & 1L) > 0L) { ++count; } } return count; // shorter implementation, testing suggests a tiny bit slower //final long mask = (1 << tgtLvl) - 1; //return Long.bitCount(ds_.getBitPattern() & mask); } }
public DoublesSketchIterator iterator() { return new DoublesSketchIterator(this, getBitPattern()); }
final long n = sketch.getN(); final int bbCount = sketch.getBaseBufferCount(); final long bitPattern = sketch.getBitPattern(); final double[] combBuf = sketch.getCombinedBuffer();
final String bbCntStr = String.format("%,d", sk.getBaseBufferCount()); final String combBufCapStr = String.format("%,d", sk.getCombinedBufferItemCapacity()); final long bitPattern = sk.getBitPattern(); final int neededLevels = Util.computeNumLevelsNeeded(k, n); final int totalLevels = Util.computeTotalLevels(bitPattern);
/** * Constructs the Auxiliary structure from the DoublesSketch * @param qs a DoublesSketch */ DoublesAuxiliary(final DoublesSketch qs ) { final int k = qs.getK(); final long n = qs.getN(); final long bitPattern = qs.getBitPattern(); final int numSamples = qs.getRetainedItems(); final DoublesSketchAccessor sketchAccessor = DoublesSketchAccessor.wrap(qs); final double[] itemsArr = new double[numSamples]; final long[] cumWtsArr = new long[numSamples + 1]; // the extra slot is very important // Populate from DoublesSketch: // copy over the "levels" and then the base buffer, all with appropriate weights populateFromDoublesSketch(k, n, bitPattern, sketchAccessor, itemsArr, cumWtsArr); // Sort the first "numSamples" slots of the two arrays in tandem, // taking advantage of the already sorted blocks of length k blockyTandemMergeSort(itemsArr, cumWtsArr, numSamples, k); final long total = QuantilesHelper.convertToPrecedingCummulative(cumWtsArr); assert total == n; auxN_ = n; auxSamplesArr_ = itemsArr; auxCumWtsArr_ = cumWtsArr; }
/** * Counts number of full levels in the sketch below tgtLvl. Useful for computing the level * offset in a compact sketch. * @param tgtLvl Target level in the sketch * @return Number of full levels in the sketch below tgtLvl */ private int countValidLevelsBelow(final int tgtLvl) { int count = 0; long bitPattern = ds_.getBitPattern(); for (int i = 0; (i < tgtLvl) && (bitPattern > 0); ++i, bitPattern >>>= 1) { if ((bitPattern & 1L) > 0L) { ++count; } } return count; // shorter implementation, testing suggests a tiny bit slower //final long mask = (1 << tgtLvl) - 1; //return Long.bitCount(ds_.getBitPattern() & mask); } }
assertEquals(sketch1.getK(), sketch2.getK()); assertEquals(sketch1.getN(), sketch2.getN()); assertEquals(sketch1.getBitPattern(), sketch2.getBitPattern()); assertEquals(sketch1.getMinValue(), sketch2.getMinValue()); assertEquals(sketch1.getMaxValue(), sketch2.getMaxValue()); long bitPattern = sketch1.getBitPattern(); for (int lvl = 0; bitPattern != 0; ++lvl, bitPattern >>>= 1) { if ((bitPattern & 1) > 0) {
long bitPattern = getBitPattern(); for (int lvl = 0; bitPattern != 0L; lvl++, bitPattern >>>= 1) { weight *= 2;
private static boolean sameStructurePredicate(final DoublesSketch mq1, final DoublesSketch mq2) { final boolean b1 = ( (mq1.getK() == mq2.getK()) && (mq1.getN() == mq2.getN()) && (mq1.getCombinedBufferItemCapacity() >= Util.computeCombinedBufferItemCapacity(mq1.getK(), mq1.getN())) && (mq2.getCombinedBufferItemCapacity() >= Util.computeCombinedBufferItemCapacity(mq2.getK(), mq2.getN())) && (mq1.getBaseBufferCount() == mq2.getBaseBufferCount()) && (mq1.getBitPattern() == mq2.getBitPattern()) ); final boolean b2; if (mq1.isEmpty()) { b2 = (Double.isNaN(mq1.getMinValue())) && (Double.isNaN(mq2.getMinValue()) && Double.isNaN(mq1.getMaxValue())) && (Double.isNaN(mq2.getMaxValue())); } else { b2 = (mq1.getMinValue() == mq2.getMinValue()) && (mq1.getMaxValue() == mq2.getMaxValue()); } return b1 && b2; }
long srcBitPattern = src.getBitPattern(); assert srcBitPattern == (srcN / (2L * srcK));
long myBitPattern = sketch.getBitPattern(); final int k = sketch.getK(); assert myBitPattern == sketch.getN() / (2L * k); // internal consistency check
} else { assert lvl >= 0; if (((ds_.getBitPattern() & (1L << lvl)) > 0) || forceSize_) { numItems_ = ds_.getK(); } else {
long srcBitPattern = src.getBitPattern(); long newTgtBitPattern = tgt.getBitPattern(); for (int srcLvl = 0; srcBitPattern != 0L; srcLvl++, srcBitPattern >>>= 1) {
qsCopy.putMaxValue(sketch.getMaxValue()); qsCopy.putBaseBufferCount(sketch.getBaseBufferCount()); qsCopy.putBitPattern(sketch.getBitPattern()); 0, 0, sketchAccessor.numItems()); long bitPattern = sketch.getBitPattern(); for (int lvl = 0; bitPattern != 0L; ++lvl, bitPattern >>>= 1) { if ((bitPattern & 1L) > 0L) {
public DoublesSketchIterator iterator() { return new DoublesSketchIterator(this, getBitPattern()); }
final int totalLevels = Util.computeTotalLevels(sketch.getBitPattern()); for (int lvl = 0; lvl < totalLevels; ++lvl) { dsa.setLevel(lvl);
final long n = sketch.getN(); final int bbCount = sketch.getBaseBufferCount(); final long bitPattern = sketch.getBitPattern(); final double[] combBuf = sketch.getCombinedBuffer();
/** * Constructs the Auxiliary structure from the DoublesSketch * @param qs a DoublesSketch */ DoublesAuxiliary(final DoublesSketch qs ) { final int k = qs.getK(); final long n = qs.getN(); final long bitPattern = qs.getBitPattern(); final int numSamples = qs.getRetainedItems(); final DoublesSketchAccessor sketchAccessor = DoublesSketchAccessor.wrap(qs); final double[] itemsArr = new double[numSamples]; final long[] cumWtsArr = new long[numSamples + 1]; // the extra slot is very important // Populate from DoublesSketch: // copy over the "levels" and then the base buffer, all with appropriate weights populateFromDoublesSketch(k, n, bitPattern, sketchAccessor, itemsArr, cumWtsArr); // Sort the first "numSamples" slots of the two arrays in tandem, // taking advantage of the already sorted blocks of length k blockyTandemMergeSort(itemsArr, cumWtsArr, numSamples, k); final long total = QuantilesHelper.convertToPrecedingCummulative(cumWtsArr); assert total == n; auxN_ = n; auxSamplesArr_ = itemsArr; auxCumWtsArr_ = cumWtsArr; }
long bitPattern = getBitPattern(); for (int lvl = 0; bitPattern != 0L; lvl++, bitPattern >>>= 1) { weight *= 2;
} else { assert lvl >= 0; if (((ds_.getBitPattern() & (1L << lvl)) > 0) || forceSize_) { numItems_ = ds_.getK(); } else {