Skip to content

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 add copies only the clusters it writes to; its cost grows with those clusters rather than the whole index. See cost of add.
  • IvfIndex.reserve(cluster_id, num_points) (C++ IVF::reserve) preallocates room for a cluster so later add calls write into it in place. Reserved room is not saved.
  • A failed add still 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 hnsw centroid 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 own ef instead 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.