faiss 0.2.0 → 0.2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -0
- data/LICENSE.txt +1 -1
- data/README.md +7 -7
- data/ext/faiss/extconf.rb +6 -3
- data/ext/faiss/numo.hpp +4 -4
- data/ext/faiss/utils.cpp +1 -1
- data/ext/faiss/utils.h +1 -1
- data/lib/faiss/version.rb +1 -1
- data/vendor/faiss/faiss/AutoTune.cpp +292 -291
- data/vendor/faiss/faiss/AutoTune.h +55 -56
- data/vendor/faiss/faiss/Clustering.cpp +365 -194
- data/vendor/faiss/faiss/Clustering.h +102 -35
- data/vendor/faiss/faiss/IVFlib.cpp +171 -195
- data/vendor/faiss/faiss/IVFlib.h +48 -51
- data/vendor/faiss/faiss/Index.cpp +85 -103
- data/vendor/faiss/faiss/Index.h +54 -48
- data/vendor/faiss/faiss/Index2Layer.cpp +126 -224
- data/vendor/faiss/faiss/Index2Layer.h +22 -36
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +407 -0
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.h +195 -0
- data/vendor/faiss/faiss/IndexBinary.cpp +45 -37
- data/vendor/faiss/faiss/IndexBinary.h +140 -132
- data/vendor/faiss/faiss/IndexBinaryFlat.cpp +73 -53
- data/vendor/faiss/faiss/IndexBinaryFlat.h +29 -24
- data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +46 -43
- data/vendor/faiss/faiss/IndexBinaryFromFloat.h +16 -15
- data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +215 -232
- data/vendor/faiss/faiss/IndexBinaryHNSW.h +25 -24
- data/vendor/faiss/faiss/IndexBinaryHash.cpp +182 -177
- data/vendor/faiss/faiss/IndexBinaryHash.h +41 -34
- data/vendor/faiss/faiss/IndexBinaryIVF.cpp +489 -461
- data/vendor/faiss/faiss/IndexBinaryIVF.h +97 -68
- data/vendor/faiss/faiss/IndexFlat.cpp +115 -176
- data/vendor/faiss/faiss/IndexFlat.h +42 -59
- data/vendor/faiss/faiss/IndexFlatCodes.cpp +67 -0
- data/vendor/faiss/faiss/IndexFlatCodes.h +47 -0
- data/vendor/faiss/faiss/IndexHNSW.cpp +372 -348
- data/vendor/faiss/faiss/IndexHNSW.h +57 -41
- data/vendor/faiss/faiss/IndexIVF.cpp +545 -453
- data/vendor/faiss/faiss/IndexIVF.h +169 -118
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +316 -0
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.h +121 -0
- data/vendor/faiss/faiss/IndexIVFFlat.cpp +247 -252
- data/vendor/faiss/faiss/IndexIVFFlat.h +48 -51
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +459 -517
- data/vendor/faiss/faiss/IndexIVFPQ.h +75 -67
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +406 -372
- data/vendor/faiss/faiss/IndexIVFPQFastScan.h +82 -57
- data/vendor/faiss/faiss/IndexIVFPQR.cpp +104 -102
- data/vendor/faiss/faiss/IndexIVFPQR.h +33 -28
- data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +163 -150
- data/vendor/faiss/faiss/IndexIVFSpectralHash.h +38 -25
- data/vendor/faiss/faiss/IndexLSH.cpp +66 -113
- data/vendor/faiss/faiss/IndexLSH.h +20 -38
- data/vendor/faiss/faiss/IndexLattice.cpp +42 -56
- data/vendor/faiss/faiss/IndexLattice.h +11 -16
- data/vendor/faiss/faiss/IndexNNDescent.cpp +229 -0
- data/vendor/faiss/faiss/IndexNNDescent.h +72 -0
- data/vendor/faiss/faiss/IndexNSG.cpp +301 -0
- data/vendor/faiss/faiss/IndexNSG.h +85 -0
- data/vendor/faiss/faiss/IndexPQ.cpp +387 -495
- data/vendor/faiss/faiss/IndexPQ.h +64 -82
- data/vendor/faiss/faiss/IndexPQFastScan.cpp +143 -170
- data/vendor/faiss/faiss/IndexPQFastScan.h +46 -32
- data/vendor/faiss/faiss/IndexPreTransform.cpp +120 -150
- data/vendor/faiss/faiss/IndexPreTransform.h +33 -36
- data/vendor/faiss/faiss/IndexRefine.cpp +139 -127
- data/vendor/faiss/faiss/IndexRefine.h +32 -23
- data/vendor/faiss/faiss/IndexReplicas.cpp +147 -153
- data/vendor/faiss/faiss/IndexReplicas.h +62 -56
- data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +111 -172
- data/vendor/faiss/faiss/IndexScalarQuantizer.h +41 -59
- data/vendor/faiss/faiss/IndexShards.cpp +256 -240
- data/vendor/faiss/faiss/IndexShards.h +85 -73
- data/vendor/faiss/faiss/MatrixStats.cpp +112 -97
- data/vendor/faiss/faiss/MatrixStats.h +7 -10
- data/vendor/faiss/faiss/MetaIndexes.cpp +135 -157
- data/vendor/faiss/faiss/MetaIndexes.h +40 -34
- data/vendor/faiss/faiss/MetricType.h +7 -7
- data/vendor/faiss/faiss/VectorTransform.cpp +654 -475
- data/vendor/faiss/faiss/VectorTransform.h +64 -89
- data/vendor/faiss/faiss/clone_index.cpp +78 -73
- data/vendor/faiss/faiss/clone_index.h +4 -9
- data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +33 -38
- data/vendor/faiss/faiss/gpu/GpuAutoTune.h +11 -9
- data/vendor/faiss/faiss/gpu/GpuCloner.cpp +198 -171
- data/vendor/faiss/faiss/gpu/GpuCloner.h +53 -35
- data/vendor/faiss/faiss/gpu/GpuClonerOptions.cpp +12 -14
- data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +27 -25
- data/vendor/faiss/faiss/gpu/GpuDistance.h +116 -112
- data/vendor/faiss/faiss/gpu/GpuFaissAssert.h +1 -2
- data/vendor/faiss/faiss/gpu/GpuIcmEncoder.h +60 -0
- data/vendor/faiss/faiss/gpu/GpuIndex.h +134 -137
- data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +76 -73
- data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +173 -162
- data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +67 -64
- data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +89 -86
- data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +150 -141
- data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +101 -103
- data/vendor/faiss/faiss/gpu/GpuIndicesOptions.h +17 -16
- data/vendor/faiss/faiss/gpu/GpuResources.cpp +116 -128
- data/vendor/faiss/faiss/gpu/GpuResources.h +182 -186
- data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +433 -422
- data/vendor/faiss/faiss/gpu/StandardGpuResources.h +131 -130
- data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.cpp +468 -456
- data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.h +25 -19
- data/vendor/faiss/faiss/gpu/impl/RemapIndices.cpp +22 -20
- data/vendor/faiss/faiss/gpu/impl/RemapIndices.h +9 -8
- data/vendor/faiss/faiss/gpu/perf/IndexWrapper-inl.h +39 -44
- data/vendor/faiss/faiss/gpu/perf/IndexWrapper.h +16 -14
- data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +77 -71
- data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +109 -88
- data/vendor/faiss/faiss/gpu/perf/WriteIndex.cpp +75 -64
- data/vendor/faiss/faiss/gpu/test/TestCodePacking.cpp +230 -215
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +80 -86
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +284 -277
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +416 -416
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +611 -517
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +166 -164
- data/vendor/faiss/faiss/gpu/test/TestGpuMemoryException.cpp +61 -53
- data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +274 -238
- data/vendor/faiss/faiss/gpu/test/TestUtils.h +73 -57
- data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +47 -50
- data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +79 -72
- data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +140 -146
- data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.h +69 -71
- data/vendor/faiss/faiss/gpu/utils/StaticUtils.h +21 -16
- data/vendor/faiss/faiss/gpu/utils/Timer.cpp +25 -29
- data/vendor/faiss/faiss/gpu/utils/Timer.h +30 -29
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +503 -0
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +175 -0
- data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +90 -120
- data/vendor/faiss/faiss/impl/AuxIndexStructures.h +81 -65
- data/vendor/faiss/faiss/impl/FaissAssert.h +73 -58
- data/vendor/faiss/faiss/impl/FaissException.cpp +56 -48
- data/vendor/faiss/faiss/impl/FaissException.h +41 -29
- data/vendor/faiss/faiss/impl/HNSW.cpp +606 -617
- data/vendor/faiss/faiss/impl/HNSW.h +179 -200
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +855 -0
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +244 -0
- data/vendor/faiss/faiss/impl/NNDescent.cpp +487 -0
- data/vendor/faiss/faiss/impl/NNDescent.h +154 -0
- data/vendor/faiss/faiss/impl/NSG.cpp +679 -0
- data/vendor/faiss/faiss/impl/NSG.h +199 -0
- data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +484 -454
- data/vendor/faiss/faiss/impl/PolysemousTraining.h +52 -55
- data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +26 -47
- data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +469 -459
- data/vendor/faiss/faiss/impl/ProductQuantizer.h +76 -87
- data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +758 -0
- data/vendor/faiss/faiss/impl/ResidualQuantizer.h +188 -0
- data/vendor/faiss/faiss/impl/ResultHandler.h +96 -132
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +647 -707
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +48 -46
- data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +129 -131
- data/vendor/faiss/faiss/impl/ThreadedIndex.h +61 -55
- data/vendor/faiss/faiss/impl/index_read.cpp +631 -480
- data/vendor/faiss/faiss/impl/index_write.cpp +547 -407
- data/vendor/faiss/faiss/impl/io.cpp +76 -95
- data/vendor/faiss/faiss/impl/io.h +31 -41
- data/vendor/faiss/faiss/impl/io_macros.h +60 -29
- data/vendor/faiss/faiss/impl/kmeans1d.cpp +301 -0
- data/vendor/faiss/faiss/impl/kmeans1d.h +48 -0
- data/vendor/faiss/faiss/impl/lattice_Zn.cpp +137 -186
- data/vendor/faiss/faiss/impl/lattice_Zn.h +40 -51
- data/vendor/faiss/faiss/impl/platform_macros.h +29 -8
- data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +77 -124
- data/vendor/faiss/faiss/impl/pq4_fast_scan.h +39 -48
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +41 -52
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +80 -117
- data/vendor/faiss/faiss/impl/simd_result_handlers.h +109 -137
- data/vendor/faiss/faiss/index_factory.cpp +619 -397
- data/vendor/faiss/faiss/index_factory.h +8 -6
- data/vendor/faiss/faiss/index_io.h +23 -26
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +67 -75
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +22 -24
- data/vendor/faiss/faiss/invlists/DirectMap.cpp +96 -112
- data/vendor/faiss/faiss/invlists/DirectMap.h +29 -33
- data/vendor/faiss/faiss/invlists/InvertedLists.cpp +307 -364
- data/vendor/faiss/faiss/invlists/InvertedLists.h +151 -151
- data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +29 -34
- data/vendor/faiss/faiss/invlists/InvertedListsIOHook.h +17 -18
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +257 -293
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +50 -45
- data/vendor/faiss/faiss/python/python_callbacks.cpp +23 -26
- data/vendor/faiss/faiss/python/python_callbacks.h +9 -16
- data/vendor/faiss/faiss/utils/AlignedTable.h +79 -44
- data/vendor/faiss/faiss/utils/Heap.cpp +40 -48
- data/vendor/faiss/faiss/utils/Heap.h +186 -209
- data/vendor/faiss/faiss/utils/WorkerThread.cpp +67 -76
- data/vendor/faiss/faiss/utils/WorkerThread.h +32 -33
- data/vendor/faiss/faiss/utils/distances.cpp +305 -312
- data/vendor/faiss/faiss/utils/distances.h +170 -122
- data/vendor/faiss/faiss/utils/distances_simd.cpp +498 -508
- data/vendor/faiss/faiss/utils/extra_distances-inl.h +117 -0
- data/vendor/faiss/faiss/utils/extra_distances.cpp +113 -232
- data/vendor/faiss/faiss/utils/extra_distances.h +30 -29
- data/vendor/faiss/faiss/utils/hamming-inl.h +260 -209
- data/vendor/faiss/faiss/utils/hamming.cpp +375 -469
- data/vendor/faiss/faiss/utils/hamming.h +62 -85
- data/vendor/faiss/faiss/utils/ordered_key_value.h +16 -18
- data/vendor/faiss/faiss/utils/partitioning.cpp +393 -318
- data/vendor/faiss/faiss/utils/partitioning.h +26 -21
- data/vendor/faiss/faiss/utils/quantize_lut.cpp +78 -66
- data/vendor/faiss/faiss/utils/quantize_lut.h +22 -20
- data/vendor/faiss/faiss/utils/random.cpp +39 -63
- data/vendor/faiss/faiss/utils/random.h +13 -16
- data/vendor/faiss/faiss/utils/simdlib.h +4 -2
- data/vendor/faiss/faiss/utils/simdlib_avx2.h +88 -85
- data/vendor/faiss/faiss/utils/simdlib_emulated.h +226 -165
- data/vendor/faiss/faiss/utils/simdlib_neon.h +832 -0
- data/vendor/faiss/faiss/utils/utils.cpp +304 -287
- data/vendor/faiss/faiss/utils/utils.h +54 -49
- metadata +29 -4
|
@@ -15,41 +15,39 @@
|
|
|
15
15
|
|
|
16
16
|
namespace faiss {
|
|
17
17
|
|
|
18
|
-
|
|
19
18
|
/** Class for the clustering parameters. Can be passed to the
|
|
20
19
|
* constructor of the Clustering object.
|
|
21
20
|
*/
|
|
22
21
|
struct ClusteringParameters {
|
|
23
|
-
int niter;
|
|
24
|
-
int nredo;
|
|
22
|
+
int niter; ///< clustering iterations
|
|
23
|
+
int nredo; ///< redo clustering this many times and keep best
|
|
25
24
|
|
|
26
25
|
bool verbose;
|
|
27
|
-
bool spherical;
|
|
28
|
-
bool int_centroids;
|
|
29
|
-
bool update_index;
|
|
30
|
-
bool frozen_centroids;
|
|
26
|
+
bool spherical; ///< do we want normalized centroids?
|
|
27
|
+
bool int_centroids; ///< round centroids coordinates to integer
|
|
28
|
+
bool update_index; ///< re-train index after each iteration?
|
|
29
|
+
bool frozen_centroids; ///< use the centroids provided as input and do not
|
|
30
|
+
///< change them during iterations
|
|
31
31
|
|
|
32
32
|
int min_points_per_centroid; ///< otherwise you get a warning
|
|
33
|
-
int max_points_per_centroid;
|
|
33
|
+
int max_points_per_centroid; ///< to limit size of dataset
|
|
34
34
|
|
|
35
35
|
int seed; ///< seed for the random number generator
|
|
36
36
|
|
|
37
|
-
size_t decode_block_size;
|
|
37
|
+
size_t decode_block_size; ///< how many vectors at a time to decode
|
|
38
38
|
|
|
39
39
|
/// sets reasonable defaults
|
|
40
|
-
ClusteringParameters
|
|
40
|
+
ClusteringParameters();
|
|
41
41
|
};
|
|
42
42
|
|
|
43
|
-
|
|
44
43
|
struct ClusteringIterationStats {
|
|
45
|
-
float obj;
|
|
46
|
-
double time;
|
|
44
|
+
float obj; ///< objective values (sum of distances reported by index)
|
|
45
|
+
double time; ///< seconds for iteration
|
|
47
46
|
double time_search; ///< seconds for just search
|
|
48
47
|
double imbalance_factor; ///< imbalance factor of iteration
|
|
49
48
|
int nsplit; ///< number of cluster splits
|
|
50
49
|
};
|
|
51
50
|
|
|
52
|
-
|
|
53
51
|
/** K-means clustering based on assignment - centroid update iterations
|
|
54
52
|
*
|
|
55
53
|
* The clustering is based on an Index object that assigns training
|
|
@@ -62,21 +60,22 @@ struct ClusteringIterationStats {
|
|
|
62
60
|
* initialization.
|
|
63
61
|
*
|
|
64
62
|
*/
|
|
65
|
-
struct Clustering: ClusteringParameters {
|
|
63
|
+
struct Clustering : ClusteringParameters {
|
|
66
64
|
typedef Index::idx_t idx_t;
|
|
67
|
-
size_t d;
|
|
68
|
-
size_t k;
|
|
65
|
+
size_t d; ///< dimension of the vectors
|
|
66
|
+
size_t k; ///< nb of centroids
|
|
69
67
|
|
|
70
68
|
/** centroids (k * d)
|
|
71
|
-
* if centroids are set on input to train, they will be used as
|
|
69
|
+
* if centroids are set on input to train, they will be used as
|
|
70
|
+
* initialization
|
|
72
71
|
*/
|
|
73
72
|
std::vector<float> centroids;
|
|
74
73
|
|
|
75
74
|
/// stats at every iteration of clustering
|
|
76
75
|
std::vector<ClusteringIterationStats> iteration_stats;
|
|
77
76
|
|
|
78
|
-
Clustering
|
|
79
|
-
Clustering
|
|
77
|
+
Clustering(int d, int k);
|
|
78
|
+
Clustering(int d, int k, const ClusteringParameters& cp);
|
|
80
79
|
|
|
81
80
|
/** run k-means training
|
|
82
81
|
*
|
|
@@ -84,9 +83,11 @@ struct Clustering: ClusteringParameters {
|
|
|
84
83
|
* @param index index used for assignment
|
|
85
84
|
* @param x_weights weight associated to each vector: NULL or size n
|
|
86
85
|
*/
|
|
87
|
-
virtual void train
|
|
88
|
-
|
|
89
|
-
|
|
86
|
+
virtual void train(
|
|
87
|
+
idx_t n,
|
|
88
|
+
const float* x,
|
|
89
|
+
faiss::Index& index,
|
|
90
|
+
const float* x_weights = nullptr);
|
|
90
91
|
|
|
91
92
|
/** run with encoded vectors
|
|
92
93
|
*
|
|
@@ -96,17 +97,83 @@ struct Clustering: ClusteringParameters {
|
|
|
96
97
|
* @param codec codec used to decode the vectors (nullptr =
|
|
97
98
|
* vectors are in fact floats) *
|
|
98
99
|
*/
|
|
99
|
-
void train_encoded
|
|
100
|
-
|
|
101
|
-
|
|
100
|
+
void train_encoded(
|
|
101
|
+
idx_t nx,
|
|
102
|
+
const uint8_t* x_in,
|
|
103
|
+
const Index* codec,
|
|
104
|
+
Index& index,
|
|
105
|
+
const float* weights = nullptr);
|
|
102
106
|
|
|
103
107
|
/// Post-process the centroids after each centroid update.
|
|
104
108
|
/// includes optional L2 normalization and nearest integer rounding
|
|
105
|
-
void post_process_centroids
|
|
109
|
+
void post_process_centroids();
|
|
106
110
|
|
|
107
111
|
virtual ~Clustering() {}
|
|
108
112
|
};
|
|
109
113
|
|
|
114
|
+
/** Exact 1D clustering algorithm
|
|
115
|
+
*
|
|
116
|
+
* Since it does not use an index, it does not overload the train() function
|
|
117
|
+
*/
|
|
118
|
+
struct Clustering1D : Clustering {
|
|
119
|
+
explicit Clustering1D(int k);
|
|
120
|
+
|
|
121
|
+
Clustering1D(int k, const ClusteringParameters& cp);
|
|
122
|
+
|
|
123
|
+
void train_exact(idx_t n, const float* x);
|
|
124
|
+
|
|
125
|
+
virtual ~Clustering1D() {}
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
struct ProgressiveDimClusteringParameters : ClusteringParameters {
|
|
129
|
+
int progressive_dim_steps; ///< number of incremental steps
|
|
130
|
+
bool apply_pca; ///< apply PCA on input
|
|
131
|
+
|
|
132
|
+
ProgressiveDimClusteringParameters();
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
/** generates an index suitable for clustering when called */
|
|
136
|
+
struct ProgressiveDimIndexFactory {
|
|
137
|
+
/// ownership transferred to caller
|
|
138
|
+
virtual Index* operator()(int dim);
|
|
139
|
+
|
|
140
|
+
virtual ~ProgressiveDimIndexFactory() {}
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
/** K-means clustering with progressive dimensions used
|
|
144
|
+
*
|
|
145
|
+
* The clustering first happens in dim 1, then with exponentially increasing
|
|
146
|
+
* dimension until d (I steps). This is typically applied after a PCA
|
|
147
|
+
* transformation (optional). Reference:
|
|
148
|
+
*
|
|
149
|
+
* "Improved Residual Vector Quantization for High-dimensional Approximate
|
|
150
|
+
* Nearest Neighbor Search"
|
|
151
|
+
*
|
|
152
|
+
* Shicong Liu, Hongtao Lu, Junru Shao, AAAI'15
|
|
153
|
+
*
|
|
154
|
+
* https://arxiv.org/abs/1509.05195
|
|
155
|
+
*/
|
|
156
|
+
struct ProgressiveDimClustering : ProgressiveDimClusteringParameters {
|
|
157
|
+
using idx_t = Index::idx_t;
|
|
158
|
+
size_t d; ///< dimension of the vectors
|
|
159
|
+
size_t k; ///< nb of centroids
|
|
160
|
+
|
|
161
|
+
/** centroids (k * d) */
|
|
162
|
+
std::vector<float> centroids;
|
|
163
|
+
|
|
164
|
+
/// stats at every iteration of clustering
|
|
165
|
+
std::vector<ClusteringIterationStats> iteration_stats;
|
|
166
|
+
|
|
167
|
+
ProgressiveDimClustering(int d, int k);
|
|
168
|
+
ProgressiveDimClustering(
|
|
169
|
+
int d,
|
|
170
|
+
int k,
|
|
171
|
+
const ProgressiveDimClusteringParameters& cp);
|
|
172
|
+
|
|
173
|
+
void train(idx_t n, const float* x, ProgressiveDimIndexFactory& factory);
|
|
174
|
+
|
|
175
|
+
virtual ~ProgressiveDimClustering() {}
|
|
176
|
+
};
|
|
110
177
|
|
|
111
178
|
/** simplified interface
|
|
112
179
|
*
|
|
@@ -117,13 +184,13 @@ struct Clustering: ClusteringParameters {
|
|
|
117
184
|
* @param centroids output centroids (size k * d)
|
|
118
185
|
* @return final quantization error
|
|
119
186
|
*/
|
|
120
|
-
float kmeans_clustering
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
187
|
+
float kmeans_clustering(
|
|
188
|
+
size_t d,
|
|
189
|
+
size_t n,
|
|
190
|
+
size_t k,
|
|
191
|
+
const float* x,
|
|
192
|
+
float* centroids);
|
|
193
|
+
|
|
194
|
+
} // namespace faiss
|
|
128
195
|
|
|
129
196
|
#endif
|