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.
Files changed (215) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +7 -7
  5. data/ext/faiss/extconf.rb +6 -3
  6. data/ext/faiss/numo.hpp +4 -4
  7. data/ext/faiss/utils.cpp +1 -1
  8. data/ext/faiss/utils.h +1 -1
  9. data/lib/faiss/version.rb +1 -1
  10. data/vendor/faiss/faiss/AutoTune.cpp +292 -291
  11. data/vendor/faiss/faiss/AutoTune.h +55 -56
  12. data/vendor/faiss/faiss/Clustering.cpp +365 -194
  13. data/vendor/faiss/faiss/Clustering.h +102 -35
  14. data/vendor/faiss/faiss/IVFlib.cpp +171 -195
  15. data/vendor/faiss/faiss/IVFlib.h +48 -51
  16. data/vendor/faiss/faiss/Index.cpp +85 -103
  17. data/vendor/faiss/faiss/Index.h +54 -48
  18. data/vendor/faiss/faiss/Index2Layer.cpp +126 -224
  19. data/vendor/faiss/faiss/Index2Layer.h +22 -36
  20. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +407 -0
  21. data/vendor/faiss/faiss/IndexAdditiveQuantizer.h +195 -0
  22. data/vendor/faiss/faiss/IndexBinary.cpp +45 -37
  23. data/vendor/faiss/faiss/IndexBinary.h +140 -132
  24. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +73 -53
  25. data/vendor/faiss/faiss/IndexBinaryFlat.h +29 -24
  26. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +46 -43
  27. data/vendor/faiss/faiss/IndexBinaryFromFloat.h +16 -15
  28. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +215 -232
  29. data/vendor/faiss/faiss/IndexBinaryHNSW.h +25 -24
  30. data/vendor/faiss/faiss/IndexBinaryHash.cpp +182 -177
  31. data/vendor/faiss/faiss/IndexBinaryHash.h +41 -34
  32. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +489 -461
  33. data/vendor/faiss/faiss/IndexBinaryIVF.h +97 -68
  34. data/vendor/faiss/faiss/IndexFlat.cpp +115 -176
  35. data/vendor/faiss/faiss/IndexFlat.h +42 -59
  36. data/vendor/faiss/faiss/IndexFlatCodes.cpp +67 -0
  37. data/vendor/faiss/faiss/IndexFlatCodes.h +47 -0
  38. data/vendor/faiss/faiss/IndexHNSW.cpp +372 -348
  39. data/vendor/faiss/faiss/IndexHNSW.h +57 -41
  40. data/vendor/faiss/faiss/IndexIVF.cpp +545 -453
  41. data/vendor/faiss/faiss/IndexIVF.h +169 -118
  42. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +316 -0
  43. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.h +121 -0
  44. data/vendor/faiss/faiss/IndexIVFFlat.cpp +247 -252
  45. data/vendor/faiss/faiss/IndexIVFFlat.h +48 -51
  46. data/vendor/faiss/faiss/IndexIVFPQ.cpp +459 -517
  47. data/vendor/faiss/faiss/IndexIVFPQ.h +75 -67
  48. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +406 -372
  49. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +82 -57
  50. data/vendor/faiss/faiss/IndexIVFPQR.cpp +104 -102
  51. data/vendor/faiss/faiss/IndexIVFPQR.h +33 -28
  52. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +163 -150
  53. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +38 -25
  54. data/vendor/faiss/faiss/IndexLSH.cpp +66 -113
  55. data/vendor/faiss/faiss/IndexLSH.h +20 -38
  56. data/vendor/faiss/faiss/IndexLattice.cpp +42 -56
  57. data/vendor/faiss/faiss/IndexLattice.h +11 -16
  58. data/vendor/faiss/faiss/IndexNNDescent.cpp +229 -0
  59. data/vendor/faiss/faiss/IndexNNDescent.h +72 -0
  60. data/vendor/faiss/faiss/IndexNSG.cpp +301 -0
  61. data/vendor/faiss/faiss/IndexNSG.h +85 -0
  62. data/vendor/faiss/faiss/IndexPQ.cpp +387 -495
  63. data/vendor/faiss/faiss/IndexPQ.h +64 -82
  64. data/vendor/faiss/faiss/IndexPQFastScan.cpp +143 -170
  65. data/vendor/faiss/faiss/IndexPQFastScan.h +46 -32
  66. data/vendor/faiss/faiss/IndexPreTransform.cpp +120 -150
  67. data/vendor/faiss/faiss/IndexPreTransform.h +33 -36
  68. data/vendor/faiss/faiss/IndexRefine.cpp +139 -127
  69. data/vendor/faiss/faiss/IndexRefine.h +32 -23
  70. data/vendor/faiss/faiss/IndexReplicas.cpp +147 -153
  71. data/vendor/faiss/faiss/IndexReplicas.h +62 -56
  72. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +111 -172
  73. data/vendor/faiss/faiss/IndexScalarQuantizer.h +41 -59
  74. data/vendor/faiss/faiss/IndexShards.cpp +256 -240
  75. data/vendor/faiss/faiss/IndexShards.h +85 -73
  76. data/vendor/faiss/faiss/MatrixStats.cpp +112 -97
  77. data/vendor/faiss/faiss/MatrixStats.h +7 -10
  78. data/vendor/faiss/faiss/MetaIndexes.cpp +135 -157
  79. data/vendor/faiss/faiss/MetaIndexes.h +40 -34
  80. data/vendor/faiss/faiss/MetricType.h +7 -7
  81. data/vendor/faiss/faiss/VectorTransform.cpp +654 -475
  82. data/vendor/faiss/faiss/VectorTransform.h +64 -89
  83. data/vendor/faiss/faiss/clone_index.cpp +78 -73
  84. data/vendor/faiss/faiss/clone_index.h +4 -9
  85. data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +33 -38
  86. data/vendor/faiss/faiss/gpu/GpuAutoTune.h +11 -9
  87. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +198 -171
  88. data/vendor/faiss/faiss/gpu/GpuCloner.h +53 -35
  89. data/vendor/faiss/faiss/gpu/GpuClonerOptions.cpp +12 -14
  90. data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +27 -25
  91. data/vendor/faiss/faiss/gpu/GpuDistance.h +116 -112
  92. data/vendor/faiss/faiss/gpu/GpuFaissAssert.h +1 -2
  93. data/vendor/faiss/faiss/gpu/GpuIcmEncoder.h +60 -0
  94. data/vendor/faiss/faiss/gpu/GpuIndex.h +134 -137
  95. data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +76 -73
  96. data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +173 -162
  97. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +67 -64
  98. data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +89 -86
  99. data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +150 -141
  100. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +101 -103
  101. data/vendor/faiss/faiss/gpu/GpuIndicesOptions.h +17 -16
  102. data/vendor/faiss/faiss/gpu/GpuResources.cpp +116 -128
  103. data/vendor/faiss/faiss/gpu/GpuResources.h +182 -186
  104. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +433 -422
  105. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +131 -130
  106. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.cpp +468 -456
  107. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.h +25 -19
  108. data/vendor/faiss/faiss/gpu/impl/RemapIndices.cpp +22 -20
  109. data/vendor/faiss/faiss/gpu/impl/RemapIndices.h +9 -8
  110. data/vendor/faiss/faiss/gpu/perf/IndexWrapper-inl.h +39 -44
  111. data/vendor/faiss/faiss/gpu/perf/IndexWrapper.h +16 -14
  112. data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +77 -71
  113. data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +109 -88
  114. data/vendor/faiss/faiss/gpu/perf/WriteIndex.cpp +75 -64
  115. data/vendor/faiss/faiss/gpu/test/TestCodePacking.cpp +230 -215
  116. data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +80 -86
  117. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +284 -277
  118. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +416 -416
  119. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +611 -517
  120. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +166 -164
  121. data/vendor/faiss/faiss/gpu/test/TestGpuMemoryException.cpp +61 -53
  122. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +274 -238
  123. data/vendor/faiss/faiss/gpu/test/TestUtils.h +73 -57
  124. data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +47 -50
  125. data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +79 -72
  126. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +140 -146
  127. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.h +69 -71
  128. data/vendor/faiss/faiss/gpu/utils/StaticUtils.h +21 -16
  129. data/vendor/faiss/faiss/gpu/utils/Timer.cpp +25 -29
  130. data/vendor/faiss/faiss/gpu/utils/Timer.h +30 -29
  131. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +503 -0
  132. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +175 -0
  133. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +90 -120
  134. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +81 -65
  135. data/vendor/faiss/faiss/impl/FaissAssert.h +73 -58
  136. data/vendor/faiss/faiss/impl/FaissException.cpp +56 -48
  137. data/vendor/faiss/faiss/impl/FaissException.h +41 -29
  138. data/vendor/faiss/faiss/impl/HNSW.cpp +606 -617
  139. data/vendor/faiss/faiss/impl/HNSW.h +179 -200
  140. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +855 -0
  141. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +244 -0
  142. data/vendor/faiss/faiss/impl/NNDescent.cpp +487 -0
  143. data/vendor/faiss/faiss/impl/NNDescent.h +154 -0
  144. data/vendor/faiss/faiss/impl/NSG.cpp +679 -0
  145. data/vendor/faiss/faiss/impl/NSG.h +199 -0
  146. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +484 -454
  147. data/vendor/faiss/faiss/impl/PolysemousTraining.h +52 -55
  148. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +26 -47
  149. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +469 -459
  150. data/vendor/faiss/faiss/impl/ProductQuantizer.h +76 -87
  151. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +758 -0
  152. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +188 -0
  153. data/vendor/faiss/faiss/impl/ResultHandler.h +96 -132
  154. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +647 -707
  155. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +48 -46
  156. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +129 -131
  157. data/vendor/faiss/faiss/impl/ThreadedIndex.h +61 -55
  158. data/vendor/faiss/faiss/impl/index_read.cpp +631 -480
  159. data/vendor/faiss/faiss/impl/index_write.cpp +547 -407
  160. data/vendor/faiss/faiss/impl/io.cpp +76 -95
  161. data/vendor/faiss/faiss/impl/io.h +31 -41
  162. data/vendor/faiss/faiss/impl/io_macros.h +60 -29
  163. data/vendor/faiss/faiss/impl/kmeans1d.cpp +301 -0
  164. data/vendor/faiss/faiss/impl/kmeans1d.h +48 -0
  165. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +137 -186
  166. data/vendor/faiss/faiss/impl/lattice_Zn.h +40 -51
  167. data/vendor/faiss/faiss/impl/platform_macros.h +29 -8
  168. data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +77 -124
  169. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +39 -48
  170. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +41 -52
  171. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +80 -117
  172. data/vendor/faiss/faiss/impl/simd_result_handlers.h +109 -137
  173. data/vendor/faiss/faiss/index_factory.cpp +619 -397
  174. data/vendor/faiss/faiss/index_factory.h +8 -6
  175. data/vendor/faiss/faiss/index_io.h +23 -26
  176. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +67 -75
  177. data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +22 -24
  178. data/vendor/faiss/faiss/invlists/DirectMap.cpp +96 -112
  179. data/vendor/faiss/faiss/invlists/DirectMap.h +29 -33
  180. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +307 -364
  181. data/vendor/faiss/faiss/invlists/InvertedLists.h +151 -151
  182. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +29 -34
  183. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.h +17 -18
  184. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +257 -293
  185. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +50 -45
  186. data/vendor/faiss/faiss/python/python_callbacks.cpp +23 -26
  187. data/vendor/faiss/faiss/python/python_callbacks.h +9 -16
  188. data/vendor/faiss/faiss/utils/AlignedTable.h +79 -44
  189. data/vendor/faiss/faiss/utils/Heap.cpp +40 -48
  190. data/vendor/faiss/faiss/utils/Heap.h +186 -209
  191. data/vendor/faiss/faiss/utils/WorkerThread.cpp +67 -76
  192. data/vendor/faiss/faiss/utils/WorkerThread.h +32 -33
  193. data/vendor/faiss/faiss/utils/distances.cpp +305 -312
  194. data/vendor/faiss/faiss/utils/distances.h +170 -122
  195. data/vendor/faiss/faiss/utils/distances_simd.cpp +498 -508
  196. data/vendor/faiss/faiss/utils/extra_distances-inl.h +117 -0
  197. data/vendor/faiss/faiss/utils/extra_distances.cpp +113 -232
  198. data/vendor/faiss/faiss/utils/extra_distances.h +30 -29
  199. data/vendor/faiss/faiss/utils/hamming-inl.h +260 -209
  200. data/vendor/faiss/faiss/utils/hamming.cpp +375 -469
  201. data/vendor/faiss/faiss/utils/hamming.h +62 -85
  202. data/vendor/faiss/faiss/utils/ordered_key_value.h +16 -18
  203. data/vendor/faiss/faiss/utils/partitioning.cpp +393 -318
  204. data/vendor/faiss/faiss/utils/partitioning.h +26 -21
  205. data/vendor/faiss/faiss/utils/quantize_lut.cpp +78 -66
  206. data/vendor/faiss/faiss/utils/quantize_lut.h +22 -20
  207. data/vendor/faiss/faiss/utils/random.cpp +39 -63
  208. data/vendor/faiss/faiss/utils/random.h +13 -16
  209. data/vendor/faiss/faiss/utils/simdlib.h +4 -2
  210. data/vendor/faiss/faiss/utils/simdlib_avx2.h +88 -85
  211. data/vendor/faiss/faiss/utils/simdlib_emulated.h +226 -165
  212. data/vendor/faiss/faiss/utils/simdlib_neon.h +832 -0
  213. data/vendor/faiss/faiss/utils/utils.cpp +304 -287
  214. data/vendor/faiss/faiss/utils/utils.h +54 -49
  215. 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 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