diff --git a/src/main/java/azgracompress/kdtree/KDNode.java b/src/main/java/azgracompress/kdtree/KDNode.java index 8d8081f2e4de31dab3f9f0042ac92eec25a3701b..026ca066e96cbc94001f6ebb87e20eeff562b7d2 100644 --- a/src/main/java/azgracompress/kdtree/KDNode.java +++ b/src/main/java/azgracompress/kdtree/KDNode.java @@ -42,63 +42,6 @@ public class KDNode { return false; } - public void findNearestNeighbor(final int[] queryRecord, final KDTree.SearchInfo searchInfo) { - - - - - if (searchInfo.stopSearching()) - return; - - if (isTerminal()) { - ((TerminalKDNode) this).findNearestNeighborInBucket(queryRecord, searchInfo); - - if (ballWithinBounds(queryRecord, searchInfo)) { - searchInfo.setContinueSearching(false); - } - return; - } - - assert (loSon != null && hiSon != null); - if (queryRecord[discriminator] <= partition) { - double tmp = searchInfo.getUpperBounds()[discriminator]; - searchInfo.getUpperBounds()[discriminator] = partition; - loSon.findNearestNeighbor(queryRecord, searchInfo); - searchInfo.getUpperBounds()[discriminator] = tmp; - - } else { - double tmp = searchInfo.getLowerBounds()[discriminator]; - searchInfo.getLowerBounds()[discriminator] = partition; - hiSon.findNearestNeighbor(queryRecord, searchInfo); - searchInfo.getLowerBounds()[discriminator] = tmp; - } - if (searchInfo.stopSearching()) - return; - - - if (queryRecord[discriminator] <= partition) { - double tmp = searchInfo.getLowerBounds()[discriminator]; - searchInfo.getLowerBounds()[discriminator] = partition; - if (boundsOverlapBall(queryRecord, searchInfo)) { - hiSon.findNearestNeighbor(queryRecord, searchInfo); - } - searchInfo.getLowerBounds()[discriminator] = tmp; - } else { - double tmp = searchInfo.getUpperBounds()[discriminator]; - searchInfo.getUpperBounds()[discriminator] = partition; - if (boundsOverlapBall(queryRecord, searchInfo)) { - loSon.findNearestNeighbor(queryRecord, searchInfo); - } - searchInfo.getUpperBounds()[discriminator] = tmp; - } - if (searchInfo.stopSearching()) - return; - - if (ballWithinBounds(queryRecord, searchInfo)) { - searchInfo.setContinueSearching(false); - } - } - private static double coordinateDistance(final double x, final double y) { return Math.pow((x - y), 2); } @@ -107,33 +50,4 @@ public class KDNode { return Math.sqrt(value); } - private boolean ballWithinBounds(final int[] queryRecord, final KDTree.SearchInfo searchInfo) { - double lbDist, ubDist; - for (int d = 0; d < searchInfo.getDimension(); d++) { - lbDist = coordinateDistance(searchInfo.getLowerBounds()[d], queryRecord[d]); - ubDist = coordinateDistance(searchInfo.getUpperBounds()[d], queryRecord[d]); - if ((lbDist <= searchInfo.getNearestRecordDistance()) || (ubDist <= searchInfo.getNearestRecordDistance())) { - return false; - } - } - return true; - } - - private boolean boundsOverlapBall(final int[] queryRecord, final KDTree.SearchInfo searchInfo) { - double sum = 0.0; - for (int d = 0; d < searchInfo.getDimension(); d++) { - if (queryRecord[d] < searchInfo.getLowerBounds()[d]) { - sum += coordinateDistance(queryRecord[d], searchInfo.getLowerBounds()[d]); - if (dissimilarity(sum) > searchInfo.getNearestRecordDistance()) { - return true; - } - } else if (queryRecord[d] > searchInfo.getUpperBounds()[d]) { - sum += coordinateDistance(queryRecord[d], searchInfo.getUpperBounds()[d]); - if (dissimilarity(sum) > searchInfo.getNearestRecordDistance()) { - return true; - } - } - } - return false; - } } diff --git a/src/main/java/azgracompress/kdtree/KDTree.java b/src/main/java/azgracompress/kdtree/KDTree.java index 1bb50c158be44d259e4a7024d427e1dc5e34f791..d45b0b8152e713005ea854bd36d51f818aa13f45 100644 --- a/src/main/java/azgracompress/kdtree/KDTree.java +++ b/src/main/java/azgracompress/kdtree/KDTree.java @@ -2,7 +2,6 @@ package azgracompress.kdtree; import org.jetbrains.annotations.NotNull; -import java.util.Arrays; import java.util.PriorityQueue; // TODO(Moravec): One more time read the paper and check the implementation! @@ -43,41 +42,6 @@ public class KDTree { } } - public static class SearchInfo extends BBFSearchInfo { - private boolean continueSearching = true; - private final double[] coordinateUpperBound; - private final double[] coordinateLowerBound; - private final int dimension; - - public SearchInfo(final int dimension) { - this.dimension = dimension; - coordinateUpperBound = new double[dimension]; - coordinateLowerBound = new double[dimension]; - Arrays.fill(coordinateLowerBound, Double.NEGATIVE_INFINITY); - Arrays.fill(coordinateUpperBound, Double.POSITIVE_INFINITY); - } - - public int getDimension() { - return dimension; - } - - public double[] getUpperBounds() { - return coordinateUpperBound; - } - - public double[] getLowerBounds() { - return coordinateLowerBound; - } - - public boolean stopSearching() { - return !continueSearching; - } - - public void setContinueSearching(boolean continueSearching) { - this.continueSearching = continueSearching; - } - } - private static class NodeWithDistance implements Comparable<NodeWithDistance> { private final KDNode node; private final double distance; @@ -113,12 +77,6 @@ public class KDTree { this.terminalNodeCount = terminalNodeCount; } - public int[] findNearestNeighbor(final int[] queryRecord) { - SearchInfo searchInfo = new SearchInfo(dimension); - root.findNearestNeighbor(queryRecord, searchInfo); - return searchInfo.getNearestRecord(); - } - public int[] findNearestBBF(final int[] queryVector, final int maxE) { PriorityQueue<NodeWithDistance> priorityQueue = new PriorityQueue<>(); @@ -137,14 +95,14 @@ public class KDTree { partition = current.getNode().getPartition(); if (queryVector[discriminator] < partition) { priorityQueue.add(new NodeWithDistance(current.getNode().getLoSon(), - 0.0)); + 0.0)); priorityQueue.add(new NodeWithDistance(current.getNode().getHiSon(), - (double) partition - (double) queryVector[discriminator])); + (double) partition - (double) queryVector[discriminator])); } else { priorityQueue.add(new NodeWithDistance(current.getNode().getHiSon(), - 0.0)); + 0.0)); priorityQueue.add(new NodeWithDistance(current.getNode().getLoSon(), - (double) queryVector[discriminator] - (double) partition)); + (double) queryVector[discriminator] - (double) partition)); } } } diff --git a/src/main/java/azgracompress/kdtree/KDTreeBuilder.java b/src/main/java/azgracompress/kdtree/KDTreeBuilder.java index fd53e542f7614e1ad4bac87dd14764220ae1c350..0f36c859c82b933eb9d864f8ad608cc2dc010388 100644 --- a/src/main/java/azgracompress/kdtree/KDTreeBuilder.java +++ b/src/main/java/azgracompress/kdtree/KDTreeBuilder.java @@ -116,7 +116,6 @@ public class KDTreeBuilder { public KDNode makeTerminalNode(final int[][] featureVectors) { ++nodeCount; ++terminalNodeCount; - System.out.printf("Terminal node bucket size: %d\n", featureVectors.length); return new TerminalKDNode(featureVectors); }