Skip to content

Commit 55895ef

Browse files
author
Jonathan Ellis
committed
test also checks that merged contains all source nodes
1 parent 7fd7489 commit 55895ef

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

jvector-tests/src/test/java/io/github/jbellis/jvector/graph/TestConcurrentNeighborSet.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ private void testMergeCandidatesOnce() {
190190
// test merge where one array contains either exact duplicates, or duplicate scores, of the other
191191
int maxSize = 1 + getRandom().nextInt(5);
192192

193+
// fill arr1 with nodes from 0..size, with random scores assigned (so random order of nodes)
193194
NeighborArray arr1 = new NeighborArray(maxSize);
194195
int a1Size;
195196
if (getRandom().nextBoolean()) {
@@ -201,6 +202,10 @@ private void testMergeCandidatesOnce() {
201202
arr1.insertSorted(i, getRandom().nextFloat());
202203
}
203204

205+
// arr2 (smaller or same size as arr1) contains either
206+
// -- an exact duplicates of the corresponding node in arr1, or
207+
// -- a random score chosen from arr1
208+
// this is designed to maximize the need for correct handling of corner cases in the merge
204209
NeighborArray arr2 = new NeighborArray(maxSize);
205210
int a2Size;
206211
if (getRandom().nextBoolean()) {
@@ -227,14 +232,38 @@ private void testMergeCandidatesOnce() {
227232
}
228233
}
229234

235+
// merge!
230236
var merged = ConcurrentNeighborSet.mergeNeighbors(arr1, arr2);
237+
238+
// sanity check
231239
assert merged.size <= arr1.size() + arr2.size();
232240
assert merged.size >= Math.max(arr1.size(), arr2.size());
233241
var uniqueNodes = new HashSet<>();
242+
243+
// results should be sorted by score, and not contain duplicates
234244
for (int i = 0; i < merged.size - 1; i++) {
235245
assertTrue(merged.score[i] >= merged.score[i + 1]);
236246
assertTrue(uniqueNodes.add(merged.node[i]));
237247
}
248+
assertTrue(uniqueNodes.add(merged.node[merged.size - 1]));
249+
250+
// results should contain all the nodes that were in the source arrays
251+
for (int i = 0; i < arr1.size(); i++) {
252+
assertTrue(String.format("%s missing%na1: %s%na2: %s%nmerged: %s%n",
253+
arr1.node[i],
254+
Arrays.toString(arr1.node),
255+
Arrays.toString(arr2.node),
256+
Arrays.toString(merged.node)),
257+
uniqueNodes.contains(arr1.node[i]));
258+
}
259+
for (int i = 0; i < arr2.size(); i++) {
260+
assertTrue(String.format("%s missing%na1: %s%na2: %s%nmerged: %s%n",
261+
arr2.node[i],
262+
Arrays.toString(arr1.node),
263+
Arrays.toString(arr2.node),
264+
Arrays.toString(merged.node)),
265+
uniqueNodes.contains(arr2.node[i]));
266+
}
238267
}
239268

240269
@Test

0 commit comments

Comments
 (0)