RaBitQ Library 0.7.1¶
This release lowers the cost of adding vectors to IVF-RaBitQ, makes the
HNSW-RaBitQ rotation follow random_seed, and fixes parallel execution and
zero-range query handling.
IVF-RaBitQ updates¶
- Each cluster now has its own storage, so
addcopies only the clusters it writes to; its cost grows with those clusters rather than the whole index. See cost ofadd. IvfIndex.reserve(cluster_id, num_points)(C++IVF::reserve) preallocates room for a cluster so lateraddcalls write into it in place. Reserved room is not saved.- A failed
addstill leaves the index unchanged. - The file format is unchanged: files written with the earlier shared-buffer layout load and save back to identical bytes.
HNSW-RaBitQ seeding¶
random_seed now also seeds the FHT/Kac rotation (using its low 32 bits), so
single-threaded construction with the same inputs and seed is reproducible within
the same build environment; parallel insertion order can still vary. Loading a
saved index restores its stored rotation. See
parameters and limits.
Fixes¶
- Parallel construction of IVF-RaBitQ's
hnswcentroid routing no longer races: insertion levels are drawn under the registration lock and the entry point is read under the global lock. Concurrent routing searches pass their ownefinstead of serializing on a shared mutex. - Queries whose quantization range is zero produce zero codes on the scalar, AVX2, AVX-512 and NEON backends, keeping estimated distances finite.
- Python copies NumPy arrays whose data is not aligned for float32 into aligned storage before native processing; the input arrays are unchanged.
Other changes¶
- SymphonyQG construction fills under-filled neighbor lists from final reverse-edge candidates only, using reusable per-worker buffers instead of a global per-vertex candidate array, which can lower peak construction memory. Because search-pruned edges no longer take part, graphs differ from 0.7.0 builds.
- Top-level HNSW-RaBitQ query batches reuse OpenMP workers, and PiPNN sizes its tiles and teams by the available work.
- The published benchmarks were refreshed with 0.7.1.
Upgrading¶
From 0.7.0, existing public call forms and index file formats remain supported; no index conversion is required. Rebuild C++ consumers with matching headers and libraries; no cross-version C++ binary ABI is promised.
When upgrading from before 0.7.0, also follow the 0.7.0 migration guide.