Skip to content

v1.15.0

Latest

Choose a tag to compare

@mnorris11 mnorris11 released this 03 Aug 17:10

[1.15.0] - 2026-07-31

Full changelog

Added

  • 4332ceb Enable byte-LUT gather path for QT_8bit_eden distance computation (#5498)
  • 41133fd Add EDEN quantizer indexes (#5278)
  • 3110fd2 Add MetalIndexIVFPQ with product quantization and residual encoding support (#5288)
  • 6c2b687 Adding cuVS IVF-SQ backend (#5306)
  • 4d778bc Add multi-GPU CAGRA → HNSW build with trainAllNeighbors and multi-GPU optimize (#5282)
  • 42dc286 Implement memory-mapped I/O for Flat and static Vamana SVS indices (#5271)
  • d22107b feat(riscv): Add RISC-V RVV rabitq kernels (#5369)
  • df51012 feat(riscv): Add RISC-V RVV vector distance kernels (#5354)
  • 3b52da3 Add AVX2 and AVX512 byte-domain kernels for QT_8bit_direct_signed (#5409)
  • 88b6c47 Implement IVFRaBitQ FastScan conversion constructor (#5422)
  • d24cc84 Implement GPU IVF add_preassigned via add_core (implement #3908) (#5372)
  • 5826578 Read/Write support for IndexHNSW base class (#5305)
  • a3350f6 faiss: support METRIC_L1 and extra metrics in IndexFlat range_search (#5391)
  • 432e8b4 Extend DistanceComputer batching to PQ, SQ, and PreTransform (#5309)
  • 7d4bb39 Extract super_kmeans_assign_iteration as a shared public SuperKMeans kernel (#5443)
  • aff8589 c_api: expose ScalarQuantizer codec and complete FaissQuantizerType enum (#5477)
  • 13aa39b Clone index support for HadamardRotation (#5475)
  • 3e313e4 SIMDConfig::has_dynamic_dispatch() (#5460)
  • a6f9775 Add faiss-gpu-cuvs pip wheel packaging (#5250)
  • 6227323 pyfaiss_gpu_cuvs_2602: cuVS faiss Python for aarch64/GH200 (26.02, CUDA 12.4)
  • 522644c Stand up parallel cuVS 26.02 IVF-PQ targets (rmm/raft/cuvs) at CUDA 12.8 (#5414)
  • edebabf Include Python type stubs (init.pyi, py.typed) in conda packages (#5394)
  • 9579d8f Add type stubs for SVS index classes + IndexIVFFlatPanorama.batch_size (#5489)
  • fd7be0c Add QT_0bit and QT_2bit_tq..QT_5bit_tq to ScalarQuantizer pyi stub (#5323)
  • ccecc84 Add ClusteringInitMethod enum constants to init.pyi stub (#5324)
  • 55990eb Port test_rabitq_utils from C++ to Python (#5442)

Changed

  • 0236390 Optimize RaBitQ fastscan query setup + 80% qps (#5396)
  • b1d61c3 Fuse RaBitQ AND-dot and popcount scan (#5412)
  • 81031a9 RaBitQ fastscan avx512 lut quant (#5397)
  • b7f2b0f RaBitQ SIMD-optimized bit-plane operation (#5392)
  • 0a27700 Reuse RaBitQ IVF scanner distance computer (#5390)
  • a3d59f0 faiss DD: use 256-bit fast-scan QBS kernel on AMD Zen 4 (split AVX-512) (#5488)
  • c374dd9 Panorama HNSW Optimizations (~x1.2) (#5190)
  • cb9a72a Reuse the HNSW visited table across searches instead of reallocating per call (#5448)
  • 4d16574 Raise HNSW visited-table hash-set threshold from 500k to 10M (#5446)
  • a4b4c0f Optimize exhaustive_L2sqr_blas_cmax with AVX-512 intrinsics. (#4569)
  • 4a2f7e6 Optimize the DistanceComputerByte::compute_code_distance with AVX512F, AVX512BW, AVX512VL instructions (#5067)
  • 9a74c6d Speed up Top1 and Reservoir add_results with AVX2/AVX512 (#5297)
  • 4030faa Speed up polysemous training with AVX-512.
  • ea10764 Parallelize inverted-list append loop in IndexIVFPQ::add_core_o (#5382)
  • cf04570 ProductQuantizer::search_sdc: hoist per-subquantizer row pointers out of database-vector loop (#5338)
  • caf88fc Improve ranklist intersection size (#5237)
  • 5c1afee Remove dead code in quantize_ex_bits to avoid wasted compute (#5384)
  • e3dd6a8 Remove unused fields in various DistanceComputers (#5318)
  • 35c5495 Remove confusing double-negative throw-macro conditions (#5471)
  • 9223d62 Rename SQI8 to SQ8 to be consistent with the rest of Faiss (#5337)
  • b37e929 Reuse faiss.ResultHeap in benchs instead of duplicating it (#5363)
  • 1f755ef Prune cuVS brute-force flat index on aarch64 (FAISS_CUVS_NO_FLAT) (#5431)
  • 3a7cce4 Faiss OSS CI: skip GPU jobs on PRs that touch no GPU-relevant code (#5402)
  • 0f48ae6 Faiss OSS autofix: force cuVS nightly to break (E2E validation) (#5328)
  • 0f0f728 Format faiss Python files with black (line length 80) (#5349)
  • 7a7a8f2 Align faiss .flake8 with black and the 80-char standard (#5350)
  • 259fa85 black -l 80: gpu/test formatting (1/3) (#5426)
  • a7d91d4 black -l 80: tests/ formatting (2/3) (#5427)
  • 3937552 black -l 80: benchs + python + refine test formatting (3/3) (#5428)
  • b75a23c black -l 80: python/init.pyi formatting (4/4) (#5429)
  • a238933 Finish E501 line-length lint sweep across faiss (183 violations, 52 files) (#5444)
  • d4564bd facebook-unused-include-check in distances_avx2.cpp (#5462)
  • ab3a5a9 facebook-unused-include-check in IndexIVFPQ.cpp (#5461)
  • e85b9bd facebook-unused-include-check in test_svs.cpp (#5455)
  • 5e1ccce facebook-unused-include-check in TestGpuIndexIVFScalarQuantizer.cpp (#5454)
  • 003e002 facebook-unused-include-check in IndexBinaryHash.cpp (#5453)
  • c22dc24 facebook-unused-include-check in avx2.cpp (#5452)
  • 76e2bbc facebook-unused-include-check in IndexBinaryHNSW.cpp (#5379)
  • 7c643c2 facebook-unused-include-check in IndexIVFPQFastScan.cpp (#5378)
  • 3c5c27c facebook-unused-include-check in avx2.cpp (#5377)
  • 9b33960 facebook-unused-include-check in test_ivf_early_termination.cpp (#5376)
  • 027054f facebook-unused-include-check in IVFPQ_QueryTables.cpp (#5359)
  • f4cb963 facebook-unused-include-check in avx2.cpp (#5358)
  • afc1be4 facebook-unused-include-check in hamming.cpp (#5355)
  • 6256cc7 facebook-unused-include-check in IndexIVF.cpp (#5356)
  • 83dc6a6 facebook-unused-include-check in IndexIVFSpectralHash.cpp (#5357)
  • 124bfa1 facebook-unused-include-check in IndexSVSVamanaLeanVec.cpp (#5343)
  • a0457db facebook-unused-include-check in avx2.cpp (#5344)
  • 595c5d7 facebook-unused-include-check in distances_simd.cpp (#5342)
  • 5437256 facebook-unused-include-check in avx2.cpp (#5314)
  • 7c56a9d facebook-unused-include-check in avx2.cpp (#5315)
  • 0f280a7 facebook-unused-include-check in distances_simd.cpp (#5316)

Fixed

  • 6187d94 clang-diagnostic-unused-parameter in GpuCloner.cpp (#5480)
  • 37313e7 Fix two memory leaks in shard_ivf_index_centroids (#5495)
  • 7a4e797 Fix RaBitQ fast scan aux offsets for large bbs (#5421)
  • a032797 faiss DD: SQ AVX-512 falls back to AVX2 when d%16!=0 (#5478)
  • de8520b missing auto vectorization for AVX512-SPR (#5433)
  • 4a23937 Fix AVX-512 PQ-encode falling back to scalar in fvec_L2sqr_ny_nearest_y_transposed (#5330)
  • 7437cac Fix Jaccard heap selection in IVF search (#5408)
  • 458c7be Fix division-by-zero in quantize_lut when all LUT entries are identical (#5424)
  • ecd5b65 Guard constant/zero-norm query in RaBitQ query quantization (#5381)
  • 1190b70 RaBitQ: Clamp L2 distance estimate to >=0 (#5393)
  • af45a3b Throw instead of abort on null buffer in RaBitQuantizer::decode_core (#5465)
  • 5372c88 Guard exhaustive_{inner_product,L2sqr}_seq against empty query batches (nx=0) (#5445)
  • 764b86f Guard ScalarQuantizer compute_codes/decode OMP region for small n (#5423)
  • 19f477a Fix out-of-bounds memory access in bvec_checksum (#5310)
  • 3553e01 Fix IndexAdditiveQuantizer::symmetric_dis() (#5319)
  • b7cd013 Filter out-of-radius results in IndexRefine::range_search (#5370)
  • 4213672 Always widen IndexRefine::range_search base radius by k_factor (#5395)
  • ed29dbb faiss: fix IndexIDMap range_search crash with empty SearchParameters (#5388)
  • 828de1b fix IDMap add_sa_codes returning -1 labels with ivf subindex Issue #5333 (#5345)
  • bf53109 Fix get_code_size to handle HNSW coarse quantizers with any M value (#5416)
  • e1f8d4f Fix reverse_index_factory for multi-bit RaBitQ indexes (#5419)
  • 7b1d0ca Fix C++ reverse_index_factory: missing qtypes crash telemetry, IDMap2 misidentified (#5417)
  • cc9be4b fix: reverse_index_factory missing 11 SQ types including all TurboQuant variants (#5322)
  • 350a50b Fix OperatingPoints::add prune loop leaving dominated points at equal time (#5415)
  • bd67601 Fix OperatingPoints leaving dominated points on the Pareto frontier for equal-time points (#5334)
  • 376930b Fix null dereference, dead condition, and Python binding crash in AutoTune and Clustering (#5321)
  • e306f30 Fix PyCallbackShardingFunction to properly decrement references (#5389)
  • d91b73d fix: bs add n fix valid counter skip (#5383)
  • 247527b Fix reconstruct_n stubs resolving to torch.Tensor for numpy calls (#5411)
  • a3e8c67 Fix heap-buffer-overflow in ResidualCoarseQuantizer deserialization (T280514309) (#5485)
  • 4d74915 Bound lattice_nbit loop in IndexLattice ctor to fix deserialization timeout (T277092535) (#5484)
  • 5987f52 Reject nbits==0 ProductQuantizer on deserialization (T279464247) (#5483)
  • 269ac43 Bound recursion depth in index deserialization (CWE-674) (#5468)
  • a20b22d Bound decode-cache compute in ZnSphereCodecRec deserialization (#5467)
  • 6a0616e Reject null base/refine index in IndexRefine deserialization (#5466)
  • bc102d6 Bound IVFPQ precomputed-table allocation at deserialization time (#5464)
  • 756c5d5 Harden FastScan deserialization: enforce ksub==16 and bound reconstruct() (#5436)
  • f1efc2c Validate codes/ntotal consistency in Ix2L and IxLa deserialization (#5439)
  • fba9084 Validate Panorama batch_size and codes/cum_sums on deserialization (#5438)
  • d433363 Validate SVS-Vamana stored_vectors size on deserialization (ISV2) (#5434)
  • dfd2a25 Reject degenerate code_size==0 IndexPQ with ntotal>0 on deserialization (#5437)
  • 91ce5f8 Harden reconstruct()/reset() against null storage in composite indexes (#5440)
  • ea8e22c Bounds-check decoded direct_map entry in IndexIVF::reconstruct (#5435)
  • 79f59ed Validate legacy IVFFlat per-list codes size against ids size (#5259)
  • c428ca1 Harden OnDiskInvertedLists mmap reader against malformed list sizes (#5312)
  • 6f62d01 Guard against integer overflow in index deserialization storage-size checks (#5313)
  • 16c5d78 Don't redefine PRETTY_FUNCTION under clang-cl (#5474)
  • a968345 clang-diagnostic-unused-parameter in bench_result_handler_overhead.cpp (#5481)
  • d6d3dce clang-diagnostic-unused-parameter in bench_cppcontrib_sa_decode.cpp (#5479)
  • 8d0d1a2 faiss/gpu/perf: check CUDA return in PerfIVFPQAdd (clang21 nodiscard) (#5368)
  • 0fa5b0a faiss/gpu/perf: check cudaProfilerStop() return (fix clang21 -Wunused-value) (#5362)
  • 6f01557 Keep distances_simdlib256.h include in distances_simd.cpp (unused-include false positive) (#5380)
  • 22220d2 Fix genuine flake8 lint in faiss Python (F401/F403/F841/B011) (#5351)
  • 63378f0 Fix cuVS GPU CI timeout: pin CUDA toolkit to 13.2 (#5401)
  • 11bd764 Faiss OSS nightly autofix (#5346)
  • 7cd1ae9 Fix panorama tests: pass D_panorama (not D_regular) to check_ref_knn_with_draws (#5430)
  • ba6af9f Fix flaky IVF/Refine Panorama kNN tests under AVX512_SPR dispatch (#5420)
  • 6653b98 Fix flaky TestIVFRaBitQ_AVX2::test_comparison_vs_ref_L2_rrot — apply cross-SIMD equivalence (#5325)
  • aa9d2bf De-flake test_flat_panorama across SIMD levels (#5361)
  • 395eaf8 De-flake panorama / graph_based / hamming_utils tests (#5339)
  • 08cb1f2 De-flake test_refine_panorama.test_incremental_add (seed + tolerance) (#5347)
  • 8bfcb4e De-flake test_meta_index.Shards.test_shards (loosen tie-churn tolerance) (#5348)
  • 54f83a4 De-flake bench_transposed_encode (CI timeout) (#5360)