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
@@ -25,6 +25,418 @@
25
25
 
26
26
  namespace faiss {
27
27
 
28
+ namespace {
29
+
30
+ // Gaussian Lloyd-Max optimal quantizer centroids and boundaries for N(0,1).
31
+ // clang-format off
32
+ const float kLloydMaxCentroids1[] = {
33
+ -0.797884560802865f, 0.797884560802865f
34
+ };
35
+ const float kLloydMaxBoundaries1[] = {
36
+ 0.000000000000000f
37
+ };
38
+ const float kLloydMaxCentroids2[] = {
39
+ -1.510417608499078f, -0.452780034636484f,
40
+ 0.452780034636483f, 1.510417608499078f
41
+ };
42
+ const float kLloydMaxBoundaries2[] = {
43
+ -0.981598821567781f, 0.000000000000000f, 0.981598821567781f
44
+ };
45
+ const float kLloydMaxCentroids3[] = {
46
+ -2.151945704536914f, -1.343909278504930f,
47
+ -0.756005281205826f, -0.245094178944203f,
48
+ 0.245094178944203f, 0.756005281205825f,
49
+ 1.343909278504930f, 2.151945704536914f
50
+ };
51
+ const float kLloydMaxBoundaries3[] = {
52
+ -1.747927491520922f, -1.049957279855378f,
53
+ -0.500549730075014f, 0.000000000000000f,
54
+ 0.500549730075014f, 1.049957279855378f,
55
+ 1.747927491520922f
56
+ };
57
+ const float kLloydMaxCentroids4[] = {
58
+ -2.732589570994957f, -2.069017226531159f,
59
+ -1.618046386021649f, -1.256231197346957f,
60
+ -0.942340456486774f, -0.656759118532318f,
61
+ -0.388048299490198f, -0.128395029851116f,
62
+ 0.128395029851116f, 0.388048299490198f,
63
+ 0.656759118532318f, 0.942340456486773f,
64
+ 1.256231197346959f, 1.618046386021649f,
65
+ 2.069017226531160f, 2.732589570994943f
66
+ };
67
+ const float kLloydMaxBoundaries4[] = {
68
+ -2.400803398763058f, -1.843531806276404f,
69
+ -1.437138791684303f, -1.099285826916865f,
70
+ -0.799549787509546f, -0.522403709011258f,
71
+ -0.258221664670657f, 0.000000000000000f,
72
+ 0.258221664670657f, 0.522403709011258f,
73
+ 0.799549787509546f, 1.099285826916866f,
74
+ 1.437138791684304f, 1.843531806276404f,
75
+ 2.400803398763051f
76
+ };
77
+ const float kLloydMaxCentroids8[] = {
78
+ -4.2734901319f, -3.8270895246f, -3.5457169520f, -3.3354593381f,
79
+ -3.1655721017f, -3.0219515320f, -2.8969009924f, -2.7857394515f,
80
+ -2.6853990170f, -2.5937556343f, -2.5092755166f, -2.4308135619f,
81
+ -2.3574913691f, -2.2886197969f, -2.2236478246f, -2.1621276457f,
82
+ -2.1036901632f, -2.0480273642f, -1.9948793740f, -1.9440247677f,
83
+ -1.8952732015f, -1.8484597247f, -1.8034403315f, -1.7600884415f,
84
+ -1.7182920846f, -1.6779516274f, -1.6389779215f, -1.6012907825f,
85
+ -1.5648177311f, -1.5294929453f, -1.4952563823f, -1.4620530375f,
86
+ -1.4298323186f, -1.3985475108f, -1.3681553217f, -1.3386154890f,
87
+ -1.3098904444f, -1.2819450217f, -1.2547462051f, -1.2282629097f,
88
+ -1.2024657910f, -1.1773270781f, -1.1528204287f, -1.1289208010f,
89
+ -1.1056043421f, -1.0828482901f, -1.0606308873f, -1.0389313043f,
90
+ -1.0177295729f, -0.9970065268f, -0.9767437492f, -0.9569235264f,
91
+ -0.9375288069f, -0.9185431646f, -0.8999507663f, -0.8817363426f,
92
+ -0.8638851621f, -0.8463830081f, -0.8292161569f, -0.8123713596f,
93
+ -0.7958358242f, -0.7795971999f, -0.7636435625f, -0.7479634007f,
94
+ -0.7325456038f, -0.7173794494f, -0.7024545929f, -0.6877610560f,
95
+ -0.6732892172f, -0.6590298016f, -0.6449738716f, -0.6311128174f,
96
+ -0.6174383481f, -0.6039424829f, -0.5906175419f, -0.5774561379f,
97
+ -0.5644511676f, -0.5515958029f, -0.5388834832f, -0.5263079060f,
98
+ -0.5138630194f, -0.5015430136f, -0.4893423125f, -0.4772555660f,
99
+ -0.4652776416f, -0.4534036165f, -0.4416287701f, -0.4299485757f,
100
+ -0.4183586932f, -0.4068549615f, -0.3954333909f, -0.3840901561f,
101
+ -0.3728215889f, -0.3616241712f, -0.3504945283f, -0.3394294221f,
102
+ -0.3284257446f, -0.3174805116f, -0.3065908567f, -0.2957540250f,
103
+ -0.2849673675f, -0.2742283355f, -0.2635344752f, -0.2528834222f,
104
+ -0.2422728967f, -0.2317006985f, -0.2211647022f, -0.2106628526f,
105
+ -0.2001931607f, -0.1897536989f, -0.1793425974f, -0.1689580400f,
106
+ -0.1585982605f, -0.1482615390f, -0.1379461985f, -0.1276506012f,
107
+ -0.1173731457f, -0.1071122637f, -0.0968664166f, -0.0866340933f,
108
+ -0.0764138065f, -0.0662040909f, -0.0560034994f, -0.0458106014f,
109
+ -0.0356239797f, -0.0254422284f, -0.0152639496f, -0.0050877521f,
110
+ 0.0050877521f, 0.0152639496f, 0.0254422284f, 0.0356239797f,
111
+ 0.0458106014f, 0.0560034994f, 0.0662040909f, 0.0764138065f,
112
+ 0.0866340933f, 0.0968664166f, 0.1071122637f, 0.1173731457f,
113
+ 0.1276506012f, 0.1379461985f, 0.1482615390f, 0.1585982605f,
114
+ 0.1689580400f, 0.1793425974f, 0.1897536989f, 0.2001931607f,
115
+ 0.2106628526f, 0.2211647022f, 0.2317006985f, 0.2422728967f,
116
+ 0.2528834222f, 0.2635344752f, 0.2742283355f, 0.2849673675f,
117
+ 0.2957540250f, 0.3065908567f, 0.3174805116f, 0.3284257446f,
118
+ 0.3394294221f, 0.3504945283f, 0.3616241712f, 0.3728215889f,
119
+ 0.3840901561f, 0.3954333909f, 0.4068549615f, 0.4183586932f,
120
+ 0.4299485757f, 0.4416287701f, 0.4534036165f, 0.4652776416f,
121
+ 0.4772555660f, 0.4893423125f, 0.5015430136f, 0.5138630194f,
122
+ 0.5263079060f, 0.5388834832f, 0.5515958029f, 0.5644511676f,
123
+ 0.5774561379f, 0.5906175419f, 0.6039424829f, 0.6174383481f,
124
+ 0.6311128174f, 0.6449738716f, 0.6590298016f, 0.6732892172f,
125
+ 0.6877610560f, 0.7024545929f, 0.7173794494f, 0.7325456038f,
126
+ 0.7479634007f, 0.7636435625f, 0.7795971999f, 0.7958358242f,
127
+ 0.8123713596f, 0.8292161569f, 0.8463830081f, 0.8638851621f,
128
+ 0.8817363426f, 0.8999507663f, 0.9185431646f, 0.9375288069f,
129
+ 0.9569235264f, 0.9767437492f, 0.9970065268f, 1.0177295729f,
130
+ 1.0389313043f, 1.0606308873f, 1.0828482901f, 1.1056043421f,
131
+ 1.1289208010f, 1.1528204287f, 1.1773270781f, 1.2024657910f,
132
+ 1.2282629097f, 1.2547462051f, 1.2819450217f, 1.3098904444f,
133
+ 1.3386154890f, 1.3681553217f, 1.3985475108f, 1.4298323186f,
134
+ 1.4620530375f, 1.4952563823f, 1.5294929453f, 1.5648177311f,
135
+ 1.6012907825f, 1.6389779215f, 1.6779516274f, 1.7182920846f,
136
+ 1.7600884415f, 1.8034403315f, 1.8484597247f, 1.8952732015f,
137
+ 1.9440247677f, 1.9948793740f, 2.0480273642f, 2.1036901632f,
138
+ 2.1621276457f, 2.2236478246f, 2.2886197969f, 2.3574913691f,
139
+ 2.4308135619f, 2.5092755166f, 2.5937556343f, 2.6853990170f,
140
+ 2.7857394515f, 2.8969009924f, 3.0219515320f, 3.1655721017f,
141
+ 3.3354593381f, 3.5457169520f, 3.8270895246f, 4.2734901319f
142
+ };
143
+ const float kLloydMaxBoundaries8[] = {
144
+ -4.0502898282f, -3.6864032383f, -3.4405881450f, -3.2505157199f,
145
+ -3.0937618168f, -2.9594262622f, -2.8413202220f, -2.7355692343f,
146
+ -2.6395773257f, -2.5515155755f, -2.4700445392f, -2.3941524655f,
147
+ -2.3230555830f, -2.2561338107f, -2.1928877352f, -2.1329089044f,
148
+ -2.0758587637f, -2.0214533691f, -1.9694520708f, -1.9196489846f,
149
+ -1.8718664631f, -1.8259500281f, -1.7817643865f, -1.7391902630f,
150
+ -1.6981218560f, -1.6584647744f, -1.6201343520f, -1.5830542568f,
151
+ -1.5471553382f, -1.5123746638f, -1.4786547099f, -1.4459426781f,
152
+ -1.4141899147f, -1.3833514163f, -1.3533854053f, -1.3242529667f,
153
+ -1.2959177331f, -1.2683456134f, -1.2415045574f, -1.2153643503f,
154
+ -1.1898964346f, -1.1650737534f, -1.1408706148f, -1.1172625715f,
155
+ -1.0942263161f, -1.0717395887f, -1.0497810958f, -1.0283304386f,
156
+ -1.0073680499f, -0.9868751380f, -0.9668336378f, -0.9472261667f,
157
+ -0.9280359858f, -0.9092469654f, -0.8908435544f, -0.8728107524f,
158
+ -0.8551340851f, -0.8377995825f, -0.8207937582f, -0.8041035919f,
159
+ -0.7877165121f, -0.7716203812f, -0.7558034816f, -0.7402545023f,
160
+ -0.7249625266f, -0.7099170212f, -0.6951078244f, -0.6805251366f,
161
+ -0.6661595094f, -0.6520018366f, -0.6380433445f, -0.6242755828f,
162
+ -0.6106904155f, -0.5972800124f, -0.5840368399f, -0.5709536527f,
163
+ -0.5580234853f, -0.5452396431f, -0.5325956946f, -0.5200854627f,
164
+ -0.5077030165f, -0.4954426631f, -0.4832989393f, -0.4712666038f,
165
+ -0.4593406291f, -0.4475161933f, -0.4357886729f, -0.4241536345f,
166
+ -0.4126068274f, -0.4011441762f, -0.3897617735f, -0.3784558725f,
167
+ -0.3672228800f, -0.3560593498f, -0.3449619752f, -0.3339275834f,
168
+ -0.3229531281f, -0.3120356842f, -0.3011724408f, -0.2903606962f,
169
+ -0.2795978515f, -0.2688814053f, -0.2582089487f, -0.2475781595f,
170
+ -0.2369867976f, -0.2264327004f, -0.2159137774f, -0.2054280067f,
171
+ -0.1949734298f, -0.1845481481f, -0.1741503187f, -0.1637781502f,
172
+ -0.1534298998f, -0.1431038688f, -0.1327983999f, -0.1225118735f,
173
+ -0.1122427047f, -0.1019893401f, -0.0917502549f, -0.0815239499f,
174
+ -0.0713089487f, -0.0611037951f, -0.0509070504f, -0.0407172906f,
175
+ -0.0305331041f, -0.0203530890f, -0.0101758509f, 0.0000000000f,
176
+ 0.0101758509f, 0.0203530890f, 0.0305331041f, 0.0407172906f,
177
+ 0.0509070504f, 0.0611037951f, 0.0713089487f, 0.0815239499f,
178
+ 0.0917502549f, 0.1019893401f, 0.1122427047f, 0.1225118735f,
179
+ 0.1327983999f, 0.1431038688f, 0.1534298998f, 0.1637781502f,
180
+ 0.1741503187f, 0.1845481481f, 0.1949734298f, 0.2054280067f,
181
+ 0.2159137774f, 0.2264327004f, 0.2369867976f, 0.2475781595f,
182
+ 0.2582089487f, 0.2688814053f, 0.2795978515f, 0.2903606962f,
183
+ 0.3011724408f, 0.3120356842f, 0.3229531281f, 0.3339275834f,
184
+ 0.3449619752f, 0.3560593498f, 0.3672228800f, 0.3784558725f,
185
+ 0.3897617735f, 0.4011441762f, 0.4126068274f, 0.4241536345f,
186
+ 0.4357886729f, 0.4475161933f, 0.4593406291f, 0.4712666038f,
187
+ 0.4832989393f, 0.4954426631f, 0.5077030165f, 0.5200854627f,
188
+ 0.5325956946f, 0.5452396431f, 0.5580234853f, 0.5709536527f,
189
+ 0.5840368399f, 0.5972800124f, 0.6106904155f, 0.6242755828f,
190
+ 0.6380433445f, 0.6520018366f, 0.6661595094f, 0.6805251366f,
191
+ 0.6951078244f, 0.7099170212f, 0.7249625266f, 0.7402545023f,
192
+ 0.7558034816f, 0.7716203812f, 0.7877165121f, 0.8041035919f,
193
+ 0.8207937582f, 0.8377995825f, 0.8551340851f, 0.8728107524f,
194
+ 0.8908435544f, 0.9092469654f, 0.9280359858f, 0.9472261667f,
195
+ 0.9668336378f, 0.9868751380f, 1.0073680499f, 1.0283304386f,
196
+ 1.0497810958f, 1.0717395887f, 1.0942263161f, 1.1172625715f,
197
+ 1.1408706148f, 1.1650737534f, 1.1898964346f, 1.2153643503f,
198
+ 1.2415045574f, 1.2683456134f, 1.2959177331f, 1.3242529667f,
199
+ 1.3533854053f, 1.3833514163f, 1.4141899147f, 1.4459426781f,
200
+ 1.4786547099f, 1.5123746638f, 1.5471553382f, 1.5830542568f,
201
+ 1.6201343520f, 1.6584647744f, 1.6981218560f, 1.7391902630f,
202
+ 1.7817643865f, 1.8259500281f, 1.8718664631f, 1.9196489846f,
203
+ 1.9694520708f, 2.0214533691f, 2.0758587637f, 2.1329089044f,
204
+ 2.1928877352f, 2.2561338107f, 2.3230555830f, 2.3941524655f,
205
+ 2.4700445392f, 2.5515155755f, 2.6395773257f, 2.7355692343f,
206
+ 2.8413202220f, 2.9594262622f, 3.0937618168f, 3.2505157199f,
207
+ 3.4405881450f, 3.6864032383f, 4.0502898282f
208
+ };
209
+ const float kLloydMaxCentroids5[] = {
210
+ -3.260726295605043f, -2.691115579554310f, -2.317736402126149f,
211
+ -2.028725991363304f, -1.787231211885846f, -1.576226389073775f,
212
+ -1.386338935362625f, -1.211803212032400f, -1.048782381365585f,
213
+ -0.894564395854440f, -0.747135131789057f, -0.604933168939543f,
214
+ -0.466699175119721f, -0.331378051429876f, -0.198051689203879f,
215
+ -0.065889622349093f, 0.065889622349093f, 0.198051689203879f,
216
+ 0.331378051429876f, 0.466699175119721f, 0.604933168939543f,
217
+ 0.747135131789057f, 0.894564395854440f, 1.048782381365585f,
218
+ 1.211803212032400f, 1.386338935362625f, 1.576226389073775f,
219
+ 1.787231211885846f, 2.028725991363304f, 2.317736402126149f,
220
+ 2.691115579554310f, 3.260726295605043f
221
+ };
222
+ const float kLloydMaxBoundaries5[] = {
223
+ -2.975920937579676f, -2.504425990840229f,
224
+ -2.173231196744727f, -1.907978601624575f,
225
+ -1.681728800479811f, -1.481282662218200f,
226
+ -1.299071073697513f, -1.130292796698992f,
227
+ -0.971673388610013f, -0.820849763821748f,
228
+ -0.676034150364300f, -0.535816172029632f,
229
+ -0.399038613274799f, -0.264714870316877f,
230
+ -0.131970655776486f, 0.000000000000000f,
231
+ 0.131970655776486f, 0.264714870316877f,
232
+ 0.399038613274799f, 0.535816172029632f,
233
+ 0.676034150364300f, 0.820849763821748f,
234
+ 0.971673388610013f, 1.130292796698992f,
235
+ 1.299071073697513f, 1.481282662218200f,
236
+ 1.681728800479811f, 1.907978601624575f,
237
+ 2.173231196744727f, 2.504425990840229f,
238
+ 2.975920937579676f
239
+ };
240
+ const float kLloydMaxCentroids6[] = {
241
+ -3.744069023696475f, -3.240416640324168f, -2.917391465309850f,
242
+ -2.672261701410258f, -2.471294740528467f, -2.298972741297400f,
243
+ -2.146803022259123f, -2.009604894545278f, -1.883971899229356f,
244
+ -1.767537148129260f, -1.658584711429843f, -1.555827465952835f,
245
+ -1.458272959944728f, -1.365137897182360f, -1.275791622351997f,
246
+ -1.189717571132746f, -1.106485959691858f, -1.025734313393752f,
247
+ -0.947153093015629f, -0.870474868055092f, -0.795466052902551f,
248
+ -0.721920472069418f, -0.649654245231535f, -0.578501846064579f,
249
+ -0.508312758753803f, -0.438948800917774f, -0.370281933281155f,
250
+ -0.302192289440361f, -0.234566569768735f, -0.167296609901720f,
251
+ -0.100278121713920f, -0.033409455880258f, 0.033409455880258f,
252
+ 0.100278121713920f, 0.167296609901720f, 0.234566569768735f,
253
+ 0.302192289440361f, 0.370281933281155f, 0.438948800917774f,
254
+ 0.508312758753803f, 0.578501846064579f, 0.649654245231535f,
255
+ 0.721920472069418f, 0.795466052902551f, 0.870474868055092f,
256
+ 0.947153093015629f, 1.025734313393752f, 1.106485959691858f,
257
+ 1.189717571132746f, 1.275791622351997f, 1.365137897182360f,
258
+ 1.458272959944728f, 1.555827465952835f, 1.658584711429843f,
259
+ 1.767537148129260f, 1.883971899229356f, 2.009604894545278f,
260
+ 2.146803022259123f, 2.298972741297400f, 2.471294740528467f,
261
+ 2.672261701410258f, 2.917391465309850f, 3.240416640324168f,
262
+ 3.744069023696475f
263
+ };
264
+ const float kLloydMaxBoundaries6[] = {
265
+ -3.492242832010322f, -3.078904052817009f,
266
+ -2.794826583360054f, -2.571778220969362f,
267
+ -2.385133740912933f, -2.222887881778261f,
268
+ -2.078203958402201f, -1.946788396887317f,
269
+ -1.825754523679308f, -1.713060929779552f,
270
+ -1.607206088691339f, -1.507050212948781f,
271
+ -1.411705428563544f, -1.320464759767178f,
272
+ -1.232754596742371f, -1.148101765412302f,
273
+ -1.066110136542805f, -0.986443703204690f,
274
+ -0.908813980535361f, -0.832970460478822f,
275
+ -0.758693262485985f, -0.685787358650477f,
276
+ -0.614078045648057f, -0.543407302409191f,
277
+ -0.473630779835788f, -0.404615367099464f,
278
+ -0.336237111360758f, -0.268379429604548f,
279
+ -0.200931589835227f, -0.133787365807820f,
280
+ -0.066843788797089f, 0.000000000000000f,
281
+ 0.066843788797089f, 0.133787365807820f,
282
+ 0.200931589835227f, 0.268379429604548f,
283
+ 0.336237111360758f, 0.404615367099464f,
284
+ 0.473630779835788f, 0.543407302409191f,
285
+ 0.614078045648057f, 0.685787358650477f,
286
+ 0.758693262485985f, 0.832970460478822f,
287
+ 0.908813980535361f, 0.986443703204690f,
288
+ 1.066110136542805f, 1.148101765412302f,
289
+ 1.232754596742371f, 1.320464759767178f,
290
+ 1.411705428563544f, 1.507050212948781f,
291
+ 1.607206088691339f, 1.713060929779552f,
292
+ 1.825754523679308f, 1.946788396887317f,
293
+ 2.078203958402201f, 2.222887881778261f,
294
+ 2.385133740912933f, 2.571778220969362f,
295
+ 2.794826583360054f, 3.078904052817009f,
296
+ 3.492242832010322f
297
+ };
298
+ const float kLloydMaxCentroids7[] = {
299
+ -4.189521933023523f, -3.734857105369156f, -3.447381010593710f,
300
+ -3.231896182843021f, -3.057216102842374f, -2.909021527386642f,
301
+ -2.779491911054078f, -2.663867022558051f, -2.559023499137449f,
302
+ -2.462795908452321f, -2.373620316421171f, -2.290326870492530f,
303
+ -2.212016460501213f, -2.137983242734970f, -2.067662153838450f,
304
+ -2.000593243383757f, -1.936396720412283f, -1.874755326807296f,
305
+ -1.815400993379865f, -1.758105160675647f, -1.702671162415673f,
306
+ -1.648928306223807f, -1.596727786313424f, -1.545938700893484f,
307
+ -1.496445137501057f, -1.448144252238147f, -1.400944106526214f,
308
+ -1.354762105115604f, -1.309523700469555f, -1.265161378699170f,
309
+ -1.221613876387012f, -1.178825265520504f, -1.136744262343403f,
310
+ -1.095323771921318f, -1.054520418037026f, -1.014294067830043f,
311
+ -0.974607484216044f, -0.935426075762634f, -0.896717615963322f,
312
+ -0.858451939611374f, -0.820600783245502f, -0.783137537563140f,
313
+ -0.746037126679468f, -0.709275946093977f, -0.672831567493634f,
314
+ -0.636682661398141f, -0.600808970989236f, -0.565191195643323f,
315
+ -0.529810843625619f, -0.494650181610316f, -0.459692230045422f,
316
+ -0.424920552397901f, -0.390319263305967f, -0.355873075050329f,
317
+ -0.321567103923158f, -0.287386806226095f, -0.253318071908346f,
318
+ -0.219347083403316f, -0.185460257086808f, -0.151644263013162f,
319
+ -0.117885968250325f, -0.084172419896719f, -0.050490753968962f,
320
+ -0.016828143177728f, 0.016828143177728f, 0.050490753968962f,
321
+ 0.084172419896719f, 0.117885968250325f, 0.151644263013162f,
322
+ 0.185460257086808f, 0.219347083403316f, 0.253318071908346f,
323
+ 0.287386806226095f, 0.321567103923158f, 0.355873075050329f,
324
+ 0.390319263305967f, 0.424920552397901f, 0.459692230045422f,
325
+ 0.494650181610316f, 0.529810843625619f, 0.565191195643323f,
326
+ 0.600808970989236f, 0.636682661398141f, 0.672831567493634f,
327
+ 0.709275946093977f, 0.746037126679468f, 0.783137537563140f,
328
+ 0.820600783245502f, 0.858451939611374f, 0.896717615963322f,
329
+ 0.935426075762634f, 0.974607484216044f, 1.014294067830043f,
330
+ 1.054520418037026f, 1.095323771921318f, 1.136744262343403f,
331
+ 1.178825265520504f, 1.221613876387012f, 1.265161378699170f,
332
+ 1.309523700469555f, 1.354762105115604f, 1.400944106526214f,
333
+ 1.448144252238147f, 1.496445137501057f, 1.545938700893484f,
334
+ 1.596727786313424f, 1.648928306223807f, 1.702671162415673f,
335
+ 1.758105160675647f, 1.815400993379865f, 1.874755326807296f,
336
+ 1.936396720412283f, 2.000593243383757f, 2.067662153838450f,
337
+ 2.137983242734970f, 2.212016460501213f, 2.290326870492530f,
338
+ 2.373620316421171f, 2.462795908452321f, 2.559023499137449f,
339
+ 2.663867022558051f, 2.779491911054078f, 2.909021527386642f,
340
+ 3.057216102842374f, 3.231896182843021f, 3.447381010593710f,
341
+ 3.734857105369156f, 4.189521933023523f
342
+ };
343
+ const float kLloydMaxBoundaries7[] = {
344
+ -3.962189519196340f, -3.591119057981433f,
345
+ -3.339638596718365f, -3.144556142842697f,
346
+ -2.983118815114508f, -2.844256719220360f,
347
+ -2.721679466806065f, -2.611445260847750f,
348
+ -2.510909703794885f, -2.418208112436746f,
349
+ -2.331973593456850f, -2.251171665496871f,
350
+ -2.174999851618091f, -2.102822698286710f,
351
+ -2.034127698611103f, -1.968494981898020f,
352
+ -1.905576023609790f, -1.845078160093581f,
353
+ -1.786753077027756f, -1.730388161545660f,
354
+ -1.675799734319740f, -1.622828046268615f,
355
+ -1.571333243603454f, -1.521191919197270f,
356
+ -1.472294694869602f, -1.424544179382180f,
357
+ -1.377853105820909f, -1.332142902792580f,
358
+ -1.287342539584363f, -1.243387627543091f,
359
+ -1.200219570953758f, -1.157784763931954f,
360
+ -1.116034017132360f, -1.074922094979172f,
361
+ -1.034407242933534f, -0.994450776023043f,
362
+ -0.955016779989339f, -0.916071845862978f,
363
+ -0.877584777787348f, -0.839526361428438f,
364
+ -0.801869160404321f, -0.764587332121304f,
365
+ -0.727656536386722f, -0.691053756793806f,
366
+ -0.654757114445887f, -0.618745816193689f,
367
+ -0.583000083316280f, -0.547501019634471f,
368
+ -0.512230512617967f, -0.477171205827869f,
369
+ -0.442306391221661f, -0.407619907851934f,
370
+ -0.373096169178148f, -0.338720089486743f,
371
+ -0.304476955074627f, -0.270352439067221f,
372
+ -0.236332577655831f, -0.202403670245062f,
373
+ -0.168552260049985f, -0.134765115631744f,
374
+ -0.101029194073522f, -0.067331586932840f,
375
+ -0.033659448573345f, 0.000000000000000f,
376
+ 0.033659448573345f, 0.067331586932840f,
377
+ 0.101029194073522f, 0.134765115631744f,
378
+ 0.168552260049985f, 0.202403670245062f,
379
+ 0.236332577655831f, 0.270352439067221f,
380
+ 0.304476955074627f, 0.338720089486743f,
381
+ 0.373096169178148f, 0.407619907851934f,
382
+ 0.442306391221661f, 0.477171205827869f,
383
+ 0.512230512617967f, 0.547501019634471f,
384
+ 0.583000083316280f, 0.618745816193689f,
385
+ 0.654757114445887f, 0.691053756793806f,
386
+ 0.727656536386722f, 0.764587332121304f,
387
+ 0.801869160404321f, 0.839526361428438f,
388
+ 0.877584777787348f, 0.916071845862978f,
389
+ 0.955016779989339f, 0.994450776023043f,
390
+ 1.034407242933534f, 1.074922094979172f,
391
+ 1.116034017132360f, 1.157784763931954f,
392
+ 1.200219570953758f, 1.243387627543091f,
393
+ 1.287342539584363f, 1.332142902792580f,
394
+ 1.377853105820909f, 1.424544179382180f,
395
+ 1.472294694869602f, 1.521191919197270f,
396
+ 1.571333243603454f, 1.622828046268615f,
397
+ 1.675799734319740f, 1.730388161545660f,
398
+ 1.786753077027756f, 1.845078160093581f,
399
+ 1.905576023609790f, 1.968494981898020f,
400
+ 2.034127698611103f, 2.102822698286710f,
401
+ 2.174999851618091f, 2.251171665496871f,
402
+ 2.331973593456850f, 2.418208112436746f,
403
+ 2.510909703794885f, 2.611445260847750f,
404
+ 2.721679466806065f, 2.844256719220360f,
405
+ 2.983118815114508f, 3.144556142842697f,
406
+ 3.339638596718365f, 3.591119057981433f,
407
+ 3.962189519196340f
408
+ };
409
+ // clang-format on
410
+
411
+ struct LloydMaxTable {
412
+ const float* centroids;
413
+ const float* boundaries;
414
+ };
415
+
416
+ const LloydMaxTable kLloydMaxTables[] = {
417
+ {nullptr, nullptr}, // 0
418
+ {kLloydMaxCentroids1, kLloydMaxBoundaries1}, // 1
419
+ {kLloydMaxCentroids2, kLloydMaxBoundaries2}, // 2
420
+ {kLloydMaxCentroids3, kLloydMaxBoundaries3}, // 3
421
+ {kLloydMaxCentroids4, kLloydMaxBoundaries4}, // 4
422
+ {kLloydMaxCentroids5, kLloydMaxBoundaries5}, // 5
423
+ {kLloydMaxCentroids6, kLloydMaxBoundaries6}, // 6
424
+ {kLloydMaxCentroids7, kLloydMaxBoundaries7}, // 7
425
+ {kLloydMaxCentroids8, kLloydMaxBoundaries8}, // 8
426
+ };
427
+
428
+ void populate_lloyd_max_trained(size_t mse_bits, std::vector<float>& trained) {
429
+ FAISS_THROW_IF_NOT(mse_bits >= 1 && mse_bits <= 8);
430
+ FAISS_THROW_IF_NOT(kLloydMaxTables[mse_bits].centroids);
431
+ size_t k = size_t(1) << mse_bits;
432
+ const auto& t = kLloydMaxTables[mse_bits];
433
+ trained.resize(k + (k - 1));
434
+ std::copy(t.centroids, t.centroids + k, trained.begin());
435
+ std::copy(t.boundaries, t.boundaries + k - 1, trained.begin() + k);
436
+ }
437
+
438
+ } // namespace
439
+
28
440
  /*******************************************************************
29
441
  * ScalarQuantizer implementation
30
442
  ********************************************************************/
@@ -39,14 +451,17 @@ ScalarQuantizer::ScalarQuantizer() {}
39
451
  void ScalarQuantizer::set_derived_sizes() {
40
452
  switch (qtype) {
41
453
  case QT_1bit_tqmse:
454
+ case QT_1bit_eden:
42
455
  code_size = (d + 7) / 8;
43
456
  bits = 1;
44
457
  break;
45
458
  case QT_2bit_tqmse:
459
+ case QT_2bit_eden:
46
460
  code_size = (d * 2 + 7) / 8;
47
461
  bits = 2;
48
462
  break;
49
463
  case QT_3bit_tqmse:
464
+ case QT_3bit_eden:
50
465
  code_size = (d * 3 + 7) / 8;
51
466
  bits = 3;
52
467
  break;
@@ -55,19 +470,30 @@ void ScalarQuantizer::set_derived_sizes() {
55
470
  case QT_8bit_direct:
56
471
  case QT_8bit_direct_signed:
57
472
  case QT_8bit_tqmse:
473
+ case QT_8bit_eden:
58
474
  code_size = d;
59
475
  bits = 8;
60
476
  break;
61
477
  case QT_4bit:
62
478
  case QT_4bit_uniform:
63
479
  case QT_4bit_tqmse:
480
+ case QT_4bit_eden:
64
481
  code_size = (d + 1) / 2;
65
482
  bits = 4;
66
483
  break;
484
+ case QT_5bit_eden:
485
+ code_size = (d * 5 + 7) / 8;
486
+ bits = 5;
487
+ break;
67
488
  case QT_6bit:
489
+ case QT_6bit_eden:
68
490
  code_size = (d * 6 + 7) / 8;
69
491
  bits = 6;
70
492
  break;
493
+ case QT_7bit_eden:
494
+ code_size = (d * 7 + 7) / 8;
495
+ bits = 7;
496
+ break;
71
497
  case QT_fp16:
72
498
  code_size = d * 2;
73
499
  bits = 16;
@@ -80,6 +506,24 @@ void ScalarQuantizer::set_derived_sizes() {
80
506
  code_size = 0;
81
507
  bits = 0;
82
508
  break;
509
+ case QT_2bit_tq:
510
+ case QT_3bit_tq:
511
+ case QT_4bit_tq:
512
+ case QT_5bit_tq: {
513
+ size_t nb_bits = (qtype == QT_2bit_tq) ? 2
514
+ : (qtype == QT_3bit_tq) ? 3
515
+ : (qtype == QT_4bit_tq) ? 4
516
+ : (qtype == QT_5bit_tq) ? 5
517
+ : 0;
518
+ FAISS_THROW_IF_NOT_MSG(nb_bits > 0, "unexpected TurboQ qtype");
519
+ size_t mse_bits = nb_bits - 1;
520
+ size_t mse_bytes = mse_bits * ((d + 7) / 8);
521
+ size_t qjl_bytes = (d + 7) / 8;
522
+ code_size = mse_bytes + qjl_bytes +
523
+ sizeof(scalar_quantizer::SQTurboQFactors);
524
+ bits = nb_bits;
525
+ break;
526
+ }
83
527
  default:
84
528
  break;
85
529
  }
@@ -104,7 +548,7 @@ void ScalarQuantizer::train(size_t n, const float* x) {
104
548
  case QT_4bit_uniform:
105
549
  case QT_8bit_uniform:
106
550
  FAISS_THROW_IF_NOT(n > 0);
107
- FAISS_THROW_IF_NOT(x != nullptr);
551
+ FAISS_THROW_IF_NOT(x);
108
552
  train_Uniform(
109
553
  rangestat,
110
554
  rangestat_arg,
@@ -117,7 +561,7 @@ void ScalarQuantizer::train(size_t n, const float* x) {
117
561
  case QT_8bit:
118
562
  case QT_6bit:
119
563
  FAISS_THROW_IF_NOT(n > 0);
120
- FAISS_THROW_IF_NOT(x != nullptr);
564
+ FAISS_THROW_IF_NOT(x);
121
565
  train_NonUniform(
122
566
  rangestat,
123
567
  rangestat_arg,
@@ -133,38 +577,78 @@ void ScalarQuantizer::train(size_t n, const float* x) {
133
577
  case QT_8bit_direct_signed:
134
578
  // no training necessary
135
579
  break;
580
+ case QT_1bit_eden:
581
+ case QT_2bit_eden:
582
+ case QT_3bit_eden:
583
+ case QT_4bit_eden:
584
+ case QT_5bit_eden:
585
+ case QT_6bit_eden:
586
+ case QT_7bit_eden:
587
+ case QT_8bit_eden:
588
+ populate_lloyd_max_trained(bits, trained);
589
+ break;
136
590
  case QT_1bit_tqmse:
137
- scalar_quantizer::train_TurboQuantMSE(d, 1, trained);
591
+ populate_lloyd_max_trained(1, trained);
138
592
  break;
139
593
  case QT_2bit_tqmse:
140
- scalar_quantizer::train_TurboQuantMSE(d, 2, trained);
594
+ populate_lloyd_max_trained(2, trained);
141
595
  break;
142
596
  case QT_3bit_tqmse:
143
- scalar_quantizer::train_TurboQuantMSE(d, 3, trained);
597
+ populate_lloyd_max_trained(3, trained);
144
598
  break;
145
599
  case QT_4bit_tqmse:
146
- scalar_quantizer::train_TurboQuantMSE(d, 4, trained);
600
+ populate_lloyd_max_trained(4, trained);
147
601
  break;
148
602
  case QT_8bit_tqmse:
149
- scalar_quantizer::train_TurboQuantMSE(d, 8, trained);
603
+ populate_lloyd_max_trained(8, trained);
604
+ break;
605
+ case QT_2bit_tq:
606
+ case QT_3bit_tq:
607
+ case QT_4bit_tq:
608
+ case QT_5bit_tq: {
609
+ size_t mse_bits = bits - 1;
610
+ populate_lloyd_max_trained(mse_bits, trained);
611
+ // Pack seed and qjl_type at end of trained for dispatch
612
+ float seed_f[2];
613
+ TurboQuantRefine::pack_seed(turboq_refine.seed, seed_f);
614
+ trained.push_back(seed_f[0]);
615
+ trained.push_back(seed_f[1]);
616
+ trained.push_back(static_cast<float>(turboq_refine.qjl_type));
617
+ turboq_refine.init_projection(d);
150
618
  break;
619
+ }
151
620
  default:
152
621
  break;
153
622
  }
154
623
  }
155
624
 
156
- ScalarQuantizer::SQuantizer* ScalarQuantizer::select_quantizer() const {
157
- return with_simd_level([&]<SIMDLevel SL>() -> SQuantizer* {
158
- if constexpr (SL != SIMDLevel::NONE) {
159
- auto* q = scalar_quantizer::sq_select_quantizer<SL>(
160
- qtype, d, trained);
161
- if (q) {
162
- return q;
163
- }
625
+ void ScalarQuantizer::TurboQuantRefine::init_projection(size_t d) {
626
+ if (use_fwht()) {
627
+ padded_d = 1;
628
+ while (padded_d < d) {
629
+ padded_d <<= 1;
630
+ }
631
+ fwht_signs.resize(padded_d);
632
+ RandomGenerator rng(seed);
633
+ for (size_t i = 0; i < padded_d; i++) {
634
+ fwht_signs[i] = (rng.rand_int(2) == 0) ? 1.0f : -1.0f;
164
635
  }
165
- return scalar_quantizer::sq_select_quantizer<SIMDLevel::NONE>(
166
- qtype, d, trained);
167
- });
636
+ } else {
637
+ rr_matrix.resize(d * d);
638
+ float_randn(rr_matrix.data(), d * d, seed);
639
+ matrix_qr(static_cast<int>(d), static_cast<int>(d), rr_matrix.data());
640
+ }
641
+ }
642
+
643
+ ScalarQuantizer::SQuantizer* ScalarQuantizer::select_quantizer() const {
644
+ // A SIMD level's factory returns nullptr when the dimension is
645
+ // incompatible (e.g. AVX-512 needs d % 16 == 0); the dispatcher then falls
646
+ // back to the next-lower level (AVX-512 -> AVX2 -> scalar).
647
+ return with_simd_level_fallback<AVAILABLE_SIMD_LEVELS_A0_SPR>(
648
+ [&]<SIMDLevel SL>() -> SQuantizer* {
649
+ return scalar_quantizer::sq_select_quantizer<SL>(
650
+ qtype, d, trained);
651
+ });
168
652
  }
169
653
 
170
654
  void ScalarQuantizer::compute_codes(const float* x, uint8_t* codes, size_t n)
@@ -175,7 +659,7 @@ void ScalarQuantizer::compute_codes(const float* x, uint8_t* codes, size_t n)
175
659
  std::unique_ptr<SQuantizer> squant(select_quantizer());
176
660
 
177
661
  memset(codes, 0, code_size * n);
178
- #pragma omp parallel for
662
+ #pragma omp parallel for if (n > 100)
179
663
  for (int64_t i = 0; i < static_cast<int64_t>(n); i++) {
180
664
  squant->encode_vector(x + i * d, codes + i * code_size);
181
665
  }
@@ -188,7 +672,7 @@ void ScalarQuantizer::decode(const uint8_t* codes, float* x, size_t n) const {
188
672
  }
189
673
  std::unique_ptr<SQuantizer> squant(select_quantizer());
190
674
 
191
- #pragma omp parallel for
675
+ #pragma omp parallel for if (n > 100)
192
676
  for (int64_t i = 0; i < static_cast<int64_t>(n); i++) {
193
677
  squant->decode_vector(codes + i * code_size, x + i * d);
194
678
  }
@@ -197,17 +681,11 @@ void ScalarQuantizer::decode(const uint8_t* codes, float* x, size_t n) const {
197
681
  ScalarQuantizer::SQDistanceComputer* ScalarQuantizer::get_distance_computer(
198
682
  MetricType metric) const {
199
683
  FAISS_THROW_IF_NOT(metric == METRIC_L2 || metric == METRIC_INNER_PRODUCT);
200
- return with_simd_level([&]<SIMDLevel SL>() -> SQDistanceComputer* {
201
- if constexpr (SL != SIMDLevel::NONE) {
202
- auto* dc = scalar_quantizer::sq_select_distance_computer<SL>(
203
- metric, qtype, d, trained);
204
- if (dc) {
205
- return dc;
206
- }
207
- }
208
- return scalar_quantizer::sq_select_distance_computer<SIMDLevel::NONE>(
209
- metric, qtype, d, trained);
210
- });
684
+ return with_simd_level_fallback<AVAILABLE_SIMD_LEVELS_A0_SPR>(
685
+ [&]<SIMDLevel SL>() -> SQDistanceComputer* {
686
+ return scalar_quantizer::sq_select_distance_computer<SL>(
687
+ metric, qtype, d, trained);
688
+ });
211
689
  }
212
690
 
213
691
  InvertedListScanner* ScalarQuantizer::select_InvertedListScanner(
@@ -216,33 +694,19 @@ InvertedListScanner* ScalarQuantizer::select_InvertedListScanner(
216
694
  bool store_pairs,
217
695
  const IDSelector* sel,
218
696
  bool by_residual) const {
219
- return with_simd_level([&]<SIMDLevel SL>() -> InvertedListScanner* {
220
- if constexpr (SL != SIMDLevel::NONE) {
221
- auto* s = scalar_quantizer::sq_select_InvertedListScanner<SL>(
222
- qtype,
223
- mt,
224
- d,
225
- code_size,
226
- trained,
227
- quantizer,
228
- store_pairs,
229
- sel,
230
- by_residual);
231
- if (s) {
232
- return s;
233
- }
234
- }
235
- return scalar_quantizer::sq_select_InvertedListScanner<SIMDLevel::NONE>(
236
- qtype,
237
- mt,
238
- d,
239
- code_size,
240
- trained,
241
- quantizer,
242
- store_pairs,
243
- sel,
244
- by_residual);
245
- });
697
+ return with_simd_level_fallback<AVAILABLE_SIMD_LEVELS_A0_SPR>(
698
+ [&]<SIMDLevel SL>() -> InvertedListScanner* {
699
+ return scalar_quantizer::sq_select_InvertedListScanner<SL>(
700
+ qtype,
701
+ mt,
702
+ d,
703
+ code_size,
704
+ trained,
705
+ quantizer,
706
+ store_pairs,
707
+ sel,
708
+ by_residual);
709
+ });
246
710
  }
247
711
 
248
712
  } // namespace faiss