faiss 0.6.2 → 0.6.4

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 (178) 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/Clustering.h +8 -0
  7. data/vendor/faiss/faiss/IVFlib.cpp +14 -3
  8. data/vendor/faiss/faiss/Index.h +2 -2
  9. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +9 -10
  10. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +2 -3
  11. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +24 -4
  12. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +16 -145
  13. data/vendor/faiss/faiss/IndexBinaryHNSW.h +0 -6
  14. data/vendor/faiss/faiss/IndexBinaryHash.cpp +5 -9
  15. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +8 -18
  16. data/vendor/faiss/faiss/IndexBinaryIVF.h +8 -1
  17. data/vendor/faiss/faiss/IndexEDEN.cpp +273 -0
  18. data/vendor/faiss/faiss/IndexEDEN.h +57 -0
  19. data/vendor/faiss/faiss/IndexFastScan.cpp +15 -4
  20. data/vendor/faiss/faiss/IndexFlat.cpp +21 -54
  21. data/vendor/faiss/faiss/IndexFlat.h +2 -2
  22. data/vendor/faiss/faiss/IndexHNSW.cpp +311 -102
  23. data/vendor/faiss/faiss/IndexHNSW.h +31 -7
  24. data/vendor/faiss/faiss/IndexIDMap.cpp +26 -8
  25. data/vendor/faiss/faiss/IndexIDMap.h +2 -0
  26. data/vendor/faiss/faiss/IndexIVF.cpp +36 -10
  27. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +1 -1
  28. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +3 -4
  29. data/vendor/faiss/faiss/IndexIVFEDEN.cpp +302 -0
  30. data/vendor/faiss/faiss/IndexIVFEDEN.h +70 -0
  31. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +5 -6
  32. data/vendor/faiss/faiss/IndexIVFFlat.cpp +3 -4
  33. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +1 -1
  34. data/vendor/faiss/faiss/IndexIVFPQ.cpp +49 -23
  35. data/vendor/faiss/faiss/IndexIVFPQ.h +11 -0
  36. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +0 -1
  37. data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +19 -49
  38. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +180 -76
  39. data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +5 -4
  40. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +8 -6
  41. data/vendor/faiss/faiss/IndexLSH.cpp +2 -3
  42. data/vendor/faiss/faiss/IndexLattice.cpp +5 -0
  43. data/vendor/faiss/faiss/IndexNNDescent.cpp +9 -2
  44. data/vendor/faiss/faiss/IndexNSG.cpp +7 -2
  45. data/vendor/faiss/faiss/IndexPQ.cpp +6 -8
  46. data/vendor/faiss/faiss/IndexPreTransform.cpp +15 -0
  47. data/vendor/faiss/faiss/IndexRaBitQ.cpp +2 -2
  48. data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +1 -2
  49. data/vendor/faiss/faiss/IndexRaBitQFastScan.h +5 -1
  50. data/vendor/faiss/faiss/IndexRefine.cpp +30 -1
  51. data/vendor/faiss/faiss/IndexReplicas.cpp +1 -2
  52. data/vendor/faiss/faiss/IndexShards.cpp +5 -5
  53. data/vendor/faiss/faiss/IndexShardsIVF.cpp +6 -5
  54. data/vendor/faiss/faiss/MetaIndexes.cpp +2 -4
  55. data/vendor/faiss/faiss/SuperKMeans.cpp +286 -247
  56. data/vendor/faiss/faiss/SuperKMeans.h +33 -2
  57. data/vendor/faiss/faiss/VectorTransform.cpp +71 -2
  58. data/vendor/faiss/faiss/VectorTransform.h +3 -0
  59. data/vendor/faiss/faiss/clone_index.cpp +8 -0
  60. data/vendor/faiss/faiss/factory_tools.cpp +47 -4
  61. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +11 -11
  62. data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +1 -5
  63. data/vendor/faiss/faiss/gpu/GpuDistance.h +2 -5
  64. data/vendor/faiss/faiss/gpu/GpuIndex.h +38 -16
  65. data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +71 -1
  66. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +17 -0
  67. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +16 -0
  68. data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +1 -1
  69. data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +2 -2
  70. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +180 -0
  71. data/vendor/faiss/faiss/gpu_metal/MetalIndexIVFFlat.h +1 -5
  72. data/vendor/faiss/faiss/gpu_metal/MetalIndexIVFPQ.h +88 -0
  73. data/vendor/faiss/faiss/gpu_metal/impl/MetalIVFPQ.h +134 -0
  74. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +1 -1
  75. data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +7 -4
  76. data/vendor/faiss/faiss/impl/DistanceComputer.h +34 -0
  77. data/vendor/faiss/faiss/impl/EDENQuantizer.h +119 -0
  78. data/vendor/faiss/faiss/impl/HNSW.cpp +528 -267
  79. data/vendor/faiss/faiss/impl/HNSW.h +46 -7
  80. data/vendor/faiss/faiss/impl/IDSelector.h +44 -0
  81. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +2 -2
  82. data/vendor/faiss/faiss/impl/NNDescent.cpp +10 -3
  83. data/vendor/faiss/faiss/impl/NSG.cpp +3 -1
  84. data/vendor/faiss/faiss/impl/Panorama.h +20 -9
  85. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +152 -84
  86. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +38 -26
  87. data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +45 -37
  88. data/vendor/faiss/faiss/impl/RaBitQUtils.h +35 -0
  89. data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +239 -72
  90. data/vendor/faiss/faiss/impl/RaBitQuantizer.h +66 -4
  91. data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.cpp +4 -13
  92. data/vendor/faiss/faiss/impl/ResultHandler.h +34 -34
  93. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +287 -84
  94. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +26 -10
  95. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +2 -2
  96. data/vendor/faiss/faiss/impl/VisitedTable.cpp +22 -2
  97. data/vendor/faiss/faiss/impl/VisitedTable.h +20 -0
  98. data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +90 -14
  99. data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +4 -4
  100. data/vendor/faiss/faiss/impl/expanded_scanners.h +5 -1
  101. data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +1 -0
  102. data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +35 -2
  103. data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +1 -1
  104. data/vendor/faiss/faiss/impl/index_read.cpp +491 -50
  105. data/vendor/faiss/faiss/impl/index_write.cpp +86 -30
  106. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +8 -9
  107. data/vendor/faiss/faiss/impl/platform_macros.h +3 -1
  108. data/vendor/faiss/faiss/impl/polysemous_training/avx512.cpp +284 -0
  109. data/vendor/faiss/faiss/impl/polysemous_training/dispatch.h +115 -0
  110. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +73 -39
  111. data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +0 -1
  112. data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +26 -15
  113. data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +4 -4
  114. data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +4 -4
  115. data/vendor/faiss/faiss/impl/result_handler/ResultHandler.cpp +195 -0
  116. data/vendor/faiss/faiss/impl/result_handler/avx2.cpp +133 -0
  117. data/vendor/faiss/faiss/impl/result_handler/avx512.cpp +281 -0
  118. data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer-avx2.cpp +72 -0
  119. data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer-avx512.cpp +228 -0
  120. data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer.cpp +887 -0
  121. data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +2 -2
  122. data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +9 -8
  123. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +90 -24
  124. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-impl.h +30 -30
  125. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-spr.cpp +4 -5
  126. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +101 -34
  127. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +169 -13
  128. data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +125 -26
  129. data/vendor/faiss/faiss/impl/simd_dispatch.h +70 -31
  130. data/vendor/faiss/faiss/index_factory.cpp +40 -7
  131. data/vendor/faiss/faiss/invlists/DirectMap.cpp +1 -1
  132. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +9 -6
  133. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +29 -8
  134. data/vendor/faiss/faiss/python/python_callbacks.cpp +3 -1
  135. data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +60 -0
  136. data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +26 -1
  137. data/vendor/faiss/faiss/svs/IndexSVSFlat.h +13 -0
  138. data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +1 -1
  139. data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +1 -1
  140. data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +47 -5
  141. data/vendor/faiss/faiss/svs/IndexSVSVamana.h +23 -3
  142. data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.cpp +4 -2
  143. data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +2 -1
  144. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +10 -4
  145. data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +2 -1
  146. data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +1 -1
  147. data/vendor/faiss/faiss/utils/distances.cpp +30 -11
  148. data/vendor/faiss/faiss/utils/distances_dispatch.h +30 -24
  149. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +1 -1
  150. data/vendor/faiss/faiss/utils/distances_simd.cpp +4 -3
  151. data/vendor/faiss/faiss/utils/extra_distances.cpp +4 -14
  152. data/vendor/faiss/faiss/utils/extra_distances.h +1 -2
  153. data/vendor/faiss/faiss/utils/hamming.cpp +16 -10
  154. data/vendor/faiss/faiss/utils/hamming.h +10 -1
  155. data/vendor/faiss/faiss/utils/hamming_distance/common.h +14 -3
  156. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512_vpopcnt.cpp +24 -0
  157. data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +1 -1
  158. data/vendor/faiss/faiss/utils/hamming_distance/{hamming_computer-avx512_spr.h → hamming_computer-avx512_vpopcnt.h} +85 -24
  159. data/vendor/faiss/faiss/utils/hamming_distance/hamming_impl.h +141 -0
  160. data/vendor/faiss/faiss/utils/quantize_lut.cpp +29 -8
  161. data/vendor/faiss/faiss/utils/rabitq_simd.h +202 -0
  162. data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +194 -30
  163. data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +0 -1
  164. data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +263 -15
  165. data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +198 -18
  166. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +245 -0
  167. data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +330 -40
  168. data/vendor/faiss/faiss/utils/simd_impl/{rabitq_avx512_spr.cpp → rabitq_avx512_vpopcnt.cpp} +112 -23
  169. data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +11 -0
  170. data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +143 -6
  171. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h +2 -7
  172. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels.h +6 -1
  173. data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_sve.cpp +34 -0
  174. data/vendor/faiss/faiss/utils/simd_levels.cpp +196 -47
  175. data/vendor/faiss/faiss/utils/simd_levels.h +33 -8
  176. data/vendor/faiss/faiss/utils/utils.cpp +9 -27
  177. metadata +21 -5
  178. data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512_spr.cpp +0 -15
@@ -21,13 +21,18 @@ enum class SIMDLevel {
21
21
  // x86
22
22
  AVX2,
23
23
  AVX512,
24
- AVX512_SPR, // Sapphire Rapids: AVX512 + BF16 + FP16 + VNNI
24
+ AVX512_SPR, // Sapphire Rapids: AVX512_VPOPCNT + BF16 + FP16 + VNNI
25
25
  // arm & aarch64
26
26
  ARM_NEON,
27
27
  ARM_SVE, // Scalable Vector Extension (ARMv8.2+)
28
28
  // riscv
29
29
  RISCV_RVV, // RISC-V Vector Extension (rv64gcv)
30
30
 
31
+ // Appended to preserve the numeric values of the existing public enum.
32
+ // AVX-512 core features plus AVX512_VPOPCNTDQ and AVX512_BITALG
33
+ // (Ice Lake, Zen 4, etc.).
34
+ AVX512_VPOPCNT,
35
+
31
36
  COUNT
32
37
  };
33
38
 
@@ -52,6 +57,8 @@ inline constexpr SIMDLevel SINGLE_SIMD_LEVEL = SIMDLevel::NONE;
52
57
  #else
53
58
  #if defined(COMPILE_SIMD_AVX512_SPR)
54
59
  inline constexpr SIMDLevel SINGLE_SIMD_LEVEL = SIMDLevel::AVX512_SPR;
60
+ #elif defined(COMPILE_SIMD_AVX512_VPOPCNT)
61
+ inline constexpr SIMDLevel SINGLE_SIMD_LEVEL = SIMDLevel::AVX512_VPOPCNT;
55
62
  #elif defined(COMPILE_SIMD_AVX512)
56
63
  inline constexpr SIMDLevel SINGLE_SIMD_LEVEL = SIMDLevel::AVX512;
57
64
  #elif defined(COMPILE_SIMD_AVX2)
@@ -71,7 +78,7 @@ inline constexpr SIMDLevel SINGLE_SIMD_LEVEL = SIMDLevel::NONE;
71
78
  * Helper to select the appropriate 256-bit SIMD level.
72
79
  *
73
80
  * For 256-bit SIMD types (simd16uint16, simd32uint8, etc.), maps:
74
- * AVX512/AVX512_SPR → AVX2 (256-bit ops use AVX2 instructions)
81
+ * AVX512/AVX512_VPOPCNT/AVX512_SPR → AVX2
75
82
  * AVX2 → AVX2
76
83
  * ARM_NEON/ARM_SVE → ARM_NEON
77
84
  * NONE → NONE
@@ -79,7 +86,8 @@ inline constexpr SIMDLevel SINGLE_SIMD_LEVEL = SIMDLevel::NONE;
79
86
  template <SIMDLevel SL>
80
87
  struct simd256_level_selector {
81
88
  static constexpr SIMDLevel value =
82
- (SL == SIMDLevel::AVX512 || SL == SIMDLevel::AVX512_SPR)
89
+ (SL == SIMDLevel::AVX512 || SL == SIMDLevel::AVX512_VPOPCNT ||
90
+ SL == SIMDLevel::AVX512_SPR)
83
91
  ? SIMDLevel::AVX2
84
92
  : (SL == SIMDLevel::ARM_SVE ? SIMDLevel::ARM_NEON
85
93
  : SL == SIMDLevel::RISCV_RVV ? SIMDLevel::NONE
@@ -96,13 +104,14 @@ inline constexpr SIMDLevel SINGLE_SIMD_LEVEL_256 =
96
104
  * Helper to select the appropriate 512-bit SIMD level.
97
105
  *
98
106
  * For 512-bit SIMD types (simd32uint16, simd64uint8, etc.), maps:
99
- * AVX512_SPR → AVX512 (512-bit ops share the same instructions)
107
+ * AVX512_VPOPCNT/AVX512_SPR → AVX512 for generic 512-bit operations
100
108
  * AVX512 → AVX512
101
109
  * NONE → NONE
102
110
  ***************************************************************/
103
111
  template <SIMDLevel SL>
104
112
  struct simd512_level_selector {
105
- static constexpr SIMDLevel value = (SL == SIMDLevel::AVX512_SPR)
113
+ static constexpr SIMDLevel value =
114
+ (SL == SIMDLevel::AVX512_SPR || SL == SIMDLevel::AVX512_VPOPCNT)
106
115
  ? SIMDLevel::AVX512
107
116
  : (SL == SIMDLevel::RISCV_RVV) ? SIMDLevel::NONE
108
117
  : SL;
@@ -124,14 +133,21 @@ constexpr int simd_width() {
124
133
  static_assert(
125
134
  SL != SIMDLevel::RISCV_RVV,
126
135
  "simd_width<RISCV_RVV> is not supported: RVV is variable-width");
127
- if constexpr (SL == SIMDLevel::AVX512 || SL == SIMDLevel::AVX512_SPR)
136
+ if constexpr (
137
+ SL == SIMDLevel::AVX512 || SL == SIMDLevel::AVX512_VPOPCNT ||
138
+ SL == SIMDLevel::AVX512_SPR) {
128
139
  return 16;
129
- else if constexpr (SL == SIMDLevel::AVX2 || SL == SIMDLevel::ARM_NEON)
140
+ } else if constexpr (SL == SIMDLevel::AVX2 || SL == SIMDLevel::ARM_NEON) {
130
141
  return 8;
131
- else
142
+ } else {
132
143
  return 1;
144
+ }
133
145
  }
134
146
 
147
+ /// Bitmask (1 << SIMDLevel) of the levels this binary holds code for,
148
+ /// whether or not the CPU supports them.
149
+ uint64_t compiled_simd_levels();
150
+
135
151
  /// Convert SIMDLevel to string. Throws FaissException for invalid level.
136
152
  std::string to_string(SIMDLevel level);
137
153
 
@@ -161,8 +177,17 @@ struct FAISS_API SIMDConfig {
161
177
  /// Returns bitmask of supported SIMD levels (1 << SIMDLevel).
162
178
  static uint64_t supported_simd_levels;
163
179
 
180
+ /// CPU implements AVX-512 by splitting over a 256-bit datapath
181
+ /// (AMD Zen 4 / Zen 4c "Bergamo", family 0x19). On such CPUs 512-bit
182
+ /// ops give no throughput gain, so the fast-scan QBS path prefers the
183
+ /// 256-bit kernel.
184
+ static bool avx512_split;
185
+
164
186
  static SIMDLevel auto_detect_simd_level();
165
187
 
188
+ /// Whether this faiss build dispatches SIMD at runtime.
189
+ static bool has_dynamic_dispatch();
190
+
166
191
  SIMDConfig(const char** faiss_simd_level_env = nullptr);
167
192
 
168
193
  /// 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.2
4
+ version: 0.6.4
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
@@ -238,11 +242,13 @@ files:
238
242
  - vendor/faiss/faiss/gpu_metal/MetalIndex.h
239
243
  - vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h
240
244
  - vendor/faiss/faiss/gpu_metal/MetalIndexIVFFlat.h
245
+ - vendor/faiss/faiss/gpu_metal/MetalIndexIVFPQ.h
241
246
  - vendor/faiss/faiss/gpu_metal/MetalKernels.h
242
247
  - vendor/faiss/faiss/gpu_metal/MetalPythonBridge.h
243
248
  - vendor/faiss/faiss/gpu_metal/MetalResources.h
244
249
  - vendor/faiss/faiss/gpu_metal/StandardMetalResources.h
245
250
  - vendor/faiss/faiss/gpu_metal/impl/MetalIVFFlat.h
251
+ - vendor/faiss/faiss/gpu_metal/impl/MetalIVFPQ.h
246
252
  - vendor/faiss/faiss/impl/AdSampling.cpp
247
253
  - vendor/faiss/faiss/impl/AdSampling.h
248
254
  - vendor/faiss/faiss/impl/AdditiveQuantizer.cpp
@@ -258,6 +264,7 @@ files:
258
264
  - vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp
259
265
  - vendor/faiss/faiss/impl/CodePackerRaBitQ.h
260
266
  - vendor/faiss/faiss/impl/DistanceComputer.h
267
+ - vendor/faiss/faiss/impl/EDENQuantizer.h
261
268
  - vendor/faiss/faiss/impl/FaissAssert.h
262
269
  - vendor/faiss/faiss/impl/FaissException.cpp
263
270
  - vendor/faiss/faiss/impl/FaissException.h
@@ -356,6 +363,8 @@ files:
356
363
  - vendor/faiss/faiss/impl/mapped_io.h
357
364
  - vendor/faiss/faiss/impl/maybe_owned_vector.h
358
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
359
368
  - vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h
360
369
  - vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp
361
370
  - vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h
@@ -373,6 +382,12 @@ files:
373
382
  - vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp
374
383
  - vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp
375
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
376
391
  - vendor/faiss/faiss/impl/scalar_quantizer/codecs.h
377
392
  - vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h
378
393
  - vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h
@@ -460,10 +475,10 @@ files:
460
475
  - vendor/faiss/faiss/utils/hamming_distance/common.h
461
476
  - vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp
462
477
  - vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp
463
- - vendor/faiss/faiss/utils/hamming_distance/hamming_avx512_spr.cpp
478
+ - vendor/faiss/faiss/utils/hamming_distance/hamming_avx512_vpopcnt.cpp
464
479
  - vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h
465
480
  - vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h
466
- - vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512_spr.h
481
+ - vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512_vpopcnt.h
467
482
  - vendor/faiss/faiss/utils/hamming_distance/hamming_computer-generic.h
468
483
  - vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h
469
484
  - vendor/faiss/faiss/utils/hamming_distance/hamming_computer-rvv.h
@@ -498,13 +513,14 @@ files:
498
513
  - vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h
499
514
  - vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp
500
515
  - vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp
501
- - vendor/faiss/faiss/utils/simd_impl/rabitq_avx512_spr.cpp
516
+ - vendor/faiss/faiss/utils/simd_impl/rabitq_avx512_vpopcnt.cpp
502
517
  - vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp
503
518
  - vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp
504
519
  - vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h
505
520
  - vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels.h
506
521
  - vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp
507
522
  - vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp
523
+ - vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_sve.cpp
508
524
  - vendor/faiss/faiss/utils/simd_levels.cpp
509
525
  - vendor/faiss/faiss/utils/simd_levels.h
510
526
  - vendor/faiss/faiss/utils/sorting.cpp
@@ -531,7 +547,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
531
547
  - !ruby/object:Gem::Version
532
548
  version: '0'
533
549
  requirements: []
534
- rubygems_version: 4.0.14
550
+ rubygems_version: 4.0.20
535
551
  specification_version: 4
536
552
  summary: Efficient similarity search and clustering for Ruby
537
553
  test_files: []
@@ -1,15 +0,0 @@
1
- /*
2
- * Copyright (c) Meta Platforms, Inc. and affiliates.
3
- *
4
- * This source code is licensed under the MIT license found in the
5
- * LICENSE file in the root directory of this source tree.
6
- */
7
-
8
- #ifdef COMPILE_SIMD_AVX512_SPR
9
-
10
- #define THE_SIMD_LEVEL SIMDLevel::AVX512_SPR
11
- // NOLINTNEXTLINE(facebook-hte-InlineHeader)
12
- #include <faiss/utils/hamming_distance/hamming_computer-avx512_spr.h>
13
- #include <faiss/utils/hamming_distance/hamming_impl.h>
14
-
15
- #endif // COMPILE_SIMD_AVX512_SPR