Skip to content

Commit 8d9ef86

Browse files
Skip lower bound compute IFF one is descendant of the other (l.b is 0)
Co-authored-by: Veselin Nikolov <veselin.nikolov@neotechnology.com>
1 parent c48d5ea commit 8d9ef86

File tree

3 files changed

+31
-1
lines changed

3 files changed

+31
-1
lines changed

algo/src/main/java/org/neo4j/gds/hdbscan/DualTreeMSTAlgorithm.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ boolean score(KdNode kdNodeQ, KdNode kdNodeR) {
175175
if (singleQ == singleR) return false;
176176

177177
if (kdNodeBound.get(qId) == Double.MAX_VALUE) return true;
178-
178+
if ( kdTree.descentOfOther(kdNodeQ,kdNodeR)) return true;
179179
var lowerBoundQR = kdNodeQ.aabb().lowerBoundFor(kdNodeR.aabb());
180180
return lowerBoundQR < Math.sqrt(kdNodeBound.get(qId));
181181

algo/src/main/java/org/neo4j/gds/hdbscan/KdTree.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,15 @@ LongStream nodesContained(KdNode node) {
7070
return LongStream.range(start, end).map(ids::get);
7171
}
7272

73+
boolean descentOfOther(KdNode nodeA,KdNode nodeB){
74+
long startA = nodeA.start();
75+
long endA = nodeA.end();
76+
77+
long startB = nodeB.start();
78+
long endB = nodeB.end();
79+
80+
return startA <= startB && endB <= endA || startB <= startA && endA <= endB;
81+
}
7382

7483
long treeNodeCount(){
7584
return treeNodeCount;

algo/src/test/java/org/neo4j/gds/hdbscan/KdTreeTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,25 @@ void shouldNotFindItself() {
8989
);
9090
}
9191

92+
@Test
93+
void shouldCorrectlyFigureOutDescendants() {
94+
var root = KdNode.createLeaf(0, 10, 100, null);
95+
var l1 = KdNode.createLeaf(1, 10, 50, null);
96+
var l2 = KdNode.createLeaf(1, 20, 50, null);
97+
var l3 = KdNode.createLeaf(1, 100, 150, null);
98+
99+
var kdtree = new KdTree(null, null, root, 3);
100+
101+
assertThat(kdtree.descentOfOther(root, l1)).isTrue();
102+
assertThat(kdtree.descentOfOther(l1, root)).isTrue();
103+
104+
assertThat(kdtree.descentOfOther(root, l2)).isTrue();
105+
assertThat(kdtree.descentOfOther(l2, root)).isTrue();
106+
107+
assertThat(kdtree.descentOfOther(root, l3)).isFalse();
108+
assertThat(kdtree.descentOfOther(l3, root)).isFalse();
109+
110+
111+
}
112+
92113
}

0 commit comments

Comments
 (0)