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
|
@@ -9,142 +9,130 @@
|
|
|
9
9
|
|
|
10
10
|
#include <faiss/invlists/DirectMap.h>
|
|
11
11
|
|
|
12
|
-
#include <cstdio>
|
|
13
12
|
#include <cassert>
|
|
13
|
+
#include <cstdio>
|
|
14
14
|
|
|
15
|
-
#include <faiss/impl/FaissAssert.h>
|
|
16
15
|
#include <faiss/impl/AuxIndexStructures.h>
|
|
16
|
+
#include <faiss/impl/FaissAssert.h>
|
|
17
17
|
|
|
18
18
|
namespace faiss {
|
|
19
19
|
|
|
20
|
-
DirectMap::DirectMap(): type(NoMap)
|
|
21
|
-
{}
|
|
20
|
+
DirectMap::DirectMap() : type(NoMap) {}
|
|
22
21
|
|
|
23
|
-
void DirectMap::set_type
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
void DirectMap::set_type(
|
|
23
|
+
Type new_type,
|
|
24
|
+
const InvertedLists* invlists,
|
|
25
|
+
size_t ntotal) {
|
|
26
|
+
FAISS_THROW_IF_NOT(
|
|
27
|
+
new_type == NoMap || new_type == Array || new_type == Hashtable);
|
|
27
28
|
|
|
28
29
|
if (new_type == type) {
|
|
29
30
|
// nothing to do
|
|
30
31
|
return;
|
|
31
32
|
}
|
|
32
33
|
|
|
33
|
-
array.clear
|
|
34
|
-
hashtable.clear
|
|
34
|
+
array.clear();
|
|
35
|
+
hashtable.clear();
|
|
35
36
|
type = new_type;
|
|
36
37
|
|
|
37
38
|
if (new_type == NoMap) {
|
|
38
39
|
return;
|
|
39
40
|
} else if (new_type == Array) {
|
|
40
|
-
array.resize
|
|
41
|
+
array.resize(ntotal, -1);
|
|
41
42
|
} else if (new_type == Hashtable) {
|
|
42
|
-
hashtable.reserve
|
|
43
|
+
hashtable.reserve(ntotal);
|
|
43
44
|
}
|
|
44
45
|
|
|
45
46
|
for (size_t key = 0; key < invlists->nlist; key++) {
|
|
46
|
-
size_t list_size = invlists->list_size
|
|
47
|
-
InvertedLists::ScopedIds idlist
|
|
47
|
+
size_t list_size = invlists->list_size(key);
|
|
48
|
+
InvertedLists::ScopedIds idlist(invlists, key);
|
|
48
49
|
|
|
49
50
|
if (new_type == Array) {
|
|
50
51
|
for (long ofs = 0; ofs < list_size; ofs++) {
|
|
51
|
-
FAISS_THROW_IF_NOT_MSG
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
array
|
|
52
|
+
FAISS_THROW_IF_NOT_MSG(
|
|
53
|
+
0 <= idlist[ofs] && idlist[ofs] < ntotal,
|
|
54
|
+
"direct map supported only for seuquential ids");
|
|
55
|
+
array[idlist[ofs]] = lo_build(key, ofs);
|
|
55
56
|
}
|
|
56
57
|
} else if (new_type == Hashtable) {
|
|
57
58
|
for (long ofs = 0; ofs < list_size; ofs++) {
|
|
58
|
-
hashtable
|
|
59
|
+
hashtable[idlist[ofs]] = lo_build(key, ofs);
|
|
59
60
|
}
|
|
60
61
|
}
|
|
61
62
|
}
|
|
62
63
|
}
|
|
63
64
|
|
|
64
|
-
void DirectMap::clear()
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
hashtable.clear ();
|
|
65
|
+
void DirectMap::clear() {
|
|
66
|
+
array.clear();
|
|
67
|
+
hashtable.clear();
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
|
|
71
|
-
DirectMap::idx_t DirectMap::get (idx_t key) const
|
|
72
|
-
{
|
|
70
|
+
DirectMap::idx_t DirectMap::get(idx_t key) const {
|
|
73
71
|
if (type == Array) {
|
|
74
|
-
FAISS_THROW_IF_NOT_MSG (
|
|
75
|
-
key >= 0 && key < array.size(), "invalid key"
|
|
76
|
-
);
|
|
72
|
+
FAISS_THROW_IF_NOT_MSG(key >= 0 && key < array.size(), "invalid key");
|
|
77
73
|
idx_t lo = array[key];
|
|
78
74
|
FAISS_THROW_IF_NOT_MSG(lo >= 0, "-1 entry in direct_map");
|
|
79
75
|
return lo;
|
|
80
76
|
} else if (type == Hashtable) {
|
|
81
|
-
auto res = hashtable.find
|
|
82
|
-
FAISS_THROW_IF_NOT_MSG
|
|
77
|
+
auto res = hashtable.find(key);
|
|
78
|
+
FAISS_THROW_IF_NOT_MSG(res != hashtable.end(), "key not found");
|
|
83
79
|
return res->second;
|
|
84
80
|
} else {
|
|
85
|
-
FAISS_THROW_MSG
|
|
81
|
+
FAISS_THROW_MSG("direct map not initialized");
|
|
86
82
|
}
|
|
87
83
|
}
|
|
88
84
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
{
|
|
93
|
-
if (type == NoMap) return;
|
|
85
|
+
void DirectMap::add_single_id(idx_t id, idx_t list_no, size_t offset) {
|
|
86
|
+
if (type == NoMap)
|
|
87
|
+
return;
|
|
94
88
|
|
|
95
89
|
if (type == Array) {
|
|
96
|
-
assert
|
|
90
|
+
assert(id == array.size());
|
|
97
91
|
if (list_no >= 0) {
|
|
98
|
-
array.push_back
|
|
92
|
+
array.push_back(lo_build(list_no, offset));
|
|
99
93
|
} else {
|
|
100
|
-
array.push_back
|
|
94
|
+
array.push_back(-1);
|
|
101
95
|
}
|
|
102
96
|
} else if (type == Hashtable) {
|
|
103
97
|
if (list_no >= 0) {
|
|
104
|
-
hashtable[id] = lo_build
|
|
98
|
+
hashtable[id] = lo_build(list_no, offset);
|
|
105
99
|
}
|
|
106
100
|
}
|
|
107
|
-
|
|
108
101
|
}
|
|
109
102
|
|
|
110
|
-
void DirectMap::check_can_add
|
|
103
|
+
void DirectMap::check_can_add(const idx_t* ids) {
|
|
111
104
|
if (type == Array && ids) {
|
|
112
|
-
FAISS_THROW_MSG
|
|
105
|
+
FAISS_THROW_MSG("cannot have array direct map and add with ids");
|
|
113
106
|
}
|
|
114
107
|
}
|
|
115
108
|
|
|
116
109
|
/********************* DirectMapAdd implementation */
|
|
117
110
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
if (type == DirectMap::Array) {
|
|
123
|
-
FAISS_THROW_IF_NOT (xids == nullptr);
|
|
111
|
+
DirectMapAdd::DirectMapAdd(DirectMap& direct_map, size_t n, const idx_t* xids)
|
|
112
|
+
: direct_map(direct_map), type(direct_map.type), n(n), xids(xids) {
|
|
113
|
+
if (type == DirectMap::Array) {
|
|
114
|
+
FAISS_THROW_IF_NOT(xids == nullptr);
|
|
124
115
|
ntotal = direct_map.array.size();
|
|
125
|
-
direct_map.array.resize
|
|
116
|
+
direct_map.array.resize(ntotal + n, -1);
|
|
126
117
|
} else if (type == DirectMap::Hashtable) {
|
|
127
118
|
// can't parallel update hashtable so use temp array
|
|
128
|
-
all_ofs.resize
|
|
119
|
+
all_ofs.resize(n, -1);
|
|
129
120
|
}
|
|
130
121
|
}
|
|
131
122
|
|
|
132
|
-
|
|
133
|
-
void DirectMapAdd::add (size_t i, idx_t list_no, size_t ofs)
|
|
134
|
-
{
|
|
123
|
+
void DirectMapAdd::add(size_t i, idx_t list_no, size_t ofs) {
|
|
135
124
|
if (type == DirectMap::Array) {
|
|
136
|
-
direct_map.array
|
|
125
|
+
direct_map.array[ntotal + i] = lo_build(list_no, ofs);
|
|
137
126
|
} else if (type == DirectMap::Hashtable) {
|
|
138
|
-
all_ofs
|
|
127
|
+
all_ofs[i] = lo_build(list_no, ofs);
|
|
139
128
|
}
|
|
140
129
|
}
|
|
141
130
|
|
|
142
|
-
DirectMapAdd::~DirectMapAdd
|
|
143
|
-
{
|
|
131
|
+
DirectMapAdd::~DirectMapAdd() {
|
|
144
132
|
if (type == DirectMap::Hashtable) {
|
|
145
133
|
for (int i = 0; i < n; i++) {
|
|
146
134
|
idx_t id = xids ? xids[i] : ntotal + i;
|
|
147
|
-
direct_map.hashtable
|
|
135
|
+
direct_map.hashtable[id] = all_ofs[i];
|
|
148
136
|
}
|
|
149
137
|
}
|
|
150
138
|
}
|
|
@@ -154,9 +142,7 @@ DirectMapAdd::~DirectMapAdd ()
|
|
|
154
142
|
using ScopedCodes = InvertedLists::ScopedCodes;
|
|
155
143
|
using ScopedIds = InvertedLists::ScopedIds;
|
|
156
144
|
|
|
157
|
-
|
|
158
|
-
size_t DirectMap::remove_ids(const IDSelector& sel, InvertedLists *invlists)
|
|
159
|
-
{
|
|
145
|
+
size_t DirectMap::remove_ids(const IDSelector& sel, InvertedLists* invlists) {
|
|
160
146
|
size_t nlist = invlists->nlist;
|
|
161
147
|
std::vector<idx_t> toremove(nlist);
|
|
162
148
|
|
|
@@ -166,16 +152,16 @@ size_t DirectMap::remove_ids(const IDSelector& sel, InvertedLists *invlists)
|
|
|
166
152
|
// exhaustive scan of IVF
|
|
167
153
|
#pragma omp parallel for
|
|
168
154
|
for (idx_t i = 0; i < nlist; i++) {
|
|
169
|
-
idx_t l0 = invlists->list_size
|
|
170
|
-
ScopedIds idsi
|
|
155
|
+
idx_t l0 = invlists->list_size(i), l = l0, j = 0;
|
|
156
|
+
ScopedIds idsi(invlists, i);
|
|
171
157
|
while (j < l) {
|
|
172
|
-
if (sel.is_member
|
|
158
|
+
if (sel.is_member(idsi[j])) {
|
|
173
159
|
l--;
|
|
174
|
-
invlists->update_entry
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
160
|
+
invlists->update_entry(
|
|
161
|
+
i,
|
|
162
|
+
j,
|
|
163
|
+
invlists->get_single_id(i, l),
|
|
164
|
+
ScopedCodes(invlists, i, l).get());
|
|
179
165
|
} else {
|
|
180
166
|
j++;
|
|
181
167
|
}
|
|
@@ -191,30 +177,28 @@ size_t DirectMap::remove_ids(const IDSelector& sel, InvertedLists *invlists)
|
|
|
191
177
|
}
|
|
192
178
|
}
|
|
193
179
|
} else if (type == Hashtable) {
|
|
194
|
-
const IDSelectorArray
|
|
195
|
-
|
|
196
|
-
FAISS_THROW_IF_NOT_MSG
|
|
197
|
-
|
|
198
|
-
"remove with hashtable works only with IDSelectorArray"
|
|
199
|
-
);
|
|
180
|
+
const IDSelectorArray* sela =
|
|
181
|
+
dynamic_cast<const IDSelectorArray*>(&sel);
|
|
182
|
+
FAISS_THROW_IF_NOT_MSG(
|
|
183
|
+
sela, "remove with hashtable works only with IDSelectorArray");
|
|
200
184
|
|
|
201
185
|
for (idx_t i = 0; i < sela->n; i++) {
|
|
202
186
|
idx_t id = sela->ids[i];
|
|
203
|
-
auto res = hashtable.find
|
|
187
|
+
auto res = hashtable.find(id);
|
|
204
188
|
if (res != hashtable.end()) {
|
|
205
|
-
size_t list_no = lo_listno
|
|
206
|
-
size_t offset = lo_offset
|
|
207
|
-
idx_t last = invlists->list_size
|
|
208
|
-
hashtable.erase
|
|
189
|
+
size_t list_no = lo_listno(res->second);
|
|
190
|
+
size_t offset = lo_offset(res->second);
|
|
191
|
+
idx_t last = invlists->list_size(list_no) - 1;
|
|
192
|
+
hashtable.erase(res);
|
|
209
193
|
if (offset < last) {
|
|
210
|
-
idx_t last_id = invlists->get_single_id
|
|
211
|
-
invlists->update_entry
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
194
|
+
idx_t last_id = invlists->get_single_id(list_no, last);
|
|
195
|
+
invlists->update_entry(
|
|
196
|
+
list_no,
|
|
197
|
+
offset,
|
|
198
|
+
last_id,
|
|
199
|
+
ScopedCodes(invlists, list_no, last).get());
|
|
216
200
|
// update hash entry for last element
|
|
217
|
-
hashtable
|
|
201
|
+
hashtable[last_id] = list_no << 32 | offset;
|
|
218
202
|
}
|
|
219
203
|
invlists->resize(list_no, last);
|
|
220
204
|
nremove++;
|
|
@@ -227,41 +211,41 @@ size_t DirectMap::remove_ids(const IDSelector& sel, InvertedLists *invlists)
|
|
|
227
211
|
return nremove;
|
|
228
212
|
}
|
|
229
213
|
|
|
230
|
-
void DirectMap::update_codes
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
214
|
+
void DirectMap::update_codes(
|
|
215
|
+
InvertedLists* invlists,
|
|
216
|
+
int n,
|
|
217
|
+
const idx_t* ids,
|
|
218
|
+
const idx_t* assign,
|
|
219
|
+
const uint8_t* codes) {
|
|
220
|
+
FAISS_THROW_IF_NOT(type == Array);
|
|
236
221
|
|
|
237
222
|
size_t code_size = invlists->code_size;
|
|
238
223
|
|
|
239
224
|
for (size_t i = 0; i < n; i++) {
|
|
240
225
|
idx_t id = ids[i];
|
|
241
|
-
FAISS_THROW_IF_NOT_MSG
|
|
242
|
-
|
|
226
|
+
FAISS_THROW_IF_NOT_MSG(
|
|
227
|
+
0 <= id && id < array.size(), "id to update out of range");
|
|
243
228
|
{ // remove old one
|
|
244
|
-
idx_t dm = array
|
|
245
|
-
int64_t ofs = lo_offset
|
|
246
|
-
int64_t il = lo_listno
|
|
247
|
-
size_t l = invlists->list_size
|
|
229
|
+
idx_t dm = array[id];
|
|
230
|
+
int64_t ofs = lo_offset(dm);
|
|
231
|
+
int64_t il = lo_listno(dm);
|
|
232
|
+
size_t l = invlists->list_size(il);
|
|
248
233
|
if (ofs != l - 1) { // move l - 1 to ofs
|
|
249
|
-
int64_t id2 = invlists->get_single_id
|
|
250
|
-
array[id2] = lo_build
|
|
251
|
-
invlists->update_entry
|
|
252
|
-
|
|
234
|
+
int64_t id2 = invlists->get_single_id(il, l - 1);
|
|
235
|
+
array[id2] = lo_build(il, ofs);
|
|
236
|
+
invlists->update_entry(
|
|
237
|
+
il, ofs, id2, invlists->get_single_code(il, l - 1));
|
|
253
238
|
}
|
|
254
|
-
invlists->resize
|
|
239
|
+
invlists->resize(il, l - 1);
|
|
255
240
|
}
|
|
256
241
|
{ // insert new one
|
|
257
242
|
int64_t il = assign[i];
|
|
258
|
-
size_t l = invlists->list_size
|
|
259
|
-
idx_t dm = lo_build
|
|
260
|
-
array
|
|
261
|
-
invlists->add_entry
|
|
243
|
+
size_t l = invlists->list_size(il);
|
|
244
|
+
idx_t dm = lo_build(il, l);
|
|
245
|
+
array[id] = dm;
|
|
246
|
+
invlists->add_entry(il, id, codes + i * code_size);
|
|
262
247
|
}
|
|
263
248
|
}
|
|
264
249
|
}
|
|
265
250
|
|
|
266
|
-
|
|
267
|
-
}
|
|
251
|
+
} // namespace faiss
|
|
@@ -13,21 +13,20 @@
|
|
|
13
13
|
#include <faiss/invlists/InvertedLists.h>
|
|
14
14
|
#include <unordered_map>
|
|
15
15
|
|
|
16
|
-
|
|
17
16
|
namespace faiss {
|
|
18
17
|
|
|
19
18
|
// When offsets list id + offset are encoded in an uint64
|
|
20
19
|
// we call this LO = list-offset
|
|
21
20
|
|
|
22
|
-
inline uint64_t lo_build
|
|
23
|
-
return
|
|
21
|
+
inline uint64_t lo_build(uint64_t list_id, uint64_t offset) {
|
|
22
|
+
return list_id << 32 | offset;
|
|
24
23
|
}
|
|
25
24
|
|
|
26
|
-
inline uint64_t lo_listno
|
|
25
|
+
inline uint64_t lo_listno(uint64_t lo) {
|
|
27
26
|
return lo >> 32;
|
|
28
27
|
}
|
|
29
28
|
|
|
30
|
-
inline uint64_t lo_offset
|
|
29
|
+
inline uint64_t lo_offset(uint64_t lo) {
|
|
31
30
|
return lo & 0xffffffff;
|
|
32
31
|
}
|
|
33
32
|
|
|
@@ -38,36 +37,38 @@ struct DirectMap {
|
|
|
38
37
|
typedef Index::idx_t idx_t;
|
|
39
38
|
|
|
40
39
|
enum Type {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
40
|
+
NoMap = 0, // default
|
|
41
|
+
Array = 1, // sequential ids (only for add, no add_with_ids)
|
|
42
|
+
Hashtable = 2 // arbitrary ids
|
|
44
43
|
};
|
|
45
44
|
Type type;
|
|
46
45
|
|
|
47
46
|
/// map for direct access to the elements. Map ids to LO-encoded entries.
|
|
48
|
-
std::vector
|
|
49
|
-
std::unordered_map
|
|
47
|
+
std::vector<idx_t> array;
|
|
48
|
+
std::unordered_map<idx_t, idx_t> hashtable;
|
|
50
49
|
|
|
51
50
|
DirectMap();
|
|
52
51
|
|
|
53
52
|
/// set type and initialize
|
|
54
|
-
void set_type
|
|
53
|
+
void set_type(Type new_type, const InvertedLists* invlists, size_t ntotal);
|
|
55
54
|
|
|
56
55
|
/// get an entry
|
|
57
|
-
idx_t get
|
|
56
|
+
idx_t get(idx_t id) const;
|
|
58
57
|
|
|
59
58
|
/// for quick checks
|
|
60
|
-
bool no
|
|
59
|
+
bool no() const {
|
|
60
|
+
return type == NoMap;
|
|
61
|
+
}
|
|
61
62
|
|
|
62
63
|
/**
|
|
63
64
|
* update the direct_map
|
|
64
65
|
*/
|
|
65
66
|
|
|
66
67
|
/// throw if Array and ids is not NULL
|
|
67
|
-
void check_can_add
|
|
68
|
+
void check_can_add(const idx_t* ids);
|
|
68
69
|
|
|
69
70
|
/// non thread-safe version
|
|
70
|
-
void add_single_id
|
|
71
|
+
void add_single_id(idx_t id, idx_t list_no, size_t offset);
|
|
71
72
|
|
|
72
73
|
/// remove all entries
|
|
73
74
|
void clear();
|
|
@@ -77,44 +78,39 @@ struct DirectMap {
|
|
|
77
78
|
*/
|
|
78
79
|
|
|
79
80
|
/// remove ids from the InvertedLists, possibly using the direct map
|
|
80
|
-
size_t remove_ids(const IDSelector& sel, InvertedLists
|
|
81
|
+
size_t remove_ids(const IDSelector& sel, InvertedLists* invlists);
|
|
81
82
|
|
|
82
83
|
/// update entries, using the direct map
|
|
83
|
-
void update_codes
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
84
|
+
void update_codes(
|
|
85
|
+
InvertedLists* invlists,
|
|
86
|
+
int n,
|
|
87
|
+
const idx_t* ids,
|
|
88
|
+
const idx_t* list_nos,
|
|
89
|
+
const uint8_t* codes);
|
|
90
90
|
};
|
|
91
91
|
|
|
92
92
|
/// Thread-safe way of updating the direct_map
|
|
93
93
|
struct DirectMapAdd {
|
|
94
|
-
|
|
95
94
|
typedef Index::idx_t idx_t;
|
|
96
95
|
|
|
97
96
|
using Type = DirectMap::Type;
|
|
98
97
|
|
|
99
|
-
DirectMap
|
|
98
|
+
DirectMap& direct_map;
|
|
100
99
|
DirectMap::Type type;
|
|
101
100
|
size_t ntotal;
|
|
102
101
|
size_t n;
|
|
103
|
-
const idx_t
|
|
102
|
+
const idx_t* xids;
|
|
104
103
|
|
|
105
104
|
std::vector<idx_t> all_ofs;
|
|
106
105
|
|
|
107
|
-
DirectMapAdd
|
|
106
|
+
DirectMapAdd(DirectMap& direct_map, size_t n, const idx_t* xids);
|
|
108
107
|
|
|
109
108
|
/// add vector i (with id xids[i]) at list_no and offset
|
|
110
|
-
void add
|
|
109
|
+
void add(size_t i, idx_t list_no, size_t offset);
|
|
111
110
|
|
|
112
|
-
~DirectMapAdd
|
|
111
|
+
~DirectMapAdd();
|
|
113
112
|
};
|
|
114
113
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
}
|
|
118
|
-
|
|
114
|
+
} // namespace faiss
|
|
119
115
|
|
|
120
116
|
#endif
|