faiss 0.6.0 → 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 (361) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/ext/faiss/extconf.rb +2 -1
  4. data/ext/faiss/{index_rb.cpp → index.cpp} +1 -1
  5. data/ext/faiss/index_binary.cpp +1 -1
  6. data/ext/faiss/kmeans.cpp +1 -1
  7. data/ext/faiss/pca_matrix.cpp +1 -1
  8. data/ext/faiss/product_quantizer.cpp +1 -1
  9. data/ext/faiss/{utils_rb.cpp → utils.cpp} +1 -1
  10. data/lib/faiss/version.rb +1 -1
  11. data/vendor/faiss/faiss/AutoTune.cpp +93 -80
  12. data/vendor/faiss/faiss/Clustering.cpp +39 -240
  13. data/vendor/faiss/faiss/Clustering.h +6 -0
  14. data/vendor/faiss/faiss/IVFlib.cpp +41 -21
  15. data/vendor/faiss/faiss/Index.cpp +6 -5
  16. data/vendor/faiss/faiss/Index.h +5 -5
  17. data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
  18. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +49 -37
  19. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
  20. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
  21. data/vendor/faiss/faiss/IndexBinary.cpp +5 -3
  22. data/vendor/faiss/faiss/IndexBinary.h +4 -4
  23. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +1 -1
  24. data/vendor/faiss/faiss/IndexBinaryFlat.h +1 -1
  25. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -4
  26. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +84 -92
  27. data/vendor/faiss/faiss/IndexBinaryHNSW.h +9 -3
  28. data/vendor/faiss/faiss/IndexBinaryHash.cpp +45 -236
  29. data/vendor/faiss/faiss/IndexBinaryHash.h +6 -6
  30. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +87 -415
  31. data/vendor/faiss/faiss/IndexFastScan.cpp +72 -109
  32. data/vendor/faiss/faiss/IndexFastScan.h +25 -23
  33. data/vendor/faiss/faiss/IndexFlat.cpp +27 -20
  34. data/vendor/faiss/faiss/IndexFlat.h +21 -18
  35. data/vendor/faiss/faiss/IndexFlatCodes.cpp +42 -19
  36. data/vendor/faiss/faiss/IndexHNSW.cpp +283 -145
  37. data/vendor/faiss/faiss/IndexHNSW.h +16 -2
  38. data/vendor/faiss/faiss/IndexIDMap.cpp +25 -21
  39. data/vendor/faiss/faiss/IndexIDMap.h +9 -7
  40. data/vendor/faiss/faiss/IndexIVF.cpp +465 -362
  41. data/vendor/faiss/faiss/IndexIVF.h +33 -12
  42. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +77 -74
  43. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +96 -93
  44. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +4 -1
  45. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +357 -238
  46. data/vendor/faiss/faiss/IndexIVFFastScan.h +42 -41
  47. data/vendor/faiss/faiss/IndexIVFFlat.cpp +36 -68
  48. data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
  49. data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +53 -30
  50. data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
  51. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
  52. data/vendor/faiss/faiss/IndexIVFPQ.cpp +71 -843
  53. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +151 -121
  54. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
  55. data/vendor/faiss/faiss/IndexIVFPQR.cpp +21 -17
  56. data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +26 -39
  57. data/vendor/faiss/faiss/IndexIVFRaBitQ.h +2 -1
  58. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +475 -476
  59. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +248 -93
  60. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
  61. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
  62. data/vendor/faiss/faiss/IndexLSH.cpp +36 -19
  63. data/vendor/faiss/faiss/IndexLattice.cpp +13 -13
  64. data/vendor/faiss/faiss/IndexNNDescent.cpp +36 -21
  65. data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
  66. data/vendor/faiss/faiss/IndexNSG.cpp +39 -23
  67. data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +31 -11
  68. data/vendor/faiss/faiss/IndexPQ.cpp +128 -221
  69. data/vendor/faiss/faiss/IndexPQ.h +3 -2
  70. data/vendor/faiss/faiss/IndexPQFastScan.cpp +20 -14
  71. data/vendor/faiss/faiss/IndexPQFastScan.h +3 -0
  72. data/vendor/faiss/faiss/IndexPreTransform.cpp +25 -18
  73. data/vendor/faiss/faiss/IndexPreTransform.h +1 -1
  74. data/vendor/faiss/faiss/IndexRaBitQ.cpp +11 -36
  75. data/vendor/faiss/faiss/IndexRaBitQ.h +2 -1
  76. data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +41 -277
  77. data/vendor/faiss/faiss/IndexRaBitQFastScan.h +183 -27
  78. data/vendor/faiss/faiss/IndexRefine.cpp +30 -25
  79. data/vendor/faiss/faiss/IndexRefine.h +4 -4
  80. data/vendor/faiss/faiss/IndexReplicas.cpp +6 -6
  81. data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +15 -14
  82. data/vendor/faiss/faiss/IndexRowwiseMinMax.h +1 -1
  83. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +82 -14
  84. data/vendor/faiss/faiss/IndexShards.cpp +10 -9
  85. data/vendor/faiss/faiss/IndexShardsIVF.cpp +21 -15
  86. data/vendor/faiss/faiss/MatrixStats.cpp +5 -4
  87. data/vendor/faiss/faiss/MetaIndexes.cpp +19 -17
  88. data/vendor/faiss/faiss/MetaIndexes.h +1 -1
  89. data/vendor/faiss/faiss/MetricType.h +14 -7
  90. data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
  91. data/vendor/faiss/faiss/SuperKMeans.h +97 -0
  92. data/vendor/faiss/faiss/VectorTransform.cpp +237 -149
  93. data/vendor/faiss/faiss/VectorTransform.h +16 -16
  94. data/vendor/faiss/faiss/build.cpp +23 -0
  95. data/vendor/faiss/faiss/build.h +15 -0
  96. data/vendor/faiss/faiss/clone_index.cpp +48 -47
  97. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +47 -47
  98. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +11 -0
  99. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +38 -38
  100. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +11 -0
  101. data/vendor/faiss/faiss/factory_tools.cpp +5 -0
  102. data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -5
  103. data/vendor/faiss/faiss/gpu/GpuResources.h +1 -1
  104. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +9 -9
  105. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +4 -3
  106. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +46 -0
  107. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +56 -0
  108. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +78 -1
  109. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +72 -0
  110. data/vendor/faiss/faiss/gpu/test/TestUtils.h +23 -0
  111. data/vendor/faiss/faiss/gpu/utils/CuvsFilterConvert.h +1 -1
  112. data/vendor/faiss/faiss/gpu/utils/CuvsUtils.h +21 -10
  113. data/vendor/faiss/faiss/gpu_metal/GpuIndexFlat.h +22 -0
  114. data/vendor/faiss/faiss/gpu_metal/MetalCloner.h +35 -0
  115. data/vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h +40 -0
  116. data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +51 -0
  117. data/vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h +65 -0
  118. data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +66 -0
  119. data/vendor/faiss/faiss/gpu_metal/MetalResources.h +79 -0
  120. data/vendor/faiss/faiss/gpu_metal/StandardMetalResources.h +35 -0
  121. data/vendor/faiss/faiss/impl/AdSampling.cpp +103 -0
  122. data/vendor/faiss/faiss/impl/AdSampling.h +35 -0
  123. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +29 -25
  124. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +1 -0
  125. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +10 -9
  126. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +3 -0
  127. data/vendor/faiss/faiss/impl/ClusteringHelpers.cpp +244 -0
  128. data/vendor/faiss/faiss/impl/ClusteringHelpers.h +94 -0
  129. data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +16 -16
  130. data/vendor/faiss/faiss/impl/CodePacker.cpp +3 -3
  131. data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +1 -1
  132. data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
  133. data/vendor/faiss/faiss/impl/FaissAssert.h +6 -3
  134. data/vendor/faiss/faiss/impl/FaissException.h +50 -3
  135. data/vendor/faiss/faiss/impl/HNSW.cpp +92 -317
  136. data/vendor/faiss/faiss/impl/HNSW.h +13 -34
  137. data/vendor/faiss/faiss/impl/IDSelector.cpp +15 -11
  138. data/vendor/faiss/faiss/impl/IDSelector.h +8 -8
  139. data/vendor/faiss/faiss/impl/InvertedListScannerStats.h +26 -0
  140. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +82 -77
  141. data/vendor/faiss/faiss/impl/NNDescent.cpp +62 -25
  142. data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
  143. data/vendor/faiss/faiss/impl/NSG.cpp +38 -21
  144. data/vendor/faiss/faiss/impl/NSG.h +4 -4
  145. data/vendor/faiss/faiss/impl/Panorama.cpp +23 -6
  146. data/vendor/faiss/faiss/impl/Panorama.h +258 -87
  147. data/vendor/faiss/faiss/impl/PdxLayout.cpp +93 -0
  148. data/vendor/faiss/faiss/impl/PdxLayout.h +41 -0
  149. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +46 -32
  150. data/vendor/faiss/faiss/impl/PolysemousTraining.h +3 -3
  151. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +35 -35
  152. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +21 -16
  153. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +30 -23
  154. data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
  155. data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +55 -49
  156. data/vendor/faiss/faiss/impl/RaBitQUtils.h +65 -0
  157. data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +296 -283
  158. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +26 -23
  159. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
  160. data/vendor/faiss/faiss/impl/ResultHandler.h +99 -75
  161. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +52 -4
  162. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +27 -1
  163. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
  164. data/vendor/faiss/faiss/impl/VisitedTable.h +7 -0
  165. data/vendor/faiss/faiss/impl/approx_topk/approx_topk.h +276 -0
  166. data/vendor/faiss/faiss/impl/approx_topk/avx2.cpp +68 -0
  167. data/vendor/faiss/faiss/{utils → impl}/approx_topk/generic.h +15 -8
  168. data/vendor/faiss/faiss/impl/approx_topk/neon.cpp +68 -0
  169. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab-inl.h +169 -0
  170. data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab.h +117 -0
  171. data/vendor/faiss/faiss/impl/approx_topk/simdlib256-inl.h +146 -0
  172. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h +73 -0
  173. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHash_impl.h +270 -0
  174. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +460 -0
  175. data/vendor/faiss/faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h +159 -0
  176. data/vendor/faiss/faiss/impl/binary_hamming/IndexPQ_impl.h +92 -0
  177. data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +26 -0
  178. data/vendor/faiss/faiss/impl/binary_hamming/avx512.cpp +26 -0
  179. data/vendor/faiss/faiss/impl/binary_hamming/dispatch.h +143 -0
  180. data/vendor/faiss/faiss/impl/binary_hamming/neon.cpp +26 -0
  181. data/vendor/faiss/faiss/impl/binary_hamming/rvv.cpp +26 -0
  182. data/vendor/faiss/faiss/impl/expanded_scanners.h +8 -3
  183. data/vendor/faiss/faiss/impl/{FastScanDistancePostProcessing.h → fast_scan/FastScanDistancePostProcessing.h} +13 -6
  184. data/vendor/faiss/faiss/impl/{LookupTableScaler.h → fast_scan/LookupTableScaler.h} +16 -5
  185. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops.h +237 -0
  186. data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops_512.h +185 -0
  187. data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +229 -0
  188. data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +268 -0
  189. data/vendor/faiss/faiss/impl/{pq4_fast_scan.cpp → fast_scan/fast_scan.cpp} +169 -2
  190. data/vendor/faiss/faiss/impl/fast_scan/fast_scan.h +341 -0
  191. data/vendor/faiss/faiss/impl/fast_scan/impl-avx2.cpp +36 -0
  192. data/vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp +40 -0
  193. data/vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp +120 -0
  194. data/vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp +104 -0
  195. data/vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h +213 -0
  196. data/vendor/faiss/faiss/impl/{pq4_fast_scan_search_qbs.cpp → fast_scan/kernels_simd512.h} +26 -356
  197. data/vendor/faiss/faiss/impl/fast_scan/rabitq_dispatching.h +90 -0
  198. data/vendor/faiss/faiss/impl/fast_scan/rabitq_result_handler.h +108 -0
  199. data/vendor/faiss/faiss/impl/{simd_result_handlers.h → fast_scan/simd_result_handlers.h} +282 -134
  200. data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +54 -0
  201. data/vendor/faiss/faiss/impl/hnsw/LockVector.h +64 -0
  202. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +91 -0
  203. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +64 -0
  204. data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +104 -0
  205. data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +111 -0
  206. data/vendor/faiss/faiss/impl/index_read.cpp +1132 -45
  207. data/vendor/faiss/faiss/impl/index_read_utils.h +1 -1
  208. data/vendor/faiss/faiss/impl/index_write.cpp +95 -13
  209. data/vendor/faiss/faiss/impl/io.cpp +6 -6
  210. data/vendor/faiss/faiss/impl/io_macros.h +33 -16
  211. data/vendor/faiss/faiss/impl/kmeans1d.cpp +10 -10
  212. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +37 -23
  213. data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
  214. data/vendor/faiss/faiss/impl/mapped_io.cpp +6 -6
  215. data/vendor/faiss/faiss/impl/platform_macros.h +11 -4
  216. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +549 -0
  217. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +245 -0
  218. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h +105 -0
  219. data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +106 -0
  220. data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +21 -0
  221. data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +21 -0
  222. data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +21 -0
  223. data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx2.cpp → pq_code_distance-avx2.h} +9 -13
  224. data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx512.cpp → pq_code_distance-avx512.h} +9 -57
  225. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +29 -111
  226. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h +96 -0
  227. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +238 -5
  228. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp +5 -7
  229. data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +68 -0
  230. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +311 -477
  231. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
  232. data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +1 -1
  233. data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +3 -2
  234. data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +102 -11
  235. data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +27 -1
  236. data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +3 -3
  237. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +148 -0
  238. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +167 -0
  239. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +59 -0
  240. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +163 -0
  241. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +311 -0
  242. data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +192 -8
  243. data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +12 -0
  244. data/vendor/faiss/faiss/impl/simd_dispatch.h +100 -66
  245. data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
  246. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +264 -172
  247. data/vendor/faiss/faiss/impl/simdlib/simdlib_avx512.h +414 -0
  248. data/vendor/faiss/faiss/impl/simdlib/simdlib_dispatch.h +44 -0
  249. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_emulated.h +231 -166
  250. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_neon.h +270 -218
  251. data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_ppc64.h +201 -160
  252. data/vendor/faiss/faiss/impl/svs_io.cpp +12 -3
  253. data/vendor/faiss/faiss/impl/svs_io.h +8 -2
  254. data/vendor/faiss/faiss/index_factory.cpp +86 -18
  255. data/vendor/faiss/faiss/index_io.h +24 -0
  256. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +66 -16
  257. data/vendor/faiss/faiss/invlists/DirectMap.cpp +24 -14
  258. data/vendor/faiss/faiss/invlists/DirectMap.h +4 -3
  259. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +157 -73
  260. data/vendor/faiss/faiss/invlists/InvertedLists.h +86 -23
  261. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +4 -4
  262. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +13 -13
  263. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
  264. data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +1 -1
  265. data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
  266. data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +350 -0
  267. data/vendor/faiss/faiss/svs/IndexSVSIVF.h +128 -0
  268. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.cpp +40 -0
  269. data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.h +43 -0
  270. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +225 -0
  271. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.h +71 -0
  272. data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +25 -1
  273. data/vendor/faiss/faiss/svs/IndexSVSVamana.h +18 -2
  274. data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +1 -1
  275. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +12 -3
  276. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +7 -2
  277. data/vendor/faiss/faiss/utils/Heap.cpp +10 -10
  278. data/vendor/faiss/faiss/utils/NeuralNet.cpp +47 -36
  279. data/vendor/faiss/faiss/utils/NeuralNet.h +1 -1
  280. data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +10 -4
  281. data/vendor/faiss/faiss/utils/distances.cpp +390 -560
  282. data/vendor/faiss/faiss/utils/distances.h +20 -1
  283. data/vendor/faiss/faiss/utils/distances_dispatch.h +117 -37
  284. data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +8 -7
  285. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +33 -14
  286. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +12 -1
  287. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +16 -293
  288. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp +57 -0
  289. data/vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h +290 -0
  290. data/vendor/faiss/faiss/utils/distances_simd.cpp +5 -177
  291. data/vendor/faiss/faiss/utils/extra_distances.cpp +9 -8
  292. data/vendor/faiss/faiss/utils/extra_distances.h +32 -6
  293. data/vendor/faiss/faiss/utils/hamming-inl.h +13 -11
  294. data/vendor/faiss/faiss/utils/hamming.cpp +66 -517
  295. data/vendor/faiss/faiss/utils/hamming.h +92 -2
  296. data/vendor/faiss/faiss/utils/hamming_distance/common.h +287 -10
  297. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +15 -0
  298. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +15 -0
  299. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h +142 -0
  300. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +234 -0
  301. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-generic.h +368 -0
  302. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h +322 -0
  303. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-rvv.h +39 -0
  304. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer.h +146 -0
  305. data/vendor/faiss/faiss/utils/hamming_distance/hamming_impl.h +481 -0
  306. data/vendor/faiss/faiss/utils/hamming_distance/hamming_neon.cpp +15 -0
  307. data/vendor/faiss/faiss/utils/hamming_distance/hamming_rvv.cpp +15 -0
  308. data/vendor/faiss/faiss/utils/partitioning.cpp +66 -987
  309. data/vendor/faiss/faiss/utils/partitioning.h +31 -0
  310. data/vendor/faiss/faiss/utils/popcount.h +29 -0
  311. data/vendor/faiss/faiss/utils/pq_code_distance.h +2 -2
  312. data/vendor/faiss/faiss/utils/prefetch.h +2 -2
  313. data/vendor/faiss/faiss/utils/quantize_lut.cpp +30 -30
  314. data/vendor/faiss/faiss/utils/quantize_lut.h +1 -1
  315. data/vendor/faiss/faiss/utils/rabitq_simd.h +57 -536
  316. data/vendor/faiss/faiss/utils/random.cpp +6 -6
  317. data/vendor/faiss/faiss/utils/simd_impl/IVFFlatScanner-inl.h +51 -0
  318. data/vendor/faiss/faiss/utils/simd_impl/distances_aarch64.cpp +5 -1
  319. data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +213 -4
  320. data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +163 -10
  321. data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +250 -4
  322. data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +7 -4
  323. data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +189 -0
  324. data/vendor/faiss/faiss/utils/simd_impl/distances_simdlib256.h +195 -0
  325. data/vendor/faiss/faiss/utils/simd_impl/distances_sse-inl.h +2 -1
  326. data/vendor/faiss/faiss/utils/{distances_fused/simdlib_based.h → simd_impl/exhaustive_L2sqr_blas_cmax.h} +5 -10
  327. data/vendor/faiss/faiss/utils/simd_impl/hamming_impl.h +481 -0
  328. data/vendor/faiss/faiss/utils/simd_impl/partitioning_avx2.cpp +14 -0
  329. data/vendor/faiss/faiss/utils/simd_impl/partitioning_neon.cpp +14 -0
  330. data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +1085 -0
  331. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +355 -0
  332. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +477 -0
  333. data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +55 -0
  334. data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +55 -0
  335. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h +32 -0
  336. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels.h +43 -0
  337. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp +57 -0
  338. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp +45 -0
  339. data/vendor/faiss/faiss/utils/simd_levels.cpp +17 -5
  340. data/vendor/faiss/faiss/utils/simd_levels.h +93 -1
  341. data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
  342. data/vendor/faiss/faiss/utils/utils.cpp +5 -5
  343. data/vendor/faiss/faiss/utils/utils.h +3 -3
  344. metadata +119 -34
  345. data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
  346. data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
  347. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -224
  348. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -230
  349. data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +0 -84
  350. data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +0 -196
  351. data/vendor/faiss/faiss/utils/approx_topk/mode.h +0 -34
  352. data/vendor/faiss/faiss/utils/distances_fused/avx512.h +0 -36
  353. data/vendor/faiss/faiss/utils/extra_distances-inl.h +0 -235
  354. data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +0 -462
  355. data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +0 -490
  356. data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +0 -449
  357. data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +0 -87
  358. data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +0 -524
  359. data/vendor/faiss/faiss/utils/simdlib.h +0 -42
  360. data/vendor/faiss/faiss/utils/simdlib_avx512.h +0 -365
  361. /data/ext/faiss/{utils_rb.h → utils.h} +0 -0
@@ -54,11 +54,11 @@ double PermutationObjective::cost_update(const int* perm, int iw, int jw)
54
54
  }
55
55
 
56
56
  SimulatedAnnealingOptimizer::SimulatedAnnealingOptimizer(
57
- PermutationObjective* obj,
57
+ PermutationObjective* obj_in,
58
58
  const SimulatedAnnealingParameters& p)
59
59
  : SimulatedAnnealingParameters(p),
60
- obj(obj),
61
- n(obj->n),
60
+ obj(obj_in),
61
+ n(obj_in->n),
62
62
  logfile(nullptr) {
63
63
  rnd = new RandomGenerator(p.seed);
64
64
  FAISS_THROW_IF_NOT(n < 100000 && n >= 0);
@@ -165,7 +165,7 @@ double SimulatedAnnealingOptimizer::optimize(int* perm) {
165
165
  ****************************************************/
166
166
 
167
167
  static inline int hamming_dis(uint64_t a, uint64_t b) {
168
- return __builtin_popcountl(a ^ b);
168
+ return popcount64(a ^ b);
169
169
  }
170
170
 
171
171
  namespace {
@@ -260,10 +260,10 @@ struct ReproduceWithHammingObjective : PermutationObjective {
260
260
  }
261
261
 
262
262
  ReproduceWithHammingObjective(
263
- int nbits,
263
+ int nbits_in,
264
264
  const std::vector<double>& dis_table,
265
- double dis_weight_factor)
266
- : nbits(nbits), dis_weight_factor(dis_weight_factor) {
265
+ double dis_weight_factor_in)
266
+ : nbits(nbits_in), dis_weight_factor(dis_weight_factor_in) {
267
267
  n = 1 << nbits;
268
268
  FAISS_THROW_IF_NOT(dis_table.size() == n * n);
269
269
  set_affine_target_dis(dis_table);
@@ -373,12 +373,12 @@ double ReproduceDistancesObjective::cost_update(const int* perm, int iw, int jw)
373
373
  }
374
374
 
375
375
  ReproduceDistancesObjective::ReproduceDistancesObjective(
376
- int n,
376
+ int n_in,
377
377
  const double* source_dis_in,
378
378
  const double* target_dis_in,
379
- double dis_weight_factor)
380
- : dis_weight_factor(dis_weight_factor), target_dis(target_dis_in) {
381
- this->n = n;
379
+ double dis_weight_factor_in)
380
+ : dis_weight_factor(dis_weight_factor_in), target_dis(target_dis_in) {
381
+ this->n = n_in;
382
382
  set_affine_target_dis(source_dis_in);
383
383
  }
384
384
 
@@ -388,7 +388,7 @@ void ReproduceDistancesObjective::compute_mean_stdev(
388
388
  double* mean_out,
389
389
  double* stddev_out) {
390
390
  double sum = 0, sum2 = 0;
391
- for (int i = 0; i < n2; i++) {
391
+ for (size_t i = 0; i < n2; i++) {
392
392
  sum += tab[i];
393
393
  sum2 += tab[i] * tab[i];
394
394
  }
@@ -668,18 +668,18 @@ struct RankingScore2 : Score3Computer<float, double> {
668
668
  const float* gt_distances;
669
669
 
670
670
  RankingScore2(
671
- int nbits,
672
- int nq,
673
- int nb,
674
- const uint32_t* qcodes,
675
- const uint32_t* bcodes,
676
- const float* gt_distances)
677
- : nbits(nbits),
678
- nq(nq),
679
- nb(nb),
680
- qcodes(qcodes),
681
- bcodes(bcodes),
682
- gt_distances(gt_distances) {
671
+ int nbits_in,
672
+ int nq_in,
673
+ int nb_in,
674
+ const uint32_t* qcodes_in,
675
+ const uint32_t* bcodes_in,
676
+ const float* gt_distances_in)
677
+ : nbits(nbits_in),
678
+ nq(nq_in),
679
+ nb(nb_in),
680
+ qcodes(qcodes_in),
681
+ bcodes(bcodes_in),
682
+ gt_distances(gt_distances_in) {
683
683
  n = nc = 1 << nbits;
684
684
  n_gt.resize(nc * nc * nc);
685
685
  init_n_gt();
@@ -796,7 +796,7 @@ void PolysemousTraining::optimize_reproduce_distances(
796
796
  }
797
797
 
798
798
  #pragma omp parallel for num_threads(nt)
799
- for (int m = 0; m < pq.M; m++) {
799
+ for (int m = 0; m < static_cast<int>(pq.M); m++) {
800
800
  std::vector<double> dis_table;
801
801
 
802
802
  // printf ("Optimizing quantizer %d\n", m);
@@ -823,7 +823,14 @@ void PolysemousTraining::optimize_reproduce_distances(
823
823
 
824
824
  if (log_pattern.size()) {
825
825
  char fname[256];
826
+ #if defined(__GNUC__) || defined(__clang__)
827
+ #pragma GCC diagnostic push
828
+ #pragma GCC diagnostic ignored "-Wformat-nonliteral"
829
+ #endif
826
830
  snprintf(fname, 256, log_pattern.c_str(), m);
831
+ #if defined(__GNUC__) || defined(__clang__)
832
+ #pragma GCC diagnostic pop
833
+ #endif
827
834
  printf("opening log file %s\n", fname);
828
835
  optim.logfile = fopen(fname, "w");
829
836
  FAISS_THROW_IF_NOT_MSG(optim.logfile, "could not open logfile");
@@ -872,21 +879,21 @@ void PolysemousTraining::optimize_ranking(
872
879
  }
873
880
 
874
881
  #pragma omp parallel for
875
- for (int m = 0; m < pq.M; m++) {
882
+ for (int m = 0; m < static_cast<int>(pq.M); m++) {
876
883
  size_t nq, nb;
877
884
  std::vector<uint32_t> codes; // query codes, then db codes
878
885
  std::vector<float> gt_distances; // nq * nb matrix of distances
879
886
 
880
887
  if (n > 0) {
881
888
  std::vector<float> xtrain(n * dsub);
882
- for (int i = 0; i < n; i++) {
889
+ for (size_t i = 0; i < n; i++) {
883
890
  memcpy(xtrain.data() + i * dsub,
884
891
  x + i * pq.d + m * dsub,
885
892
  sizeof(float) * dsub);
886
893
  }
887
894
 
888
895
  codes.resize(n);
889
- for (int i = 0; i < n; i++) {
896
+ for (size_t i = 0; i < n; i++) {
890
897
  codes[i] = all_codes[i * pq.code_size + m];
891
898
  }
892
899
 
@@ -901,8 +908,8 @@ void PolysemousTraining::optimize_ranking(
901
908
  } else {
902
909
  nq = nb = pq.ksub;
903
910
  codes.resize(2 * nq);
904
- for (int i = 0; i < nq; i++) {
905
- codes[i] = codes[i + nq] = i;
911
+ for (size_t i = 0; i < nq; i++) {
912
+ codes[i] = codes[i + nq] = static_cast<uint32_t>(i);
906
913
  }
907
914
 
908
915
  gt_distances.resize(nq * nb);
@@ -935,7 +942,14 @@ void PolysemousTraining::optimize_ranking(
935
942
 
936
943
  if (log_pattern.size()) {
937
944
  char fname[256];
945
+ #if defined(__GNUC__) || defined(__clang__)
946
+ #pragma GCC diagnostic push
947
+ #pragma GCC diagnostic ignored "-Wformat-nonliteral"
948
+ #endif
938
949
  snprintf(fname, 256, log_pattern.c_str(), m);
950
+ #if defined(__GNUC__) || defined(__clang__)
951
+ #pragma GCC diagnostic pop
952
+ #endif
939
953
  printf("opening log file %s\n", fname);
940
954
  optim.logfile = fopen(fname, "w");
941
955
  FAISS_THROW_IF_NOT_FMT(
@@ -957,11 +971,11 @@ void PolysemousTraining::optimize_ranking(
957
971
  float* centroids = pq.get_centroids(m, 0);
958
972
 
959
973
  std::vector<float> centroids_copy;
960
- for (int i = 0; i < dsub * pq.ksub; i++) {
974
+ for (size_t i = 0; i < dsub * pq.ksub; i++) {
961
975
  centroids_copy.push_back(centroids[i]);
962
976
  }
963
977
 
964
- for (int i = 0; i < pq.ksub; i++) {
978
+ for (size_t i = 0; i < pq.ksub; i++) {
965
979
  memcpy(centroids + perm[i] * dsub,
966
980
  centroids_copy.data() + i * dsub,
967
981
  dsub * sizeof(centroids[0]));
@@ -70,10 +70,10 @@ struct ReproduceDistancesObjective : PermutationObjective {
70
70
  double cost_update(const int* perm, int iw, int jw) const override;
71
71
 
72
72
  ReproduceDistancesObjective(
73
- int n,
73
+ int n_in,
74
74
  const double* source_dis_in,
75
75
  const double* target_dis_in,
76
- double dis_weight_factor);
76
+ double dis_weight_factor_in);
77
77
 
78
78
  static void compute_mean_stdev(
79
79
  const double* tab,
@@ -95,7 +95,7 @@ struct SimulatedAnnealingOptimizer : SimulatedAnnealingParameters {
95
95
  FILE* logfile; /// logs values of the cost function
96
96
 
97
97
  SimulatedAnnealingOptimizer(
98
- PermutationObjective* obj,
98
+ PermutationObjective* obj_in,
99
99
  const SimulatedAnnealingParameters& p);
100
100
  RandomGenerator* rnd;
101
101
 
@@ -42,22 +42,22 @@ int sgemm_(
42
42
  namespace faiss {
43
43
 
44
44
  ProductAdditiveQuantizer::ProductAdditiveQuantizer(
45
- size_t d,
45
+ size_t d_,
46
46
  const std::vector<AdditiveQuantizer*>& aqs,
47
- Search_type_t search_type) {
48
- init(d, aqs, search_type);
47
+ Search_type_t search_type_) {
48
+ init(d_, aqs, search_type_);
49
49
  }
50
50
 
51
51
  ProductAdditiveQuantizer::ProductAdditiveQuantizer()
52
52
  : ProductAdditiveQuantizer(0, {}) {}
53
53
 
54
54
  void ProductAdditiveQuantizer::init(
55
- size_t d,
55
+ size_t d_in,
56
56
  const std::vector<AdditiveQuantizer*>& aqs,
57
- Search_type_t search_type) {
57
+ Search_type_t search_type_in) {
58
58
  // AdditiveQuantizer constructor
59
- this->d = d;
60
- this->search_type = search_type;
59
+ this->d = d_in;
60
+ this->search_type = search_type_in;
61
61
  M = 0;
62
62
  for (const auto& q : aqs) {
63
63
  M += q->M;
@@ -98,7 +98,7 @@ void ProductAdditiveQuantizer::train(size_t n, const float* x) {
98
98
  xt.resize(q->d * n);
99
99
 
100
100
  #pragma omp parallel for if (n > 1000)
101
- for (idx_t i = 0; i < n; i++) {
101
+ for (idx_t i = 0; i < static_cast<idx_t>(n); i++) {
102
102
  memcpy(xt.data() + i * q->d,
103
103
  x + i * d + offset_d,
104
104
  q->d * sizeof(*x));
@@ -153,7 +153,7 @@ void ProductAdditiveQuantizer::compute_unpacked_codes(
153
153
  const float* x,
154
154
  int32_t* unpacked_codes,
155
155
  size_t n,
156
- const float* centroids) const {
156
+ const float* /*centroids*/) const {
157
157
  /// TODO: actually we do not need to unpack and pack
158
158
  size_t offset_d = 0, offset_m = 0;
159
159
  std::vector<float> xsub;
@@ -165,7 +165,7 @@ void ProductAdditiveQuantizer::compute_unpacked_codes(
165
165
  codes.resize(n * q->code_size);
166
166
 
167
167
  #pragma omp parallel for if (n > 1000)
168
- for (idx_t i = 0; i < n; i++) {
168
+ for (idx_t i = 0; i < static_cast<idx_t>(n); i++) {
169
169
  memcpy(xsub.data() + i * q->d,
170
170
  x + i * d + offset_d,
171
171
  q->d * sizeof(float));
@@ -175,7 +175,7 @@ void ProductAdditiveQuantizer::compute_unpacked_codes(
175
175
 
176
176
  // unpack
177
177
  #pragma omp parallel for if (n > 1000)
178
- for (idx_t i = 0; i < n; i++) {
178
+ for (idx_t i = 0; i < static_cast<idx_t>(n); i++) {
179
179
  uint8_t* code = codes.data() + i * q->code_size;
180
180
  BitstringReader bsr(code, q->code_size);
181
181
 
@@ -204,7 +204,7 @@ void ProductAdditiveQuantizer::decode_unpacked(
204
204
 
205
205
  // product additive quantizer decoding
206
206
  #pragma omp parallel for if (n > 1000)
207
- for (int64_t i = 0; i < n; i++) {
207
+ for (int64_t i = 0; i < static_cast<int64_t>(n); i++) {
208
208
  const int32_t* codesi = codes + i * ld_codes;
209
209
 
210
210
  size_t offset_m = 0, offset_d = 0;
@@ -212,7 +212,7 @@ void ProductAdditiveQuantizer::decode_unpacked(
212
212
  const auto q = quantizers[s];
213
213
  float* xi = x + i * d + offset_d;
214
214
 
215
- for (int m = 0; m < q->M; m++) {
215
+ for (size_t m = 0; m < q->M; m++) {
216
216
  int idx = codesi[offset_m + m];
217
217
  const float* c = codebooks.data() +
218
218
  q->d * (codebook_offsets[offset_m + m] + idx);
@@ -235,7 +235,7 @@ void ProductAdditiveQuantizer::decode(const uint8_t* codes, float* x, size_t n)
235
235
  is_trained, "The product additive quantizer is not trained yet.");
236
236
 
237
237
  #pragma omp parallel for if (n > 1000)
238
- for (int64_t i = 0; i < n; i++) {
238
+ for (int64_t i = 0; i < static_cast<int64_t>(n); i++) {
239
239
  BitstringReader bsr(codes + i * code_size, code_size);
240
240
 
241
241
  size_t offset_m = 0, offset_d = 0;
@@ -243,7 +243,7 @@ void ProductAdditiveQuantizer::decode(const uint8_t* codes, float* x, size_t n)
243
243
  const auto q = quantizers[s];
244
244
  float* xi = x + i * d + offset_d;
245
245
 
246
- for (int m = 0; m < q->M; m++) {
246
+ for (size_t m = 0; m < q->M; m++) {
247
247
  int idx = bsr.read(q->nbits[m]);
248
248
  const float* c = codebooks.data() +
249
249
  q->d * (codebook_offsets[offset_m + m] + idx);
@@ -315,24 +315,24 @@ void ProductAdditiveQuantizer::compute_LUT(
315
315
  ************************************/
316
316
 
317
317
  ProductLocalSearchQuantizer::ProductLocalSearchQuantizer(
318
- size_t d,
319
- size_t nsplits,
318
+ size_t d_,
319
+ size_t nsplits_,
320
320
  size_t Msub,
321
- size_t nbits,
322
- Search_type_t search_type) {
321
+ size_t nbits_,
322
+ Search_type_t search_type_) {
323
323
  std::vector<AdditiveQuantizer*> aqs;
324
324
 
325
- if (nsplits > 0) {
326
- FAISS_THROW_IF_NOT(d % nsplits == 0);
327
- size_t dsub = d / nsplits;
325
+ if (nsplits_ > 0) {
326
+ FAISS_THROW_IF_NOT(d_ % nsplits_ == 0);
327
+ size_t dsub = d_ / nsplits_;
328
328
 
329
- for (size_t i = 0; i < nsplits; i++) {
329
+ for (size_t i = 0; i < nsplits_; i++) {
330
330
  auto lsq =
331
- new LocalSearchQuantizer(dsub, Msub, nbits, ST_decompress);
331
+ new LocalSearchQuantizer(dsub, Msub, nbits_, ST_decompress);
332
332
  aqs.push_back(lsq);
333
333
  }
334
334
  }
335
- init(d, aqs, search_type);
335
+ init(d_, aqs, search_type_);
336
336
  for (auto& q : aqs) {
337
337
  delete q;
338
338
  }
@@ -346,23 +346,23 @@ ProductLocalSearchQuantizer::ProductLocalSearchQuantizer()
346
346
  ************************************/
347
347
 
348
348
  ProductResidualQuantizer::ProductResidualQuantizer(
349
- size_t d,
350
- size_t nsplits,
349
+ size_t d_,
350
+ size_t nsplits_,
351
351
  size_t Msub,
352
- size_t nbits,
353
- Search_type_t search_type) {
352
+ size_t nbits_,
353
+ Search_type_t search_type_) {
354
354
  std::vector<AdditiveQuantizer*> aqs;
355
355
 
356
- if (nsplits > 0) {
357
- FAISS_THROW_IF_NOT(d % nsplits == 0);
358
- size_t dsub = d / nsplits;
356
+ if (nsplits_ > 0) {
357
+ FAISS_THROW_IF_NOT(d_ % nsplits_ == 0);
358
+ size_t dsub = d_ / nsplits_;
359
359
 
360
- for (size_t i = 0; i < nsplits; i++) {
361
- auto rq = new ResidualQuantizer(dsub, Msub, nbits, ST_decompress);
360
+ for (size_t i = 0; i < nsplits_; i++) {
361
+ auto rq = new ResidualQuantizer(dsub, Msub, nbits_, ST_decompress);
362
362
  aqs.push_back(rq);
363
363
  }
364
364
  }
365
- init(d, aqs, search_type);
365
+ init(d_, aqs, search_type_);
366
366
  for (auto& q : aqs) {
367
367
  delete q;
368
368
  }
@@ -10,10 +10,10 @@
10
10
  namespace faiss {
11
11
 
12
12
  inline PQEncoderGeneric::PQEncoderGeneric(
13
- uint8_t* code,
14
- int nbits,
15
- uint8_t offset)
16
- : code(code), offset(offset), nbits(nbits), reg(0) {
13
+ uint8_t* code_in,
14
+ int nbits_in,
15
+ uint8_t offset_in)
16
+ : code(code_in), offset(offset_in), nbits(nbits_in), reg(0) {
17
17
  assert(nbits <= 64);
18
18
  if (offset > 0) {
19
19
  reg = (*code & ((1 << offset) - 1));
@@ -45,28 +45,30 @@ inline PQEncoderGeneric::~PQEncoderGeneric() {
45
45
  }
46
46
  }
47
47
 
48
- inline PQEncoder8::PQEncoder8(uint8_t* code, int nbits) : code(code) {
49
- assert(8 == nbits);
48
+ inline PQEncoder8::PQEncoder8(uint8_t* code_in, int nbits_in) : code(code_in) {
49
+ assert(8 == nbits_in);
50
+ (void)nbits_in;
50
51
  }
51
52
 
52
53
  inline void PQEncoder8::encode(uint64_t x) {
53
54
  *code++ = (uint8_t)x;
54
55
  }
55
56
 
56
- inline PQEncoder16::PQEncoder16(uint8_t* code, int nbits)
57
- : code((uint16_t*)code) {
58
- assert(16 == nbits);
57
+ inline PQEncoder16::PQEncoder16(uint8_t* code_in, int nbits_in)
58
+ : code((uint16_t*)code_in) {
59
+ assert(16 == nbits_in);
60
+ (void)nbits_in;
59
61
  }
60
62
 
61
63
  inline void PQEncoder16::encode(uint64_t x) {
62
64
  *code++ = (uint16_t)x;
63
65
  }
64
66
 
65
- inline PQDecoderGeneric::PQDecoderGeneric(const uint8_t* code, int nbits)
66
- : code(code),
67
+ inline PQDecoderGeneric::PQDecoderGeneric(const uint8_t* code_in, int nbits_in)
68
+ : code(code_in),
67
69
  offset(0),
68
- nbits(nbits),
69
- mask((1ull << nbits) - 1),
70
+ nbits(nbits_in),
71
+ mask((1ull << nbits_in) - 1),
70
72
  reg(0) {
71
73
  assert(nbits <= 64);
72
74
  }
@@ -98,17 +100,20 @@ inline uint64_t PQDecoderGeneric::decode() {
98
100
  return c & mask;
99
101
  }
100
102
 
101
- inline PQDecoder8::PQDecoder8(const uint8_t* code, int nbits_in) : code(code) {
103
+ inline PQDecoder8::PQDecoder8(const uint8_t* code_in, int nbits_in)
104
+ : code(code_in) {
102
105
  assert(8 == nbits_in);
106
+ (void)nbits_in;
103
107
  }
104
108
 
105
109
  inline uint64_t PQDecoder8::decode() {
106
110
  return (uint64_t)(*code++);
107
111
  }
108
112
 
109
- inline PQDecoder16::PQDecoder16(const uint8_t* code, int nbits_in)
110
- : code((uint16_t*)code) {
113
+ inline PQDecoder16::PQDecoder16(const uint8_t* code_in, int nbits_in)
114
+ : code((uint16_t*)code_in) {
111
115
  assert(16 == nbits_in);
116
+ (void)nbits_in;
112
117
  }
113
118
 
114
119
  inline uint64_t PQDecoder16::decode() {
@@ -48,8 +48,8 @@ namespace faiss {
48
48
  * PQ implementation
49
49
  *********************************************/
50
50
 
51
- ProductQuantizer::ProductQuantizer(size_t d, size_t M, size_t nbits)
52
- : Quantizer(d, 0), M(M), nbits(nbits), assign_index(nullptr) {
51
+ ProductQuantizer::ProductQuantizer(size_t d_in, size_t M_in, size_t nbits_in)
52
+ : Quantizer(d_in, 0), M(M_in), nbits(nbits_in), assign_index(nullptr) {
53
53
  set_derived_values();
54
54
  }
55
55
 
@@ -139,8 +139,8 @@ void ProductQuantizer::train(size_t n, const float* x) {
139
139
  }
140
140
 
141
141
  std::unique_ptr<float[]> xslice(new float[n * dsub]);
142
- for (int m = 0; m < M; m++) {
143
- for (int j = 0; j < n; j++)
142
+ for (size_t m = 0; m < M; m++) {
143
+ for (size_t j = 0; j < n; j++)
144
144
  memcpy(xslice.get() + j * dsub,
145
145
  x + j * d + m * dsub,
146
146
  dsub * sizeof(float));
@@ -179,7 +179,7 @@ void ProductQuantizer::train(size_t n, const float* x) {
179
179
 
180
180
  if (verbose) {
181
181
  clus.verbose = true;
182
- printf("Training PQ slice %d/%zd\n", m, M);
182
+ printf("Training PQ slice %zd/%zd\n", m, M);
183
183
  }
184
184
  IndexFlatL2 index(dsub);
185
185
  clus.train(n, xslice.get(), assign_index ? *assign_index : index);
@@ -197,7 +197,7 @@ void ProductQuantizer::train(size_t n, const float* x) {
197
197
  IndexFlatL2 index(dsub);
198
198
 
199
199
  clus.train(n * M, x, assign_index ? *assign_index : index);
200
- for (int m = 0; m < M; m++) {
200
+ for (size_t m = 0; m < M; m++) {
201
201
  set_params(clus.centroids.data(), m);
202
202
  }
203
203
  }
@@ -322,8 +322,9 @@ void ProductQuantizer::decode(const uint8_t* code, float* x) const {
322
322
  }
323
323
 
324
324
  void ProductQuantizer::decode(const uint8_t* code, float* x, size_t n) const {
325
+ int64_t n_signed = n;
325
326
  #pragma omp parallel for if (n > 100)
326
- for (int64_t i = 0; i < n; i++) {
327
+ for (int64_t i = 0; i < n_signed; i++) {
327
328
  this->decode(code + code_size * i, x + d * i);
328
329
  }
329
330
  }
@@ -353,7 +354,8 @@ void ProductQuantizer::compute_codes_with_assign_index(
353
354
  const float* x,
354
355
  uint8_t* codes,
355
356
  size_t n) {
356
- FAISS_THROW_IF_NOT(assign_index && assign_index->d == dsub);
357
+ FAISS_THROW_IF_NOT(
358
+ assign_index && static_cast<size_t>(assign_index->d) == dsub);
357
359
 
358
360
  for (size_t m = 0; m < M; m++) {
359
361
  assign_index->reset();
@@ -415,10 +417,11 @@ void ProductQuantizer::compute_codes(const float* x, uint8_t* codes, size_t n)
415
417
  return;
416
418
  }
417
419
 
420
+ int64_t n_signed = n;
418
421
  if (dsub < 16) { // simple direct computation
419
422
 
420
423
  #pragma omp parallel for
421
- for (int64_t i = 0; i < n; i++)
424
+ for (int64_t i = 0; i < n_signed; i++)
422
425
  compute_code(x + i * d, codes + i * code_size);
423
426
 
424
427
  } else { // worthwhile to use BLAS
@@ -426,7 +429,7 @@ void ProductQuantizer::compute_codes(const float* x, uint8_t* codes, size_t n)
426
429
  compute_distance_tables(n, x, dis_tables.get());
427
430
 
428
431
  #pragma omp parallel for
429
- for (int64_t i = 0; i < n; i++) {
432
+ for (int64_t i = 0; i < n_signed; i++) {
430
433
  uint8_t* code = codes + i * code_size;
431
434
  const float* tab = dis_tables.get() + i * ksub * M;
432
435
  compute_code_from_distance_table(tab, code);
@@ -482,7 +485,8 @@ void ProductQuantizer::compute_distance_tables(
482
485
  size_t nx,
483
486
  const float* x,
484
487
  float* dis_tables) const {
485
- #if defined(__AVX2__) || defined(__aarch64__)
488
+ int64_t nx_signed = nx;
489
+ #if defined(COMPILE_SIMD_AVX2) || defined(COMPILE_SIMD_ARM_NEON)
486
490
  if (dsub == 2 && nbits < 8) { // interesting for a narrow range of settings
487
491
  compute_PQ_dis_tables_dsub2(
488
492
  d, ksub, centroids.data(), nx, x, false, dis_tables);
@@ -491,13 +495,13 @@ void ProductQuantizer::compute_distance_tables(
491
495
  if (dsub < 16) {
492
496
 
493
497
  #pragma omp parallel for if (nx > 1)
494
- for (int64_t i = 0; i < nx; i++) {
498
+ for (int64_t i = 0; i < nx_signed; i++) {
495
499
  compute_distance_table(x + i * d, dis_tables + i * ksub * M);
496
500
  }
497
501
 
498
502
  } else { // use BLAS
499
503
 
500
- for (int m = 0; m < M; m++) {
504
+ for (size_t m = 0; m < M; m++) {
501
505
  pairwise_L2sqr(
502
506
  dsub,
503
507
  nx,
@@ -516,7 +520,8 @@ void ProductQuantizer::compute_inner_prod_tables(
516
520
  size_t nx,
517
521
  const float* x,
518
522
  float* dis_tables) const {
519
- #if defined(__AVX2__) || defined(__aarch64__)
523
+ int64_t nx_signed = nx;
524
+ #if defined(COMPILE_SIMD_AVX2) || defined(COMPILE_SIMD_ARM_NEON)
520
525
  if (dsub == 2 && nbits < 8) {
521
526
  compute_PQ_dis_tables_dsub2(
522
527
  d, ksub, centroids.data(), nx, x, true, dis_tables);
@@ -525,14 +530,14 @@ void ProductQuantizer::compute_inner_prod_tables(
525
530
  if (dsub < 16) {
526
531
 
527
532
  #pragma omp parallel for if (nx > 1)
528
- for (int64_t i = 0; i < nx; i++) {
533
+ for (int64_t i = 0; i < nx_signed; i++) {
529
534
  compute_inner_prod_table(x + i * d, dis_tables + i * ksub * M);
530
535
  }
531
536
 
532
537
  } else { // use BLAS
533
538
 
534
539
  // compute distance tables
535
- for (int m = 0; m < M; m++) {
540
+ for (size_t m = 0; m < M; m++) {
536
541
  FINTEGER ldc = ksub * M, nxi = nx, ksubi = ksub, dsubi = dsub,
537
542
  di = d;
538
543
  float one = 1.0, zero = 0;
@@ -576,7 +581,7 @@ void pq_estimators_from_tables_Mmul4(
576
581
  float dis = 0;
577
582
  const float* dt = dis_table;
578
583
 
579
- for (size_t m = 0; m < M; m += 4) {
584
+ for (int m = 0; m < M; m += 4) {
580
585
  float dism = 0;
581
586
  dism = dt[*codes++];
582
587
  dt += ksub;
@@ -648,7 +653,7 @@ void pq_estimators_from_tables(
648
653
  for (size_t j = 0; j < ncodes; j++) {
649
654
  float dis = 0;
650
655
  const float* __restrict dt = dis_table;
651
- for (int m = 0; m < M; m++) {
656
+ for (size_t m = 0; m < M; m++) {
652
657
  dis += dt[*codes++];
653
658
  dt += ksub;
654
659
  }
@@ -696,10 +701,11 @@ void pq_knn_search_with_tables(
696
701
  HeapArray<C>* res,
697
702
  bool init_finalize_heap) {
698
703
  size_t k = res->k, nx = res->nh;
704
+ int64_t nx_signed = nx;
699
705
  size_t ksub = pq.ksub, M = pq.M;
700
706
 
701
707
  #pragma omp parallel for if (nx > 1)
702
- for (int64_t i = 0; i < nx; i++) {
708
+ for (int64_t i = 0; i < nx_signed; i++) {
703
709
  /* query preparation for asymmetric search: compute look-up tables */
704
710
  const float* dis_table = dis_tables + i * ksub * M;
705
711
 
@@ -797,7 +803,7 @@ void ProductQuantizer::compute_sdc_table() {
797
803
  if (dsub < 4) {
798
804
  with_simd_level([&]<SIMDLevel SL>() {
799
805
  #pragma omp parallel for
800
- for (int mk = 0; mk < M * ksub; mk++) {
806
+ for (int64_t mk = 0; mk < static_cast<int64_t>(M * ksub); mk++) {
801
807
  // allow omp to schedule in a more fine-grained way
802
808
  // `collapse` is not supported in OpenMP 2.x
803
809
  int m = mk / ksub;
@@ -812,7 +818,7 @@ void ProductQuantizer::compute_sdc_table() {
812
818
  // NOTE: it would disable the omp loop in pairwise_L2sqr
813
819
  // but still accelerate especially when M >= 4
814
820
  #pragma omp parallel for
815
- for (int m = 0; m < M; m++) {
821
+ for (int64_t m = 0; m < static_cast<int64_t>(M); m++) {
816
822
  const float* cents = centroids.data() + m * ksub * dsub;
817
823
  float* dis_tab = sdc_table.data() + m * ksub * ksub;
818
824
  pairwise_L2sqr(
@@ -831,9 +837,10 @@ void ProductQuantizer::search_sdc(
831
837
  FAISS_THROW_IF_NOT(sdc_table.size() == M * ksub * ksub);
832
838
  FAISS_THROW_IF_NOT(nbits == 8);
833
839
  size_t k = res->k;
840
+ int64_t nq_signed = nq;
834
841
 
835
842
  #pragma omp parallel for
836
- for (int64_t i = 0; i < nq; i++) {
843
+ for (int64_t i = 0; i < nq_signed; i++) {
837
844
  /* Compute distances and keep smallest values */
838
845
  idx_t* heap_ids = res->ids + i * k;
839
846
  float* heap_dis = res->val + i * k;
@@ -846,7 +853,7 @@ void ProductQuantizer::search_sdc(
846
853
  for (size_t j = 0; j < nb; j++) {
847
854
  float dis = 0;
848
855
  const float* tab = sdc_table.data();
849
- for (int m = 0; m < M; m++) {
856
+ for (size_t m = 0; m < M; m++) {
850
857
  dis += tab[bcode[m] + qcode[m] * ksub];
851
858
  tab += ksub * ksub;
852
859
  }
@@ -16,8 +16,8 @@ struct Quantizer {
16
16
  size_t d; ///< size of the input vectors
17
17
  size_t code_size; ///< bytes per indexed vector
18
18
 
19
- explicit Quantizer(size_t d = 0, size_t code_size = 0)
20
- : d(d), code_size(code_size) {}
19
+ explicit Quantizer(size_t d_in = 0, size_t code_size_in = 0)
20
+ : d(d_in), code_size(code_size_in) {}
21
21
 
22
22
  /** Train the quantizer
23
23
  *