faiss 0.2.3 → 0.2.5
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 +9 -0
- data/LICENSE.txt +1 -1
- data/README.md +23 -21
- data/ext/faiss/extconf.rb +11 -0
- data/ext/faiss/index.cpp +4 -4
- data/ext/faiss/index_binary.cpp +6 -6
- data/ext/faiss/product_quantizer.cpp +4 -4
- data/lib/faiss/version.rb +1 -1
- data/vendor/faiss/faiss/AutoTune.cpp +13 -0
- data/vendor/faiss/faiss/Clustering.cpp +32 -0
- data/vendor/faiss/faiss/Clustering.h +14 -0
- data/vendor/faiss/faiss/IVFlib.cpp +101 -2
- data/vendor/faiss/faiss/IVFlib.h +26 -2
- data/vendor/faiss/faiss/Index.cpp +36 -3
- data/vendor/faiss/faiss/Index.h +43 -6
- data/vendor/faiss/faiss/Index2Layer.cpp +24 -93
- data/vendor/faiss/faiss/Index2Layer.h +8 -17
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +610 -0
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.h +253 -0
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +299 -0
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +199 -0
- data/vendor/faiss/faiss/IndexBinary.cpp +20 -4
- data/vendor/faiss/faiss/IndexBinary.h +18 -3
- data/vendor/faiss/faiss/IndexBinaryFlat.cpp +9 -2
- data/vendor/faiss/faiss/IndexBinaryFlat.h +4 -2
- data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -1
- data/vendor/faiss/faiss/IndexBinaryFromFloat.h +2 -1
- data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +5 -1
- data/vendor/faiss/faiss/IndexBinaryHNSW.h +2 -1
- data/vendor/faiss/faiss/IndexBinaryHash.cpp +17 -4
- data/vendor/faiss/faiss/IndexBinaryHash.h +8 -4
- data/vendor/faiss/faiss/IndexBinaryIVF.cpp +28 -13
- data/vendor/faiss/faiss/IndexBinaryIVF.h +10 -7
- data/vendor/faiss/faiss/IndexFastScan.cpp +626 -0
- data/vendor/faiss/faiss/IndexFastScan.h +145 -0
- data/vendor/faiss/faiss/IndexFlat.cpp +52 -69
- data/vendor/faiss/faiss/IndexFlat.h +16 -19
- data/vendor/faiss/faiss/IndexFlatCodes.cpp +101 -0
- data/vendor/faiss/faiss/IndexFlatCodes.h +59 -0
- data/vendor/faiss/faiss/IndexHNSW.cpp +66 -138
- data/vendor/faiss/faiss/IndexHNSW.h +4 -2
- data/vendor/faiss/faiss/IndexIDMap.cpp +247 -0
- data/vendor/faiss/faiss/IndexIDMap.h +107 -0
- data/vendor/faiss/faiss/IndexIVF.cpp +200 -40
- data/vendor/faiss/faiss/IndexIVF.h +59 -22
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +393 -0
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.h +183 -0
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +590 -0
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +171 -0
- data/vendor/faiss/faiss/IndexIVFFastScan.cpp +1290 -0
- data/vendor/faiss/faiss/IndexIVFFastScan.h +213 -0
- data/vendor/faiss/faiss/IndexIVFFlat.cpp +43 -26
- data/vendor/faiss/faiss/IndexIVFFlat.h +4 -2
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +238 -53
- data/vendor/faiss/faiss/IndexIVFPQ.h +6 -2
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +23 -852
- data/vendor/faiss/faiss/IndexIVFPQFastScan.h +7 -112
- data/vendor/faiss/faiss/IndexIVFPQR.cpp +3 -3
- data/vendor/faiss/faiss/IndexIVFPQR.h +1 -1
- data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +63 -40
- data/vendor/faiss/faiss/IndexIVFSpectralHash.h +23 -7
- data/vendor/faiss/faiss/IndexLSH.cpp +8 -32
- data/vendor/faiss/faiss/IndexLSH.h +4 -16
- data/vendor/faiss/faiss/IndexLattice.cpp +7 -1
- data/vendor/faiss/faiss/IndexLattice.h +3 -1
- data/vendor/faiss/faiss/IndexNNDescent.cpp +4 -5
- data/vendor/faiss/faiss/IndexNNDescent.h +2 -1
- data/vendor/faiss/faiss/IndexNSG.cpp +37 -5
- data/vendor/faiss/faiss/IndexNSG.h +25 -1
- data/vendor/faiss/faiss/IndexPQ.cpp +108 -120
- data/vendor/faiss/faiss/IndexPQ.h +21 -22
- data/vendor/faiss/faiss/IndexPQFastScan.cpp +15 -450
- data/vendor/faiss/faiss/IndexPQFastScan.h +15 -78
- data/vendor/faiss/faiss/IndexPreTransform.cpp +47 -8
- data/vendor/faiss/faiss/IndexPreTransform.h +15 -3
- data/vendor/faiss/faiss/IndexRefine.cpp +36 -4
- data/vendor/faiss/faiss/IndexRefine.h +14 -2
- data/vendor/faiss/faiss/IndexReplicas.cpp +4 -2
- data/vendor/faiss/faiss/IndexReplicas.h +2 -1
- data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +438 -0
- data/vendor/faiss/faiss/IndexRowwiseMinMax.h +92 -0
- data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +28 -43
- data/vendor/faiss/faiss/IndexScalarQuantizer.h +8 -23
- data/vendor/faiss/faiss/IndexShards.cpp +4 -1
- data/vendor/faiss/faiss/IndexShards.h +2 -1
- data/vendor/faiss/faiss/MetaIndexes.cpp +5 -178
- data/vendor/faiss/faiss/MetaIndexes.h +3 -81
- data/vendor/faiss/faiss/VectorTransform.cpp +45 -1
- data/vendor/faiss/faiss/VectorTransform.h +25 -4
- data/vendor/faiss/faiss/clone_index.cpp +26 -3
- data/vendor/faiss/faiss/clone_index.h +3 -0
- data/vendor/faiss/faiss/cppcontrib/SaDecodeKernels.h +300 -0
- data/vendor/faiss/faiss/cppcontrib/detail/CoarseBitType.h +24 -0
- data/vendor/faiss/faiss/cppcontrib/detail/UintReader.h +195 -0
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +2058 -0
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +408 -0
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-neon-inl.h +2147 -0
- data/vendor/faiss/faiss/cppcontrib/sa_decode/MinMax-inl.h +460 -0
- data/vendor/faiss/faiss/cppcontrib/sa_decode/MinMaxFP16-inl.h +465 -0
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +1618 -0
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +251 -0
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-neon-inl.h +1452 -0
- data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +1 -0
- data/vendor/faiss/faiss/gpu/GpuCloner.cpp +2 -6
- data/vendor/faiss/faiss/gpu/GpuIcmEncoder.h +60 -0
- data/vendor/faiss/faiss/gpu/GpuIndex.h +28 -4
- data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +2 -1
- data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +10 -8
- data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +75 -14
- data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +19 -32
- data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +22 -31
- data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +22 -28
- data/vendor/faiss/faiss/gpu/GpuResources.cpp +14 -0
- data/vendor/faiss/faiss/gpu/GpuResources.h +16 -3
- data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +3 -3
- data/vendor/faiss/faiss/gpu/impl/IndexUtils.h +32 -0
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +1 -0
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +311 -75
- data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +10 -0
- data/vendor/faiss/faiss/gpu/test/TestUtils.h +3 -0
- data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +2 -2
- data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +5 -4
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +331 -29
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +110 -19
- data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +0 -54
- data/vendor/faiss/faiss/impl/AuxIndexStructures.h +0 -76
- data/vendor/faiss/faiss/impl/DistanceComputer.h +64 -0
- data/vendor/faiss/faiss/impl/HNSW.cpp +133 -32
- data/vendor/faiss/faiss/impl/HNSW.h +19 -16
- data/vendor/faiss/faiss/impl/IDSelector.cpp +125 -0
- data/vendor/faiss/faiss/impl/IDSelector.h +135 -0
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +378 -217
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +106 -29
- data/vendor/faiss/faiss/impl/LookupTableScaler.h +77 -0
- data/vendor/faiss/faiss/impl/NNDescent.cpp +1 -0
- data/vendor/faiss/faiss/impl/NSG.cpp +1 -4
- data/vendor/faiss/faiss/impl/NSG.h +1 -1
- data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +383 -0
- data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.h +154 -0
- data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +225 -145
- data/vendor/faiss/faiss/impl/ProductQuantizer.h +29 -10
- data/vendor/faiss/faiss/impl/Quantizer.h +43 -0
- data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +521 -55
- data/vendor/faiss/faiss/impl/ResidualQuantizer.h +94 -16
- data/vendor/faiss/faiss/impl/ResultHandler.h +96 -0
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +108 -191
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +18 -18
- data/vendor/faiss/faiss/impl/index_read.cpp +338 -24
- data/vendor/faiss/faiss/impl/index_write.cpp +300 -18
- data/vendor/faiss/faiss/impl/io.cpp +1 -1
- data/vendor/faiss/faiss/impl/io_macros.h +20 -0
- data/vendor/faiss/faiss/impl/kmeans1d.cpp +303 -0
- data/vendor/faiss/faiss/impl/kmeans1d.h +48 -0
- data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +56 -16
- data/vendor/faiss/faiss/impl/pq4_fast_scan.h +25 -8
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +66 -25
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +75 -27
- data/vendor/faiss/faiss/index_factory.cpp +772 -412
- data/vendor/faiss/faiss/index_factory.h +3 -0
- data/vendor/faiss/faiss/index_io.h +5 -0
- data/vendor/faiss/faiss/invlists/DirectMap.cpp +1 -0
- data/vendor/faiss/faiss/invlists/InvertedLists.cpp +4 -1
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +2 -1
- data/vendor/faiss/faiss/python/python_callbacks.cpp +27 -0
- data/vendor/faiss/faiss/python/python_callbacks.h +15 -0
- data/vendor/faiss/faiss/utils/Heap.h +31 -15
- data/vendor/faiss/faiss/utils/distances.cpp +384 -58
- data/vendor/faiss/faiss/utils/distances.h +149 -18
- data/vendor/faiss/faiss/utils/distances_simd.cpp +776 -6
- data/vendor/faiss/faiss/utils/extra_distances.cpp +12 -7
- data/vendor/faiss/faiss/utils/extra_distances.h +3 -1
- data/vendor/faiss/faiss/utils/fp16-fp16c.h +21 -0
- data/vendor/faiss/faiss/utils/fp16-inl.h +101 -0
- data/vendor/faiss/faiss/utils/fp16.h +11 -0
- data/vendor/faiss/faiss/utils/hamming-inl.h +54 -0
- data/vendor/faiss/faiss/utils/hamming.cpp +0 -48
- data/vendor/faiss/faiss/utils/ordered_key_value.h +10 -0
- data/vendor/faiss/faiss/utils/quantize_lut.cpp +62 -0
- data/vendor/faiss/faiss/utils/quantize_lut.h +20 -0
- data/vendor/faiss/faiss/utils/random.cpp +53 -0
- data/vendor/faiss/faiss/utils/random.h +5 -0
- data/vendor/faiss/faiss/utils/simdlib_avx2.h +4 -0
- data/vendor/faiss/faiss/utils/simdlib_emulated.h +6 -1
- data/vendor/faiss/faiss/utils/simdlib_neon.h +7 -2
- data/vendor/faiss/faiss/utils/utils.h +1 -1
- metadata +46 -5
- data/vendor/faiss/faiss/IndexResidual.cpp +0 -291
- data/vendor/faiss/faiss/IndexResidual.h +0 -152
|
@@ -15,10 +15,17 @@
|
|
|
15
15
|
#include <vector>
|
|
16
16
|
|
|
17
17
|
#include <faiss/impl/AdditiveQuantizer.h>
|
|
18
|
+
#include <faiss/impl/platform_macros.h>
|
|
18
19
|
#include <faiss/utils/utils.h>
|
|
19
20
|
|
|
20
21
|
namespace faiss {
|
|
21
22
|
|
|
23
|
+
namespace lsq {
|
|
24
|
+
|
|
25
|
+
struct IcmEncoderFactory;
|
|
26
|
+
|
|
27
|
+
} // namespace lsq
|
|
28
|
+
|
|
22
29
|
/** Implementation of LSQ/LSQ++ described in the following two papers:
|
|
23
30
|
*
|
|
24
31
|
* Revisiting additive quantization
|
|
@@ -35,7 +42,6 @@ namespace faiss {
|
|
|
35
42
|
* The trained codes are stored in `codebooks` which is called
|
|
36
43
|
* `centroids` in PQ and RQ.
|
|
37
44
|
*/
|
|
38
|
-
|
|
39
45
|
struct LocalSearchQuantizer : AdditiveQuantizer {
|
|
40
46
|
size_t K; ///< number of codes per codebook
|
|
41
47
|
|
|
@@ -53,10 +59,21 @@ struct LocalSearchQuantizer : AdditiveQuantizer {
|
|
|
53
59
|
int random_seed; ///< seed for random generator
|
|
54
60
|
size_t nperts; ///< number of perturbation in each code
|
|
55
61
|
|
|
62
|
+
///< if non-NULL, use this encoder to encode
|
|
63
|
+
lsq::IcmEncoderFactory* icm_encoder_factory;
|
|
64
|
+
|
|
65
|
+
bool update_codebooks_with_double = true;
|
|
66
|
+
|
|
56
67
|
LocalSearchQuantizer(
|
|
57
|
-
size_t d,
|
|
58
|
-
size_t M,
|
|
59
|
-
size_t nbits
|
|
68
|
+
size_t d, /* dimensionality of the input vectors */
|
|
69
|
+
size_t M, /* number of subquantizers */
|
|
70
|
+
size_t nbits, /* number of bit per subvector index */
|
|
71
|
+
Search_type_t search_type =
|
|
72
|
+
ST_decompress); /* determines the storage type */
|
|
73
|
+
|
|
74
|
+
LocalSearchQuantizer();
|
|
75
|
+
|
|
76
|
+
~LocalSearchQuantizer() override;
|
|
60
77
|
|
|
61
78
|
// Train the local search quantizer
|
|
62
79
|
void train(size_t n, const float* x) override;
|
|
@@ -65,43 +82,59 @@ struct LocalSearchQuantizer : AdditiveQuantizer {
|
|
|
65
82
|
*
|
|
66
83
|
* @param x vectors to encode, size n * d
|
|
67
84
|
* @param codes output codes, size n * code_size
|
|
85
|
+
* @param n number of vectors
|
|
86
|
+
* @param centroids centroids to be added to x, size n * d
|
|
68
87
|
*/
|
|
69
|
-
void
|
|
88
|
+
void compute_codes_add_centroids(
|
|
89
|
+
const float* x,
|
|
90
|
+
uint8_t* codes,
|
|
91
|
+
size_t n,
|
|
92
|
+
const float* centroids = nullptr) const override;
|
|
70
93
|
|
|
71
94
|
/** Update codebooks given encodings
|
|
72
95
|
*
|
|
73
96
|
* @param x training vectors, size n * d
|
|
74
97
|
* @param codes encoded training vectors, size n * M
|
|
98
|
+
* @param n number of vectors
|
|
75
99
|
*/
|
|
76
100
|
void update_codebooks(const float* x, const int32_t* codes, size_t n);
|
|
77
101
|
|
|
78
102
|
/** Encode vectors given codebooks using iterative conditional mode (icm).
|
|
79
103
|
*
|
|
80
|
-
* @param
|
|
81
|
-
* @param
|
|
104
|
+
* @param codes output codes, size n * M
|
|
105
|
+
* @param x vectors to encode, size n * d
|
|
106
|
+
* @param n number of vectors
|
|
82
107
|
* @param ils_iters number of iterations of iterative local search
|
|
83
108
|
*/
|
|
84
109
|
void icm_encode(
|
|
85
|
-
const float* x,
|
|
86
110
|
int32_t* codes,
|
|
111
|
+
const float* x,
|
|
87
112
|
size_t n,
|
|
88
113
|
size_t ils_iters,
|
|
89
114
|
std::mt19937& gen) const;
|
|
90
115
|
|
|
91
|
-
void
|
|
92
|
-
size_t index,
|
|
93
|
-
const float* x,
|
|
116
|
+
void icm_encode_impl(
|
|
94
117
|
int32_t* codes,
|
|
118
|
+
const float* x,
|
|
119
|
+
const float* unaries,
|
|
120
|
+
std::mt19937& gen,
|
|
95
121
|
size_t n,
|
|
96
|
-
const float* binaries,
|
|
97
122
|
size_t ils_iters,
|
|
98
|
-
|
|
123
|
+
bool verbose) const;
|
|
99
124
|
|
|
100
125
|
void icm_encode_step(
|
|
126
|
+
int32_t* codes,
|
|
101
127
|
const float* unaries,
|
|
102
128
|
const float* binaries,
|
|
103
|
-
|
|
104
|
-
size_t
|
|
129
|
+
size_t n,
|
|
130
|
+
size_t n_iters) const;
|
|
131
|
+
|
|
132
|
+
/** Add some perturbation to codes
|
|
133
|
+
*
|
|
134
|
+
* @param codes codes to be perturbed, size n * M
|
|
135
|
+
* @param n number of vectors
|
|
136
|
+
*/
|
|
137
|
+
void perturb_codes(int32_t* codes, size_t n, std::mt19937& gen) const;
|
|
105
138
|
|
|
106
139
|
/** Add some perturbation to codebooks
|
|
107
140
|
*
|
|
@@ -113,12 +146,6 @@ struct LocalSearchQuantizer : AdditiveQuantizer {
|
|
|
113
146
|
const std::vector<float>& stddev,
|
|
114
147
|
std::mt19937& gen);
|
|
115
148
|
|
|
116
|
-
/** Add some perturbation to codes
|
|
117
|
-
*
|
|
118
|
-
* @param codes codes to be perturbed, size n * M
|
|
119
|
-
*/
|
|
120
|
-
void perturb_codes(int32_t* codes, size_t n, std::mt19937& gen) const;
|
|
121
|
-
|
|
122
149
|
/** Compute binary terms
|
|
123
150
|
*
|
|
124
151
|
* @param binaries binary terms, size M * M * K * K
|
|
@@ -127,6 +154,7 @@ struct LocalSearchQuantizer : AdditiveQuantizer {
|
|
|
127
154
|
|
|
128
155
|
/** Compute unary terms
|
|
129
156
|
*
|
|
157
|
+
* @param n number of vectors
|
|
130
158
|
* @param x vectors to encode, size n * d
|
|
131
159
|
* @param unaries unary terms, size n * M * K
|
|
132
160
|
*/
|
|
@@ -134,8 +162,9 @@ struct LocalSearchQuantizer : AdditiveQuantizer {
|
|
|
134
162
|
|
|
135
163
|
/** Helper function to compute reconstruction error
|
|
136
164
|
*
|
|
137
|
-
* @param x vectors to encode, size n * d
|
|
138
165
|
* @param codes encoded codes, size n * M
|
|
166
|
+
* @param x vectors to encode, size n * d
|
|
167
|
+
* @param n number of vectors
|
|
139
168
|
* @param objs if it is not null, store reconstruction
|
|
140
169
|
error of each vector into it, size n
|
|
141
170
|
*/
|
|
@@ -146,13 +175,50 @@ struct LocalSearchQuantizer : AdditiveQuantizer {
|
|
|
146
175
|
float* objs = nullptr) const;
|
|
147
176
|
};
|
|
148
177
|
|
|
178
|
+
namespace lsq {
|
|
179
|
+
|
|
180
|
+
struct IcmEncoder {
|
|
181
|
+
std::vector<float> binaries;
|
|
182
|
+
|
|
183
|
+
bool verbose;
|
|
184
|
+
|
|
185
|
+
const LocalSearchQuantizer* lsq;
|
|
186
|
+
|
|
187
|
+
explicit IcmEncoder(const LocalSearchQuantizer* lsq);
|
|
188
|
+
|
|
189
|
+
virtual ~IcmEncoder() {}
|
|
190
|
+
|
|
191
|
+
///< compute binary terms
|
|
192
|
+
virtual void set_binary_term();
|
|
193
|
+
|
|
194
|
+
/** Encode vectors given codebooks
|
|
195
|
+
*
|
|
196
|
+
* @param codes output codes, size n * M
|
|
197
|
+
* @param x vectors to encode, size n * d
|
|
198
|
+
* @param gen random generator
|
|
199
|
+
* @param n number of vectors
|
|
200
|
+
* @param ils_iters number of iterations of iterative local search
|
|
201
|
+
*/
|
|
202
|
+
virtual void encode(
|
|
203
|
+
int32_t* codes,
|
|
204
|
+
const float* x,
|
|
205
|
+
std::mt19937& gen,
|
|
206
|
+
size_t n,
|
|
207
|
+
size_t ils_iters) const;
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
struct IcmEncoderFactory {
|
|
211
|
+
virtual IcmEncoder* get(const LocalSearchQuantizer* lsq) {
|
|
212
|
+
return new IcmEncoder(lsq);
|
|
213
|
+
}
|
|
214
|
+
virtual ~IcmEncoderFactory() {}
|
|
215
|
+
};
|
|
216
|
+
|
|
149
217
|
/** A helper struct to count consuming time during training.
|
|
150
218
|
* It is NOT thread-safe.
|
|
151
219
|
*/
|
|
152
220
|
struct LSQTimer {
|
|
153
|
-
std::unordered_map<std::string, double>
|
|
154
|
-
std::unordered_map<std::string, double> t0;
|
|
155
|
-
std::unordered_map<std::string, bool> started;
|
|
221
|
+
std::unordered_map<std::string, double> t;
|
|
156
222
|
|
|
157
223
|
LSQTimer() {
|
|
158
224
|
reset();
|
|
@@ -160,13 +226,24 @@ struct LSQTimer {
|
|
|
160
226
|
|
|
161
227
|
double get(const std::string& name);
|
|
162
228
|
|
|
163
|
-
void
|
|
164
|
-
|
|
165
|
-
void end(const std::string& name);
|
|
229
|
+
void add(const std::string& name, double delta);
|
|
166
230
|
|
|
167
231
|
void reset();
|
|
168
232
|
};
|
|
169
233
|
|
|
170
|
-
|
|
234
|
+
struct LSQTimerScope {
|
|
235
|
+
double t0;
|
|
236
|
+
LSQTimer* timer;
|
|
237
|
+
std::string name;
|
|
238
|
+
bool finished;
|
|
239
|
+
|
|
240
|
+
LSQTimerScope(LSQTimer* timer, std::string name);
|
|
241
|
+
|
|
242
|
+
void finish();
|
|
243
|
+
|
|
244
|
+
~LSQTimerScope();
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
} // namespace lsq
|
|
171
248
|
|
|
172
249
|
} // namespace faiss
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include <cstdint>
|
|
11
|
+
#include <cstdlib>
|
|
12
|
+
|
|
13
|
+
#include <faiss/utils/simdlib.h>
|
|
14
|
+
|
|
15
|
+
/*******************************************
|
|
16
|
+
* The Scaler objects are used to specialize the handling of the
|
|
17
|
+
* norm components in Additive quantizer fast-scan.
|
|
18
|
+
********************************************/
|
|
19
|
+
|
|
20
|
+
namespace faiss {
|
|
21
|
+
|
|
22
|
+
/// no-op handler
|
|
23
|
+
struct DummyScaler {
|
|
24
|
+
static constexpr int nscale = 0;
|
|
25
|
+
|
|
26
|
+
inline simd32uint8 lookup(const simd32uint8&, const simd32uint8&) const {
|
|
27
|
+
FAISS_THROW_MSG("DummyScaler::lookup should not be called.");
|
|
28
|
+
return simd32uint8(0);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
inline simd16uint16 scale_lo(const simd32uint8&) const {
|
|
32
|
+
FAISS_THROW_MSG("DummyScaler::scale_lo should not be called.");
|
|
33
|
+
return simd16uint16(0);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
inline simd16uint16 scale_hi(const simd32uint8&) const {
|
|
37
|
+
FAISS_THROW_MSG("DummyScaler::scale_hi should not be called.");
|
|
38
|
+
return simd16uint16(0);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
template <class dist_t>
|
|
42
|
+
inline dist_t scale_one(const dist_t&) const {
|
|
43
|
+
FAISS_THROW_MSG("DummyScaler::scale_one should not be called.");
|
|
44
|
+
return 0;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/// consumes 2x4 bits to encode a norm as a scalar additive quantizer
|
|
49
|
+
/// the norm is scaled because its range if larger than other components
|
|
50
|
+
struct NormTableScaler {
|
|
51
|
+
static constexpr int nscale = 2;
|
|
52
|
+
int scale_int;
|
|
53
|
+
simd16uint16 scale_simd;
|
|
54
|
+
|
|
55
|
+
explicit NormTableScaler(int scale) : scale_int(scale), scale_simd(scale) {}
|
|
56
|
+
|
|
57
|
+
inline simd32uint8 lookup(const simd32uint8& lut, const simd32uint8& c)
|
|
58
|
+
const {
|
|
59
|
+
return lut.lookup_2_lanes(c);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
inline simd16uint16 scale_lo(const simd32uint8& res) const {
|
|
63
|
+
return simd16uint16(res) * scale_simd;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
inline simd16uint16 scale_hi(const simd32uint8& res) const {
|
|
67
|
+
return (simd16uint16(res) >> 8) * scale_simd;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// for non-SIMD implem 2, 3, 4
|
|
71
|
+
template <class dist_t>
|
|
72
|
+
inline dist_t scale_one(const dist_t& x) const {
|
|
73
|
+
return x * scale_int;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
} // namespace faiss
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
#include <mutex>
|
|
15
15
|
#include <stack>
|
|
16
16
|
|
|
17
|
-
#include <faiss/impl/
|
|
17
|
+
#include <faiss/impl/DistanceComputer.h>
|
|
18
18
|
|
|
19
19
|
namespace faiss {
|
|
20
20
|
|
|
@@ -161,9 +161,6 @@ void NSG::search(
|
|
|
161
161
|
search_on_graph<false>(
|
|
162
162
|
*final_graph, dis, vt, enterpoint, pool_size, retset, tmp);
|
|
163
163
|
|
|
164
|
-
std::partial_sort(
|
|
165
|
-
retset.begin(), retset.begin() + k, retset.begin() + pool_size);
|
|
166
|
-
|
|
167
164
|
for (size_t i = 0; i < k; i++) {
|
|
168
165
|
I[i] = retset[i].id;
|
|
169
166
|
D[i] = retset[i].distance;
|
|
@@ -105,7 +105,7 @@ struct NSG {
|
|
|
105
105
|
|
|
106
106
|
int ntotal; ///< nb of nodes
|
|
107
107
|
|
|
108
|
-
|
|
108
|
+
// construction-time parameters
|
|
109
109
|
int R; ///< nb of neighbors per node
|
|
110
110
|
int L; ///< length of the search path at construction time
|
|
111
111
|
int C; ///< candidate pool size at construction time
|