faiss 0.2.4 → 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 +5 -0
- 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/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 +6 -2
- data/vendor/faiss/faiss/Index2Layer.h +6 -1
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +219 -16
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.h +63 -5
- 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 +34 -21
- data/vendor/faiss/faiss/IndexFlat.h +7 -4
- data/vendor/faiss/faiss/IndexFlatCodes.cpp +35 -1
- data/vendor/faiss/faiss/IndexFlatCodes.h +12 -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 +121 -33
- data/vendor/faiss/faiss/IndexIVF.h +35 -16
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +84 -7
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.h +63 -1
- 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 +37 -17
- data/vendor/faiss/faiss/IndexIVFFlat.h +4 -2
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +234 -50
- data/vendor/faiss/faiss/IndexIVFPQ.h +5 -1
- 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 +3 -1
- data/vendor/faiss/faiss/IndexIVFSpectralHash.h +2 -1
- data/vendor/faiss/faiss/IndexLSH.cpp +4 -2
- data/vendor/faiss/faiss/IndexLSH.h +2 -1
- data/vendor/faiss/faiss/IndexLattice.cpp +7 -1
- data/vendor/faiss/faiss/IndexLattice.h +3 -1
- data/vendor/faiss/faiss/IndexNNDescent.cpp +4 -3
- data/vendor/faiss/faiss/IndexNNDescent.h +2 -1
- data/vendor/faiss/faiss/IndexNSG.cpp +37 -3
- data/vendor/faiss/faiss/IndexNSG.h +25 -1
- data/vendor/faiss/faiss/IndexPQ.cpp +106 -69
- data/vendor/faiss/faiss/IndexPQ.h +19 -5
- 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 +8 -4
- data/vendor/faiss/faiss/IndexRefine.h +4 -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 +26 -15
- data/vendor/faiss/faiss/IndexScalarQuantizer.h +6 -7
- 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 +43 -0
- data/vendor/faiss/faiss/VectorTransform.h +22 -4
- data/vendor/faiss/faiss/clone_index.cpp +23 -1
- 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 +0 -4
- 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 +116 -47
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +44 -13
- 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 +123 -27
- 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 +6 -28
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +6 -1
- 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 -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 +192 -36
- data/vendor/faiss/faiss/impl/ResidualQuantizer.h +40 -20
- data/vendor/faiss/faiss/impl/ResultHandler.h +96 -0
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +97 -173
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +18 -18
- data/vendor/faiss/faiss/impl/index_read.cpp +240 -9
- data/vendor/faiss/faiss/impl/index_write.cpp +237 -5
- data/vendor/faiss/faiss/impl/kmeans1d.cpp +6 -4
- 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 +196 -7
- 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 +380 -56
- data/vendor/faiss/faiss/utils/distances.h +113 -15
- data/vendor/faiss/faiss/utils/distances_simd.cpp +726 -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
- metadata +37 -3
|
@@ -0,0 +1,171 @@
|
|
|
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 <memory>
|
|
11
|
+
|
|
12
|
+
#include <faiss/IndexIVFAdditiveQuantizer.h>
|
|
13
|
+
#include <faiss/IndexIVFFastScan.h>
|
|
14
|
+
#include <faiss/impl/AdditiveQuantizer.h>
|
|
15
|
+
#include <faiss/impl/ProductAdditiveQuantizer.h>
|
|
16
|
+
#include <faiss/utils/AlignedTable.h>
|
|
17
|
+
|
|
18
|
+
namespace faiss {
|
|
19
|
+
|
|
20
|
+
/** Fast scan version of IVFAQ. Works for 4-bit AQ for now.
|
|
21
|
+
*
|
|
22
|
+
* The codes in the inverted lists are not stored sequentially but
|
|
23
|
+
* grouped in blocks of size bbs. This makes it possible to very quickly
|
|
24
|
+
* compute distances with SIMD instructions.
|
|
25
|
+
*
|
|
26
|
+
* Implementations (implem):
|
|
27
|
+
* 0: auto-select implementation (default)
|
|
28
|
+
* 1: orig's search, re-implemented
|
|
29
|
+
* 2: orig's search, re-ordered by invlist
|
|
30
|
+
* 10: optimizer int16 search, collect results in heap, no qbs
|
|
31
|
+
* 11: idem, collect results in reservoir
|
|
32
|
+
* 12: optimizer int16 search, collect results in heap, uses qbs
|
|
33
|
+
* 13: idem, collect results in reservoir
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
struct IndexIVFAdditiveQuantizerFastScan : IndexIVFFastScan {
|
|
37
|
+
using Search_type_t = AdditiveQuantizer::Search_type_t;
|
|
38
|
+
|
|
39
|
+
AdditiveQuantizer* aq;
|
|
40
|
+
|
|
41
|
+
bool rescale_norm = false;
|
|
42
|
+
int norm_scale = 1;
|
|
43
|
+
|
|
44
|
+
// max number of training vectors
|
|
45
|
+
size_t max_train_points;
|
|
46
|
+
|
|
47
|
+
IndexIVFAdditiveQuantizerFastScan(
|
|
48
|
+
Index* quantizer,
|
|
49
|
+
AdditiveQuantizer* aq,
|
|
50
|
+
size_t d,
|
|
51
|
+
size_t nlist,
|
|
52
|
+
MetricType metric = METRIC_L2,
|
|
53
|
+
int bbs = 32);
|
|
54
|
+
|
|
55
|
+
void init(AdditiveQuantizer* aq, size_t nlist, MetricType metric, int bbs);
|
|
56
|
+
|
|
57
|
+
IndexIVFAdditiveQuantizerFastScan();
|
|
58
|
+
|
|
59
|
+
~IndexIVFAdditiveQuantizerFastScan() override;
|
|
60
|
+
|
|
61
|
+
// built from an IndexIVFAQ
|
|
62
|
+
explicit IndexIVFAdditiveQuantizerFastScan(
|
|
63
|
+
const IndexIVFAdditiveQuantizer& orig,
|
|
64
|
+
int bbs = 32);
|
|
65
|
+
|
|
66
|
+
void train_residual(idx_t n, const float* x) override;
|
|
67
|
+
|
|
68
|
+
void estimate_norm_scale(idx_t n, const float* x);
|
|
69
|
+
|
|
70
|
+
/// same as the regular IVFAQ encoder. The codes are not reorganized by
|
|
71
|
+
/// blocks a that point
|
|
72
|
+
void encode_vectors(
|
|
73
|
+
idx_t n,
|
|
74
|
+
const float* x,
|
|
75
|
+
const idx_t* list_nos,
|
|
76
|
+
uint8_t* codes,
|
|
77
|
+
bool include_listno = false) const override;
|
|
78
|
+
|
|
79
|
+
void search(
|
|
80
|
+
idx_t n,
|
|
81
|
+
const float* x,
|
|
82
|
+
idx_t k,
|
|
83
|
+
float* distances,
|
|
84
|
+
idx_t* labels,
|
|
85
|
+
const SearchParameters* params = nullptr) const override;
|
|
86
|
+
|
|
87
|
+
// prepare look-up tables
|
|
88
|
+
|
|
89
|
+
bool lookup_table_is_3d() const override;
|
|
90
|
+
|
|
91
|
+
void compute_LUT(
|
|
92
|
+
size_t n,
|
|
93
|
+
const float* x,
|
|
94
|
+
const idx_t* coarse_ids,
|
|
95
|
+
const float* coarse_dis,
|
|
96
|
+
AlignedTable<float>& dis_tables,
|
|
97
|
+
AlignedTable<float>& biases) const override;
|
|
98
|
+
|
|
99
|
+
void sa_decode(idx_t n, const uint8_t* bytes, float* x) const override;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
struct IndexIVFLocalSearchQuantizerFastScan
|
|
103
|
+
: IndexIVFAdditiveQuantizerFastScan {
|
|
104
|
+
LocalSearchQuantizer lsq;
|
|
105
|
+
|
|
106
|
+
IndexIVFLocalSearchQuantizerFastScan(
|
|
107
|
+
Index* quantizer,
|
|
108
|
+
size_t d,
|
|
109
|
+
size_t nlist,
|
|
110
|
+
size_t M,
|
|
111
|
+
size_t nbits,
|
|
112
|
+
MetricType metric = METRIC_L2,
|
|
113
|
+
Search_type_t search_type = AdditiveQuantizer::ST_norm_lsq2x4,
|
|
114
|
+
int bbs = 32);
|
|
115
|
+
|
|
116
|
+
IndexIVFLocalSearchQuantizerFastScan();
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
struct IndexIVFResidualQuantizerFastScan : IndexIVFAdditiveQuantizerFastScan {
|
|
120
|
+
ResidualQuantizer rq;
|
|
121
|
+
|
|
122
|
+
IndexIVFResidualQuantizerFastScan(
|
|
123
|
+
Index* quantizer,
|
|
124
|
+
size_t d,
|
|
125
|
+
size_t nlist,
|
|
126
|
+
size_t M,
|
|
127
|
+
size_t nbits,
|
|
128
|
+
MetricType metric = METRIC_L2,
|
|
129
|
+
Search_type_t search_type = AdditiveQuantizer::ST_norm_lsq2x4,
|
|
130
|
+
int bbs = 32);
|
|
131
|
+
|
|
132
|
+
IndexIVFResidualQuantizerFastScan();
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
struct IndexIVFProductLocalSearchQuantizerFastScan
|
|
136
|
+
: IndexIVFAdditiveQuantizerFastScan {
|
|
137
|
+
ProductLocalSearchQuantizer plsq;
|
|
138
|
+
|
|
139
|
+
IndexIVFProductLocalSearchQuantizerFastScan(
|
|
140
|
+
Index* quantizer,
|
|
141
|
+
size_t d,
|
|
142
|
+
size_t nlist,
|
|
143
|
+
size_t nsplits,
|
|
144
|
+
size_t Msub,
|
|
145
|
+
size_t nbits,
|
|
146
|
+
MetricType metric = METRIC_L2,
|
|
147
|
+
Search_type_t search_type = AdditiveQuantizer::ST_norm_lsq2x4,
|
|
148
|
+
int bbs = 32);
|
|
149
|
+
|
|
150
|
+
IndexIVFProductLocalSearchQuantizerFastScan();
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
struct IndexIVFProductResidualQuantizerFastScan
|
|
154
|
+
: IndexIVFAdditiveQuantizerFastScan {
|
|
155
|
+
ProductResidualQuantizer prq;
|
|
156
|
+
|
|
157
|
+
IndexIVFProductResidualQuantizerFastScan(
|
|
158
|
+
Index* quantizer,
|
|
159
|
+
size_t d,
|
|
160
|
+
size_t nlist,
|
|
161
|
+
size_t nsplits,
|
|
162
|
+
size_t Msub,
|
|
163
|
+
size_t nbits,
|
|
164
|
+
MetricType metric = METRIC_L2,
|
|
165
|
+
Search_type_t search_type = AdditiveQuantizer::ST_norm_lsq2x4,
|
|
166
|
+
int bbs = 32);
|
|
167
|
+
|
|
168
|
+
IndexIVFProductResidualQuantizerFastScan();
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
} // namespace faiss
|