faiss 0.5.3 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/ext/faiss/ext.cpp +1 -1
  4. data/ext/faiss/extconf.rb +4 -4
  5. data/ext/faiss/index.cpp +63 -45
  6. data/ext/faiss/index_binary.cpp +37 -27
  7. data/ext/faiss/kmeans.cpp +9 -8
  8. data/ext/faiss/pca_matrix.cpp +9 -7
  9. data/ext/faiss/product_quantizer.cpp +13 -11
  10. data/ext/faiss/utils.cpp +4 -2
  11. data/ext/faiss/utils.h +4 -0
  12. data/lib/faiss/version.rb +1 -1
  13. data/lib/faiss.rb +1 -1
  14. data/vendor/faiss/faiss/AutoTune.cpp +214 -82
  15. data/vendor/faiss/faiss/AutoTune.h +14 -1
  16. data/vendor/faiss/faiss/Clustering.cpp +97 -249
  17. data/vendor/faiss/faiss/Clustering.h +18 -0
  18. data/vendor/faiss/faiss/IVFlib.cpp +67 -44
  19. data/vendor/faiss/faiss/Index.cpp +25 -12
  20. data/vendor/faiss/faiss/Index.h +26 -4
  21. data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
  22. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +68 -61
  23. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
  24. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
  25. data/vendor/faiss/faiss/IndexBinary.cpp +6 -3
  26. data/vendor/faiss/faiss/IndexBinary.h +4 -4
  27. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +1 -1
  28. data/vendor/faiss/faiss/IndexBinaryFlat.h +1 -1
  29. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -4
  30. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +92 -95
  31. data/vendor/faiss/faiss/IndexBinaryHNSW.h +9 -3
  32. data/vendor/faiss/faiss/IndexBinaryHash.cpp +45 -236
  33. data/vendor/faiss/faiss/IndexBinaryHash.h +6 -6
  34. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +120 -414
  35. data/vendor/faiss/faiss/IndexFastScan.cpp +105 -129
  36. data/vendor/faiss/faiss/IndexFastScan.h +35 -24
  37. data/vendor/faiss/faiss/IndexFlat.cpp +216 -152
  38. data/vendor/faiss/faiss/IndexFlat.h +32 -14
  39. data/vendor/faiss/faiss/IndexFlatCodes.cpp +88 -41
  40. data/vendor/faiss/faiss/IndexFlatCodes.h +7 -1
  41. data/vendor/faiss/faiss/IndexHNSW.cpp +299 -187
  42. data/vendor/faiss/faiss/IndexHNSW.h +30 -14
  43. data/vendor/faiss/faiss/IndexIDMap.cpp +26 -22
  44. data/vendor/faiss/faiss/IndexIDMap.h +9 -7
  45. data/vendor/faiss/faiss/IndexIVF.cpp +535 -405
  46. data/vendor/faiss/faiss/IndexIVF.h +47 -16
  47. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +77 -74
  48. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +105 -99
  49. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +6 -3
  50. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +379 -249
  51. data/vendor/faiss/faiss/IndexIVFFastScan.h +65 -60
  52. data/vendor/faiss/faiss/IndexIVFFlat.cpp +41 -124
  53. data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
  54. data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +89 -138
  55. data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
  56. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
  57. data/vendor/faiss/faiss/IndexIVFPQ.cpp +77 -907
  58. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +184 -122
  59. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
  60. data/vendor/faiss/faiss/IndexIVFPQR.cpp +23 -18
  61. data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +59 -60
  62. data/vendor/faiss/faiss/IndexIVFRaBitQ.h +4 -3
  63. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +564 -416
  64. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +269 -111
  65. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
  66. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
  67. data/vendor/faiss/faiss/IndexLSH.cpp +44 -25
  68. data/vendor/faiss/faiss/IndexLattice.cpp +41 -36
  69. data/vendor/faiss/faiss/IndexNNDescent.cpp +37 -21
  70. data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
  71. data/vendor/faiss/faiss/IndexNSG.cpp +40 -23
  72. data/vendor/faiss/faiss/IndexNSG.h +0 -2
  73. data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +32 -12
  74. data/vendor/faiss/faiss/IndexPQ.cpp +129 -213
  75. data/vendor/faiss/faiss/IndexPQ.h +3 -2
  76. data/vendor/faiss/faiss/IndexPQFastScan.cpp +20 -14
  77. data/vendor/faiss/faiss/IndexPQFastScan.h +3 -0
  78. data/vendor/faiss/faiss/IndexPreTransform.cpp +25 -18
  79. data/vendor/faiss/faiss/IndexPreTransform.h +1 -1
  80. data/vendor/faiss/faiss/IndexRaBitQ.cpp +31 -43
  81. data/vendor/faiss/faiss/IndexRaBitQ.h +4 -3
  82. data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +135 -317
  83. data/vendor/faiss/faiss/IndexRaBitQFastScan.h +192 -34
  84. data/vendor/faiss/faiss/IndexRefine.cpp +30 -55
  85. data/vendor/faiss/faiss/IndexRefine.h +4 -4
  86. data/vendor/faiss/faiss/IndexReplicas.cpp +6 -6
  87. data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +15 -14
  88. data/vendor/faiss/faiss/IndexRowwiseMinMax.h +1 -1
  89. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +82 -14
  90. data/vendor/faiss/faiss/IndexShards.cpp +13 -13
  91. data/vendor/faiss/faiss/IndexShardsIVF.cpp +21 -15
  92. data/vendor/faiss/faiss/MatrixStats.cpp +5 -4
  93. data/vendor/faiss/faiss/MetaIndexes.cpp +19 -17
  94. data/vendor/faiss/faiss/MetaIndexes.h +1 -1
  95. data/vendor/faiss/faiss/MetricType.h +29 -6
  96. data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
  97. data/vendor/faiss/faiss/SuperKMeans.h +97 -0
  98. data/vendor/faiss/faiss/VectorTransform.cpp +349 -141
  99. data/vendor/faiss/faiss/VectorTransform.h +39 -16
  100. data/vendor/faiss/faiss/build.cpp +23 -0
  101. data/vendor/faiss/faiss/build.h +15 -0
  102. data/vendor/faiss/faiss/clone_index.cpp +55 -51
  103. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +47 -47
  104. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +11 -0
  105. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +38 -38
  106. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +11 -0
  107. data/vendor/faiss/faiss/{cppcontrib/factory_tools.cpp → factory_tools.cpp} +6 -1
  108. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +1 -1
  109. data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -5
  110. data/vendor/faiss/faiss/gpu/GpuResources.h +1 -1
  111. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +9 -9
  112. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +4 -3
  113. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +46 -0
  114. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +56 -0
  115. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +78 -1
  116. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +72 -0
  117. data/vendor/faiss/faiss/gpu/test/TestUtils.h +23 -0
  118. data/vendor/faiss/faiss/gpu/utils/CuvsFilterConvert.h +1 -1
  119. data/vendor/faiss/faiss/gpu/utils/CuvsUtils.h +21 -10
  120. data/vendor/faiss/faiss/gpu_metal/GpuIndexFlat.h +22 -0
  121. data/vendor/faiss/faiss/gpu_metal/MetalCloner.h +35 -0
  122. data/vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h +40 -0
  123. data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +51 -0
  124. data/vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h +65 -0
  125. data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +66 -0
  126. data/vendor/faiss/faiss/gpu_metal/MetalResources.h +79 -0
  127. data/vendor/faiss/faiss/gpu_metal/StandardMetalResources.h +35 -0
  128. data/vendor/faiss/faiss/impl/AdSampling.cpp +103 -0
  129. data/vendor/faiss/faiss/impl/AdSampling.h +35 -0
  130. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +64 -34
  131. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +1 -0
  132. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +10 -9
  133. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +3 -28
  134. data/vendor/faiss/faiss/impl/ClusteringHelpers.cpp +244 -0
  135. data/vendor/faiss/faiss/impl/ClusteringHelpers.h +94 -0
  136. data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +367 -0
  137. data/vendor/faiss/faiss/impl/ClusteringInitialization.h +107 -0
  138. data/vendor/faiss/faiss/impl/CodePacker.cpp +7 -3
  139. data/vendor/faiss/faiss/impl/CodePacker.h +11 -3
  140. data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +83 -0
  141. data/vendor/faiss/faiss/impl/CodePackerRaBitQ.h +47 -0
  142. data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
  143. data/vendor/faiss/faiss/impl/FaissAssert.h +64 -3
  144. data/vendor/faiss/faiss/impl/FaissException.h +50 -3
  145. data/vendor/faiss/faiss/impl/HNSW.cpp +117 -351
  146. data/vendor/faiss/faiss/impl/HNSW.h +21 -40
  147. data/vendor/faiss/faiss/impl/IDSelector.cpp +15 -11
  148. data/vendor/faiss/faiss/impl/IDSelector.h +8 -8
  149. data/vendor/faiss/faiss/impl/InvertedListScannerStats.h +26 -0
  150. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +114 -102
  151. data/vendor/faiss/faiss/impl/NNDescent.cpp +63 -26
  152. data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
  153. data/vendor/faiss/faiss/impl/NSG.cpp +44 -26
  154. data/vendor/faiss/faiss/impl/NSG.h +20 -10
  155. data/vendor/faiss/faiss/impl/Panorama.cpp +76 -52
  156. data/vendor/faiss/faiss/impl/Panorama.h +265 -78
  157. data/vendor/faiss/faiss/impl/PdxLayout.cpp +93 -0
  158. data/vendor/faiss/faiss/impl/PdxLayout.h +41 -0
  159. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +62 -37
  160. data/vendor/faiss/faiss/impl/PolysemousTraining.h +3 -3
  161. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +35 -35
  162. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +21 -16
  163. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +99 -80
  164. data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
  165. data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +135 -37
  166. data/vendor/faiss/faiss/impl/RaBitQUtils.h +148 -21
  167. data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +298 -301
  168. data/vendor/faiss/faiss/impl/RaBitQuantizer.h +3 -10
  169. data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.cpp +15 -41
  170. data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.h +0 -4
  171. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +40 -32
  172. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
  173. data/vendor/faiss/faiss/impl/ResultHandler.h +218 -113
  174. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +119 -2362
  175. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +27 -3
  176. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
  177. data/vendor/faiss/faiss/impl/VisitedTable.cpp +42 -0
  178. data/vendor/faiss/faiss/impl/VisitedTable.h +76 -0
  179. data/vendor/faiss/faiss/impl/approx_topk/approx_topk.h +276 -0
  180. data/vendor/faiss/faiss/impl/approx_topk/avx2.cpp +68 -0
  181. data/vendor/faiss/faiss/{utils → impl}/approx_topk/generic.h +15 -8
  182. data/vendor/faiss/faiss/impl/approx_topk/neon.cpp +68 -0
  183. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab-inl.h +169 -0
  184. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab.h +117 -0
  185. data/vendor/faiss/faiss/impl/approx_topk/simdlib256-inl.h +146 -0
  186. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h +73 -0
  187. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHash_impl.h +270 -0
  188. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +460 -0
  189. data/vendor/faiss/faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h +159 -0
  190. data/vendor/faiss/faiss/impl/binary_hamming/IndexPQ_impl.h +92 -0
  191. data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +26 -0
  192. data/vendor/faiss/faiss/impl/binary_hamming/avx512.cpp +26 -0
  193. data/vendor/faiss/faiss/impl/binary_hamming/dispatch.h +143 -0
  194. data/vendor/faiss/faiss/impl/binary_hamming/neon.cpp +26 -0
  195. data/vendor/faiss/faiss/impl/binary_hamming/rvv.cpp +26 -0
  196. data/vendor/faiss/faiss/impl/expanded_scanners.h +163 -0
  197. data/vendor/faiss/faiss/impl/{FastScanDistancePostProcessing.h → fast_scan/FastScanDistancePostProcessing.h} +13 -6
  198. data/vendor/faiss/faiss/impl/{LookupTableScaler.h → fast_scan/LookupTableScaler.h} +16 -5
  199. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops.h +237 -0
  200. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops_512.h +185 -0
  201. data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +229 -0
  202. data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +268 -0
  203. data/vendor/faiss/faiss/impl/{pq4_fast_scan.cpp → fast_scan/fast_scan.cpp} +176 -4
  204. data/vendor/faiss/faiss/impl/fast_scan/fast_scan.h +341 -0
  205. data/vendor/faiss/faiss/impl/fast_scan/impl-avx2.cpp +36 -0
  206. data/vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp +40 -0
  207. data/vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp +120 -0
  208. data/vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp +104 -0
  209. data/vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h +213 -0
  210. data/vendor/faiss/faiss/impl/{pq4_fast_scan_search_qbs.cpp → fast_scan/kernels_simd512.h} +26 -348
  211. data/vendor/faiss/faiss/impl/fast_scan/rabitq_dispatching.h +90 -0
  212. data/vendor/faiss/faiss/impl/fast_scan/rabitq_result_handler.h +108 -0
  213. data/vendor/faiss/faiss/impl/{simd_result_handlers.h → fast_scan/simd_result_handlers.h} +290 -142
  214. data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +54 -0
  215. data/vendor/faiss/faiss/impl/hnsw/LockVector.h +64 -0
  216. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +91 -0
  217. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +64 -0
  218. data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +104 -0
  219. data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +111 -0
  220. data/vendor/faiss/faiss/impl/index_read.cpp +1950 -505
  221. data/vendor/faiss/faiss/impl/index_read_utils.h +1 -2
  222. data/vendor/faiss/faiss/impl/index_write.cpp +112 -21
  223. data/vendor/faiss/faiss/impl/io.cpp +6 -6
  224. data/vendor/faiss/faiss/impl/io_macros.h +33 -16
  225. data/vendor/faiss/faiss/impl/kmeans1d.cpp +10 -10
  226. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +81 -40
  227. data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
  228. data/vendor/faiss/faiss/impl/mapped_io.cpp +15 -8
  229. data/vendor/faiss/faiss/impl/platform_macros.h +11 -4
  230. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +549 -0
  231. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +245 -0
  232. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h +105 -0
  233. data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +106 -0
  234. data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +21 -0
  235. data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +21 -0
  236. data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +21 -0
  237. data/vendor/faiss/faiss/impl/{code_distance/code_distance-avx2.h → pq_code_distance/pq_code_distance-avx2.h} +43 -220
  238. data/vendor/faiss/faiss/impl/{code_distance/code_distance-avx512.h → pq_code_distance/pq_code_distance-avx512.h} +25 -112
  239. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +59 -0
  240. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h +96 -0
  241. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +256 -0
  242. data/vendor/faiss/faiss/impl/{code_distance/code_distance-sve.h → pq_code_distance/pq_code_distance-sve.cpp} +57 -146
  243. data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +68 -0
  244. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +320 -483
  245. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
  246. data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +121 -0
  247. data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +137 -0
  248. data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +371 -0
  249. data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +190 -0
  250. data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +94 -0
  251. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +603 -0
  252. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +597 -0
  253. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +388 -0
  254. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +630 -0
  255. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +311 -0
  256. data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +387 -0
  257. data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +54 -0
  258. data/vendor/faiss/faiss/impl/simd_dispatch.h +173 -0
  259. data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
  260. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +274 -171
  261. data/vendor/faiss/faiss/impl/simdlib/simdlib_avx512.h +414 -0
  262. data/vendor/faiss/faiss/impl/simdlib/simdlib_dispatch.h +44 -0
  263. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_emulated.h +231 -166
  264. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_neon.h +275 -217
  265. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_ppc64.h +201 -160
  266. data/vendor/faiss/faiss/impl/svs_io.cpp +12 -3
  267. data/vendor/faiss/faiss/impl/svs_io.h +8 -2
  268. data/vendor/faiss/faiss/index_factory.cpp +115 -28
  269. data/vendor/faiss/faiss/index_io.h +53 -3
  270. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +73 -20
  271. data/vendor/faiss/faiss/invlists/DirectMap.cpp +24 -14
  272. data/vendor/faiss/faiss/invlists/DirectMap.h +4 -3
  273. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +157 -73
  274. data/vendor/faiss/faiss/invlists/InvertedLists.h +86 -23
  275. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +4 -4
  276. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +14 -14
  277. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
  278. data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +9 -19
  279. data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
  280. data/vendor/faiss/faiss/svs/IndexSVSFlat.h +2 -0
  281. data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +350 -0
  282. data/vendor/faiss/faiss/svs/IndexSVSIVF.h +128 -0
  283. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.cpp +40 -0
  284. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.h +43 -0
  285. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +225 -0
  286. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.h +71 -0
  287. data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +25 -1
  288. data/vendor/faiss/faiss/svs/IndexSVSVamana.h +19 -2
  289. data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +1 -1
  290. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +19 -2
  291. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +14 -0
  292. data/vendor/faiss/faiss/utils/Heap.cpp +56 -10
  293. data/vendor/faiss/faiss/utils/Heap.h +21 -0
  294. data/vendor/faiss/faiss/utils/NeuralNet.cpp +54 -40
  295. data/vendor/faiss/faiss/utils/NeuralNet.h +1 -1
  296. data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +10 -4
  297. data/vendor/faiss/faiss/utils/distances.cpp +507 -559
  298. data/vendor/faiss/faiss/utils/distances.h +118 -1
  299. data/vendor/faiss/faiss/utils/distances_dispatch.h +250 -0
  300. data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +8 -7
  301. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +33 -14
  302. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +12 -1
  303. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +16 -293
  304. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp +57 -0
  305. data/vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h +290 -0
  306. data/vendor/faiss/faiss/utils/distances_simd.cpp +72 -3681
  307. data/vendor/faiss/faiss/utils/extra_distances.cpp +60 -102
  308. data/vendor/faiss/faiss/utils/extra_distances.h +79 -7
  309. data/vendor/faiss/faiss/utils/hamming-inl.h +13 -11
  310. data/vendor/faiss/faiss/utils/hamming.cpp +66 -517
  311. data/vendor/faiss/faiss/utils/hamming.h +92 -2
  312. data/vendor/faiss/faiss/utils/hamming_distance/common.h +287 -10
  313. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +15 -0
  314. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +15 -0
  315. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h +142 -0
  316. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +234 -0
  317. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-generic.h +368 -0
  318. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h +322 -0
  319. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-rvv.h +39 -0
  320. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer.h +146 -0
  321. data/vendor/faiss/faiss/utils/hamming_distance/hamming_impl.h +481 -0
  322. data/vendor/faiss/faiss/utils/hamming_distance/hamming_neon.cpp +15 -0
  323. data/vendor/faiss/faiss/utils/hamming_distance/hamming_rvv.cpp +15 -0
  324. data/vendor/faiss/faiss/utils/partitioning.cpp +66 -987
  325. data/vendor/faiss/faiss/utils/partitioning.h +31 -0
  326. data/vendor/faiss/faiss/utils/popcount.h +29 -0
  327. data/vendor/faiss/faiss/utils/pq_code_distance.h +251 -0
  328. data/vendor/faiss/faiss/utils/prefetch.h +2 -2
  329. data/vendor/faiss/faiss/utils/quantize_lut.cpp +30 -30
  330. data/vendor/faiss/faiss/utils/quantize_lut.h +1 -1
  331. data/vendor/faiss/faiss/utils/rabitq_simd.h +124 -343
  332. data/vendor/faiss/faiss/utils/random.cpp +6 -6
  333. data/vendor/faiss/faiss/utils/simd_impl/IVFFlatScanner-inl.h +51 -0
  334. data/vendor/faiss/faiss/utils/simd_impl/distances_aarch64.cpp +154 -0
  335. data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +777 -0
  336. data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +306 -0
  337. data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +1431 -0
  338. data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +1095 -0
  339. data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +189 -0
  340. data/vendor/faiss/faiss/utils/simd_impl/distances_simdlib256.h +195 -0
  341. data/vendor/faiss/faiss/utils/simd_impl/distances_sse-inl.h +392 -0
  342. data/vendor/faiss/faiss/utils/{distances_fused/simdlib_based.h → simd_impl/exhaustive_L2sqr_blas_cmax.h} +5 -10
  343. data/vendor/faiss/faiss/utils/simd_impl/hamming_impl.h +481 -0
  344. data/vendor/faiss/faiss/utils/simd_impl/partitioning_avx2.cpp +14 -0
  345. data/vendor/faiss/faiss/utils/simd_impl/partitioning_neon.cpp +14 -0
  346. data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +1085 -0
  347. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +355 -0
  348. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +477 -0
  349. data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +55 -0
  350. data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +55 -0
  351. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h +32 -0
  352. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels.h +43 -0
  353. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp +57 -0
  354. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp +45 -0
  355. data/vendor/faiss/faiss/utils/simd_levels.cpp +334 -0
  356. data/vendor/faiss/faiss/utils/simd_levels.h +183 -0
  357. data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
  358. data/vendor/faiss/faiss/utils/utils.cpp +21 -14
  359. data/vendor/faiss/faiss/utils/utils.h +3 -3
  360. metadata +156 -42
  361. data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
  362. data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
  363. data/vendor/faiss/faiss/impl/code_distance/code_distance-generic.h +0 -81
  364. data/vendor/faiss/faiss/impl/code_distance/code_distance.h +0 -186
  365. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -216
  366. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -224
  367. data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +0 -84
  368. data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +0 -196
  369. data/vendor/faiss/faiss/utils/approx_topk/mode.h +0 -34
  370. data/vendor/faiss/faiss/utils/distances_fused/avx512.h +0 -36
  371. data/vendor/faiss/faiss/utils/extra_distances-inl.h +0 -228
  372. data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +0 -462
  373. data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +0 -490
  374. data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +0 -450
  375. data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +0 -87
  376. data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +0 -524
  377. data/vendor/faiss/faiss/utils/simdlib.h +0 -42
  378. data/vendor/faiss/faiss/utils/simdlib_avx512.h +0 -296
  379. /data/vendor/faiss/faiss/{cppcontrib/factory_tools.h → factory_tools.h} +0 -0
@@ -0,0 +1,245 @@
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
+ #include <faiss/impl/pq_code_distance/IVFPQ_QueryTables.h>
9
+
10
+ #include <faiss/Clustering.h>
11
+ #include <faiss/utils/distances_dispatch.h>
12
+
13
+ namespace faiss {
14
+ namespace pq_code_distance {
15
+
16
+ QueryTables::QueryTables(
17
+ const IndexIVFPQ& ivfpq_in,
18
+ const IVFSearchParameters* params_in)
19
+ : ivfpq(ivfpq_in),
20
+ params(params_in),
21
+ d(ivfpq_in.d),
22
+ pq(ivfpq_in.pq),
23
+ metric_type(ivfpq_in.metric_type),
24
+ by_residual(ivfpq_in.by_residual),
25
+ use_precomputed_table(ivfpq_in.use_precomputed_table) {
26
+ mem.resize(pq.ksub * pq.M * 2 + d * 2);
27
+ sim_table = mem.data();
28
+ sim_table_2 = sim_table + pq.ksub * pq.M;
29
+ residual_vec = sim_table_2 + pq.ksub * pq.M;
30
+ decoded_vec = residual_vec + d;
31
+
32
+ // for polysemous
33
+ polysemous_ht = ivfpq_in.polysemous_ht;
34
+ if (auto ivfpq_params =
35
+ dynamic_cast<const IVFPQSearchParameters*>(params_in)) {
36
+ polysemous_ht = ivfpq_params->polysemous_ht;
37
+ }
38
+ if (polysemous_ht != 0) {
39
+ q_code.resize(pq.code_size);
40
+ }
41
+ init_list_cycles = 0;
42
+ sim_table_ptrs.resize(pq.M);
43
+ }
44
+
45
+ void QueryTables::init_query(const float* qi_in) {
46
+ this->qi = qi_in;
47
+ if (metric_type == METRIC_INNER_PRODUCT) {
48
+ init_query_IP();
49
+ } else {
50
+ init_query_L2();
51
+ }
52
+ if (!by_residual && polysemous_ht != 0) {
53
+ pq.compute_code(qi_in, q_code.data());
54
+ }
55
+ }
56
+
57
+ void QueryTables::init_query_IP() {
58
+ // precompute some tables specific to the query qi
59
+ pq.compute_inner_prod_table(qi, sim_table);
60
+ }
61
+
62
+ void QueryTables::init_query_L2() {
63
+ if (!by_residual) {
64
+ pq.compute_distance_table(qi, sim_table);
65
+ } else if (use_precomputed_table) {
66
+ pq.compute_inner_prod_table(qi, sim_table_2);
67
+ }
68
+ }
69
+
70
+ float QueryTables::precompute_list_tables() {
71
+ float dis0 = 0;
72
+ uint64_t t0;
73
+ TIC;
74
+ if (by_residual) {
75
+ if (metric_type == METRIC_INNER_PRODUCT) {
76
+ dis0 = precompute_list_tables_IP();
77
+ } else {
78
+ dis0 = precompute_list_tables_L2();
79
+ }
80
+ }
81
+ init_list_cycles += TOC;
82
+ return dis0;
83
+ }
84
+
85
+ float QueryTables::precompute_list_table_pointers() {
86
+ float dis0 = 0;
87
+ uint64_t t0;
88
+ TIC;
89
+ if (by_residual) {
90
+ if (metric_type == METRIC_INNER_PRODUCT) {
91
+ FAISS_THROW_MSG("not implemented");
92
+ } else {
93
+ dis0 = precompute_list_table_pointers_L2();
94
+ }
95
+ }
96
+ init_list_cycles += TOC;
97
+ return dis0;
98
+ }
99
+
100
+ void QueryTables::init_list(idx_t list_no, float coarse_dis_in, int mode) {
101
+ this->key = list_no;
102
+ this->coarse_dis = coarse_dis_in;
103
+
104
+ if (mode == 2) {
105
+ dis0 = precompute_list_tables();
106
+ } else if (mode == 1) {
107
+ dis0 = precompute_list_table_pointers();
108
+ }
109
+ }
110
+
111
+ float QueryTables::precompute_list_tables_IP() {
112
+ // prepare the sim_table that will be used for accumulation
113
+ // and dis0, the initial value
114
+ ivfpq.quantizer->reconstruct(key, decoded_vec);
115
+ // decoded_vec = centroid
116
+ float dis0 = fvec_inner_product_dispatch(qi, decoded_vec, d);
117
+
118
+ if (polysemous_ht) {
119
+ for (int i = 0; i < d; i++) {
120
+ residual_vec[i] = qi[i] - decoded_vec[i];
121
+ }
122
+ pq.compute_code(residual_vec, q_code.data());
123
+ }
124
+ return dis0;
125
+ }
126
+
127
+ float QueryTables::precompute_list_tables_L2() {
128
+ float dis0 = 0;
129
+
130
+ if (use_precomputed_table == 0 || use_precomputed_table == -1) {
131
+ ivfpq.quantizer->compute_residual(qi, residual_vec, key);
132
+ pq.compute_distance_table(residual_vec, sim_table);
133
+
134
+ if (polysemous_ht != 0) {
135
+ pq.compute_code(residual_vec, q_code.data());
136
+ }
137
+
138
+ } else if (use_precomputed_table == 1) {
139
+ dis0 = coarse_dis;
140
+
141
+ fvec_madd_dispatch(
142
+ pq.M * pq.ksub,
143
+ ivfpq.precomputed_table.data() + key * pq.ksub * pq.M,
144
+ -2.0,
145
+ sim_table_2,
146
+ sim_table);
147
+
148
+ if (polysemous_ht != 0) {
149
+ ivfpq.quantizer->compute_residual(qi, residual_vec, key);
150
+ pq.compute_code(residual_vec, q_code.data());
151
+ }
152
+
153
+ } else if (use_precomputed_table == 2) {
154
+ dis0 = coarse_dis;
155
+
156
+ const MultiIndexQuantizer* miq =
157
+ dynamic_cast<const MultiIndexQuantizer*>(ivfpq.quantizer);
158
+ FAISS_THROW_IF_NOT(miq);
159
+ const ProductQuantizer& cpq = miq->pq;
160
+ size_t Mf = pq.M / cpq.M;
161
+
162
+ const float* qtab = sim_table_2; // query-specific table
163
+ float* ltab = sim_table; // (output) list-specific table
164
+
165
+ long k = key;
166
+ for (size_t cm = 0; cm < cpq.M; cm++) {
167
+ // compute PQ index
168
+ size_t ki = k & ((uint64_t(1) << cpq.nbits) - 1);
169
+ k >>= cpq.nbits;
170
+
171
+ // get corresponding table
172
+ const float* pc = ivfpq.precomputed_table.data() +
173
+ (ki * pq.M + cm * Mf) * pq.ksub;
174
+
175
+ if (polysemous_ht == 0) {
176
+ // sum up with query-specific table
177
+ fvec_madd_dispatch(Mf * pq.ksub, pc, -2.0, qtab, ltab);
178
+ ltab += Mf * pq.ksub;
179
+ qtab += Mf * pq.ksub;
180
+ } else {
181
+ for (size_t m = cm * Mf; m < (cm + 1) * Mf; m++) {
182
+ q_code[m] = fvec_madd_and_argmin_dispatch(
183
+ pq.ksub, pc, -2, qtab, ltab);
184
+ pc += pq.ksub;
185
+ ltab += pq.ksub;
186
+ qtab += pq.ksub;
187
+ }
188
+ }
189
+ }
190
+ }
191
+
192
+ return dis0;
193
+ }
194
+
195
+ float QueryTables::precompute_list_table_pointers_L2() {
196
+ float dis0 = 0;
197
+
198
+ if (use_precomputed_table == 1) {
199
+ dis0 = coarse_dis;
200
+
201
+ const float* s = ivfpq.precomputed_table.data() + key * pq.ksub * pq.M;
202
+ for (size_t m = 0; m < pq.M; m++) {
203
+ sim_table_ptrs[m] = s;
204
+ s += pq.ksub;
205
+ }
206
+ } else if (use_precomputed_table == 2) {
207
+ dis0 = coarse_dis;
208
+
209
+ const MultiIndexQuantizer* miq =
210
+ dynamic_cast<const MultiIndexQuantizer*>(ivfpq.quantizer);
211
+ FAISS_THROW_IF_NOT(miq);
212
+ const ProductQuantizer& cpq = miq->pq;
213
+ size_t Mf = pq.M / cpq.M;
214
+
215
+ long k = key;
216
+ size_t m0 = 0;
217
+ for (size_t cm = 0; cm < cpq.M; cm++) {
218
+ size_t ki = k & ((uint64_t(1) << cpq.nbits) - 1);
219
+ k >>= cpq.nbits;
220
+
221
+ const float* pc = ivfpq.precomputed_table.data() +
222
+ (ki * pq.M + cm * Mf) * pq.ksub;
223
+
224
+ for (size_t m = m0; m < m0 + Mf; m++) {
225
+ sim_table_ptrs[m] = pc;
226
+ pc += pq.ksub;
227
+ }
228
+ m0 += Mf;
229
+ }
230
+ } else {
231
+ FAISS_THROW_MSG("need precomputed tables");
232
+ }
233
+
234
+ if (polysemous_ht) {
235
+ FAISS_THROW_MSG("not implemented");
236
+ // Not clear that it makes sense to implemente this,
237
+ // because it costs M * ksub, which is what we wanted to
238
+ // avoid with the tables pointers.
239
+ }
240
+
241
+ return dis0;
242
+ }
243
+
244
+ } // namespace pq_code_distance
245
+ } // namespace faiss
@@ -0,0 +1,105 @@
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
+ #include <cstdint>
11
+ #include <vector>
12
+
13
+ #include <faiss/IndexIVFPQ.h>
14
+ #include <faiss/impl/FaissAssert.h>
15
+ #include <faiss/impl/ProductQuantizer.h>
16
+ #include <faiss/utils/utils.h>
17
+
18
+ namespace faiss {
19
+ namespace pq_code_distance {
20
+
21
+ #define TIC t0 = get_cycles()
22
+ #define TOC get_cycles() - t0
23
+
24
+ /** QueryTables manages the various ways of searching an
25
+ * IndexIVFPQ. The code contains a lot of branches, depending on:
26
+ * - metric_type: are we computing L2 or Inner product similarity?
27
+ * - by_residual: do we encode raw vectors or residuals?
28
+ * - use_precomputed_table: are x_R|x_C tables precomputed?
29
+ * - polysemous_ht: are we filtering with polysemous codes?
30
+ */
31
+ struct QueryTables {
32
+ /*****************************************************
33
+ * General data from the IVFPQ
34
+ *****************************************************/
35
+
36
+ const IndexIVFPQ& ivfpq;
37
+ const IVFSearchParameters* params;
38
+
39
+ // copied from IndexIVFPQ for easier access
40
+ int d;
41
+ const ProductQuantizer& pq;
42
+ MetricType metric_type;
43
+ bool by_residual;
44
+ int use_precomputed_table;
45
+ int polysemous_ht;
46
+
47
+ // pre-allocated data buffers
48
+ float *sim_table, *sim_table_2;
49
+ float *residual_vec, *decoded_vec;
50
+
51
+ // single data buffer
52
+ std::vector<float> mem;
53
+
54
+ // for table pointers
55
+ std::vector<const float*> sim_table_ptrs;
56
+
57
+ explicit QueryTables(
58
+ const IndexIVFPQ& ivfpq_in,
59
+ const IVFSearchParameters* params_in);
60
+
61
+ /*****************************************************
62
+ * What we do when query is known
63
+ *****************************************************/
64
+
65
+ // field specific to query
66
+ const float* qi = nullptr;
67
+
68
+ // query-specific initialization
69
+ void init_query(const float* qi_in);
70
+
71
+ void init_query_IP();
72
+
73
+ void init_query_L2();
74
+
75
+ /*****************************************************
76
+ * When inverted list is known: prepare computations
77
+ *****************************************************/
78
+
79
+ // fields specific to list
80
+ idx_t key = 0;
81
+ float coarse_dis = 0.0f;
82
+ std::vector<uint8_t> q_code;
83
+
84
+ uint64_t init_list_cycles;
85
+
86
+ /// once we know the query and the centroid, we can prepare the
87
+ /// sim_table that will be used for accumulation
88
+ /// and dis0, the initial value
89
+ float precompute_list_tables();
90
+
91
+ float precompute_list_table_pointers();
92
+
93
+ float dis0 = 0.0f;
94
+
95
+ void init_list(idx_t list_no, float coarse_dis_in, int mode);
96
+
97
+ float precompute_list_tables_IP();
98
+
99
+ float precompute_list_tables_L2();
100
+
101
+ float precompute_list_table_pointers_L2();
102
+ };
103
+
104
+ } // namespace pq_code_distance
105
+ } // namespace faiss
@@ -0,0 +1,106 @@
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
+ #ifndef THE_SIMD_LEVEL
11
+ #error "THE_SIMD_LEVEL must be defined before including PQDistanceComputer_impl.h"
12
+ #endif
13
+
14
+ #include <faiss/IndexPQ.h>
15
+ #include <faiss/impl/DistanceComputer.h>
16
+ #include <faiss/impl/FaissAssert.h>
17
+ #include <faiss/impl/pq_code_distance/pq_code_distance-inl.h>
18
+
19
+ namespace faiss {
20
+ namespace pq_code_distance {
21
+
22
+ template <class PQCodeDist>
23
+ struct PQDistanceComputer : FlatCodesDistanceComputer {
24
+ using PQDecoder = typename PQCodeDist::PQDecoder;
25
+ size_t d;
26
+ MetricType metric;
27
+ idx_t nb;
28
+ const ProductQuantizer& pq;
29
+ const float* sdc;
30
+ std::vector<float> precomputed_table;
31
+ size_t ndis;
32
+ const float* q;
33
+
34
+ float distance_to_code(const uint8_t* code) final {
35
+ ndis++;
36
+
37
+ float dis = PQCodeDist::distance_single_code(
38
+ pq.M, pq.nbits, precomputed_table.data(), code);
39
+ return dis;
40
+ }
41
+
42
+ float symmetric_dis(idx_t i, idx_t j) override {
43
+ FAISS_THROW_IF_NOT(sdc);
44
+ const float* sdci = sdc;
45
+ float accu = 0;
46
+ PQDecoder codei(codes + i * code_size, pq.nbits);
47
+ PQDecoder codej(codes + j * code_size, pq.nbits);
48
+
49
+ for (size_t l = 0; l < pq.M; l++) {
50
+ accu += sdci[codei.decode() + (codej.decode() << codei.nbits)];
51
+ sdci += uint64_t(1) << (2 * codei.nbits);
52
+ }
53
+ ndis++;
54
+ return accu;
55
+ }
56
+
57
+ explicit PQDistanceComputer(const IndexPQ& storage)
58
+ : FlatCodesDistanceComputer(
59
+ storage.codes.data(),
60
+ storage.code_size),
61
+ pq(storage.pq),
62
+ q(nullptr) {
63
+ precomputed_table.resize(pq.M * pq.ksub);
64
+ nb = storage.ntotal;
65
+ d = storage.d;
66
+ metric = storage.metric_type;
67
+ if (pq.sdc_table.size() == pq.ksub * pq.ksub * pq.M) {
68
+ sdc = pq.sdc_table.data();
69
+ } else {
70
+ sdc = nullptr;
71
+ }
72
+ ndis = 0;
73
+ }
74
+
75
+ void set_query(const float* x) override {
76
+ q = x;
77
+ if (metric == METRIC_L2) {
78
+ pq.compute_distance_table(x, precomputed_table.data());
79
+ } else {
80
+ pq.compute_inner_prod_table(x, precomputed_table.data());
81
+ }
82
+ }
83
+ };
84
+
85
+ template <SIMDLevel SL>
86
+ FlatCodesDistanceComputer* get_PQFlatCodesDistanceComputer(
87
+ const IndexPQ& index);
88
+
89
+ // NOLINTNEXTLINE(facebook-hte-MisplacedTemplateSpecialization)
90
+ template <>
91
+ FlatCodesDistanceComputer* get_PQFlatCodesDistanceComputer<THE_SIMD_LEVEL>(
92
+ const IndexPQ& index) {
93
+ if (index.pq.nbits == 8) {
94
+ return new PQDistanceComputer<
95
+ PQCodeDistance<PQDecoder8, THE_SIMD_LEVEL>>(index);
96
+ } else if (index.pq.nbits == 16) {
97
+ return new PQDistanceComputer<
98
+ PQCodeDistance<PQDecoder16, THE_SIMD_LEVEL>>(index);
99
+ } else {
100
+ return new PQDistanceComputer<
101
+ PQCodeDistance<PQDecoderGeneric, THE_SIMD_LEVEL>>(index);
102
+ }
103
+ }
104
+
105
+ } // namespace pq_code_distance
106
+ } // namespace faiss
@@ -0,0 +1,21 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #ifdef COMPILE_SIMD_AVX2
9
+
10
+ #define THE_SIMD_LEVEL SIMDLevel::AVX2
11
+
12
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
13
+ #include <faiss/impl/pq_code_distance/pq_code_distance-avx2.h>
14
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
15
+ #include <faiss/utils/hamming_distance/hamming_computer-avx2.h>
16
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
17
+ #include <faiss/impl/pq_code_distance/PQDistanceComputer_impl.h>
18
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
19
+ #include <faiss/impl/pq_code_distance/IVFPQScanner_impl.h>
20
+
21
+ #endif // COMPILE_SIMD_AVX2
@@ -0,0 +1,21 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #ifdef COMPILE_SIMD_AVX512
9
+
10
+ #define THE_SIMD_LEVEL SIMDLevel::AVX512
11
+
12
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
13
+ #include <faiss/impl/pq_code_distance/pq_code_distance-avx512.h>
14
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
15
+ #include <faiss/utils/hamming_distance/hamming_computer-avx512.h>
16
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
17
+ #include <faiss/impl/pq_code_distance/PQDistanceComputer_impl.h>
18
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
19
+ #include <faiss/impl/pq_code_distance/IVFPQScanner_impl.h>
20
+
21
+ #endif // COMPILE_SIMD_AVX512
@@ -0,0 +1,21 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #ifdef COMPILE_SIMD_ARM_NEON
9
+
10
+ #define THE_SIMD_LEVEL SIMDLevel::ARM_NEON
11
+
12
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
13
+ #include <faiss/impl/pq_code_distance/pq_code_distance-generic.h>
14
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
15
+ #include <faiss/utils/hamming_distance/hamming_computer-neon.h>
16
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
17
+ #include <faiss/impl/pq_code_distance/PQDistanceComputer_impl.h>
18
+ // NOLINTNEXTLINE(facebook-hte-InlineHeader)
19
+ #include <faiss/impl/pq_code_distance/IVFPQScanner_impl.h>
20
+
21
+ #endif // COMPILE_SIMD_ARM_NEON