Skip to content
Snippets Groups Projects
ApproxState.java 2.26 KiB
Newer Older
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());
    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;
    }