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
|
@@ -0,0 +1,244 @@
|
|
|
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 <stdint.h>
|
|
11
|
+
|
|
12
|
+
#include <random>
|
|
13
|
+
#include <string>
|
|
14
|
+
#include <unordered_map>
|
|
15
|
+
#include <vector>
|
|
16
|
+
|
|
17
|
+
#include <faiss/impl/AdditiveQuantizer.h>
|
|
18
|
+
#include <faiss/impl/platform_macros.h>
|
|
19
|
+
#include <faiss/utils/utils.h>
|
|
20
|
+
|
|
21
|
+
namespace faiss {
|
|
22
|
+
|
|
23
|
+
namespace lsq {
|
|
24
|
+
|
|
25
|
+
struct IcmEncoderFactory;
|
|
26
|
+
|
|
27
|
+
} // namespace lsq
|
|
28
|
+
|
|
29
|
+
/** Implementation of LSQ/LSQ++ described in the following two papers:
|
|
30
|
+
*
|
|
31
|
+
* Revisiting additive quantization
|
|
32
|
+
* Julieta Martinez, et al. ECCV 2016
|
|
33
|
+
*
|
|
34
|
+
* LSQ++: Lower running time and higher recall in multi-codebook quantization
|
|
35
|
+
* Julieta Martinez, et al. ECCV 2018
|
|
36
|
+
*
|
|
37
|
+
* This implementation is mostly translated from the Julia implementations
|
|
38
|
+
* by Julieta Martinez:
|
|
39
|
+
* (https://github.com/una-dinosauria/local-search-quantization,
|
|
40
|
+
* https://github.com/una-dinosauria/Rayuela.jl)
|
|
41
|
+
*
|
|
42
|
+
* The trained codes are stored in `codebooks` which is called
|
|
43
|
+
* `centroids` in PQ and RQ.
|
|
44
|
+
*/
|
|
45
|
+
struct LocalSearchQuantizer : AdditiveQuantizer {
|
|
46
|
+
size_t K; ///< number of codes per codebook
|
|
47
|
+
|
|
48
|
+
size_t train_iters; ///< number of iterations in training
|
|
49
|
+
|
|
50
|
+
size_t encode_ils_iters; ///< iterations of local search in encoding
|
|
51
|
+
size_t train_ils_iters; ///< iterations of local search in training
|
|
52
|
+
size_t icm_iters; ///< number of iterations in icm
|
|
53
|
+
|
|
54
|
+
float p; ///< temperature factor
|
|
55
|
+
float lambd; ///< regularization factor
|
|
56
|
+
|
|
57
|
+
size_t chunk_size; ///< nb of vectors to encode at a time
|
|
58
|
+
|
|
59
|
+
int random_seed; ///< seed for random generator
|
|
60
|
+
size_t nperts; ///< number of perturbation in each code
|
|
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
|
+
|
|
67
|
+
LocalSearchQuantizer(
|
|
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;
|
|
77
|
+
|
|
78
|
+
// Train the local search quantizer
|
|
79
|
+
void train(size_t n, const float* x) override;
|
|
80
|
+
|
|
81
|
+
/** Encode a set of vectors
|
|
82
|
+
*
|
|
83
|
+
* @param x vectors to encode, size n * d
|
|
84
|
+
* @param codes output codes, size n * code_size
|
|
85
|
+
* @param n number of vectors
|
|
86
|
+
*/
|
|
87
|
+
void compute_codes(const float* x, uint8_t* codes, size_t n) const override;
|
|
88
|
+
|
|
89
|
+
/** Update codebooks given encodings
|
|
90
|
+
*
|
|
91
|
+
* @param x training vectors, size n * d
|
|
92
|
+
* @param codes encoded training vectors, size n * M
|
|
93
|
+
* @param n number of vectors
|
|
94
|
+
*/
|
|
95
|
+
void update_codebooks(const float* x, const int32_t* codes, size_t n);
|
|
96
|
+
|
|
97
|
+
/** Encode vectors given codebooks using iterative conditional mode (icm).
|
|
98
|
+
*
|
|
99
|
+
* @param codes output codes, size n * M
|
|
100
|
+
* @param x vectors to encode, size n * d
|
|
101
|
+
* @param n number of vectors
|
|
102
|
+
* @param ils_iters number of iterations of iterative local search
|
|
103
|
+
*/
|
|
104
|
+
void icm_encode(
|
|
105
|
+
int32_t* codes,
|
|
106
|
+
const float* x,
|
|
107
|
+
size_t n,
|
|
108
|
+
size_t ils_iters,
|
|
109
|
+
std::mt19937& gen) const;
|
|
110
|
+
|
|
111
|
+
void icm_encode_impl(
|
|
112
|
+
int32_t* codes,
|
|
113
|
+
const float* x,
|
|
114
|
+
const float* unaries,
|
|
115
|
+
std::mt19937& gen,
|
|
116
|
+
size_t n,
|
|
117
|
+
size_t ils_iters,
|
|
118
|
+
bool verbose) const;
|
|
119
|
+
|
|
120
|
+
void icm_encode_step(
|
|
121
|
+
int32_t* codes,
|
|
122
|
+
const float* unaries,
|
|
123
|
+
const float* binaries,
|
|
124
|
+
size_t n,
|
|
125
|
+
size_t n_iters) const;
|
|
126
|
+
|
|
127
|
+
/** Add some perturbation to codes
|
|
128
|
+
*
|
|
129
|
+
* @param codes codes to be perturbed, size n * M
|
|
130
|
+
* @param n number of vectors
|
|
131
|
+
*/
|
|
132
|
+
void perturb_codes(int32_t* codes, size_t n, std::mt19937& gen) const;
|
|
133
|
+
|
|
134
|
+
/** Add some perturbation to codebooks
|
|
135
|
+
*
|
|
136
|
+
* @param T temperature of simulated annealing
|
|
137
|
+
* @param stddev standard derivations of each dimension in training data
|
|
138
|
+
*/
|
|
139
|
+
void perturb_codebooks(
|
|
140
|
+
float T,
|
|
141
|
+
const std::vector<float>& stddev,
|
|
142
|
+
std::mt19937& gen);
|
|
143
|
+
|
|
144
|
+
/** Compute binary terms
|
|
145
|
+
*
|
|
146
|
+
* @param binaries binary terms, size M * M * K * K
|
|
147
|
+
*/
|
|
148
|
+
void compute_binary_terms(float* binaries) const;
|
|
149
|
+
|
|
150
|
+
/** Compute unary terms
|
|
151
|
+
*
|
|
152
|
+
* @param n number of vectors
|
|
153
|
+
* @param x vectors to encode, size n * d
|
|
154
|
+
* @param unaries unary terms, size n * M * K
|
|
155
|
+
*/
|
|
156
|
+
void compute_unary_terms(const float* x, float* unaries, size_t n) const;
|
|
157
|
+
|
|
158
|
+
/** Helper function to compute reconstruction error
|
|
159
|
+
*
|
|
160
|
+
* @param codes encoded codes, size n * M
|
|
161
|
+
* @param x vectors to encode, size n * d
|
|
162
|
+
* @param n number of vectors
|
|
163
|
+
* @param objs if it is not null, store reconstruction
|
|
164
|
+
error of each vector into it, size n
|
|
165
|
+
*/
|
|
166
|
+
float evaluate(
|
|
167
|
+
const int32_t* codes,
|
|
168
|
+
const float* x,
|
|
169
|
+
size_t n,
|
|
170
|
+
float* objs = nullptr) const;
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
namespace lsq {
|
|
174
|
+
|
|
175
|
+
struct IcmEncoder {
|
|
176
|
+
std::vector<float> binaries;
|
|
177
|
+
|
|
178
|
+
bool verbose;
|
|
179
|
+
|
|
180
|
+
const LocalSearchQuantizer* lsq;
|
|
181
|
+
|
|
182
|
+
explicit IcmEncoder(const LocalSearchQuantizer* lsq);
|
|
183
|
+
|
|
184
|
+
virtual ~IcmEncoder() {}
|
|
185
|
+
|
|
186
|
+
///< compute binary terms
|
|
187
|
+
virtual void set_binary_term();
|
|
188
|
+
|
|
189
|
+
/** Encode vectors given codebooks
|
|
190
|
+
*
|
|
191
|
+
* @param codes output codes, size n * M
|
|
192
|
+
* @param x vectors to encode, size n * d
|
|
193
|
+
* @param gen random generator
|
|
194
|
+
* @param n number of vectors
|
|
195
|
+
* @param ils_iters number of iterations of iterative local search
|
|
196
|
+
*/
|
|
197
|
+
virtual void encode(
|
|
198
|
+
int32_t* codes,
|
|
199
|
+
const float* x,
|
|
200
|
+
std::mt19937& gen,
|
|
201
|
+
size_t n,
|
|
202
|
+
size_t ils_iters) const;
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
struct IcmEncoderFactory {
|
|
206
|
+
virtual IcmEncoder* get(const LocalSearchQuantizer* lsq) {
|
|
207
|
+
return new IcmEncoder(lsq);
|
|
208
|
+
}
|
|
209
|
+
virtual ~IcmEncoderFactory() {}
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
/** A helper struct to count consuming time during training.
|
|
213
|
+
* It is NOT thread-safe.
|
|
214
|
+
*/
|
|
215
|
+
struct LSQTimer {
|
|
216
|
+
std::unordered_map<std::string, double> t;
|
|
217
|
+
|
|
218
|
+
LSQTimer() {
|
|
219
|
+
reset();
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
double get(const std::string& name);
|
|
223
|
+
|
|
224
|
+
void add(const std::string& name, double delta);
|
|
225
|
+
|
|
226
|
+
void reset();
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
struct LSQTimerScope {
|
|
230
|
+
double t0;
|
|
231
|
+
LSQTimer* timer;
|
|
232
|
+
std::string name;
|
|
233
|
+
bool finished;
|
|
234
|
+
|
|
235
|
+
LSQTimerScope(LSQTimer* timer, std::string name);
|
|
236
|
+
|
|
237
|
+
void finish();
|
|
238
|
+
|
|
239
|
+
~LSQTimerScope();
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
} // namespace lsq
|
|
243
|
+
|
|
244
|
+
} // namespace faiss
|