Reject non-finite brute-force search distances - #690
Open
shoaib0657 wants to merge 1 commit into
Open
shoaib0657 wants to merge 1 commit into
shoaib0657 wants to merge 1 commit into
Conversation
shoaib0657
marked this pull request as ready for review
October 2, 2026 03:25
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Addresses #686.
When squared L2 distances overflow float32, BFIndex can return the wrong neighbor order. In the reported example, both distances become infinity and the labels break the tie.
This reports an error for non-finite float/double distances before they reach the brute-force result heap. The C++ nonthrowing API returns a Status; Python and the throwing C++ API raise a runtime error. Labels excluded by a filter do not cause an error, and
k=0returns empty results without evaluating distances. Other distance types keep their existing behavior.The check uses exponent bits because fast-math can optimize away
std::isfinite. BFIndex query buffers now retain temporary ownership so failed queries free both arrays.Tests
The overflow regression fails on upstream and passes with this change. Tests cover finite controls, filters, float/double infinity and NaN, zero-k, and parallel L2/cosine errors followed by successful queries.
Local Ubuntu WSL2 checks: