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
@@ -103,10 +103,8 @@ struct RaBitQuantizer : Quantizer {
103
103
  //
104
104
  // 1. distance_to_code_1bit() - Fast 1-bit filtering using only sign bits
105
105
  // 2. distance_to_code_full() - Accurate multi-bit refinement using all bits
106
- // 3. lower_bound_distance() - Error-bounded adaptive filtering
107
- // (based on 1-bit estimator)
108
106
  //
109
- // These three methods implement RaBitQ's two-stage search pattern and are
107
+ // These methods implement RaBitQ's two-stage search pattern and are
110
108
  // shared between the quantized (Q) and non-quantized (NotQ) query variants.
111
109
  // The intermediate class allows two-stage search code to work with both
112
110
  // variants via a single dynamic_cast.
@@ -116,8 +114,8 @@ struct RaBitQDistanceComputer : FlatCodesDistanceComputer {
116
114
  MetricType metric_type = MetricType::METRIC_L2;
117
115
  size_t nb_bits = 1;
118
116
 
119
- // Query norm for lower bound computation (g_error in rabitq-library)
120
- // This is the L2 norm of the rotated query: ||query - centroid||
117
+ // Query error factor for bound computation (g_error in rabitq-library)
118
+ // Used with f_error to compute error bounds for two-stage filtering
121
119
  float g_error = 0.0f;
122
120
 
123
121
  float symmetric_dis(idx_t /*i*/, idx_t /*j*/) override {
@@ -131,11 +129,6 @@ struct RaBitQDistanceComputer : FlatCodesDistanceComputer {
131
129
  // Compute full multi-bit distance (accurate)
132
130
  virtual float distance_to_code_full(const uint8_t* code) = 0;
133
131
 
134
- // Compute lower bound of distance using error bounds
135
- // Guarantees: actual_distance >= lower_bound_distance
136
- // Used for adaptive filtering in two-stage search
137
- virtual float lower_bound_distance(const uint8_t* code);
138
-
139
132
  // Override from FlatCodesDistanceComputer
140
133
  // Delegates to distance_to_code_full() for multi-bit distance computation
141
134
  float distance_to_code(const uint8_t* code) final {
@@ -180,9 +180,7 @@ void pack_multibit_codes(
180
180
  *
181
181
  * @param residual Original residual vector (data - centroid)
182
182
  * @param centroid Centroid vector (can be nullptr for zero centroid)
183
- * @param tmp_code Quantized ex-bit codes (before packing, after bit flipping)
184
183
  * @param d Dimensionality
185
- * @param ex_bits Number of extra bits
186
184
  * @param norm L2 norm of residual
187
185
  * @param ipnorm Unnormalized inner product between quantized and normalized
188
186
  * residual
@@ -192,9 +190,7 @@ void pack_multibit_codes(
192
190
  void compute_ex_factors(
193
191
  const float* residual,
194
192
  const float* centroid,
195
- const int* tmp_code,
196
193
  size_t d,
197
- size_t ex_bits,
198
194
  float norm,
199
195
  double ipnorm,
200
196
  ExtraBitsFactors& ex_factors,
@@ -210,45 +206,23 @@ void compute_ex_factors(
210
206
  ipnorm_inv = 1.0f;
211
207
  }
212
208
 
213
- // Reconstruct xu_cb from total_code
214
- // total_code was formed from: total_code[i] = (sign << ex_bits) +
215
- // ex_code[i] Reconstruction: xu_cb[i] = total_code[i] + cb
216
- const float cb = -(static_cast<float>(1 << ex_bits) - 0.5f);
217
- std::vector<float> xu_cb(d);
218
- for (size_t i = 0; i < d; i++) {
219
- xu_cb[i] = static_cast<float>(tmp_code[i]) + cb;
220
- }
221
-
222
209
  // Compute inner products needed for factors
223
- float l2_sqr = norm * norm;
224
- float ip_resi_xucb = fvec_inner_product(residual, xu_cb.data(), d);
210
+ float l2_sqr = norm * norm; // ||residual||^2 = ||x - c||^2
225
211
 
226
- // Compute factors
227
212
  if (metric_type == MetricType::METRIC_L2) {
228
- // For L2, no centroid correction needed in IVF setting
229
- // because residual = x - centroid, distance computed in residual space
213
+ // For L2: f_add_ex = ||residual||^2
214
+ // No centroid correction needed in IVF setting because
215
+ // residual = x - centroid, distance computed in residual space
230
216
  ex_factors.f_add_ex = l2_sqr;
231
217
  ex_factors.f_rescale_ex = ipnorm_inv * -2.0f * norm;
232
218
  } else {
233
- // For IP, centroid correction is needed
234
- float ip_resi_cent = 0;
235
- if (centroid != nullptr) {
236
- ip_resi_cent = fvec_inner_product(residual, centroid, d);
237
- }
238
-
239
- float ip_cent_xucb = 0;
240
- if (centroid != nullptr) {
241
- ip_cent_xucb = fvec_inner_product(centroid, xu_cb.data(), d);
242
- }
243
-
244
- // When ip_resi_xucb is zero, the correction term should be zero
245
- float correction_term = 0.0f;
246
- if (ip_resi_xucb != 0.0f) {
247
- correction_term = l2_sqr * ip_cent_xucb / ip_resi_xucb;
248
- }
249
-
250
- ex_factors.f_add_ex = 1 - ip_resi_cent + correction_term;
251
- ex_factors.f_rescale_ex = ipnorm_inv * -norm;
219
+ // For IP: direct dot-product formulation
220
+ // f_add_ex = <c, r> (dot product of centroid and residual)
221
+ // f_rescale_ex = ||r|| / ipnorm (positive scaling)
222
+ float c_dot_r =
223
+ centroid ? fvec_inner_product(residual, centroid, d) : 0.0f;
224
+ ex_factors.f_add_ex = c_dot_r;
225
+ ex_factors.f_rescale_ex = ipnorm_inv * norm;
252
226
  }
253
227
  }
254
228
 
@@ -290,12 +264,14 @@ void quantize_ex_bits(
290
264
  float norm_sqr = fvec_norm_L2sqr(residual, d);
291
265
  float norm = std::sqrt(norm_sqr);
292
266
 
293
- // Handle degenerate case
267
+ // Handle degenerate case: residual is (near-)zero, meaning x ≈ centroid.
268
+ // For both L2 and IP, f_add_ex and f_rescale_ex are trivially zero:
269
+ // L2: ||r||² ≈ 0, IP: <c,r> ≈ 0 and ||r||/ipnorm ≈ 0
294
270
  if (norm < 1e-10f) {
295
271
  size_t code_size = (d * ex_bits + 7) / 8;
296
272
  memset(ex_code, 0, code_size);
297
273
  ex_factors.f_add_ex = 0.0f;
298
- ex_factors.f_rescale_ex = 1.0f;
274
+ ex_factors.f_rescale_ex = 0.0f;
299
275
  return;
300
276
  }
301
277
 
@@ -349,9 +325,7 @@ void quantize_ex_bits(
349
325
  compute_ex_factors(
350
326
  residual,
351
327
  centroid, // Pass centroid for IP metric factor computation
352
- total_code.data(),
353
328
  d,
354
- ex_bits,
355
329
  norm,
356
330
  ipnorm,
357
331
  ex_factors,
@@ -60,9 +60,7 @@ void pack_multibit_codes(
60
60
  *
61
61
  * @param residual Original residual vector (data - centroid)
62
62
  * @param centroid Centroid vector (can be nullptr for zero centroid)
63
- * @param tmp_code Quantized ex-bit codes (unpacked integers)
64
63
  * @param d Dimensionality
65
- * @param ex_bits Number of extra bits
66
64
  * @param norm L2 norm of residual
67
65
  * @param ipnorm Unnormalized inner product
68
66
  * @param ex_factors Output factors structure
@@ -71,9 +69,7 @@ void pack_multibit_codes(
71
69
  void compute_ex_factors(
72
70
  const float* residual,
73
71
  const float* centroid,
74
- const int* tmp_code,
75
72
  size_t d,
76
- size_t ex_bits,
77
73
  float norm,
78
74
  double ipnorm,
79
75
  rabitq_utils::ExtraBitsFactors& ex_factors,
@@ -18,6 +18,7 @@
18
18
  #include <faiss/VectorTransform.h>
19
19
  #include <faiss/impl/FaissAssert.h>
20
20
  #include <faiss/impl/residual_quantizer_encode_steps.h>
21
+ #include <faiss/impl/simd_dispatch.h>
21
22
  #include <faiss/utils/distances.h>
22
23
  #include <faiss/utils/hamming.h>
23
24
  #include <faiss/utils/utils.h>
@@ -69,23 +70,26 @@ ResidualQuantizer::ResidualQuantizer() {
69
70
  }
70
71
 
71
72
  ResidualQuantizer::ResidualQuantizer(
72
- size_t d,
73
- const std::vector<size_t>& nbits,
74
- Search_type_t search_type)
73
+ size_t d_in,
74
+ const std::vector<size_t>& nbits_in,
75
+ Search_type_t search_type_in)
75
76
  : ResidualQuantizer() {
76
- this->search_type = search_type;
77
- this->d = d;
78
- M = nbits.size();
79
- this->nbits = nbits;
77
+ this->search_type = search_type_in;
78
+ this->d = d_in;
79
+ M = nbits_in.size();
80
+ this->nbits = nbits_in;
80
81
  set_derived_values();
81
82
  }
82
83
 
83
84
  ResidualQuantizer::ResidualQuantizer(
84
- size_t d,
85
- size_t M,
86
- size_t nbits,
87
- Search_type_t search_type)
88
- : ResidualQuantizer(d, std::vector<size_t>(M, nbits), search_type) {}
85
+ size_t d_in,
86
+ size_t M_in,
87
+ size_t nbits_in,
88
+ Search_type_t search_type_in)
89
+ : ResidualQuantizer(
90
+ d_in,
91
+ std::vector<size_t>(M_in, nbits_in),
92
+ search_type_in) {}
89
93
 
90
94
  void ResidualQuantizer::initialize_from(
91
95
  const ResidualQuantizer& other,
@@ -141,7 +145,7 @@ void ResidualQuantizer::train(size_t n, const float* x) {
141
145
  double t0 = getmillisecs();
142
146
  double clustering_time = 0;
143
147
 
144
- for (int m = 0; m < M; m++) {
148
+ for (size_t m = 0; m < M; m++) {
145
149
  int K = 1 << nbits[m];
146
150
 
147
151
  // on which residuals to train
@@ -156,7 +160,7 @@ void ResidualQuantizer::train(size_t n, const float* x) {
156
160
  }
157
161
  train_residuals = residuals1;
158
162
  }
159
- std::vector<float> codebooks;
163
+ std::vector<float> cur_codebooks;
160
164
  float obj = 0;
161
165
 
162
166
  std::unique_ptr<Index> assign_index;
@@ -174,7 +178,7 @@ void ResidualQuantizer::train(size_t n, const float* x) {
174
178
  train_residuals.size() / d,
175
179
  train_residuals.data(),
176
180
  *assign_index.get());
177
- codebooks.swap(clus.centroids);
181
+ cur_codebooks.swap(clus.centroids);
178
182
  assign_index->reset();
179
183
  obj = clus.iteration_stats.back().obj;
180
184
  } else { // progressive dim clustering
@@ -184,14 +188,14 @@ void ResidualQuantizer::train(size_t n, const float* x) {
184
188
  train_residuals.size() / d,
185
189
  train_residuals.data(),
186
190
  assign_index_factory ? *assign_index_factory : default_fac);
187
- codebooks.swap(clus.centroids);
191
+ cur_codebooks.swap(clus.centroids);
188
192
  obj = clus.iteration_stats.back().obj;
189
193
  }
190
194
  clustering_time += (getmillisecs() - t1) / 1000;
191
195
 
192
196
  memcpy(this->codebooks.data() + codebook_offsets[m] * d,
193
- codebooks.data(),
194
- codebooks.size() * sizeof(codebooks[0]));
197
+ cur_codebooks.data(),
198
+ cur_codebooks.size() * sizeof(cur_codebooks[0]));
195
199
 
196
200
  // quantize using the new codebooks
197
201
 
@@ -220,7 +224,7 @@ void ResidualQuantizer::train(size_t n, const float* x) {
220
224
  beam_search_encode_step(
221
225
  d,
222
226
  K,
223
- codebooks.data(),
227
+ cur_codebooks.data(),
224
228
  i1 - i0,
225
229
  cur_beam_size,
226
230
  residuals.data() + i0 * cur_beam_size * d,
@@ -238,16 +242,16 @@ void ResidualQuantizer::train(size_t n, const float* x) {
238
242
  distances.swap(new_distances);
239
243
 
240
244
  float sum_distances = 0;
241
- for (int j = 0; j < distances.size(); j++) {
245
+ for (size_t j = 0; j < distances.size(); j++) {
242
246
  sum_distances += distances[j];
243
247
  }
244
248
 
245
249
  if (verbose) {
246
- printf("[%.3f s, %.3f s clustering] train stage %d, %d bits, kmeans objective %g, "
250
+ printf("[%.3f s, %.3f s clustering] train stage %zd, %d bits, kmeans objective %g, "
247
251
  "total distance %g, beam_size %d->%d (batch size %zd)\n",
248
252
  (getmillisecs() - t0) / 1000,
249
253
  clustering_time,
250
- m,
254
+ size_t(m),
251
255
  int(nbits[m]),
252
256
  obj,
253
257
  sum_distances,
@@ -274,10 +278,12 @@ void ResidualQuantizer::train(size_t n, const float* x) {
274
278
  // find min and max norms
275
279
  std::vector<float> norms(n);
276
280
 
277
- for (size_t i = 0; i < n; i++) {
278
- norms[i] = fvec_L2sqr(
279
- x + i * d, residuals.data() + i * cur_beam_size * d, d);
280
- }
281
+ with_simd_level([&]<SIMDLevel SL>() {
282
+ for (size_t i = 0; i < n; i++) {
283
+ norms[i] = fvec_L2sqr<SL>(
284
+ x + i * d, residuals.data() + i * cur_beam_size * d, d);
285
+ }
286
+ });
281
287
 
282
288
  // fvec_norms_L2sqr(norms.data(), x, d, n);
283
289
  train_norm(n, norms.data());
@@ -311,7 +317,7 @@ float ResidualQuantizer::retrain_AQ_codebook(size_t n, const float* x) {
311
317
  std::vector<float> C(n * total_codebook_size);
312
318
  for (size_t i = 0; i < n; i++) {
313
319
  BitstringReader bsr(codes.data() + i * code_size, code_size);
314
- for (int m = 0; m < M; m++) {
320
+ for (size_t m = 0; m < M; m++) {
315
321
  int idx = bsr.read(nbits[m]);
316
322
  C[i + (codebook_offsets[m] + idx) * n] = 1;
317
323
  }
@@ -393,11 +399,13 @@ float ResidualQuantizer::retrain_AQ_codebook(size_t n, const float* x) {
393
399
  }
394
400
 
395
401
  float output_recons_error = 0;
396
- for (size_t j = 0; j < d; j++) {
397
- output_recons_error += fvec_norm_L2sqr(
398
- xt.data() + total_codebook_size + n * j,
399
- n - total_codebook_size);
400
- }
402
+ with_simd_level([&]<SIMDLevel SL>() {
403
+ for (size_t j = 0; j < d; j++) {
404
+ output_recons_error += fvec_norm_L2sqr<SL>(
405
+ xt.data() + total_codebook_size + n * j,
406
+ n - total_codebook_size);
407
+ }
408
+ });
401
409
  if (verbose) {
402
410
  printf(" output quantization error %g\n", output_recons_error);
403
411
  }
@@ -13,7 +13,7 @@
13
13
  #include <faiss/Clustering.h>
14
14
  #include <faiss/impl/AdditiveQuantizer.h>
15
15
 
16
- #include <faiss/utils/approx_topk/mode.h>
16
+ #include <faiss/impl/approx_topk/approx_topk.h>
17
17
 
18
18
  namespace faiss {
19
19