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
@@ -1,524 +0,0 @@
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_NEON_INL_H
9
- #define HAMMING_NEON_INL_H
10
-
11
- // a specialized version of hamming is needed here, because both
12
- // gcc, clang and msvc seem to generate suboptimal code sometimes.
13
-
14
- #ifdef __aarch64__
15
-
16
- #include <arm_neon.h>
17
-
18
- #include <cassert>
19
- #include <cstddef>
20
- #include <cstdint>
21
-
22
- #include <faiss/impl/platform_macros.h>
23
-
24
- #include <faiss/utils/hamming_distance/common.h>
25
-
26
- namespace faiss {
27
-
28
- /* Elementary Hamming distance computation: unoptimized */
29
- template <size_t nbits, typename T>
30
- inline T hamming(const uint8_t* bs1, const uint8_t* bs2) {
31
- const size_t nbytes = nbits / 8;
32
- size_t i;
33
- T h = 0;
34
- for (i = 0; i < nbytes; i++) {
35
- h += (T)hamdis_tab_ham_bytes[bs1[i] ^ bs2[i]];
36
- }
37
- return h;
38
- }
39
-
40
- /* Hamming distances for multiples of 64 bits */
41
- template <size_t nbits>
42
- inline hamdis_t hamming(const uint64_t* pa, const uint64_t* pb) {
43
- constexpr size_t nwords256 = nbits / 256;
44
- constexpr size_t nwords128 = (nbits - nwords256 * 256) / 128;
45
- constexpr size_t nwords64 =
46
- (nbits - nwords256 * 256 - nwords128 * 128) / 64;
47
-
48
- hamdis_t h = 0;
49
- if (nwords256 > 0) {
50
- for (size_t i = 0; i < nwords256; i++) {
51
- h += hamming<256>(pa, pb);
52
- pa += 4;
53
- pb += 4;
54
- }
55
- }
56
-
57
- if (nwords128 > 0) {
58
- h += hamming<128>(pa, pb);
59
- pa += 2;
60
- pb += 2;
61
- }
62
-
63
- if (nwords64 > 0) {
64
- h += hamming<64>(pa, pb);
65
- }
66
-
67
- return h;
68
- }
69
-
70
- /* specialized (optimized) functions */
71
- template <>
72
- inline hamdis_t hamming<64>(const uint64_t* pa, const uint64_t* pb) {
73
- return popcount64(pa[0] ^ pb[0]);
74
- }
75
-
76
- template <>
77
- inline hamdis_t hamming<128>(const uint64_t* pa, const uint64_t* pb) {
78
- const uint8_t* pa8 = reinterpret_cast<const uint8_t*>(pa);
79
- const uint8_t* pb8 = reinterpret_cast<const uint8_t*>(pb);
80
- uint8x16_t or0 = veorq_u8(vld1q_u8(pa8), vld1q_u8(pb8));
81
- uint8x16_t c0 = vcntq_u8(or0);
82
- auto dis = vaddvq_u8(c0);
83
- return dis;
84
- }
85
-
86
- template <>
87
- inline hamdis_t hamming<256>(const uint64_t* pa, const uint64_t* pb) {
88
- const uint8_t* pa8 = reinterpret_cast<const uint8_t*>(pa);
89
- const uint8_t* pb8 = reinterpret_cast<const uint8_t*>(pb);
90
- uint8x16_t or0 = veorq_u8(vld1q_u8(pa8), vld1q_u8(pb8));
91
- uint8x16_t or1 = veorq_u8(vld1q_u8(pa8 + 16), vld1q_u8(pb8 + 16));
92
- uint8x16_t c0 = vcntq_u8(or0);
93
- uint8x16_t c1 = vcntq_u8(or1);
94
- uint8x16_t ca = vpaddq_u8(c0, c1);
95
- auto dis = vaddvq_u8(ca);
96
- return dis;
97
- }
98
-
99
- /* Hamming distances for multiple of 64 bits */
100
- inline hamdis_t hamming(const uint64_t* pa, const uint64_t* pb, size_t nwords) {
101
- const size_t nwords256 = nwords / 4;
102
- const size_t nwords128 = (nwords % 4) / 2;
103
- const size_t nwords64 = nwords % 2;
104
-
105
- hamdis_t h = 0;
106
- if (nwords256 > 0) {
107
- for (size_t i = 0; i < nwords256; i++) {
108
- h += hamming<256>(pa, pb);
109
- pa += 4;
110
- pb += 4;
111
- }
112
- }
113
-
114
- if (nwords128 > 0) {
115
- h += hamming<128>(pa, pb);
116
- pa += 2;
117
- pb += 2;
118
- }
119
-
120
- if (nwords64 > 0) {
121
- h += hamming<64>(pa, pb);
122
- }
123
-
124
- return h;
125
- }
126
-
127
- /******************************************************************
128
- * The HammingComputer series of classes compares a single code of
129
- * size 4 to 32 to incoming codes. They are intended for use as a
130
- * template class where it would be inefficient to switch on the code
131
- * size in the inner loop. Hopefully the compiler will inline the
132
- * hamming() functions and put the a0, a1, ... in registers.
133
- ******************************************************************/
134
-
135
- struct HammingComputer4 {
136
- uint32_t a0;
137
-
138
- HammingComputer4() {}
139
-
140
- HammingComputer4(const uint8_t* a, int code_size) {
141
- set(a, code_size);
142
- }
143
-
144
- void set(const uint8_t* a, int code_size) {
145
- assert(code_size == 4);
146
- a0 = *(uint32_t*)a;
147
- }
148
-
149
- inline int hamming(const uint8_t* b) const {
150
- return popcount64(*(uint32_t*)b ^ a0);
151
- }
152
-
153
- inline static constexpr int get_code_size() {
154
- return 4;
155
- }
156
- };
157
-
158
- struct HammingComputer8 {
159
- uint64_t a0;
160
-
161
- HammingComputer8() {}
162
-
163
- HammingComputer8(const uint8_t* a, int code_size) {
164
- set(a, code_size);
165
- }
166
-
167
- void set(const uint8_t* a, int code_size) {
168
- assert(code_size == 8);
169
- a0 = *(uint64_t*)a;
170
- }
171
-
172
- inline int hamming(const uint8_t* b) const {
173
- return popcount64(*(uint64_t*)b ^ a0);
174
- }
175
-
176
- inline static constexpr int get_code_size() {
177
- return 8;
178
- }
179
- };
180
-
181
- struct HammingComputer16 {
182
- uint8x16_t a0;
183
-
184
- HammingComputer16() {}
185
-
186
- HammingComputer16(const uint8_t* a8, int code_size) {
187
- set(a8, code_size);
188
- }
189
-
190
- void set(const uint8_t* a8, int code_size) {
191
- assert(code_size == 16);
192
- a0 = vld1q_u8(a8);
193
- }
194
-
195
- inline int hamming(const uint8_t* b8) const {
196
- uint8x16_t b0 = vld1q_u8(b8);
197
-
198
- uint8x16_t or0 = veorq_u8(a0, b0);
199
- uint8x16_t c0 = vcntq_u8(or0);
200
- auto dis = vaddvq_u8(c0);
201
- return dis;
202
- }
203
-
204
- inline static constexpr int get_code_size() {
205
- return 16;
206
- }
207
- };
208
-
209
- // when applied to an array, 1/2 of the 64-bit accesses are unaligned.
210
- // This incurs a penalty of ~10% wrt. fully aligned accesses.
211
- struct HammingComputer20 {
212
- uint8x16_t a0;
213
- uint32_t a2;
214
-
215
- HammingComputer20() {}
216
-
217
- HammingComputer20(const uint8_t* a8, int code_size) {
218
- set(a8, code_size);
219
- }
220
-
221
- void set(const uint8_t* a8, int code_size) {
222
- assert(code_size == 20);
223
-
224
- a0 = vld1q_u8(a8);
225
-
226
- const uint32_t* a = (uint32_t*)a8;
227
- a2 = a[4];
228
- }
229
-
230
- inline int hamming(const uint8_t* b8) const {
231
- uint8x16_t b0 = vld1q_u8(b8);
232
-
233
- uint8x16_t or0 = veorq_u8(a0, b0);
234
- uint8x16_t c0 = vcntq_u8(or0);
235
- auto dis = vaddvq_u8(c0);
236
-
237
- const uint32_t* b = (uint32_t*)b8;
238
- return dis + popcount64(b[4] ^ a2);
239
- }
240
-
241
- inline static constexpr int get_code_size() {
242
- return 20;
243
- }
244
- };
245
-
246
- struct HammingComputer32 {
247
- uint8x16_t a0;
248
- uint8x16_t a1;
249
-
250
- HammingComputer32() {}
251
-
252
- HammingComputer32(const uint8_t* a8, int code_size) {
253
- set(a8, code_size);
254
- }
255
-
256
- void set(const uint8_t* a8, int code_size) {
257
- assert(code_size == 32);
258
- a0 = vld1q_u8(a8);
259
- a1 = vld1q_u8(a8 + 16);
260
- }
261
-
262
- inline int hamming(const uint8_t* b8) const {
263
- uint8x16_t b0 = vld1q_u8(b8);
264
- uint8x16_t b1 = vld1q_u8(b8 + 16);
265
-
266
- uint8x16_t or0 = veorq_u8(a0, b0);
267
- uint8x16_t or1 = veorq_u8(a1, b1);
268
- uint8x16_t c0 = vcntq_u8(or0);
269
- uint8x16_t c1 = vcntq_u8(or1);
270
- uint8x16_t ca = vpaddq_u8(c0, c1);
271
- auto dis = vaddvq_u8(ca);
272
- return dis;
273
- }
274
-
275
- inline static constexpr int get_code_size() {
276
- return 32;
277
- }
278
- };
279
-
280
- struct HammingComputer64 {
281
- HammingComputer32 hc0, hc1;
282
-
283
- HammingComputer64() {}
284
-
285
- HammingComputer64(const uint8_t* a8, int code_size) {
286
- set(a8, code_size);
287
- }
288
-
289
- void set(const uint8_t* a8, int code_size) {
290
- assert(code_size == 64);
291
- hc0.set(a8, 32);
292
- hc1.set(a8 + 32, 32);
293
- }
294
-
295
- inline int hamming(const uint8_t* b8) const {
296
- return hc0.hamming(b8) + hc1.hamming(b8 + 32);
297
- }
298
-
299
- inline static constexpr int get_code_size() {
300
- return 64;
301
- }
302
- };
303
-
304
- struct HammingComputerDefault {
305
- const uint8_t* a8;
306
- int quotient8;
307
- int remainder8;
308
-
309
- HammingComputerDefault() {}
310
-
311
- HammingComputerDefault(const uint8_t* a8, int code_size) {
312
- set(a8, code_size);
313
- }
314
-
315
- void set(const uint8_t* a8, int code_size) {
316
- this->a8 = a8;
317
- quotient8 = code_size / 8;
318
- remainder8 = code_size % 8;
319
- }
320
-
321
- int hamming(const uint8_t* b8) const {
322
- int accu = 0;
323
-
324
- const uint64_t* a64 = reinterpret_cast<const uint64_t*>(a8);
325
- const uint64_t* b64 = reinterpret_cast<const uint64_t*>(b8);
326
- int i = 0, len = quotient8;
327
-
328
- int len256 = (quotient8 / 4) * 4;
329
- for (; i < len256; i += 4) {
330
- accu += ::faiss::hamming<256>(a64 + i, b64 + i);
331
- len -= 4;
332
- }
333
-
334
- switch (len & 7) {
335
- default:
336
- while (len > 7) {
337
- len -= 8;
338
- accu += popcount64(a64[i] ^ b64[i]);
339
- i++;
340
- [[fallthrough]];
341
- case 7:
342
- accu += popcount64(a64[i] ^ b64[i]);
343
- i++;
344
- [[fallthrough]];
345
- case 6:
346
- accu += popcount64(a64[i] ^ b64[i]);
347
- i++;
348
- [[fallthrough]];
349
- case 5:
350
- accu += popcount64(a64[i] ^ b64[i]);
351
- i++;
352
- [[fallthrough]];
353
- case 4:
354
- accu += popcount64(a64[i] ^ b64[i]);
355
- i++;
356
- [[fallthrough]];
357
- case 3:
358
- accu += popcount64(a64[i] ^ b64[i]);
359
- i++;
360
- [[fallthrough]];
361
- case 2:
362
- accu += popcount64(a64[i] ^ b64[i]);
363
- i++;
364
- [[fallthrough]];
365
- case 1:
366
- accu += popcount64(a64[i] ^ b64[i]);
367
- i++;
368
- }
369
- }
370
- if (remainder8) {
371
- const uint8_t* a = a8 + 8 * quotient8;
372
- const uint8_t* b = b8 + 8 * quotient8;
373
- switch (remainder8) {
374
- case 7:
375
- accu += hamdis_tab_ham_bytes[a[6] ^ b[6]];
376
- [[fallthrough]];
377
- case 6:
378
- accu += hamdis_tab_ham_bytes[a[5] ^ b[5]];
379
- [[fallthrough]];
380
- case 5:
381
- accu += hamdis_tab_ham_bytes[a[4] ^ b[4]];
382
- [[fallthrough]];
383
- case 4:
384
- accu += hamdis_tab_ham_bytes[a[3] ^ b[3]];
385
- [[fallthrough]];
386
- case 3:
387
- accu += hamdis_tab_ham_bytes[a[2] ^ b[2]];
388
- [[fallthrough]];
389
- case 2:
390
- accu += hamdis_tab_ham_bytes[a[1] ^ b[1]];
391
- [[fallthrough]];
392
- case 1:
393
- accu += hamdis_tab_ham_bytes[a[0] ^ b[0]];
394
- [[fallthrough]];
395
- default:
396
- break;
397
- }
398
- }
399
-
400
- return accu;
401
- }
402
-
403
- inline int get_code_size() const {
404
- return quotient8 * 8 + remainder8;
405
- }
406
- };
407
-
408
- /***************************************************************************
409
- * generalized Hamming = number of bytes that are different between
410
- * two codes.
411
- ***************************************************************************/
412
-
413
- inline int generalized_hamming_64(uint64_t a) {
414
- a |= a >> 1;
415
- a |= a >> 2;
416
- a |= a >> 4;
417
- a &= 0x0101010101010101UL;
418
- return popcount64(a);
419
- }
420
-
421
- struct GenHammingComputer8 {
422
- uint8x8_t a0;
423
-
424
- GenHammingComputer8(const uint8_t* a8, int code_size) {
425
- assert(code_size == 8);
426
- a0 = vld1_u8(a8);
427
- }
428
-
429
- inline int hamming(const uint8_t* b8) const {
430
- uint8x8_t b0 = vld1_u8(b8);
431
- uint8x8_t reg = vceq_u8(a0, b0);
432
- uint8x8_t c0 = vcnt_u8(reg);
433
- return 8 - vaddv_u8(c0) / 8;
434
- }
435
-
436
- inline static constexpr int get_code_size() {
437
- return 8;
438
- }
439
- };
440
-
441
- struct GenHammingComputer16 {
442
- uint8x16_t a0;
443
-
444
- GenHammingComputer16(const uint8_t* a8, int code_size) {
445
- assert(code_size == 16);
446
- a0 = vld1q_u8(a8);
447
- }
448
-
449
- inline int hamming(const uint8_t* b8) const {
450
- uint8x16_t b0 = vld1q_u8(b8);
451
- uint8x16_t reg = vceqq_u8(a0, b0);
452
- uint8x16_t c0 = vcntq_u8(reg);
453
- return 16 - vaddvq_u8(c0) / 8;
454
- }
455
-
456
- inline static constexpr int get_code_size() {
457
- return 16;
458
- }
459
- };
460
-
461
- struct GenHammingComputer32 {
462
- GenHammingComputer16 a0, a1;
463
-
464
- GenHammingComputer32(const uint8_t* a8, int code_size)
465
- : a0(a8, 16), a1(a8 + 16, 16) {
466
- assert(code_size == 32);
467
- }
468
-
469
- inline int hamming(const uint8_t* b8) const {
470
- return a0.hamming(b8) + a1.hamming(b8 + 16);
471
- }
472
-
473
- inline static constexpr int get_code_size() {
474
- return 32;
475
- }
476
- };
477
-
478
- struct GenHammingComputerM8 {
479
- const uint64_t* a;
480
- int n;
481
-
482
- GenHammingComputerM8(const uint8_t* a8, int code_size) {
483
- assert(code_size % 8 == 0);
484
- a = (uint64_t*)a8;
485
- n = code_size / 8;
486
- }
487
-
488
- int hamming(const uint8_t* b8) const {
489
- const uint64_t* b = (uint64_t*)b8;
490
- int accu = 0;
491
-
492
- int n2 = (n / 2) * 2;
493
- int i = 0;
494
- for (; i < n2; i += 2) {
495
- uint8x16_t a0 = vld1q_u8((const uint8_t*)(a + i));
496
- uint8x16_t b0 = vld1q_u8((const uint8_t*)(b + i));
497
- uint8x16_t reg = vceqq_u8(a0, b0);
498
- uint8x16_t c0 = vcntq_u8(reg);
499
- auto dis = 16 - vaddvq_u8(c0) / 8;
500
- accu += dis;
501
- }
502
-
503
- for (; i < n; i++) {
504
- uint8x8_t a0 = vld1_u8((const uint8_t*)(a + i));
505
- uint8x8_t b0 = vld1_u8((const uint8_t*)(b + i));
506
- uint8x8_t reg = vceq_u8(a0, b0);
507
- uint8x8_t c0 = vcnt_u8(reg);
508
- auto dis = 8 - vaddv_u8(c0) / 8;
509
- accu += dis;
510
- }
511
-
512
- return accu;
513
- }
514
-
515
- inline int get_code_size() {
516
- return n * 8;
517
- }
518
- };
519
-
520
- } // namespace faiss
521
-
522
- #endif
523
-
524
- #endif
@@ -1,42 +0,0 @@
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
- #pragma once
9
-
10
- /** Abstractions for 256-bit registers
11
- *
12
- * The objective is to separate the different interpretations of the same
13
- * registers (as a vector of uint8, uint16 or uint32), to provide printing
14
- * functions.
15
- */
16
-
17
- #if defined(__AVX512F__)
18
-
19
- #include <faiss/utils/simdlib_avx2.h>
20
- #include <faiss/utils/simdlib_avx512.h>
21
-
22
- #elif defined(__AVX2__)
23
-
24
- #include <faiss/utils/simdlib_avx2.h>
25
-
26
- #elif defined(__aarch64__)
27
-
28
- #include <faiss/utils/simdlib_neon.h>
29
-
30
- #elif defined(__PPC64__)
31
-
32
- #include <faiss/utils/simdlib_ppc64.h>
33
-
34
- #else
35
-
36
- // emulated = all operations are implemented as scalars
37
- #include <faiss/utils/simdlib_emulated.h>
38
-
39
- // FIXME: make a SSE version
40
- // is this ever going to happen? We will probably rather implement AVX512
41
-
42
- #endif