faiss 0.6.1 → 0.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/lib/faiss/version.rb +1 -1
  4. data/vendor/faiss/faiss/AutoTune.cpp +3 -1
  5. data/vendor/faiss/faiss/Clustering.cpp +9 -1
  6. data/vendor/faiss/faiss/IVFlib.cpp +14 -3
  7. data/vendor/faiss/faiss/Index.h +2 -2
  8. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +9 -10
  9. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +2 -3
  10. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +1 -2
  11. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +10 -12
  12. data/vendor/faiss/faiss/IndexBinaryHash.cpp +5 -9
  13. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +5 -7
  14. data/vendor/faiss/faiss/IndexEDEN.cpp +273 -0
  15. data/vendor/faiss/faiss/IndexEDEN.h +57 -0
  16. data/vendor/faiss/faiss/IndexFastScan.cpp +15 -4
  17. data/vendor/faiss/faiss/IndexFlat.cpp +13 -50
  18. data/vendor/faiss/faiss/IndexHNSW.cpp +177 -148
  19. data/vendor/faiss/faiss/IndexIDMap.cpp +16 -3
  20. data/vendor/faiss/faiss/IndexIDMap.h +2 -0
  21. data/vendor/faiss/faiss/IndexIVF.cpp +19 -8
  22. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +3 -3
  23. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +3 -4
  24. data/vendor/faiss/faiss/IndexIVFEDEN.cpp +302 -0
  25. data/vendor/faiss/faiss/IndexIVFEDEN.h +70 -0
  26. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +5 -6
  27. data/vendor/faiss/faiss/IndexIVFFlat.cpp +6 -5
  28. data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +3 -3
  29. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +1 -1
  30. data/vendor/faiss/faiss/IndexIVFPQ.cpp +42 -25
  31. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +0 -1
  32. data/vendor/faiss/faiss/IndexIVFPQR.cpp +2 -3
  33. data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +23 -62
  34. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +180 -76
  35. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +5 -4
  36. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +8 -6
  37. data/vendor/faiss/faiss/IndexLSH.cpp +2 -3
  38. data/vendor/faiss/faiss/IndexLattice.cpp +5 -0
  39. data/vendor/faiss/faiss/IndexNNDescent.cpp +10 -3
  40. data/vendor/faiss/faiss/IndexNSG.cpp +8 -4
  41. data/vendor/faiss/faiss/IndexPQ.cpp +6 -8
  42. data/vendor/faiss/faiss/IndexPreTransform.cpp +15 -0
  43. data/vendor/faiss/faiss/IndexRaBitQ.cpp +2 -2
  44. data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +1 -2
  45. data/vendor/faiss/faiss/IndexRaBitQFastScan.h +5 -1
  46. data/vendor/faiss/faiss/IndexRefine.cpp +30 -1
  47. data/vendor/faiss/faiss/IndexReplicas.cpp +1 -2
  48. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +68 -6
  49. data/vendor/faiss/faiss/IndexScalarQuantizer.h +10 -0
  50. data/vendor/faiss/faiss/IndexShards.cpp +2 -2
  51. data/vendor/faiss/faiss/IndexShardsIVF.cpp +2 -2
  52. data/vendor/faiss/faiss/MetaIndexes.cpp +2 -4
  53. data/vendor/faiss/faiss/SuperKMeans.cpp +256 -240
  54. data/vendor/faiss/faiss/SuperKMeans.h +30 -0
  55. data/vendor/faiss/faiss/VectorTransform.cpp +33 -2
  56. data/vendor/faiss/faiss/clone_index.cpp +5 -0
  57. data/vendor/faiss/faiss/cppcontrib/SaDecodeKernels.h +1 -1
  58. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-neon-inl.h +902 -12
  59. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-neon-inl.h +702 -10
  60. data/vendor/faiss/faiss/factory_tools.cpp +51 -4
  61. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +11 -11
  62. data/vendor/faiss/faiss/gpu/GpuIndex.h +34 -11
  63. data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +47 -0
  64. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +17 -0
  65. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +16 -0
  66. data/vendor/faiss/faiss/gpu/GpuResources.h +3 -2
  67. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +11 -12
  68. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +3 -3
  69. data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +1 -1
  70. data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +2 -2
  71. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +180 -0
  72. data/vendor/faiss/faiss/gpu_metal/MetalDistance.h +87 -0
  73. data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +7 -0
  74. data/vendor/faiss/faiss/gpu_metal/MetalIndexIVFFlat.h +177 -0
  75. data/vendor/faiss/faiss/gpu_metal/MetalIndexIVFPQ.h +88 -0
  76. data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +48 -3
  77. data/vendor/faiss/faiss/gpu_metal/MetalPythonBridge.h +45 -0
  78. data/vendor/faiss/faiss/gpu_metal/impl/MetalIVFFlat.h +193 -0
  79. data/vendor/faiss/faiss/gpu_metal/impl/MetalIVFPQ.h +134 -0
  80. data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +2 -2
  81. data/vendor/faiss/faiss/impl/DistanceComputer.h +34 -0
  82. data/vendor/faiss/faiss/impl/EDENQuantizer.h +119 -0
  83. data/vendor/faiss/faiss/impl/HNSW.cpp +658 -344
  84. data/vendor/faiss/faiss/impl/HNSW.h +51 -13
  85. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +2 -2
  86. data/vendor/faiss/faiss/impl/NSG.cpp +18 -12
  87. data/vendor/faiss/faiss/impl/Panorama.h +20 -7
  88. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +152 -84
  89. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +59 -24
  90. data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +45 -37
  91. data/vendor/faiss/faiss/impl/RaBitQUtils.h +35 -0
  92. data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +175 -68
  93. data/vendor/faiss/faiss/impl/RaBitQuantizer.h +19 -0
  94. data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.cpp +2 -11
  95. data/vendor/faiss/faiss/impl/ResultHandler.h +26 -31
  96. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +522 -58
  97. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +70 -0
  98. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +2 -2
  99. data/vendor/faiss/faiss/impl/VisitedTable.cpp +33 -13
  100. data/vendor/faiss/faiss/impl/VisitedTable.h +88 -33
  101. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +1 -1
  102. data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +4 -4
  103. data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +38 -3
  104. data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +1 -1
  105. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +35 -43
  106. data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +64 -15
  107. data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +86 -40
  108. data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +81 -50
  109. data/vendor/faiss/faiss/impl/index_read.cpp +476 -75
  110. data/vendor/faiss/faiss/impl/index_write.cpp +56 -4
  111. data/vendor/faiss/faiss/impl/io_macros.h +25 -0
  112. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +8 -9
  113. data/vendor/faiss/faiss/impl/platform_macros.h +15 -9
  114. data/vendor/faiss/faiss/impl/polysemous_training/avx512.cpp +284 -0
  115. data/vendor/faiss/faiss/impl/polysemous_training/dispatch.h +115 -0
  116. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +0 -1
  117. data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +26 -15
  118. data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +6 -4
  119. data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +2 -0
  120. data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +2 -0
  121. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +20 -0
  122. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +36 -0
  123. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp +5 -0
  124. data/vendor/faiss/faiss/impl/pq_code_distance/pq_scan_impl.h +105 -0
  125. data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +2 -0
  126. data/vendor/faiss/faiss/impl/result_handler/ResultHandler.cpp +195 -0
  127. data/vendor/faiss/faiss/impl/result_handler/avx2.cpp +133 -0
  128. data/vendor/faiss/faiss/impl/result_handler/avx512.cpp +281 -0
  129. data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer-avx2.cpp +72 -0
  130. data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer-avx512.cpp +228 -0
  131. data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer.cpp +882 -0
  132. data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +6 -0
  133. data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +336 -26
  134. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +331 -32
  135. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-impl.h +553 -0
  136. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-spr.cpp +558 -0
  137. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +284 -45
  138. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +502 -3
  139. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +157 -32
  140. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +26 -0
  141. data/vendor/faiss/faiss/impl/simd_dispatch.h +86 -8
  142. data/vendor/faiss/faiss/index_factory.cpp +37 -7
  143. data/vendor/faiss/faiss/index_io.h +16 -0
  144. data/vendor/faiss/faiss/invlists/DirectMap.cpp +5 -2
  145. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +15 -15
  146. data/vendor/faiss/faiss/invlists/InvertedLists.h +2 -2
  147. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +19 -4
  148. data/vendor/faiss/faiss/python/python_callbacks.cpp +3 -1
  149. data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +60 -0
  150. data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +26 -1
  151. data/vendor/faiss/faiss/svs/IndexSVSFlat.h +13 -0
  152. data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +1 -1
  153. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +1 -1
  154. data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +150 -23
  155. data/vendor/faiss/faiss/svs/IndexSVSVamana.h +30 -7
  156. data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.cpp +3 -2
  157. data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +2 -1
  158. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +65 -25
  159. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +3 -2
  160. data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +1 -1
  161. data/vendor/faiss/faiss/utils/bf16.h +34 -0
  162. data/vendor/faiss/faiss/utils/distances.cpp +14 -2
  163. data/vendor/faiss/faiss/utils/distances_simd.cpp +4 -4
  164. data/vendor/faiss/faiss/utils/extra_distances.cpp +4 -14
  165. data/vendor/faiss/faiss/utils/extra_distances.h +1 -2
  166. data/vendor/faiss/faiss/utils/hamming.cpp +9 -9
  167. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +2 -1
  168. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512_spr.cpp +15 -0
  169. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +6 -30
  170. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512_spr.h +171 -0
  171. data/vendor/faiss/faiss/utils/partitioning.cpp +0 -2
  172. data/vendor/faiss/faiss/utils/quantize_lut.cpp +29 -8
  173. data/vendor/faiss/faiss/utils/rabitq_simd.h +202 -0
  174. data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +0 -1
  175. data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +263 -15
  176. data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +160 -18
  177. data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +14 -68
  178. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +245 -0
  179. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +273 -0
  180. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512_spr.cpp +435 -0
  181. data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +11 -0
  182. data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +143 -6
  183. data/vendor/faiss/faiss/utils/simd_levels.cpp +56 -2
  184. data/vendor/faiss/faiss/utils/simd_levels.h +14 -0
  185. data/vendor/faiss/faiss/utils/utils.cpp +9 -27
  186. metadata +27 -2
@@ -20,6 +20,10 @@ SIMDLevel SIMDConfig::level = SIMDLevel::NONE;
20
20
  // Bitmask of supported SIMD levels (1 << SIMDLevel)
21
21
  uint64_t SIMDConfig::supported_simd_levels = 0;
22
22
 
23
+ // Microarchitecture flags (x86). Default false; set by
24
+ // detect_x86_uarch_flags() at load time.
25
+ bool SIMDConfig::avx512_split = false;
26
+
23
27
  // ARM SVE runtime detection
24
28
  #if defined(__aarch64__) || defined(_M_ARM64)
25
29
 
@@ -53,6 +57,43 @@ static bool has_sve() {
53
57
  }
54
58
  #endif
55
59
 
60
+ // Detect x86 microarchitecture flags used for kernel routing. Uses raw
61
+ // cpuid so it is safe to run on any CPU regardless of compiled SIMD level.
62
+ #if defined(__x86_64__)
63
+ namespace {
64
+ void detect_x86_uarch_flags() {
65
+ unsigned int eax, ebx, ecx, edx;
66
+
67
+ // Vendor string (CPUID.0): "AuthenticAMD" is EBX="Auth", EDX="enti",
68
+ // ECX="cAMD".
69
+ eax = 0;
70
+ ecx = 0;
71
+ asm volatile("cpuid"
72
+ : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx)
73
+ : "a"(eax), "c"(ecx));
74
+ const bool is_amd =
75
+ ebx == 0x68747541u && edx == 0x69746e65u && ecx == 0x444d4163u;
76
+
77
+ // Family/model (CPUID.1 EAX).
78
+ eax = 1;
79
+ ecx = 0;
80
+ asm volatile("cpuid"
81
+ : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx)
82
+ : "a"(eax), "c"(ecx));
83
+ const unsigned int base_family = (eax >> 8) & 0xfu;
84
+ const unsigned int display_family =
85
+ base_family + (base_family == 0xfu ? ((eax >> 20) & 0xffu) : 0u);
86
+ // AMD Zen 4 / Zen 4c (Bergamo) is family 0x19 and splits AVX-512.
87
+ // (Zen 5, family 0x1A, has a native 512-bit datapath and is excluded.)
88
+ SIMDConfig::avx512_split = is_amd && display_family == 0x19u;
89
+ }
90
+ } // namespace
91
+ #else
92
+ namespace {
93
+ void detect_x86_uarch_flags() {}
94
+ } // namespace
95
+ #endif
96
+
56
97
  #ifdef FAISS_ENABLE_DD
57
98
 
58
99
  // =============================================================================
@@ -101,6 +142,8 @@ bool SIMDConfig::is_simd_level_available(SIMDLevel l) {
101
142
  SIMDLevel SIMDConfig::auto_detect_simd_level() {
102
143
  SIMDLevel detected_level = SIMDLevel::NONE;
103
144
 
145
+ detect_x86_uarch_flags();
146
+
104
147
  #if defined(__x86_64__) && \
105
148
  (defined(COMPILE_SIMD_AVX2) || defined(COMPILE_SIMD_AVX512))
106
149
  unsigned int eax, ebx, ecx, edx;
@@ -129,6 +172,9 @@ SIMDLevel SIMDConfig::auto_detect_simd_level() {
129
172
  asm volatile("cpuid"
130
173
  : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx)
131
174
  : "a"(eax), "c"(ecx));
175
+ // Save EDX before xgetbv clobbers it — needed for
176
+ // AVX512_FP16 check (bit 23) in the SPR detection below.
177
+ unsigned int cpuid7_edx = edx;
132
178
 
133
179
  unsigned int xcr0;
134
180
  asm volatile("xgetbv" : "=a"(xcr0), "=d"(edx) : "c"(0));
@@ -155,8 +201,15 @@ SIMDLevel SIMDConfig::auto_detect_simd_level() {
155
201
  (1 << static_cast<int>(SIMDLevel::AVX512));
156
202
 
157
203
  #if defined(COMPILE_SIMD_AVX512_SPR)
158
- // Check for Sapphire Rapids features (AVX512_BF16)
204
+ // Check for Sapphire Rapids features.
205
+ // The SPR code path is compiled with -mavx512fp16, so we
206
+ // must verify both AVX512_BF16 and AVX512_FP16 before
207
+ // dispatching to it. AMD Zen 4 (bergamo) has BF16 but
208
+ // not FP16 — using SPR code there causes SIGILL.
159
209
  // CPUID EAX=7, ECX=1: EAX bit 5 = AVX512_BF16
210
+ // CPUID EAX=7, ECX=0: EDX bit 23 = AVX512_FP16
211
+ // (Linux: X86_FEATURE_AVX512_FP16 = 18*32+23)
212
+ bool has_avx512_fp16 = (cpuid7_edx & (1 << 23)) != 0;
160
213
  unsigned int eax1, ebx1, ecx1, edx1;
161
214
  eax1 = 7;
162
215
  ecx1 = 1;
@@ -164,7 +217,7 @@ SIMDLevel SIMDConfig::auto_detect_simd_level() {
164
217
  : "=a"(eax1), "=b"(ebx1), "=c"(ecx1), "=d"(edx1)
165
218
  : "a"(eax1), "c"(ecx1));
166
219
  bool has_avx512_bf16 = (eax1 & (1 << 5)) != 0;
167
- if (has_avx512_bf16) {
220
+ if (has_avx512_bf16 && has_avx512_fp16) {
168
221
  detected_level = SIMDLevel::AVX512_SPR;
169
222
  supported_simd_levels |=
170
223
  (1 << static_cast<int>(SIMDLevel::AVX512_SPR));
@@ -254,6 +307,7 @@ bool SIMDConfig::is_simd_level_available(SIMDLevel l) {
254
307
  }
255
308
 
256
309
  SIMDLevel SIMDConfig::auto_detect_simd_level() {
310
+ detect_x86_uarch_flags();
257
311
  // In static mode, return the compiled-in level
258
312
  #if defined(COMPILE_SIMD_AVX512_SPR)
259
313
  return SIMDLevel::AVX512_SPR;
@@ -161,8 +161,22 @@ struct FAISS_API SIMDConfig {
161
161
  /// Returns bitmask of supported SIMD levels (1 << SIMDLevel).
162
162
  static uint64_t supported_simd_levels;
163
163
 
164
+ /// CPU implements AVX-512 by splitting over a 256-bit datapath
165
+ /// (AMD Zen 4 / Zen 4c "Bergamo", family 0x19). On such CPUs 512-bit
166
+ /// ops give no throughput gain, so the fast-scan QBS path prefers the
167
+ /// 256-bit kernel.
168
+ static bool avx512_split;
169
+
164
170
  static SIMDLevel auto_detect_simd_level();
165
171
 
172
+ static constexpr bool has_dynamic_dispatch() {
173
+ #ifdef FAISS_ENABLE_DD
174
+ return true;
175
+ #else
176
+ return false;
177
+ #endif
178
+ }
179
+
166
180
  SIMDConfig(const char** faiss_simd_level_env = nullptr);
167
181
 
168
182
  /// Set the SIMD level. Throws FaissException if level is not supported.
@@ -30,6 +30,7 @@
30
30
  #include <algorithm>
31
31
  #include <set>
32
32
  #include <type_traits>
33
+ #include <unordered_set>
33
34
  #include <vector>
34
35
 
35
36
  #include <faiss/impl/AuxIndexStructures.h>
@@ -362,39 +363,20 @@ size_t ranklist_intersection_size(
362
363
  const int64_t* v2_in) {
363
364
  if (k2 > k1)
364
365
  return ranklist_intersection_size(k2, v2_in, k1, v1);
365
- int64_t* v2 = new int64_t[k2];
366
- memcpy(v2, v2_in, sizeof(int64_t) * k2);
367
- std::sort(v2, v2 + k2);
368
- { // de-dup v2
369
- int64_t prev = -1;
370
- size_t wp = 0;
371
- for (size_t i = 0; i < k2; i++) {
372
- if (v2[i] != prev) {
373
- v2[wp++] = prev = v2[i];
374
- }
366
+ // erase-on-hit avoids double-counting; negatives are padding, not IDs
367
+ std::unordered_set<int64_t> remaining;
368
+ remaining.reserve(k2);
369
+ for (size_t i = 0; i < k2; i++) {
370
+ if (v2_in[i] >= 0) {
371
+ remaining.insert(v2_in[i]);
375
372
  }
376
- k2 = wp;
377
373
  }
378
- const int64_t seen_flag = int64_t{1} << 60;
379
374
  size_t count = 0;
380
375
  for (size_t i = 0; i < k1; i++) {
381
- int64_t q = v1[i];
382
- size_t i0 = 0, i1 = k2;
383
- while (i0 + 1 < i1) {
384
- size_t imed = (i1 + i0) / 2;
385
- int64_t piv = v2[imed] & ~seen_flag;
386
- if (piv <= q)
387
- i0 = imed;
388
- else
389
- i1 = imed;
390
- }
391
- if (v2[i0] == q) {
376
+ if (remaining.erase(v1[i]) != 0) {
392
377
  count++;
393
- v2[i0] |= seen_flag;
394
378
  }
395
379
  }
396
- delete[] v2;
397
-
398
380
  return count;
399
381
  }
400
382
 
@@ -462,7 +444,7 @@ uint64_t ivec_checksum(size_t n, const int32_t* assigned) {
462
444
  uint64_t bvec_checksum(size_t n, const uint8_t* a) {
463
445
  uint64_t cs = ivec_checksum(n / 4, (const int32_t*)a);
464
446
  for (size_t i = n / 4 * 4; i < n; i++) {
465
- cs = cs * 65713 + a[n] * 1686049;
447
+ cs = cs * 65713 + a[i] * 1686049;
466
448
  }
467
449
  return cs;
468
450
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faiss
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
@@ -85,6 +85,8 @@ files:
85
85
  - vendor/faiss/faiss/IndexBinaryHash.h
86
86
  - vendor/faiss/faiss/IndexBinaryIVF.cpp
87
87
  - vendor/faiss/faiss/IndexBinaryIVF.h
88
+ - vendor/faiss/faiss/IndexEDEN.cpp
89
+ - vendor/faiss/faiss/IndexEDEN.h
88
90
  - vendor/faiss/faiss/IndexFastScan.cpp
89
91
  - vendor/faiss/faiss/IndexFastScan.h
90
92
  - vendor/faiss/faiss/IndexFlat.cpp
@@ -101,6 +103,8 @@ files:
101
103
  - vendor/faiss/faiss/IndexIVFAdditiveQuantizer.h
102
104
  - vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp
103
105
  - vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h
106
+ - vendor/faiss/faiss/IndexIVFEDEN.cpp
107
+ - vendor/faiss/faiss/IndexIVFEDEN.h
104
108
  - vendor/faiss/faiss/IndexIVFFastScan.cpp
105
109
  - vendor/faiss/faiss/IndexIVFFastScan.h
106
110
  - vendor/faiss/faiss/IndexIVFFlat.cpp
@@ -233,12 +237,18 @@ files:
233
237
  - vendor/faiss/faiss/gpu/utils/Timer.h
234
238
  - vendor/faiss/faiss/gpu_metal/GpuIndexFlat.h
235
239
  - vendor/faiss/faiss/gpu_metal/MetalCloner.h
240
+ - vendor/faiss/faiss/gpu_metal/MetalDistance.h
236
241
  - vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h
237
242
  - vendor/faiss/faiss/gpu_metal/MetalIndex.h
238
243
  - vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h
244
+ - vendor/faiss/faiss/gpu_metal/MetalIndexIVFFlat.h
245
+ - vendor/faiss/faiss/gpu_metal/MetalIndexIVFPQ.h
239
246
  - vendor/faiss/faiss/gpu_metal/MetalKernels.h
247
+ - vendor/faiss/faiss/gpu_metal/MetalPythonBridge.h
240
248
  - vendor/faiss/faiss/gpu_metal/MetalResources.h
241
249
  - vendor/faiss/faiss/gpu_metal/StandardMetalResources.h
250
+ - vendor/faiss/faiss/gpu_metal/impl/MetalIVFFlat.h
251
+ - vendor/faiss/faiss/gpu_metal/impl/MetalIVFPQ.h
242
252
  - vendor/faiss/faiss/impl/AdSampling.cpp
243
253
  - vendor/faiss/faiss/impl/AdSampling.h
244
254
  - vendor/faiss/faiss/impl/AdditiveQuantizer.cpp
@@ -254,6 +264,7 @@ files:
254
264
  - vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp
255
265
  - vendor/faiss/faiss/impl/CodePackerRaBitQ.h
256
266
  - vendor/faiss/faiss/impl/DistanceComputer.h
267
+ - vendor/faiss/faiss/impl/EDENQuantizer.h
257
268
  - vendor/faiss/faiss/impl/FaissAssert.h
258
269
  - vendor/faiss/faiss/impl/FaissException.cpp
259
270
  - vendor/faiss/faiss/impl/FaissException.h
@@ -352,6 +363,8 @@ files:
352
363
  - vendor/faiss/faiss/impl/mapped_io.h
353
364
  - vendor/faiss/faiss/impl/maybe_owned_vector.h
354
365
  - vendor/faiss/faiss/impl/platform_macros.h
366
+ - vendor/faiss/faiss/impl/polysemous_training/avx512.cpp
367
+ - vendor/faiss/faiss/impl/polysemous_training/dispatch.h
355
368
  - vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h
356
369
  - vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp
357
370
  - vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h
@@ -365,15 +378,24 @@ files:
365
378
  - vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h
366
379
  - vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h
367
380
  - vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp
381
+ - vendor/faiss/faiss/impl/pq_code_distance/pq_scan_impl.h
368
382
  - vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp
369
383
  - vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp
370
384
  - vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h
385
+ - vendor/faiss/faiss/impl/result_handler/ResultHandler.cpp
386
+ - vendor/faiss/faiss/impl/result_handler/avx2.cpp
387
+ - vendor/faiss/faiss/impl/result_handler/avx512.cpp
388
+ - vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer-avx2.cpp
389
+ - vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer-avx512.cpp
390
+ - vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer.cpp
371
391
  - vendor/faiss/faiss/impl/scalar_quantizer/codecs.h
372
392
  - vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h
373
393
  - vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h
374
394
  - vendor/faiss/faiss/impl/scalar_quantizer/scanners.h
375
395
  - vendor/faiss/faiss/impl/scalar_quantizer/similarities.h
376
396
  - vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp
397
+ - vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-impl.h
398
+ - vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-spr.cpp
377
399
  - vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp
378
400
  - vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h
379
401
  - vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp
@@ -453,8 +475,10 @@ files:
453
475
  - vendor/faiss/faiss/utils/hamming_distance/common.h
454
476
  - vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp
455
477
  - vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp
478
+ - vendor/faiss/faiss/utils/hamming_distance/hamming_avx512_spr.cpp
456
479
  - vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h
457
480
  - vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h
481
+ - vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512_spr.h
458
482
  - vendor/faiss/faiss/utils/hamming_distance/hamming_computer-generic.h
459
483
  - vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h
460
484
  - vendor/faiss/faiss/utils/hamming_distance/hamming_computer-rvv.h
@@ -489,6 +513,7 @@ files:
489
513
  - vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h
490
514
  - vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp
491
515
  - vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp
516
+ - vendor/faiss/faiss/utils/simd_impl/rabitq_avx512_spr.cpp
492
517
  - vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp
493
518
  - vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp
494
519
  - vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h
@@ -521,7 +546,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
521
546
  - !ruby/object:Gem::Version
522
547
  version: '0'
523
548
  requirements: []
524
- rubygems_version: 4.0.10
549
+ rubygems_version: 4.0.14
525
550
  specification_version: 4
526
551
  summary: Efficient similarity search and clustering for Ruby
527
552
  test_files: []