faiss 0.2.6 → 0.2.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/ext/faiss/extconf.rb +1 -1
- data/lib/faiss/version.rb +1 -1
- data/lib/faiss.rb +2 -2
- data/vendor/faiss/faiss/AutoTune.cpp +15 -4
- data/vendor/faiss/faiss/AutoTune.h +0 -1
- data/vendor/faiss/faiss/Clustering.cpp +1 -5
- data/vendor/faiss/faiss/Clustering.h +0 -2
- data/vendor/faiss/faiss/IVFlib.h +0 -2
- data/vendor/faiss/faiss/Index.h +1 -2
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +17 -3
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.h +10 -1
- data/vendor/faiss/faiss/IndexBinary.h +0 -1
- data/vendor/faiss/faiss/IndexBinaryFlat.cpp +2 -1
- data/vendor/faiss/faiss/IndexBinaryFlat.h +4 -0
- data/vendor/faiss/faiss/IndexBinaryHash.cpp +1 -3
- data/vendor/faiss/faiss/IndexBinaryIVF.cpp +273 -48
- data/vendor/faiss/faiss/IndexBinaryIVF.h +18 -11
- data/vendor/faiss/faiss/IndexFastScan.cpp +13 -10
- data/vendor/faiss/faiss/IndexFastScan.h +5 -1
- data/vendor/faiss/faiss/IndexFlat.cpp +16 -3
- data/vendor/faiss/faiss/IndexFlat.h +1 -1
- data/vendor/faiss/faiss/IndexFlatCodes.cpp +5 -0
- data/vendor/faiss/faiss/IndexFlatCodes.h +7 -2
- data/vendor/faiss/faiss/IndexHNSW.cpp +3 -6
- data/vendor/faiss/faiss/IndexHNSW.h +0 -1
- data/vendor/faiss/faiss/IndexIDMap.cpp +4 -4
- data/vendor/faiss/faiss/IndexIDMap.h +0 -2
- data/vendor/faiss/faiss/IndexIVF.cpp +155 -129
- data/vendor/faiss/faiss/IndexIVF.h +121 -61
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +2 -2
- data/vendor/faiss/faiss/IndexIVFFastScan.cpp +12 -11
- data/vendor/faiss/faiss/IndexIVFFastScan.h +6 -1
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +221 -165
- data/vendor/faiss/faiss/IndexIVFPQ.h +1 -0
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +6 -1
- data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +0 -2
- data/vendor/faiss/faiss/IndexNNDescent.cpp +1 -2
- data/vendor/faiss/faiss/IndexNNDescent.h +0 -1
- data/vendor/faiss/faiss/IndexNSG.cpp +1 -2
- data/vendor/faiss/faiss/IndexPQ.cpp +7 -9
- data/vendor/faiss/faiss/IndexRefine.cpp +1 -1
- data/vendor/faiss/faiss/IndexReplicas.cpp +3 -4
- data/vendor/faiss/faiss/IndexReplicas.h +0 -1
- data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +8 -1
- data/vendor/faiss/faiss/IndexRowwiseMinMax.h +7 -0
- data/vendor/faiss/faiss/IndexShards.cpp +26 -109
- data/vendor/faiss/faiss/IndexShards.h +2 -3
- data/vendor/faiss/faiss/IndexShardsIVF.cpp +246 -0
- data/vendor/faiss/faiss/IndexShardsIVF.h +42 -0
- data/vendor/faiss/faiss/MetaIndexes.cpp +86 -0
- data/vendor/faiss/faiss/MetaIndexes.h +29 -0
- data/vendor/faiss/faiss/MetricType.h +14 -0
- data/vendor/faiss/faiss/VectorTransform.cpp +8 -10
- data/vendor/faiss/faiss/VectorTransform.h +1 -3
- data/vendor/faiss/faiss/clone_index.cpp +232 -18
- data/vendor/faiss/faiss/cppcontrib/SaDecodeKernels.h +25 -3
- data/vendor/faiss/faiss/cppcontrib/detail/CoarseBitType.h +7 -0
- data/vendor/faiss/faiss/cppcontrib/detail/UintReader.h +78 -0
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +20 -6
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +7 -1
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-neon-inl.h +21 -7
- data/vendor/faiss/faiss/cppcontrib/sa_decode/MinMax-inl.h +7 -0
- data/vendor/faiss/faiss/cppcontrib/sa_decode/MinMaxFP16-inl.h +7 -0
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +10 -3
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +7 -1
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-neon-inl.h +11 -3
- data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +25 -2
- data/vendor/faiss/faiss/gpu/GpuCloner.cpp +76 -29
- data/vendor/faiss/faiss/gpu/GpuCloner.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +14 -13
- data/vendor/faiss/faiss/gpu/GpuDistance.h +18 -6
- data/vendor/faiss/faiss/gpu/GpuIndex.h +23 -21
- data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +10 -10
- data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +11 -12
- data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +29 -50
- data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +3 -3
- data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +8 -8
- data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +4 -4
- data/vendor/faiss/faiss/gpu/impl/IndexUtils.h +2 -5
- data/vendor/faiss/faiss/gpu/impl/RemapIndices.cpp +9 -7
- data/vendor/faiss/faiss/gpu/impl/RemapIndices.h +4 -4
- data/vendor/faiss/faiss/gpu/perf/IndexWrapper-inl.h +2 -2
- data/vendor/faiss/faiss/gpu/perf/IndexWrapper.h +1 -1
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +55 -6
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +20 -6
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +95 -25
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +67 -16
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +4 -4
- data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +7 -7
- data/vendor/faiss/faiss/gpu/test/TestUtils.h +4 -4
- data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +1 -1
- data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +6 -0
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +0 -7
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +9 -9
- data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +1 -1
- data/vendor/faiss/faiss/impl/AuxIndexStructures.h +2 -7
- data/vendor/faiss/faiss/impl/CodePacker.cpp +67 -0
- data/vendor/faiss/faiss/impl/CodePacker.h +71 -0
- data/vendor/faiss/faiss/impl/DistanceComputer.h +0 -2
- data/vendor/faiss/faiss/impl/HNSW.cpp +3 -7
- data/vendor/faiss/faiss/impl/HNSW.h +6 -9
- data/vendor/faiss/faiss/impl/IDSelector.cpp +1 -1
- data/vendor/faiss/faiss/impl/IDSelector.h +39 -1
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +62 -51
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +11 -12
- data/vendor/faiss/faiss/impl/NNDescent.cpp +3 -9
- data/vendor/faiss/faiss/impl/NNDescent.h +10 -10
- data/vendor/faiss/faiss/impl/NSG.cpp +1 -6
- data/vendor/faiss/faiss/impl/NSG.h +4 -7
- data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +1 -15
- data/vendor/faiss/faiss/impl/PolysemousTraining.h +11 -10
- data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +0 -7
- data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +25 -12
- data/vendor/faiss/faiss/impl/ProductQuantizer.h +2 -4
- data/vendor/faiss/faiss/impl/Quantizer.h +6 -3
- data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +796 -174
- data/vendor/faiss/faiss/impl/ResidualQuantizer.h +16 -8
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +3 -5
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +4 -4
- data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +3 -3
- data/vendor/faiss/faiss/impl/ThreadedIndex.h +4 -4
- data/vendor/faiss/faiss/impl/code_distance/code_distance-avx2.h +291 -0
- data/vendor/faiss/faiss/impl/code_distance/code_distance-generic.h +74 -0
- data/vendor/faiss/faiss/impl/code_distance/code_distance.h +123 -0
- data/vendor/faiss/faiss/impl/code_distance/code_distance_avx512.h +102 -0
- data/vendor/faiss/faiss/impl/index_read.cpp +13 -10
- data/vendor/faiss/faiss/impl/index_write.cpp +3 -4
- data/vendor/faiss/faiss/impl/kmeans1d.cpp +0 -1
- data/vendor/faiss/faiss/impl/kmeans1d.h +3 -3
- data/vendor/faiss/faiss/impl/lattice_Zn.cpp +1 -1
- data/vendor/faiss/faiss/impl/platform_macros.h +61 -0
- data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +48 -4
- data/vendor/faiss/faiss/impl/pq4_fast_scan.h +18 -4
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +2 -2
- data/vendor/faiss/faiss/index_factory.cpp +8 -10
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +29 -12
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +8 -2
- data/vendor/faiss/faiss/invlists/DirectMap.cpp +1 -1
- data/vendor/faiss/faiss/invlists/DirectMap.h +2 -4
- data/vendor/faiss/faiss/invlists/InvertedLists.cpp +118 -18
- data/vendor/faiss/faiss/invlists/InvertedLists.h +44 -4
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +3 -3
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
- data/vendor/faiss/faiss/python/python_callbacks.cpp +1 -1
- data/vendor/faiss/faiss/python/python_callbacks.h +1 -1
- data/vendor/faiss/faiss/utils/AlignedTable.h +3 -1
- data/vendor/faiss/faiss/utils/Heap.cpp +139 -3
- data/vendor/faiss/faiss/utils/Heap.h +35 -1
- data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +84 -0
- data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +196 -0
- data/vendor/faiss/faiss/utils/approx_topk/generic.h +138 -0
- data/vendor/faiss/faiss/utils/approx_topk/mode.h +34 -0
- data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +367 -0
- data/vendor/faiss/faiss/utils/distances.cpp +61 -7
- data/vendor/faiss/faiss/utils/distances.h +11 -0
- data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +346 -0
- data/vendor/faiss/faiss/utils/distances_fused/avx512.h +36 -0
- data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +42 -0
- data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +40 -0
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +352 -0
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.h +32 -0
- data/vendor/faiss/faiss/utils/distances_simd.cpp +515 -327
- data/vendor/faiss/faiss/utils/extra_distances-inl.h +17 -1
- data/vendor/faiss/faiss/utils/extra_distances.cpp +37 -8
- data/vendor/faiss/faiss/utils/extra_distances.h +2 -1
- data/vendor/faiss/faiss/utils/fp16-fp16c.h +7 -0
- data/vendor/faiss/faiss/utils/fp16-inl.h +7 -0
- data/vendor/faiss/faiss/utils/fp16.h +7 -0
- data/vendor/faiss/faiss/utils/hamming-inl.h +0 -456
- data/vendor/faiss/faiss/utils/hamming.cpp +104 -120
- data/vendor/faiss/faiss/utils/hamming.h +21 -10
- data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +535 -0
- data/vendor/faiss/faiss/utils/hamming_distance/common.h +48 -0
- data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +519 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +26 -0
- data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +614 -0
- data/vendor/faiss/faiss/utils/partitioning.cpp +21 -25
- data/vendor/faiss/faiss/utils/simdlib_avx2.h +344 -3
- data/vendor/faiss/faiss/utils/simdlib_emulated.h +390 -0
- data/vendor/faiss/faiss/utils/simdlib_neon.h +655 -130
- data/vendor/faiss/faiss/utils/sorting.cpp +692 -0
- data/vendor/faiss/faiss/utils/sorting.h +71 -0
- data/vendor/faiss/faiss/utils/transpose/transpose-avx2-inl.h +165 -0
- data/vendor/faiss/faiss/utils/utils.cpp +4 -176
- data/vendor/faiss/faiss/utils/utils.h +2 -9
- metadata +29 -3
- data/vendor/faiss/faiss/gpu/GpuClonerOptions.cpp +0 -26
@@ -31,19 +31,23 @@ namespace faiss {
|
|
31
31
|
* of the lists (especially training)
|
32
32
|
*/
|
33
33
|
struct Level1Quantizer {
|
34
|
-
|
35
|
-
|
34
|
+
/// quantizer that maps vectors to inverted lists
|
35
|
+
Index* quantizer = nullptr;
|
36
|
+
|
37
|
+
/// number of inverted lists
|
38
|
+
size_t nlist = 0;
|
36
39
|
|
37
40
|
/**
|
38
41
|
* = 0: use the quantizer as index in a kmeans training
|
39
42
|
* = 1: just pass on the training set to the train() of the quantizer
|
40
43
|
* = 2: kmeans training on a flat index + add the centroids to the quantizer
|
41
44
|
*/
|
42
|
-
char quantizer_trains_alone;
|
43
|
-
bool own_fields; ///< whether object owns the quantizer
|
45
|
+
char quantizer_trains_alone = 0;
|
46
|
+
bool own_fields = false; ///< whether object owns the quantizer
|
44
47
|
|
45
48
|
ClusteringParameters cp; ///< to override default clustering params
|
46
|
-
|
49
|
+
/// to override index used during clustering
|
50
|
+
Index* clustering_index = nullptr;
|
47
51
|
|
48
52
|
/// Trains the quantizer and calls train_residual to train sub-quantizers
|
49
53
|
void train_q1(
|
@@ -54,8 +58,8 @@ struct Level1Quantizer {
|
|
54
58
|
|
55
59
|
/// compute the number of bytes required to store list ids
|
56
60
|
size_t coarse_code_size() const;
|
57
|
-
void encode_listno(
|
58
|
-
|
61
|
+
void encode_listno(idx_t list_no, uint8_t* code) const;
|
62
|
+
idx_t decode_listno(const uint8_t* code) const;
|
59
63
|
|
60
64
|
Level1Quantizer(Index* quantizer, size_t nlist);
|
61
65
|
|
@@ -65,11 +69,10 @@ struct Level1Quantizer {
|
|
65
69
|
};
|
66
70
|
|
67
71
|
struct SearchParametersIVF : SearchParameters {
|
68
|
-
size_t nprobe; ///< number of probes at query time
|
69
|
-
size_t max_codes; ///< max nb of codes to visit to do a query
|
72
|
+
size_t nprobe = 1; ///< number of probes at query time
|
73
|
+
size_t max_codes = 0; ///< max nb of codes to visit to do a query
|
70
74
|
SearchParameters* quantizer_params = nullptr;
|
71
75
|
|
72
|
-
SearchParametersIVF() : nprobe(1), max_codes(0) {}
|
73
76
|
virtual ~SearchParametersIVF() {}
|
74
77
|
};
|
75
78
|
|
@@ -78,6 +81,75 @@ using IVFSearchParameters = SearchParametersIVF;
|
|
78
81
|
|
79
82
|
struct InvertedListScanner;
|
80
83
|
struct IndexIVFStats;
|
84
|
+
struct CodePacker;
|
85
|
+
|
86
|
+
struct IndexIVFInterface : Level1Quantizer {
|
87
|
+
size_t nprobe = 1; ///< number of probes at query time
|
88
|
+
size_t max_codes = 0; ///< max nb of codes to visit to do a query
|
89
|
+
|
90
|
+
explicit IndexIVFInterface(Index* quantizer = nullptr, size_t nlist = 0)
|
91
|
+
: Level1Quantizer(quantizer, nlist) {}
|
92
|
+
|
93
|
+
/** search a set of vectors, that are pre-quantized by the IVF
|
94
|
+
* quantizer. Fill in the corresponding heaps with the query
|
95
|
+
* results. The default implementation uses InvertedListScanners
|
96
|
+
* to do the search.
|
97
|
+
*
|
98
|
+
* @param n nb of vectors to query
|
99
|
+
* @param x query vectors, size nx * d
|
100
|
+
* @param assign coarse quantization indices, size nx * nprobe
|
101
|
+
* @param centroid_dis
|
102
|
+
* distances to coarse centroids, size nx * nprobe
|
103
|
+
* @param distance
|
104
|
+
* output distances, size n * k
|
105
|
+
* @param labels output labels, size n * k
|
106
|
+
* @param store_pairs store inv list index + inv list offset
|
107
|
+
* instead in upper/lower 32 bit of result,
|
108
|
+
* instead of ids (used for reranking).
|
109
|
+
* @param params used to override the object's search parameters
|
110
|
+
* @param stats search stats to be updated (can be null)
|
111
|
+
*/
|
112
|
+
virtual void search_preassigned(
|
113
|
+
idx_t n,
|
114
|
+
const float* x,
|
115
|
+
idx_t k,
|
116
|
+
const idx_t* assign,
|
117
|
+
const float* centroid_dis,
|
118
|
+
float* distances,
|
119
|
+
idx_t* labels,
|
120
|
+
bool store_pairs,
|
121
|
+
const IVFSearchParameters* params = nullptr,
|
122
|
+
IndexIVFStats* stats = nullptr) const = 0;
|
123
|
+
|
124
|
+
/** Range search a set of vectors, that are pre-quantized by the IVF
|
125
|
+
* quantizer. Fill in the RangeSearchResults results. The default
|
126
|
+
* implementation uses InvertedListScanners to do the search.
|
127
|
+
*
|
128
|
+
* @param n nb of vectors to query
|
129
|
+
* @param x query vectors, size nx * d
|
130
|
+
* @param assign coarse quantization indices, size nx * nprobe
|
131
|
+
* @param centroid_dis
|
132
|
+
* distances to coarse centroids, size nx * nprobe
|
133
|
+
* @param result Output results
|
134
|
+
* @param store_pairs store inv list index + inv list offset
|
135
|
+
* instead in upper/lower 32 bit of result,
|
136
|
+
* instead of ids (used for reranking).
|
137
|
+
* @param params used to override the object's search parameters
|
138
|
+
* @param stats search stats to be updated (can be null)
|
139
|
+
*/
|
140
|
+
virtual void range_search_preassigned(
|
141
|
+
idx_t nx,
|
142
|
+
const float* x,
|
143
|
+
float radius,
|
144
|
+
const idx_t* keys,
|
145
|
+
const float* coarse_dis,
|
146
|
+
RangeSearchResult* result,
|
147
|
+
bool store_pairs = false,
|
148
|
+
const IVFSearchParameters* params = nullptr,
|
149
|
+
IndexIVFStats* stats = nullptr) const = 0;
|
150
|
+
|
151
|
+
virtual ~IndexIVFInterface() {}
|
152
|
+
};
|
81
153
|
|
82
154
|
/** Index based on a inverted file (IVF)
|
83
155
|
*
|
@@ -99,16 +171,12 @@ struct IndexIVFStats;
|
|
99
171
|
* Sub-classes implement a post-filtering of the index that refines
|
100
172
|
* the distance estimation from the query to databse vectors.
|
101
173
|
*/
|
102
|
-
struct IndexIVF : Index,
|
174
|
+
struct IndexIVF : Index, IndexIVFInterface {
|
103
175
|
/// Access to the actual data
|
104
|
-
InvertedLists* invlists;
|
105
|
-
bool own_invlists;
|
106
|
-
|
107
|
-
size_t code_size; ///< code size per vector in bytes
|
108
|
-
|
109
|
-
size_t nprobe; ///< number of probes at query time
|
110
|
-
size_t max_codes; ///< max nb of codes to visit to do a query
|
176
|
+
InvertedLists* invlists = nullptr;
|
177
|
+
bool own_invlists = false;
|
111
178
|
|
179
|
+
size_t code_size = 0; ///< code size per vector in bytes
|
112
180
|
/** Parallel mode determines how queries are parallelized with OpenMP
|
113
181
|
*
|
114
182
|
* 0 (default): split over queries
|
@@ -119,7 +187,7 @@ struct IndexIVF : Index, Level1Quantizer {
|
|
119
187
|
* PARALLEL_MODE_NO_HEAP_INIT: binary or with the previous to
|
120
188
|
* prevent the heap to be initialized and finalized
|
121
189
|
*/
|
122
|
-
int parallel_mode;
|
190
|
+
int parallel_mode = 0;
|
123
191
|
const int PARALLEL_MODE_NO_HEAP_INIT = 1024;
|
124
192
|
|
125
193
|
/** optional map that maps back ids to invlist entries. This
|
@@ -188,26 +256,7 @@ struct IndexIVF : Index, Level1Quantizer {
|
|
188
256
|
/// does nothing by default
|
189
257
|
virtual void train_residual(idx_t n, const float* x);
|
190
258
|
|
191
|
-
|
192
|
-
* quantizer. Fill in the corresponding heaps with the query
|
193
|
-
* results. The default implementation uses InvertedListScanners
|
194
|
-
* to do the search.
|
195
|
-
*
|
196
|
-
* @param n nb of vectors to query
|
197
|
-
* @param x query vectors, size nx * d
|
198
|
-
* @param assign coarse quantization indices, size nx * nprobe
|
199
|
-
* @param centroid_dis
|
200
|
-
* distances to coarse centroids, size nx * nprobe
|
201
|
-
* @param distance
|
202
|
-
* output distances, size n * k
|
203
|
-
* @param labels output labels, size n * k
|
204
|
-
* @param store_pairs store inv list index + inv list offset
|
205
|
-
* instead in upper/lower 32 bit of result,
|
206
|
-
* instead of ids (used for reranking).
|
207
|
-
* @param params used to override the object's search parameters
|
208
|
-
* @param stats search stats to be updated (can be null)
|
209
|
-
*/
|
210
|
-
virtual void search_preassigned(
|
259
|
+
void search_preassigned(
|
211
260
|
idx_t n,
|
212
261
|
const float* x,
|
213
262
|
idx_t k,
|
@@ -217,7 +266,18 @@ struct IndexIVF : Index, Level1Quantizer {
|
|
217
266
|
idx_t* labels,
|
218
267
|
bool store_pairs,
|
219
268
|
const IVFSearchParameters* params = nullptr,
|
220
|
-
IndexIVFStats* stats = nullptr) const;
|
269
|
+
IndexIVFStats* stats = nullptr) const override;
|
270
|
+
|
271
|
+
void range_search_preassigned(
|
272
|
+
idx_t nx,
|
273
|
+
const float* x,
|
274
|
+
float radius,
|
275
|
+
const idx_t* keys,
|
276
|
+
const float* coarse_dis,
|
277
|
+
RangeSearchResult* result,
|
278
|
+
bool store_pairs = false,
|
279
|
+
const IVFSearchParameters* params = nullptr,
|
280
|
+
IndexIVFStats* stats = nullptr) const override;
|
221
281
|
|
222
282
|
/** assign the vectors, then call search_preassign */
|
223
283
|
void search(
|
@@ -235,17 +295,6 @@ struct IndexIVF : Index, Level1Quantizer {
|
|
235
295
|
RangeSearchResult* result,
|
236
296
|
const SearchParameters* params = nullptr) const override;
|
237
297
|
|
238
|
-
void range_search_preassigned(
|
239
|
-
idx_t nx,
|
240
|
-
const float* x,
|
241
|
-
float radius,
|
242
|
-
const idx_t* keys,
|
243
|
-
const float* coarse_dis,
|
244
|
-
RangeSearchResult* result,
|
245
|
-
bool store_pairs = false,
|
246
|
-
const IVFSearchParameters* params = nullptr,
|
247
|
-
IndexIVFStats* stats = nullptr) const;
|
248
|
-
|
249
298
|
/** Get a scanner for this index (store_pairs means ignore labels)
|
250
299
|
*
|
251
300
|
* The default search implementation uses this to compute the distances
|
@@ -317,16 +366,15 @@ struct IndexIVF : Index, Level1Quantizer {
|
|
317
366
|
|
318
367
|
virtual void merge_from(Index& otherIndex, idx_t add_id) override;
|
319
368
|
|
369
|
+
// returns a new instance of a CodePacker
|
370
|
+
virtual CodePacker* get_CodePacker() const;
|
371
|
+
|
320
372
|
/** copy a subset of the entries index to the other index
|
321
|
-
*
|
322
|
-
* if subset_type == 0: copies ids in [a1, a2)
|
323
|
-
* if subset_type == 1: copies ids if id % a1 == a2
|
324
|
-
* if subset_type == 2: copies inverted lists such that a1
|
325
|
-
* elements are left before and a2 elements are after
|
373
|
+
* see Invlists::copy_subset_to for the meaning of subset_type
|
326
374
|
*/
|
327
375
|
virtual void copy_subset_to(
|
328
376
|
IndexIVF& other,
|
329
|
-
|
377
|
+
InvertedLists::subset_type_t subset_type,
|
330
378
|
idx_t a1,
|
331
379
|
idx_t a2) const;
|
332
380
|
|
@@ -339,7 +387,7 @@ struct IndexIVF : Index, Level1Quantizer {
|
|
339
387
|
/// are the ids sorted?
|
340
388
|
bool check_ids_sorted() const;
|
341
389
|
|
342
|
-
/**
|
390
|
+
/** initialize a direct map
|
343
391
|
*
|
344
392
|
* @param new_maintain_direct_map if true, create a direct map,
|
345
393
|
* else clear it
|
@@ -353,7 +401,6 @@ struct IndexIVF : Index, Level1Quantizer {
|
|
353
401
|
|
354
402
|
/* The standalone codec interface (except sa_decode that is specific) */
|
355
403
|
size_t sa_code_size() const override;
|
356
|
-
|
357
404
|
void sa_encode(idx_t n, const float* x, uint8_t* bytes) const override;
|
358
405
|
|
359
406
|
IndexIVF();
|
@@ -366,8 +413,6 @@ struct RangeQueryResult;
|
|
366
413
|
* distance_to_code and scan_codes can be called in multiple
|
367
414
|
* threads */
|
368
415
|
struct InvertedListScanner {
|
369
|
-
using idx_t = Index::idx_t;
|
370
|
-
|
371
416
|
idx_t list_no = -1; ///< remember current list
|
372
417
|
bool keep_max = false; ///< keep maximum instead of minimum
|
373
418
|
/// store positions in invlists rather than labels
|
@@ -413,6 +458,14 @@ struct InvertedListScanner {
|
|
413
458
|
idx_t* labels,
|
414
459
|
size_t k) const;
|
415
460
|
|
461
|
+
// same as scan_codes, using an iterator
|
462
|
+
virtual size_t iterate_codes(
|
463
|
+
InvertedListsIterator* iterator,
|
464
|
+
float* distances,
|
465
|
+
idx_t* labels,
|
466
|
+
size_t k,
|
467
|
+
size_t& list_size) const;
|
468
|
+
|
416
469
|
/** scan a set of codes, compute distances to current query and
|
417
470
|
* update results if distances are below radius
|
418
471
|
*
|
@@ -424,6 +477,13 @@ struct InvertedListScanner {
|
|
424
477
|
float radius,
|
425
478
|
RangeQueryResult& result) const;
|
426
479
|
|
480
|
+
// same as scan_codes_range, using an iterator
|
481
|
+
virtual void iterate_codes_range(
|
482
|
+
InvertedListsIterator* iterator,
|
483
|
+
float radius,
|
484
|
+
RangeQueryResult& result,
|
485
|
+
size_t& list_size) const;
|
486
|
+
|
427
487
|
virtual ~InvertedListScanner() {}
|
428
488
|
};
|
429
489
|
|
@@ -51,7 +51,7 @@ void IndexIVFAdditiveQuantizer::train_residual(idx_t n, const float* x) {
|
|
51
51
|
ScopeDeleter<float> del_x(x_in == x ? nullptr : x);
|
52
52
|
|
53
53
|
if (by_residual) {
|
54
|
-
std::vector<
|
54
|
+
std::vector<idx_t> idx(n);
|
55
55
|
quantizer->assign(n, x, idx.data());
|
56
56
|
|
57
57
|
std::vector<float> residuals(n * d);
|
@@ -145,7 +145,7 @@ struct AQInvertedListScanner : InvertedListScanner {
|
|
145
145
|
: ia(ia), aq(*ia.aq) {
|
146
146
|
this->store_pairs = store_pairs;
|
147
147
|
this->code_size = ia.code_size;
|
148
|
-
keep_max = ia.metric_type
|
148
|
+
keep_max = is_similarity_metric(ia.metric_type);
|
149
149
|
tmp.resize(ia.d);
|
150
150
|
}
|
151
151
|
|
@@ -69,7 +69,14 @@ void IndexIVFFastScan::init_fastscan(
|
|
69
69
|
code_size = M2 / 2;
|
70
70
|
|
71
71
|
is_trained = false;
|
72
|
-
replace_invlists(new BlockInvertedLists(nlist,
|
72
|
+
replace_invlists(new BlockInvertedLists(nlist, get_CodePacker()), true);
|
73
|
+
}
|
74
|
+
|
75
|
+
void IndexIVFFastScan::init_code_packer() {
|
76
|
+
auto bil = dynamic_cast<BlockInvertedLists*>(invlists);
|
77
|
+
FAISS_THROW_IF_NOT(bil);
|
78
|
+
delete bil->packer; // in case there was one before
|
79
|
+
bil->packer = get_CodePacker();
|
73
80
|
}
|
74
81
|
|
75
82
|
IndexIVFFastScan::~IndexIVFFastScan() {}
|
@@ -112,17 +119,9 @@ void IndexIVFFastScan::add_with_ids(
|
|
112
119
|
}
|
113
120
|
InterruptCallback::check();
|
114
121
|
|
115
|
-
AlignedTable<uint8_t> codes(n * code_size);
|
116
122
|
direct_map.check_can_add(xids);
|
117
123
|
std::unique_ptr<idx_t[]> idx(new idx_t[n]);
|
118
124
|
quantizer->assign(n, x, idx.get());
|
119
|
-
size_t nadd = 0, nminus1 = 0;
|
120
|
-
|
121
|
-
for (size_t i = 0; i < n; i++) {
|
122
|
-
if (idx[i] < 0) {
|
123
|
-
nminus1++;
|
124
|
-
}
|
125
|
-
}
|
126
125
|
|
127
126
|
AlignedTable<uint8_t> flat_codes(n * code_size);
|
128
127
|
encode_vectors(n, x, idx.get(), flat_codes.get());
|
@@ -170,7 +169,6 @@ void IndexIVFFastScan::add_with_ids(
|
|
170
169
|
memcpy(list_codes.data() + (i - i0) * code_size,
|
171
170
|
flat_codes.data() + order[i] * code_size,
|
172
171
|
code_size);
|
173
|
-
nadd++;
|
174
172
|
}
|
175
173
|
pq4_pack_codes_range(
|
176
174
|
list_codes.data(),
|
@@ -187,6 +185,10 @@ void IndexIVFFastScan::add_with_ids(
|
|
187
185
|
ntotal += n;
|
188
186
|
}
|
189
187
|
|
188
|
+
CodePacker* IndexIVFFastScan::get_CodePacker() const {
|
189
|
+
return new CodePackerPQ4(M, bbs);
|
190
|
+
}
|
191
|
+
|
190
192
|
/*********************************************************
|
191
193
|
* search
|
192
194
|
*********************************************************/
|
@@ -229,7 +231,6 @@ void estimators_from_tables_generic(
|
|
229
231
|
}
|
230
232
|
}
|
231
233
|
|
232
|
-
using idx_t = Index::idx_t;
|
233
234
|
using namespace quantize_lut;
|
234
235
|
|
235
236
|
} // anonymous namespace
|
@@ -67,6 +67,9 @@ struct IndexIVFFastScan : IndexIVF {
|
|
67
67
|
MetricType metric,
|
68
68
|
int bbs);
|
69
69
|
|
70
|
+
// initialize the CodePacker in the InvertedLists
|
71
|
+
void init_code_packer();
|
72
|
+
|
70
73
|
~IndexIVFFastScan() override;
|
71
74
|
|
72
75
|
/// orig's inverted lists (for debugging)
|
@@ -166,7 +169,7 @@ struct IndexIVFFastScan : IndexIVF {
|
|
166
169
|
size_t* nlist_out,
|
167
170
|
const Scaler& scaler) const;
|
168
171
|
|
169
|
-
// implem 14 is
|
172
|
+
// implem 14 is multithreaded internally across nprobes and queries
|
170
173
|
template <class C, class Scaler>
|
171
174
|
void search_implem_14(
|
172
175
|
idx_t n,
|
@@ -181,6 +184,8 @@ struct IndexIVFFastScan : IndexIVF {
|
|
181
184
|
void reconstruct_from_offset(int64_t list_no, int64_t offset, float* recons)
|
182
185
|
const override;
|
183
186
|
|
187
|
+
CodePacker* get_CodePacker() const override;
|
188
|
+
|
184
189
|
// reconstruct orig invlists (for debugging)
|
185
190
|
void reconstruct_orig_invlists();
|
186
191
|
};
|