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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/lib/faiss/version.rb +1 -1
- data/vendor/faiss/faiss/AutoTune.cpp +3 -1
- data/vendor/faiss/faiss/Clustering.cpp +9 -1
- data/vendor/faiss/faiss/IVFlib.cpp +14 -3
- data/vendor/faiss/faiss/Index.h +2 -2
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +9 -10
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +2 -3
- data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +1 -2
- data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +10 -12
- data/vendor/faiss/faiss/IndexBinaryHash.cpp +5 -9
- data/vendor/faiss/faiss/IndexBinaryIVF.cpp +5 -7
- data/vendor/faiss/faiss/IndexEDEN.cpp +273 -0
- data/vendor/faiss/faiss/IndexEDEN.h +57 -0
- data/vendor/faiss/faiss/IndexFastScan.cpp +15 -4
- data/vendor/faiss/faiss/IndexFlat.cpp +13 -50
- data/vendor/faiss/faiss/IndexHNSW.cpp +177 -148
- data/vendor/faiss/faiss/IndexIDMap.cpp +16 -3
- data/vendor/faiss/faiss/IndexIDMap.h +2 -0
- data/vendor/faiss/faiss/IndexIVF.cpp +19 -8
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +3 -3
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +3 -4
- data/vendor/faiss/faiss/IndexIVFEDEN.cpp +302 -0
- data/vendor/faiss/faiss/IndexIVFEDEN.h +70 -0
- data/vendor/faiss/faiss/IndexIVFFastScan.cpp +5 -6
- data/vendor/faiss/faiss/IndexIVFFlat.cpp +6 -5
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +3 -3
- data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +1 -1
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +42 -25
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +0 -1
- data/vendor/faiss/faiss/IndexIVFPQR.cpp +2 -3
- data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +23 -62
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +180 -76
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +5 -4
- data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +8 -6
- data/vendor/faiss/faiss/IndexLSH.cpp +2 -3
- data/vendor/faiss/faiss/IndexLattice.cpp +5 -0
- data/vendor/faiss/faiss/IndexNNDescent.cpp +10 -3
- data/vendor/faiss/faiss/IndexNSG.cpp +8 -4
- data/vendor/faiss/faiss/IndexPQ.cpp +6 -8
- data/vendor/faiss/faiss/IndexPreTransform.cpp +15 -0
- data/vendor/faiss/faiss/IndexRaBitQ.cpp +2 -2
- data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +1 -2
- data/vendor/faiss/faiss/IndexRaBitQFastScan.h +5 -1
- data/vendor/faiss/faiss/IndexRefine.cpp +30 -1
- data/vendor/faiss/faiss/IndexReplicas.cpp +1 -2
- data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +68 -6
- data/vendor/faiss/faiss/IndexScalarQuantizer.h +10 -0
- data/vendor/faiss/faiss/IndexShards.cpp +2 -2
- data/vendor/faiss/faiss/IndexShardsIVF.cpp +2 -2
- data/vendor/faiss/faiss/MetaIndexes.cpp +2 -4
- data/vendor/faiss/faiss/SuperKMeans.cpp +256 -240
- data/vendor/faiss/faiss/SuperKMeans.h +30 -0
- data/vendor/faiss/faiss/VectorTransform.cpp +33 -2
- data/vendor/faiss/faiss/clone_index.cpp +5 -0
- data/vendor/faiss/faiss/cppcontrib/SaDecodeKernels.h +1 -1
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-neon-inl.h +902 -12
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-neon-inl.h +702 -10
- data/vendor/faiss/faiss/factory_tools.cpp +51 -4
- data/vendor/faiss/faiss/gpu/GpuCloner.cpp +11 -11
- data/vendor/faiss/faiss/gpu/GpuIndex.h +34 -11
- data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +47 -0
- data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +17 -0
- data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +16 -0
- data/vendor/faiss/faiss/gpu/GpuResources.h +3 -2
- data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +11 -12
- data/vendor/faiss/faiss/gpu/StandardGpuResources.h +3 -3
- data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +1 -1
- data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +2 -2
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +180 -0
- data/vendor/faiss/faiss/gpu_metal/MetalDistance.h +87 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +7 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndexIVFFlat.h +177 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndexIVFPQ.h +88 -0
- data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +48 -3
- data/vendor/faiss/faiss/gpu_metal/MetalPythonBridge.h +45 -0
- data/vendor/faiss/faiss/gpu_metal/impl/MetalIVFFlat.h +193 -0
- data/vendor/faiss/faiss/gpu_metal/impl/MetalIVFPQ.h +134 -0
- data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +2 -2
- data/vendor/faiss/faiss/impl/DistanceComputer.h +34 -0
- data/vendor/faiss/faiss/impl/EDENQuantizer.h +119 -0
- data/vendor/faiss/faiss/impl/HNSW.cpp +658 -344
- data/vendor/faiss/faiss/impl/HNSW.h +51 -13
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +2 -2
- data/vendor/faiss/faiss/impl/NSG.cpp +18 -12
- data/vendor/faiss/faiss/impl/Panorama.h +20 -7
- data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +152 -84
- data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +59 -24
- data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +45 -37
- data/vendor/faiss/faiss/impl/RaBitQUtils.h +35 -0
- data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +175 -68
- data/vendor/faiss/faiss/impl/RaBitQuantizer.h +19 -0
- data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.cpp +2 -11
- data/vendor/faiss/faiss/impl/ResultHandler.h +26 -31
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +522 -58
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +70 -0
- data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +2 -2
- data/vendor/faiss/faiss/impl/VisitedTable.cpp +33 -13
- data/vendor/faiss/faiss/impl/VisitedTable.h +88 -33
- data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +1 -1
- data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +4 -4
- data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +38 -3
- data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +1 -1
- data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +35 -43
- data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +64 -15
- data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +86 -40
- data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +81 -50
- data/vendor/faiss/faiss/impl/index_read.cpp +476 -75
- data/vendor/faiss/faiss/impl/index_write.cpp +56 -4
- data/vendor/faiss/faiss/impl/io_macros.h +25 -0
- data/vendor/faiss/faiss/impl/lattice_Zn.cpp +8 -9
- data/vendor/faiss/faiss/impl/platform_macros.h +15 -9
- data/vendor/faiss/faiss/impl/polysemous_training/avx512.cpp +284 -0
- data/vendor/faiss/faiss/impl/polysemous_training/dispatch.h +115 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +0 -1
- data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +26 -15
- data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +6 -4
- data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +2 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +2 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +20 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +36 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp +5 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_scan_impl.h +105 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +2 -0
- data/vendor/faiss/faiss/impl/result_handler/ResultHandler.cpp +195 -0
- data/vendor/faiss/faiss/impl/result_handler/avx2.cpp +133 -0
- data/vendor/faiss/faiss/impl/result_handler/avx512.cpp +281 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer-avx2.cpp +72 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer-avx512.cpp +228 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer.cpp +882 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +6 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +336 -26
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +331 -32
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-impl.h +553 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-spr.cpp +558 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +284 -45
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +502 -3
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +157 -32
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +26 -0
- data/vendor/faiss/faiss/impl/simd_dispatch.h +86 -8
- data/vendor/faiss/faiss/index_factory.cpp +37 -7
- data/vendor/faiss/faiss/index_io.h +16 -0
- data/vendor/faiss/faiss/invlists/DirectMap.cpp +5 -2
- data/vendor/faiss/faiss/invlists/InvertedLists.cpp +15 -15
- data/vendor/faiss/faiss/invlists/InvertedLists.h +2 -2
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +19 -4
- data/vendor/faiss/faiss/python/python_callbacks.cpp +3 -1
- data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +60 -0
- data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +26 -1
- data/vendor/faiss/faiss/svs/IndexSVSFlat.h +13 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +150 -23
- data/vendor/faiss/faiss/svs/IndexSVSVamana.h +30 -7
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.cpp +3 -2
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +2 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +65 -25
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +3 -2
- data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +1 -1
- data/vendor/faiss/faiss/utils/bf16.h +34 -0
- data/vendor/faiss/faiss/utils/distances.cpp +14 -2
- data/vendor/faiss/faiss/utils/distances_simd.cpp +4 -4
- data/vendor/faiss/faiss/utils/extra_distances.cpp +4 -14
- data/vendor/faiss/faiss/utils/extra_distances.h +1 -2
- data/vendor/faiss/faiss/utils/hamming.cpp +9 -9
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +2 -1
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512_spr.cpp +15 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +6 -30
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512_spr.h +171 -0
- data/vendor/faiss/faiss/utils/partitioning.cpp +0 -2
- data/vendor/faiss/faiss/utils/quantize_lut.cpp +29 -8
- data/vendor/faiss/faiss/utils/rabitq_simd.h +202 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +0 -1
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +263 -15
- data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +160 -18
- data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +14 -68
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +245 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +273 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512_spr.cpp +435 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +11 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +143 -6
- data/vendor/faiss/faiss/utils/simd_levels.cpp +56 -2
- data/vendor/faiss/faiss/utils/simd_levels.h +14 -0
- data/vendor/faiss/faiss/utils/utils.cpp +9 -27
- 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
|
|
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
|
|
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
|
-
|
|
591
|
+
populate_lloyd_max_trained(1, trained);
|
|
138
592
|
break;
|
|
139
593
|
case QT_2bit_tqmse:
|
|
140
|
-
|
|
594
|
+
populate_lloyd_max_trained(2, trained);
|
|
141
595
|
break;
|
|
142
596
|
case QT_3bit_tqmse:
|
|
143
|
-
|
|
597
|
+
populate_lloyd_max_trained(3, trained);
|
|
144
598
|
break;
|
|
145
599
|
case QT_4bit_tqmse:
|
|
146
|
-
|
|
600
|
+
populate_lloyd_max_trained(4, trained);
|
|
147
601
|
break;
|
|
148
602
|
case QT_8bit_tqmse:
|
|
149
|
-
|
|
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
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
|
|
166
|
-
|
|
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
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
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
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
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
|