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
@@ -0,0 +1,346 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #include <faiss/utils/NeuralNet.h>
9
+
10
+ #include <algorithm>
11
+ #include <cstddef>
12
+ #include <cstring>
13
+
14
+ #include <faiss/impl/FaissAssert.h>
15
+ #include <faiss/utils/distances.h>
16
+
17
+ /* declare BLAS functions, see http://www.netlib.org/clapack/cblas/ */
18
+
19
+ extern "C" {
20
+
21
+ int sgemm_(
22
+ const char* transa,
23
+ const char* transb,
24
+ FINTEGER* m,
25
+ FINTEGER* n,
26
+ FINTEGER* k,
27
+ const float* alpha,
28
+ const float* a,
29
+ FINTEGER* lda,
30
+ const float* b,
31
+ FINTEGER* ldb,
32
+ float* beta,
33
+ float* c,
34
+ FINTEGER* ldc);
35
+ }
36
+
37
+ namespace faiss {
38
+
39
+ namespace nn {
40
+
41
+ /*************************************************************
42
+ * Tensor2D implementation
43
+ *************************************************************/
44
+
45
+ template <typename T>
46
+ Tensor2DTemplate<T>::Tensor2DTemplate(size_t n0, size_t n1, const T* data_in)
47
+ : shape{n0, n1}, v(n0 * n1) {
48
+ if (data_in) {
49
+ memcpy(data(), data_in, n0 * n1 * sizeof(T));
50
+ }
51
+ }
52
+
53
+ template <typename T>
54
+ Tensor2DTemplate<T>& Tensor2DTemplate<T>::operator+=(
55
+ const Tensor2DTemplate<T>& other) {
56
+ FAISS_THROW_IF_NOT(shape[0] == other.shape[0]);
57
+ FAISS_THROW_IF_NOT(shape[1] == other.shape[1]);
58
+ for (size_t i = 0; i < numel(); i++) {
59
+ v[i] += other.v[i];
60
+ }
61
+ return *this;
62
+ }
63
+
64
+ template <typename T>
65
+ Tensor2DTemplate<T> Tensor2DTemplate<T>::column(size_t j) const {
66
+ size_t n = shape[0], d = shape[1];
67
+ Tensor2DTemplate<T> out(n, 1);
68
+ for (size_t i = 0; i < n; i++) {
69
+ out.v[i] = v[i * d + j];
70
+ }
71
+ return out;
72
+ }
73
+
74
+ // explicit template instanciation
75
+ template struct Tensor2DTemplate<float>;
76
+ template struct Tensor2DTemplate<int32_t>;
77
+
78
+ /*************************************************************
79
+ * Layers implementation
80
+ *************************************************************/
81
+
82
+ Linear::Linear(size_t in_features, size_t out_features, bool bias)
83
+ : in_features(in_features),
84
+ out_features(out_features),
85
+ weight(in_features * out_features) {
86
+ if (bias) {
87
+ this->bias.resize(out_features);
88
+ }
89
+ }
90
+
91
+ Tensor2D Linear::operator()(const Tensor2D& x) const {
92
+ FAISS_THROW_IF_NOT(x.shape[1] == in_features);
93
+ size_t n = x.shape[0];
94
+ Tensor2D output(n, out_features);
95
+
96
+ float one = 1, zero = 0;
97
+ FINTEGER nbiti = out_features, ni = n, di = in_features;
98
+
99
+ sgemm_("Transposed",
100
+ "Not transposed",
101
+ &nbiti,
102
+ &ni,
103
+ &di,
104
+ &one,
105
+ weight.data(),
106
+ &di,
107
+ x.data(),
108
+ &di,
109
+ &zero,
110
+ output.data(),
111
+ &nbiti);
112
+
113
+ if (bias.size() > 0) {
114
+ FAISS_THROW_IF_NOT(bias.size() == out_features);
115
+ for (size_t i = 0; i < n; i++) {
116
+ for (size_t j = 0; j < out_features; j++) {
117
+ output.v[i * out_features + j] += bias[j];
118
+ }
119
+ }
120
+ }
121
+
122
+ return output;
123
+ }
124
+
125
+ Embedding::Embedding(size_t num_embeddings, size_t embedding_dim)
126
+ : num_embeddings(num_embeddings), embedding_dim(embedding_dim) {
127
+ weight.resize(num_embeddings * embedding_dim);
128
+ }
129
+
130
+ Tensor2D Embedding::operator()(const Int32Tensor2D& code) const {
131
+ FAISS_THROW_IF_NOT(code.shape[1] == 1);
132
+ size_t n = code.shape[0];
133
+ Tensor2D output(n, embedding_dim);
134
+ for (size_t i = 0; i < n; ++i) {
135
+ size_t ci = code.v[i];
136
+ FAISS_THROW_IF_NOT(ci < num_embeddings);
137
+ memcpy(output.data() + i * embedding_dim,
138
+ weight.data() + ci * embedding_dim,
139
+ sizeof(float) * embedding_dim);
140
+ }
141
+ return output; // TODO figure out how std::move works
142
+ }
143
+
144
+ namespace {
145
+
146
+ void inplace_relu(Tensor2D& x) {
147
+ for (size_t i = 0; i < x.numel(); i++) {
148
+ x.v[i] = std::max(0.0f, x.v[i]);
149
+ }
150
+ }
151
+
152
+ Tensor2D concatenate_rows(const Tensor2D& x, const Tensor2D& y) {
153
+ size_t n = x.shape[0], d1 = x.shape[1], d2 = y.shape[1];
154
+ FAISS_THROW_IF_NOT(n == y.shape[0]);
155
+ Tensor2D out(n, d1 + d2);
156
+ for (size_t i = 0; i < n; i++) {
157
+ memcpy(out.data() + i * (d1 + d2),
158
+ x.data() + i * d1,
159
+ sizeof(float) * d1);
160
+ memcpy(out.data() + i * (d1 + d2) + d1,
161
+ y.data() + i * d2,
162
+ sizeof(float) * d2);
163
+ }
164
+ return out;
165
+ }
166
+
167
+ } // anonymous namespace
168
+
169
+ Tensor2D FFN::operator()(const Tensor2D& x_in) const {
170
+ Tensor2D x = linear1(x_in);
171
+ inplace_relu(x);
172
+ return linear2(x);
173
+ }
174
+
175
+ } // namespace nn
176
+
177
+ /*************************************************************
178
+ * QINCoStep implementation
179
+ *************************************************************/
180
+
181
+ using namespace nn;
182
+
183
+ QINCoStep::QINCoStep(int d, int K, int L, int h)
184
+ : d(d), K(K), L(L), h(h), codebook(K, d), MLPconcat(2 * d, d) {
185
+ for (int i = 0; i < L; i++) {
186
+ residual_blocks.emplace_back(d, h);
187
+ }
188
+ }
189
+
190
+ nn::Tensor2D QINCoStep::decode(
191
+ const nn::Tensor2D& xhat,
192
+ const nn::Int32Tensor2D& codes) const {
193
+ size_t n = xhat.shape[0];
194
+ FAISS_THROW_IF_NOT(n == codes.shape[0]);
195
+ Tensor2D zqs = codebook(codes);
196
+ Tensor2D cc = concatenate_rows(zqs, xhat);
197
+ zqs += MLPconcat(cc);
198
+ for (int i = 0; i < L; i++) {
199
+ zqs += residual_blocks[i](zqs);
200
+ }
201
+ return zqs;
202
+ }
203
+
204
+ nn::Int32Tensor2D QINCoStep::encode(
205
+ const nn::Tensor2D& xhat,
206
+ const nn::Tensor2D& x,
207
+ nn::Tensor2D* residuals) const {
208
+ size_t n = xhat.shape[0];
209
+ FAISS_THROW_IF_NOT(
210
+ n == x.shape[0] && xhat.shape[1] == d && x.shape[1] == d);
211
+
212
+ // repeated codebook
213
+ Tensor2D zqs_r(n * K, d); // size n, K, d
214
+ Tensor2D cc(n * K, d * 2); // size n, K, d * 2
215
+
216
+ size_t local_d = this->d;
217
+
218
+ auto copy_row =
219
+ [local_d](Tensor2D& t, size_t i, size_t j, const float* data) {
220
+ assert(i <= t.shape[0] && j <= t.shape[1]);
221
+ memcpy(t.data() + i * t.shape[1] + j,
222
+ data,
223
+ sizeof(float) * local_d);
224
+ };
225
+
226
+ // manual broadcasting
227
+ for (size_t i = 0; i < n; i++) {
228
+ for (size_t j = 0; j < K; j++) {
229
+ copy_row(zqs_r, i * K + j, 0, codebook.data() + j * d);
230
+ copy_row(cc, i * K + j, 0, codebook.data() + j * d);
231
+ copy_row(cc, i * K + j, d, xhat.data() + i * d);
232
+ }
233
+ }
234
+
235
+ zqs_r += MLPconcat(cc);
236
+
237
+ // residual blocks
238
+ for (int i = 0; i < L; i++) {
239
+ zqs_r += residual_blocks[i](zqs_r);
240
+ }
241
+
242
+ // add the xhat
243
+ for (size_t i = 0; i < n; i++) {
244
+ float* zqs_r_row = zqs_r.data() + i * K * d;
245
+ const float* xhat_row = xhat.data() + i * d;
246
+ for (size_t l = 0; l < K; l++) {
247
+ for (size_t j = 0; j < d; j++) {
248
+ zqs_r_row[j] += xhat_row[j];
249
+ }
250
+ zqs_r_row += d;
251
+ }
252
+ }
253
+
254
+ // perform assignment, finding the nearest
255
+ nn::Int32Tensor2D codes(n, 1);
256
+ float* res = nullptr;
257
+ if (residuals) {
258
+ FAISS_THROW_IF_NOT(
259
+ residuals->shape[0] == n && residuals->shape[1] == d);
260
+ res = residuals->data();
261
+ }
262
+
263
+ for (size_t i = 0; i < n; i++) {
264
+ const float* q = x.data() + i * d;
265
+ const float* db = zqs_r.data() + i * K * d;
266
+ float dis_min = HUGE_VALF;
267
+ int64_t idx = -1;
268
+ for (size_t j = 0; j < K; j++) {
269
+ float dis = fvec_L2sqr(q, db, d);
270
+ if (dis < dis_min) {
271
+ dis_min = dis;
272
+ idx = j;
273
+ }
274
+ db += d;
275
+ }
276
+ codes.v[i] = idx;
277
+ if (res) {
278
+ const float* xhat_row = xhat.data() + i * d;
279
+ const float* xhat_next_row = zqs_r.data() + (i * K + idx) * d;
280
+ for (size_t j = 0; j < d; j++) {
281
+ res[j] = xhat_next_row[j] - xhat_row[j];
282
+ }
283
+ res += d;
284
+ }
285
+ }
286
+ return codes;
287
+ }
288
+
289
+ /*************************************************************
290
+ * QINCo implementation
291
+ *************************************************************/
292
+
293
+ QINCo::QINCo(int d, int K, int L, int M, int h)
294
+ : NeuralNetCodec(d, M), K(K), L(L), h(h), codebook0(K, d) {
295
+ for (int i = 1; i < M; i++) {
296
+ steps.emplace_back(d, K, L, h);
297
+ }
298
+ }
299
+
300
+ nn::Tensor2D QINCo::decode(const nn::Int32Tensor2D& codes) const {
301
+ FAISS_THROW_IF_NOT(codes.shape[1] == M);
302
+ Tensor2D xhat = codebook0(codes.column(0));
303
+ for (int i = 1; i < M; i++) {
304
+ xhat += steps[i - 1].decode(xhat, codes.column(i));
305
+ }
306
+ return xhat;
307
+ }
308
+
309
+ nn::Int32Tensor2D QINCo::encode(const nn::Tensor2D& x) const {
310
+ FAISS_THROW_IF_NOT(x.shape[1] == d);
311
+ size_t n = x.shape[0];
312
+ Int32Tensor2D codes(n, M);
313
+ Tensor2D xhat(n, d);
314
+ {
315
+ // assign to first codebook as a batch
316
+ std::vector<float> dis(n);
317
+ std::vector<int64_t> codes64(n);
318
+ knn_L2sqr(
319
+ x.data(),
320
+ codebook0.data(),
321
+ d,
322
+ n,
323
+ K,
324
+ 1,
325
+ dis.data(),
326
+ codes64.data());
327
+ for (size_t i = 0; i < n; i++) {
328
+ codes.v[i * M] = codes64[i];
329
+ memcpy(xhat.data() + i * d,
330
+ codebook0.data() + codes64[i] * d,
331
+ sizeof(float) * d);
332
+ }
333
+ }
334
+
335
+ Tensor2D toadd(n, d);
336
+ for (int i = 1; i < M; i++) {
337
+ Int32Tensor2D ci = steps[i - 1].encode(xhat, x, &toadd);
338
+ for (size_t j = 0; j < n; j++) {
339
+ codes.v[j * M + i] = ci.v[j];
340
+ }
341
+ xhat += toadd;
342
+ }
343
+ return codes;
344
+ }
345
+
346
+ } // namespace faiss
@@ -0,0 +1,147 @@
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
+ /** Implements a few neural net layers, mainly to support QINCo */
9
+
10
+ #pragma once
11
+
12
+ #include <cstdint>
13
+ #include <cstdio>
14
+ #include <vector>
15
+
16
+ namespace faiss {
17
+
18
+ // the names are based on the Pytorch names (more or less)
19
+ namespace nn {
20
+
21
+ // container for intermediate steps of the neural net
22
+ template <typename T>
23
+ struct Tensor2DTemplate {
24
+ size_t shape[2];
25
+ std::vector<T> v;
26
+
27
+ Tensor2DTemplate(size_t n0, size_t n1, const T* data = nullptr);
28
+
29
+ Tensor2DTemplate& operator+=(const Tensor2DTemplate&);
30
+
31
+ /// get column #j as a 1-column Tensor2D
32
+ Tensor2DTemplate column(size_t j) const;
33
+
34
+ size_t numel() const {
35
+ return shape[0] * shape[1];
36
+ }
37
+ T* data() {
38
+ return v.data();
39
+ }
40
+ const T* data() const {
41
+ return v.data();
42
+ }
43
+ };
44
+
45
+ using Tensor2D = Tensor2DTemplate<float>;
46
+ using Int32Tensor2D = Tensor2DTemplate<int32_t>;
47
+
48
+ /// minimal translation of nn.Linear
49
+ struct Linear {
50
+ size_t in_features, out_features;
51
+ std::vector<float> weight;
52
+ std::vector<float> bias;
53
+
54
+ Linear(size_t in_features, size_t out_features, bool bias = true);
55
+
56
+ Tensor2D operator()(const Tensor2D& x) const;
57
+ };
58
+
59
+ /// minimal translation of nn.Embedding
60
+ struct Embedding {
61
+ size_t num_embeddings, embedding_dim;
62
+ std::vector<float> weight;
63
+
64
+ Embedding(size_t num_embeddings, size_t embedding_dim);
65
+
66
+ Tensor2D operator()(const Int32Tensor2D&) const;
67
+
68
+ float* data() {
69
+ return weight.data();
70
+ }
71
+
72
+ const float* data() const {
73
+ return weight.data();
74
+ }
75
+ };
76
+
77
+ /// Feed forward layer that expands to a hidden dimension, applies a ReLU non
78
+ /// linearity and maps back to the orignal dimension
79
+ struct FFN {
80
+ Linear linear1, linear2;
81
+
82
+ FFN(int d, int h) : linear1(d, h, false), linear2(h, d, false) {}
83
+
84
+ Tensor2D operator()(const Tensor2D& x) const;
85
+ };
86
+
87
+ } // namespace nn
88
+
89
+ // Translation of the QINCo implementation from
90
+ // https://github.com/facebookresearch/Qinco/blob/main/model_qinco.py
91
+
92
+ struct QINCoStep {
93
+ /// d: input dim, K: codebook size, L: # of residual blocks, h: hidden dim
94
+ int d, K, L, h;
95
+
96
+ QINCoStep(int d, int K, int L, int h);
97
+
98
+ nn::Embedding codebook;
99
+ nn::Linear MLPconcat;
100
+ std::vector<nn::FFN> residual_blocks;
101
+
102
+ nn::FFN& get_residual_block(int i) {
103
+ return residual_blocks[i];
104
+ }
105
+
106
+ /** encode a set of vectors x with intial estimate xhat. Optionally return
107
+ * the delta to be added to xhat to form the new xhat */
108
+ nn::Int32Tensor2D encode(
109
+ const nn::Tensor2D& xhat,
110
+ const nn::Tensor2D& x,
111
+ nn::Tensor2D* residuals = nullptr) const;
112
+
113
+ nn::Tensor2D decode(
114
+ const nn::Tensor2D& xhat,
115
+ const nn::Int32Tensor2D& codes) const;
116
+ };
117
+
118
+ struct NeuralNetCodec {
119
+ int d, M;
120
+
121
+ NeuralNetCodec(int d, int M) : d(d), M(M) {}
122
+
123
+ virtual nn::Tensor2D decode(const nn::Int32Tensor2D& codes) const = 0;
124
+ virtual nn::Int32Tensor2D encode(const nn::Tensor2D& x) const = 0;
125
+
126
+ virtual ~NeuralNetCodec() {}
127
+ };
128
+
129
+ struct QINCo : NeuralNetCodec {
130
+ int K, L, h;
131
+ nn::Embedding codebook0;
132
+ std::vector<QINCoStep> steps;
133
+
134
+ QINCo(int d, int K, int L, int M, int h);
135
+
136
+ QINCoStep& get_step(int i) {
137
+ return steps[i];
138
+ }
139
+
140
+ nn::Tensor2D decode(const nn::Int32Tensor2D& codes) const override;
141
+
142
+ nn::Int32Tensor2D encode(const nn::Tensor2D& x) const override;
143
+
144
+ virtual ~QINCo() {}
145
+ };
146
+
147
+ } // 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.
@@ -0,0 +1,36 @@
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
+
12
+ namespace faiss {
13
+
14
+ namespace {
15
+
16
+ union fp32_bits {
17
+ uint32_t as_u32;
18
+ float as_f32;
19
+ };
20
+
21
+ } // namespace
22
+
23
+ inline uint16_t encode_bf16(const float f) {
24
+ // Round off
25
+ fp32_bits fp;
26
+ fp.as_f32 = f;
27
+ return static_cast<uint16_t>((fp.as_u32 + 0x8000) >> 16);
28
+ }
29
+
30
+ inline float decode_bf16(const uint16_t v) {
31
+ fp32_bits fp;
32
+ fp.as_u32 = (uint32_t(v) << 16);
33
+ return fp.as_f32;
34
+ }
35
+
36
+ } // namespace faiss