faiss 0.3.1 → 0.3.3

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 (293) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/LICENSE.txt +1 -1
  4. data/lib/faiss/version.rb +1 -1
  5. data/vendor/faiss/faiss/AutoTune.cpp +2 -2
  6. data/vendor/faiss/faiss/AutoTune.h +3 -3
  7. data/vendor/faiss/faiss/Clustering.cpp +37 -6
  8. data/vendor/faiss/faiss/Clustering.h +12 -3
  9. data/vendor/faiss/faiss/IVFlib.cpp +6 -3
  10. data/vendor/faiss/faiss/IVFlib.h +2 -2
  11. data/vendor/faiss/faiss/Index.cpp +6 -2
  12. data/vendor/faiss/faiss/Index.h +30 -8
  13. data/vendor/faiss/faiss/Index2Layer.cpp +2 -2
  14. data/vendor/faiss/faiss/Index2Layer.h +2 -2
  15. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +7 -7
  16. data/vendor/faiss/faiss/IndexAdditiveQuantizer.h +2 -2
  17. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +14 -16
  18. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +2 -2
  19. data/vendor/faiss/faiss/IndexBinary.cpp +13 -2
  20. data/vendor/faiss/faiss/IndexBinary.h +8 -2
  21. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +2 -3
  22. data/vendor/faiss/faiss/IndexBinaryFlat.h +2 -2
  23. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +2 -2
  24. data/vendor/faiss/faiss/IndexBinaryFromFloat.h +2 -2
  25. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +2 -7
  26. data/vendor/faiss/faiss/IndexBinaryHNSW.h +3 -3
  27. data/vendor/faiss/faiss/IndexBinaryHash.cpp +2 -3
  28. data/vendor/faiss/faiss/IndexBinaryHash.h +2 -2
  29. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +3 -3
  30. data/vendor/faiss/faiss/IndexBinaryIVF.h +2 -2
  31. data/vendor/faiss/faiss/IndexFastScan.cpp +32 -18
  32. data/vendor/faiss/faiss/IndexFastScan.h +11 -2
  33. data/vendor/faiss/faiss/IndexFlat.cpp +13 -10
  34. data/vendor/faiss/faiss/IndexFlat.h +2 -2
  35. data/vendor/faiss/faiss/IndexFlatCodes.cpp +170 -7
  36. data/vendor/faiss/faiss/IndexFlatCodes.h +25 -5
  37. data/vendor/faiss/faiss/IndexHNSW.cpp +156 -96
  38. data/vendor/faiss/faiss/IndexHNSW.h +54 -5
  39. data/vendor/faiss/faiss/IndexIDMap.cpp +19 -3
  40. data/vendor/faiss/faiss/IndexIDMap.h +5 -2
  41. data/vendor/faiss/faiss/IndexIVF.cpp +5 -6
  42. data/vendor/faiss/faiss/IndexIVF.h +13 -4
  43. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +21 -7
  44. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.h +5 -2
  45. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +3 -14
  46. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +2 -4
  47. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +201 -91
  48. data/vendor/faiss/faiss/IndexIVFFastScan.h +33 -9
  49. data/vendor/faiss/faiss/IndexIVFFlat.cpp +2 -2
  50. data/vendor/faiss/faiss/IndexIVFFlat.h +2 -2
  51. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +2 -2
  52. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.h +2 -2
  53. data/vendor/faiss/faiss/IndexIVFPQ.cpp +3 -6
  54. data/vendor/faiss/faiss/IndexIVFPQ.h +2 -2
  55. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +7 -14
  56. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +2 -4
  57. data/vendor/faiss/faiss/IndexIVFPQR.cpp +2 -2
  58. data/vendor/faiss/faiss/IndexIVFPQR.h +2 -2
  59. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +2 -3
  60. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +2 -2
  61. data/vendor/faiss/faiss/IndexLSH.cpp +2 -3
  62. data/vendor/faiss/faiss/IndexLSH.h +2 -2
  63. data/vendor/faiss/faiss/IndexLattice.cpp +3 -21
  64. data/vendor/faiss/faiss/IndexLattice.h +5 -24
  65. data/vendor/faiss/faiss/IndexNNDescent.cpp +2 -31
  66. data/vendor/faiss/faiss/IndexNNDescent.h +3 -3
  67. data/vendor/faiss/faiss/IndexNSG.cpp +2 -5
  68. data/vendor/faiss/faiss/IndexNSG.h +3 -3
  69. data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +56 -0
  70. data/vendor/faiss/faiss/IndexNeuralNetCodec.h +49 -0
  71. data/vendor/faiss/faiss/IndexPQ.cpp +26 -26
  72. data/vendor/faiss/faiss/IndexPQ.h +2 -2
  73. data/vendor/faiss/faiss/IndexPQFastScan.cpp +2 -5
  74. data/vendor/faiss/faiss/IndexPQFastScan.h +2 -11
  75. data/vendor/faiss/faiss/IndexPreTransform.cpp +2 -2
  76. data/vendor/faiss/faiss/IndexPreTransform.h +3 -3
  77. data/vendor/faiss/faiss/IndexRefine.cpp +46 -9
  78. data/vendor/faiss/faiss/IndexRefine.h +9 -2
  79. data/vendor/faiss/faiss/IndexReplicas.cpp +2 -2
  80. data/vendor/faiss/faiss/IndexReplicas.h +2 -2
  81. data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +2 -2
  82. data/vendor/faiss/faiss/IndexRowwiseMinMax.h +2 -2
  83. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +5 -4
  84. data/vendor/faiss/faiss/IndexScalarQuantizer.h +2 -2
  85. data/vendor/faiss/faiss/IndexShards.cpp +2 -2
  86. data/vendor/faiss/faiss/IndexShards.h +2 -2
  87. data/vendor/faiss/faiss/IndexShardsIVF.cpp +2 -2
  88. data/vendor/faiss/faiss/IndexShardsIVF.h +2 -2
  89. data/vendor/faiss/faiss/MatrixStats.cpp +2 -2
  90. data/vendor/faiss/faiss/MatrixStats.h +2 -2
  91. data/vendor/faiss/faiss/MetaIndexes.cpp +2 -3
  92. data/vendor/faiss/faiss/MetaIndexes.h +2 -2
  93. data/vendor/faiss/faiss/MetricType.h +9 -4
  94. data/vendor/faiss/faiss/VectorTransform.cpp +2 -2
  95. data/vendor/faiss/faiss/VectorTransform.h +2 -2
  96. data/vendor/faiss/faiss/clone_index.cpp +2 -2
  97. data/vendor/faiss/faiss/clone_index.h +2 -2
  98. data/vendor/faiss/faiss/cppcontrib/SaDecodeKernels.h +2 -2
  99. data/vendor/faiss/faiss/cppcontrib/detail/CoarseBitType.h +2 -2
  100. data/vendor/faiss/faiss/cppcontrib/detail/UintReader.h +97 -19
  101. data/vendor/faiss/faiss/cppcontrib/factory_tools.cpp +192 -0
  102. data/vendor/faiss/faiss/cppcontrib/factory_tools.h +29 -0
  103. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +2 -2
  104. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +85 -32
  105. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-neon-inl.h +2 -2
  106. data/vendor/faiss/faiss/cppcontrib/sa_decode/MinMax-inl.h +2 -2
  107. data/vendor/faiss/faiss/cppcontrib/sa_decode/MinMaxFP16-inl.h +2 -2
  108. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +2 -2
  109. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +2 -2
  110. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-neon-inl.h +2 -2
  111. data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +2 -5
  112. data/vendor/faiss/faiss/gpu/GpuAutoTune.h +2 -2
  113. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +45 -13
  114. data/vendor/faiss/faiss/gpu/GpuCloner.h +2 -2
  115. data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +12 -6
  116. data/vendor/faiss/faiss/gpu/GpuDistance.h +11 -7
  117. data/vendor/faiss/faiss/gpu/GpuFaissAssert.h +3 -3
  118. data/vendor/faiss/faiss/gpu/GpuIcmEncoder.h +2 -2
  119. data/vendor/faiss/faiss/gpu/GpuIndex.h +10 -15
  120. data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +2 -2
  121. data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +285 -0
  122. data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +2 -2
  123. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +8 -2
  124. data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +4 -2
  125. data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +3 -3
  126. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +2 -2
  127. data/vendor/faiss/faiss/gpu/GpuIndicesOptions.h +2 -2
  128. data/vendor/faiss/faiss/gpu/GpuResources.cpp +7 -2
  129. data/vendor/faiss/faiss/gpu/GpuResources.h +11 -4
  130. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +66 -11
  131. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +15 -5
  132. data/vendor/faiss/faiss/gpu/impl/IndexUtils.h +2 -2
  133. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.cpp +28 -23
  134. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.h +2 -2
  135. data/vendor/faiss/faiss/gpu/impl/RemapIndices.cpp +2 -2
  136. data/vendor/faiss/faiss/gpu/impl/RemapIndices.h +2 -2
  137. data/vendor/faiss/faiss/gpu/perf/IndexWrapper-inl.h +2 -2
  138. data/vendor/faiss/faiss/gpu/perf/IndexWrapper.h +2 -2
  139. data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +8 -2
  140. data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +2 -3
  141. data/vendor/faiss/faiss/gpu/perf/WriteIndex.cpp +2 -2
  142. data/vendor/faiss/faiss/gpu/test/TestCodePacking.cpp +10 -7
  143. data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +2 -2
  144. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +54 -54
  145. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +144 -77
  146. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +51 -51
  147. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +2 -2
  148. data/vendor/faiss/faiss/gpu/test/TestGpuMemoryException.cpp +3 -3
  149. data/vendor/faiss/faiss/gpu/test/TestGpuResidualQuantizer.cpp +70 -0
  150. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +74 -4
  151. data/vendor/faiss/faiss/gpu/test/TestUtils.h +2 -2
  152. data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +3 -3
  153. data/vendor/faiss/faiss/gpu/utils/{RaftUtils.h → CuvsUtils.h} +12 -11
  154. data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +8 -2
  155. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +2 -2
  156. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.h +2 -2
  157. data/vendor/faiss/faiss/gpu/utils/StaticUtils.h +2 -2
  158. data/vendor/faiss/faiss/gpu/utils/Timer.cpp +6 -3
  159. data/vendor/faiss/faiss/gpu/utils/Timer.h +3 -3
  160. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +79 -11
  161. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +17 -5
  162. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +27 -2
  163. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +11 -3
  164. data/vendor/faiss/faiss/impl/CodePacker.cpp +2 -2
  165. data/vendor/faiss/faiss/impl/CodePacker.h +2 -2
  166. data/vendor/faiss/faiss/impl/DistanceComputer.h +48 -2
  167. data/vendor/faiss/faiss/impl/FaissAssert.h +6 -4
  168. data/vendor/faiss/faiss/impl/FaissException.cpp +2 -2
  169. data/vendor/faiss/faiss/impl/FaissException.h +2 -3
  170. data/vendor/faiss/faiss/impl/HNSW.cpp +378 -205
  171. data/vendor/faiss/faiss/impl/HNSW.h +55 -24
  172. data/vendor/faiss/faiss/impl/IDSelector.cpp +2 -2
  173. data/vendor/faiss/faiss/impl/IDSelector.h +2 -2
  174. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +10 -10
  175. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +2 -2
  176. data/vendor/faiss/faiss/impl/LookupTableScaler.h +36 -2
  177. data/vendor/faiss/faiss/impl/NNDescent.cpp +15 -10
  178. data/vendor/faiss/faiss/impl/NNDescent.h +2 -2
  179. data/vendor/faiss/faiss/impl/NSG.cpp +26 -49
  180. data/vendor/faiss/faiss/impl/NSG.h +20 -8
  181. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +2 -2
  182. data/vendor/faiss/faiss/impl/PolysemousTraining.h +2 -2
  183. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +2 -4
  184. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.h +2 -2
  185. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +2 -2
  186. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +3 -2
  187. data/vendor/faiss/faiss/impl/ProductQuantizer.h +7 -3
  188. data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
  189. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +2 -36
  190. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +3 -13
  191. data/vendor/faiss/faiss/impl/ResultHandler.h +153 -34
  192. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +721 -104
  193. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +5 -2
  194. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +2 -2
  195. data/vendor/faiss/faiss/impl/ThreadedIndex.h +2 -2
  196. data/vendor/faiss/faiss/impl/code_distance/code_distance-avx2.h +7 -2
  197. data/vendor/faiss/faiss/impl/code_distance/code_distance-avx512.h +248 -0
  198. data/vendor/faiss/faiss/impl/code_distance/code_distance-generic.h +2 -2
  199. data/vendor/faiss/faiss/impl/code_distance/code_distance-sve.h +440 -0
  200. data/vendor/faiss/faiss/impl/code_distance/code_distance.h +55 -2
  201. data/vendor/faiss/faiss/impl/index_read.cpp +31 -20
  202. data/vendor/faiss/faiss/impl/index_read_utils.h +37 -0
  203. data/vendor/faiss/faiss/impl/index_write.cpp +30 -16
  204. data/vendor/faiss/faiss/impl/io.cpp +15 -7
  205. data/vendor/faiss/faiss/impl/io.h +6 -6
  206. data/vendor/faiss/faiss/impl/io_macros.h +8 -9
  207. data/vendor/faiss/faiss/impl/kmeans1d.cpp +2 -3
  208. data/vendor/faiss/faiss/impl/kmeans1d.h +2 -2
  209. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +2 -3
  210. data/vendor/faiss/faiss/impl/lattice_Zn.h +2 -2
  211. data/vendor/faiss/faiss/impl/platform_macros.h +34 -2
  212. data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +13 -2
  213. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +20 -2
  214. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +3 -3
  215. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +450 -3
  216. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +8 -8
  217. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +3 -3
  218. data/vendor/faiss/faiss/impl/simd_result_handlers.h +151 -67
  219. data/vendor/faiss/faiss/index_factory.cpp +51 -34
  220. data/vendor/faiss/faiss/index_factory.h +2 -2
  221. data/vendor/faiss/faiss/index_io.h +14 -7
  222. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +30 -10
  223. data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +5 -2
  224. data/vendor/faiss/faiss/invlists/DirectMap.cpp +11 -3
  225. data/vendor/faiss/faiss/invlists/DirectMap.h +2 -2
  226. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +57 -19
  227. data/vendor/faiss/faiss/invlists/InvertedLists.h +20 -11
  228. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +2 -2
  229. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.h +2 -2
  230. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +23 -9
  231. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +4 -3
  232. data/vendor/faiss/faiss/python/python_callbacks.cpp +5 -5
  233. data/vendor/faiss/faiss/python/python_callbacks.h +2 -2
  234. data/vendor/faiss/faiss/utils/AlignedTable.h +5 -3
  235. data/vendor/faiss/faiss/utils/Heap.cpp +2 -2
  236. data/vendor/faiss/faiss/utils/Heap.h +107 -2
  237. data/vendor/faiss/faiss/utils/NeuralNet.cpp +346 -0
  238. data/vendor/faiss/faiss/utils/NeuralNet.h +147 -0
  239. data/vendor/faiss/faiss/utils/WorkerThread.cpp +2 -2
  240. data/vendor/faiss/faiss/utils/WorkerThread.h +2 -2
  241. data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +2 -2
  242. data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +2 -2
  243. data/vendor/faiss/faiss/utils/approx_topk/generic.h +2 -2
  244. data/vendor/faiss/faiss/utils/approx_topk/mode.h +2 -2
  245. data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +2 -2
  246. data/vendor/faiss/faiss/utils/bf16.h +36 -0
  247. data/vendor/faiss/faiss/utils/distances.cpp +249 -90
  248. data/vendor/faiss/faiss/utils/distances.h +8 -8
  249. data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +2 -2
  250. data/vendor/faiss/faiss/utils/distances_fused/avx512.h +2 -2
  251. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +2 -2
  252. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +2 -2
  253. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +2 -2
  254. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.h +2 -2
  255. data/vendor/faiss/faiss/utils/distances_simd.cpp +1543 -56
  256. data/vendor/faiss/faiss/utils/extra_distances-inl.h +72 -2
  257. data/vendor/faiss/faiss/utils/extra_distances.cpp +87 -140
  258. data/vendor/faiss/faiss/utils/extra_distances.h +5 -4
  259. data/vendor/faiss/faiss/utils/fp16-arm.h +2 -2
  260. data/vendor/faiss/faiss/utils/fp16-fp16c.h +2 -2
  261. data/vendor/faiss/faiss/utils/fp16-inl.h +2 -2
  262. data/vendor/faiss/faiss/utils/fp16.h +2 -2
  263. data/vendor/faiss/faiss/utils/hamming-inl.h +2 -2
  264. data/vendor/faiss/faiss/utils/hamming.cpp +3 -4
  265. data/vendor/faiss/faiss/utils/hamming.h +2 -2
  266. data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +2 -2
  267. data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +490 -0
  268. data/vendor/faiss/faiss/utils/hamming_distance/common.h +2 -2
  269. data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +6 -3
  270. data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +7 -3
  271. data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +5 -5
  272. data/vendor/faiss/faiss/utils/ordered_key_value.h +2 -2
  273. data/vendor/faiss/faiss/utils/partitioning.cpp +2 -2
  274. data/vendor/faiss/faiss/utils/partitioning.h +2 -2
  275. data/vendor/faiss/faiss/utils/prefetch.h +2 -2
  276. data/vendor/faiss/faiss/utils/quantize_lut.cpp +2 -2
  277. data/vendor/faiss/faiss/utils/quantize_lut.h +2 -2
  278. data/vendor/faiss/faiss/utils/random.cpp +45 -2
  279. data/vendor/faiss/faiss/utils/random.h +27 -2
  280. data/vendor/faiss/faiss/utils/simdlib.h +12 -3
  281. data/vendor/faiss/faiss/utils/simdlib_avx2.h +2 -2
  282. data/vendor/faiss/faiss/utils/simdlib_avx512.h +296 -0
  283. data/vendor/faiss/faiss/utils/simdlib_emulated.h +2 -2
  284. data/vendor/faiss/faiss/utils/simdlib_neon.h +7 -4
  285. data/vendor/faiss/faiss/utils/simdlib_ppc64.h +1084 -0
  286. data/vendor/faiss/faiss/utils/sorting.cpp +2 -2
  287. data/vendor/faiss/faiss/utils/sorting.h +2 -2
  288. data/vendor/faiss/faiss/utils/transpose/transpose-avx2-inl.h +2 -2
  289. data/vendor/faiss/faiss/utils/transpose/transpose-avx512-inl.h +176 -0
  290. data/vendor/faiss/faiss/utils/utils.cpp +17 -10
  291. data/vendor/faiss/faiss/utils/utils.h +7 -3
  292. metadata +22 -11
  293. data/vendor/faiss/faiss/impl/code_distance/code_distance_avx512.h +0 -102
@@ -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.
@@ -43,6 +43,30 @@ struct RandomGenerator {
43
43
  explicit RandomGenerator(int64_t seed = 1234);
44
44
  };
45
45
 
46
+ /// fast random generator that cannot be used in multithreaded contexts.
47
+ /// based on https://prng.di.unimi.it/
48
+ struct SplitMix64RandomGenerator {
49
+ uint64_t state;
50
+
51
+ /// random positive integer
52
+ int rand_int();
53
+
54
+ /// random int64_t
55
+ int64_t rand_int64();
56
+
57
+ /// generate random integer between 0 and max-1
58
+ int rand_int(int max);
59
+
60
+ /// between 0 and 1
61
+ float rand_float();
62
+
63
+ double rand_double();
64
+
65
+ explicit SplitMix64RandomGenerator(int64_t seed = 1234);
66
+
67
+ uint64_t next();
68
+ };
69
+
46
70
  /* Generate an array of uniform random floats / multi-threaded implementation */
47
71
  void float_rand(float* x, size_t n, int64_t seed);
48
72
  void float_randn(float* x, size_t n, int64_t seed);
@@ -53,6 +77,7 @@ void int64_rand_max(int64_t* x, size_t n, uint64_t max, int64_t seed);
53
77
 
54
78
  /* random permutation */
55
79
  void rand_perm(int* perm, size_t n, int64_t seed);
80
+ void rand_perm_splitmix64(int* perm, size_t n, int64_t seed);
56
81
 
57
82
  /* Random set of vectors with intrinsic dimensionality 10 that is harder to
58
83
  * index than a subspace of dim 10 but easier than uniform data in dimension d
@@ -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.
@@ -14,7 +14,12 @@
14
14
  * functions.
15
15
  */
16
16
 
17
- #ifdef __AVX2__
17
+ #if defined(__AVX512F__)
18
+
19
+ #include <faiss/utils/simdlib_avx2.h>
20
+ #include <faiss/utils/simdlib_avx512.h>
21
+
22
+ #elif defined(__AVX2__)
18
23
 
19
24
  #include <faiss/utils/simdlib_avx2.h>
20
25
 
@@ -22,6 +27,10 @@
22
27
 
23
28
  #include <faiss/utils/simdlib_neon.h>
24
29
 
30
+ #elif defined(__PPC64__)
31
+
32
+ #include <faiss/utils/simdlib_ppc64.h>
33
+
25
34
  #else
26
35
 
27
36
  // emulated = all operations are implemented as scalars
@@ -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,296 @@
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 <string>
12
+
13
+ #include <immintrin.h>
14
+
15
+ #include <faiss/impl/platform_macros.h>
16
+
17
+ #include <faiss/utils/simdlib_avx2.h>
18
+
19
+ namespace faiss {
20
+
21
+ /** Simple wrapper around the AVX 512-bit registers
22
+ *
23
+ * The objective is to separate the different interpretations of the same
24
+ * registers (as a vector of uint8, uint16 or uint32), to provide printing
25
+ * functions, and to give more readable names to the AVX intrinsics. It does not
26
+ * pretend to be exhausitve, functions are added as needed.
27
+ */
28
+
29
+ /// 512-bit representation without interpretation as a vector
30
+ struct simd512bit {
31
+ union {
32
+ __m512i i;
33
+ __m512 f;
34
+ };
35
+
36
+ simd512bit() {}
37
+
38
+ explicit simd512bit(__m512i i) : i(i) {}
39
+
40
+ explicit simd512bit(__m512 f) : f(f) {}
41
+
42
+ explicit simd512bit(const void* x)
43
+ : i(_mm512_loadu_si512((__m512i const*)x)) {}
44
+
45
+ // sets up a lower half of the register while keeping upper one as zero
46
+ explicit simd512bit(simd256bit lo)
47
+ : simd512bit(_mm512_inserti32x8(
48
+ _mm512_castsi256_si512(lo.i),
49
+ _mm256_setzero_si256(),
50
+ 1)) {}
51
+
52
+ // constructs from lower and upper halves
53
+ explicit simd512bit(simd256bit lo, simd256bit hi)
54
+ : simd512bit(_mm512_inserti32x8(
55
+ _mm512_castsi256_si512(lo.i),
56
+ hi.i,
57
+ 1)) {}
58
+
59
+ void clear() {
60
+ i = _mm512_setzero_si512();
61
+ }
62
+
63
+ void storeu(void* ptr) const {
64
+ _mm512_storeu_si512((__m512i*)ptr, i);
65
+ }
66
+
67
+ void loadu(const void* ptr) {
68
+ i = _mm512_loadu_si512((__m512i*)ptr);
69
+ }
70
+
71
+ void store(void* ptr) const {
72
+ _mm512_storeu_si512((__m512i*)ptr, i);
73
+ }
74
+
75
+ void bin(char bits[513]) const {
76
+ char bytes[64];
77
+ storeu((void*)bytes);
78
+ for (int i = 0; i < 512; i++) {
79
+ bits[i] = '0' + ((bytes[i / 8] >> (i % 8)) & 1);
80
+ }
81
+ bits[512] = 0;
82
+ }
83
+
84
+ std::string bin() const {
85
+ char bits[257];
86
+ bin(bits);
87
+ return std::string(bits);
88
+ }
89
+ };
90
+
91
+ /// vector of 32 elements in uint16
92
+ struct simd32uint16 : simd512bit {
93
+ simd32uint16() {}
94
+
95
+ explicit simd32uint16(__m512i i) : simd512bit(i) {}
96
+
97
+ explicit simd32uint16(int x) : simd512bit(_mm512_set1_epi16(x)) {}
98
+
99
+ explicit simd32uint16(uint16_t x) : simd512bit(_mm512_set1_epi16(x)) {}
100
+
101
+ explicit simd32uint16(simd512bit x) : simd512bit(x) {}
102
+
103
+ explicit simd32uint16(const uint16_t* x) : simd512bit((const void*)x) {}
104
+
105
+ // sets up a lower half of the register
106
+ explicit simd32uint16(simd256bit lo) : simd512bit(lo) {}
107
+
108
+ // constructs from lower and upper halves
109
+ explicit simd32uint16(simd256bit lo, simd256bit hi) : simd512bit(lo, hi) {}
110
+
111
+ std::string elements_to_string(const char* fmt) const {
112
+ uint16_t bytes[32];
113
+ storeu((void*)bytes);
114
+ char res[2000];
115
+ char* ptr = res;
116
+ for (int i = 0; i < 32; i++) {
117
+ ptr += sprintf(ptr, fmt, bytes[i]);
118
+ }
119
+ // strip last ,
120
+ ptr[-1] = 0;
121
+ return std::string(res);
122
+ }
123
+
124
+ std::string hex() const {
125
+ return elements_to_string("%02x,");
126
+ }
127
+
128
+ std::string dec() const {
129
+ return elements_to_string("%3d,");
130
+ }
131
+
132
+ void set1(uint16_t x) {
133
+ i = _mm512_set1_epi16((short)x);
134
+ }
135
+
136
+ simd32uint16 operator*(const simd32uint16& other) const {
137
+ return simd32uint16(_mm512_mullo_epi16(i, other.i));
138
+ }
139
+
140
+ // shift must be known at compile time
141
+ simd32uint16 operator>>(const int shift) const {
142
+ return simd32uint16(_mm512_srli_epi16(i, shift));
143
+ }
144
+
145
+ // shift must be known at compile time
146
+ simd32uint16 operator<<(const int shift) const {
147
+ return simd32uint16(_mm512_slli_epi16(i, shift));
148
+ }
149
+
150
+ simd32uint16 operator+=(simd32uint16 other) {
151
+ i = _mm512_add_epi16(i, other.i);
152
+ return *this;
153
+ }
154
+
155
+ simd32uint16 operator-=(simd32uint16 other) {
156
+ i = _mm512_sub_epi16(i, other.i);
157
+ return *this;
158
+ }
159
+
160
+ simd32uint16 operator+(simd32uint16 other) const {
161
+ return simd32uint16(_mm512_add_epi16(i, other.i));
162
+ }
163
+
164
+ simd32uint16 operator-(simd32uint16 other) const {
165
+ return simd32uint16(_mm512_sub_epi16(i, other.i));
166
+ }
167
+
168
+ simd32uint16 operator&(simd512bit other) const {
169
+ return simd32uint16(_mm512_and_si512(i, other.i));
170
+ }
171
+
172
+ simd32uint16 operator|(simd512bit other) const {
173
+ return simd32uint16(_mm512_or_si512(i, other.i));
174
+ }
175
+
176
+ simd32uint16 operator^(simd512bit other) const {
177
+ return simd32uint16(_mm512_xor_si512(i, other.i));
178
+ }
179
+
180
+ simd32uint16 operator~() const {
181
+ return simd32uint16(_mm512_xor_si512(i, _mm512_set1_epi32(-1)));
182
+ }
183
+
184
+ simd16uint16 low() const {
185
+ return simd16uint16(_mm512_castsi512_si256(i));
186
+ }
187
+
188
+ simd16uint16 high() const {
189
+ return simd16uint16(_mm512_extracti32x8_epi32(i, 1));
190
+ }
191
+
192
+ // for debugging only
193
+ uint16_t operator[](int i) const {
194
+ ALIGNED(64) uint16_t tab[32];
195
+ store(tab);
196
+ return tab[i];
197
+ }
198
+
199
+ void accu_min(simd32uint16 incoming) {
200
+ i = _mm512_min_epu16(i, incoming.i);
201
+ }
202
+
203
+ void accu_max(simd32uint16 incoming) {
204
+ i = _mm512_max_epu16(i, incoming.i);
205
+ }
206
+ };
207
+
208
+ // decompose in 128-lanes: a = (a0, a1, a2, a3), b = (b0, b1, b2, b3)
209
+ // return (a0 + a1 + a2 + a3, b0 + b1 + b2 + b3)
210
+ inline simd16uint16 combine4x2(simd32uint16 a, simd32uint16 b) {
211
+ return combine2x2(a.low(), b.low()) + combine2x2(a.high(), b.high());
212
+ }
213
+
214
+ // vector of 32 unsigned 8-bit integers
215
+ struct simd64uint8 : simd512bit {
216
+ simd64uint8() {}
217
+
218
+ explicit simd64uint8(__m512i i) : simd512bit(i) {}
219
+
220
+ explicit simd64uint8(int x) : simd512bit(_mm512_set1_epi8(x)) {}
221
+
222
+ explicit simd64uint8(uint8_t x) : simd512bit(_mm512_set1_epi8(x)) {}
223
+
224
+ // sets up a lower half of the register
225
+ explicit simd64uint8(simd256bit lo) : simd512bit(lo) {}
226
+
227
+ // constructs from lower and upper halves
228
+ explicit simd64uint8(simd256bit lo, simd256bit hi) : simd512bit(lo, hi) {}
229
+
230
+ explicit simd64uint8(simd512bit x) : simd512bit(x) {}
231
+
232
+ explicit simd64uint8(const uint8_t* x) : simd512bit((const void*)x) {}
233
+
234
+ std::string elements_to_string(const char* fmt) const {
235
+ uint8_t bytes[64];
236
+ storeu((void*)bytes);
237
+ char res[2000];
238
+ char* ptr = res;
239
+ for (int i = 0; i < 64; i++) {
240
+ ptr += sprintf(ptr, fmt, bytes[i]);
241
+ }
242
+ // strip last ,
243
+ ptr[-1] = 0;
244
+ return std::string(res);
245
+ }
246
+
247
+ std::string hex() const {
248
+ return elements_to_string("%02x,");
249
+ }
250
+
251
+ std::string dec() const {
252
+ return elements_to_string("%3d,");
253
+ }
254
+
255
+ void set1(uint8_t x) {
256
+ i = _mm512_set1_epi8((char)x);
257
+ }
258
+
259
+ simd64uint8 operator&(simd512bit other) const {
260
+ return simd64uint8(_mm512_and_si512(i, other.i));
261
+ }
262
+
263
+ simd64uint8 operator+(simd64uint8 other) const {
264
+ return simd64uint8(_mm512_add_epi8(i, other.i));
265
+ }
266
+
267
+ simd64uint8 lookup_4_lanes(simd64uint8 idx) const {
268
+ return simd64uint8(_mm512_shuffle_epi8(i, idx.i));
269
+ }
270
+
271
+ // extract + 0-extend lane
272
+ // this operation is slow (3 cycles)
273
+ simd32uint16 lane0_as_uint16() const {
274
+ __m256i x = _mm512_extracti32x8_epi32(i, 0);
275
+ return simd32uint16(_mm512_cvtepu8_epi16(x));
276
+ }
277
+
278
+ simd32uint16 lane1_as_uint16() const {
279
+ __m256i x = _mm512_extracti32x8_epi32(i, 1);
280
+ return simd32uint16(_mm512_cvtepu8_epi16(x));
281
+ }
282
+
283
+ simd64uint8 operator+=(simd64uint8 other) {
284
+ i = _mm512_add_epi8(i, other.i);
285
+ return *this;
286
+ }
287
+
288
+ // for debugging only
289
+ uint8_t operator[](int i) const {
290
+ ALIGNED(64) uint8_t tab[64];
291
+ store(tab);
292
+ return tab[i];
293
+ }
294
+ };
295
+
296
+ } // 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.
@@ -168,9 +168,12 @@ static inline std::string elements_to_string(const char* fmt, const S& simd) {
168
168
  simd.store(bytes);
169
169
  char res[1000], *ptr = res;
170
170
  for (size_t i = 0; i < N; ++i) {
171
- ptr += sprintf(ptr, fmt, bytes[i]);
171
+ int bytesWritten =
172
+ snprintf(ptr, sizeof(res) - (ptr - res), fmt, bytes[i]);
173
+ ptr += bytesWritten;
172
174
  }
173
- // strip last ,
175
+ // The format usually contains a ',' separator so this is to remove the last
176
+ // separator.
174
177
  ptr[-1] = 0;
175
178
  return std::string(res);
176
179
  }