faiss 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (202) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/lib/faiss/version.rb +1 -1
  4. data/vendor/faiss/faiss/AutoTune.cpp +292 -291
  5. data/vendor/faiss/faiss/AutoTune.h +55 -56
  6. data/vendor/faiss/faiss/Clustering.cpp +334 -195
  7. data/vendor/faiss/faiss/Clustering.h +88 -35
  8. data/vendor/faiss/faiss/IVFlib.cpp +171 -195
  9. data/vendor/faiss/faiss/IVFlib.h +48 -51
  10. data/vendor/faiss/faiss/Index.cpp +85 -103
  11. data/vendor/faiss/faiss/Index.h +54 -48
  12. data/vendor/faiss/faiss/Index2Layer.cpp +139 -164
  13. data/vendor/faiss/faiss/Index2Layer.h +22 -22
  14. data/vendor/faiss/faiss/IndexBinary.cpp +45 -37
  15. data/vendor/faiss/faiss/IndexBinary.h +140 -132
  16. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +73 -53
  17. data/vendor/faiss/faiss/IndexBinaryFlat.h +29 -24
  18. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +46 -43
  19. data/vendor/faiss/faiss/IndexBinaryFromFloat.h +16 -15
  20. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +215 -232
  21. data/vendor/faiss/faiss/IndexBinaryHNSW.h +25 -24
  22. data/vendor/faiss/faiss/IndexBinaryHash.cpp +182 -177
  23. data/vendor/faiss/faiss/IndexBinaryHash.h +41 -34
  24. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +489 -461
  25. data/vendor/faiss/faiss/IndexBinaryIVF.h +97 -68
  26. data/vendor/faiss/faiss/IndexFlat.cpp +116 -147
  27. data/vendor/faiss/faiss/IndexFlat.h +35 -46
  28. data/vendor/faiss/faiss/IndexHNSW.cpp +372 -348
  29. data/vendor/faiss/faiss/IndexHNSW.h +57 -41
  30. data/vendor/faiss/faiss/IndexIVF.cpp +474 -454
  31. data/vendor/faiss/faiss/IndexIVF.h +146 -113
  32. data/vendor/faiss/faiss/IndexIVFFlat.cpp +248 -250
  33. data/vendor/faiss/faiss/IndexIVFFlat.h +48 -51
  34. data/vendor/faiss/faiss/IndexIVFPQ.cpp +457 -516
  35. data/vendor/faiss/faiss/IndexIVFPQ.h +74 -66
  36. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +406 -372
  37. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +82 -57
  38. data/vendor/faiss/faiss/IndexIVFPQR.cpp +104 -102
  39. data/vendor/faiss/faiss/IndexIVFPQR.h +33 -28
  40. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +125 -133
  41. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +19 -21
  42. data/vendor/faiss/faiss/IndexLSH.cpp +75 -96
  43. data/vendor/faiss/faiss/IndexLSH.h +21 -26
  44. data/vendor/faiss/faiss/IndexLattice.cpp +42 -56
  45. data/vendor/faiss/faiss/IndexLattice.h +11 -16
  46. data/vendor/faiss/faiss/IndexNNDescent.cpp +231 -0
  47. data/vendor/faiss/faiss/IndexNNDescent.h +72 -0
  48. data/vendor/faiss/faiss/IndexNSG.cpp +303 -0
  49. data/vendor/faiss/faiss/IndexNSG.h +85 -0
  50. data/vendor/faiss/faiss/IndexPQ.cpp +405 -464
  51. data/vendor/faiss/faiss/IndexPQ.h +64 -67
  52. data/vendor/faiss/faiss/IndexPQFastScan.cpp +143 -170
  53. data/vendor/faiss/faiss/IndexPQFastScan.h +46 -32
  54. data/vendor/faiss/faiss/IndexPreTransform.cpp +120 -150
  55. data/vendor/faiss/faiss/IndexPreTransform.h +33 -36
  56. data/vendor/faiss/faiss/IndexRefine.cpp +115 -131
  57. data/vendor/faiss/faiss/IndexRefine.h +22 -23
  58. data/vendor/faiss/faiss/IndexReplicas.cpp +147 -153
  59. data/vendor/faiss/faiss/IndexReplicas.h +62 -56
  60. data/vendor/faiss/faiss/IndexResidual.cpp +291 -0
  61. data/vendor/faiss/faiss/IndexResidual.h +152 -0
  62. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +120 -155
  63. data/vendor/faiss/faiss/IndexScalarQuantizer.h +41 -45
  64. data/vendor/faiss/faiss/IndexShards.cpp +256 -240
  65. data/vendor/faiss/faiss/IndexShards.h +85 -73
  66. data/vendor/faiss/faiss/MatrixStats.cpp +112 -97
  67. data/vendor/faiss/faiss/MatrixStats.h +7 -10
  68. data/vendor/faiss/faiss/MetaIndexes.cpp +135 -157
  69. data/vendor/faiss/faiss/MetaIndexes.h +40 -34
  70. data/vendor/faiss/faiss/MetricType.h +7 -7
  71. data/vendor/faiss/faiss/VectorTransform.cpp +652 -474
  72. data/vendor/faiss/faiss/VectorTransform.h +61 -89
  73. data/vendor/faiss/faiss/clone_index.cpp +77 -73
  74. data/vendor/faiss/faiss/clone_index.h +4 -9
  75. data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +33 -38
  76. data/vendor/faiss/faiss/gpu/GpuAutoTune.h +11 -9
  77. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +197 -170
  78. data/vendor/faiss/faiss/gpu/GpuCloner.h +53 -35
  79. data/vendor/faiss/faiss/gpu/GpuClonerOptions.cpp +12 -14
  80. data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +27 -25
  81. data/vendor/faiss/faiss/gpu/GpuDistance.h +116 -112
  82. data/vendor/faiss/faiss/gpu/GpuFaissAssert.h +1 -2
  83. data/vendor/faiss/faiss/gpu/GpuIndex.h +134 -137
  84. data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +76 -73
  85. data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +173 -162
  86. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +67 -64
  87. data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +89 -86
  88. data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +150 -141
  89. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +101 -103
  90. data/vendor/faiss/faiss/gpu/GpuIndicesOptions.h +17 -16
  91. data/vendor/faiss/faiss/gpu/GpuResources.cpp +116 -128
  92. data/vendor/faiss/faiss/gpu/GpuResources.h +182 -186
  93. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +433 -422
  94. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +131 -130
  95. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.cpp +468 -456
  96. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.h +25 -19
  97. data/vendor/faiss/faiss/gpu/impl/RemapIndices.cpp +22 -20
  98. data/vendor/faiss/faiss/gpu/impl/RemapIndices.h +9 -8
  99. data/vendor/faiss/faiss/gpu/perf/IndexWrapper-inl.h +39 -44
  100. data/vendor/faiss/faiss/gpu/perf/IndexWrapper.h +16 -14
  101. data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +77 -71
  102. data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +109 -88
  103. data/vendor/faiss/faiss/gpu/perf/WriteIndex.cpp +75 -64
  104. data/vendor/faiss/faiss/gpu/test/TestCodePacking.cpp +230 -215
  105. data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +80 -86
  106. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +284 -277
  107. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +416 -416
  108. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +611 -517
  109. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +166 -164
  110. data/vendor/faiss/faiss/gpu/test/TestGpuMemoryException.cpp +61 -53
  111. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +274 -238
  112. data/vendor/faiss/faiss/gpu/test/TestUtils.h +73 -57
  113. data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +47 -50
  114. data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +79 -72
  115. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +140 -146
  116. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.h +69 -71
  117. data/vendor/faiss/faiss/gpu/utils/StaticUtils.h +21 -16
  118. data/vendor/faiss/faiss/gpu/utils/Timer.cpp +25 -29
  119. data/vendor/faiss/faiss/gpu/utils/Timer.h +30 -29
  120. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +270 -0
  121. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +115 -0
  122. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +90 -120
  123. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +81 -65
  124. data/vendor/faiss/faiss/impl/FaissAssert.h +73 -58
  125. data/vendor/faiss/faiss/impl/FaissException.cpp +56 -48
  126. data/vendor/faiss/faiss/impl/FaissException.h +41 -29
  127. data/vendor/faiss/faiss/impl/HNSW.cpp +595 -611
  128. data/vendor/faiss/faiss/impl/HNSW.h +179 -200
  129. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +672 -0
  130. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +172 -0
  131. data/vendor/faiss/faiss/impl/NNDescent.cpp +487 -0
  132. data/vendor/faiss/faiss/impl/NNDescent.h +154 -0
  133. data/vendor/faiss/faiss/impl/NSG.cpp +682 -0
  134. data/vendor/faiss/faiss/impl/NSG.h +199 -0
  135. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +484 -454
  136. data/vendor/faiss/faiss/impl/PolysemousTraining.h +52 -55
  137. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +26 -47
  138. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +469 -459
  139. data/vendor/faiss/faiss/impl/ProductQuantizer.h +76 -87
  140. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +448 -0
  141. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +130 -0
  142. data/vendor/faiss/faiss/impl/ResultHandler.h +96 -132
  143. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +648 -701
  144. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +48 -46
  145. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +129 -131
  146. data/vendor/faiss/faiss/impl/ThreadedIndex.h +61 -55
  147. data/vendor/faiss/faiss/impl/index_read.cpp +547 -479
  148. data/vendor/faiss/faiss/impl/index_write.cpp +497 -407
  149. data/vendor/faiss/faiss/impl/io.cpp +75 -94
  150. data/vendor/faiss/faiss/impl/io.h +31 -41
  151. data/vendor/faiss/faiss/impl/io_macros.h +40 -29
  152. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +137 -186
  153. data/vendor/faiss/faiss/impl/lattice_Zn.h +40 -51
  154. data/vendor/faiss/faiss/impl/platform_macros.h +29 -8
  155. data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +77 -124
  156. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +39 -48
  157. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +41 -52
  158. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +80 -117
  159. data/vendor/faiss/faiss/impl/simd_result_handlers.h +109 -137
  160. data/vendor/faiss/faiss/index_factory.cpp +269 -218
  161. data/vendor/faiss/faiss/index_factory.h +6 -7
  162. data/vendor/faiss/faiss/index_io.h +23 -26
  163. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +67 -75
  164. data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +22 -24
  165. data/vendor/faiss/faiss/invlists/DirectMap.cpp +96 -112
  166. data/vendor/faiss/faiss/invlists/DirectMap.h +29 -33
  167. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +307 -364
  168. data/vendor/faiss/faiss/invlists/InvertedLists.h +151 -151
  169. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +29 -34
  170. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.h +17 -18
  171. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +257 -293
  172. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +50 -45
  173. data/vendor/faiss/faiss/python/python_callbacks.cpp +23 -26
  174. data/vendor/faiss/faiss/python/python_callbacks.h +9 -16
  175. data/vendor/faiss/faiss/utils/AlignedTable.h +79 -44
  176. data/vendor/faiss/faiss/utils/Heap.cpp +40 -48
  177. data/vendor/faiss/faiss/utils/Heap.h +186 -209
  178. data/vendor/faiss/faiss/utils/WorkerThread.cpp +67 -76
  179. data/vendor/faiss/faiss/utils/WorkerThread.h +32 -33
  180. data/vendor/faiss/faiss/utils/distances.cpp +301 -310
  181. data/vendor/faiss/faiss/utils/distances.h +133 -118
  182. data/vendor/faiss/faiss/utils/distances_simd.cpp +456 -516
  183. data/vendor/faiss/faiss/utils/extra_distances-inl.h +117 -0
  184. data/vendor/faiss/faiss/utils/extra_distances.cpp +113 -232
  185. data/vendor/faiss/faiss/utils/extra_distances.h +30 -29
  186. data/vendor/faiss/faiss/utils/hamming-inl.h +260 -209
  187. data/vendor/faiss/faiss/utils/hamming.cpp +375 -469
  188. data/vendor/faiss/faiss/utils/hamming.h +62 -85
  189. data/vendor/faiss/faiss/utils/ordered_key_value.h +16 -18
  190. data/vendor/faiss/faiss/utils/partitioning.cpp +393 -318
  191. data/vendor/faiss/faiss/utils/partitioning.h +26 -21
  192. data/vendor/faiss/faiss/utils/quantize_lut.cpp +78 -66
  193. data/vendor/faiss/faiss/utils/quantize_lut.h +22 -20
  194. data/vendor/faiss/faiss/utils/random.cpp +39 -63
  195. data/vendor/faiss/faiss/utils/random.h +13 -16
  196. data/vendor/faiss/faiss/utils/simdlib.h +4 -2
  197. data/vendor/faiss/faiss/utils/simdlib_avx2.h +88 -85
  198. data/vendor/faiss/faiss/utils/simdlib_emulated.h +226 -165
  199. data/vendor/faiss/faiss/utils/simdlib_neon.h +832 -0
  200. data/vendor/faiss/faiss/utils/utils.cpp +304 -287
  201. data/vendor/faiss/faiss/utils/utils.h +53 -48
  202. metadata +20 -2
@@ -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 implmentation is heavily influenced by the NMSlib
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
- /// internal storage of vectors (32 bits: this is expensive)
51
- typedef int storage_idx_t;
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
- int pop_min(float *vmin_out = nullptr);
50
+ /// Faiss results are 64-bit
51
+ typedef Index::idx_t idx_t;
80
52
 
81
- int count_below(float thresh);
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
- /// to sort pairs of (id, distance) from nearest to fathest or the reverse
86
- struct NodeDistCloser {
87
- float d;
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
- struct NodeDistFarther {
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
- /// assignment probability to each layer (sum=1)
102
- std::vector<double> assign_probas;
70
+ float max() const;
103
71
 
104
- /// number of neighbors stored per layer (cumulative), should not
105
- /// be changed after first add
106
- std::vector<int> cum_nneighbor_per_level;
72
+ int size() const;
107
73
 
108
- /// level of each vector (base level = 1), size = ntotal
109
- std::vector<int> levels;
74
+ void clear();
110
75
 
111
- /// offsets[i] is the offset in the neighbors array where vector i is stored
112
- /// size ntotal + 1
113
- std::vector<size_t> offsets;
76
+ int pop_min(float* vmin_out = nullptr);
114
77
 
115
- /// neighbors[offsets[i]:offsets[i+1]] is the list of neighbors of vector i
116
- /// for all levels. this is where all storage goes.
117
- std::vector<storage_idx_t> neighbors;
78
+ int count_below(float thresh);
79
+ };
118
80
 
119
- /// entry point in the search structure (one of the points with maximum level
120
- storage_idx_t entry_point;
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
- faiss::RandomGenerator rng;
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
- /// maximum level
125
- int max_level;
100
+ /// assignment probability to each layer (sum=1)
101
+ std::vector<double> assign_probas;
126
102
 
127
- /// expansion factor at construction time
128
- int efConstruction;
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
- /// expansion factor at search time
131
- int efSearch;
107
+ /// level of each vector (base level = 1), size = ntotal
108
+ std::vector<int> levels;
132
109
 
133
- /// during search: do we check whether the next best distance is good enough?
134
- bool check_relative_distance = true;
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
- /// number of entry points in levels > 0.
137
- int upper_beam;
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
- /// use bounded queue during exploration
140
- bool search_bounded_queue = true;
118
+ /// entry point in the search structure (one of the points with maximum
119
+ /// level
120
+ storage_idx_t entry_point;
141
121
 
142
- // methods that initialize the tree sizes
122
+ faiss::RandomGenerator rng;
143
123
 
144
- /// initialize the assign_probas and cum_nneighbor_per_level to
145
- /// have 2*M links on level 0 and M links on levels > 0
146
- void set_default_probas(int M, float levelMult);
124
+ /// maximum level
125
+ int max_level;
147
126
 
148
- /// set nb of neighbors for this level (before adding anything)
149
- void set_nb_neighbors(int level_no, int n);
127
+ /// expansion factor at construction time
128
+ int efConstruction;
150
129
 
151
- // methods that access the tree sizes
130
+ /// expansion factor at search time
131
+ int efSearch;
152
132
 
153
- /// nb of neighbors for this level
154
- int nb_neighbors(int layer_no) const;
133
+ /// during search: do we check whether the next best distance is good
134
+ /// enough?
135
+ bool check_relative_distance = true;
155
136
 
156
- /// cumumlative nb up to (and excluding) this level
157
- int cum_nb_neighbors(int layer_no) const;
137
+ /// number of entry points in levels > 0.
138
+ int upper_beam;
158
139
 
159
- /// range of entries in the neighbors table of vertex no at layer_no
160
- void neighbor_range(idx_t no, int layer_no,
161
- size_t * begin, size_t * end) const;
140
+ /// use bounded queue during exploration
141
+ bool search_bounded_queue = true;
162
142
 
163
- /// only mandatory parameter: nb of neighbors
164
- explicit HNSW(int M = 32);
143
+ // methods that initialize the tree sizes
165
144
 
166
- /// pick a random level for a new point
167
- int random_level();
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
- /// add n random levels to table (for debugging...)
170
- void fill_with_random_links(size_t n);
149
+ /// set nb of neighbors for this level (before adding anything)
150
+ void set_nb_neighbors(int level_no, int n);
171
151
 
172
- void add_links_starting_from(DistanceComputer& ptdis,
173
- storage_idx_t pt_id,
174
- storage_idx_t nearest,
175
- float d_nearest,
176
- int level,
177
- omp_lock_t *locks,
178
- VisitedTable &vt);
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
- /** add point pt_id on all levels <= pt_level and build the link
182
- * structure for them. */
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
- * Auxiliary structures
224
- **************************************************************/
225
-
226
- /// set implementation optimized for fast access.
227
- struct VisitedTable {
228
- std::vector<uint8_t> visited;
229
- int visno;
230
-
231
- explicit VisitedTable(int size)
232
- : visited(size), visno(1) {}
233
-
234
- /// set flog #no to true
235
- void set(int no) {
236
- visited[no] = visno;
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
- struct HNSWStats {
257
- size_t n1, n2, n3;
258
- size_t ndis;
259
- size_t nreorder;
260
-
261
- HNSWStats(size_t n1 = 0, size_t n2 = 0, size_t n3 = 0, size_t ndis = 0, size_t nreorder = 0)
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