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,22 +9,20 @@
|
|
|
9
9
|
|
|
10
10
|
#pragma once
|
|
11
11
|
|
|
12
|
-
#include <vector>
|
|
13
|
-
#include <unordered_set>
|
|
14
12
|
#include <queue>
|
|
13
|
+
#include <unordered_set>
|
|
14
|
+
#include <vector>
|
|
15
15
|
|
|
16
16
|
#include <omp.h>
|
|
17
17
|
|
|
18
18
|
#include <faiss/Index.h>
|
|
19
19
|
#include <faiss/impl/FaissAssert.h>
|
|
20
|
-
#include <faiss/utils/random.h>
|
|
21
|
-
#include <faiss/utils/Heap.h>
|
|
22
20
|
#include <faiss/impl/platform_macros.h>
|
|
23
|
-
|
|
21
|
+
#include <faiss/utils/Heap.h>
|
|
22
|
+
#include <faiss/utils/random.h>
|
|
24
23
|
|
|
25
24
|
namespace faiss {
|
|
26
25
|
|
|
27
|
-
|
|
28
26
|
/** Implementation of the Hierarchical Navigable Small World
|
|
29
27
|
* datastructure.
|
|
30
28
|
*
|
|
@@ -33,7 +31,7 @@ namespace faiss {
|
|
|
33
31
|
*
|
|
34
32
|
* Yu. A. Malkov, D. A. Yashunin, arXiv 2017
|
|
35
33
|
*
|
|
36
|
-
* This
|
|
34
|
+
* This implementation is heavily influenced by the NMSlib
|
|
37
35
|
* implementation by Yury Malkov and Leonid Boystov
|
|
38
36
|
* (https://github.com/searchivarius/nmslib)
|
|
39
37
|
*
|
|
@@ -41,243 +39,224 @@ namespace faiss {
|
|
|
41
39
|
* IndexHNSW.h for the full index object.
|
|
42
40
|
*/
|
|
43
41
|
|
|
44
|
-
|
|
45
42
|
struct VisitedTable;
|
|
46
43
|
struct DistanceComputer; // from AuxIndexStructures
|
|
47
44
|
struct HNSWStats;
|
|
48
45
|
|
|
49
46
|
struct HNSW {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
/// Faiss results are 64-bit
|
|
54
|
-
typedef Index::idx_t idx_t;
|
|
55
|
-
|
|
56
|
-
typedef std::pair<float, storage_idx_t> Node;
|
|
57
|
-
|
|
58
|
-
/** Heap structure that allows fast
|
|
59
|
-
*/
|
|
60
|
-
struct MinimaxHeap {
|
|
61
|
-
int n;
|
|
62
|
-
int k;
|
|
63
|
-
int nvalid;
|
|
64
|
-
|
|
65
|
-
std::vector<storage_idx_t> ids;
|
|
66
|
-
std::vector<float> dis;
|
|
67
|
-
typedef faiss::CMax<float, storage_idx_t> HC;
|
|
68
|
-
|
|
69
|
-
explicit MinimaxHeap(int n): n(n), k(0), nvalid(0), ids(n), dis(n) {}
|
|
70
|
-
|
|
71
|
-
void push(storage_idx_t i, float v);
|
|
72
|
-
|
|
73
|
-
float max() const;
|
|
74
|
-
|
|
75
|
-
int size() const;
|
|
76
|
-
|
|
77
|
-
void clear();
|
|
47
|
+
/// internal storage of vectors (32 bits: this is expensive)
|
|
48
|
+
typedef int storage_idx_t;
|
|
78
49
|
|
|
79
|
-
|
|
50
|
+
/// Faiss results are 64-bit
|
|
51
|
+
typedef Index::idx_t idx_t;
|
|
80
52
|
|
|
81
|
-
|
|
82
|
-
};
|
|
53
|
+
typedef std::pair<float, storage_idx_t> Node;
|
|
83
54
|
|
|
55
|
+
/** Heap structure that allows fast
|
|
56
|
+
*/
|
|
57
|
+
struct MinimaxHeap {
|
|
58
|
+
int n;
|
|
59
|
+
int k;
|
|
60
|
+
int nvalid;
|
|
84
61
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
int id;
|
|
89
|
-
NodeDistCloser(float d, int id): d(d), id(id) {}
|
|
90
|
-
bool operator < (const NodeDistCloser &obj1) const { return d < obj1.d; }
|
|
91
|
-
};
|
|
62
|
+
std::vector<storage_idx_t> ids;
|
|
63
|
+
std::vector<float> dis;
|
|
64
|
+
typedef faiss::CMax<float, storage_idx_t> HC;
|
|
92
65
|
|
|
93
|
-
|
|
94
|
-
float d;
|
|
95
|
-
int id;
|
|
96
|
-
NodeDistFarther(float d, int id): d(d), id(id) {}
|
|
97
|
-
bool operator < (const NodeDistFarther &obj1) const { return d > obj1.d; }
|
|
98
|
-
};
|
|
66
|
+
explicit MinimaxHeap(int n) : n(n), k(0), nvalid(0), ids(n), dis(n) {}
|
|
99
67
|
|
|
68
|
+
void push(storage_idx_t i, float v);
|
|
100
69
|
|
|
101
|
-
|
|
102
|
-
std::vector<double> assign_probas;
|
|
70
|
+
float max() const;
|
|
103
71
|
|
|
104
|
-
|
|
105
|
-
/// be changed after first add
|
|
106
|
-
std::vector<int> cum_nneighbor_per_level;
|
|
72
|
+
int size() const;
|
|
107
73
|
|
|
108
|
-
|
|
109
|
-
std::vector<int> levels;
|
|
74
|
+
void clear();
|
|
110
75
|
|
|
111
|
-
|
|
112
|
-
/// size ntotal + 1
|
|
113
|
-
std::vector<size_t> offsets;
|
|
76
|
+
int pop_min(float* vmin_out = nullptr);
|
|
114
77
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
std::vector<storage_idx_t> neighbors;
|
|
78
|
+
int count_below(float thresh);
|
|
79
|
+
};
|
|
118
80
|
|
|
119
|
-
|
|
120
|
-
|
|
81
|
+
/// to sort pairs of (id, distance) from nearest to fathest or the reverse
|
|
82
|
+
struct NodeDistCloser {
|
|
83
|
+
float d;
|
|
84
|
+
int id;
|
|
85
|
+
NodeDistCloser(float d, int id) : d(d), id(id) {}
|
|
86
|
+
bool operator<(const NodeDistCloser& obj1) const {
|
|
87
|
+
return d < obj1.d;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
121
90
|
|
|
122
|
-
|
|
91
|
+
struct NodeDistFarther {
|
|
92
|
+
float d;
|
|
93
|
+
int id;
|
|
94
|
+
NodeDistFarther(float d, int id) : d(d), id(id) {}
|
|
95
|
+
bool operator<(const NodeDistFarther& obj1) const {
|
|
96
|
+
return d > obj1.d;
|
|
97
|
+
}
|
|
98
|
+
};
|
|
123
99
|
|
|
124
|
-
|
|
125
|
-
|
|
100
|
+
/// assignment probability to each layer (sum=1)
|
|
101
|
+
std::vector<double> assign_probas;
|
|
126
102
|
|
|
127
|
-
|
|
128
|
-
|
|
103
|
+
/// number of neighbors stored per layer (cumulative), should not
|
|
104
|
+
/// be changed after first add
|
|
105
|
+
std::vector<int> cum_nneighbor_per_level;
|
|
129
106
|
|
|
130
|
-
|
|
131
|
-
|
|
107
|
+
/// level of each vector (base level = 1), size = ntotal
|
|
108
|
+
std::vector<int> levels;
|
|
132
109
|
|
|
133
|
-
|
|
134
|
-
|
|
110
|
+
/// offsets[i] is the offset in the neighbors array where vector i is stored
|
|
111
|
+
/// size ntotal + 1
|
|
112
|
+
std::vector<size_t> offsets;
|
|
135
113
|
|
|
136
|
-
|
|
137
|
-
|
|
114
|
+
/// neighbors[offsets[i]:offsets[i+1]] is the list of neighbors of vector i
|
|
115
|
+
/// for all levels. this is where all storage goes.
|
|
116
|
+
std::vector<storage_idx_t> neighbors;
|
|
138
117
|
|
|
139
|
-
|
|
140
|
-
|
|
118
|
+
/// entry point in the search structure (one of the points with maximum
|
|
119
|
+
/// level
|
|
120
|
+
storage_idx_t entry_point;
|
|
141
121
|
|
|
142
|
-
|
|
122
|
+
faiss::RandomGenerator rng;
|
|
143
123
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
void set_default_probas(int M, float levelMult);
|
|
124
|
+
/// maximum level
|
|
125
|
+
int max_level;
|
|
147
126
|
|
|
148
|
-
|
|
149
|
-
|
|
127
|
+
/// expansion factor at construction time
|
|
128
|
+
int efConstruction;
|
|
150
129
|
|
|
151
|
-
|
|
130
|
+
/// expansion factor at search time
|
|
131
|
+
int efSearch;
|
|
152
132
|
|
|
153
|
-
|
|
154
|
-
|
|
133
|
+
/// during search: do we check whether the next best distance is good
|
|
134
|
+
/// enough?
|
|
135
|
+
bool check_relative_distance = true;
|
|
155
136
|
|
|
156
|
-
|
|
157
|
-
|
|
137
|
+
/// number of entry points in levels > 0.
|
|
138
|
+
int upper_beam;
|
|
158
139
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
size_t * begin, size_t * end) const;
|
|
140
|
+
/// use bounded queue during exploration
|
|
141
|
+
bool search_bounded_queue = true;
|
|
162
142
|
|
|
163
|
-
|
|
164
|
-
explicit HNSW(int M = 32);
|
|
143
|
+
// methods that initialize the tree sizes
|
|
165
144
|
|
|
166
|
-
|
|
167
|
-
|
|
145
|
+
/// initialize the assign_probas and cum_nneighbor_per_level to
|
|
146
|
+
/// have 2*M links on level 0 and M links on levels > 0
|
|
147
|
+
void set_default_probas(int M, float levelMult);
|
|
168
148
|
|
|
169
|
-
|
|
170
|
-
|
|
149
|
+
/// set nb of neighbors for this level (before adding anything)
|
|
150
|
+
void set_nb_neighbors(int level_no, int n);
|
|
171
151
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
152
|
+
// methods that access the tree sizes
|
|
153
|
+
|
|
154
|
+
/// nb of neighbors for this level
|
|
155
|
+
int nb_neighbors(int layer_no) const;
|
|
156
|
+
|
|
157
|
+
/// cumumlative nb up to (and excluding) this level
|
|
158
|
+
int cum_nb_neighbors(int layer_no) const;
|
|
179
159
|
|
|
160
|
+
/// range of entries in the neighbors table of vertex no at layer_no
|
|
161
|
+
void neighbor_range(idx_t no, int layer_no, size_t* begin, size_t* end)
|
|
162
|
+
const;
|
|
180
163
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
void add_with_locks(DistanceComputer& ptdis, int pt_level, int pt_id,
|
|
184
|
-
std::vector<omp_lock_t>& locks,
|
|
185
|
-
VisitedTable& vt);
|
|
186
|
-
|
|
187
|
-
int search_from_candidates(DistanceComputer& qdis, int k,
|
|
188
|
-
idx_t *I, float *D,
|
|
189
|
-
MinimaxHeap& candidates,
|
|
190
|
-
VisitedTable &vt,
|
|
191
|
-
HNSWStats &stats,
|
|
192
|
-
int level, int nres_in = 0) const;
|
|
193
|
-
|
|
194
|
-
std::priority_queue<Node> search_from_candidate_unbounded(
|
|
195
|
-
const Node& node,
|
|
196
|
-
DistanceComputer& qdis,
|
|
197
|
-
int ef,
|
|
198
|
-
VisitedTable *vt,
|
|
199
|
-
HNSWStats &stats) const;
|
|
200
|
-
|
|
201
|
-
/// search interface
|
|
202
|
-
HNSWStats search(DistanceComputer& qdis, int k,
|
|
203
|
-
idx_t *I, float *D,
|
|
204
|
-
VisitedTable &vt) const;
|
|
205
|
-
|
|
206
|
-
void reset();
|
|
207
|
-
|
|
208
|
-
void clear_neighbor_tables(int level);
|
|
209
|
-
void print_neighbor_stats(int level) const;
|
|
210
|
-
|
|
211
|
-
int prepare_level_tab(size_t n, bool preset_levels = false);
|
|
212
|
-
|
|
213
|
-
static void shrink_neighbor_list(
|
|
214
|
-
DistanceComputer& qdis,
|
|
215
|
-
std::priority_queue<NodeDistFarther>& input,
|
|
216
|
-
std::vector<NodeDistFarther>& output,
|
|
217
|
-
int max_size);
|
|
164
|
+
/// only mandatory parameter: nb of neighbors
|
|
165
|
+
explicit HNSW(int M = 32);
|
|
218
166
|
|
|
167
|
+
/// pick a random level for a new point
|
|
168
|
+
int random_level();
|
|
169
|
+
|
|
170
|
+
/// add n random levels to table (for debugging...)
|
|
171
|
+
void fill_with_random_links(size_t n);
|
|
172
|
+
|
|
173
|
+
void add_links_starting_from(
|
|
174
|
+
DistanceComputer& ptdis,
|
|
175
|
+
storage_idx_t pt_id,
|
|
176
|
+
storage_idx_t nearest,
|
|
177
|
+
float d_nearest,
|
|
178
|
+
int level,
|
|
179
|
+
omp_lock_t* locks,
|
|
180
|
+
VisitedTable& vt);
|
|
181
|
+
|
|
182
|
+
/** add point pt_id on all levels <= pt_level and build the link
|
|
183
|
+
* structure for them. */
|
|
184
|
+
void add_with_locks(
|
|
185
|
+
DistanceComputer& ptdis,
|
|
186
|
+
int pt_level,
|
|
187
|
+
int pt_id,
|
|
188
|
+
std::vector<omp_lock_t>& locks,
|
|
189
|
+
VisitedTable& vt);
|
|
190
|
+
|
|
191
|
+
int search_from_candidates(
|
|
192
|
+
DistanceComputer& qdis,
|
|
193
|
+
int k,
|
|
194
|
+
idx_t* I,
|
|
195
|
+
float* D,
|
|
196
|
+
MinimaxHeap& candidates,
|
|
197
|
+
VisitedTable& vt,
|
|
198
|
+
HNSWStats& stats,
|
|
199
|
+
int level,
|
|
200
|
+
int nres_in = 0) const;
|
|
201
|
+
|
|
202
|
+
std::priority_queue<Node> search_from_candidate_unbounded(
|
|
203
|
+
const Node& node,
|
|
204
|
+
DistanceComputer& qdis,
|
|
205
|
+
int ef,
|
|
206
|
+
VisitedTable* vt,
|
|
207
|
+
HNSWStats& stats) const;
|
|
208
|
+
|
|
209
|
+
/// search interface
|
|
210
|
+
HNSWStats search(
|
|
211
|
+
DistanceComputer& qdis,
|
|
212
|
+
int k,
|
|
213
|
+
idx_t* I,
|
|
214
|
+
float* D,
|
|
215
|
+
VisitedTable& vt) const;
|
|
216
|
+
|
|
217
|
+
void reset();
|
|
218
|
+
|
|
219
|
+
void clear_neighbor_tables(int level);
|
|
220
|
+
void print_neighbor_stats(int level) const;
|
|
221
|
+
|
|
222
|
+
int prepare_level_tab(size_t n, bool preset_levels = false);
|
|
223
|
+
|
|
224
|
+
static void shrink_neighbor_list(
|
|
225
|
+
DistanceComputer& qdis,
|
|
226
|
+
std::priority_queue<NodeDistFarther>& input,
|
|
227
|
+
std::vector<NodeDistFarther>& output,
|
|
228
|
+
int max_size);
|
|
219
229
|
};
|
|
220
230
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
/// get flag #no
|
|
240
|
-
bool get(int no) const {
|
|
241
|
-
return visited[no] == visno;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
/// reset all flags to false
|
|
245
|
-
void advance() {
|
|
246
|
-
visno++;
|
|
247
|
-
if (visno == 250) {
|
|
248
|
-
// 250 rather than 255 because sometimes we use visno and visno+1
|
|
249
|
-
memset(visited.data(), 0, sizeof(visited[0]) * visited.size());
|
|
250
|
-
visno = 1;
|
|
231
|
+
struct HNSWStats {
|
|
232
|
+
size_t n1, n2, n3;
|
|
233
|
+
size_t ndis;
|
|
234
|
+
size_t nreorder;
|
|
235
|
+
|
|
236
|
+
HNSWStats(
|
|
237
|
+
size_t n1 = 0,
|
|
238
|
+
size_t n2 = 0,
|
|
239
|
+
size_t n3 = 0,
|
|
240
|
+
size_t ndis = 0,
|
|
241
|
+
size_t nreorder = 0)
|
|
242
|
+
: n1(n1), n2(n2), n3(n3), ndis(ndis), nreorder(nreorder) {}
|
|
243
|
+
|
|
244
|
+
void reset() {
|
|
245
|
+
n1 = n2 = n3 = 0;
|
|
246
|
+
ndis = 0;
|
|
247
|
+
nreorder = 0;
|
|
251
248
|
}
|
|
252
|
-
}
|
|
253
|
-
};
|
|
254
249
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
: n1(n1), n2(n2), n3(n3), ndis(ndis), nreorder(nreorder) {}
|
|
263
|
-
|
|
264
|
-
void reset() {
|
|
265
|
-
n1 = n2 = n3 = 0;
|
|
266
|
-
ndis = 0;
|
|
267
|
-
nreorder = 0;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
void combine(const HNSWStats& other) {
|
|
271
|
-
n1 += other.n1;
|
|
272
|
-
n2 += other.n2;
|
|
273
|
-
n3 += other.n3;
|
|
274
|
-
ndis += other.ndis;
|
|
275
|
-
nreorder += other.nreorder;
|
|
276
|
-
}
|
|
250
|
+
void combine(const HNSWStats& other) {
|
|
251
|
+
n1 += other.n1;
|
|
252
|
+
n2 += other.n2;
|
|
253
|
+
n3 += other.n3;
|
|
254
|
+
ndis += other.ndis;
|
|
255
|
+
nreorder += other.nreorder;
|
|
256
|
+
}
|
|
277
257
|
};
|
|
278
258
|
|
|
279
259
|
// global var that collects them all
|
|
280
260
|
FAISS_API extern HNSWStats hnsw_stats;
|
|
281
261
|
|
|
282
|
-
|
|
283
|
-
} // namespace faiss
|
|
262
|
+
} // namespace faiss
|