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
@@ -1,450 +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_GENERIC_INL_H
9
- #define HAMMING_GENERIC_INL_H
10
-
11
- // A general-purpose version of hamming distance computation.
12
-
13
- #include <cassert>
14
- #include <cstddef>
15
- #include <cstdint>
16
-
17
- #include <faiss/impl/platform_macros.h>
18
-
19
- namespace faiss {
20
-
21
- /* Elementary Hamming distance computation: unoptimized */
22
- template <size_t nbits, typename T>
23
- inline T hamming(const uint8_t* bs1, const uint8_t* bs2) {
24
- const size_t nbytes = nbits / 8;
25
- size_t i;
26
- T h = 0;
27
- for (i = 0; i < nbytes; i++) {
28
- h += (T)hamdis_tab_ham_bytes[bs1[i] ^ bs2[i]];
29
- }
30
- return h;
31
- }
32
-
33
- /* Hamming distances for multiples of 64 bits */
34
- template <size_t nbits>
35
- inline hamdis_t hamming(const uint64_t* bs1, const uint64_t* bs2) {
36
- const size_t nwords = nbits / 64;
37
- size_t i;
38
- hamdis_t h = 0;
39
- for (i = 0; i < nwords; i++) {
40
- h += popcount64(bs1[i] ^ bs2[i]);
41
- }
42
- return h;
43
- }
44
-
45
- /* specialized (optimized) functions */
46
- template <>
47
- inline hamdis_t hamming<64>(const uint64_t* pa, const uint64_t* pb) {
48
- return popcount64(pa[0] ^ pb[0]);
49
- }
50
-
51
- template <>
52
- inline hamdis_t hamming<128>(const uint64_t* pa, const uint64_t* pb) {
53
- return popcount64(pa[0] ^ pb[0]) + popcount64(pa[1] ^ pb[1]);
54
- }
55
-
56
- template <>
57
- inline hamdis_t hamming<256>(const uint64_t* pa, const uint64_t* pb) {
58
- return popcount64(pa[0] ^ pb[0]) + popcount64(pa[1] ^ pb[1]) +
59
- popcount64(pa[2] ^ pb[2]) + popcount64(pa[3] ^ pb[3]);
60
- }
61
-
62
- /* Hamming distances for multiple of 64 bits */
63
- inline hamdis_t hamming(
64
- const uint64_t* bs1,
65
- const uint64_t* bs2,
66
- size_t nwords) {
67
- hamdis_t h = 0;
68
- for (size_t i = 0; i < nwords; i++) {
69
- h += popcount64(bs1[i] ^ bs2[i]);
70
- }
71
- return h;
72
- }
73
-
74
- /******************************************************************
75
- * The HammingComputer series of classes compares a single code of
76
- * size 4 to 32 to incoming codes. They are intended for use as a
77
- * template class where it would be inefficient to switch on the code
78
- * size in the inner loop. Hopefully the compiler will inline the
79
- * hamming() functions and put the a0, a1, ... in registers.
80
- ******************************************************************/
81
-
82
- struct HammingComputer4 {
83
- uint32_t a0;
84
-
85
- HammingComputer4() {}
86
-
87
- HammingComputer4(const uint8_t* a, int code_size) {
88
- set(a, code_size);
89
- }
90
-
91
- void set(const uint8_t* a, int code_size) {
92
- assert(code_size == 4);
93
- a0 = *(uint32_t*)a;
94
- }
95
-
96
- inline int hamming(const uint8_t* b) const {
97
- return popcount64(*(uint32_t*)b ^ a0);
98
- }
99
-
100
- inline static constexpr int get_code_size() {
101
- return 4;
102
- }
103
- };
104
-
105
- struct HammingComputer8 {
106
- uint64_t a0;
107
-
108
- HammingComputer8() {}
109
-
110
- HammingComputer8(const uint8_t* a, int code_size) {
111
- set(a, code_size);
112
- }
113
-
114
- void set(const uint8_t* a, int code_size) {
115
- assert(code_size == 8);
116
- a0 = *(uint64_t*)a;
117
- }
118
-
119
- inline int hamming(const uint8_t* b) const {
120
- return popcount64(*(uint64_t*)b ^ a0);
121
- }
122
-
123
- inline static constexpr int get_code_size() {
124
- return 8;
125
- }
126
- };
127
-
128
- struct HammingComputer16 {
129
- uint64_t a0, a1;
130
-
131
- HammingComputer16() {}
132
-
133
- HammingComputer16(const uint8_t* a8, int code_size) {
134
- set(a8, code_size);
135
- }
136
-
137
- void set(const uint8_t* a8, int code_size) {
138
- assert(code_size == 16);
139
- const uint64_t* a = (uint64_t*)a8;
140
- a0 = a[0];
141
- a1 = a[1];
142
- }
143
-
144
- inline int hamming(const uint8_t* b8) const {
145
- const uint64_t* b = (uint64_t*)b8;
146
- return popcount64(b[0] ^ a0) + popcount64(b[1] ^ a1);
147
- }
148
-
149
- inline static constexpr int get_code_size() {
150
- return 16;
151
- }
152
- };
153
-
154
- // when applied to an array, 1/2 of the 64-bit accesses are unaligned.
155
- // This incurs a penalty of ~10% wrt. fully aligned accesses.
156
- struct HammingComputer20 {
157
- uint64_t a0, a1;
158
- uint32_t a2;
159
-
160
- HammingComputer20() {}
161
-
162
- HammingComputer20(const uint8_t* a8, int code_size) {
163
- set(a8, code_size);
164
- }
165
-
166
- void set(const uint8_t* a8, int code_size) {
167
- assert(code_size == 20);
168
- const uint64_t* a = (uint64_t*)a8;
169
- const uint32_t* b = (uint32_t*)a8;
170
- a0 = a[0];
171
- a1 = a[1];
172
- // can't read a[2] since it is uint64_t, not uint32_t
173
- // results in AddressSanitizer failure reading past end of array
174
- a2 = b[4];
175
- }
176
-
177
- inline int hamming(const uint8_t* b8) const {
178
- const uint64_t* b = (uint64_t*)b8;
179
- return popcount64(b[0] ^ a0) + popcount64(b[1] ^ a1) +
180
- popcount64(*(uint32_t*)(b + 2) ^ a2);
181
- }
182
-
183
- inline static constexpr int get_code_size() {
184
- return 20;
185
- }
186
- };
187
-
188
- struct HammingComputer32 {
189
- uint64_t a0, a1, a2, a3;
190
-
191
- HammingComputer32() {}
192
-
193
- HammingComputer32(const uint8_t* a8, int code_size) {
194
- set(a8, code_size);
195
- }
196
-
197
- void set(const uint8_t* a8, int code_size) {
198
- assert(code_size == 32);
199
- const uint64_t* a = (uint64_t*)a8;
200
- a0 = a[0];
201
- a1 = a[1];
202
- a2 = a[2];
203
- a3 = a[3];
204
- }
205
-
206
- inline int hamming(const uint8_t* b8) const {
207
- const uint64_t* b = (uint64_t*)b8;
208
- return popcount64(b[0] ^ a0) + popcount64(b[1] ^ a1) +
209
- popcount64(b[2] ^ a2) + popcount64(b[3] ^ a3);
210
- }
211
-
212
- inline static constexpr int get_code_size() {
213
- return 32;
214
- }
215
- };
216
-
217
- struct HammingComputer64 {
218
- uint64_t a0, a1, a2, a3, a4, a5, a6, a7;
219
-
220
- HammingComputer64() {}
221
-
222
- HammingComputer64(const uint8_t* a8, int code_size) {
223
- set(a8, code_size);
224
- }
225
-
226
- void set(const uint8_t* a8, int code_size) {
227
- assert(code_size == 64);
228
- const uint64_t* a = (uint64_t*)a8;
229
- a0 = a[0];
230
- a1 = a[1];
231
- a2 = a[2];
232
- a3 = a[3];
233
- a4 = a[4];
234
- a5 = a[5];
235
- a6 = a[6];
236
- a7 = a[7];
237
- }
238
-
239
- inline int hamming(const uint8_t* b8) const {
240
- const uint64_t* b = (uint64_t*)b8;
241
- return popcount64(b[0] ^ a0) + popcount64(b[1] ^ a1) +
242
- popcount64(b[2] ^ a2) + popcount64(b[3] ^ a3) +
243
- popcount64(b[4] ^ a4) + popcount64(b[5] ^ a5) +
244
- popcount64(b[6] ^ a6) + popcount64(b[7] ^ a7);
245
- }
246
-
247
- inline static constexpr int get_code_size() {
248
- return 64;
249
- }
250
- };
251
-
252
- struct HammingComputerDefault {
253
- const uint8_t* a8;
254
- int quotient8;
255
- int remainder8;
256
-
257
- HammingComputerDefault() {}
258
-
259
- HammingComputerDefault(const uint8_t* a8, int code_size) {
260
- set(a8, code_size);
261
- }
262
-
263
- void set(const uint8_t* a8, int code_size) {
264
- this->a8 = a8;
265
- quotient8 = code_size / 8;
266
- remainder8 = code_size % 8;
267
- }
268
-
269
- int hamming(const uint8_t* b8) const {
270
- int accu = 0;
271
-
272
- const uint64_t* a64 = reinterpret_cast<const uint64_t*>(a8);
273
- const uint64_t* b64 = reinterpret_cast<const uint64_t*>(b8);
274
- int i = 0, len = quotient8;
275
- switch (len & 7) {
276
- default:
277
- while (len > 7) {
278
- len -= 8;
279
- accu += popcount64(a64[i] ^ b64[i]);
280
- i++;
281
- [[fallthrough]];
282
- case 7:
283
- accu += popcount64(a64[i] ^ b64[i]);
284
- i++;
285
- [[fallthrough]];
286
- case 6:
287
- accu += popcount64(a64[i] ^ b64[i]);
288
- i++;
289
- [[fallthrough]];
290
- case 5:
291
- accu += popcount64(a64[i] ^ b64[i]);
292
- i++;
293
- [[fallthrough]];
294
- case 4:
295
- accu += popcount64(a64[i] ^ b64[i]);
296
- i++;
297
- [[fallthrough]];
298
- case 3:
299
- accu += popcount64(a64[i] ^ b64[i]);
300
- i++;
301
- [[fallthrough]];
302
- case 2:
303
- accu += popcount64(a64[i] ^ b64[i]);
304
- i++;
305
- [[fallthrough]];
306
- case 1:
307
- accu += popcount64(a64[i] ^ b64[i]);
308
- i++;
309
- }
310
- }
311
- if (remainder8) {
312
- const uint8_t* a = a8 + 8 * quotient8;
313
- const uint8_t* b = b8 + 8 * quotient8;
314
- switch (remainder8) {
315
- [[fallthrough]];
316
- case 7:
317
- accu += hamdis_tab_ham_bytes[a[6] ^ b[6]];
318
- [[fallthrough]];
319
- case 6:
320
- accu += hamdis_tab_ham_bytes[a[5] ^ b[5]];
321
- [[fallthrough]];
322
- case 5:
323
- accu += hamdis_tab_ham_bytes[a[4] ^ b[4]];
324
- [[fallthrough]];
325
- case 4:
326
- accu += hamdis_tab_ham_bytes[a[3] ^ b[3]];
327
- [[fallthrough]];
328
- case 3:
329
- accu += hamdis_tab_ham_bytes[a[2] ^ b[2]];
330
- [[fallthrough]];
331
- case 2:
332
- accu += hamdis_tab_ham_bytes[a[1] ^ b[1]];
333
- [[fallthrough]];
334
- case 1:
335
- accu += hamdis_tab_ham_bytes[a[0] ^ b[0]];
336
- [[fallthrough]];
337
- default:
338
- break;
339
- }
340
- }
341
-
342
- return accu;
343
- }
344
-
345
- inline int get_code_size() const {
346
- return quotient8 * 8 + remainder8;
347
- }
348
- };
349
-
350
- /***************************************************************************
351
- * generalized Hamming = number of bytes that are different between
352
- * two codes.
353
- ***************************************************************************/
354
-
355
- inline int generalized_hamming_64(uint64_t a) {
356
- a |= a >> 1;
357
- a |= a >> 2;
358
- a |= a >> 4;
359
- a &= 0x0101010101010101UL;
360
- return popcount64(a);
361
- }
362
-
363
- struct GenHammingComputer8 {
364
- uint64_t a0;
365
-
366
- GenHammingComputer8(const uint8_t* a, int code_size) {
367
- assert(code_size == 8);
368
- a0 = *(uint64_t*)a;
369
- }
370
-
371
- inline int hamming(const uint8_t* b) const {
372
- return generalized_hamming_64(*(uint64_t*)b ^ a0);
373
- }
374
-
375
- inline static constexpr int get_code_size() {
376
- return 8;
377
- }
378
- };
379
-
380
- struct GenHammingComputer16 {
381
- uint64_t a0, a1;
382
- GenHammingComputer16(const uint8_t* a8, int code_size) {
383
- assert(code_size == 16);
384
- const uint64_t* a = (uint64_t*)a8;
385
- a0 = a[0];
386
- a1 = a[1];
387
- }
388
-
389
- inline int hamming(const uint8_t* b8) const {
390
- const uint64_t* b = (uint64_t*)b8;
391
- return generalized_hamming_64(b[0] ^ a0) +
392
- generalized_hamming_64(b[1] ^ a1);
393
- }
394
-
395
- inline static constexpr int get_code_size() {
396
- return 16;
397
- }
398
- };
399
-
400
- struct GenHammingComputer32 {
401
- uint64_t a0, a1, a2, a3;
402
-
403
- GenHammingComputer32(const uint8_t* a8, int code_size) {
404
- assert(code_size == 32);
405
- const uint64_t* a = (uint64_t*)a8;
406
- a0 = a[0];
407
- a1 = a[1];
408
- a2 = a[2];
409
- a3 = a[3];
410
- }
411
-
412
- inline int hamming(const uint8_t* b8) const {
413
- const uint64_t* b = (uint64_t*)b8;
414
- return generalized_hamming_64(b[0] ^ a0) +
415
- generalized_hamming_64(b[1] ^ a1) +
416
- generalized_hamming_64(b[2] ^ a2) +
417
- generalized_hamming_64(b[3] ^ a3);
418
- }
419
-
420
- inline static constexpr int get_code_size() {
421
- return 32;
422
- }
423
- };
424
-
425
- struct GenHammingComputerM8 {
426
- const uint64_t* a;
427
- int n;
428
-
429
- GenHammingComputerM8(const uint8_t* a8, int code_size) {
430
- assert(code_size % 8 == 0);
431
- a = (uint64_t*)a8;
432
- n = code_size / 8;
433
- }
434
-
435
- int hamming(const uint8_t* b8) const {
436
- const uint64_t* b = (uint64_t*)b8;
437
- int accu = 0;
438
- for (int i = 0; i < n; i++)
439
- accu += generalized_hamming_64(a[i] ^ b[i]);
440
- return accu;
441
- }
442
-
443
- inline int get_code_size() const {
444
- return n * 8;
445
- }
446
- };
447
-
448
- } // namespace faiss
449
-
450
- #endif
@@ -1,87 +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
- // This file contains low level inline facilities for computing
9
- // Hamming distances, such as HammingComputerXX and GenHammingComputerXX.
10
-
11
- #ifndef FAISS_hamming_inl_h
12
- #define FAISS_hamming_inl_h
13
-
14
- #include <faiss/utils/hamming_distance/common.h>
15
-
16
- #ifdef __aarch64__
17
- // ARM compilers may produce inoptimal code for Hamming distance somewhy.
18
- #include <faiss/utils/hamming_distance/neon-inl.h>
19
- #elif __AVX512F__
20
- // offers better performance where __AVX512VPOPCNTDQ__ is supported
21
- #include <faiss/utils/hamming_distance/avx512-inl.h>
22
- #elif __AVX2__
23
- // better versions for GenHammingComputer
24
- #include <faiss/utils/hamming_distance/avx2-inl.h>
25
- #else
26
- #include <faiss/utils/hamming_distance/generic-inl.h>
27
- #endif
28
-
29
- namespace faiss {
30
-
31
- /***************************************************************************
32
- * Equivalence with a template class when code size is known at compile time
33
- **************************************************************************/
34
-
35
- // default template
36
- template <int CODE_SIZE>
37
- struct HammingComputer : HammingComputerDefault {
38
- HammingComputer(const uint8_t* a, int code_size)
39
- : HammingComputerDefault(a, code_size) {}
40
- };
41
-
42
- #define SPECIALIZED_HC(CODE_SIZE) \
43
- template <> \
44
- struct HammingComputer<CODE_SIZE> : HammingComputer##CODE_SIZE { \
45
- HammingComputer(const uint8_t* a) \
46
- : HammingComputer##CODE_SIZE(a, CODE_SIZE) {} \
47
- }
48
-
49
- SPECIALIZED_HC(4);
50
- SPECIALIZED_HC(8);
51
- SPECIALIZED_HC(16);
52
- SPECIALIZED_HC(20);
53
- SPECIALIZED_HC(32);
54
- SPECIALIZED_HC(64);
55
-
56
- #undef SPECIALIZED_HC
57
-
58
- /***************************************************************************
59
- * Dispatching function that takes a code size and a consumer object
60
- * the consumer object should contain a retun type t and a operation template
61
- * function f() that must be called to perform the operation.
62
- **************************************************************************/
63
-
64
- template <class Consumer, class... Types>
65
- typename Consumer::T dispatch_HammingComputer(
66
- int code_size,
67
- Consumer& consumer,
68
- Types... args) {
69
- switch (code_size) {
70
- #define DISPATCH_HC(CODE_SIZE) \
71
- case CODE_SIZE: \
72
- return consumer.template f<HammingComputer##CODE_SIZE>(args...);
73
- DISPATCH_HC(4);
74
- DISPATCH_HC(8);
75
- DISPATCH_HC(16);
76
- DISPATCH_HC(20);
77
- DISPATCH_HC(32);
78
- DISPATCH_HC(64);
79
- default:
80
- return consumer.template f<HammingComputerDefault>(args...);
81
- }
82
- #undef DISPATCH_HC
83
- }
84
-
85
- } // namespace faiss
86
-
87
- #endif