From 5232d6aa81673328745f3fd9414c7f409e877aa9 Mon Sep 17 00:00:00 2001 From: Mehmet Dogan Date: Fri, 9 Feb 2024 15:43:24 +0300 Subject: [PATCH] Fix GraphIndexBuilder.reconnectOrphanedNodes `connectToClosestNeighbor()` method looks like connecting a `neighborNode` to itself with the similarity score between `node` and `neighborNode`. If I'm getting this logic correctly, it should connect `neighborNode` to `node` instead. Closes #214 --- .../jvector/graph/GraphIndexBuilder.java | 2 +- .../jvector/graph/GraphIndexBuilderTest.java | 79 +++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 jvector-tests/src/test/java/io/github/jbellis/jvector/graph/GraphIndexBuilderTest.java diff --git a/jvector-base/src/main/java/io/github/jbellis/jvector/graph/GraphIndexBuilder.java b/jvector-base/src/main/java/io/github/jbellis/jvector/graph/GraphIndexBuilder.java index 1c045012c..1c47cc7b5 100644 --- a/jvector-base/src/main/java/io/github/jbellis/jvector/graph/GraphIndexBuilder.java +++ b/jvector-base/src/main/java/io/github/jbellis/jvector/graph/GraphIndexBuilder.java @@ -291,7 +291,7 @@ private boolean connectToClosestNeighbor(int node, NodeArray neighbors, Set> newBuilder = () -> + new GraphIndexBuilder<>(ravv, VectorEncoding.FLOAT32, VectorSimilarityFunction.COSINE, 2, 10, 1.0f, 1.0f); + + var indexDataPath = testDirectory.resolve("index_builder.data"); + var builder = newBuilder.get(); + + try (var graph = TestUtil.buildSequentially(builder, ravv); + var out = TestUtil.openFileForWriting(indexDataPath)) { + graph.save(out); + out.flush(); + } + + builder = newBuilder.get(); + try(var reader = new SimpleMappedReader(indexDataPath)) { + builder.load(reader); + } + + assertEquals(ravv.size(), builder.graph.size()); + for (int i = 0; i < ravv.size(); i++) { + assertTrue(builder.graph.containsNode(i)); + } + } +}