package mhtree; import messif.operations.Approximate; public class ApproxState { protected int limit; protected int objectsChecked; protected int bucketsVisited; protected long computedDistances; protected ApproxState() { } protected ApproxState(int limit) { this.limit = limit; } public static ApproxState create(Approximate limits, MHTree mhTree) { switch (limits.getLocalSearchType()) { case PERCENTAGE: return new ApproxStateObjects(Math.round((float) mhTree.getObjectCount() * (float) limits.getLocalSearchParam() / 100f)); case ABS_OBJ_COUNT: return new ApproxStateObjects(limits.getLocalSearchParam()); case DATA_PARTITIONS: return new ApproxStateBuckets(limits.getLocalSearchParam()); case ABS_DC_COUNT: return new ApproxStateDistanceComputations(limits.getLocalSearchParam()); default: return new ApproxState(); } } public void update(LeafNode node, long distanceComputations) { objectsChecked += node.getObjectCount(); bucketsVisited++; computedDistances = distanceComputations; } public boolean stop() { return false; } private static class ApproxStateBuckets extends ApproxState { private ApproxStateBuckets(int limit) { super(limit); } @Override public boolean stop() { return bucketsVisited >= limit; } } private static class ApproxStateObjects extends ApproxState { private ApproxStateObjects(int limit) { super(limit); } @Override public boolean stop() { return objectsChecked >= limit; } } private static class ApproxStateDistanceComputations extends ApproxState { protected ApproxStateDistanceComputations(int limit) { super(limit); } @Override public boolean stop() { return computedDistances >= limit; } } public long getComputedDistances() { return computedDistances; } public void setComputedDistances(long computedDistances) { this.computedDistances = computedDistances; } }