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
@@ -18,6 +18,7 @@
18
18
  #include <faiss/MetaIndexes.h>
19
19
  #include <faiss/clone_index.h>
20
20
  #include <faiss/impl/FaissAssert.h>
21
+ #include <faiss/impl/simd_dispatch.h>
21
22
  #include <faiss/index_io.h>
22
23
  #include <faiss/utils/distances.h>
23
24
  #include <faiss/utils/hamming.h>
@@ -36,7 +37,7 @@ void check_compatible_for_merge(const Index* index0, const Index* index1) {
36
37
  FAISS_THROW_IF_NOT_MSG(pt1, "both indexes should be pretransforms");
37
38
 
38
39
  FAISS_THROW_IF_NOT(pt0->chain.size() == pt1->chain.size());
39
- for (int i = 0; i < pt0->chain.size(); i++) {
40
+ for (size_t i = 0; i < pt0->chain.size(); i++) {
40
41
  FAISS_THROW_IF_NOT(typeid(pt0->chain[i]) == typeid(pt1->chain[i]));
41
42
  }
42
43
 
@@ -124,7 +125,7 @@ void search_centroid(
124
125
  index = index_pre->index;
125
126
  }
126
127
  faiss::IndexIVF* index_ivf = dynamic_cast<faiss::IndexIVF*>(index);
127
- assert(index_ivf);
128
+ FAISS_THROW_IF_NOT_MSG(index_ivf, "could not extract IVF index");
128
129
  index_ivf->quantizer->assign(n, x, centroid_ids);
129
130
  }
130
131
 
@@ -145,7 +146,7 @@ void search_and_return_centroids(
145
146
  index = index_pre->index;
146
147
  }
147
148
  faiss::IndexIVF* index_ivf = dynamic_cast<faiss::IndexIVF*>(index);
148
- assert(index_ivf);
149
+ FAISS_THROW_IF_NOT_MSG(index_ivf, "could not extract IVF index");
149
150
 
150
151
  size_t nprobe = index_ivf->nprobe;
151
152
  std::vector<idx_t> cent_nos(n * nprobe);
@@ -179,9 +180,9 @@ void search_and_return_centroids(
179
180
  }
180
181
  }
181
182
 
182
- SlidingIndexWindow::SlidingIndexWindow(Index* index) : index(index) {
183
+ SlidingIndexWindow::SlidingIndexWindow(Index* index_) : index(index_) {
183
184
  n_slice = 0;
184
- IndexIVF* index_ivf = const_cast<IndexIVF*>(extract_index_ivf(index));
185
+ IndexIVF* index_ivf = const_cast<IndexIVF*>(extract_index_ivf(index_));
185
186
  ils = dynamic_cast<ArrayInvertedLists*>(index_ivf->invlists);
186
187
  FAISS_THROW_IF_NOT_MSG(
187
188
  ils, "only supports indexes with ArrayInvertedLists");
@@ -248,7 +249,7 @@ void SlidingIndexWindow::step(const Index* sub_index, bool remove_oldest) {
248
249
  IndexIVF* index_ivf = extract_index_ivf(index);
249
250
 
250
251
  if (remove_oldest && ils2) {
251
- for (int i = 0; i < nlist; i++) {
252
+ for (size_t i = 0; i < nlist; i++) {
252
253
  std::vector<size_t>& sizesi = sizes[i];
253
254
  size_t amount_to_remove = sizesi[0];
254
255
  index_ivf->ntotal += ils2->ids[i].size() - amount_to_remove;
@@ -264,7 +265,7 @@ void SlidingIndexWindow::step(const Index* sub_index, bool remove_oldest) {
264
265
  sizesi[n_slice - 1] = ils->ids[i].size();
265
266
  }
266
267
  } else if (ils2) {
267
- for (int i = 0; i < nlist; i++) {
268
+ for (size_t i = 0; i < nlist; i++) {
268
269
  index_ivf->ntotal += ils2->ids[i].size();
269
270
  shift_and_add(ils->ids[i], 0, ils2->ids[i]);
270
271
  shift_and_add(ils->codes[i], 0, ils2->codes[i]);
@@ -272,7 +273,7 @@ void SlidingIndexWindow::step(const Index* sub_index, bool remove_oldest) {
272
273
  }
273
274
  n_slice++;
274
275
  } else if (remove_oldest) {
275
- for (int i = 0; i < nlist; i++) {
276
+ for (size_t i = 0; i < nlist; i++) {
276
277
  size_t amount_to_remove = sizes[i][0];
277
278
  index_ivf->ntotal -= amount_to_remove;
278
279
  remove_from_begin(ils->ids[i], amount_to_remove);
@@ -295,7 +296,8 @@ void SlidingIndexWindow::step(const Index* sub_index, bool remove_oldest) {
295
296
  ArrayInvertedLists* get_invlist_range(const Index* index, long i0, long i1) {
296
297
  const IndexIVF* ivf = extract_index_ivf(index);
297
298
 
298
- FAISS_THROW_IF_NOT(0 <= i0 && i0 <= i1 && i1 <= ivf->nlist);
299
+ FAISS_THROW_IF_NOT(
300
+ 0 <= i0 && i0 <= i1 && static_cast<size_t>(i1) <= ivf->nlist);
299
301
 
300
302
  const InvertedLists* src = ivf->invlists;
301
303
 
@@ -318,12 +320,14 @@ void set_invlist_range(
318
320
  ArrayInvertedLists* src) {
319
321
  IndexIVF* ivf = extract_index_ivf(index);
320
322
 
321
- FAISS_THROW_IF_NOT(0 <= i0 && i0 <= i1 && i1 <= ivf->nlist);
323
+ FAISS_THROW_IF_NOT(
324
+ 0 <= i0 && i0 <= i1 && static_cast<size_t>(i1) <= ivf->nlist);
322
325
 
323
326
  ArrayInvertedLists* dst = dynamic_cast<ArrayInvertedLists*>(ivf->invlists);
324
327
  FAISS_THROW_IF_NOT_MSG(dst, "only ArrayInvertedLists supported");
325
328
  FAISS_THROW_IF_NOT(
326
- src->nlist == i1 - i0 && dst->code_size == src->code_size);
329
+ src->nlist == static_cast<size_t>(i1 - i0) &&
330
+ dst->code_size == src->code_size);
327
331
 
328
332
  size_t ntotal = index->ntotal;
329
333
  for (long i = i0; i < i1; i++) {
@@ -341,7 +345,7 @@ static size_t count_ndis(
341
345
  const idx_t* Iq) {
342
346
  size_t nb_dis = 0;
343
347
  const InvertedLists* il = index_ivf->invlists;
344
- for (idx_t i = 0; i < n_list_scan; i++) {
348
+ for (size_t i = 0; i < n_list_scan; i++) {
345
349
  if (Iq[i] >= 0) {
346
350
  nb_dis += il->list_size(Iq[i]);
347
351
  }
@@ -456,12 +460,12 @@ void range_search_with_parameters(
456
460
  IndexIVFResidualQuantizer* ivf_residual_from_quantizer(
457
461
  const ResidualQuantizer& rq,
458
462
  int nlevel) {
459
- FAISS_THROW_IF_NOT(nlevel > 0 && nlevel + 1 < rq.M);
463
+ FAISS_THROW_IF_NOT(nlevel > 0 && static_cast<size_t>(nlevel + 1) < rq.M);
460
464
 
461
465
  std::vector<size_t> nbits(nlevel);
462
466
  std::copy(rq.nbits.begin(), rq.nbits.begin() + nlevel, nbits.begin());
463
467
  std::unique_ptr<ResidualCoarseQuantizer> rcq(
464
- new ResidualCoarseQuantizer(rq.d, nbits));
468
+ new ResidualCoarseQuantizer(static_cast<int>(rq.d), nbits));
465
469
 
466
470
  // set the coarse quantizer from the 2 first quantizers
467
471
  rcq->rq.initialize_from(rq);
@@ -476,7 +480,7 @@ IndexIVFResidualQuantizer* ivf_residual_from_quantizer(
476
480
 
477
481
  // build a IVFResidualQuantizer from that
478
482
  std::vector<size_t> nbits_refined;
479
- for (int i = nlevel; i < rq.M; i++) {
483
+ for (size_t i = nlevel; i < rq.M; i++) {
480
484
  nbits_refined.push_back(rq.nbits[i]);
481
485
  }
482
486
  std::unique_ptr<IndexIVFResidualQuantizer> index(
@@ -488,7 +492,8 @@ IndexIVFResidualQuantizer* ivf_residual_from_quantizer(
488
492
  faiss::METRIC_L2,
489
493
  rq.search_type));
490
494
  index->own_fields = true;
491
- rcq.release();
495
+ // Ownership transferred to index via own_fields = true
496
+ (void)rcq.release();
492
497
  index->by_residual = true;
493
498
  index->rq.initialize_from(rq, nlevel);
494
499
  index->is_trained = true;
@@ -512,39 +517,43 @@ void ivf_residual_add_from_flat_codes(
512
517
  const ResidualQuantizer& rq = index->rq;
513
518
 
514
519
  // populate inverted lists
515
- #pragma omp parallel if (nb > 10000)
516
- {
517
- std::vector<uint8_t> tmp_code(index->code_size);
518
- std::vector<float> tmp(rq.d);
519
- int nt = omp_get_num_threads();
520
- int rank = omp_get_thread_num();
520
+ with_simd_level([&]<SIMDLevel SL>() {
521
+ #pragma omp parallel
522
+ {
523
+ std::vector<uint8_t> tmp_code(index->rq.code_size);
524
+ std::vector<float> tmp(rq.d);
525
+ int nt = omp_get_num_threads();
526
+ int rank = omp_get_thread_num();
521
527
 
522
528
  #pragma omp for
523
- for (idx_t i = 0; i < nb; i++) {
524
- const uint8_t* code = &raw_codes[i * code_size];
525
- BitstringReader rd(code, code_size);
526
- idx_t list_no = rd.read(rcq->rq.tot_bits);
527
-
528
- if (list_no % nt ==
529
- rank) { // each thread takes care of 1/nt of the invlists
530
- // copy AQ indexes one by one
531
- BitstringWriter wr(tmp_code.data(), tmp_code.size());
532
- for (int j = 0; j < rq.M; j++) {
533
- int nbit = rq.nbits[j];
534
- wr.write(rd.read(nbit), nbit);
529
+ for (idx_t i = 0; i < static_cast<idx_t>(nb); i++) {
530
+ const uint8_t* code = &raw_codes[i * code_size];
531
+ BitstringReader rd(code, code_size);
532
+ idx_t list_no = rd.read(static_cast<int>(rcq->rq.tot_bits));
533
+
534
+ if (list_no % nt ==
535
+ rank) { // each thread takes care of 1/nt of the invlists
536
+ // copy AQ indexes one by one
537
+ BitstringWriter wr(tmp_code.data(), tmp_code.size());
538
+ for (size_t j = 0; j < rq.M; j++) {
539
+ int nbit = static_cast<int>(rq.nbits[j]);
540
+ wr.write(rd.read(nbit), nbit);
541
+ }
542
+ // we need to recompute the norm
543
+ // decode first, does not use the norm component, so that's
544
+ // ok
545
+ index->rq.decode(tmp_code.data(), tmp.data(), 1);
546
+ float norm = fvec_norm_L2sqr<SL>(tmp.data(), rq.d);
547
+ wr.write(
548
+ rq.encode_norm(norm),
549
+ static_cast<int>(rq.norm_bits));
550
+
551
+ // add code to the inverted list
552
+ invlists.add_entry(list_no, i, tmp_code.data());
535
553
  }
536
- // we need to recompute the norm
537
- // decode first, does not use the norm component, so that's
538
- // ok
539
- index->rq.decode(tmp_code.data(), tmp.data(), 1);
540
- float norm = fvec_norm_L2sqr(tmp.data(), rq.d);
541
- wr.write(rq.encode_norm(norm), rq.norm_bits);
542
-
543
- // add code to the inverted list
544
- invlists.add_entry(list_no, i, tmp_code.data());
545
554
  }
546
555
  }
547
- }
556
+ });
548
557
  index->ntotal += nb;
549
558
  }
550
559
 
@@ -595,7 +604,14 @@ void handle_ivf(
595
604
  sharded_centroids[i].data());
596
605
  }
597
606
  char fname[256];
607
+ #if defined(__GNUC__) || defined(__clang__)
608
+ #pragma GCC diagnostic push
609
+ #pragma GCC diagnostic ignored "-Wformat-nonliteral"
610
+ #endif
598
611
  snprintf(fname, 256, filename_template.c_str(), i);
612
+ #if defined(__GNUC__) || defined(__clang__)
613
+ #pragma GCC diagnostic pop
614
+ #endif
599
615
  faiss::write_index(sharded_index, fname);
600
616
  delete sharded_index;
601
617
  }
@@ -646,7 +662,14 @@ void handle_binary_ivf(
646
662
  sharded_centroids[i].data());
647
663
  }
648
664
  char fname[256];
665
+ #if defined(__GNUC__) || defined(__clang__)
666
+ #pragma GCC diagnostic push
667
+ #pragma GCC diagnostic ignored "-Wformat-nonliteral"
668
+ #endif
649
669
  snprintf(fname, 256, filename_template.c_str(), i);
670
+ #if defined(__GNUC__) || defined(__clang__)
671
+ #pragma GCC diagnostic pop
672
+ #endif
650
673
  faiss::write_index_binary(sharded_index, fname);
651
674
  delete sharded_index;
652
675
  }
@@ -24,12 +24,20 @@ void Index::train(idx_t /*n*/, const float* /*x*/) {
24
24
  // does nothing by default
25
25
  }
26
26
 
27
+ void Index::train_with_queries(
28
+ idx_t /*n*/,
29
+ const float* /*x*/,
30
+ idx_t /*n_train_q*/,
31
+ const float* /*xq_train*/) {
32
+ // does nothing by default
33
+ }
34
+
27
35
  void Index::range_search(
28
36
  idx_t,
29
37
  const float*,
30
38
  float,
31
39
  RangeSearchResult*,
32
- const SearchParameters* params) const {
40
+ const SearchParameters* /*params*/) const {
33
41
  FAISS_THROW_MSG("range search not implemented");
34
42
  }
35
43
 
@@ -47,7 +55,7 @@ void Index::add_with_ids(
47
55
 
48
56
  size_t Index::remove_ids(const IDSelector& /*sel*/) {
49
57
  FAISS_THROW_MSG("remove_ids not implemented for this type of index");
50
- return -1;
58
+ return static_cast<size_t>(-1);
51
59
  }
52
60
 
53
61
  void Index::reconstruct(idx_t, float*) const {
@@ -105,19 +113,23 @@ void Index::search_and_reconstruct(
105
113
  }
106
114
 
107
115
  void Index::search_subset(
108
- idx_t n,
109
- const float* x,
110
- idx_t k_base,
111
- const idx_t* base_labels,
112
- idx_t k,
113
- float* distances,
114
- idx_t* labels) const {
116
+ idx_t /*n*/,
117
+ const float* /*x*/,
118
+ idx_t /*k_base*/,
119
+ const idx_t* /*base_labels*/,
120
+ idx_t /*k*/,
121
+ float* /*distances*/,
122
+ idx_t* /*labels*/) const {
115
123
  FAISS_THROW_MSG("search_subset not implemented for this type of index");
116
124
  }
117
125
 
126
+ void Index::search1(const float*, ResultHandler&, SearchParameters*) const {
127
+ FAISS_THROW_MSG("search1 not implemented for this type of index");
128
+ }
129
+
118
130
  void Index::compute_residual(const float* x, float* residual, idx_t key) const {
119
131
  reconstruct(key, residual);
120
- for (size_t i = 0; i < d; i++) {
132
+ for (int i = 0; i < d; i++) {
121
133
  residual[i] = x[i] - residual[i];
122
134
  }
123
135
  }
@@ -156,9 +168,10 @@ struct GenericDistanceComputer : DistanceComputer {
156
168
  size_t d;
157
169
  const Index& storage;
158
170
  std::vector<float> buf;
159
- const float* q;
171
+ const float* q = nullptr;
160
172
 
161
- explicit GenericDistanceComputer(const Index& storage) : storage(storage) {
173
+ explicit GenericDistanceComputer(const Index& storage_in)
174
+ : storage(storage_in) {
162
175
  d = storage.d;
163
176
  buf.resize(d * 2);
164
177
  }
@@ -14,10 +14,9 @@
14
14
  #include <faiss/impl/FaissAssert.h>
15
15
 
16
16
  #include <cstdio>
17
- #include <sstream>
18
17
 
19
18
  #define FAISS_VERSION_MAJOR 1
20
- #define FAISS_VERSION_MINOR 13
19
+ #define FAISS_VERSION_MINOR 14
21
20
  #define FAISS_VERSION_PATCH 2
22
21
 
23
22
  // Macro to combine the version components into a single string
@@ -55,6 +54,9 @@ namespace faiss {
55
54
  struct IDSelector;
56
55
  struct RangeSearchResult;
57
56
  struct DistanceComputer;
57
+ template <typename T, typename TI>
58
+ struct ResultHandlerUnordered;
59
+ using ResultHandler = ResultHandlerUnordered<float, idx_t>;
58
60
 
59
61
  enum NumericType {
60
62
  Float32,
@@ -112,8 +114,8 @@ struct Index {
112
114
  MetricType metric_type;
113
115
  float metric_arg; ///< argument of the metric type
114
116
 
115
- explicit Index(idx_t d = 0, MetricType metric = METRIC_L2)
116
- : d(d),
117
+ explicit Index(idx_t d_in = 0, MetricType metric = METRIC_L2)
118
+ : d(static_cast<int>(d_in)),
117
119
  ntotal(0),
118
120
  verbose(false),
119
121
  is_trained(true),
@@ -129,6 +131,20 @@ struct Index {
129
131
  */
130
132
  virtual void train(idx_t n, const float* x);
131
133
 
134
+ /** Perform training on a representative set of vectors and a representative
135
+ * set of queries
136
+ *
137
+ * @param n nb of training vectors
138
+ * @param x training vectors, size n * d
139
+ * @param n_train_q nb of training queries
140
+ * @param xq_train training queries, size n_train_q * d
141
+ */
142
+ virtual void train_with_queries(
143
+ idx_t n,
144
+ const float* x,
145
+ idx_t n_train_q,
146
+ const float* xq_train);
147
+
132
148
  virtual void train_ex(idx_t n, const void* x, NumericType numeric_type) {
133
149
  if (numeric_type == NumericType::Float32) {
134
150
  train(n, static_cast<const float*>(x));
@@ -216,6 +232,12 @@ struct Index {
216
232
  }
217
233
  }
218
234
 
235
+ /** search one vector with a custom result handler */
236
+ virtual void search1(
237
+ const float* x,
238
+ ResultHandler& handler,
239
+ SearchParameters* params = nullptr) const;
240
+
219
241
  /** query n vectors of dimension d to the index.
220
242
  *
221
243
  * return all vectors with distance < radius. Note that many
@@ -13,10 +13,6 @@
13
13
  #include <cstdint>
14
14
  #include <cstdio>
15
15
 
16
- #ifdef __SSE3__
17
- #include <immintrin.h>
18
- #endif
19
-
20
16
  #include <algorithm>
21
17
 
22
18
  #include <faiss/IndexIVFPQ.h>
@@ -138,12 +134,13 @@ struct Distance2Level : DistanceComputer {
138
134
  size_t d;
139
135
  const Index2Layer& storage;
140
136
  std::vector<float> buf;
141
- const float* q;
137
+ const float* q = nullptr;
142
138
 
143
- const float *pq_l1_tab, *pq_l2_tab;
139
+ const float* pq_l1_tab = nullptr;
140
+ const float* pq_l2_tab = nullptr;
144
141
 
145
- explicit Distance2Level(const Index2Layer& storage) : storage(storage) {
146
- d = storage.d;
142
+ explicit Distance2Level(const Index2Layer& storage_) : storage(storage_) {
143
+ d = storage_.d;
147
144
  FAISS_ASSERT(storage.pq.dsub == 4);
148
145
  pq_l2_tab = storage.pq.centroids.data();
149
146
  buf.resize(2 * d);
@@ -162,46 +159,40 @@ struct Distance2Level : DistanceComputer {
162
159
 
163
160
  // well optimized for xNN+PQNN
164
161
  struct DistanceXPQ4 : Distance2Level {
165
- int M, k;
162
+ int M = 0;
163
+ int k = 0;
166
164
 
167
- explicit DistanceXPQ4(const Index2Layer& storage)
168
- : Distance2Level(storage) {
165
+ explicit DistanceXPQ4(const Index2Layer& storage_)
166
+ : Distance2Level(storage_) {
169
167
  const IndexFlat* quantizer =
170
168
  dynamic_cast<IndexFlat*>(storage.q1.quantizer);
171
169
 
172
170
  FAISS_ASSERT(quantizer);
173
- M = storage.pq.M;
171
+ M = static_cast<int>(storage.pq.M);
174
172
  pq_l1_tab = quantizer->get_xb();
175
173
  }
176
174
 
177
175
  float operator()(idx_t i) override {
178
- #ifdef __SSE3__
179
176
  const uint8_t* code = storage.codes.data() + i * storage.code_size;
180
177
  idx_t key = 0;
181
178
  memcpy(&key, code, storage.code_size_1);
182
179
  code += storage.code_size_1;
183
180
 
184
- // walking pointers
185
181
  const float* qa = q;
186
- const __m128* l1_t = (const __m128*)(pq_l1_tab + d * key);
187
- const __m128* pq_l2_t = (const __m128*)pq_l2_tab;
188
- __m128 accu = _mm_setzero_ps();
182
+ const float* l1 = pq_l1_tab + d * key;
183
+ const float* l2 = pq_l2_tab;
184
+ float accu = 0;
189
185
 
190
186
  for (int m = 0; m < M; m++) {
191
- __m128 qi = _mm_loadu_ps(qa);
192
- __m128 recons = _mm_add_ps(l1_t[m], pq_l2_t[*code++]);
193
- __m128 diff = _mm_sub_ps(qi, recons);
194
- accu = _mm_add_ps(accu, _mm_mul_ps(diff, diff));
195
- pq_l2_t += 256;
187
+ for (int j = 0; j < 4; j++) {
188
+ float diff = qa[j] - (l1[m * 4 + j] + l2[*code * 4 + j]);
189
+ accu += diff * diff;
190
+ }
191
+ code++;
192
+ l2 += 256 * 4;
196
193
  qa += 4;
197
194
  }
198
-
199
- accu = _mm_hadd_ps(accu, accu);
200
- accu = _mm_hadd_ps(accu, accu);
201
- return _mm_cvtss_f32(accu);
202
- #else
203
- FAISS_THROW_MSG("not implemented for non-x64 platforms");
204
- #endif
195
+ return accu;
205
196
  }
206
197
  };
207
198
 
@@ -209,15 +200,15 @@ struct DistanceXPQ4 : Distance2Level {
209
200
  struct Distance2xXPQ4 : Distance2Level {
210
201
  int M_2, mi_nbits;
211
202
 
212
- explicit Distance2xXPQ4(const Index2Layer& storage)
213
- : Distance2Level(storage) {
203
+ explicit Distance2xXPQ4(const Index2Layer& storage_)
204
+ : Distance2Level(storage_) {
214
205
  const MultiIndexQuantizer* mi =
215
206
  dynamic_cast<MultiIndexQuantizer*>(storage.q1.quantizer);
216
207
 
217
208
  FAISS_ASSERT(mi);
218
209
  FAISS_ASSERT(storage.pq.M % 2 == 0);
219
- M_2 = storage.pq.M / 2;
220
- mi_nbits = mi->pq.nbits;
210
+ M_2 = static_cast<int>(storage.pq.M / 2);
211
+ mi_nbits = static_cast<int>(mi->pq.nbits);
221
212
  pq_l1_tab = mi->pq.centroids.data();
222
213
  }
223
214
 
@@ -226,42 +217,36 @@ struct Distance2xXPQ4 : Distance2Level {
226
217
  int64_t key01 = 0;
227
218
  memcpy(&key01, code, storage.code_size_1);
228
219
  code += storage.code_size_1;
229
- #ifdef __SSE3__
230
220
 
231
- // walking pointers
232
221
  const float* qa = q;
233
- const __m128* pq_l1_t = (const __m128*)pq_l1_tab;
234
- const __m128* pq_l2_t = (const __m128*)pq_l2_tab;
235
- __m128 accu = _mm_setzero_ps();
222
+ const float* l1 = pq_l1_tab;
223
+ const float* l2 = pq_l2_tab;
224
+ float accu = 0;
236
225
 
237
226
  for (int mi_m = 0; mi_m < 2; mi_m++) {
238
227
  int64_t l1_idx = key01 & (((int64_t)1 << mi_nbits) - 1);
239
- const __m128* pq_l1 = pq_l1_t + M_2 * l1_idx;
228
+ const float* l1_sub = l1 + M_2 * l1_idx * 4;
240
229
 
241
230
  for (int m = 0; m < M_2; m++) {
242
- __m128 qi = _mm_loadu_ps(qa);
243
- __m128 recons = _mm_add_ps(pq_l1[m], pq_l2_t[*code++]);
244
- __m128 diff = _mm_sub_ps(qi, recons);
245
- accu = _mm_add_ps(accu, _mm_mul_ps(diff, diff));
246
- pq_l2_t += 256;
231
+ for (int j = 0; j < 4; j++) {
232
+ float diff =
233
+ qa[j] - (l1_sub[m * 4 + j] + l2[*code * 4 + j]);
234
+ accu += diff * diff;
235
+ }
236
+ code++;
237
+ l2 += 256 * 4;
247
238
  qa += 4;
248
239
  }
249
- pq_l1_t += M_2 << mi_nbits;
240
+ l1 += (M_2 << mi_nbits) * 4;
250
241
  key01 >>= mi_nbits;
251
242
  }
252
- accu = _mm_hadd_ps(accu, accu);
253
- accu = _mm_hadd_ps(accu, accu);
254
- return _mm_cvtss_f32(accu);
255
- #else
256
- FAISS_THROW_MSG("not implemented for non-x64 platforms");
257
- #endif
243
+ return accu;
258
244
  }
259
245
  };
260
246
 
261
247
  } // namespace
262
248
 
263
249
  DistanceComputer* Index2Layer::get_distance_computer() const {
264
- #ifdef __SSE3__
265
250
  const MultiIndexQuantizer* mi =
266
251
  dynamic_cast<MultiIndexQuantizer*>(q1.quantizer);
267
252
 
@@ -274,7 +259,6 @@ DistanceComputer* Index2Layer::get_distance_computer() const {
274
259
  if (fl && pq.dsub == 4) {
275
260
  return new DistanceXPQ4(*this);
276
261
  }
277
- #endif
278
262
 
279
263
  return Index::get_distance_computer();
280
264
  }