diff --git a/src/mhtree/InternalNode.java b/src/mhtree/InternalNode.java index e628e861e062586fb6fc697b0592aa05cd6decee..060a681f580aa0ff853d403f160ddb083e03bbfe 100644 --- a/src/mhtree/InternalNode.java +++ b/src/mhtree/InternalNode.java @@ -22,7 +22,7 @@ public class InternalNode extends Node implements Serializable { children = new HashSet<>(); } - public void addChildren(Set<Node> children) { + public void addChildren(List<Node> children) { this.children.addAll(children); } @@ -48,10 +48,6 @@ public class InternalNode extends Node implements Serializable { .collect(Collectors.toSet()); } - public boolean contains(LocalAbstractObject object) { - return children.stream().anyMatch(child -> child.contains(object)); - } - public int getHeight() { return children.stream() .mapToInt(Node::getHeight) @@ -59,12 +55,12 @@ public class InternalNode extends Node implements Serializable { .getMax() + 1; } - public Set<Node> getNodesOnLevel(int level) { - if (getLevel() == level) return Collections.singleton(this); + public List<Node> getNodesOnLevel(int level) { + if (getLevel() == level) return Collections.singletonList(this); return children.stream() .map(child -> child.getNodesOnLevel(level)) .flatMap(Collection::stream) - .collect(Collectors.toSet()); + .collect(Collectors.toList()); } } diff --git a/src/mhtree/LeafNode.java b/src/mhtree/LeafNode.java index 07a610aed3db750ef2841c824ae14a005c64b727..238222be3c93adb08556700536dc0bfc81cc64a3 100644 --- a/src/mhtree/LeafNode.java +++ b/src/mhtree/LeafNode.java @@ -9,6 +9,7 @@ import messif.objects.util.AbstractObjectIterator; import java.io.Serializable; import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Set; public class LeafNode extends Node implements Serializable { @@ -41,19 +42,11 @@ public class LeafNode extends Node implements Serializable { return objects; } - public boolean contains(LocalAbstractObject object) { - for (AbstractObjectIterator<LocalAbstractObject> it = bucket.getAllObjects(); it.hasNext(); ) - if (object == it.next()) - return true; - - return false; - } - public int getHeight() { return 0; } - public Set<Node> getNodesOnLevel(int level) { - return Collections.singleton(this); + public List<Node> getNodesOnLevel(int level) { + return Collections.singletonList(this); } } diff --git a/src/mhtree/Node.java b/src/mhtree/Node.java index a8065c35971d74af980a50d3b31f75f9dd5c55c3..95904be2d8f12e75c196386dad42dfed2f1f56c8 100644 --- a/src/mhtree/Node.java +++ b/src/mhtree/Node.java @@ -18,9 +18,8 @@ public abstract class Node implements Serializable { * Serialization ID */ private static final long serialVersionUID = 420L; - private final ObjectToNodeDistance objectToNodeDistance; - protected final InsertType insertType; + private final ObjectToNodeDistance objectToNodeDistance; protected HullOptimizedRepresentationV3 hull; protected Node parent; @@ -31,7 +30,7 @@ public abstract class Node implements Serializable { this.objectToNodeDistance = objectToNodeDistance; } - public static InternalNode createParent(Set<Node> nodes, PrecomputedDistances distances, InsertType insertType, ObjectToNodeDistance objectToNodeDistance) { + public static InternalNode createParent(List<Node> nodes, PrecomputedDistances distances, InsertType insertType, ObjectToNodeDistance objectToNodeDistance) { List<LocalAbstractObject> objects = nodes.stream() .map(Node::getObjects) .flatMap(Collection::stream) @@ -41,14 +40,11 @@ public abstract class Node implements Serializable { } public double getDistance(LocalAbstractObject object) { - switch (objectToNodeDistance) { - case FURTHEST_HULL_OBJECT: - return getFurthestDistance(object); - case AVERAGE_DISTANCE: - return getAverageDistance(object); - default: - return getNearestDistance(object); - } + return objectToNodeDistance.getDistance(object, this); + } + + public double getNearestDistance(LocalAbstractObject object) { + return ObjectToNodeDistance.NEAREST_HULL_OBJECT.getDistance(object, this); } public boolean isCovered(LocalAbstractObject object) { @@ -80,11 +76,9 @@ public abstract class Node implements Serializable { public abstract Set<LocalAbstractObject> getObjects(); - public abstract boolean contains(LocalAbstractObject object); - public abstract int getHeight(); - public abstract Set<Node> getNodesOnLevel(int level); + public abstract List<Node> getNodesOnLevel(int level); protected void rebuildHull(LocalAbstractObject object) { List<LocalAbstractObject> objects = new ArrayList<>(getObjects()); @@ -104,24 +98,4 @@ public abstract class Node implements Serializable { rebuildHull(object); } - - public double getNearestDistance(LocalAbstractObject object) { - return hull.getHull().stream() - .mapToDouble(object::getDistance) - .min() - .orElse(Double.MAX_VALUE); - } - - private double getFurthestDistance(LocalAbstractObject object) { - return hull.getHull().stream() - .mapToDouble(object::getDistance) - .max() - .orElse(Double.MIN_VALUE); - } - - private double getAverageDistance(LocalAbstractObject object) { - return hull.getHull().stream() - .mapToDouble(object::getDistance) - .sum() / hull.getHull().size(); - } }