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.
@@ -9,7 +9,9 @@
9
9
  * and inner product */
10
10
 
11
11
  #include <faiss/MetricType.h>
12
+ #include <faiss/impl/FaissAssert.h>
12
13
  #include <faiss/utils/distances.h>
14
+ #include <cmath>
13
15
  #include <type_traits>
14
16
 
15
17
  namespace faiss {
@@ -130,4 +132,72 @@ inline float VectorDistance<METRIC_Jaccard>::operator()(
130
132
  return accu_num / accu_den;
131
133
  }
132
134
 
135
+ template <>
136
+ inline float VectorDistance<METRIC_NaNEuclidean>::operator()(
137
+ const float* x,
138
+ const float* y) const {
139
+ // https://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.nan_euclidean_distances.html
140
+ float accu = 0;
141
+ size_t present = 0;
142
+ for (size_t i = 0; i < d; i++) {
143
+ if (!std::isnan(x[i]) && !std::isnan(y[i])) {
144
+ float diff = x[i] - y[i];
145
+ accu += diff * diff;
146
+ present++;
147
+ }
148
+ }
149
+ if (present == 0) {
150
+ return NAN;
151
+ }
152
+ return float(d) / float(present) * accu;
153
+ }
154
+
155
+ template <>
156
+ inline float VectorDistance<METRIC_ABS_INNER_PRODUCT>::operator()(
157
+ const float* x,
158
+ const float* y) const {
159
+ float accu = 0;
160
+ for (size_t i = 0; i < d; i++) {
161
+ accu += fabs(x[i] * y[i]);
162
+ }
163
+ return accu;
164
+ }
165
+
166
+ /***************************************************************************
167
+ * Dispatching function that takes a metric type and a consumer object
168
+ * the consumer object should contain a retun type T and a operation template
169
+ * function f() that is called to perform the operation. The first argument
170
+ * of the function is the VectorDistance object. The rest are passed in as is.
171
+ **************************************************************************/
172
+
173
+ template <class Consumer, class... Types>
174
+ typename Consumer::T dispatch_VectorDistance(
175
+ size_t d,
176
+ MetricType metric,
177
+ float metric_arg,
178
+ Consumer& consumer,
179
+ Types... args) {
180
+ switch (metric) {
181
+ #define DISPATCH_VD(mt) \
182
+ case mt: { \
183
+ VectorDistance<mt> vd = {d, metric_arg}; \
184
+ return consumer.template f<VectorDistance<mt>>(vd, args...); \
185
+ }
186
+ DISPATCH_VD(METRIC_INNER_PRODUCT);
187
+ DISPATCH_VD(METRIC_L2);
188
+ DISPATCH_VD(METRIC_L1);
189
+ DISPATCH_VD(METRIC_Linf);
190
+ DISPATCH_VD(METRIC_Lp);
191
+ DISPATCH_VD(METRIC_Canberra);
192
+ DISPATCH_VD(METRIC_BrayCurtis);
193
+ DISPATCH_VD(METRIC_JensenShannon);
194
+ DISPATCH_VD(METRIC_Jaccard);
195
+ DISPATCH_VD(METRIC_NaNEuclidean);
196
+ DISPATCH_VD(METRIC_ABS_INNER_PRODUCT);
197
+ default:
198
+ FAISS_THROW_FMT("Invalid metric %d", metric);
199
+ }
200
+ #undef DISPATCH_VD
201
+ }
202
+
133
203
  } // 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.
@@ -15,7 +15,6 @@
15
15
 
16
16
  #include <faiss/impl/AuxIndexStructures.h>
17
17
  #include <faiss/impl/DistanceComputer.h>
18
- #include <faiss/impl/FaissAssert.h>
19
18
  #include <faiss/utils/utils.h>
20
19
 
21
20
  namespace faiss {
@@ -26,73 +25,77 @@ namespace faiss {
26
25
 
27
26
  namespace {
28
27
 
29
- template <class VD>
30
- void pairwise_extra_distances_template(
31
- VD vd,
32
- int64_t nq,
33
- const float* xq,
34
- int64_t nb,
35
- const float* xb,
36
- float* dis,
37
- int64_t ldq,
38
- int64_t ldb,
39
- int64_t ldd) {
28
+ struct Run_pairwise_extra_distances {
29
+ using T = void;
30
+
31
+ template <class VD>
32
+ void f(VD vd,
33
+ int64_t nq,
34
+ const float* xq,
35
+ int64_t nb,
36
+ const float* xb,
37
+ float* dis,
38
+ int64_t ldq,
39
+ int64_t ldb,
40
+ int64_t ldd) {
40
41
  #pragma omp parallel for if (nq > 10)
41
- for (int64_t i = 0; i < nq; i++) {
42
- const float* xqi = xq + i * ldq;
43
- const float* xbj = xb;
44
- float* disi = dis + ldd * i;
45
-
46
- for (int64_t j = 0; j < nb; j++) {
47
- disi[j] = vd(xqi, xbj);
48
- xbj += ldb;
42
+ for (int64_t i = 0; i < nq; i++) {
43
+ const float* xqi = xq + i * ldq;
44
+ const float* xbj = xb;
45
+ float* disi = dis + ldd * i;
46
+
47
+ for (int64_t j = 0; j < nb; j++) {
48
+ disi[j] = vd(xqi, xbj);
49
+ xbj += ldb;
50
+ }
49
51
  }
50
52
  }
51
- }
52
-
53
- template <class VD, class C>
54
- void knn_extra_metrics_template(
55
- VD vd,
56
- const float* x,
57
- const float* y,
58
- size_t nx,
59
- size_t ny,
60
- HeapArray<C>* res) {
61
- size_t k = res->k;
62
- size_t d = vd.d;
63
- size_t check_period = InterruptCallback::get_period_hint(ny * d);
64
- check_period *= omp_get_max_threads();
53
+ };
65
54
 
66
- for (size_t i0 = 0; i0 < nx; i0 += check_period) {
67
- size_t i1 = std::min(i0 + check_period, nx);
55
+ struct Run_knn_extra_metrics {
56
+ using T = void;
57
+ template <class VD>
58
+ void f(VD vd,
59
+ const float* x,
60
+ const float* y,
61
+ size_t nx,
62
+ size_t ny,
63
+ size_t k,
64
+ float* distances,
65
+ int64_t* labels) {
66
+ size_t d = vd.d;
67
+ using C = typename VD::C;
68
+ size_t check_period = InterruptCallback::get_period_hint(ny * d);
69
+ check_period *= omp_get_max_threads();
70
+
71
+ for (size_t i0 = 0; i0 < nx; i0 += check_period) {
72
+ size_t i1 = std::min(i0 + check_period, nx);
68
73
 
69
74
  #pragma omp parallel for
70
- for (int64_t i = i0; i < i1; i++) {
71
- const float* x_i = x + i * d;
72
- const float* y_j = y;
73
- size_t j;
74
- float* simi = res->get_val(i);
75
- int64_t* idxi = res->get_ids(i);
76
-
77
- // maxheap_heapify(k, simi, idxi);
78
- heap_heapify<C>(k, simi, idxi);
79
- for (j = 0; j < ny; j++) {
80
- float disij = vd(x_i, y_j);
81
-
82
- // if (disij < simi[0]) {
83
- if ((!vd.is_similarity && (disij < simi[0])) ||
84
- (vd.is_similarity && (disij > simi[0]))) {
85
- // maxheap_replace_top(k, simi, idxi, disij, j);
86
- heap_replace_top<C>(k, simi, idxi, disij, j);
75
+ for (int64_t i = i0; i < i1; i++) {
76
+ const float* x_i = x + i * d;
77
+ const float* y_j = y;
78
+ size_t j;
79
+ float* simi = distances + k * i;
80
+ int64_t* idxi = labels + k * i;
81
+
82
+ // maxheap_heapify(k, simi, idxi);
83
+ heap_heapify<C>(k, simi, idxi);
84
+ for (j = 0; j < ny; j++) {
85
+ float disij = vd(x_i, y_j);
86
+
87
+ if (C::cmp(simi[0], disij)) {
88
+ heap_replace_top<C>(k, simi, idxi, disij, j);
89
+ }
90
+ y_j += d;
87
91
  }
88
- y_j += d;
92
+ // maxheap_reorder(k, simi, idxi);
93
+ heap_reorder<C>(k, simi, idxi);
89
94
  }
90
- // maxheap_reorder(k, simi, idxi);
91
- heap_reorder<C>(k, simi, idxi);
95
+ InterruptCallback::check();
92
96
  }
93
- InterruptCallback::check();
94
97
  }
95
- }
98
+ };
96
99
 
97
100
  template <class VD>
98
101
  struct ExtraDistanceComputer : FlatCodesDistanceComputer {
@@ -125,6 +128,19 @@ struct ExtraDistanceComputer : FlatCodesDistanceComputer {
125
128
  }
126
129
  };
127
130
 
131
+ struct Run_get_distance_computer {
132
+ using T = FlatCodesDistanceComputer*;
133
+
134
+ template <class VD>
135
+ FlatCodesDistanceComputer* f(
136
+ VD vd,
137
+ const float* xb,
138
+ size_t nb,
139
+ const float* q = nullptr) {
140
+ return new ExtraDistanceComputer<VD>(vd, xb, nb, q);
141
+ }
142
+ };
143
+
128
144
  } // anonymous namespace
129
145
 
130
146
  void pairwise_extra_distances(
@@ -148,29 +164,11 @@ void pairwise_extra_distances(
148
164
  if (ldd == -1)
149
165
  ldd = nb;
150
166
 
151
- switch (mt) {
152
- #define HANDLE_VAR(kw) \
153
- case METRIC_##kw: { \
154
- VectorDistance<METRIC_##kw> vd = {(size_t)d, metric_arg}; \
155
- pairwise_extra_distances_template( \
156
- vd, nq, xq, nb, xb, dis, ldq, ldb, ldd); \
157
- break; \
158
- }
159
- HANDLE_VAR(L2);
160
- HANDLE_VAR(L1);
161
- HANDLE_VAR(Linf);
162
- HANDLE_VAR(Canberra);
163
- HANDLE_VAR(BrayCurtis);
164
- HANDLE_VAR(JensenShannon);
165
- HANDLE_VAR(Lp);
166
- HANDLE_VAR(Jaccard);
167
- #undef HANDLE_VAR
168
- default:
169
- FAISS_THROW_MSG("metric type not implemented");
170
- }
167
+ Run_pairwise_extra_distances run;
168
+ dispatch_VectorDistance(
169
+ d, mt, metric_arg, run, nq, xq, nb, xb, dis, ldq, ldb, ldd);
171
170
  }
172
171
 
173
- template <class C>
174
172
  void knn_extra_metrics(
175
173
  const float* x,
176
174
  const float* y,
@@ -179,73 +177,22 @@ void knn_extra_metrics(
179
177
  size_t ny,
180
178
  MetricType mt,
181
179
  float metric_arg,
182
- HeapArray<C>* res) {
183
- switch (mt) {
184
- #define HANDLE_VAR(kw) \
185
- case METRIC_##kw: { \
186
- VectorDistance<METRIC_##kw> vd = {(size_t)d, metric_arg}; \
187
- knn_extra_metrics_template(vd, x, y, nx, ny, res); \
188
- break; \
189
- }
190
- HANDLE_VAR(L2);
191
- HANDLE_VAR(L1);
192
- HANDLE_VAR(Linf);
193
- HANDLE_VAR(Canberra);
194
- HANDLE_VAR(BrayCurtis);
195
- HANDLE_VAR(JensenShannon);
196
- HANDLE_VAR(Lp);
197
- HANDLE_VAR(Jaccard);
198
- #undef HANDLE_VAR
199
- default:
200
- FAISS_THROW_MSG("metric type not implemented");
201
- }
180
+ size_t k,
181
+ float* distances,
182
+ int64_t* indexes) {
183
+ Run_knn_extra_metrics run;
184
+ dispatch_VectorDistance(
185
+ d, mt, metric_arg, run, x, y, nx, ny, k, distances, indexes);
202
186
  }
203
187
 
204
- template void knn_extra_metrics<CMax<float, int64_t>>(
205
- const float* x,
206
- const float* y,
207
- size_t d,
208
- size_t nx,
209
- size_t ny,
210
- MetricType mt,
211
- float metric_arg,
212
- HeapArray<CMax<float, int64_t>>* res);
213
-
214
- template void knn_extra_metrics<CMin<float, int64_t>>(
215
- const float* x,
216
- const float* y,
217
- size_t d,
218
- size_t nx,
219
- size_t ny,
220
- MetricType mt,
221
- float metric_arg,
222
- HeapArray<CMin<float, int64_t>>* res);
223
-
224
188
  FlatCodesDistanceComputer* get_extra_distance_computer(
225
189
  size_t d,
226
190
  MetricType mt,
227
191
  float metric_arg,
228
192
  size_t nb,
229
193
  const float* xb) {
230
- switch (mt) {
231
- #define HANDLE_VAR(kw) \
232
- case METRIC_##kw: { \
233
- VectorDistance<METRIC_##kw> vd = {(size_t)d, metric_arg}; \
234
- return new ExtraDistanceComputer<VectorDistance<METRIC_##kw>>( \
235
- vd, xb, nb); \
236
- }
237
- HANDLE_VAR(L2);
238
- HANDLE_VAR(L1);
239
- HANDLE_VAR(Linf);
240
- HANDLE_VAR(Canberra);
241
- HANDLE_VAR(BrayCurtis);
242
- HANDLE_VAR(JensenShannon);
243
- HANDLE_VAR(Lp);
244
- HANDLE_VAR(Jaccard);
245
- #undef HANDLE_VAR
246
- default:
247
- FAISS_THROW_MSG("metric type not implemented");
248
- }
194
+ Run_get_distance_computer run;
195
+ return dispatch_VectorDistance(d, mt, metric_arg, run, xb, nb);
249
196
  }
250
197
 
251
198
  } // 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.
@@ -33,7 +33,6 @@ void pairwise_extra_distances(
33
33
  int64_t ldb = -1,
34
34
  int64_t ldd = -1);
35
35
 
36
- template <class C>
37
36
  void knn_extra_metrics(
38
37
  const float* x,
39
38
  const float* y,
@@ -42,7 +41,9 @@ void knn_extra_metrics(
42
41
  size_t ny,
43
42
  MetricType mt,
44
43
  float metric_arg,
45
- HeapArray<C>* res);
44
+ size_t k,
45
+ float* distances,
46
+ int64_t* indexes);
46
47
 
47
48
  /** get a DistanceComputer that refers to this type of distance and
48
49
  * indexes a flat array of size nb */
@@ -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.
@@ -24,7 +24,6 @@
24
24
  #include <faiss/utils/hamming.h>
25
25
 
26
26
  #include <algorithm>
27
- #include <cmath>
28
27
  #include <cstdio>
29
28
  #include <memory>
30
29
  #include <vector>
@@ -364,7 +363,7 @@ void fvec2bitvec(const float* __restrict x, uint8_t* __restrict b, size_t d) {
364
363
  }
365
364
 
366
365
  /* Same but for n vectors.
367
- Ensure that the ouptut b is byte-aligned (pad with 0s). */
366
+ Ensure that the output b is byte-aligned (pad with 0s). */
368
367
  void fvecs2bitvecs(
369
368
  const float* __restrict x,
370
369
  uint8_t* __restrict b,
@@ -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.