faiss 0.6.0 → 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 (361) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/ext/faiss/extconf.rb +2 -1
  4. data/ext/faiss/{index_rb.cpp → index.cpp} +1 -1
  5. data/ext/faiss/index_binary.cpp +1 -1
  6. data/ext/faiss/kmeans.cpp +1 -1
  7. data/ext/faiss/pca_matrix.cpp +1 -1
  8. data/ext/faiss/product_quantizer.cpp +1 -1
  9. data/ext/faiss/{utils_rb.cpp → utils.cpp} +1 -1
  10. data/lib/faiss/version.rb +1 -1
  11. data/vendor/faiss/faiss/AutoTune.cpp +93 -80
  12. data/vendor/faiss/faiss/Clustering.cpp +39 -240
  13. data/vendor/faiss/faiss/Clustering.h +6 -0
  14. data/vendor/faiss/faiss/IVFlib.cpp +41 -21
  15. data/vendor/faiss/faiss/Index.cpp +6 -5
  16. data/vendor/faiss/faiss/Index.h +5 -5
  17. data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
  18. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +49 -37
  19. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
  20. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
  21. data/vendor/faiss/faiss/IndexBinary.cpp +5 -3
  22. data/vendor/faiss/faiss/IndexBinary.h +4 -4
  23. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +1 -1
  24. data/vendor/faiss/faiss/IndexBinaryFlat.h +1 -1
  25. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -4
  26. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +84 -92
  27. data/vendor/faiss/faiss/IndexBinaryHNSW.h +9 -3
  28. data/vendor/faiss/faiss/IndexBinaryHash.cpp +45 -236
  29. data/vendor/faiss/faiss/IndexBinaryHash.h +6 -6
  30. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +87 -415
  31. data/vendor/faiss/faiss/IndexFastScan.cpp +72 -109
  32. data/vendor/faiss/faiss/IndexFastScan.h +25 -23
  33. data/vendor/faiss/faiss/IndexFlat.cpp +27 -20
  34. data/vendor/faiss/faiss/IndexFlat.h +21 -18
  35. data/vendor/faiss/faiss/IndexFlatCodes.cpp +42 -19
  36. data/vendor/faiss/faiss/IndexHNSW.cpp +283 -145
  37. data/vendor/faiss/faiss/IndexHNSW.h +16 -2
  38. data/vendor/faiss/faiss/IndexIDMap.cpp +25 -21
  39. data/vendor/faiss/faiss/IndexIDMap.h +9 -7
  40. data/vendor/faiss/faiss/IndexIVF.cpp +465 -362
  41. data/vendor/faiss/faiss/IndexIVF.h +33 -12
  42. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +77 -74
  43. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +96 -93
  44. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +4 -1
  45. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +357 -238
  46. data/vendor/faiss/faiss/IndexIVFFastScan.h +42 -41
  47. data/vendor/faiss/faiss/IndexIVFFlat.cpp +36 -68
  48. data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
  49. data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +53 -30
  50. data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
  51. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
  52. data/vendor/faiss/faiss/IndexIVFPQ.cpp +71 -843
  53. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +151 -121
  54. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
  55. data/vendor/faiss/faiss/IndexIVFPQR.cpp +21 -17
  56. data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +26 -39
  57. data/vendor/faiss/faiss/IndexIVFRaBitQ.h +2 -1
  58. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +475 -476
  59. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +248 -93
  60. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
  61. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
  62. data/vendor/faiss/faiss/IndexLSH.cpp +36 -19
  63. data/vendor/faiss/faiss/IndexLattice.cpp +13 -13
  64. data/vendor/faiss/faiss/IndexNNDescent.cpp +36 -21
  65. data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
  66. data/vendor/faiss/faiss/IndexNSG.cpp +39 -23
  67. data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +31 -11
  68. data/vendor/faiss/faiss/IndexPQ.cpp +128 -221
  69. data/vendor/faiss/faiss/IndexPQ.h +3 -2
  70. data/vendor/faiss/faiss/IndexPQFastScan.cpp +20 -14
  71. data/vendor/faiss/faiss/IndexPQFastScan.h +3 -0
  72. data/vendor/faiss/faiss/IndexPreTransform.cpp +25 -18
  73. data/vendor/faiss/faiss/IndexPreTransform.h +1 -1
  74. data/vendor/faiss/faiss/IndexRaBitQ.cpp +11 -36
  75. data/vendor/faiss/faiss/IndexRaBitQ.h +2 -1
  76. data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +41 -277
  77. data/vendor/faiss/faiss/IndexRaBitQFastScan.h +183 -27
  78. data/vendor/faiss/faiss/IndexRefine.cpp +30 -25
  79. data/vendor/faiss/faiss/IndexRefine.h +4 -4
  80. data/vendor/faiss/faiss/IndexReplicas.cpp +6 -6
  81. data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +15 -14
  82. data/vendor/faiss/faiss/IndexRowwiseMinMax.h +1 -1
  83. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +82 -14
  84. data/vendor/faiss/faiss/IndexShards.cpp +10 -9
  85. data/vendor/faiss/faiss/IndexShardsIVF.cpp +21 -15
  86. data/vendor/faiss/faiss/MatrixStats.cpp +5 -4
  87. data/vendor/faiss/faiss/MetaIndexes.cpp +19 -17
  88. data/vendor/faiss/faiss/MetaIndexes.h +1 -1
  89. data/vendor/faiss/faiss/MetricType.h +14 -7
  90. data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
  91. data/vendor/faiss/faiss/SuperKMeans.h +97 -0
  92. data/vendor/faiss/faiss/VectorTransform.cpp +237 -149
  93. data/vendor/faiss/faiss/VectorTransform.h +16 -16
  94. data/vendor/faiss/faiss/build.cpp +23 -0
  95. data/vendor/faiss/faiss/build.h +15 -0
  96. data/vendor/faiss/faiss/clone_index.cpp +48 -47
  97. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +47 -47
  98. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +11 -0
  99. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +38 -38
  100. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +11 -0
  101. data/vendor/faiss/faiss/factory_tools.cpp +5 -0
  102. data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -5
  103. data/vendor/faiss/faiss/gpu/GpuResources.h +1 -1
  104. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +9 -9
  105. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +4 -3
  106. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +46 -0
  107. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +56 -0
  108. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +78 -1
  109. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +72 -0
  110. data/vendor/faiss/faiss/gpu/test/TestUtils.h +23 -0
  111. data/vendor/faiss/faiss/gpu/utils/CuvsFilterConvert.h +1 -1
  112. data/vendor/faiss/faiss/gpu/utils/CuvsUtils.h +21 -10
  113. data/vendor/faiss/faiss/gpu_metal/GpuIndexFlat.h +22 -0
  114. data/vendor/faiss/faiss/gpu_metal/MetalCloner.h +35 -0
  115. data/vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h +40 -0
  116. data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +51 -0
  117. data/vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h +65 -0
  118. data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +66 -0
  119. data/vendor/faiss/faiss/gpu_metal/MetalResources.h +79 -0
  120. data/vendor/faiss/faiss/gpu_metal/StandardMetalResources.h +35 -0
  121. data/vendor/faiss/faiss/impl/AdSampling.cpp +103 -0
  122. data/vendor/faiss/faiss/impl/AdSampling.h +35 -0
  123. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +29 -25
  124. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +1 -0
  125. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +10 -9
  126. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +3 -0
  127. data/vendor/faiss/faiss/impl/ClusteringHelpers.cpp +244 -0
  128. data/vendor/faiss/faiss/impl/ClusteringHelpers.h +94 -0
  129. data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +16 -16
  130. data/vendor/faiss/faiss/impl/CodePacker.cpp +3 -3
  131. data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +1 -1
  132. data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
  133. data/vendor/faiss/faiss/impl/FaissAssert.h +6 -3
  134. data/vendor/faiss/faiss/impl/FaissException.h +50 -3
  135. data/vendor/faiss/faiss/impl/HNSW.cpp +92 -317
  136. data/vendor/faiss/faiss/impl/HNSW.h +13 -34
  137. data/vendor/faiss/faiss/impl/IDSelector.cpp +15 -11
  138. data/vendor/faiss/faiss/impl/IDSelector.h +8 -8
  139. data/vendor/faiss/faiss/impl/InvertedListScannerStats.h +26 -0
  140. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +82 -77
  141. data/vendor/faiss/faiss/impl/NNDescent.cpp +62 -25
  142. data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
  143. data/vendor/faiss/faiss/impl/NSG.cpp +38 -21
  144. data/vendor/faiss/faiss/impl/NSG.h +4 -4
  145. data/vendor/faiss/faiss/impl/Panorama.cpp +23 -6
  146. data/vendor/faiss/faiss/impl/Panorama.h +258 -87
  147. data/vendor/faiss/faiss/impl/PdxLayout.cpp +93 -0
  148. data/vendor/faiss/faiss/impl/PdxLayout.h +41 -0
  149. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +46 -32
  150. data/vendor/faiss/faiss/impl/PolysemousTraining.h +3 -3
  151. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +35 -35
  152. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +21 -16
  153. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +30 -23
  154. data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
  155. data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +55 -49
  156. data/vendor/faiss/faiss/impl/RaBitQUtils.h +65 -0
  157. data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +296 -283
  158. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +26 -23
  159. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
  160. data/vendor/faiss/faiss/impl/ResultHandler.h +99 -75
  161. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +52 -4
  162. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +27 -1
  163. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
  164. data/vendor/faiss/faiss/impl/VisitedTable.h +7 -0
  165. data/vendor/faiss/faiss/impl/approx_topk/approx_topk.h +276 -0
  166. data/vendor/faiss/faiss/impl/approx_topk/avx2.cpp +68 -0
  167. data/vendor/faiss/faiss/{utils → impl}/approx_topk/generic.h +15 -8
  168. data/vendor/faiss/faiss/impl/approx_topk/neon.cpp +68 -0
  169. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab-inl.h +169 -0
  170. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab.h +117 -0
  171. data/vendor/faiss/faiss/impl/approx_topk/simdlib256-inl.h +146 -0
  172. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h +73 -0
  173. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHash_impl.h +270 -0
  174. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +460 -0
  175. data/vendor/faiss/faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h +159 -0
  176. data/vendor/faiss/faiss/impl/binary_hamming/IndexPQ_impl.h +92 -0
  177. data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +26 -0
  178. data/vendor/faiss/faiss/impl/binary_hamming/avx512.cpp +26 -0
  179. data/vendor/faiss/faiss/impl/binary_hamming/dispatch.h +143 -0
  180. data/vendor/faiss/faiss/impl/binary_hamming/neon.cpp +26 -0
  181. data/vendor/faiss/faiss/impl/binary_hamming/rvv.cpp +26 -0
  182. data/vendor/faiss/faiss/impl/expanded_scanners.h +8 -3
  183. data/vendor/faiss/faiss/impl/{FastScanDistancePostProcessing.h → fast_scan/FastScanDistancePostProcessing.h} +13 -6
  184. data/vendor/faiss/faiss/impl/{LookupTableScaler.h → fast_scan/LookupTableScaler.h} +16 -5
  185. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops.h +237 -0
  186. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops_512.h +185 -0
  187. data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +229 -0
  188. data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +268 -0
  189. data/vendor/faiss/faiss/impl/{pq4_fast_scan.cpp → fast_scan/fast_scan.cpp} +169 -2
  190. data/vendor/faiss/faiss/impl/fast_scan/fast_scan.h +341 -0
  191. data/vendor/faiss/faiss/impl/fast_scan/impl-avx2.cpp +36 -0
  192. data/vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp +40 -0
  193. data/vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp +120 -0
  194. data/vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp +104 -0
  195. data/vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h +213 -0
  196. data/vendor/faiss/faiss/impl/{pq4_fast_scan_search_qbs.cpp → fast_scan/kernels_simd512.h} +26 -356
  197. data/vendor/faiss/faiss/impl/fast_scan/rabitq_dispatching.h +90 -0
  198. data/vendor/faiss/faiss/impl/fast_scan/rabitq_result_handler.h +108 -0
  199. data/vendor/faiss/faiss/impl/{simd_result_handlers.h → fast_scan/simd_result_handlers.h} +282 -134
  200. data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +54 -0
  201. data/vendor/faiss/faiss/impl/hnsw/LockVector.h +64 -0
  202. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +91 -0
  203. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +64 -0
  204. data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +104 -0
  205. data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +111 -0
  206. data/vendor/faiss/faiss/impl/index_read.cpp +1132 -45
  207. data/vendor/faiss/faiss/impl/index_read_utils.h +1 -1
  208. data/vendor/faiss/faiss/impl/index_write.cpp +95 -13
  209. data/vendor/faiss/faiss/impl/io.cpp +6 -6
  210. data/vendor/faiss/faiss/impl/io_macros.h +33 -16
  211. data/vendor/faiss/faiss/impl/kmeans1d.cpp +10 -10
  212. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +37 -23
  213. data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
  214. data/vendor/faiss/faiss/impl/mapped_io.cpp +6 -6
  215. data/vendor/faiss/faiss/impl/platform_macros.h +11 -4
  216. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +549 -0
  217. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +245 -0
  218. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h +105 -0
  219. data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +106 -0
  220. data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +21 -0
  221. data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +21 -0
  222. data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +21 -0
  223. data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx2.cpp → pq_code_distance-avx2.h} +9 -13
  224. data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx512.cpp → pq_code_distance-avx512.h} +9 -57
  225. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +29 -111
  226. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h +96 -0
  227. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +238 -5
  228. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp +5 -7
  229. data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +68 -0
  230. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +311 -477
  231. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
  232. data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +1 -1
  233. data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +3 -2
  234. data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +102 -11
  235. data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +27 -1
  236. data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +3 -3
  237. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +148 -0
  238. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +167 -0
  239. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +59 -0
  240. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +163 -0
  241. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +311 -0
  242. data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +192 -8
  243. data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +12 -0
  244. data/vendor/faiss/faiss/impl/simd_dispatch.h +100 -66
  245. data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
  246. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +264 -172
  247. data/vendor/faiss/faiss/impl/simdlib/simdlib_avx512.h +414 -0
  248. data/vendor/faiss/faiss/impl/simdlib/simdlib_dispatch.h +44 -0
  249. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_emulated.h +231 -166
  250. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_neon.h +270 -218
  251. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_ppc64.h +201 -160
  252. data/vendor/faiss/faiss/impl/svs_io.cpp +12 -3
  253. data/vendor/faiss/faiss/impl/svs_io.h +8 -2
  254. data/vendor/faiss/faiss/index_factory.cpp +86 -18
  255. data/vendor/faiss/faiss/index_io.h +24 -0
  256. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +66 -16
  257. data/vendor/faiss/faiss/invlists/DirectMap.cpp +24 -14
  258. data/vendor/faiss/faiss/invlists/DirectMap.h +4 -3
  259. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +157 -73
  260. data/vendor/faiss/faiss/invlists/InvertedLists.h +86 -23
  261. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +4 -4
  262. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +13 -13
  263. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
  264. data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +1 -1
  265. data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
  266. data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +350 -0
  267. data/vendor/faiss/faiss/svs/IndexSVSIVF.h +128 -0
  268. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.cpp +40 -0
  269. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.h +43 -0
  270. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +225 -0
  271. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.h +71 -0
  272. data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +25 -1
  273. data/vendor/faiss/faiss/svs/IndexSVSVamana.h +18 -2
  274. data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +1 -1
  275. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +12 -3
  276. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +7 -2
  277. data/vendor/faiss/faiss/utils/Heap.cpp +10 -10
  278. data/vendor/faiss/faiss/utils/NeuralNet.cpp +47 -36
  279. data/vendor/faiss/faiss/utils/NeuralNet.h +1 -1
  280. data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +10 -4
  281. data/vendor/faiss/faiss/utils/distances.cpp +390 -560
  282. data/vendor/faiss/faiss/utils/distances.h +20 -1
  283. data/vendor/faiss/faiss/utils/distances_dispatch.h +117 -37
  284. data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +8 -7
  285. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +33 -14
  286. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +12 -1
  287. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +16 -293
  288. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp +57 -0
  289. data/vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h +290 -0
  290. data/vendor/faiss/faiss/utils/distances_simd.cpp +5 -177
  291. data/vendor/faiss/faiss/utils/extra_distances.cpp +9 -8
  292. data/vendor/faiss/faiss/utils/extra_distances.h +32 -6
  293. data/vendor/faiss/faiss/utils/hamming-inl.h +13 -11
  294. data/vendor/faiss/faiss/utils/hamming.cpp +66 -517
  295. data/vendor/faiss/faiss/utils/hamming.h +92 -2
  296. data/vendor/faiss/faiss/utils/hamming_distance/common.h +287 -10
  297. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +15 -0
  298. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +15 -0
  299. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h +142 -0
  300. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +234 -0
  301. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-generic.h +368 -0
  302. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h +322 -0
  303. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-rvv.h +39 -0
  304. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer.h +146 -0
  305. data/vendor/faiss/faiss/utils/hamming_distance/hamming_impl.h +481 -0
  306. data/vendor/faiss/faiss/utils/hamming_distance/hamming_neon.cpp +15 -0
  307. data/vendor/faiss/faiss/utils/hamming_distance/hamming_rvv.cpp +15 -0
  308. data/vendor/faiss/faiss/utils/partitioning.cpp +66 -987
  309. data/vendor/faiss/faiss/utils/partitioning.h +31 -0
  310. data/vendor/faiss/faiss/utils/popcount.h +29 -0
  311. data/vendor/faiss/faiss/utils/pq_code_distance.h +2 -2
  312. data/vendor/faiss/faiss/utils/prefetch.h +2 -2
  313. data/vendor/faiss/faiss/utils/quantize_lut.cpp +30 -30
  314. data/vendor/faiss/faiss/utils/quantize_lut.h +1 -1
  315. data/vendor/faiss/faiss/utils/rabitq_simd.h +57 -536
  316. data/vendor/faiss/faiss/utils/random.cpp +6 -6
  317. data/vendor/faiss/faiss/utils/simd_impl/IVFFlatScanner-inl.h +51 -0
  318. data/vendor/faiss/faiss/utils/simd_impl/distances_aarch64.cpp +5 -1
  319. data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +213 -4
  320. data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +163 -10
  321. data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +250 -4
  322. data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +7 -4
  323. data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +189 -0
  324. data/vendor/faiss/faiss/utils/simd_impl/distances_simdlib256.h +195 -0
  325. data/vendor/faiss/faiss/utils/simd_impl/distances_sse-inl.h +2 -1
  326. data/vendor/faiss/faiss/utils/{distances_fused/simdlib_based.h → simd_impl/exhaustive_L2sqr_blas_cmax.h} +5 -10
  327. data/vendor/faiss/faiss/utils/simd_impl/hamming_impl.h +481 -0
  328. data/vendor/faiss/faiss/utils/simd_impl/partitioning_avx2.cpp +14 -0
  329. data/vendor/faiss/faiss/utils/simd_impl/partitioning_neon.cpp +14 -0
  330. data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +1085 -0
  331. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +355 -0
  332. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +477 -0
  333. data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +55 -0
  334. data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +55 -0
  335. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h +32 -0
  336. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels.h +43 -0
  337. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp +57 -0
  338. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp +45 -0
  339. data/vendor/faiss/faiss/utils/simd_levels.cpp +17 -5
  340. data/vendor/faiss/faiss/utils/simd_levels.h +93 -1
  341. data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
  342. data/vendor/faiss/faiss/utils/utils.cpp +5 -5
  343. data/vendor/faiss/faiss/utils/utils.h +3 -3
  344. metadata +119 -34
  345. data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
  346. data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
  347. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -224
  348. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -230
  349. data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +0 -84
  350. data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +0 -196
  351. data/vendor/faiss/faiss/utils/approx_topk/mode.h +0 -34
  352. data/vendor/faiss/faiss/utils/distances_fused/avx512.h +0 -36
  353. data/vendor/faiss/faiss/utils/extra_distances-inl.h +0 -235
  354. data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +0 -462
  355. data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +0 -490
  356. data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +0 -449
  357. data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +0 -87
  358. data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +0 -524
  359. data/vendor/faiss/faiss/utils/simdlib.h +0 -42
  360. data/vendor/faiss/faiss/utils/simdlib_avx512.h +0 -365
  361. /data/ext/faiss/{utils_rb.h → utils.h} +0 -0
@@ -11,6 +11,7 @@
11
11
 
12
12
  #include <cinttypes>
13
13
  #include <cstdio>
14
+ #include <memory>
14
15
  #include <unordered_set>
15
16
 
16
17
  #include <faiss/utils/hamming.h>
@@ -19,6 +20,16 @@
19
20
  #include <faiss/impl/AuxIndexStructures.h>
20
21
  #include <faiss/impl/FaissAssert.h>
21
22
 
23
+ #include <faiss/impl/simd_dispatch.h>
24
+
25
+ // Scalar (NONE) fallback for dynamic dispatch
26
+ #define THE_SIMD_LEVEL SIMDLevel::NONE
27
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
28
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
29
+ #include <faiss/impl/binary_hamming/IndexBinaryHash_impl.h>
30
+ #include <faiss/utils/hamming_distance/hamming_computer-generic.h>
31
+ #undef THE_SIMD_LEVEL
32
+
22
33
  namespace faiss {
23
34
 
24
35
  void IndexBinaryHash::InvertedList::add(
@@ -29,8 +40,8 @@ void IndexBinaryHash::InvertedList::add(
29
40
  vecs.insert(vecs.end(), code, code + code_size);
30
41
  }
31
42
 
32
- IndexBinaryHash::IndexBinaryHash(int d, int b)
33
- : IndexBinary(d), b(b), nflip(0) {
43
+ IndexBinaryHash::IndexBinaryHash(int d_, int b_)
44
+ : IndexBinary(d_), b(b_), nflip(0) {
34
45
  is_trained = true;
35
46
  }
36
47
 
@@ -51,151 +62,20 @@ void IndexBinaryHash::add_with_ids(
51
62
  idx_t n,
52
63
  const uint8_t* x,
53
64
  const idx_t* xids) {
54
- uint64_t mask = ((uint64_t)1 << b) - 1;
55
65
  // simplistic add function. Cannot really be parallelized.
56
66
 
57
67
  for (idx_t i = 0; i < n; i++) {
58
68
  idx_t id = xids ? xids[i] : ntotal + i;
59
69
  const uint8_t* xi = x + i * code_size;
60
- idx_t hash = *((uint64_t*)xi) & mask;
70
+ BitstringReader br(xi, code_size);
71
+ idx_t hash = br.read(b);
61
72
  invlists[hash].add(id, code_size, xi);
62
73
  }
63
74
  ntotal += n;
64
75
  }
65
76
 
66
- namespace {
67
-
68
- /** Enumerate all bit vectors of size nbit with up to maxflip 1s
69
- * test in P127257851 P127258235
70
- */
71
- struct FlipEnumerator {
72
- int nbit, nflip, maxflip;
73
- uint64_t mask, x;
74
-
75
- FlipEnumerator(int nbit, int maxflip) : nbit(nbit), maxflip(maxflip) {
76
- nflip = 0;
77
- mask = 0;
78
- x = 0;
79
- }
80
-
81
- bool next() {
82
- if (x == mask) {
83
- if (nflip == maxflip) {
84
- return false;
85
- }
86
- // increase Hamming radius
87
- nflip++;
88
- mask = (((uint64_t)1 << nflip) - 1);
89
- x = mask << (nbit - nflip);
90
- return true;
91
- }
92
-
93
- int i = __builtin_ctzll(x);
94
-
95
- if (i > 0) {
96
- x ^= (uint64_t)3 << (i - 1);
97
- } else {
98
- // nb of LSB 1s
99
- int n1 = __builtin_ctzll(~x);
100
- // clear them
101
- x &= ((uint64_t)(-1) << n1);
102
- int n2 = __builtin_ctzll(x);
103
- x ^= (((uint64_t)1 << (n1 + 2)) - 1) << (n2 - n1 - 1);
104
- }
105
- return true;
106
- }
107
- };
108
-
109
- struct RangeSearchResults {
110
- int radius;
111
- RangeQueryResult& qres;
112
-
113
- inline void add(float dis, idx_t id) {
114
- if (dis < radius) {
115
- qres.add(dis, id);
116
- }
117
- }
118
- };
119
-
120
- struct KnnSearchResults {
121
- // heap params
122
- idx_t k;
123
- int32_t* heap_sim;
124
- idx_t* heap_ids;
125
-
126
- using C = CMax<int, idx_t>;
127
-
128
- inline void add(float dis, idx_t id) {
129
- if (dis < heap_sim[0]) {
130
- heap_replace_top<C>(k, heap_sim, heap_ids, dis, id);
131
- }
132
- }
133
- };
134
-
135
- template <class HammingComputer, class SearchResults>
136
- void search_single_query_template(
137
- const IndexBinaryHash& index,
138
- const uint8_t* q,
139
- SearchResults& res,
140
- size_t& n0,
141
- size_t& nlist,
142
- size_t& ndis) {
143
- size_t code_size = index.code_size;
144
- uint64_t mask = ((uint64_t)1 << index.b) - 1;
145
- uint64_t qhash = *((uint64_t*)q) & mask;
146
- HammingComputer hc(q, code_size);
147
- FlipEnumerator fe(index.b, index.nflip);
148
-
149
- // loop over neighbors that are at most at nflip bits
150
- do {
151
- uint64_t hash = qhash ^ fe.x;
152
- auto it = index.invlists.find(hash);
153
-
154
- if (it == index.invlists.end()) {
155
- continue;
156
- }
157
-
158
- const IndexBinaryHash::InvertedList& il = it->second;
159
-
160
- size_t nv = il.ids.size();
161
-
162
- if (nv == 0) {
163
- n0++;
164
- } else {
165
- const uint8_t* codes = il.vecs.data();
166
- for (size_t i = 0; i < nv; i++) {
167
- int dis = hc.hamming(codes);
168
- res.add(dis, il.ids[i]);
169
- codes += code_size;
170
- }
171
- ndis += nv;
172
- nlist++;
173
- }
174
- } while (fe.next());
175
- }
176
-
177
- struct Run_search_single_query {
178
- using T = void;
179
- template <class HammingComputer, class... Types>
180
- T f(Types*... args) {
181
- search_single_query_template<HammingComputer>(*args...);
182
- }
183
- };
184
-
185
- template <class SearchResults>
186
- void search_single_query(
187
- const IndexBinaryHash& index,
188
- const uint8_t* q,
189
- SearchResults& res,
190
- size_t& n0,
191
- size_t& nlist,
192
- size_t& ndis) {
193
- Run_search_single_query r;
194
- dispatch_HammingComputer(
195
- index.code_size, r, &index, &q, &res, &n0, &nlist, &ndis);
196
- }
197
-
198
- } // anonymous namespace
77
+ // search_single_query_template and helpers are now in
78
+ // impl/binary_hamming/IndexBinaryHash_impl.h (compiled per-ISA)
199
79
 
200
80
  void IndexBinaryHash::range_search(
201
81
  idx_t n,
@@ -214,10 +94,12 @@ void IndexBinaryHash::range_search(
214
94
  #pragma omp for
215
95
  for (idx_t i = 0; i < n; i++) { // loop queries
216
96
  RangeQueryResult& qres = pres.new_result(i);
217
- RangeSearchResults res = {radius, qres};
218
97
  const uint8_t* q = x + i * code_size;
219
98
 
220
- search_single_query(*this, q, res, n0, nlist, ndis);
99
+ with_simd_level([&]<SIMDLevel SL>() {
100
+ binary_hash_range_search_fixSL<SL>(
101
+ *this, q, radius, qres, n0, nlist, ndis);
102
+ });
221
103
  }
222
104
  pres.finalize();
223
105
  }
@@ -247,10 +129,12 @@ void IndexBinaryHash::search(
247
129
  idx_t* idxi = labels + k * i;
248
130
 
249
131
  heap_heapify<HeapForL2>(k, simi, idxi);
250
- KnnSearchResults res = {k, simi, idxi};
251
132
  const uint8_t* q = x + i * code_size;
252
133
 
253
- search_single_query(*this, q, res, n0, nlist, ndis);
134
+ with_simd_level([&]<SIMDLevel SL>() {
135
+ binary_hash_knn_search_fixSL<SL>(
136
+ *this, q, k, simi, idxi, n0, nlist, ndis);
137
+ });
254
138
 
255
139
  heap_reorder<HeapForL2>(k, simi, idxi);
256
140
  }
@@ -285,19 +169,15 @@ IndexBinaryHashStats indexBinaryHash_stats;
285
169
  * IndexBinaryMultiHash implementation
286
170
  ******************************************************/
287
171
 
288
- IndexBinaryMultiHash::IndexBinaryMultiHash(int d, int nhash, int b)
289
- : IndexBinary(d),
290
- storage(new IndexBinaryFlat(d)),
291
- own_fields(true),
292
- maps(nhash),
293
- nhash(nhash),
294
- b(b),
295
- nflip(0) {
296
- FAISS_THROW_IF_NOT(nhash * b <= d);
172
+ IndexBinaryMultiHash::IndexBinaryMultiHash(int d_, int nhash_, int b_)
173
+ : IndexBinary(d_), maps(nhash_), nhash(nhash_), b(b_), nflip(0) {
174
+ FAISS_THROW_IF_NOT(nhash_ * b_ <= d_);
175
+ storage = std::make_unique<IndexBinaryFlat>(d_).release();
176
+ own_fields = true;
297
177
  }
298
178
 
299
179
  IndexBinaryMultiHash::IndexBinaryMultiHash()
300
- : storage(nullptr), own_fields(true), nhash(0), b(0), nflip(0) {}
180
+ : storage(nullptr), nhash(0), b(0), nflip(0) {}
301
181
 
302
182
  IndexBinaryMultiHash::~IndexBinaryMultiHash() {
303
183
  if (own_fields) {
@@ -308,7 +188,7 @@ IndexBinaryMultiHash::~IndexBinaryMultiHash() {
308
188
  void IndexBinaryMultiHash::reset() {
309
189
  storage->reset();
310
190
  ntotal = 0;
311
- for (auto map : maps) {
191
+ for (auto& map : maps) {
312
192
  map.clear();
313
193
  }
314
194
  }
@@ -316,94 +196,19 @@ void IndexBinaryMultiHash::reset() {
316
196
  void IndexBinaryMultiHash::add(idx_t n, const uint8_t* x) {
317
197
  storage->add(n, x);
318
198
  // populate maps
319
- uint64_t mask = ((uint64_t)1 << b) - 1;
320
-
321
199
  for (idx_t i = 0; i < n; i++) {
322
200
  const uint8_t* xi = x + i * code_size;
323
- int ho = 0;
201
+ BitstringReader br(xi, code_size);
324
202
  for (int h = 0; h < nhash; h++) {
325
- uint64_t hash = *(uint64_t*)(xi + (ho >> 3)) >> (ho & 7);
326
- hash &= mask;
203
+ uint64_t hash = br.read(b);
327
204
  maps[h][hash].push_back(i + ntotal);
328
- ho += b;
329
205
  }
330
206
  }
331
207
  ntotal += n;
332
208
  }
333
209
 
334
- namespace {
335
-
336
- template <class HammingComputer, class SearchResults>
337
- static void verify_shortlist(
338
- const IndexBinaryFlat* index,
339
- const uint8_t* q,
340
- const std::unordered_set<idx_t>& shortlist,
341
- SearchResults& res) {
342
- size_t code_size = index->code_size;
343
-
344
- HammingComputer hc(q, code_size);
345
- const uint8_t* codes = index->xb.data();
346
-
347
- for (auto i : shortlist) {
348
- int dis = hc.hamming(codes + i * code_size);
349
- res.add(dis, i);
350
- }
351
- }
352
-
353
- struct Run_verify_shortlist {
354
- using T = void;
355
- template <class HammingComputer, class... Types>
356
- void f(Types... args) {
357
- verify_shortlist<HammingComputer>(args...);
358
- }
359
- };
360
-
361
- template <class SearchResults>
362
- void search_1_query_multihash(
363
- const IndexBinaryMultiHash& index,
364
- const uint8_t* xi,
365
- SearchResults& res,
366
- size_t& n0,
367
- size_t& nlist,
368
- size_t& ndis) {
369
- std::unordered_set<idx_t> shortlist;
370
- int b = index.b;
371
- uint64_t mask = ((uint64_t)1 << b) - 1;
372
-
373
- int ho = 0;
374
- for (int h = 0; h < index.nhash; h++) {
375
- uint64_t qhash = *(uint64_t*)(xi + (ho >> 3)) >> (ho & 7);
376
- qhash &= mask;
377
- const IndexBinaryMultiHash::Map& map = index.maps[h];
378
-
379
- FlipEnumerator fe(index.b, index.nflip);
380
- // loop over neighbors that are at most at nflip bits
381
- do {
382
- uint64_t hash = qhash ^ fe.x;
383
- auto it = map.find(hash);
384
-
385
- if (it != map.end()) {
386
- const std::vector<idx_t>& v = it->second;
387
- for (auto i : v) {
388
- shortlist.insert(i);
389
- }
390
- nlist++;
391
- } else {
392
- n0++;
393
- }
394
- } while (fe.next());
395
-
396
- ho += b;
397
- }
398
- ndis += shortlist.size();
399
-
400
- // verify shortlist
401
- Run_verify_shortlist r;
402
- dispatch_HammingComputer(
403
- index.code_size, r, index.storage, xi, shortlist, res);
404
- }
405
-
406
- } // anonymous namespace
210
+ // verify_shortlist and search_1_query_multihash are now in
211
+ // impl/binary_hamming/IndexBinaryHash_impl.h (compiled per-ISA)
407
212
 
408
213
  void IndexBinaryMultiHash::range_search(
409
214
  idx_t n,
@@ -422,10 +227,12 @@ void IndexBinaryMultiHash::range_search(
422
227
  #pragma omp for
423
228
  for (idx_t i = 0; i < n; i++) { // loop queries
424
229
  RangeQueryResult& qres = pres.new_result(i);
425
- RangeSearchResults res = {radius, qres};
426
230
  const uint8_t* q = x + i * code_size;
427
231
 
428
- search_1_query_multihash(*this, q, res, n0, nlist, ndis);
232
+ with_simd_level([&]<SIMDLevel SL>() {
233
+ binary_multihash_range_search_fixSL<SL>(
234
+ *this, q, radius, qres, n0, nlist, ndis);
235
+ });
429
236
  }
430
237
  pres.finalize();
431
238
  }
@@ -455,10 +262,12 @@ void IndexBinaryMultiHash::search(
455
262
  idx_t* idxi = labels + k * i;
456
263
 
457
264
  heap_heapify<HeapForL2>(k, simi, idxi);
458
- KnnSearchResults res = {k, simi, idxi};
459
265
  const uint8_t* q = x + i * code_size;
460
266
 
461
- search_1_query_multihash(*this, q, res, n0, nlist, ndis);
267
+ with_simd_level([&]<SIMDLevel SL>() {
268
+ binary_multihash_knn_search_fixSL<SL>(
269
+ *this, q, k, simi, idxi, n0, nlist, ndis);
270
+ });
462
271
 
463
272
  heap_reorder<HeapForL2>(k, simi, idxi);
464
273
  }
@@ -470,7 +279,7 @@ void IndexBinaryMultiHash::search(
470
279
 
471
280
  size_t IndexBinaryMultiHash::hashtable_size() const {
472
281
  size_t tot = 0;
473
- for (auto map : maps) {
282
+ for (const auto& map : maps) {
474
283
  tot += map.size();
475
284
  }
476
285
 
@@ -66,10 +66,10 @@ struct IndexBinaryHash : IndexBinary {
66
66
  };
67
67
 
68
68
  struct IndexBinaryHashStats {
69
- size_t nq; // nb of queries run
70
- size_t n0; // nb of empty lists
71
- size_t nlist; // nb of non-empty inverted lists scanned
72
- size_t ndis{}; // nb of distances computed
69
+ size_t nq = 0; // nb of queries run
70
+ size_t n0 = 0; // nb of empty lists
71
+ size_t nlist = 0; // nb of non-empty inverted lists scanned
72
+ size_t ndis = 0; // nb of distances computed
73
73
 
74
74
  IndexBinaryHashStats() {
75
75
  reset();
@@ -82,8 +82,8 @@ FAISS_API extern IndexBinaryHashStats indexBinaryHash_stats;
82
82
  /** just uses the b first bits as a hash value */
83
83
  struct IndexBinaryMultiHash : IndexBinary {
84
84
  // where the vectors are actually stored
85
- IndexBinaryFlat* storage;
86
- bool own_fields;
85
+ IndexBinaryFlat* storage = nullptr;
86
+ bool own_fields = false;
87
87
 
88
88
  // maps hash values to the ids that hash to them
89
89
  using Map = std::unordered_map<idx_t, std::vector<idx_t>>;