blob: 0a96db768ee80a1909aadece2fa3371ef6f59eb5 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.datasketches.cpc;
import static java.lang.Math.pow;
import static java.lang.Math.round;
import static org.apache.datasketches.cpc.RuntimeAsserts.rtAssert;
import static org.apache.datasketches.cpc.RuntimeAsserts.rtAssertEquals;
/**
* @author Lee Rhodes
*/
public class TestUtil {
static final double pwrLaw10NextDouble(final int ppb, final double curPoint) {
final double cur = (curPoint < 1.0) ? 1.0 : curPoint;
double gi = round(Math.log10(cur) * ppb); //current generating index
double next;
do {
next = round(pow(10.0, ++gi / ppb));
} while (next <= curPoint);
return next;
}
static boolean specialEquals(final CpcSketch sk1, final CpcSketch sk2,
final boolean sk1wasMerged, final boolean sk2wasMerged) {
rtAssertEquals(sk1.seed, sk2.seed);
rtAssertEquals(sk1.lgK, sk2.lgK);
rtAssertEquals(sk1.numCoupons, sk2.numCoupons);
rtAssertEquals(sk1.windowOffset, sk2.windowOffset);
rtAssertEquals(sk1.slidingWindow, sk2.slidingWindow);
PairTable.equals(sk1.pairTable, sk2.pairTable);
// fiCol is only updated occasionally while stream processing,
// therefore, the stream sketch could be behind the merged sketch.
// So we have to recalculate the FiCol on the stream sketch.
final int ficolA = sk1.fiCol;
final int ficolB = sk2.fiCol;
if (!sk1wasMerged && sk2wasMerged) {
rtAssert(!sk1.mergeFlag && sk2.mergeFlag);
final int fiCol1 = calculateFirstInterestingColumn(sk1);
rtAssertEquals(fiCol1, sk2.fiCol);
} else if (sk1wasMerged && !sk2wasMerged) {
rtAssert(sk1.mergeFlag && !sk2.mergeFlag);
final int fiCol2 = calculateFirstInterestingColumn(sk2);
rtAssertEquals(fiCol2,sk1.fiCol);
} else {
rtAssertEquals(sk1.mergeFlag, sk2.mergeFlag);
rtAssertEquals(ficolA, ficolB);
rtAssertEquals(sk1.kxp, sk2.kxp, .01 * sk1.kxp); //1% tolerance
rtAssertEquals(sk1.hipEstAccum, sk2.hipEstAccum, 01 * sk1.hipEstAccum); //1% tolerance
}
return true;
}
static int calculateFirstInterestingColumn(final CpcSketch sketch) {
final int offset = sketch.windowOffset;
if (offset == 0) {
return 0;
}
final PairTable table = sketch.pairTable;
assert (table != null);
final int[] slots = table.getSlotsArr();
final int numSlots = 1 << table.getLgSizeInts();
int i;
int result = offset;
for (i = 0; i < numSlots; i++) {
final int rowCol = slots[i];
if (rowCol != -1) {
final int col = rowCol & 63;
if (col < result) { result = col; }
}
}
return result;
}
}