faiss 0.5.3 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/ext/faiss/ext.cpp +1 -1
  4. data/ext/faiss/extconf.rb +4 -4
  5. data/ext/faiss/index.cpp +63 -45
  6. data/ext/faiss/index_binary.cpp +37 -27
  7. data/ext/faiss/kmeans.cpp +9 -8
  8. data/ext/faiss/pca_matrix.cpp +9 -7
  9. data/ext/faiss/product_quantizer.cpp +13 -11
  10. data/ext/faiss/utils.cpp +4 -2
  11. data/ext/faiss/utils.h +4 -0
  12. data/lib/faiss/version.rb +1 -1
  13. data/lib/faiss.rb +1 -1
  14. data/vendor/faiss/faiss/AutoTune.cpp +214 -82
  15. data/vendor/faiss/faiss/AutoTune.h +14 -1
  16. data/vendor/faiss/faiss/Clustering.cpp +97 -249
  17. data/vendor/faiss/faiss/Clustering.h +18 -0
  18. data/vendor/faiss/faiss/IVFlib.cpp +67 -44
  19. data/vendor/faiss/faiss/Index.cpp +25 -12
  20. data/vendor/faiss/faiss/Index.h +26 -4
  21. data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
  22. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +68 -61
  23. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
  24. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
  25. data/vendor/faiss/faiss/IndexBinary.cpp +6 -3
  26. data/vendor/faiss/faiss/IndexBinary.h +4 -4
  27. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +1 -1
  28. data/vendor/faiss/faiss/IndexBinaryFlat.h +1 -1
  29. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -4
  30. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +92 -95
  31. data/vendor/faiss/faiss/IndexBinaryHNSW.h +9 -3
  32. data/vendor/faiss/faiss/IndexBinaryHash.cpp +45 -236
  33. data/vendor/faiss/faiss/IndexBinaryHash.h +6 -6
  34. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +120 -414
  35. data/vendor/faiss/faiss/IndexFastScan.cpp +105 -129
  36. data/vendor/faiss/faiss/IndexFastScan.h +35 -24
  37. data/vendor/faiss/faiss/IndexFlat.cpp +216 -152
  38. data/vendor/faiss/faiss/IndexFlat.h +32 -14
  39. data/vendor/faiss/faiss/IndexFlatCodes.cpp +88 -41
  40. data/vendor/faiss/faiss/IndexFlatCodes.h +7 -1
  41. data/vendor/faiss/faiss/IndexHNSW.cpp +299 -187
  42. data/vendor/faiss/faiss/IndexHNSW.h +30 -14
  43. data/vendor/faiss/faiss/IndexIDMap.cpp +26 -22
  44. data/vendor/faiss/faiss/IndexIDMap.h +9 -7
  45. data/vendor/faiss/faiss/IndexIVF.cpp +535 -405
  46. data/vendor/faiss/faiss/IndexIVF.h +47 -16
  47. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +77 -74
  48. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +105 -99
  49. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +6 -3
  50. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +379 -249
  51. data/vendor/faiss/faiss/IndexIVFFastScan.h +65 -60
  52. data/vendor/faiss/faiss/IndexIVFFlat.cpp +41 -124
  53. data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
  54. data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +89 -138
  55. data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
  56. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
  57. data/vendor/faiss/faiss/IndexIVFPQ.cpp +77 -907
  58. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +184 -122
  59. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
  60. data/vendor/faiss/faiss/IndexIVFPQR.cpp +23 -18
  61. data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +59 -60
  62. data/vendor/faiss/faiss/IndexIVFRaBitQ.h +4 -3
  63. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +564 -416
  64. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +269 -111
  65. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
  66. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
  67. data/vendor/faiss/faiss/IndexLSH.cpp +44 -25
  68. data/vendor/faiss/faiss/IndexLattice.cpp +41 -36
  69. data/vendor/faiss/faiss/IndexNNDescent.cpp +37 -21
  70. data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
  71. data/vendor/faiss/faiss/IndexNSG.cpp +40 -23
  72. data/vendor/faiss/faiss/IndexNSG.h +0 -2
  73. data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +32 -12
  74. data/vendor/faiss/faiss/IndexPQ.cpp +129 -213
  75. data/vendor/faiss/faiss/IndexPQ.h +3 -2
  76. data/vendor/faiss/faiss/IndexPQFastScan.cpp +20 -14
  77. data/vendor/faiss/faiss/IndexPQFastScan.h +3 -0
  78. data/vendor/faiss/faiss/IndexPreTransform.cpp +25 -18
  79. data/vendor/faiss/faiss/IndexPreTransform.h +1 -1
  80. data/vendor/faiss/faiss/IndexRaBitQ.cpp +31 -43
  81. data/vendor/faiss/faiss/IndexRaBitQ.h +4 -3
  82. data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +135 -317
  83. data/vendor/faiss/faiss/IndexRaBitQFastScan.h +192 -34
  84. data/vendor/faiss/faiss/IndexRefine.cpp +30 -55
  85. data/vendor/faiss/faiss/IndexRefine.h +4 -4
  86. data/vendor/faiss/faiss/IndexReplicas.cpp +6 -6
  87. data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +15 -14
  88. data/vendor/faiss/faiss/IndexRowwiseMinMax.h +1 -1
  89. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +82 -14
  90. data/vendor/faiss/faiss/IndexShards.cpp +13 -13
  91. data/vendor/faiss/faiss/IndexShardsIVF.cpp +21 -15
  92. data/vendor/faiss/faiss/MatrixStats.cpp +5 -4
  93. data/vendor/faiss/faiss/MetaIndexes.cpp +19 -17
  94. data/vendor/faiss/faiss/MetaIndexes.h +1 -1
  95. data/vendor/faiss/faiss/MetricType.h +29 -6
  96. data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
  97. data/vendor/faiss/faiss/SuperKMeans.h +97 -0
  98. data/vendor/faiss/faiss/VectorTransform.cpp +349 -141
  99. data/vendor/faiss/faiss/VectorTransform.h +39 -16
  100. data/vendor/faiss/faiss/build.cpp +23 -0
  101. data/vendor/faiss/faiss/build.h +15 -0
  102. data/vendor/faiss/faiss/clone_index.cpp +55 -51
  103. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +47 -47
  104. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +11 -0
  105. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +38 -38
  106. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +11 -0
  107. data/vendor/faiss/faiss/{cppcontrib/factory_tools.cpp → factory_tools.cpp} +6 -1
  108. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +1 -1
  109. data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -5
  110. data/vendor/faiss/faiss/gpu/GpuResources.h +1 -1
  111. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +9 -9
  112. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +4 -3
  113. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +46 -0
  114. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +56 -0
  115. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +78 -1
  116. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +72 -0
  117. data/vendor/faiss/faiss/gpu/test/TestUtils.h +23 -0
  118. data/vendor/faiss/faiss/gpu/utils/CuvsFilterConvert.h +1 -1
  119. data/vendor/faiss/faiss/gpu/utils/CuvsUtils.h +21 -10
  120. data/vendor/faiss/faiss/gpu_metal/GpuIndexFlat.h +22 -0
  121. data/vendor/faiss/faiss/gpu_metal/MetalCloner.h +35 -0
  122. data/vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h +40 -0
  123. data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +51 -0
  124. data/vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h +65 -0
  125. data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +66 -0
  126. data/vendor/faiss/faiss/gpu_metal/MetalResources.h +79 -0
  127. data/vendor/faiss/faiss/gpu_metal/StandardMetalResources.h +35 -0
  128. data/vendor/faiss/faiss/impl/AdSampling.cpp +103 -0
  129. data/vendor/faiss/faiss/impl/AdSampling.h +35 -0
  130. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +64 -34
  131. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +1 -0
  132. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +10 -9
  133. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +3 -28
  134. data/vendor/faiss/faiss/impl/ClusteringHelpers.cpp +244 -0
  135. data/vendor/faiss/faiss/impl/ClusteringHelpers.h +94 -0
  136. data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +367 -0
  137. data/vendor/faiss/faiss/impl/ClusteringInitialization.h +107 -0
  138. data/vendor/faiss/faiss/impl/CodePacker.cpp +7 -3
  139. data/vendor/faiss/faiss/impl/CodePacker.h +11 -3
  140. data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +83 -0
  141. data/vendor/faiss/faiss/impl/CodePackerRaBitQ.h +47 -0
  142. data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
  143. data/vendor/faiss/faiss/impl/FaissAssert.h +64 -3
  144. data/vendor/faiss/faiss/impl/FaissException.h +50 -3
  145. data/vendor/faiss/faiss/impl/HNSW.cpp +117 -351
  146. data/vendor/faiss/faiss/impl/HNSW.h +21 -40
  147. data/vendor/faiss/faiss/impl/IDSelector.cpp +15 -11
  148. data/vendor/faiss/faiss/impl/IDSelector.h +8 -8
  149. data/vendor/faiss/faiss/impl/InvertedListScannerStats.h +26 -0
  150. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +114 -102
  151. data/vendor/faiss/faiss/impl/NNDescent.cpp +63 -26
  152. data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
  153. data/vendor/faiss/faiss/impl/NSG.cpp +44 -26
  154. data/vendor/faiss/faiss/impl/NSG.h +20 -10
  155. data/vendor/faiss/faiss/impl/Panorama.cpp +76 -52
  156. data/vendor/faiss/faiss/impl/Panorama.h +265 -78
  157. data/vendor/faiss/faiss/impl/PdxLayout.cpp +93 -0
  158. data/vendor/faiss/faiss/impl/PdxLayout.h +41 -0
  159. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +62 -37
  160. data/vendor/faiss/faiss/impl/PolysemousTraining.h +3 -3
  161. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +35 -35
  162. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +21 -16
  163. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +99 -80
  164. data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
  165. data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +135 -37
  166. data/vendor/faiss/faiss/impl/RaBitQUtils.h +148 -21
  167. data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +298 -301
  168. data/vendor/faiss/faiss/impl/RaBitQuantizer.h +3 -10
  169. data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.cpp +15 -41
  170. data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.h +0 -4
  171. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +40 -32
  172. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
  173. data/vendor/faiss/faiss/impl/ResultHandler.h +218 -113
  174. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +119 -2362
  175. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +27 -3
  176. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
  177. data/vendor/faiss/faiss/impl/VisitedTable.cpp +42 -0
  178. data/vendor/faiss/faiss/impl/VisitedTable.h +76 -0
  179. data/vendor/faiss/faiss/impl/approx_topk/approx_topk.h +276 -0
  180. data/vendor/faiss/faiss/impl/approx_topk/avx2.cpp +68 -0
  181. data/vendor/faiss/faiss/{utils → impl}/approx_topk/generic.h +15 -8
  182. data/vendor/faiss/faiss/impl/approx_topk/neon.cpp +68 -0
  183. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab-inl.h +169 -0
  184. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab.h +117 -0
  185. data/vendor/faiss/faiss/impl/approx_topk/simdlib256-inl.h +146 -0
  186. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h +73 -0
  187. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHash_impl.h +270 -0
  188. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +460 -0
  189. data/vendor/faiss/faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h +159 -0
  190. data/vendor/faiss/faiss/impl/binary_hamming/IndexPQ_impl.h +92 -0
  191. data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +26 -0
  192. data/vendor/faiss/faiss/impl/binary_hamming/avx512.cpp +26 -0
  193. data/vendor/faiss/faiss/impl/binary_hamming/dispatch.h +143 -0
  194. data/vendor/faiss/faiss/impl/binary_hamming/neon.cpp +26 -0
  195. data/vendor/faiss/faiss/impl/binary_hamming/rvv.cpp +26 -0
  196. data/vendor/faiss/faiss/impl/expanded_scanners.h +163 -0
  197. data/vendor/faiss/faiss/impl/{FastScanDistancePostProcessing.h → fast_scan/FastScanDistancePostProcessing.h} +13 -6
  198. data/vendor/faiss/faiss/impl/{LookupTableScaler.h → fast_scan/LookupTableScaler.h} +16 -5
  199. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops.h +237 -0
  200. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops_512.h +185 -0
  201. data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +229 -0
  202. data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +268 -0
  203. data/vendor/faiss/faiss/impl/{pq4_fast_scan.cpp → fast_scan/fast_scan.cpp} +176 -4
  204. data/vendor/faiss/faiss/impl/fast_scan/fast_scan.h +341 -0
  205. data/vendor/faiss/faiss/impl/fast_scan/impl-avx2.cpp +36 -0
  206. data/vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp +40 -0
  207. data/vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp +120 -0
  208. data/vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp +104 -0
  209. data/vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h +213 -0
  210. data/vendor/faiss/faiss/impl/{pq4_fast_scan_search_qbs.cpp → fast_scan/kernels_simd512.h} +26 -348
  211. data/vendor/faiss/faiss/impl/fast_scan/rabitq_dispatching.h +90 -0
  212. data/vendor/faiss/faiss/impl/fast_scan/rabitq_result_handler.h +108 -0
  213. data/vendor/faiss/faiss/impl/{simd_result_handlers.h → fast_scan/simd_result_handlers.h} +290 -142
  214. data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +54 -0
  215. data/vendor/faiss/faiss/impl/hnsw/LockVector.h +64 -0
  216. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +91 -0
  217. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +64 -0
  218. data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +104 -0
  219. data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +111 -0
  220. data/vendor/faiss/faiss/impl/index_read.cpp +1950 -505
  221. data/vendor/faiss/faiss/impl/index_read_utils.h +1 -2
  222. data/vendor/faiss/faiss/impl/index_write.cpp +112 -21
  223. data/vendor/faiss/faiss/impl/io.cpp +6 -6
  224. data/vendor/faiss/faiss/impl/io_macros.h +33 -16
  225. data/vendor/faiss/faiss/impl/kmeans1d.cpp +10 -10
  226. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +81 -40
  227. data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
  228. data/vendor/faiss/faiss/impl/mapped_io.cpp +15 -8
  229. data/vendor/faiss/faiss/impl/platform_macros.h +11 -4
  230. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +549 -0
  231. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +245 -0
  232. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h +105 -0
  233. data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +106 -0
  234. data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +21 -0
  235. data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +21 -0
  236. data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +21 -0
  237. data/vendor/faiss/faiss/impl/{code_distance/code_distance-avx2.h → pq_code_distance/pq_code_distance-avx2.h} +43 -220
  238. data/vendor/faiss/faiss/impl/{code_distance/code_distance-avx512.h → pq_code_distance/pq_code_distance-avx512.h} +25 -112
  239. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +59 -0
  240. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h +96 -0
  241. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +256 -0
  242. data/vendor/faiss/faiss/impl/{code_distance/code_distance-sve.h → pq_code_distance/pq_code_distance-sve.cpp} +57 -146
  243. data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +68 -0
  244. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +320 -483
  245. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
  246. data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +121 -0
  247. data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +137 -0
  248. data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +371 -0
  249. data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +190 -0
  250. data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +94 -0
  251. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +603 -0
  252. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +597 -0
  253. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +388 -0
  254. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +630 -0
  255. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +311 -0
  256. data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +387 -0
  257. data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +54 -0
  258. data/vendor/faiss/faiss/impl/simd_dispatch.h +173 -0
  259. data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
  260. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +274 -171
  261. data/vendor/faiss/faiss/impl/simdlib/simdlib_avx512.h +414 -0
  262. data/vendor/faiss/faiss/impl/simdlib/simdlib_dispatch.h +44 -0
  263. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_emulated.h +231 -166
  264. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_neon.h +275 -217
  265. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_ppc64.h +201 -160
  266. data/vendor/faiss/faiss/impl/svs_io.cpp +12 -3
  267. data/vendor/faiss/faiss/impl/svs_io.h +8 -2
  268. data/vendor/faiss/faiss/index_factory.cpp +115 -28
  269. data/vendor/faiss/faiss/index_io.h +53 -3
  270. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +73 -20
  271. data/vendor/faiss/faiss/invlists/DirectMap.cpp +24 -14
  272. data/vendor/faiss/faiss/invlists/DirectMap.h +4 -3
  273. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +157 -73
  274. data/vendor/faiss/faiss/invlists/InvertedLists.h +86 -23
  275. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +4 -4
  276. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +14 -14
  277. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
  278. data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +9 -19
  279. data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
  280. data/vendor/faiss/faiss/svs/IndexSVSFlat.h +2 -0
  281. data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +350 -0
  282. data/vendor/faiss/faiss/svs/IndexSVSIVF.h +128 -0
  283. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.cpp +40 -0
  284. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.h +43 -0
  285. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +225 -0
  286. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.h +71 -0
  287. data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +25 -1
  288. data/vendor/faiss/faiss/svs/IndexSVSVamana.h +19 -2
  289. data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +1 -1
  290. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +19 -2
  291. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +14 -0
  292. data/vendor/faiss/faiss/utils/Heap.cpp +56 -10
  293. data/vendor/faiss/faiss/utils/Heap.h +21 -0
  294. data/vendor/faiss/faiss/utils/NeuralNet.cpp +54 -40
  295. data/vendor/faiss/faiss/utils/NeuralNet.h +1 -1
  296. data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +10 -4
  297. data/vendor/faiss/faiss/utils/distances.cpp +507 -559
  298. data/vendor/faiss/faiss/utils/distances.h +118 -1
  299. data/vendor/faiss/faiss/utils/distances_dispatch.h +250 -0
  300. data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +8 -7
  301. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +33 -14
  302. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +12 -1
  303. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +16 -293
  304. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp +57 -0
  305. data/vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h +290 -0
  306. data/vendor/faiss/faiss/utils/distances_simd.cpp +72 -3681
  307. data/vendor/faiss/faiss/utils/extra_distances.cpp +60 -102
  308. data/vendor/faiss/faiss/utils/extra_distances.h +79 -7
  309. data/vendor/faiss/faiss/utils/hamming-inl.h +13 -11
  310. data/vendor/faiss/faiss/utils/hamming.cpp +66 -517
  311. data/vendor/faiss/faiss/utils/hamming.h +92 -2
  312. data/vendor/faiss/faiss/utils/hamming_distance/common.h +287 -10
  313. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +15 -0
  314. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +15 -0
  315. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h +142 -0
  316. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +234 -0
  317. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-generic.h +368 -0
  318. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h +322 -0
  319. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-rvv.h +39 -0
  320. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer.h +146 -0
  321. data/vendor/faiss/faiss/utils/hamming_distance/hamming_impl.h +481 -0
  322. data/vendor/faiss/faiss/utils/hamming_distance/hamming_neon.cpp +15 -0
  323. data/vendor/faiss/faiss/utils/hamming_distance/hamming_rvv.cpp +15 -0
  324. data/vendor/faiss/faiss/utils/partitioning.cpp +66 -987
  325. data/vendor/faiss/faiss/utils/partitioning.h +31 -0
  326. data/vendor/faiss/faiss/utils/popcount.h +29 -0
  327. data/vendor/faiss/faiss/utils/pq_code_distance.h +251 -0
  328. data/vendor/faiss/faiss/utils/prefetch.h +2 -2
  329. data/vendor/faiss/faiss/utils/quantize_lut.cpp +30 -30
  330. data/vendor/faiss/faiss/utils/quantize_lut.h +1 -1
  331. data/vendor/faiss/faiss/utils/rabitq_simd.h +124 -343
  332. data/vendor/faiss/faiss/utils/random.cpp +6 -6
  333. data/vendor/faiss/faiss/utils/simd_impl/IVFFlatScanner-inl.h +51 -0
  334. data/vendor/faiss/faiss/utils/simd_impl/distances_aarch64.cpp +154 -0
  335. data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +777 -0
  336. data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +306 -0
  337. data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +1431 -0
  338. data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +1095 -0
  339. data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +189 -0
  340. data/vendor/faiss/faiss/utils/simd_impl/distances_simdlib256.h +195 -0
  341. data/vendor/faiss/faiss/utils/simd_impl/distances_sse-inl.h +392 -0
  342. data/vendor/faiss/faiss/utils/{distances_fused/simdlib_based.h → simd_impl/exhaustive_L2sqr_blas_cmax.h} +5 -10
  343. data/vendor/faiss/faiss/utils/simd_impl/hamming_impl.h +481 -0
  344. data/vendor/faiss/faiss/utils/simd_impl/partitioning_avx2.cpp +14 -0
  345. data/vendor/faiss/faiss/utils/simd_impl/partitioning_neon.cpp +14 -0
  346. data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +1085 -0
  347. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +355 -0
  348. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +477 -0
  349. data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +55 -0
  350. data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +55 -0
  351. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h +32 -0
  352. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels.h +43 -0
  353. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp +57 -0
  354. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp +45 -0
  355. data/vendor/faiss/faiss/utils/simd_levels.cpp +334 -0
  356. data/vendor/faiss/faiss/utils/simd_levels.h +183 -0
  357. data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
  358. data/vendor/faiss/faiss/utils/utils.cpp +21 -14
  359. data/vendor/faiss/faiss/utils/utils.h +3 -3
  360. metadata +156 -42
  361. data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
  362. data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
  363. data/vendor/faiss/faiss/impl/code_distance/code_distance-generic.h +0 -81
  364. data/vendor/faiss/faiss/impl/code_distance/code_distance.h +0 -186
  365. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -216
  366. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -224
  367. data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +0 -84
  368. data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +0 -196
  369. data/vendor/faiss/faiss/utils/approx_topk/mode.h +0 -34
  370. data/vendor/faiss/faiss/utils/distances_fused/avx512.h +0 -36
  371. data/vendor/faiss/faiss/utils/extra_distances-inl.h +0 -228
  372. data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +0 -462
  373. data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +0 -490
  374. data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +0 -450
  375. data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +0 -87
  376. data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +0 -524
  377. data/vendor/faiss/faiss/utils/simdlib.h +0 -42
  378. data/vendor/faiss/faiss/utils/simdlib_avx512.h +0 -296
  379. /data/vendor/faiss/faiss/{cppcontrib/factory_tools.h → factory_tools.h} +0 -0
@@ -9,8 +9,8 @@
9
9
 
10
10
  #include <memory>
11
11
 
12
- #include <faiss/impl/FastScanDistancePostProcessing.h>
13
- #include <faiss/impl/pq4_fast_scan.h>
12
+ #include <faiss/impl/fast_scan/FastScanDistancePostProcessing.h>
13
+ #include <faiss/impl/fast_scan/fast_scan.h>
14
14
  #include <faiss/utils/utils.h>
15
15
 
16
16
  namespace faiss {
@@ -20,25 +20,27 @@ inline size_t roundup(size_t a, size_t b) {
20
20
  }
21
21
 
22
22
  IndexPQFastScan::IndexPQFastScan(
23
- int d,
24
- size_t M,
25
- size_t nbits,
23
+ int d_in,
24
+ size_t M_in,
25
+ size_t nbits_in,
26
26
  MetricType metric,
27
- int bbs)
28
- : pq(d, M, nbits) {
29
- init_fastscan(d, M, nbits, metric, bbs);
27
+ int bbs_in)
28
+ : pq(d_in, M_in, nbits_in) {
29
+ init_fastscan(d_in, M_in, nbits_in, metric, bbs_in);
30
30
  }
31
31
 
32
- IndexPQFastScan::IndexPQFastScan(const IndexPQ& orig, int bbs) : pq(orig.pq) {
33
- init_fastscan(orig.d, pq.M, pq.nbits, orig.metric_type, bbs);
32
+ IndexPQFastScan::IndexPQFastScan(const IndexPQ& orig, int bbs_in)
33
+ : pq(orig.pq) {
34
+ init_fastscan(orig.d, pq.M, pq.nbits, orig.metric_type, bbs_in);
34
35
  ntotal = orig.ntotal;
35
- ntotal2 = roundup(ntotal, bbs);
36
+ ntotal2 = roundup(ntotal, bbs_in);
36
37
  is_trained = orig.is_trained;
37
38
  orig_codes = orig.codes.data();
38
39
 
39
40
  // pack the codes
40
41
  codes.resize(ntotal2 * M2 / 2);
41
- pq4_pack_codes(orig.codes.data(), ntotal, M, ntotal2, bbs, M2, codes.get());
42
+ pq4_pack_codes(
43
+ orig.codes.data(), ntotal, M, ntotal2, bbs_in, M2, codes.get());
42
44
  }
43
45
 
44
46
  void IndexPQFastScan::train(idx_t n, const float* x) {
@@ -49,9 +51,9 @@ void IndexPQFastScan::train(idx_t n, const float* x) {
49
51
  is_trained = true;
50
52
  }
51
53
 
52
- void IndexPQFastScan::compute_codes(uint8_t* codes, idx_t n, const float* x)
54
+ void IndexPQFastScan::compute_codes(uint8_t* out_codes, idx_t n, const float* x)
53
55
  const {
54
- pq.compute_codes(x, codes, n);
56
+ pq.compute_codes(x, out_codes, n);
55
57
  }
56
58
 
57
59
  void IndexPQFastScan::compute_float_LUT(
@@ -70,4 +72,8 @@ void IndexPQFastScan::sa_decode(idx_t n, const uint8_t* bytes, float* x) const {
70
72
  pq.decode(bytes, x, n);
71
73
  }
72
74
 
75
+ size_t IndexPQFastScan::fast_scan_code_size() const {
76
+ return M2 / 2;
77
+ }
78
+
73
79
  } // namespace faiss
@@ -52,6 +52,9 @@ struct IndexPQFastScan : IndexFastScan {
52
52
  const FastScanDistancePostProcessing& context) const override;
53
53
 
54
54
  void sa_decode(idx_t n, const uint8_t* bytes, float* x) const override;
55
+
56
+ /// Packed code size: M2 / 2 bytes (4-bit PQ sub-quantizer nibbles)
57
+ size_t fast_scan_code_size() const override;
55
58
  };
56
59
 
57
60
  } // namespace faiss
@@ -26,16 +26,20 @@ namespace faiss {
26
26
 
27
27
  IndexPreTransform::IndexPreTransform() : index(nullptr), own_fields(false) {}
28
28
 
29
- IndexPreTransform::IndexPreTransform(Index* index)
30
- : Index(index->d, index->metric_type), index(index), own_fields(false) {
31
- is_trained = index->is_trained;
32
- ntotal = index->ntotal;
29
+ IndexPreTransform::IndexPreTransform(Index* index_in)
30
+ : Index(index_in->d, index_in->metric_type),
31
+ index(index_in),
32
+ own_fields(false) {
33
+ is_trained = index_in->is_trained;
34
+ ntotal = index_in->ntotal;
33
35
  }
34
36
 
35
- IndexPreTransform::IndexPreTransform(VectorTransform* ltrans, Index* index)
36
- : Index(index->d, index->metric_type), index(index), own_fields(false) {
37
- is_trained = index->is_trained;
38
- ntotal = index->ntotal;
37
+ IndexPreTransform::IndexPreTransform(VectorTransform* ltrans, Index* index_in)
38
+ : Index(index_in->d, index_in->metric_type),
39
+ index(index_in),
40
+ own_fields(false) {
41
+ is_trained = index_in->is_trained;
42
+ ntotal = index_in->ntotal;
39
43
  prepend_transform(ltrans);
40
44
  }
41
45
 
@@ -48,7 +52,7 @@ void IndexPreTransform::prepend_transform(VectorTransform* ltrans) {
48
52
 
49
53
  IndexPreTransform::~IndexPreTransform() {
50
54
  if (own_fields) {
51
- for (int i = 0; i < chain.size(); i++) {
55
+ for (size_t i = 0; i < chain.size(); i++) {
52
56
  delete chain[i];
53
57
  }
54
58
  delete index;
@@ -58,9 +62,9 @@ IndexPreTransform::~IndexPreTransform() {
58
62
  void IndexPreTransform::train(idx_t n, const float* x) {
59
63
  int last_untrained = 0;
60
64
  if (!index->is_trained) {
61
- last_untrained = chain.size();
65
+ last_untrained = static_cast<int>(chain.size());
62
66
  } else {
63
- for (int i = chain.size() - 1; i >= 0; i--) {
67
+ for (int i = static_cast<int>(chain.size()) - 1; i >= 0; i--) {
64
68
  if (!chain[i]->is_trained) {
65
69
  last_untrained = i;
66
70
  break;
@@ -76,7 +80,7 @@ void IndexPreTransform::train(idx_t n, const float* x) {
76
80
  }
77
81
 
78
82
  for (int i = 0; i <= last_untrained; i++) {
79
- if (i < chain.size()) {
83
+ if (i < static_cast<int>(chain.size())) {
80
84
  VectorTransform* ltrans = chain[i];
81
85
  if (!ltrans->is_trained) {
82
86
  if (verbose) {
@@ -119,13 +123,15 @@ const float* IndexPreTransform::apply_chain(idx_t n, const float* x) const {
119
123
  const float* prev_x = x;
120
124
  std::unique_ptr<const float[]> del;
121
125
 
122
- for (int i = 0; i < chain.size(); i++) {
126
+ for (size_t i = 0; i < chain.size(); i++) {
123
127
  float* xt = chain[i]->apply(n, prev_x);
124
128
  std::unique_ptr<const float[]> del2(xt);
125
129
  del2.swap(del);
126
130
  prev_x = xt;
127
131
  }
128
- del.release();
132
+ // Intentionally release ownership: caller takes ownership of the returned
133
+ // buffer
134
+ (void)del.release();
129
135
  return prev_x;
130
136
  }
131
137
 
@@ -134,7 +140,7 @@ void IndexPreTransform::reverse_chain(idx_t n, const float* xt, float* x)
134
140
  const float* next_x = xt;
135
141
  std::unique_ptr<const float[]> del;
136
142
 
137
- for (int i = chain.size() - 1; i >= 0; i--) {
143
+ for (int i = static_cast<int>(chain.size()) - 1; i >= 0; i--) {
138
144
  float* prev_x = (i == 0) ? x : new float[n * chain[i]->d_in];
139
145
  std::unique_ptr<const float[]> del2((prev_x == x) ? nullptr : prev_x);
140
146
  chain[i]->reverse_transform(n, next_x, prev_x);
@@ -305,7 +311,7 @@ void IndexPreTransform::check_compatible_for_merge(
305
311
  auto other = dynamic_cast<const IndexPreTransform*>(&otherIndex);
306
312
  FAISS_THROW_IF_NOT(other);
307
313
  FAISS_THROW_IF_NOT(chain.size() == other->chain.size());
308
- for (int i = 0; i < chain.size(); i++) {
314
+ for (size_t i = 0; i < chain.size(); i++) {
309
315
  chain[i]->check_identical(*other->chain[i]);
310
316
  }
311
317
  index->check_compatible_for_merge(*other->index);
@@ -318,8 +324,9 @@ struct PreTransformDistanceComputer : DistanceComputer {
318
324
  std::unique_ptr<DistanceComputer> sub_dc;
319
325
  std::unique_ptr<const float[]> query;
320
326
 
321
- explicit PreTransformDistanceComputer(const IndexPreTransform* index)
322
- : index(index), sub_dc(index->index->get_distance_computer()) {}
327
+ explicit PreTransformDistanceComputer(const IndexPreTransform* index_in)
328
+ : index(index_in),
329
+ sub_dc(index_in->index->get_distance_computer()) {}
323
330
 
324
331
  void set_query(const float* x) override {
325
332
  const float* xt = index->apply_chain(1, x);
@@ -26,7 +26,7 @@ struct IndexPreTransform : Index {
26
26
  std::vector<VectorTransform*> chain; ///! chain of transforms
27
27
  Index* index; ///! the sub-index
28
28
 
29
- bool own_fields; ///! whether pointers are deleted in destructor
29
+ bool own_fields = false; ///! whether pointers are deleted in destructor
30
30
 
31
31
  explicit IndexPreTransform(Index* index);
32
32
 
@@ -8,6 +8,7 @@
8
8
  #include <faiss/IndexRaBitQ.h>
9
9
 
10
10
  #include <faiss/impl/FaissAssert.h>
11
+ #include <faiss/impl/RaBitQUtils.h>
11
12
  #include <faiss/impl/ResultHandler.h>
12
13
  #include <memory>
13
14
 
@@ -16,10 +17,12 @@ namespace faiss {
16
17
  // Forward declaration from RaBitQuantizer.cpp
17
18
  struct RaBitQDistanceComputer;
18
19
 
20
+ using rabitq_utils::SignBitFactorsWithError;
21
+
19
22
  IndexRaBitQ::IndexRaBitQ() = default;
20
23
 
21
- IndexRaBitQ::IndexRaBitQ(idx_t d, MetricType metric, uint8_t nb_bits_in)
22
- : IndexFlatCodes(0, d, metric), rabitq(d, metric, nb_bits_in) {
24
+ IndexRaBitQ::IndexRaBitQ(idx_t d_in, MetricType metric, uint8_t nb_bits_in)
25
+ : IndexFlatCodes(0, d_in, metric), rabitq(d_in, metric, nb_bits_in) {
23
26
  // Update code size based on nb_bits
24
27
  code_size = rabitq.code_size;
25
28
 
@@ -29,14 +32,14 @@ IndexRaBitQ::IndexRaBitQ(idx_t d, MetricType metric, uint8_t nb_bits_in)
29
32
  void IndexRaBitQ::train(idx_t n, const float* x) {
30
33
  // compute a centroid
31
34
  std::vector<float> centroid(d, 0);
32
- for (size_t i = 0; i < n; i++) {
33
- for (size_t j = 0; j < d; j++) {
35
+ for (idx_t i = 0; i < n; i++) {
36
+ for (size_t j = 0; j < static_cast<size_t>(d); j++) {
34
37
  centroid[j] += x[i * d + j];
35
38
  }
36
39
  }
37
40
 
38
41
  if (n != 0) {
39
- for (size_t j = 0; j < d; j++) {
42
+ for (size_t j = 0; j < static_cast<size_t>(d); j++) {
40
43
  centroid[j] /= (float)n;
41
44
  }
42
45
  }
@@ -67,10 +70,10 @@ FlatCodesDistanceComputer* IndexRaBitQ::get_FlatCodesDistanceComputer() const {
67
70
  }
68
71
 
69
72
  FlatCodesDistanceComputer* IndexRaBitQ::get_quantized_distance_computer(
70
- const uint8_t qb,
71
- bool centered) const {
73
+ const uint8_t qb_in,
74
+ bool centered_in) const {
72
75
  FlatCodesDistanceComputer* dc =
73
- rabitq.get_distance_computer(qb, center.data(), centered);
76
+ rabitq.get_distance_computer(qb_in, center.data(), centered_in);
74
77
  dc->code_size = rabitq.code_size;
75
78
  dc->codes = codes.data();
76
79
  return dc;
@@ -99,19 +102,12 @@ struct Run_search_with_dc_res {
99
102
  index->get_quantized_distance_computer(qb, centered));
100
103
  SingleResultHandler resi(res);
101
104
  #pragma omp for
102
- for (int64_t q = 0; q < res.nq; q++) {
105
+ for (int64_t q = 0; q < static_cast<int64_t>(res.nq); q++) {
103
106
  resi.begin(q);
104
107
  dc_base->set_query(xq + d * q);
105
108
 
106
- // Stats tracking for multi-bit two-stage search only
107
- // n_1bit_evaluations: candidates evaluated using 1-bit lower
108
- // bound n_multibit_evaluations: candidates requiring full
109
- // multi-bit distance
110
- size_t local_1bit_evaluations = 0;
111
- size_t local_multibit_evaluations = 0;
112
-
113
109
  if (ex_bits == 0) {
114
- // 1-bit: Standard single-stage search (no stats tracking)
110
+ // 1-bit: Standard single-stage search
115
111
  for (size_t i = 0; i < ntotal; i++) {
116
112
  if (res.is_in_selection(i)) {
117
113
  float dis = (*dc_base)(i);
@@ -130,7 +126,6 @@ struct Run_search_with_dc_res {
130
126
  dc != nullptr,
131
127
  "Failed to cast to RaBitQDistanceComputer for two-stage search");
132
128
 
133
- // Use appropriate comparison based on metric type
134
129
  bool is_similarity =
135
130
  is_similarity_metric(index->metric_type);
136
131
 
@@ -139,24 +134,24 @@ struct Run_search_with_dc_res {
139
134
  const uint8_t* code =
140
135
  index->codes.data() + i * index->code_size;
141
136
 
142
- local_1bit_evaluations++;
143
-
144
- // Stage 1: Compute 1-bit lower bound
145
- float lower_bound = dc->lower_bound_distance(code);
146
-
147
- // Stage 2: Adaptive filtering using threshold
148
- // For L2 (min-heap): filter if lower_bound <
149
- // resi.threshold For IP (max-heap): filter if
150
- // lower_bound > resi.threshold Note: Using
151
- // resi.threshold directly (not cached) enables more
152
- // aggressive filtering as the heap is updated
153
- bool should_refine = is_similarity
154
- ? (lower_bound > resi.threshold)
155
- : (lower_bound < resi.threshold);
156
-
137
+ float est_distance =
138
+ dc->distance_to_code_1bit(code);
139
+
140
+ size_t code_size_base = (index->d + 7) / 8;
141
+ const rabitq_utils::SignBitFactorsWithError*
142
+ base_fac = reinterpret_cast<
143
+ const rabitq_utils::
144
+ SignBitFactorsWithError*>(
145
+ code + code_size_base);
146
+
147
+ bool should_refine =
148
+ rabitq_utils::should_refine_candidate(
149
+ est_distance,
150
+ base_fac->f_error,
151
+ dc->g_error,
152
+ resi.threshold,
153
+ is_similarity);
157
154
  if (should_refine) {
158
- local_multibit_evaluations++;
159
- // Compute full multi-bit distance
160
155
  float dist_full =
161
156
  dc->distance_to_code_full(code);
162
157
  resi.add_result(dist_full, i);
@@ -165,13 +160,6 @@ struct Run_search_with_dc_res {
165
160
  }
166
161
  }
167
162
 
168
- // Update global stats atomically
169
- #pragma omp atomic
170
- rabitq_stats.n_1bit_evaluations += local_1bit_evaluations;
171
- #pragma omp atomic
172
- rabitq_stats.n_multibit_evaluations +=
173
- local_multibit_evaluations;
174
-
175
163
  resi.end();
176
164
  }
177
165
  }
@@ -211,7 +199,7 @@ void IndexRaBitQ::search(
211
199
  }
212
200
 
213
201
  void IndexRaBitQ::range_search(
214
- idx_t n,
202
+ idx_t /*n*/,
215
203
  const float* x,
216
204
  float radius,
217
205
  RangeSearchResult* result,
@@ -8,13 +8,12 @@
8
8
  #pragma once
9
9
 
10
10
  #include <faiss/IndexFlatCodes.h>
11
- #include <faiss/impl/RaBitQStats.h>
12
11
  #include <faiss/impl/RaBitQuantizer.h>
13
12
 
14
13
  namespace faiss {
15
14
 
16
15
  struct RaBitQSearchParameters : SearchParameters {
17
- uint8_t qb = 0;
16
+ uint8_t qb = 4;
18
17
  bool centered = false;
19
18
  };
20
19
 
@@ -26,7 +25,9 @@ struct IndexRaBitQ : IndexFlatCodes {
26
25
 
27
26
  // the default number of bits to quantize a query with.
28
27
  // use '0' to disable quantization and use raw fp32 values.
29
- uint8_t qb = 0;
28
+ // Note: qb=0 is NOT supported by FastScan variants, which require
29
+ // quantized queries for SIMD lookup table construction.
30
+ uint8_t qb = 4;
30
31
 
31
32
  // quantize the query with a zero-centered scalar quantizer.
32
33
  bool centered = false;