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
@@ -0,0 +1,322 @@
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
+ #ifndef HAMMING_COMPUTER_NEON_H
9
+ #define HAMMING_COMPUTER_NEON_H
10
+
11
+ // NEON-optimized HammingComputer and GenHammingComputer specializations.
12
+ // The hamming<nbits>() free functions live in common.h.
13
+ //
14
+ // Universal code (HammingComputer4, HammingComputer8, generalized_hamming_64,
15
+ // hamming_popcount_tail) comes from hamming_computer.h /
16
+ // hamming_computer-generic.h. SIMDLevel::ARM_NEON specializations for the
17
+ // ISA-varying HammingComputer and GenHammingComputer structs live in this file.
18
+
19
+ #ifdef __aarch64__
20
+
21
+ #include <arm_neon.h>
22
+
23
+ #include <cassert>
24
+ #include <cstddef>
25
+ #include <cstdint>
26
+
27
+ #include <faiss/impl/platform_macros.h>
28
+
29
+ #include <faiss/utils/hamming_distance/hamming_computer-generic.h>
30
+
31
+ namespace faiss {
32
+
33
+ /******************************************************************
34
+ * NEON-optimized HammingComputer<SIMDLevel::ARM_NEON> specializations.
35
+ * Sizes 4 and 8 use the scalar versions from hamming_computer.h.
36
+ ******************************************************************/
37
+
38
+ template <>
39
+ struct HammingComputer16_tpl<SIMDLevel::ARM_NEON> {
40
+ uint8x16_t a0;
41
+
42
+ HammingComputer16_tpl() {}
43
+
44
+ HammingComputer16_tpl(const uint8_t* a8, int code_size) {
45
+ set(a8, code_size);
46
+ }
47
+
48
+ void set(const uint8_t* a8, FAISS_MAYBE_UNUSED int code_size) {
49
+ assert(code_size == 16);
50
+ a0 = vld1q_u8(a8);
51
+ }
52
+
53
+ inline int hamming(const uint8_t* b8) const {
54
+ uint8x16_t b0 = vld1q_u8(b8);
55
+
56
+ uint8x16_t or0 = veorq_u8(a0, b0);
57
+ uint8x16_t c0 = vcntq_u8(or0);
58
+ auto dis = vaddvq_u8(c0);
59
+ return dis;
60
+ }
61
+
62
+ inline static constexpr int get_code_size() {
63
+ return 16;
64
+ }
65
+ };
66
+
67
+ // when applied to an array, 1/2 of the 64-bit accesses are unaligned.
68
+ // This incurs a penalty of ~10% wrt. fully aligned accesses.
69
+ template <>
70
+ struct HammingComputer20_tpl<SIMDLevel::ARM_NEON> {
71
+ uint8x16_t a0;
72
+ uint32_t a2;
73
+
74
+ HammingComputer20_tpl() {}
75
+
76
+ HammingComputer20_tpl(const uint8_t* a8, int code_size) {
77
+ set(a8, code_size);
78
+ }
79
+
80
+ void set(const uint8_t* a8, FAISS_MAYBE_UNUSED int code_size) {
81
+ assert(code_size == 20);
82
+
83
+ a0 = vld1q_u8(a8);
84
+
85
+ const uint32_t* a = (uint32_t*)a8;
86
+ a2 = a[4];
87
+ }
88
+
89
+ inline int hamming(const uint8_t* b8) const {
90
+ uint8x16_t b0 = vld1q_u8(b8);
91
+
92
+ uint8x16_t or0 = veorq_u8(a0, b0);
93
+ uint8x16_t c0 = vcntq_u8(or0);
94
+ auto dis = vaddvq_u8(c0);
95
+
96
+ const uint32_t* b = (uint32_t*)b8;
97
+ return dis + popcount64(b[4] ^ a2);
98
+ }
99
+
100
+ inline static constexpr int get_code_size() {
101
+ return 20;
102
+ }
103
+ };
104
+
105
+ template <>
106
+ struct HammingComputer32_tpl<SIMDLevel::ARM_NEON> {
107
+ uint8x16_t a0;
108
+ uint8x16_t a1;
109
+
110
+ HammingComputer32_tpl() {}
111
+
112
+ HammingComputer32_tpl(const uint8_t* a8, int code_size) {
113
+ set(a8, code_size);
114
+ }
115
+
116
+ void set(const uint8_t* a8, FAISS_MAYBE_UNUSED int code_size) {
117
+ assert(code_size == 32);
118
+ a0 = vld1q_u8(a8);
119
+ a1 = vld1q_u8(a8 + 16);
120
+ }
121
+
122
+ inline int hamming(const uint8_t* b8) const {
123
+ uint8x16_t b0 = vld1q_u8(b8);
124
+ uint8x16_t b1 = vld1q_u8(b8 + 16);
125
+
126
+ uint8x16_t or0 = veorq_u8(a0, b0);
127
+ uint8x16_t or1 = veorq_u8(a1, b1);
128
+ uint8x16_t c0 = vcntq_u8(or0);
129
+ uint8x16_t c1 = vcntq_u8(or1);
130
+ uint8x16_t ca = vpaddq_u8(c0, c1);
131
+ auto dis = vaddvq_u8(ca);
132
+ return dis;
133
+ }
134
+
135
+ inline static constexpr int get_code_size() {
136
+ return 32;
137
+ }
138
+ };
139
+
140
+ template <>
141
+ struct HammingComputer64_tpl<SIMDLevel::ARM_NEON> {
142
+ HammingComputer32_tpl<SIMDLevel::ARM_NEON> hc0, hc1;
143
+
144
+ HammingComputer64_tpl() {}
145
+
146
+ HammingComputer64_tpl(const uint8_t* a8, int code_size) {
147
+ set(a8, code_size);
148
+ }
149
+
150
+ void set(const uint8_t* a8, FAISS_MAYBE_UNUSED int code_size) {
151
+ assert(code_size == 64);
152
+ hc0.set(a8, 32);
153
+ hc1.set(a8 + 32, 32);
154
+ }
155
+
156
+ inline int hamming(const uint8_t* b8) const {
157
+ return hc0.hamming(b8) + hc1.hamming(b8 + 32);
158
+ }
159
+
160
+ inline static constexpr int get_code_size() {
161
+ return 64;
162
+ }
163
+ };
164
+
165
+ template <>
166
+ struct HammingComputerDefault_tpl<SIMDLevel::ARM_NEON> {
167
+ const uint8_t* a8;
168
+ int quotient8;
169
+ int remainder8;
170
+
171
+ HammingComputerDefault_tpl() {}
172
+
173
+ HammingComputerDefault_tpl(const uint8_t* a8_in, int code_size) {
174
+ set(a8_in, code_size);
175
+ }
176
+
177
+ void set(const uint8_t* a8_in, int code_size) {
178
+ this->a8 = a8_in;
179
+ quotient8 = code_size / 8;
180
+ remainder8 = code_size % 8;
181
+ }
182
+
183
+ int hamming(const uint8_t* b8) const {
184
+ int accu = 0;
185
+
186
+ const uint64_t* a64 = reinterpret_cast<const uint64_t*>(a8);
187
+ const uint64_t* b64 = reinterpret_cast<const uint64_t*>(b8);
188
+ int i = 0;
189
+
190
+ int len256 = (quotient8 / 4) * 4;
191
+ for (; i < len256; i += 4) {
192
+ accu += ::faiss::hamming<256>(a64 + i, b64 + i);
193
+ }
194
+
195
+ accu += hamming_popcount_tail(
196
+ a64, b64, i, quotient8, a8, b8, remainder8);
197
+ return accu;
198
+ }
199
+
200
+ inline int get_code_size() const {
201
+ return quotient8 * 8 + remainder8;
202
+ }
203
+ };
204
+
205
+ /***************************************************************************
206
+ * NEON-optimized generalized Hamming computer specializations.
207
+ ***************************************************************************/
208
+
209
+ template <>
210
+ struct GenHammingComputer8_tpl<SIMDLevel::ARM_NEON> {
211
+ uint8x8_t a0;
212
+
213
+ GenHammingComputer8_tpl(
214
+ const uint8_t* a8,
215
+ FAISS_MAYBE_UNUSED int code_size) {
216
+ assert(code_size == 8);
217
+ a0 = vld1_u8(a8);
218
+ }
219
+
220
+ inline int hamming(const uint8_t* b8) const {
221
+ uint8x8_t b0 = vld1_u8(b8);
222
+ uint8x8_t reg = vceq_u8(a0, b0);
223
+ uint8x8_t c0 = vcnt_u8(reg);
224
+ return 8 - vaddv_u8(c0) / 8;
225
+ }
226
+
227
+ inline static constexpr int get_code_size() {
228
+ return 8;
229
+ }
230
+ };
231
+
232
+ template <>
233
+ struct GenHammingComputer16_tpl<SIMDLevel::ARM_NEON> {
234
+ uint8x16_t a0;
235
+
236
+ GenHammingComputer16_tpl(
237
+ const uint8_t* a8,
238
+ FAISS_MAYBE_UNUSED int code_size) {
239
+ assert(code_size == 16);
240
+ a0 = vld1q_u8(a8);
241
+ }
242
+
243
+ inline int hamming(const uint8_t* b8) const {
244
+ uint8x16_t b0 = vld1q_u8(b8);
245
+ uint8x16_t reg = vceqq_u8(a0, b0);
246
+ uint8x16_t c0 = vcntq_u8(reg);
247
+ return 16 - vaddvq_u8(c0) / 8;
248
+ }
249
+
250
+ inline static constexpr int get_code_size() {
251
+ return 16;
252
+ }
253
+ };
254
+
255
+ template <>
256
+ struct GenHammingComputer32_tpl<SIMDLevel::ARM_NEON> {
257
+ GenHammingComputer16_tpl<SIMDLevel::ARM_NEON> a0, a1;
258
+
259
+ GenHammingComputer32_tpl(
260
+ const uint8_t* a8,
261
+ FAISS_MAYBE_UNUSED int code_size)
262
+ : a0(a8, 16), a1(a8 + 16, 16) {
263
+ assert(code_size == 32);
264
+ }
265
+
266
+ inline int hamming(const uint8_t* b8) const {
267
+ return a0.hamming(b8) + a1.hamming(b8 + 16);
268
+ }
269
+
270
+ inline static constexpr int get_code_size() {
271
+ return 32;
272
+ }
273
+ };
274
+
275
+ template <>
276
+ struct GenHammingComputerM8_tpl<SIMDLevel::ARM_NEON> {
277
+ const uint64_t* a;
278
+ int n;
279
+
280
+ GenHammingComputerM8_tpl(const uint8_t* a8, int code_size) {
281
+ assert(code_size % 8 == 0);
282
+ a = (uint64_t*)a8;
283
+ n = code_size / 8;
284
+ }
285
+
286
+ int hamming(const uint8_t* b8) const {
287
+ const uint64_t* b = (uint64_t*)b8;
288
+ int accu = 0;
289
+
290
+ int n2 = (n / 2) * 2;
291
+ int i = 0;
292
+ for (; i < n2; i += 2) {
293
+ uint8x16_t a0 = vld1q_u8((const uint8_t*)(a + i));
294
+ uint8x16_t b0 = vld1q_u8((const uint8_t*)(b + i));
295
+ uint8x16_t reg = vceqq_u8(a0, b0);
296
+ uint8x16_t c0 = vcntq_u8(reg);
297
+ auto dis = 16 - vaddvq_u8(c0) / 8;
298
+ accu += dis;
299
+ }
300
+
301
+ for (; i < n; i++) {
302
+ uint8x8_t a0 = vld1_u8((const uint8_t*)(a + i));
303
+ uint8x8_t b0 = vld1_u8((const uint8_t*)(b + i));
304
+ uint8x8_t reg = vceq_u8(a0, b0);
305
+ uint8x8_t c0 = vcnt_u8(reg);
306
+ auto dis = 8 - vaddv_u8(c0) / 8;
307
+ accu += dis;
308
+ }
309
+
310
+ return accu;
311
+ }
312
+
313
+ inline int get_code_size() {
314
+ return n * 8;
315
+ }
316
+ };
317
+
318
+ } // namespace faiss
319
+
320
+ #endif
321
+
322
+ #endif
@@ -0,0 +1,39 @@
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
+ #ifndef HAMMING_COMPUTER_RVV_H
9
+ #define HAMMING_COMPUTER_RVV_H
10
+
11
+ // RVV HammingComputer fallbacks. There is no RVV-optimized HammingComputer
12
+ // implementation yet, so provide concrete RISCV_RVV specializations backed by
13
+ // the scalar NONE implementations.
14
+
15
+ #include <faiss/utils/hamming_distance/hamming_computer-generic.h>
16
+
17
+ namespace faiss {
18
+
19
+ #define FAISS_INHERIT_HAMMING_RVV(Class) \
20
+ template <> \
21
+ struct Class##_tpl<SIMDLevel::RISCV_RVV> : Class##_tpl<SIMDLevel::NONE> { \
22
+ using Class##_tpl<SIMDLevel::NONE>::Class##_tpl; \
23
+ }
24
+
25
+ FAISS_INHERIT_HAMMING_RVV(HammingComputer16);
26
+ FAISS_INHERIT_HAMMING_RVV(HammingComputer20);
27
+ FAISS_INHERIT_HAMMING_RVV(HammingComputer32);
28
+ FAISS_INHERIT_HAMMING_RVV(HammingComputer64);
29
+ FAISS_INHERIT_HAMMING_RVV(HammingComputerDefault);
30
+ FAISS_INHERIT_HAMMING_RVV(GenHammingComputer8);
31
+ FAISS_INHERIT_HAMMING_RVV(GenHammingComputer16);
32
+ FAISS_INHERIT_HAMMING_RVV(GenHammingComputer32);
33
+ FAISS_INHERIT_HAMMING_RVV(GenHammingComputerM8);
34
+
35
+ #undef FAISS_INHERIT_HAMMING_RVV
36
+
37
+ } // namespace faiss
38
+
39
+ #endif
@@ -0,0 +1,146 @@
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
+ // This file contains forward declarations, architecture-independent
9
+ // HammingComputer structs (sizes 4 and 8), and the with_HammingComputer
10
+ // dispatch function. SIMDLevel-specific specializations live in:
11
+ // hamming_computer-generic.h (NONE — scalar fallback)
12
+ // hamming_computer-avx2.h (AVX2)
13
+ // hamming_computer-avx512.h (AVX512)
14
+ // hamming_computer-neon.h (ARM NEON)
15
+
16
+ #ifndef FAISS_hamming_computer_h
17
+ #define FAISS_hamming_computer_h
18
+
19
+ #include <faiss/utils/hamming_distance/common.h>
20
+
21
+ namespace faiss {
22
+
23
+ /***************************************************************************
24
+ * HammingComputer primary templates.
25
+ *
26
+ * Per-ISA backend files (hamming_computer-avx512.h, hamming_computer-neon.h,
27
+ * etc.) provide explicit specializations that override the scalar (NONE)
28
+ * defaults in hamming_computer-generic.h with ISA-optimized code.
29
+ * Templating on SIMDLevel gives each specialization a distinct mangled
30
+ * name, so DD builds with multiple per-ISA TUs do NOT create ODR-violating
31
+ * struct collisions.
32
+ *
33
+ * Call sites use with_HammingComputer<SL>, which is templatized on
34
+ * SIMDLevel to select the matching specialization.
35
+ ***************************************************************************/
36
+
37
+ // Forward declarations. The struct bodies live in hamming_computer-generic.h
38
+ // (NONE) and per-ISA hamming_computer-*.h files.
39
+ template <SIMDLevel SL>
40
+ struct HammingComputer16_tpl;
41
+ template <SIMDLevel SL>
42
+ struct HammingComputer20_tpl;
43
+ template <SIMDLevel SL>
44
+ struct HammingComputer32_tpl;
45
+ template <SIMDLevel SL>
46
+ struct HammingComputer64_tpl;
47
+ template <SIMDLevel SL>
48
+ struct HammingComputerDefault_tpl;
49
+ template <SIMDLevel SL>
50
+ struct GenHammingComputer8_tpl;
51
+ template <SIMDLevel SL>
52
+ struct GenHammingComputer16_tpl;
53
+ template <SIMDLevel SL>
54
+ struct GenHammingComputer32_tpl;
55
+ template <SIMDLevel SL>
56
+ struct GenHammingComputerM8_tpl;
57
+
58
+ /******************************************************************
59
+ * The HammingComputer series of classes compares a single code of
60
+ * size 4 to 32 to incoming codes. They are intended for use as a
61
+ * template class where it would be inefficient to switch on the code
62
+ * size in the inner loop. Hopefully the compiler will inline the
63
+ * hamming() functions and put the a0, a1, ... in registers.
64
+ * For code_size = 4 and 8 we don't use SIMD implementations, because
65
+ * register widths are too large.
66
+ ******************************************************************/
67
+
68
+ struct HammingComputer4 {
69
+ uint32_t a0;
70
+
71
+ HammingComputer4() {}
72
+
73
+ HammingComputer4(const uint8_t* a, int code_size) {
74
+ set(a, code_size);
75
+ }
76
+
77
+ void set(const uint8_t* a, FAISS_MAYBE_UNUSED int code_size) {
78
+ assert(code_size == 4);
79
+ const uint32_t* a32 = reinterpret_cast<const uint32_t*>(a);
80
+ a0 = *a32;
81
+ }
82
+
83
+ inline int hamming(const uint8_t* b) const {
84
+ const uint32_t* b32 = reinterpret_cast<const uint32_t*>(b);
85
+ return popcount64(*b32 ^ a0);
86
+ }
87
+
88
+ inline static constexpr int get_code_size() {
89
+ return 4;
90
+ }
91
+ };
92
+
93
+ struct HammingComputer8 {
94
+ uint64_t a0;
95
+
96
+ HammingComputer8() {}
97
+
98
+ HammingComputer8(const uint8_t* a, int code_size) {
99
+ set(a, code_size);
100
+ }
101
+
102
+ void set(const uint8_t* a, FAISS_MAYBE_UNUSED int code_size) {
103
+ assert(code_size == 8);
104
+ const uint64_t* a64 = reinterpret_cast<const uint64_t*>(a);
105
+ a0 = *a64;
106
+ }
107
+
108
+ inline int hamming(const uint8_t* b) const {
109
+ const uint64_t* b64 = reinterpret_cast<const uint64_t*>(b);
110
+ return popcount64(*b64 ^ a0);
111
+ }
112
+
113
+ inline static constexpr int get_code_size() {
114
+ return 8;
115
+ }
116
+ };
117
+
118
+ /***************************************************************************
119
+ * Dispatching function that takes a code size and a C++20 template lambda.
120
+ * The lambda is called with the appropriate HammingComputer type:
121
+ * with_HammingComputer<SL>(code_size, [&]<class HammingComputer>() { ... });
122
+ **************************************************************************/
123
+
124
+ template <SIMDLevel SL, class F>
125
+ decltype(auto) with_HammingComputer(int code_size, F&& f) {
126
+ switch (code_size) {
127
+ case 4:
128
+ return f.template operator()<HammingComputer4>();
129
+ case 8:
130
+ return f.template operator()<HammingComputer8>();
131
+ case 16:
132
+ return f.template operator()<HammingComputer16_tpl<SL>>();
133
+ case 20:
134
+ return f.template operator()<HammingComputer20_tpl<SL>>();
135
+ case 32:
136
+ return f.template operator()<HammingComputer32_tpl<SL>>();
137
+ case 64:
138
+ return f.template operator()<HammingComputer64_tpl<SL>>();
139
+ default:
140
+ return f.template operator()<HammingComputerDefault_tpl<SL>>();
141
+ }
142
+ }
143
+
144
+ } // namespace faiss
145
+
146
+ #endif