faiss 0.3.2 → 0.3.4

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 (295) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/LICENSE.txt +1 -1
  4. data/ext/faiss/extconf.rb +1 -1
  5. data/ext/faiss/index.cpp +10 -14
  6. data/ext/faiss/numo.hpp +957 -833
  7. data/lib/faiss/version.rb +1 -1
  8. data/vendor/faiss/faiss/AutoTune.cpp +2 -2
  9. data/vendor/faiss/faiss/AutoTune.h +2 -2
  10. data/vendor/faiss/faiss/Clustering.cpp +2 -2
  11. data/vendor/faiss/faiss/Clustering.h +2 -2
  12. data/vendor/faiss/faiss/IVFlib.cpp +2 -2
  13. data/vendor/faiss/faiss/IVFlib.h +2 -2
  14. data/vendor/faiss/faiss/Index.cpp +6 -2
  15. data/vendor/faiss/faiss/Index.h +10 -3
  16. data/vendor/faiss/faiss/Index2Layer.cpp +2 -2
  17. data/vendor/faiss/faiss/Index2Layer.h +2 -2
  18. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +7 -7
  19. data/vendor/faiss/faiss/IndexAdditiveQuantizer.h +2 -2
  20. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +14 -16
  21. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +2 -2
  22. data/vendor/faiss/faiss/IndexBinary.cpp +13 -2
  23. data/vendor/faiss/faiss/IndexBinary.h +8 -2
  24. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +2 -3
  25. data/vendor/faiss/faiss/IndexBinaryFlat.h +2 -2
  26. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +2 -2
  27. data/vendor/faiss/faiss/IndexBinaryFromFloat.h +2 -2
  28. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +2 -7
  29. data/vendor/faiss/faiss/IndexBinaryHNSW.h +2 -2
  30. data/vendor/faiss/faiss/IndexBinaryHash.cpp +2 -3
  31. data/vendor/faiss/faiss/IndexBinaryHash.h +2 -2
  32. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +2 -2
  33. data/vendor/faiss/faiss/IndexBinaryIVF.h +2 -2
  34. data/vendor/faiss/faiss/IndexFastScan.cpp +10 -14
  35. data/vendor/faiss/faiss/IndexFastScan.h +11 -2
  36. data/vendor/faiss/faiss/IndexFlat.cpp +2 -3
  37. data/vendor/faiss/faiss/IndexFlat.h +2 -2
  38. data/vendor/faiss/faiss/IndexFlatCodes.cpp +11 -2
  39. data/vendor/faiss/faiss/IndexFlatCodes.h +5 -2
  40. data/vendor/faiss/faiss/IndexHNSW.cpp +13 -6
  41. data/vendor/faiss/faiss/IndexHNSW.h +2 -2
  42. data/vendor/faiss/faiss/IndexIDMap.cpp +19 -3
  43. data/vendor/faiss/faiss/IndexIDMap.h +5 -2
  44. data/vendor/faiss/faiss/IndexIVF.cpp +2 -3
  45. data/vendor/faiss/faiss/IndexIVF.h +5 -4
  46. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +6 -7
  47. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.h +2 -2
  48. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +3 -14
  49. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +2 -4
  50. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +71 -34
  51. data/vendor/faiss/faiss/IndexIVFFastScan.h +19 -2
  52. data/vendor/faiss/faiss/IndexIVFFlat.cpp +2 -2
  53. data/vendor/faiss/faiss/IndexIVFFlat.h +2 -2
  54. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +2 -2
  55. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.h +2 -2
  56. data/vendor/faiss/faiss/IndexIVFPQ.cpp +2 -3
  57. data/vendor/faiss/faiss/IndexIVFPQ.h +2 -2
  58. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +7 -33
  59. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +2 -4
  60. data/vendor/faiss/faiss/IndexIVFPQR.cpp +2 -2
  61. data/vendor/faiss/faiss/IndexIVFPQR.h +2 -2
  62. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +2 -3
  63. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +2 -2
  64. data/vendor/faiss/faiss/IndexLSH.cpp +2 -3
  65. data/vendor/faiss/faiss/IndexLSH.h +2 -2
  66. data/vendor/faiss/faiss/IndexLattice.cpp +2 -2
  67. data/vendor/faiss/faiss/IndexLattice.h +2 -2
  68. data/vendor/faiss/faiss/IndexNNDescent.cpp +2 -2
  69. data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
  70. data/vendor/faiss/faiss/IndexNSG.cpp +2 -5
  71. data/vendor/faiss/faiss/IndexNSG.h +2 -2
  72. data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +2 -2
  73. data/vendor/faiss/faiss/IndexNeuralNetCodec.h +2 -2
  74. data/vendor/faiss/faiss/IndexPQ.cpp +26 -26
  75. data/vendor/faiss/faiss/IndexPQ.h +2 -2
  76. data/vendor/faiss/faiss/IndexPQFastScan.cpp +2 -5
  77. data/vendor/faiss/faiss/IndexPQFastScan.h +2 -11
  78. data/vendor/faiss/faiss/IndexPreTransform.cpp +2 -2
  79. data/vendor/faiss/faiss/IndexPreTransform.h +2 -2
  80. data/vendor/faiss/faiss/IndexRefine.cpp +41 -4
  81. data/vendor/faiss/faiss/IndexRefine.h +9 -2
  82. data/vendor/faiss/faiss/IndexReplicas.cpp +2 -2
  83. data/vendor/faiss/faiss/IndexReplicas.h +2 -2
  84. data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +2 -2
  85. data/vendor/faiss/faiss/IndexRowwiseMinMax.h +2 -2
  86. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +2 -3
  87. data/vendor/faiss/faiss/IndexScalarQuantizer.h +2 -2
  88. data/vendor/faiss/faiss/IndexShards.cpp +2 -2
  89. data/vendor/faiss/faiss/IndexShards.h +2 -2
  90. data/vendor/faiss/faiss/IndexShardsIVF.cpp +2 -2
  91. data/vendor/faiss/faiss/IndexShardsIVF.h +2 -2
  92. data/vendor/faiss/faiss/MatrixStats.cpp +2 -2
  93. data/vendor/faiss/faiss/MatrixStats.h +2 -2
  94. data/vendor/faiss/faiss/MetaIndexes.cpp +2 -3
  95. data/vendor/faiss/faiss/MetaIndexes.h +2 -2
  96. data/vendor/faiss/faiss/MetricType.h +2 -2
  97. data/vendor/faiss/faiss/VectorTransform.cpp +2 -2
  98. data/vendor/faiss/faiss/VectorTransform.h +2 -2
  99. data/vendor/faiss/faiss/clone_index.cpp +2 -2
  100. data/vendor/faiss/faiss/clone_index.h +2 -2
  101. data/vendor/faiss/faiss/cppcontrib/SaDecodeKernels.h +2 -2
  102. data/vendor/faiss/faiss/cppcontrib/detail/CoarseBitType.h +2 -2
  103. data/vendor/faiss/faiss/cppcontrib/detail/UintReader.h +2 -2
  104. data/vendor/faiss/faiss/cppcontrib/factory_tools.cpp +44 -4
  105. data/vendor/faiss/faiss/cppcontrib/factory_tools.h +7 -2
  106. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +2 -2
  107. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +2 -2
  108. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-neon-inl.h +2 -2
  109. data/vendor/faiss/faiss/cppcontrib/sa_decode/MinMax-inl.h +2 -2
  110. data/vendor/faiss/faiss/cppcontrib/sa_decode/MinMaxFP16-inl.h +2 -2
  111. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +2 -2
  112. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +2 -2
  113. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-neon-inl.h +2 -2
  114. data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +2 -5
  115. data/vendor/faiss/faiss/gpu/GpuAutoTune.h +2 -2
  116. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +13 -13
  117. data/vendor/faiss/faiss/gpu/GpuCloner.h +2 -2
  118. data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +6 -6
  119. data/vendor/faiss/faiss/gpu/GpuDistance.h +11 -7
  120. data/vendor/faiss/faiss/gpu/GpuFaissAssert.h +2 -2
  121. data/vendor/faiss/faiss/gpu/GpuIcmEncoder.h +2 -2
  122. data/vendor/faiss/faiss/gpu/GpuIndex.h +8 -7
  123. data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +2 -2
  124. data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -3
  125. data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +2 -2
  126. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +2 -2
  127. data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +2 -2
  128. data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +3 -3
  129. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +2 -2
  130. data/vendor/faiss/faiss/gpu/GpuIndicesOptions.h +2 -2
  131. data/vendor/faiss/faiss/gpu/GpuResources.cpp +7 -2
  132. data/vendor/faiss/faiss/gpu/GpuResources.h +11 -4
  133. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +51 -21
  134. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +15 -5
  135. data/vendor/faiss/faiss/gpu/impl/IndexUtils.h +2 -2
  136. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.cpp +2 -2
  137. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.h +2 -2
  138. data/vendor/faiss/faiss/gpu/impl/RemapIndices.cpp +2 -2
  139. data/vendor/faiss/faiss/gpu/impl/RemapIndices.h +2 -2
  140. data/vendor/faiss/faiss/gpu/perf/IndexWrapper-inl.h +2 -2
  141. data/vendor/faiss/faiss/gpu/perf/IndexWrapper.h +2 -2
  142. data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +2 -2
  143. data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +2 -3
  144. data/vendor/faiss/faiss/gpu/perf/WriteIndex.cpp +2 -2
  145. data/vendor/faiss/faiss/gpu/test/TestCodePacking.cpp +2 -2
  146. data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +2 -2
  147. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +54 -54
  148. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +80 -78
  149. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +51 -51
  150. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +2 -2
  151. data/vendor/faiss/faiss/gpu/test/TestGpuMemoryException.cpp +3 -3
  152. data/vendor/faiss/faiss/gpu/test/TestGpuResidualQuantizer.cpp +70 -0
  153. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +74 -4
  154. data/vendor/faiss/faiss/gpu/test/TestUtils.h +2 -2
  155. data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +2 -2
  156. data/vendor/faiss/faiss/gpu/utils/{RaftUtils.h → CuvsUtils.h} +12 -11
  157. data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +2 -2
  158. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +2 -2
  159. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.h +2 -2
  160. data/vendor/faiss/faiss/gpu/utils/StaticUtils.h +2 -2
  161. data/vendor/faiss/faiss/gpu/utils/Timer.cpp +2 -2
  162. data/vendor/faiss/faiss/gpu/utils/Timer.h +2 -2
  163. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +79 -11
  164. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +17 -5
  165. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +2 -2
  166. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +2 -2
  167. data/vendor/faiss/faiss/impl/CodePacker.cpp +2 -2
  168. data/vendor/faiss/faiss/impl/CodePacker.h +2 -2
  169. data/vendor/faiss/faiss/impl/DistanceComputer.h +2 -2
  170. data/vendor/faiss/faiss/impl/FaissAssert.h +2 -2
  171. data/vendor/faiss/faiss/impl/FaissException.cpp +2 -2
  172. data/vendor/faiss/faiss/impl/FaissException.h +2 -3
  173. data/vendor/faiss/faiss/impl/HNSW.cpp +24 -19
  174. data/vendor/faiss/faiss/impl/HNSW.h +12 -2
  175. data/vendor/faiss/faiss/impl/IDSelector.cpp +2 -2
  176. data/vendor/faiss/faiss/impl/IDSelector.h +2 -2
  177. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +2 -2
  178. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +2 -2
  179. data/vendor/faiss/faiss/impl/LookupTableScaler.h +2 -2
  180. data/vendor/faiss/faiss/impl/NNDescent.cpp +2 -2
  181. data/vendor/faiss/faiss/impl/NNDescent.h +2 -2
  182. data/vendor/faiss/faiss/impl/NSG.cpp +27 -21
  183. data/vendor/faiss/faiss/impl/NSG.h +20 -8
  184. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +2 -2
  185. data/vendor/faiss/faiss/impl/PolysemousTraining.h +2 -2
  186. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +2 -4
  187. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.h +2 -2
  188. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +2 -2
  189. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +2 -2
  190. data/vendor/faiss/faiss/impl/ProductQuantizer.h +2 -2
  191. data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
  192. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +2 -36
  193. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +3 -13
  194. data/vendor/faiss/faiss/impl/ResultHandler.h +2 -2
  195. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +2 -2
  196. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +2 -2
  197. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +2 -2
  198. data/vendor/faiss/faiss/impl/ThreadedIndex.h +2 -2
  199. data/vendor/faiss/faiss/impl/code_distance/code_distance-avx2.h +2 -2
  200. data/vendor/faiss/faiss/impl/code_distance/code_distance-avx512.h +2 -2
  201. data/vendor/faiss/faiss/impl/code_distance/code_distance-generic.h +2 -2
  202. data/vendor/faiss/faiss/impl/code_distance/code_distance-sve.h +440 -0
  203. data/vendor/faiss/faiss/impl/code_distance/code_distance.h +55 -2
  204. data/vendor/faiss/faiss/impl/index_read.cpp +2 -5
  205. data/vendor/faiss/faiss/impl/index_read_utils.h +2 -2
  206. data/vendor/faiss/faiss/impl/index_write.cpp +2 -6
  207. data/vendor/faiss/faiss/impl/io.cpp +2 -2
  208. data/vendor/faiss/faiss/impl/io.h +2 -2
  209. data/vendor/faiss/faiss/impl/io_macros.h +2 -9
  210. data/vendor/faiss/faiss/impl/kmeans1d.cpp +2 -3
  211. data/vendor/faiss/faiss/impl/kmeans1d.h +2 -2
  212. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +2 -3
  213. data/vendor/faiss/faiss/impl/lattice_Zn.h +2 -2
  214. data/vendor/faiss/faiss/impl/platform_macros.h +12 -2
  215. data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +2 -2
  216. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +20 -2
  217. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +2 -2
  218. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +2 -2
  219. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +3 -3
  220. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +2 -2
  221. data/vendor/faiss/faiss/impl/simd_result_handlers.h +18 -18
  222. data/vendor/faiss/faiss/index_factory.cpp +20 -21
  223. data/vendor/faiss/faiss/index_factory.h +2 -2
  224. data/vendor/faiss/faiss/index_io.h +2 -2
  225. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +2 -2
  226. data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +2 -2
  227. data/vendor/faiss/faiss/invlists/DirectMap.cpp +2 -2
  228. data/vendor/faiss/faiss/invlists/DirectMap.h +2 -2
  229. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +2 -2
  230. data/vendor/faiss/faiss/invlists/InvertedLists.h +2 -2
  231. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +2 -2
  232. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.h +2 -2
  233. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +2 -3
  234. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +2 -2
  235. data/vendor/faiss/faiss/python/python_callbacks.cpp +2 -2
  236. data/vendor/faiss/faiss/python/python_callbacks.h +2 -2
  237. data/vendor/faiss/faiss/utils/AlignedTable.h +5 -3
  238. data/vendor/faiss/faiss/utils/Heap.cpp +2 -2
  239. data/vendor/faiss/faiss/utils/Heap.h +2 -2
  240. data/vendor/faiss/faiss/utils/NeuralNet.cpp +11 -7
  241. data/vendor/faiss/faiss/utils/NeuralNet.h +2 -2
  242. data/vendor/faiss/faiss/utils/WorkerThread.cpp +2 -2
  243. data/vendor/faiss/faiss/utils/WorkerThread.h +2 -2
  244. data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +2 -2
  245. data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +2 -2
  246. data/vendor/faiss/faiss/utils/approx_topk/generic.h +2 -2
  247. data/vendor/faiss/faiss/utils/approx_topk/mode.h +2 -2
  248. data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +2 -2
  249. data/vendor/faiss/faiss/utils/bf16.h +2 -2
  250. data/vendor/faiss/faiss/utils/distances.cpp +191 -2
  251. data/vendor/faiss/faiss/utils/distances.h +3 -3
  252. data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +2 -2
  253. data/vendor/faiss/faiss/utils/distances_fused/avx512.h +2 -2
  254. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +2 -2
  255. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +2 -2
  256. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +2 -2
  257. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.h +2 -2
  258. data/vendor/faiss/faiss/utils/distances_simd.cpp +502 -3
  259. data/vendor/faiss/faiss/utils/extra_distances-inl.h +2 -2
  260. data/vendor/faiss/faiss/utils/extra_distances.cpp +2 -3
  261. data/vendor/faiss/faiss/utils/extra_distances.h +2 -2
  262. data/vendor/faiss/faiss/utils/fp16-arm.h +2 -2
  263. data/vendor/faiss/faiss/utils/fp16-fp16c.h +2 -2
  264. data/vendor/faiss/faiss/utils/fp16-inl.h +2 -2
  265. data/vendor/faiss/faiss/utils/fp16.h +2 -2
  266. data/vendor/faiss/faiss/utils/hamming-inl.h +2 -2
  267. data/vendor/faiss/faiss/utils/hamming.cpp +2 -3
  268. data/vendor/faiss/faiss/utils/hamming.h +2 -2
  269. data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +2 -2
  270. data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +490 -0
  271. data/vendor/faiss/faiss/utils/hamming_distance/common.h +2 -2
  272. data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +2 -2
  273. data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +5 -2
  274. data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +5 -5
  275. data/vendor/faiss/faiss/utils/ordered_key_value.h +2 -2
  276. data/vendor/faiss/faiss/utils/partitioning.cpp +2 -2
  277. data/vendor/faiss/faiss/utils/partitioning.h +2 -2
  278. data/vendor/faiss/faiss/utils/prefetch.h +2 -2
  279. data/vendor/faiss/faiss/utils/quantize_lut.cpp +2 -2
  280. data/vendor/faiss/faiss/utils/quantize_lut.h +2 -2
  281. data/vendor/faiss/faiss/utils/random.cpp +2 -2
  282. data/vendor/faiss/faiss/utils/random.h +2 -2
  283. data/vendor/faiss/faiss/utils/simdlib.h +2 -2
  284. data/vendor/faiss/faiss/utils/simdlib_avx2.h +2 -2
  285. data/vendor/faiss/faiss/utils/simdlib_avx512.h +2 -2
  286. data/vendor/faiss/faiss/utils/simdlib_emulated.h +2 -2
  287. data/vendor/faiss/faiss/utils/simdlib_neon.h +2 -2
  288. data/vendor/faiss/faiss/utils/simdlib_ppc64.h +2 -2
  289. data/vendor/faiss/faiss/utils/sorting.cpp +2 -2
  290. data/vendor/faiss/faiss/utils/sorting.h +2 -2
  291. data/vendor/faiss/faiss/utils/transpose/transpose-avx2-inl.h +2 -2
  292. data/vendor/faiss/faiss/utils/transpose/transpose-avx512-inl.h +2 -2
  293. data/vendor/faiss/faiss/utils/utils.cpp +7 -7
  294. data/vendor/faiss/faiss/utils/utils.h +4 -3
  295. metadata +9 -10
@@ -1,5 +1,5 @@
1
- /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -1,5 +1,5 @@
1
- /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -11,7 +11,6 @@
11
11
  #include <cstdio>
12
12
  #include <cstring>
13
13
  #include <memory>
14
- #include <random>
15
14
 
16
15
  #include <algorithm>
17
16
 
@@ -20,7 +19,6 @@
20
19
  #include <faiss/impl/FaissAssert.h>
21
20
  #include <faiss/utils/distances.h>
22
21
  #include <faiss/utils/hamming.h>
23
- #include <faiss/utils/utils.h>
24
22
 
25
23
  extern "C" {
26
24
 
@@ -1,5 +1,5 @@
1
- /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -1,5 +1,5 @@
1
- /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -1,5 +1,5 @@
1
- /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -1,5 +1,5 @@
1
- /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -1,5 +1,5 @@
1
- /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -1,5 +1,5 @@
1
- /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -492,40 +492,6 @@ void ResidualQuantizer::refine_beam(
492
492
  * Functions using the dot products between codebook entries
493
493
  *******************************************************************/
494
494
 
495
- void ResidualQuantizer::compute_codebook_tables() {
496
- cent_norms.resize(total_codebook_size);
497
- fvec_norms_L2sqr(
498
- cent_norms.data(), codebooks.data(), d, total_codebook_size);
499
- size_t cross_table_size = 0;
500
- for (int m = 0; m < M; m++) {
501
- size_t K = (size_t)1 << nbits[m];
502
- cross_table_size += K * codebook_offsets[m];
503
- }
504
- codebook_cross_products.resize(cross_table_size);
505
- size_t ofs = 0;
506
- for (int m = 1; m < M; m++) {
507
- FINTEGER ki = (size_t)1 << nbits[m];
508
- FINTEGER kk = codebook_offsets[m];
509
- FINTEGER di = d;
510
- float zero = 0, one = 1;
511
- assert(ofs + ki * kk <= cross_table_size);
512
- sgemm_("Transposed",
513
- "Not transposed",
514
- &ki,
515
- &kk,
516
- &di,
517
- &one,
518
- codebooks.data() + d * kk,
519
- &di,
520
- codebooks.data(),
521
- &di,
522
- &zero,
523
- codebook_cross_products.data() + ofs,
524
- &ki);
525
- ofs += ki * kk;
526
- }
527
- }
528
-
529
495
  void ResidualQuantizer::refine_beam_LUT(
530
496
  size_t n,
531
497
  const float* query_norms, // size n
@@ -1,5 +1,5 @@
1
- /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -112,7 +112,7 @@ struct ResidualQuantizer : AdditiveQuantizer {
112
112
 
113
113
  /** lower-level encode function
114
114
  *
115
- * @param n number of vectors to hanlde
115
+ * @param n number of vectors to handle
116
116
  * @param residuals vectors to encode, size (n, beam_size, d)
117
117
  * @param beam_size input beam size
118
118
  * @param new_beam_size output beam size (should be <= K * beam_size)
@@ -143,16 +143,6 @@ struct ResidualQuantizer : AdditiveQuantizer {
143
143
  * @param beam_size if != -1, override the beam size
144
144
  */
145
145
  size_t memory_per_point(int beam_size = -1) const;
146
-
147
- /** Cross products used in codebook tables used for beam_LUT = 1
148
- */
149
- void compute_codebook_tables();
150
-
151
- /// dot products of all codebook entries with the previous codebooks
152
- /// size sum(codebook_offsets[m] * 2^nbits[m], m=0..M-1)
153
- std::vector<float> codebook_cross_products;
154
- /// norms of all codebook entries (size total_codebook_size)
155
- std::vector<float> cent_norms;
156
146
  };
157
147
 
158
148
  } // namespace faiss
@@ -1,5 +1,5 @@
1
- /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -1,5 +1,5 @@
1
- /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -1,5 +1,5 @@
1
- /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -1,5 +1,5 @@
1
- /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -1,5 +1,5 @@
1
- /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -1,5 +1,5 @@
1
- /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -1,5 +1,5 @@
1
- /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -1,5 +1,5 @@
1
- /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -0,0 +1,440 @@
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
+ #ifdef __ARM_FEATURE_SVE
11
+
12
+ #include <arm_sve.h>
13
+
14
+ #include <tuple>
15
+ #include <type_traits>
16
+
17
+ #include <faiss/impl/code_distance/code_distance-generic.h>
18
+
19
+ namespace faiss {
20
+
21
+ template <typename PQDecoderT>
22
+ std::enable_if_t<!std::is_same_v<PQDecoderT, PQDecoder8>, float> inline distance_single_code_sve(
23
+ // the product quantizer
24
+ const size_t M,
25
+ // number of bits per quantization index
26
+ const size_t nbits,
27
+ // precomputed distances, layout (M, ksub)
28
+ const float* sim_table,
29
+ const uint8_t* code) {
30
+ // default implementation
31
+ return distance_single_code_generic<PQDecoderT>(M, nbits, sim_table, code);
32
+ }
33
+
34
+ static inline void distance_codes_kernel(
35
+ svbool_t pg,
36
+ svuint32_t idx1,
37
+ svuint32_t offsets_0,
38
+ const float* tab,
39
+ svfloat32_t& partialSum) {
40
+ // add offset
41
+ const auto indices_to_read_from = svadd_u32_x(pg, idx1, offsets_0);
42
+
43
+ // gather values, similar to some operations of tab[index]
44
+ const auto collected =
45
+ svld1_gather_u32index_f32(pg, tab, indices_to_read_from);
46
+
47
+ // collect partial sum
48
+ partialSum = svadd_f32_m(pg, partialSum, collected);
49
+ }
50
+
51
+ static float distance_single_code_sve_for_small_m(
52
+ // the product quantizer
53
+ const size_t M,
54
+ // precomputed distances, layout (M, ksub)
55
+ const float* sim_table,
56
+ // codes
57
+ const uint8_t* __restrict code) {
58
+ constexpr size_t nbits = 8u;
59
+
60
+ const size_t ksub = 1 << nbits;
61
+
62
+ const auto offsets_0 = svindex_u32(0, static_cast<uint32_t>(ksub));
63
+
64
+ // loop
65
+ const auto pg = svwhilelt_b32_u64(0, M);
66
+
67
+ auto mm1 = svld1ub_u32(pg, code);
68
+ mm1 = svadd_u32_x(pg, mm1, offsets_0);
69
+ const auto collected0 = svld1_gather_u32index_f32(pg, sim_table, mm1);
70
+ return svaddv_f32(pg, collected0);
71
+ }
72
+
73
+ template <typename PQDecoderT>
74
+ std::enable_if_t<std::is_same_v<PQDecoderT, PQDecoder8>, float> inline distance_single_code_sve(
75
+ // the product quantizer
76
+ const size_t M,
77
+ // number of bits per quantization index
78
+ const size_t nbits,
79
+ // precomputed distances, layout (M, ksub)
80
+ const float* sim_table,
81
+ const uint8_t* code) {
82
+ if (M <= svcntw())
83
+ return distance_single_code_sve_for_small_m(M, sim_table, code);
84
+
85
+ const float* tab = sim_table;
86
+
87
+ const size_t ksub = 1 << nbits;
88
+
89
+ const auto offsets_0 = svindex_u32(0, static_cast<uint32_t>(ksub));
90
+
91
+ // accumulators of partial sums
92
+ auto partialSum = svdup_n_f32(0.f);
93
+
94
+ const auto lanes = svcntb();
95
+ const auto quad_lanes = lanes / 4;
96
+
97
+ // loop
98
+ for (std::size_t m = 0; m < M;) {
99
+ const auto pg = svwhilelt_b8_u64(m, M);
100
+
101
+ const auto mm1 = svld1_u8(pg, code + m);
102
+ {
103
+ const auto mm1lo = svunpklo_u16(mm1);
104
+ const auto pglo = svunpklo_b(pg);
105
+
106
+ {
107
+ // convert uint8 values to uint32 values
108
+ const auto idx1 = svunpklo_u32(mm1lo);
109
+ const auto pglolo = svunpklo_b(pglo);
110
+
111
+ distance_codes_kernel(pglolo, idx1, offsets_0, tab, partialSum);
112
+ tab += ksub * quad_lanes;
113
+ }
114
+
115
+ m += quad_lanes;
116
+ if (m >= M)
117
+ break;
118
+
119
+ {
120
+ // convert uint8 values to uint32 values
121
+ const auto idx1 = svunpkhi_u32(mm1lo);
122
+ const auto pglohi = svunpkhi_b(pglo);
123
+
124
+ distance_codes_kernel(pglohi, idx1, offsets_0, tab, partialSum);
125
+ tab += ksub * quad_lanes;
126
+ }
127
+
128
+ m += quad_lanes;
129
+ if (m >= M)
130
+ break;
131
+ }
132
+
133
+ {
134
+ const auto mm1hi = svunpkhi_u16(mm1);
135
+ const auto pghi = svunpkhi_b(pg);
136
+
137
+ {
138
+ // convert uint8 values to uint32 values
139
+ const auto idx1 = svunpklo_u32(mm1hi);
140
+ const auto pghilo = svunpklo_b(pghi);
141
+
142
+ distance_codes_kernel(pghilo, idx1, offsets_0, tab, partialSum);
143
+ tab += ksub * quad_lanes;
144
+ }
145
+
146
+ m += quad_lanes;
147
+ if (m >= M)
148
+ break;
149
+
150
+ {
151
+ // convert uint8 values to uint32 values
152
+ const auto idx1 = svunpkhi_u32(mm1hi);
153
+ const auto pghihi = svunpkhi_b(pghi);
154
+
155
+ distance_codes_kernel(pghihi, idx1, offsets_0, tab, partialSum);
156
+ tab += ksub * quad_lanes;
157
+ }
158
+
159
+ m += quad_lanes;
160
+ }
161
+ }
162
+
163
+ return svaddv_f32(svptrue_b32(), partialSum);
164
+ }
165
+
166
+ template <typename PQDecoderT>
167
+ std::enable_if_t<!std::is_same_v<PQDecoderT, PQDecoder8>, void>
168
+ distance_four_codes_sve(
169
+ // the product quantizer
170
+ const size_t M,
171
+ // number of bits per quantization index
172
+ const size_t nbits,
173
+ // precomputed distances, layout (M, ksub)
174
+ const float* sim_table,
175
+ // codes
176
+ const uint8_t* __restrict code0,
177
+ const uint8_t* __restrict code1,
178
+ const uint8_t* __restrict code2,
179
+ const uint8_t* __restrict code3,
180
+ // computed distances
181
+ float& result0,
182
+ float& result1,
183
+ float& result2,
184
+ float& result3) {
185
+ distance_four_codes_generic<PQDecoderT>(
186
+ M,
187
+ nbits,
188
+ sim_table,
189
+ code0,
190
+ code1,
191
+ code2,
192
+ code3,
193
+ result0,
194
+ result1,
195
+ result2,
196
+ result3);
197
+ }
198
+
199
+ static void distance_four_codes_sve_for_small_m(
200
+ // the product quantizer
201
+ const size_t M,
202
+ // precomputed distances, layout (M, ksub)
203
+ const float* sim_table,
204
+ // codes
205
+ const uint8_t* __restrict code0,
206
+ const uint8_t* __restrict code1,
207
+ const uint8_t* __restrict code2,
208
+ const uint8_t* __restrict code3,
209
+ // computed distances
210
+ float& result0,
211
+ float& result1,
212
+ float& result2,
213
+ float& result3) {
214
+ constexpr size_t nbits = 8u;
215
+
216
+ const size_t ksub = 1 << nbits;
217
+
218
+ const auto offsets_0 = svindex_u32(0, static_cast<uint32_t>(ksub));
219
+
220
+ const auto quad_lanes = svcntw();
221
+
222
+ // loop
223
+ const auto pg = svwhilelt_b32_u64(0, M);
224
+
225
+ auto mm10 = svld1ub_u32(pg, code0);
226
+ auto mm11 = svld1ub_u32(pg, code1);
227
+ auto mm12 = svld1ub_u32(pg, code2);
228
+ auto mm13 = svld1ub_u32(pg, code3);
229
+ mm10 = svadd_u32_x(pg, mm10, offsets_0);
230
+ mm11 = svadd_u32_x(pg, mm11, offsets_0);
231
+ mm12 = svadd_u32_x(pg, mm12, offsets_0);
232
+ mm13 = svadd_u32_x(pg, mm13, offsets_0);
233
+ const auto collected0 = svld1_gather_u32index_f32(pg, sim_table, mm10);
234
+ const auto collected1 = svld1_gather_u32index_f32(pg, sim_table, mm11);
235
+ const auto collected2 = svld1_gather_u32index_f32(pg, sim_table, mm12);
236
+ const auto collected3 = svld1_gather_u32index_f32(pg, sim_table, mm13);
237
+ result0 = svaddv_f32(pg, collected0);
238
+ result1 = svaddv_f32(pg, collected1);
239
+ result2 = svaddv_f32(pg, collected2);
240
+ result3 = svaddv_f32(pg, collected3);
241
+ }
242
+
243
+ // Combines 4 operations of distance_single_code()
244
+ template <typename PQDecoderT>
245
+ std::enable_if_t<std::is_same_v<PQDecoderT, PQDecoder8>, void>
246
+ distance_four_codes_sve(
247
+ // the product quantizer
248
+ const size_t M,
249
+ // number of bits per quantization index
250
+ const size_t nbits,
251
+ // precomputed distances, layout (M, ksub)
252
+ const float* sim_table,
253
+ // codes
254
+ const uint8_t* __restrict code0,
255
+ const uint8_t* __restrict code1,
256
+ const uint8_t* __restrict code2,
257
+ const uint8_t* __restrict code3,
258
+ // computed distances
259
+ float& result0,
260
+ float& result1,
261
+ float& result2,
262
+ float& result3) {
263
+ if (M <= svcntw()) {
264
+ distance_four_codes_sve_for_small_m(
265
+ M,
266
+ sim_table,
267
+ code0,
268
+ code1,
269
+ code2,
270
+ code3,
271
+ result0,
272
+ result1,
273
+ result2,
274
+ result3);
275
+ return;
276
+ }
277
+
278
+ const float* tab = sim_table;
279
+
280
+ const size_t ksub = 1 << nbits;
281
+
282
+ const auto offsets_0 = svindex_u32(0, static_cast<uint32_t>(ksub));
283
+
284
+ // accumulators of partial sums
285
+ auto partialSum0 = svdup_n_f32(0.f);
286
+ auto partialSum1 = svdup_n_f32(0.f);
287
+ auto partialSum2 = svdup_n_f32(0.f);
288
+ auto partialSum3 = svdup_n_f32(0.f);
289
+
290
+ const auto lanes = svcntb();
291
+ const auto quad_lanes = lanes / 4;
292
+
293
+ // loop
294
+ for (std::size_t m = 0; m < M;) {
295
+ const auto pg = svwhilelt_b8_u64(m, M);
296
+
297
+ const auto mm10 = svld1_u8(pg, code0 + m);
298
+ const auto mm11 = svld1_u8(pg, code1 + m);
299
+ const auto mm12 = svld1_u8(pg, code2 + m);
300
+ const auto mm13 = svld1_u8(pg, code3 + m);
301
+ {
302
+ const auto mm10lo = svunpklo_u16(mm10);
303
+ const auto mm11lo = svunpklo_u16(mm11);
304
+ const auto mm12lo = svunpklo_u16(mm12);
305
+ const auto mm13lo = svunpklo_u16(mm13);
306
+ const auto pglo = svunpklo_b(pg);
307
+
308
+ {
309
+ const auto pglolo = svunpklo_b(pglo);
310
+ {
311
+ const auto idx1 = svunpklo_u32(mm10lo);
312
+ distance_codes_kernel(
313
+ pglolo, idx1, offsets_0, tab, partialSum0);
314
+ }
315
+ {
316
+ const auto idx1 = svunpklo_u32(mm11lo);
317
+ distance_codes_kernel(
318
+ pglolo, idx1, offsets_0, tab, partialSum1);
319
+ }
320
+ {
321
+ const auto idx1 = svunpklo_u32(mm12lo);
322
+ distance_codes_kernel(
323
+ pglolo, idx1, offsets_0, tab, partialSum2);
324
+ }
325
+ {
326
+ const auto idx1 = svunpklo_u32(mm13lo);
327
+ distance_codes_kernel(
328
+ pglolo, idx1, offsets_0, tab, partialSum3);
329
+ }
330
+ tab += ksub * quad_lanes;
331
+ }
332
+
333
+ m += quad_lanes;
334
+ if (m >= M)
335
+ break;
336
+
337
+ {
338
+ const auto pglohi = svunpkhi_b(pglo);
339
+ {
340
+ const auto idx1 = svunpkhi_u32(mm10lo);
341
+ distance_codes_kernel(
342
+ pglohi, idx1, offsets_0, tab, partialSum0);
343
+ }
344
+ {
345
+ const auto idx1 = svunpkhi_u32(mm11lo);
346
+ distance_codes_kernel(
347
+ pglohi, idx1, offsets_0, tab, partialSum1);
348
+ }
349
+ {
350
+ const auto idx1 = svunpkhi_u32(mm12lo);
351
+ distance_codes_kernel(
352
+ pglohi, idx1, offsets_0, tab, partialSum2);
353
+ }
354
+ {
355
+ const auto idx1 = svunpkhi_u32(mm13lo);
356
+ distance_codes_kernel(
357
+ pglohi, idx1, offsets_0, tab, partialSum3);
358
+ }
359
+ tab += ksub * quad_lanes;
360
+ }
361
+
362
+ m += quad_lanes;
363
+ if (m >= M)
364
+ break;
365
+ }
366
+
367
+ {
368
+ const auto mm10hi = svunpkhi_u16(mm10);
369
+ const auto mm11hi = svunpkhi_u16(mm11);
370
+ const auto mm12hi = svunpkhi_u16(mm12);
371
+ const auto mm13hi = svunpkhi_u16(mm13);
372
+ const auto pghi = svunpkhi_b(pg);
373
+
374
+ {
375
+ const auto pghilo = svunpklo_b(pghi);
376
+ {
377
+ const auto idx1 = svunpklo_u32(mm10hi);
378
+ distance_codes_kernel(
379
+ pghilo, idx1, offsets_0, tab, partialSum0);
380
+ }
381
+ {
382
+ const auto idx1 = svunpklo_u32(mm11hi);
383
+ distance_codes_kernel(
384
+ pghilo, idx1, offsets_0, tab, partialSum1);
385
+ }
386
+ {
387
+ const auto idx1 = svunpklo_u32(mm12hi);
388
+ distance_codes_kernel(
389
+ pghilo, idx1, offsets_0, tab, partialSum2);
390
+ }
391
+ {
392
+ const auto idx1 = svunpklo_u32(mm13hi);
393
+ distance_codes_kernel(
394
+ pghilo, idx1, offsets_0, tab, partialSum3);
395
+ }
396
+ tab += ksub * quad_lanes;
397
+ }
398
+
399
+ m += quad_lanes;
400
+ if (m >= M)
401
+ break;
402
+
403
+ {
404
+ const auto pghihi = svunpkhi_b(pghi);
405
+ {
406
+ const auto idx1 = svunpkhi_u32(mm10hi);
407
+ distance_codes_kernel(
408
+ pghihi, idx1, offsets_0, tab, partialSum0);
409
+ }
410
+ {
411
+ const auto idx1 = svunpkhi_u32(mm11hi);
412
+ distance_codes_kernel(
413
+ pghihi, idx1, offsets_0, tab, partialSum1);
414
+ }
415
+ {
416
+ const auto idx1 = svunpkhi_u32(mm12hi);
417
+ distance_codes_kernel(
418
+ pghihi, idx1, offsets_0, tab, partialSum2);
419
+ }
420
+ {
421
+ const auto idx1 = svunpkhi_u32(mm13hi);
422
+ distance_codes_kernel(
423
+ pghihi, idx1, offsets_0, tab, partialSum3);
424
+ }
425
+ tab += ksub * quad_lanes;
426
+ }
427
+
428
+ m += quad_lanes;
429
+ }
430
+ }
431
+
432
+ result0 = svaddv_f32(svptrue_b32(), partialSum0);
433
+ result1 = svaddv_f32(svptrue_b32(), partialSum1);
434
+ result2 = svaddv_f32(svptrue_b32(), partialSum2);
435
+ result3 = svaddv_f32(svptrue_b32(), partialSum3);
436
+ }
437
+
438
+ } // namespace faiss
439
+
440
+ #endif