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
@@ -0,0 +1,481 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ // Shared implementation header for Hamming distance dynamic dispatch.
9
+ // Included by per-ISA TUs (hamming_avx2.cpp, hamming_avx512.cpp,
10
+ // hamming_neon.cpp) and by hamming.cpp (for the NONE fallback TU).
11
+ //
12
+ // THE_SIMD_LEVEL must be defined before including this header.
13
+ // Callers must also include the appropriate hamming_computer-*.h
14
+ // (generic, avx2, avx512, or neon) before this header so that the
15
+ // HammingComputer struct specializations are available.
16
+ //
17
+ // ODR CONTRACT: each TU that includes this header MUST define a UNIQUE
18
+ // THE_SIMD_LEVEL value across the linked binary. The template
19
+ // specializations at the bottom of this file (hammings_knn_hc_fixSL<SL>,
20
+ // etc.) have external linkage with SL-keyed mangled names; two TUs sharing
21
+ // THE_SIMD_LEVEL would emit conflicting definitions of the same symbol.
22
+ // In DD mode, the per-ISA TUs use distinct values (NONE/AVX2/AVX512/NEON);
23
+ // in static mode, only hamming.cpp includes this header so uniqueness is
24
+ // trivially satisfied.
25
+
26
+ #pragma once
27
+
28
+ #ifndef THE_SIMD_LEVEL
29
+ #error "Define THE_SIMD_LEVEL before including hamming_impl.h"
30
+ #endif
31
+
32
+ // Forward declarations and dispatch function.
33
+ #include <faiss/utils/hamming_distance/hamming_computer.h>
34
+
35
+ #include <faiss/utils/hamming.h>
36
+
37
+ #include <algorithm>
38
+ #include <cstdio>
39
+ #include <limits>
40
+ #include <memory>
41
+ #include <vector>
42
+
43
+ #include <faiss/impl/AuxIndexStructures.h>
44
+ #include <faiss/impl/FaissAssert.h>
45
+ #include <faiss/impl/IDSelector.h>
46
+ #include <faiss/utils/Heap.h>
47
+ #include <faiss/utils/approx_topk_hamming/approx_topk_hamming.h>
48
+ #include <faiss/utils/utils.h>
49
+
50
+ namespace faiss {
51
+
52
+ // All HammingComputer-dependent implementation templates live in an anonymous
53
+ // namespace for ODR safety. Different TUs compile this header with different
54
+ // HammingComputer struct layouts (generic vs AVX2 vs NEON). The anonymous
55
+ // namespace ensures each TU gets its own copy with internal linkage, preventing
56
+ // the linker from merging incompatible instantiations.
57
+ namespace {
58
+
59
+ /******************************************************************
60
+ * HammingComputer-based search templates
61
+ ******************************************************************/
62
+
63
+ template <class HammingComputer>
64
+ void hammings_knn_hc_impl(
65
+ int bytes_per_code,
66
+ int_maxheap_array_t* __restrict ha,
67
+ const uint8_t* __restrict bs1,
68
+ const uint8_t* __restrict bs2,
69
+ size_t n2,
70
+ bool order = true,
71
+ bool init_heap = true,
72
+ ApproxTopK_mode_t approx_topk_mode = ApproxTopK_mode_t::EXACT_TOPK,
73
+ const faiss::IDSelector* sel = nullptr) {
74
+ size_t k = ha->k;
75
+ if (init_heap) {
76
+ ha->heapify();
77
+ }
78
+
79
+ const size_t block_size = hamming_batch_size;
80
+ for (size_t j0 = 0; j0 < n2; j0 += block_size) {
81
+ const size_t j1 = std::min(j0 + block_size, n2);
82
+ #pragma omp parallel for
83
+ for (int64_t i = 0; i < static_cast<int64_t>(ha->nh); i++) {
84
+ HammingComputer hc(bs1 + i * bytes_per_code, bytes_per_code);
85
+
86
+ const uint8_t* __restrict bs2_ = bs2 + j0 * bytes_per_code;
87
+ hamdis_t dis;
88
+ hamdis_t* __restrict bh_val_ = ha->val + i * k;
89
+ int64_t* __restrict bh_ids_ = ha->ids + i * k;
90
+
91
+ #define HANDLE_APPROX(NB, BD) \
92
+ case ApproxTopK_mode_t::APPROX_TOPK_BUCKETS_B##NB##_D##BD: \
93
+ FAISS_THROW_IF_NOT_FMT( \
94
+ k <= NB * BD, \
95
+ "The chosen mode (%d) of approximate top-k supports " \
96
+ "up to %d values, but %zd is requested.", \
97
+ (int)(ApproxTopK_mode_t::APPROX_TOPK_BUCKETS_B##NB##_D##BD), \
98
+ NB * BD, \
99
+ k); \
100
+ HeapWithBucketsForHamming32< \
101
+ CMax<hamdis_t, int64_t>, \
102
+ NB, \
103
+ BD, \
104
+ HammingComputer>:: \
105
+ addn(j1 - j0, hc, bs2_, k, bh_val_, bh_ids_, sel); \
106
+ break;
107
+
108
+ switch (approx_topk_mode) {
109
+ HANDLE_APPROX(8, 3)
110
+ HANDLE_APPROX(8, 2)
111
+ HANDLE_APPROX(16, 2)
112
+ HANDLE_APPROX(32, 2)
113
+ default: {
114
+ for (size_t j = j0; j < j1; j++, bs2_ += bytes_per_code) {
115
+ if (sel && !sel->is_member(j)) {
116
+ continue;
117
+ }
118
+ dis = hc.hamming(bs2_);
119
+ if (dis < bh_val_[0]) {
120
+ faiss::maxheap_replace_top<hamdis_t>(
121
+ k, bh_val_, bh_ids_, dis, j);
122
+ }
123
+ }
124
+ } break;
125
+ }
126
+ }
127
+ }
128
+ if (order) {
129
+ ha->reorder();
130
+ }
131
+ }
132
+
133
+ #undef HANDLE_APPROX
134
+
135
+ template <class HammingComputer>
136
+ void hammings_knn_mc_impl(
137
+ int bytes_per_code,
138
+ const uint8_t* __restrict a,
139
+ const uint8_t* __restrict b,
140
+ size_t na,
141
+ size_t nb,
142
+ size_t k,
143
+ int32_t* __restrict distances,
144
+ int64_t* __restrict labels,
145
+ const faiss::IDSelector* sel) {
146
+ const int nBuckets = bytes_per_code * 8 + 1;
147
+ std::vector<int> all_counters(na * nBuckets, 0);
148
+ std::unique_ptr<int64_t[]> all_ids_per_dis(new int64_t[na * nBuckets * k]);
149
+
150
+ std::vector<HCounterState<HammingComputer>> cs;
151
+ for (size_t i = 0; i < na; ++i) {
152
+ cs.push_back(
153
+ HCounterState<HammingComputer>(
154
+ all_counters.data() + i * nBuckets,
155
+ all_ids_per_dis.get() + i * nBuckets * k,
156
+ a + i * bytes_per_code,
157
+ 8 * bytes_per_code,
158
+ k));
159
+ }
160
+
161
+ const size_t block_size = hamming_batch_size;
162
+ for (size_t j0 = 0; j0 < nb; j0 += block_size) {
163
+ const size_t j1 = std::min(j0 + block_size, nb);
164
+ #pragma omp parallel for
165
+ for (int64_t i = 0; i < static_cast<int64_t>(na); ++i) {
166
+ for (size_t j = j0; j < j1; ++j) {
167
+ if (!sel || sel->is_member(j)) {
168
+ cs[i].update_counter(b + j * bytes_per_code, j);
169
+ }
170
+ }
171
+ }
172
+ }
173
+
174
+ for (size_t i = 0; i < na; ++i) {
175
+ HCounterState<HammingComputer>& csi = cs[i];
176
+
177
+ size_t nres = 0;
178
+ for (int b_2 = 0; b_2 < nBuckets && nres < k; b_2++) {
179
+ for (int l = 0; l < csi.counters[b_2] && nres < k; l++) {
180
+ labels[i * k + nres] = csi.ids_per_dis[b_2 * k + l];
181
+ distances[i * k + nres] = b_2;
182
+ nres++;
183
+ }
184
+ }
185
+ while (nres < k) {
186
+ labels[i * k + nres] = -1;
187
+ distances[i * k + nres] = std::numeric_limits<int32_t>::max();
188
+ ++nres;
189
+ }
190
+ }
191
+ }
192
+
193
+ template <class HammingComputer>
194
+ void hamming_range_search_impl(
195
+ const uint8_t* a,
196
+ const uint8_t* b,
197
+ size_t na,
198
+ size_t nb,
199
+ int radius,
200
+ size_t code_size,
201
+ RangeSearchResult* res,
202
+ const faiss::IDSelector* sel) {
203
+ #pragma omp parallel
204
+ {
205
+ RangeSearchPartialResult pres(res);
206
+
207
+ #pragma omp for
208
+ for (int64_t i = 0; i < static_cast<int64_t>(na); i++) {
209
+ HammingComputer hc(a + i * code_size, code_size);
210
+ const uint8_t* yi = b;
211
+ RangeQueryResult& qres = pres.new_result(i);
212
+
213
+ for (size_t j = 0; j < nb; j++) {
214
+ if (!sel || sel->is_member(j)) {
215
+ int dis = hc.hamming(yi);
216
+ if (dis < radius) {
217
+ qres.add(dis, j);
218
+ }
219
+ }
220
+ yi += code_size;
221
+ }
222
+ }
223
+ pres.finalize();
224
+ }
225
+ }
226
+
227
+ /******************************************************************
228
+ * Generalized Hamming distances
229
+ ******************************************************************/
230
+
231
+ template <class HammingComputer>
232
+ void hamming_dis_inner_loop(
233
+ const uint8_t* __restrict ca,
234
+ const uint8_t* __restrict cb,
235
+ size_t nb,
236
+ size_t code_size,
237
+ int k,
238
+ hamdis_t* __restrict bh_val_,
239
+ int64_t* __restrict bh_ids_) {
240
+ HammingComputer hc(ca, code_size);
241
+
242
+ for (size_t j = 0; j < nb; j++) {
243
+ int ndiff = hc.hamming(cb);
244
+ cb += code_size;
245
+ if (ndiff < bh_val_[0]) {
246
+ maxheap_replace_top<hamdis_t>(k, bh_val_, bh_ids_, ndiff, j);
247
+ }
248
+ }
249
+ }
250
+
251
+ void generalized_hammings_knn_hc_impl(
252
+ int_maxheap_array_t* __restrict ha,
253
+ const uint8_t* __restrict a,
254
+ const uint8_t* __restrict b,
255
+ size_t nb,
256
+ size_t code_size,
257
+ int ordered) {
258
+ int na = ha->nh;
259
+ int k = ha->k;
260
+
261
+ if (ordered) {
262
+ ha->heapify();
263
+ }
264
+
265
+ #pragma omp parallel for
266
+ for (int i = 0; i < na; i++) {
267
+ const uint8_t* __restrict ca = a + i * code_size;
268
+ const uint8_t* __restrict cb = b;
269
+
270
+ hamdis_t* __restrict bh_val_ = ha->val + i * k;
271
+ int64_t* __restrict bh_ids_ = ha->ids + i * k;
272
+
273
+ switch (code_size) {
274
+ case 8:
275
+ hamming_dis_inner_loop<GenHammingComputer8_tpl<THE_SIMD_LEVEL>>(
276
+ ca, cb, nb, 8, k, bh_val_, bh_ids_);
277
+ break;
278
+ case 16:
279
+ hamming_dis_inner_loop<
280
+ GenHammingComputer16_tpl<THE_SIMD_LEVEL>>(
281
+ ca, cb, nb, 16, k, bh_val_, bh_ids_);
282
+ break;
283
+ case 32:
284
+ hamming_dis_inner_loop<
285
+ GenHammingComputer32_tpl<THE_SIMD_LEVEL>>(
286
+ ca, cb, nb, 32, k, bh_val_, bh_ids_);
287
+ break;
288
+ default:
289
+ hamming_dis_inner_loop<
290
+ GenHammingComputerM8_tpl<THE_SIMD_LEVEL>>(
291
+ ca, cb, nb, code_size, k, bh_val_, bh_ids_);
292
+ break;
293
+ }
294
+ }
295
+
296
+ if (ordered) {
297
+ ha->reorder();
298
+ }
299
+ }
300
+
301
+ } // anonymous namespace
302
+
303
+ /******************************************************************
304
+ * Entry point template specializations at THE_SIMD_LEVEL
305
+ ******************************************************************/
306
+
307
+ #define C64(x) ((uint64_t*)x)
308
+
309
+ template <>
310
+ void hammings_knn_hc_fixSL<THE_SIMD_LEVEL>(
311
+ int_maxheap_array_t* ha,
312
+ const uint8_t* a,
313
+ const uint8_t* b,
314
+ size_t nb,
315
+ size_t ncodes,
316
+ int ordered,
317
+ ApproxTopK_mode_t approx_topk_mode,
318
+ const IDSelector* sel) {
319
+ with_HammingComputer<THE_SIMD_LEVEL>(ncodes, [&]<class HammingComputer>() {
320
+ hammings_knn_hc_impl<HammingComputer>(
321
+ ncodes, ha, a, b, nb, ordered, true, approx_topk_mode, sel);
322
+ });
323
+ }
324
+
325
+ template <>
326
+ void hammings_knn_mc_fixSL<THE_SIMD_LEVEL>(
327
+ const uint8_t* a,
328
+ const uint8_t* b,
329
+ size_t na,
330
+ size_t nb,
331
+ size_t k,
332
+ size_t ncodes,
333
+ int32_t* distances,
334
+ int64_t* labels,
335
+ const IDSelector* sel) {
336
+ with_HammingComputer<THE_SIMD_LEVEL>(ncodes, [&]<class HammingComputer>() {
337
+ hammings_knn_mc_impl<HammingComputer>(
338
+ ncodes, a, b, na, nb, k, distances, labels, sel);
339
+ });
340
+ }
341
+
342
+ template <>
343
+ void hamming_range_search_fixSL<THE_SIMD_LEVEL>(
344
+ const uint8_t* a,
345
+ const uint8_t* b,
346
+ size_t na,
347
+ size_t nb,
348
+ int radius,
349
+ size_t code_size,
350
+ RangeSearchResult* result,
351
+ const IDSelector* sel) {
352
+ with_HammingComputer<THE_SIMD_LEVEL>(
353
+ code_size, [&]<class HammingComputer>() {
354
+ hamming_range_search_impl<HammingComputer>(
355
+ a, b, na, nb, radius, code_size, result, sel);
356
+ });
357
+ }
358
+
359
+ template <>
360
+ void hammings_fixSL<THE_SIMD_LEVEL>(
361
+ const uint8_t* a,
362
+ const uint8_t* b,
363
+ size_t na,
364
+ size_t nb,
365
+ size_t ncodes,
366
+ hamdis_t* dis) {
367
+ FAISS_THROW_IF_NOT(ncodes % 8 == 0);
368
+ switch (ncodes) {
369
+ case 8:
370
+ hammings_impl<64>(C64(a), C64(b), na, nb, dis);
371
+ return;
372
+ case 16:
373
+ hammings_impl<128>(C64(a), C64(b), na, nb, dis);
374
+ return;
375
+ case 32:
376
+ hammings_impl<256>(C64(a), C64(b), na, nb, dis);
377
+ return;
378
+ case 64:
379
+ hammings_impl<512>(C64(a), C64(b), na, nb, dis);
380
+ return;
381
+ default:
382
+ hammings_impl_runtime(C64(a), C64(b), na, nb, ncodes * 8, dis);
383
+ return;
384
+ }
385
+ }
386
+
387
+ template <>
388
+ void generalized_hammings_knn_hc_fixSL<THE_SIMD_LEVEL>(
389
+ int_maxheap_array_t* ha,
390
+ const uint8_t* a,
391
+ const uint8_t* b,
392
+ size_t nb,
393
+ size_t code_size,
394
+ int ordered) {
395
+ generalized_hammings_knn_hc_impl(ha, a, b, nb, code_size, ordered);
396
+ }
397
+
398
+ template <>
399
+ void hamming_count_thres_fixSL<THE_SIMD_LEVEL>(
400
+ const uint8_t* bs1,
401
+ const uint8_t* bs2,
402
+ size_t n1,
403
+ size_t n2,
404
+ hamdis_t ht,
405
+ size_t ncodes,
406
+ size_t* nptr) {
407
+ switch (ncodes) {
408
+ case 8:
409
+ hamming_count_thres_impl<64>(C64(bs1), C64(bs2), n1, n2, ht, nptr);
410
+ return;
411
+ case 16:
412
+ hamming_count_thres_impl<128>(C64(bs1), C64(bs2), n1, n2, ht, nptr);
413
+ return;
414
+ case 32:
415
+ hamming_count_thres_impl<256>(C64(bs1), C64(bs2), n1, n2, ht, nptr);
416
+ return;
417
+ case 64:
418
+ hamming_count_thres_impl<512>(C64(bs1), C64(bs2), n1, n2, ht, nptr);
419
+ return;
420
+ default:
421
+ FAISS_THROW_FMT("not implemented for %zu bits", ncodes);
422
+ }
423
+ }
424
+
425
+ template <>
426
+ void crosshamming_count_thres_fixSL<THE_SIMD_LEVEL>(
427
+ const uint8_t* dbs,
428
+ size_t n,
429
+ hamdis_t ht,
430
+ size_t ncodes,
431
+ size_t* nptr) {
432
+ switch (ncodes) {
433
+ case 8:
434
+ crosshamming_count_thres_impl<64>(C64(dbs), n, ht, nptr);
435
+ return;
436
+ case 16:
437
+ crosshamming_count_thres_impl<128>(C64(dbs), n, ht, nptr);
438
+ return;
439
+ case 32:
440
+ crosshamming_count_thres_impl<256>(C64(dbs), n, ht, nptr);
441
+ return;
442
+ case 64:
443
+ crosshamming_count_thres_impl<512>(C64(dbs), n, ht, nptr);
444
+ return;
445
+ default:
446
+ FAISS_THROW_FMT("not implemented for %zu bits", ncodes);
447
+ }
448
+ }
449
+
450
+ template <>
451
+ size_t match_hamming_thres_fixSL<THE_SIMD_LEVEL>(
452
+ const uint8_t* bs1,
453
+ const uint8_t* bs2,
454
+ size_t n1,
455
+ size_t n2,
456
+ hamdis_t ht,
457
+ size_t ncodes,
458
+ int64_t* idx,
459
+ hamdis_t* dis) {
460
+ switch (ncodes) {
461
+ case 8:
462
+ return match_hamming_thres_impl<64>(
463
+ C64(bs1), C64(bs2), n1, n2, ht, idx, dis);
464
+ case 16:
465
+ return match_hamming_thres_impl<128>(
466
+ C64(bs1), C64(bs2), n1, n2, ht, idx, dis);
467
+ case 32:
468
+ return match_hamming_thres_impl<256>(
469
+ C64(bs1), C64(bs2), n1, n2, ht, idx, dis);
470
+ case 64:
471
+ return match_hamming_thres_impl<512>(
472
+ C64(bs1), C64(bs2), n1, n2, ht, idx, dis);
473
+ default:
474
+ FAISS_THROW_FMT("not implemented for %zu bits", ncodes);
475
+ return 0;
476
+ }
477
+ }
478
+
479
+ #undef C64
480
+
481
+ } // namespace faiss
@@ -0,0 +1,15 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #ifdef COMPILE_SIMD_ARM_NEON
9
+
10
+ #define THE_SIMD_LEVEL SIMDLevel::ARM_NEON
11
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
12
+ #include <faiss/utils/hamming_distance/hamming_computer-neon.h>
13
+ #include <faiss/utils/hamming_distance/hamming_impl.h>
14
+
15
+ #endif // COMPILE_SIMD_ARM_NEON
@@ -0,0 +1,15 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #ifdef COMPILE_SIMD_RISCV_RVV
9
+
10
+ #define THE_SIMD_LEVEL SIMDLevel::RISCV_RVV
11
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
12
+ #include <faiss/utils/hamming_distance/hamming_computer-rvv.h>
13
+ #include <faiss/utils/hamming_distance/hamming_impl.h>
14
+
15
+ #endif // COMPILE_SIMD_RISCV_RVV