faiss 0.5.3 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/ext/faiss/ext.cpp +1 -1
  4. data/ext/faiss/extconf.rb +4 -4
  5. data/ext/faiss/index.cpp +63 -45
  6. data/ext/faiss/index_binary.cpp +37 -27
  7. data/ext/faiss/kmeans.cpp +9 -8
  8. data/ext/faiss/pca_matrix.cpp +9 -7
  9. data/ext/faiss/product_quantizer.cpp +13 -11
  10. data/ext/faiss/utils.cpp +4 -2
  11. data/ext/faiss/utils.h +4 -0
  12. data/lib/faiss/version.rb +1 -1
  13. data/lib/faiss.rb +1 -1
  14. data/vendor/faiss/faiss/AutoTune.cpp +214 -82
  15. data/vendor/faiss/faiss/AutoTune.h +14 -1
  16. data/vendor/faiss/faiss/Clustering.cpp +97 -249
  17. data/vendor/faiss/faiss/Clustering.h +18 -0
  18. data/vendor/faiss/faiss/IVFlib.cpp +67 -44
  19. data/vendor/faiss/faiss/Index.cpp +25 -12
  20. data/vendor/faiss/faiss/Index.h +26 -4
  21. data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
  22. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +68 -61
  23. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
  24. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
  25. data/vendor/faiss/faiss/IndexBinary.cpp +6 -3
  26. data/vendor/faiss/faiss/IndexBinary.h +4 -4
  27. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +1 -1
  28. data/vendor/faiss/faiss/IndexBinaryFlat.h +1 -1
  29. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -4
  30. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +92 -95
  31. data/vendor/faiss/faiss/IndexBinaryHNSW.h +9 -3
  32. data/vendor/faiss/faiss/IndexBinaryHash.cpp +45 -236
  33. data/vendor/faiss/faiss/IndexBinaryHash.h +6 -6
  34. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +120 -414
  35. data/vendor/faiss/faiss/IndexFastScan.cpp +105 -129
  36. data/vendor/faiss/faiss/IndexFastScan.h +35 -24
  37. data/vendor/faiss/faiss/IndexFlat.cpp +216 -152
  38. data/vendor/faiss/faiss/IndexFlat.h +32 -14
  39. data/vendor/faiss/faiss/IndexFlatCodes.cpp +88 -41
  40. data/vendor/faiss/faiss/IndexFlatCodes.h +7 -1
  41. data/vendor/faiss/faiss/IndexHNSW.cpp +299 -187
  42. data/vendor/faiss/faiss/IndexHNSW.h +30 -14
  43. data/vendor/faiss/faiss/IndexIDMap.cpp +26 -22
  44. data/vendor/faiss/faiss/IndexIDMap.h +9 -7
  45. data/vendor/faiss/faiss/IndexIVF.cpp +535 -405
  46. data/vendor/faiss/faiss/IndexIVF.h +47 -16
  47. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +77 -74
  48. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +105 -99
  49. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +6 -3
  50. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +379 -249
  51. data/vendor/faiss/faiss/IndexIVFFastScan.h +65 -60
  52. data/vendor/faiss/faiss/IndexIVFFlat.cpp +41 -124
  53. data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
  54. data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +89 -138
  55. data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
  56. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
  57. data/vendor/faiss/faiss/IndexIVFPQ.cpp +77 -907
  58. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +184 -122
  59. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
  60. data/vendor/faiss/faiss/IndexIVFPQR.cpp +23 -18
  61. data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +59 -60
  62. data/vendor/faiss/faiss/IndexIVFRaBitQ.h +4 -3
  63. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +564 -416
  64. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +269 -111
  65. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
  66. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
  67. data/vendor/faiss/faiss/IndexLSH.cpp +44 -25
  68. data/vendor/faiss/faiss/IndexLattice.cpp +41 -36
  69. data/vendor/faiss/faiss/IndexNNDescent.cpp +37 -21
  70. data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
  71. data/vendor/faiss/faiss/IndexNSG.cpp +40 -23
  72. data/vendor/faiss/faiss/IndexNSG.h +0 -2
  73. data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +32 -12
  74. data/vendor/faiss/faiss/IndexPQ.cpp +129 -213
  75. data/vendor/faiss/faiss/IndexPQ.h +3 -2
  76. data/vendor/faiss/faiss/IndexPQFastScan.cpp +20 -14
  77. data/vendor/faiss/faiss/IndexPQFastScan.h +3 -0
  78. data/vendor/faiss/faiss/IndexPreTransform.cpp +25 -18
  79. data/vendor/faiss/faiss/IndexPreTransform.h +1 -1
  80. data/vendor/faiss/faiss/IndexRaBitQ.cpp +31 -43
  81. data/vendor/faiss/faiss/IndexRaBitQ.h +4 -3
  82. data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +135 -317
  83. data/vendor/faiss/faiss/IndexRaBitQFastScan.h +192 -34
  84. data/vendor/faiss/faiss/IndexRefine.cpp +30 -55
  85. data/vendor/faiss/faiss/IndexRefine.h +4 -4
  86. data/vendor/faiss/faiss/IndexReplicas.cpp +6 -6
  87. data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +15 -14
  88. data/vendor/faiss/faiss/IndexRowwiseMinMax.h +1 -1
  89. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +82 -14
  90. data/vendor/faiss/faiss/IndexShards.cpp +13 -13
  91. data/vendor/faiss/faiss/IndexShardsIVF.cpp +21 -15
  92. data/vendor/faiss/faiss/MatrixStats.cpp +5 -4
  93. data/vendor/faiss/faiss/MetaIndexes.cpp +19 -17
  94. data/vendor/faiss/faiss/MetaIndexes.h +1 -1
  95. data/vendor/faiss/faiss/MetricType.h +29 -6
  96. data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
  97. data/vendor/faiss/faiss/SuperKMeans.h +97 -0
  98. data/vendor/faiss/faiss/VectorTransform.cpp +349 -141
  99. data/vendor/faiss/faiss/VectorTransform.h +39 -16
  100. data/vendor/faiss/faiss/build.cpp +23 -0
  101. data/vendor/faiss/faiss/build.h +15 -0
  102. data/vendor/faiss/faiss/clone_index.cpp +55 -51
  103. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +47 -47
  104. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +11 -0
  105. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +38 -38
  106. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +11 -0
  107. data/vendor/faiss/faiss/{cppcontrib/factory_tools.cpp → factory_tools.cpp} +6 -1
  108. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +1 -1
  109. data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -5
  110. data/vendor/faiss/faiss/gpu/GpuResources.h +1 -1
  111. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +9 -9
  112. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +4 -3
  113. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +46 -0
  114. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +56 -0
  115. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +78 -1
  116. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +72 -0
  117. data/vendor/faiss/faiss/gpu/test/TestUtils.h +23 -0
  118. data/vendor/faiss/faiss/gpu/utils/CuvsFilterConvert.h +1 -1
  119. data/vendor/faiss/faiss/gpu/utils/CuvsUtils.h +21 -10
  120. data/vendor/faiss/faiss/gpu_metal/GpuIndexFlat.h +22 -0
  121. data/vendor/faiss/faiss/gpu_metal/MetalCloner.h +35 -0
  122. data/vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h +40 -0
  123. data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +51 -0
  124. data/vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h +65 -0
  125. data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +66 -0
  126. data/vendor/faiss/faiss/gpu_metal/MetalResources.h +79 -0
  127. data/vendor/faiss/faiss/gpu_metal/StandardMetalResources.h +35 -0
  128. data/vendor/faiss/faiss/impl/AdSampling.cpp +103 -0
  129. data/vendor/faiss/faiss/impl/AdSampling.h +35 -0
  130. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +64 -34
  131. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +1 -0
  132. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +10 -9
  133. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +3 -28
  134. data/vendor/faiss/faiss/impl/ClusteringHelpers.cpp +244 -0
  135. data/vendor/faiss/faiss/impl/ClusteringHelpers.h +94 -0
  136. data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +367 -0
  137. data/vendor/faiss/faiss/impl/ClusteringInitialization.h +107 -0
  138. data/vendor/faiss/faiss/impl/CodePacker.cpp +7 -3
  139. data/vendor/faiss/faiss/impl/CodePacker.h +11 -3
  140. data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +83 -0
  141. data/vendor/faiss/faiss/impl/CodePackerRaBitQ.h +47 -0
  142. data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
  143. data/vendor/faiss/faiss/impl/FaissAssert.h +64 -3
  144. data/vendor/faiss/faiss/impl/FaissException.h +50 -3
  145. data/vendor/faiss/faiss/impl/HNSW.cpp +117 -351
  146. data/vendor/faiss/faiss/impl/HNSW.h +21 -40
  147. data/vendor/faiss/faiss/impl/IDSelector.cpp +15 -11
  148. data/vendor/faiss/faiss/impl/IDSelector.h +8 -8
  149. data/vendor/faiss/faiss/impl/InvertedListScannerStats.h +26 -0
  150. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +114 -102
  151. data/vendor/faiss/faiss/impl/NNDescent.cpp +63 -26
  152. data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
  153. data/vendor/faiss/faiss/impl/NSG.cpp +44 -26
  154. data/vendor/faiss/faiss/impl/NSG.h +20 -10
  155. data/vendor/faiss/faiss/impl/Panorama.cpp +76 -52
  156. data/vendor/faiss/faiss/impl/Panorama.h +265 -78
  157. data/vendor/faiss/faiss/impl/PdxLayout.cpp +93 -0
  158. data/vendor/faiss/faiss/impl/PdxLayout.h +41 -0
  159. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +62 -37
  160. data/vendor/faiss/faiss/impl/PolysemousTraining.h +3 -3
  161. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +35 -35
  162. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +21 -16
  163. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +99 -80
  164. data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
  165. data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +135 -37
  166. data/vendor/faiss/faiss/impl/RaBitQUtils.h +148 -21
  167. data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +298 -301
  168. data/vendor/faiss/faiss/impl/RaBitQuantizer.h +3 -10
  169. data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.cpp +15 -41
  170. data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.h +0 -4
  171. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +40 -32
  172. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
  173. data/vendor/faiss/faiss/impl/ResultHandler.h +218 -113
  174. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +119 -2362
  175. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +27 -3
  176. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
  177. data/vendor/faiss/faiss/impl/VisitedTable.cpp +42 -0
  178. data/vendor/faiss/faiss/impl/VisitedTable.h +76 -0
  179. data/vendor/faiss/faiss/impl/approx_topk/approx_topk.h +276 -0
  180. data/vendor/faiss/faiss/impl/approx_topk/avx2.cpp +68 -0
  181. data/vendor/faiss/faiss/{utils → impl}/approx_topk/generic.h +15 -8
  182. data/vendor/faiss/faiss/impl/approx_topk/neon.cpp +68 -0
  183. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab-inl.h +169 -0
  184. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab.h +117 -0
  185. data/vendor/faiss/faiss/impl/approx_topk/simdlib256-inl.h +146 -0
  186. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h +73 -0
  187. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHash_impl.h +270 -0
  188. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +460 -0
  189. data/vendor/faiss/faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h +159 -0
  190. data/vendor/faiss/faiss/impl/binary_hamming/IndexPQ_impl.h +92 -0
  191. data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +26 -0
  192. data/vendor/faiss/faiss/impl/binary_hamming/avx512.cpp +26 -0
  193. data/vendor/faiss/faiss/impl/binary_hamming/dispatch.h +143 -0
  194. data/vendor/faiss/faiss/impl/binary_hamming/neon.cpp +26 -0
  195. data/vendor/faiss/faiss/impl/binary_hamming/rvv.cpp +26 -0
  196. data/vendor/faiss/faiss/impl/expanded_scanners.h +163 -0
  197. data/vendor/faiss/faiss/impl/{FastScanDistancePostProcessing.h → fast_scan/FastScanDistancePostProcessing.h} +13 -6
  198. data/vendor/faiss/faiss/impl/{LookupTableScaler.h → fast_scan/LookupTableScaler.h} +16 -5
  199. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops.h +237 -0
  200. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops_512.h +185 -0
  201. data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +229 -0
  202. data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +268 -0
  203. data/vendor/faiss/faiss/impl/{pq4_fast_scan.cpp → fast_scan/fast_scan.cpp} +176 -4
  204. data/vendor/faiss/faiss/impl/fast_scan/fast_scan.h +341 -0
  205. data/vendor/faiss/faiss/impl/fast_scan/impl-avx2.cpp +36 -0
  206. data/vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp +40 -0
  207. data/vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp +120 -0
  208. data/vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp +104 -0
  209. data/vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h +213 -0
  210. data/vendor/faiss/faiss/impl/{pq4_fast_scan_search_qbs.cpp → fast_scan/kernels_simd512.h} +26 -348
  211. data/vendor/faiss/faiss/impl/fast_scan/rabitq_dispatching.h +90 -0
  212. data/vendor/faiss/faiss/impl/fast_scan/rabitq_result_handler.h +108 -0
  213. data/vendor/faiss/faiss/impl/{simd_result_handlers.h → fast_scan/simd_result_handlers.h} +290 -142
  214. data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +54 -0
  215. data/vendor/faiss/faiss/impl/hnsw/LockVector.h +64 -0
  216. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +91 -0
  217. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +64 -0
  218. data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +104 -0
  219. data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +111 -0
  220. data/vendor/faiss/faiss/impl/index_read.cpp +1950 -505
  221. data/vendor/faiss/faiss/impl/index_read_utils.h +1 -2
  222. data/vendor/faiss/faiss/impl/index_write.cpp +112 -21
  223. data/vendor/faiss/faiss/impl/io.cpp +6 -6
  224. data/vendor/faiss/faiss/impl/io_macros.h +33 -16
  225. data/vendor/faiss/faiss/impl/kmeans1d.cpp +10 -10
  226. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +81 -40
  227. data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
  228. data/vendor/faiss/faiss/impl/mapped_io.cpp +15 -8
  229. data/vendor/faiss/faiss/impl/platform_macros.h +11 -4
  230. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +549 -0
  231. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +245 -0
  232. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h +105 -0
  233. data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +106 -0
  234. data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +21 -0
  235. data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +21 -0
  236. data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +21 -0
  237. data/vendor/faiss/faiss/impl/{code_distance/code_distance-avx2.h → pq_code_distance/pq_code_distance-avx2.h} +43 -220
  238. data/vendor/faiss/faiss/impl/{code_distance/code_distance-avx512.h → pq_code_distance/pq_code_distance-avx512.h} +25 -112
  239. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +59 -0
  240. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h +96 -0
  241. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +256 -0
  242. data/vendor/faiss/faiss/impl/{code_distance/code_distance-sve.h → pq_code_distance/pq_code_distance-sve.cpp} +57 -146
  243. data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +68 -0
  244. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +320 -483
  245. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
  246. data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +121 -0
  247. data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +137 -0
  248. data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +371 -0
  249. data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +190 -0
  250. data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +94 -0
  251. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +603 -0
  252. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +597 -0
  253. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +388 -0
  254. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +630 -0
  255. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +311 -0
  256. data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +387 -0
  257. data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +54 -0
  258. data/vendor/faiss/faiss/impl/simd_dispatch.h +173 -0
  259. data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
  260. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +274 -171
  261. data/vendor/faiss/faiss/impl/simdlib/simdlib_avx512.h +414 -0
  262. data/vendor/faiss/faiss/impl/simdlib/simdlib_dispatch.h +44 -0
  263. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_emulated.h +231 -166
  264. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_neon.h +275 -217
  265. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_ppc64.h +201 -160
  266. data/vendor/faiss/faiss/impl/svs_io.cpp +12 -3
  267. data/vendor/faiss/faiss/impl/svs_io.h +8 -2
  268. data/vendor/faiss/faiss/index_factory.cpp +115 -28
  269. data/vendor/faiss/faiss/index_io.h +53 -3
  270. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +73 -20
  271. data/vendor/faiss/faiss/invlists/DirectMap.cpp +24 -14
  272. data/vendor/faiss/faiss/invlists/DirectMap.h +4 -3
  273. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +157 -73
  274. data/vendor/faiss/faiss/invlists/InvertedLists.h +86 -23
  275. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +4 -4
  276. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +14 -14
  277. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
  278. data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +9 -19
  279. data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
  280. data/vendor/faiss/faiss/svs/IndexSVSFlat.h +2 -0
  281. data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +350 -0
  282. data/vendor/faiss/faiss/svs/IndexSVSIVF.h +128 -0
  283. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.cpp +40 -0
  284. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.h +43 -0
  285. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +225 -0
  286. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.h +71 -0
  287. data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +25 -1
  288. data/vendor/faiss/faiss/svs/IndexSVSVamana.h +19 -2
  289. data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +1 -1
  290. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +19 -2
  291. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +14 -0
  292. data/vendor/faiss/faiss/utils/Heap.cpp +56 -10
  293. data/vendor/faiss/faiss/utils/Heap.h +21 -0
  294. data/vendor/faiss/faiss/utils/NeuralNet.cpp +54 -40
  295. data/vendor/faiss/faiss/utils/NeuralNet.h +1 -1
  296. data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +10 -4
  297. data/vendor/faiss/faiss/utils/distances.cpp +507 -559
  298. data/vendor/faiss/faiss/utils/distances.h +118 -1
  299. data/vendor/faiss/faiss/utils/distances_dispatch.h +250 -0
  300. data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +8 -7
  301. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +33 -14
  302. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +12 -1
  303. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +16 -293
  304. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp +57 -0
  305. data/vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h +290 -0
  306. data/vendor/faiss/faiss/utils/distances_simd.cpp +72 -3681
  307. data/vendor/faiss/faiss/utils/extra_distances.cpp +60 -102
  308. data/vendor/faiss/faiss/utils/extra_distances.h +79 -7
  309. data/vendor/faiss/faiss/utils/hamming-inl.h +13 -11
  310. data/vendor/faiss/faiss/utils/hamming.cpp +66 -517
  311. data/vendor/faiss/faiss/utils/hamming.h +92 -2
  312. data/vendor/faiss/faiss/utils/hamming_distance/common.h +287 -10
  313. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +15 -0
  314. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +15 -0
  315. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h +142 -0
  316. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +234 -0
  317. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-generic.h +368 -0
  318. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h +322 -0
  319. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-rvv.h +39 -0
  320. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer.h +146 -0
  321. data/vendor/faiss/faiss/utils/hamming_distance/hamming_impl.h +481 -0
  322. data/vendor/faiss/faiss/utils/hamming_distance/hamming_neon.cpp +15 -0
  323. data/vendor/faiss/faiss/utils/hamming_distance/hamming_rvv.cpp +15 -0
  324. data/vendor/faiss/faiss/utils/partitioning.cpp +66 -987
  325. data/vendor/faiss/faiss/utils/partitioning.h +31 -0
  326. data/vendor/faiss/faiss/utils/popcount.h +29 -0
  327. data/vendor/faiss/faiss/utils/pq_code_distance.h +251 -0
  328. data/vendor/faiss/faiss/utils/prefetch.h +2 -2
  329. data/vendor/faiss/faiss/utils/quantize_lut.cpp +30 -30
  330. data/vendor/faiss/faiss/utils/quantize_lut.h +1 -1
  331. data/vendor/faiss/faiss/utils/rabitq_simd.h +124 -343
  332. data/vendor/faiss/faiss/utils/random.cpp +6 -6
  333. data/vendor/faiss/faiss/utils/simd_impl/IVFFlatScanner-inl.h +51 -0
  334. data/vendor/faiss/faiss/utils/simd_impl/distances_aarch64.cpp +154 -0
  335. data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +777 -0
  336. data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +306 -0
  337. data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +1431 -0
  338. data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +1095 -0
  339. data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +189 -0
  340. data/vendor/faiss/faiss/utils/simd_impl/distances_simdlib256.h +195 -0
  341. data/vendor/faiss/faiss/utils/simd_impl/distances_sse-inl.h +392 -0
  342. data/vendor/faiss/faiss/utils/{distances_fused/simdlib_based.h → simd_impl/exhaustive_L2sqr_blas_cmax.h} +5 -10
  343. data/vendor/faiss/faiss/utils/simd_impl/hamming_impl.h +481 -0
  344. data/vendor/faiss/faiss/utils/simd_impl/partitioning_avx2.cpp +14 -0
  345. data/vendor/faiss/faiss/utils/simd_impl/partitioning_neon.cpp +14 -0
  346. data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +1085 -0
  347. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +355 -0
  348. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +477 -0
  349. data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +55 -0
  350. data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +55 -0
  351. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h +32 -0
  352. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels.h +43 -0
  353. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp +57 -0
  354. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp +45 -0
  355. data/vendor/faiss/faiss/utils/simd_levels.cpp +334 -0
  356. data/vendor/faiss/faiss/utils/simd_levels.h +183 -0
  357. data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
  358. data/vendor/faiss/faiss/utils/utils.cpp +21 -14
  359. data/vendor/faiss/faiss/utils/utils.h +3 -3
  360. metadata +156 -42
  361. data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
  362. data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
  363. data/vendor/faiss/faiss/impl/code_distance/code_distance-generic.h +0 -81
  364. data/vendor/faiss/faiss/impl/code_distance/code_distance.h +0 -186
  365. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -216
  366. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -224
  367. data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +0 -84
  368. data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +0 -196
  369. data/vendor/faiss/faiss/utils/approx_topk/mode.h +0 -34
  370. data/vendor/faiss/faiss/utils/distances_fused/avx512.h +0 -36
  371. data/vendor/faiss/faiss/utils/extra_distances-inl.h +0 -228
  372. data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +0 -462
  373. data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +0 -490
  374. data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +0 -450
  375. data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +0 -87
  376. data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +0 -524
  377. data/vendor/faiss/faiss/utils/simdlib.h +0 -42
  378. data/vendor/faiss/faiss/utils/simdlib_avx512.h +0 -296
  379. /data/vendor/faiss/faiss/{cppcontrib/factory_tools.h → factory_tools.h} +0 -0
@@ -26,8 +26,8 @@ struct VectorTransform {
26
26
  int d_in; ///! input dimension
27
27
  int d_out; ///! output dimension
28
28
 
29
- explicit VectorTransform(int d_in = 0, int d_out = 0)
30
- : d_in(d_in), d_out(d_out), is_trained(true) {}
29
+ explicit VectorTransform(int d_in_val = 0, int d_out_val = 0)
30
+ : d_in(d_in_val), d_out(d_out_val), is_trained(true) {}
31
31
 
32
32
  /// set if the VectorTransform does not require training, or if
33
33
  /// training is done already
@@ -82,9 +82,9 @@ struct LinearTransform : VectorTransform {
82
82
 
83
83
  /// both d_in > d_out and d_out < d_in are supported
84
84
  explicit LinearTransform(
85
- int d_in = 0,
86
- int d_out = 0,
87
- bool have_bias = false);
85
+ int din = 0,
86
+ int dout = 0,
87
+ bool have_bias_in = false);
88
88
 
89
89
  /// same as apply, but result is pre-allocated
90
90
  void apply_noalloc(idx_t n, const float* x, float* xt) const override;
@@ -114,8 +114,8 @@ struct LinearTransform : VectorTransform {
114
114
  /// Randomly rotate a set of vectors
115
115
  struct RandomRotationMatrix : LinearTransform {
116
116
  /// both d_in > d_out and d_out < d_in are supported
117
- RandomRotationMatrix(int d_in, int d_out)
118
- : LinearTransform(d_in, d_out, false) {}
117
+ RandomRotationMatrix(int d_in_val, int d_out_val)
118
+ : LinearTransform(d_in_val, d_out_val, false) {}
119
119
 
120
120
  /// must be called before the transform is used
121
121
  void init(int seed);
@@ -126,6 +126,29 @@ struct RandomRotationMatrix : LinearTransform {
126
126
  RandomRotationMatrix() {}
127
127
  };
128
128
 
129
+ /** Three rounds of random sign-flip + Fast Walsh-Hadamard Transform.
130
+ * Produces a pseudo-random rotation in O(d log d) time.
131
+ * d_out is the smallest power of 2 >= d_in (zero-padded as needed).
132
+ */
133
+ struct HadamardRotation : VectorTransform {
134
+ uint32_t seed{};
135
+
136
+ /// Sign-flip vectors, each of size d_out, generated from seed.
137
+ std::vector<float> signs1, signs2, signs3;
138
+
139
+ explicit HadamardRotation(int d, uint32_t seed = 12345);
140
+
141
+ void init(uint32_t seed_in);
142
+
143
+ void train(idx_t n, const float* x) override;
144
+
145
+ void apply_noalloc(idx_t n, const float* x, float* xt) const override;
146
+
147
+ void check_identical(const VectorTransform& other) const override;
148
+
149
+ HadamardRotation() {}
150
+ };
151
+
129
152
  /** Applies a principal component analysis on a set of vectors,
130
153
  * with optionally whitening and random rotation. */
131
154
  struct PCAMatrix : LinearTransform {
@@ -160,10 +183,10 @@ struct PCAMatrix : LinearTransform {
160
183
 
161
184
  // the final matrix is computed after random rotation and/or whitening
162
185
  explicit PCAMatrix(
163
- int d_in = 0,
164
- int d_out = 0,
165
- float eigen_power = 0,
166
- bool random_rotation = false);
186
+ int din = 0,
187
+ int dout = 0,
188
+ float eigen_power_in = 0,
189
+ bool random_rotation_in = false);
167
190
 
168
191
  /// train on n vectors. If n < d_in then the eigenvector matrix
169
192
  /// will be completed with 0s
@@ -210,7 +233,7 @@ struct ITQTransform : VectorTransform {
210
233
  // concatenation of PCA + ITQ transformation
211
234
  LinearTransform pca_then_itq;
212
235
 
213
- explicit ITQTransform(int d_in = 0, int d_out = 0, bool do_pca = false);
236
+ explicit ITQTransform(int din = 0, int dout = 0, bool do_pca_in = false);
214
237
 
215
238
  void train(idx_t n, const float* x) override;
216
239
 
@@ -244,7 +267,7 @@ struct OPQMatrix : LinearTransform {
244
267
  ProductQuantizer* pq = nullptr;
245
268
 
246
269
  /// if d2 != -1, output vectors of this dimension
247
- explicit OPQMatrix(int d = 0, int M = 1, int d2 = -1);
270
+ explicit OPQMatrix(int d = 0, int M_in = 1, int d2 = -1);
248
271
 
249
272
  void train(idx_t n, const float* x) override;
250
273
  };
@@ -257,12 +280,12 @@ struct RemapDimensionsTransform : VectorTransform {
257
280
  /// -1 -> set output to 0
258
281
  std::vector<int> map;
259
282
 
260
- RemapDimensionsTransform(int d_in, int d_out, const int* map);
283
+ RemapDimensionsTransform(int din, int dout, const int* map);
261
284
 
262
285
  /// remap input to output, skipping or inserting dimensions as needed
263
286
  /// if uniform: distribute dimensions uniformly
264
287
  /// otherwise just take the d_out first ones.
265
- RemapDimensionsTransform(int d_in, int d_out, bool uniform = true);
288
+ RemapDimensionsTransform(int din, int dout, bool uniform = true);
266
289
 
267
290
  void apply_noalloc(idx_t n, const float* x, float* xt) const override;
268
291
 
@@ -278,7 +301,7 @@ struct RemapDimensionsTransform : VectorTransform {
278
301
  struct NormalizationTransform : VectorTransform {
279
302
  float norm;
280
303
 
281
- explicit NormalizationTransform(int d, float norm = 2.0);
304
+ explicit NormalizationTransform(int d, float norm_in = 2.0);
282
305
  NormalizationTransform();
283
306
 
284
307
  void apply_noalloc(idx_t n, const float* x, float* xt) const override;
@@ -0,0 +1,23 @@
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/build.h"
9
+
10
+ namespace faiss {
11
+
12
+ bool has_omp() {
13
+ int omp_available = 1;
14
+ // Detect whether OpenMP is enabled by using the 'max' reduction to render
15
+ // the below assignment a no-op. This works:
16
+ // 1) without starting any threads
17
+ // 2) irrespective of the current thread limit
18
+ #pragma omp parallel reduction(max : omp_available) num_threads(1)
19
+ omp_available = 0;
20
+ return omp_available != 0;
21
+ }
22
+
23
+ } // namespace faiss
@@ -0,0 +1,15 @@
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
+ namespace faiss {
11
+
12
+ // Returns true iff `faiss` was compiled with non-mocked OpenMP support.
13
+ bool has_omp();
14
+
15
+ } // namespace faiss
@@ -27,6 +27,8 @@
27
27
  #include <faiss/IndexIVFPQ.h>
28
28
  #include <faiss/IndexIVFPQFastScan.h>
29
29
  #include <faiss/IndexIVFPQR.h>
30
+ #include <faiss/IndexIVFRaBitQ.h>
31
+ #include <faiss/IndexIVFRaBitQFastScan.h>
30
32
  #include <faiss/IndexIVFSpectralHash.h>
31
33
  #include <faiss/IndexLSH.h>
32
34
  #include <faiss/IndexLattice.h>
@@ -41,11 +43,11 @@
41
43
  #include <faiss/MetaIndexes.h>
42
44
  #include <faiss/VectorTransform.h>
43
45
 
46
+ #include <faiss/impl/CodePacker.h>
44
47
  #include <faiss/impl/LocalSearchQuantizer.h>
45
48
  #include <faiss/impl/ProductQuantizer.h>
46
49
  #include <faiss/impl/ResidualQuantizer.h>
47
50
  #include <faiss/impl/ScalarQuantizer.h>
48
- #include <faiss/impl/pq4_fast_scan.h>
49
51
 
50
52
  #include <faiss/invlists/BlockInvertedLists.h>
51
53
 
@@ -96,9 +98,12 @@ IndexIVF* Cloner::clone_IndexIVF(const IndexIVF* ivf) {
96
98
  TRYCLONE(IndexIVFResidualQuantizerFastScan, ivf)
97
99
  TRYCLONE(IndexIVFPQFastScan, ivf)
98
100
 
101
+ TRYCLONE(IndexIVFRaBitQFastScan, ivf)
102
+ TRYCLONE(IndexIVFRaBitQ, ivf)
103
+
99
104
  TRYCLONE(IndexIVFFlatDedup, ivf)
100
- TRYCLONE(IndexIVFFlat, ivf)
101
105
  TRYCLONE(IndexIVFFlatPanorama, ivf)
106
+ TRYCLONE(IndexIVFFlat, ivf)
102
107
 
103
108
  TRYCLONE(IndexIVFSpectralHash, ivf)
104
109
 
@@ -168,7 +173,7 @@ IndexRowwiseMinMaxBase* clone_IndexRowwiseMinMax(
168
173
  }
169
174
  }
170
175
 
171
- #define TRYCAST(classname) classname* res = dynamic_cast<classname*>(index)
176
+ #define TRYCAST(classname, var) auto* var = dynamic_cast<classname*>(index)
172
177
 
173
178
  void reset_AdditiveQuantizerIndex(Index* index) {
174
179
  auto clone_ProductQuantizers =
@@ -177,50 +182,50 @@ void reset_AdditiveQuantizerIndex(Index* index) {
177
182
  q = dynamic_cast<AdditiveQuantizer*>(clone_Quantizer(q));
178
183
  }
179
184
  };
180
- if (TRYCAST(IndexIVFLocalSearchQuantizerFastScan)) {
181
- res->aq = &res->lsq;
182
- } else if (TRYCAST(IndexIVFResidualQuantizerFastScan)) {
183
- res->aq = &res->rq;
184
- } else if (TRYCAST(IndexIVFProductLocalSearchQuantizerFastScan)) {
185
- res->aq = &res->plsq;
186
- clone_ProductQuantizers(res->plsq.quantizers);
187
- } else if (TRYCAST(IndexIVFProductResidualQuantizerFastScan)) {
188
- res->aq = &res->prq;
189
- clone_ProductQuantizers(res->prq.quantizers);
190
- } else if (TRYCAST(IndexIVFLocalSearchQuantizer)) {
191
- res->aq = &res->lsq;
192
- } else if (TRYCAST(IndexIVFResidualQuantizer)) {
193
- res->aq = &res->rq;
194
- } else if (TRYCAST(IndexIVFProductLocalSearchQuantizer)) {
195
- res->aq = &res->plsq;
196
- clone_ProductQuantizers(res->plsq.quantizers);
197
- } else if (TRYCAST(IndexIVFProductResidualQuantizer)) {
198
- res->aq = &res->prq;
199
- clone_ProductQuantizers(res->prq.quantizers);
200
- } else if (TRYCAST(IndexLocalSearchQuantizerFastScan)) {
201
- res->aq = &res->lsq;
202
- } else if (TRYCAST(IndexResidualQuantizerFastScan)) {
203
- res->aq = &res->rq;
204
- } else if (TRYCAST(IndexProductLocalSearchQuantizerFastScan)) {
205
- res->aq = &res->plsq;
206
- clone_ProductQuantizers(res->plsq.quantizers);
207
- } else if (TRYCAST(IndexProductResidualQuantizerFastScan)) {
208
- res->aq = &res->prq;
209
- clone_ProductQuantizers(res->prq.quantizers);
210
- } else if (TRYCAST(IndexLocalSearchQuantizer)) {
211
- res->aq = &res->lsq;
212
- } else if (TRYCAST(IndexResidualQuantizer)) {
213
- res->aq = &res->rq;
214
- } else if (TRYCAST(IndexProductLocalSearchQuantizer)) {
215
- res->aq = &res->plsq;
216
- clone_ProductQuantizers(res->plsq.quantizers);
217
- } else if (TRYCAST(IndexProductResidualQuantizer)) {
218
- res->aq = &res->prq;
219
- clone_ProductQuantizers(res->prq.quantizers);
220
- } else if (TRYCAST(LocalSearchCoarseQuantizer)) {
221
- res->aq = &res->lsq;
222
- } else if (TRYCAST(ResidualCoarseQuantizer)) {
223
- res->aq = &res->rq;
185
+ if (TRYCAST(IndexIVFLocalSearchQuantizerFastScan, r1)) {
186
+ r1->aq = &r1->lsq;
187
+ } else if (TRYCAST(IndexIVFResidualQuantizerFastScan, r2)) {
188
+ r2->aq = &r2->rq;
189
+ } else if (TRYCAST(IndexIVFProductLocalSearchQuantizerFastScan, r3)) {
190
+ r3->aq = &r3->plsq;
191
+ clone_ProductQuantizers(r3->plsq.quantizers);
192
+ } else if (TRYCAST(IndexIVFProductResidualQuantizerFastScan, r4)) {
193
+ r4->aq = &r4->prq;
194
+ clone_ProductQuantizers(r4->prq.quantizers);
195
+ } else if (TRYCAST(IndexIVFLocalSearchQuantizer, r5)) {
196
+ r5->aq = &r5->lsq;
197
+ } else if (TRYCAST(IndexIVFResidualQuantizer, r6)) {
198
+ r6->aq = &r6->rq;
199
+ } else if (TRYCAST(IndexIVFProductLocalSearchQuantizer, r7)) {
200
+ r7->aq = &r7->plsq;
201
+ clone_ProductQuantizers(r7->plsq.quantizers);
202
+ } else if (TRYCAST(IndexIVFProductResidualQuantizer, r8)) {
203
+ r8->aq = &r8->prq;
204
+ clone_ProductQuantizers(r8->prq.quantizers);
205
+ } else if (TRYCAST(IndexLocalSearchQuantizerFastScan, r9)) {
206
+ r9->aq = &r9->lsq;
207
+ } else if (TRYCAST(IndexResidualQuantizerFastScan, r10)) {
208
+ r10->aq = &r10->rq;
209
+ } else if (TRYCAST(IndexProductLocalSearchQuantizerFastScan, r11)) {
210
+ r11->aq = &r11->plsq;
211
+ clone_ProductQuantizers(r11->plsq.quantizers);
212
+ } else if (TRYCAST(IndexProductResidualQuantizerFastScan, r12)) {
213
+ r12->aq = &r12->prq;
214
+ clone_ProductQuantizers(r12->prq.quantizers);
215
+ } else if (TRYCAST(IndexLocalSearchQuantizer, r13)) {
216
+ r13->aq = &r13->lsq;
217
+ } else if (TRYCAST(IndexResidualQuantizer, r14)) {
218
+ r14->aq = &r14->rq;
219
+ } else if (TRYCAST(IndexProductLocalSearchQuantizer, r15)) {
220
+ r15->aq = &r15->plsq;
221
+ clone_ProductQuantizers(r15->plsq.quantizers);
222
+ } else if (TRYCAST(IndexProductResidualQuantizer, r16)) {
223
+ r16->aq = &r16->prq;
224
+ clone_ProductQuantizers(r16->prq.quantizers);
225
+ } else if (TRYCAST(LocalSearchCoarseQuantizer, r17)) {
226
+ r17->aq = &r17->lsq;
227
+ } else if (TRYCAST(ResidualCoarseQuantizer, r18)) {
228
+ r18->aq = &r18->rq;
224
229
  } else {
225
230
  FAISS_THROW_MSG(
226
231
  "clone not supported for this type of additive quantizer index");
@@ -257,9 +262,7 @@ InvertedLists* clone_InvertedLists(const InvertedLists* invlists) {
257
262
  if (auto* bils = dynamic_cast<const BlockInvertedLists*>(invlists)) {
258
263
  auto* bils2 = new BlockInvertedLists(*bils);
259
264
  if (bils->packer) {
260
- auto* packerPQ4 = dynamic_cast<const CodePackerPQ4*>(bils->packer);
261
- FAISS_THROW_IF_NOT(packerPQ4);
262
- bils2->packer = new CodePackerPQ4(*packerPQ4);
265
+ bils2->packer = bils->packer->clone();
263
266
  }
264
267
  return bils2;
265
268
  }
@@ -316,7 +319,7 @@ Index* Cloner::clone_Index(const Index* index) {
316
319
  res->metric_arg = ipt->metric_arg;
317
320
 
318
321
  res->index = clone_Index(ipt->index);
319
- for (int i = 0; i < ipt->chain.size(); i++) {
322
+ for (size_t i = 0; i < ipt->chain.size(); i++) {
320
323
  res->chain.push_back(clone_VectorTransform(ipt->chain[i]));
321
324
  }
322
325
  res->own_fields = true;
@@ -374,6 +377,7 @@ Index* Cloner::clone_Index(const Index* index) {
374
377
  IndexRowwiseMinMaxBase* res = clone_IndexRowwiseMinMax(irmmb);
375
378
  res->own_fields = true;
376
379
  res->index = clone_Index(irmmb->index);
380
+ return res;
377
381
  } else if (
378
382
  dynamic_cast<const IndexAdditiveQuantizerFastScan*>(index) ||
379
383
  dynamic_cast<const IndexAdditiveQuantizer*>(index) ||
@@ -1785,72 +1785,72 @@ struct Index2LevelDecoderImpl<
1785
1785
 
1786
1786
  // process 1 sample
1787
1787
  static void store(
1788
- const float* const __restrict pqCoarseCentroids0,
1789
- const float* const __restrict pqFineCentroids0,
1790
- const uint8_t* const __restrict code0,
1791
- float* const __restrict outputStore) {}
1788
+ const float* const __restrict /*pqCoarseCentroids0*/,
1789
+ const float* const __restrict /*pqFineCentroids0*/,
1790
+ const uint8_t* const __restrict /*code0*/,
1791
+ float* const __restrict /*outputStore*/) {}
1792
1792
 
1793
1793
  // process 1 sample
1794
1794
  static void accum(
1795
- const float* const __restrict pqCoarseCentroids0,
1796
- const float* const __restrict pqFineCentroids0,
1797
- const uint8_t* const __restrict code0,
1798
- const float weight0,
1799
- float* const __restrict outputAccum) {}
1795
+ const float* const __restrict /*pqCoarseCentroids0*/,
1796
+ const float* const __restrict /*pqFineCentroids0*/,
1797
+ const uint8_t* const __restrict /*code0*/,
1798
+ const float /*weight0*/,
1799
+ float* const __restrict /*outputAccum*/) {}
1800
1800
 
1801
1801
  // Process 2 samples.
1802
1802
  // Each code uses its own coarse pq centroids table and fine pq centroids table.
1803
1803
  static void accum(
1804
- const float* const __restrict pqCoarseCentroids0,
1805
- const float* const __restrict pqFineCentroids0,
1806
- const uint8_t* const __restrict code0,
1807
- const float weight0,
1808
- const float* const __restrict pqCoarseCentroids1,
1809
- const float* const __restrict pqFineCentroids1,
1810
- const uint8_t* const __restrict code1,
1811
- const float weight1,
1812
- float* const __restrict outputAccum) {}
1804
+ const float* const __restrict /*pqCoarseCentroids0*/,
1805
+ const float* const __restrict /*pqFineCentroids0*/,
1806
+ const uint8_t* const __restrict /*code0*/,
1807
+ const float /*weight0*/,
1808
+ const float* const __restrict /*pqCoarseCentroids1*/,
1809
+ const float* const __restrict /*pqFineCentroids1*/,
1810
+ const uint8_t* const __restrict /*code1*/,
1811
+ const float /*weight1*/,
1812
+ float* const __restrict /*outputAccum*/) {}
1813
1813
 
1814
1814
  // Process 2 samples.
1815
1815
  // Coarse pq centroids table and fine pq centroids table are shared among codes.
1816
1816
  static void accum(
1817
- const float* const __restrict pqCoarseCentroids,
1818
- const float* const __restrict pqFineCentroids,
1819
- const uint8_t* const __restrict code0,
1820
- const float weight0,
1821
- const uint8_t* const __restrict code1,
1822
- const float weight1,
1823
- float* const __restrict outputAccum) {}
1817
+ const float* const __restrict /*pqCoarseCentroids*/,
1818
+ const float* const __restrict /*pqFineCentroids*/,
1819
+ const uint8_t* const __restrict /*code0*/,
1820
+ const float /*weight0*/,
1821
+ const uint8_t* const __restrict /*code1*/,
1822
+ const float /*weight1*/,
1823
+ float* const __restrict /*outputAccum*/) {}
1824
1824
 
1825
1825
  // Process 3 samples.
1826
1826
  // Each code uses its own coarse pq centroids table and fine pq centroids table.
1827
1827
  static void accum(
1828
- const float* const __restrict pqCoarseCentroids0,
1829
- const float* const __restrict pqFineCentroids0,
1830
- const uint8_t* const __restrict code0,
1831
- const float weight0,
1832
- const float* const __restrict pqCoarseCentroids1,
1833
- const float* const __restrict pqFineCentroids1,
1834
- const uint8_t* const __restrict code1,
1835
- const float weight1,
1836
- const float* const __restrict pqCoarseCentroids2,
1837
- const float* const __restrict pqFineCentroids2,
1838
- const uint8_t* const __restrict code2,
1839
- const float weight2,
1840
- float* const __restrict outputAccum) {}
1828
+ const float* const __restrict /*pqCoarseCentroids0*/,
1829
+ const float* const __restrict /*pqFineCentroids0*/,
1830
+ const uint8_t* const __restrict /*code0*/,
1831
+ const float /*weight0*/,
1832
+ const float* const __restrict /*pqCoarseCentroids1*/,
1833
+ const float* const __restrict /*pqFineCentroids1*/,
1834
+ const uint8_t* const __restrict /*code1*/,
1835
+ const float /*weight1*/,
1836
+ const float* const __restrict /*pqCoarseCentroids2*/,
1837
+ const float* const __restrict /*pqFineCentroids2*/,
1838
+ const uint8_t* const __restrict /*code2*/,
1839
+ const float /*weight2*/,
1840
+ float* const __restrict /*outputAccum*/) {}
1841
1841
 
1842
1842
  // Process 3 samples.
1843
1843
  // Coarse pq centroids table and fine pq centroids table are shared among codes.
1844
1844
  static void accum(
1845
- const float* const __restrict pqCoarseCentroids,
1846
- const float* const __restrict pqFineCentroids,
1847
- const uint8_t* const __restrict code0,
1848
- const float weight0,
1849
- const uint8_t* const __restrict code1,
1850
- const float weight1,
1851
- const uint8_t* const __restrict code2,
1852
- const float weight2,
1853
- float* const __restrict outputAccum) {}
1845
+ const float* const __restrict /*pqCoarseCentroids*/,
1846
+ const float* const __restrict /*pqFineCentroids*/,
1847
+ const uint8_t* const __restrict /*code0*/,
1848
+ const float /*weight0*/,
1849
+ const uint8_t* const __restrict /*code1*/,
1850
+ const float /*weight1*/,
1851
+ const uint8_t* const __restrict /*code2*/,
1852
+ const float /*weight2*/,
1853
+ float* const __restrict /*outputAccum*/) {}
1854
1854
 
1855
1855
  // clang-format on
1856
1856
  };
@@ -8,6 +8,12 @@
8
8
  #ifndef LEVEL2_INL_H
9
9
  #define LEVEL2_INL_H
10
10
 
11
+ // GCC does not recognize #pragma unroll (Clang extension)
12
+ #if defined(__GNUC__) && !defined(__clang__)
13
+ #pragma GCC diagnostic push
14
+ #pragma GCC diagnostic ignored "-Wunknown-pragmas"
15
+ #endif
16
+
11
17
  #include <cstddef>
12
18
  #include <cstdint>
13
19
 
@@ -464,4 +470,9 @@ struct Index2LevelDecoder {
464
470
 
465
471
  } // namespace cppcontrib
466
472
  } // namespace faiss
473
+
474
+ #if defined(__GNUC__) && !defined(__clang__)
475
+ #pragma GCC diagnostic pop
476
+ #endif
477
+
467
478
  #endif // LEVEL2_INL_H
@@ -1428,63 +1428,63 @@ struct IndexPQDecoderImpl<
1428
1428
 
1429
1429
  // process 1 sample
1430
1430
  static void store(
1431
- const float* const __restrict pqFineCentroids0,
1432
- const uint8_t* const __restrict code0,
1433
- float* const __restrict outputStore) {}
1431
+ const float* const __restrict /*pqFineCentroids0*/,
1432
+ const uint8_t* const __restrict /*code0*/,
1433
+ float* const __restrict /*outputStore*/) {}
1434
1434
 
1435
1435
  // process 1 sample
1436
1436
  static void accum(
1437
- const float* const __restrict pqFineCentroids0,
1438
- const uint8_t* const __restrict code0,
1439
- const float weight0,
1440
- float* const __restrict outputAccum) {}
1437
+ const float* const __restrict /*pqFineCentroids0*/,
1438
+ const uint8_t* const __restrict /*code0*/,
1439
+ const float /*weight0*/,
1440
+ float* const __restrict /*outputAccum*/) {}
1441
1441
 
1442
1442
  // Process 2 samples.
1443
1443
  // Each code uses its own fine pq centroids table.
1444
1444
  static void accum(
1445
- const float* const __restrict pqFineCentroids0,
1446
- const uint8_t* const __restrict code0,
1447
- const float weight0,
1448
- const float* const __restrict pqFineCentroids1,
1449
- const uint8_t* const __restrict code1,
1450
- const float weight1,
1451
- float* const __restrict outputAccum) {}
1445
+ const float* const __restrict /*pqFineCentroids0*/,
1446
+ const uint8_t* const __restrict /*code0*/,
1447
+ const float /*weight0*/,
1448
+ const float* const __restrict /*pqFineCentroids1*/,
1449
+ const uint8_t* const __restrict /*code1*/,
1450
+ const float /*weight1*/,
1451
+ float* const __restrict /*outputAccum*/) {}
1452
1452
 
1453
1453
  // Process 2 samples.
1454
1454
  // Fine pq centroids table is shared among codes.
1455
1455
  static void accum(
1456
- const float* const __restrict pqFineCentroids,
1457
- const uint8_t* const __restrict code0,
1458
- const float weight0,
1459
- const uint8_t* const __restrict code1,
1460
- const float weight1,
1461
- float* const __restrict outputAccum) {}
1456
+ const float* const __restrict /*pqFineCentroids*/,
1457
+ const uint8_t* const __restrict /*code0*/,
1458
+ const float /*weight0*/,
1459
+ const uint8_t* const __restrict /*code1*/,
1460
+ const float /*weight1*/,
1461
+ float* const __restrict /*outputAccum*/) {}
1462
1462
 
1463
1463
  // Process 3 samples.
1464
1464
  // Each code uses its own fine pq centroids table.
1465
1465
  static void accum(
1466
- const float* const __restrict pqFineCentroids0,
1467
- const uint8_t* const __restrict code0,
1468
- const float weight0,
1469
- const float* const __restrict pqFineCentroids1,
1470
- const uint8_t* const __restrict code1,
1471
- const float weight1,
1472
- const float* const __restrict pqFineCentroids2,
1473
- const uint8_t* const __restrict code2,
1474
- const float weight2,
1475
- float* const __restrict outputAccum) {}
1466
+ const float* const __restrict /*pqFineCentroids0*/,
1467
+ const uint8_t* const __restrict /*code0*/,
1468
+ const float /*weight0*/,
1469
+ const float* const __restrict /*pqFineCentroids1*/,
1470
+ const uint8_t* const __restrict /*code1*/,
1471
+ const float /*weight1*/,
1472
+ const float* const __restrict /*pqFineCentroids2*/,
1473
+ const uint8_t* const __restrict /*code2*/,
1474
+ const float /*weight2*/,
1475
+ float* const __restrict /*outputAccum*/) {}
1476
1476
 
1477
1477
  // Process 3 samples.
1478
1478
  // Fine pq centroids table is shared among codes.
1479
1479
  static void accum(
1480
- const float* const __restrict pqFineCentroids,
1481
- const uint8_t* const __restrict code0,
1482
- const float weight0,
1483
- const uint8_t* const __restrict code1,
1484
- const float weight1,
1485
- const uint8_t* const __restrict code2,
1486
- const float weight2,
1487
- float* const __restrict outputAccum) {}
1480
+ const float* const __restrict /*pqFineCentroids*/,
1481
+ const uint8_t* const __restrict /*code0*/,
1482
+ const float /*weight0*/,
1483
+ const uint8_t* const __restrict /*code1*/,
1484
+ const float /*weight1*/,
1485
+ const uint8_t* const __restrict /*code2*/,
1486
+ const float /*weight2*/,
1487
+ float* const __restrict /*outputAccum*/) {}
1488
1488
 
1489
1489
  // clang-format on
1490
1490
  };
@@ -8,6 +8,12 @@
8
8
  #ifndef PQ_INL_H
9
9
  #define PQ_INL_H
10
10
 
11
+ // GCC does not recognize #pragma unroll (Clang extension)
12
+ #if defined(__GNUC__) && !defined(__clang__)
13
+ #pragma GCC diagnostic push
14
+ #pragma GCC diagnostic ignored "-Wunknown-pragmas"
15
+ #endif
16
+
11
17
  #include <cstddef>
12
18
  #include <cstdint>
13
19
 
@@ -254,4 +260,9 @@ struct IndexPQDecoder {
254
260
 
255
261
  } // namespace cppcontrib
256
262
  } // namespace faiss
263
+
264
+ #if defined(__GNUC__) && !defined(__clang__)
265
+ #pragma GCC diagnostic pop
266
+ #endif
267
+
257
268
  #endif // PQ_INL_H
@@ -7,7 +7,7 @@
7
7
 
8
8
  // -*- c++ -*-
9
9
 
10
- #include <faiss/cppcontrib/factory_tools.h>
10
+ #include <faiss/factory_tools.h>
11
11
 
12
12
  #include <map>
13
13
 
@@ -38,6 +38,11 @@ const std::map<faiss::ScalarQuantizer::QuantizerType, std::string> sq_types = {
38
38
  {faiss::ScalarQuantizer::QT_bf16, "SQbf16"},
39
39
  {faiss::ScalarQuantizer::QT_8bit_direct_signed, "SQ8_direct_signed"},
40
40
  {faiss::ScalarQuantizer::QT_8bit_direct, "SQ8_direct"},
41
+ {faiss::ScalarQuantizer::QT_1bit_tqmse, "SQtqmse1"},
42
+ {faiss::ScalarQuantizer::QT_2bit_tqmse, "SQtqmse2"},
43
+ {faiss::ScalarQuantizer::QT_3bit_tqmse, "SQtqmse3"},
44
+ {faiss::ScalarQuantizer::QT_4bit_tqmse, "SQtqmse4"},
45
+ {faiss::ScalarQuantizer::QT_8bit_tqmse, "SQtqmse8"},
41
46
  };
42
47
 
43
48
  int get_hnsw_M(const faiss::IndexHNSW* index) {
@@ -64,7 +64,7 @@ void ToCPUCloner::merge_index(Index* dst, Index* src, bool successive_ids) {
64
64
  FAISS_ASSERT(ifl2);
65
65
  ifl->merge_from(*ifl2, successive_ids ? ifl->ntotal : 0);
66
66
  } else {
67
- FAISS_ASSERT(!"merging not implemented for this type of class");
67
+ FAISS_ASSERT(false && "merging not implemented for this type of class");
68
68
  }
69
69
  }
70
70