faiss 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/LICENSE.txt +1 -1
- data/README.md +1 -1
- data/ext/faiss/extconf.rb +9 -2
- data/ext/faiss/index.cpp +1 -1
- data/ext/faiss/index_binary.cpp +2 -2
- data/ext/faiss/product_quantizer.cpp +1 -1
- data/lib/faiss/version.rb +1 -1
- data/vendor/faiss/faiss/AutoTune.cpp +7 -7
- data/vendor/faiss/faiss/AutoTune.h +0 -1
- data/vendor/faiss/faiss/Clustering.cpp +4 -18
- data/vendor/faiss/faiss/Clustering.h +31 -21
- data/vendor/faiss/faiss/IVFlib.cpp +22 -11
- data/vendor/faiss/faiss/Index.cpp +1 -1
- data/vendor/faiss/faiss/Index.h +20 -5
- data/vendor/faiss/faiss/Index2Layer.cpp +7 -7
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +176 -166
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +15 -15
- data/vendor/faiss/faiss/IndexBinary.cpp +9 -4
- data/vendor/faiss/faiss/IndexBinary.h +8 -19
- data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +2 -1
- data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +24 -31
- data/vendor/faiss/faiss/IndexBinaryHash.cpp +25 -50
- data/vendor/faiss/faiss/IndexBinaryIVF.cpp +106 -187
- data/vendor/faiss/faiss/IndexFastScan.cpp +90 -159
- data/vendor/faiss/faiss/IndexFastScan.h +9 -8
- data/vendor/faiss/faiss/IndexFlat.cpp +195 -3
- data/vendor/faiss/faiss/IndexFlat.h +20 -1
- data/vendor/faiss/faiss/IndexFlatCodes.cpp +11 -0
- data/vendor/faiss/faiss/IndexFlatCodes.h +3 -1
- data/vendor/faiss/faiss/IndexHNSW.cpp +112 -316
- data/vendor/faiss/faiss/IndexHNSW.h +12 -48
- data/vendor/faiss/faiss/IndexIDMap.cpp +69 -28
- data/vendor/faiss/faiss/IndexIDMap.h +24 -2
- data/vendor/faiss/faiss/IndexIVF.cpp +159 -53
- data/vendor/faiss/faiss/IndexIVF.h +37 -5
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +18 -26
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.h +3 -2
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +19 -46
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +4 -3
- data/vendor/faiss/faiss/IndexIVFFastScan.cpp +433 -405
- data/vendor/faiss/faiss/IndexIVFFastScan.h +56 -26
- data/vendor/faiss/faiss/IndexIVFFlat.cpp +15 -5
- data/vendor/faiss/faiss/IndexIVFFlat.h +3 -2
- data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +172 -0
- data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.h +56 -0
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +78 -122
- data/vendor/faiss/faiss/IndexIVFPQ.h +6 -7
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +18 -50
- data/vendor/faiss/faiss/IndexIVFPQFastScan.h +4 -3
- data/vendor/faiss/faiss/IndexIVFPQR.cpp +45 -29
- data/vendor/faiss/faiss/IndexIVFPQR.h +5 -2
- data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +25 -27
- data/vendor/faiss/faiss/IndexIVFSpectralHash.h +6 -6
- data/vendor/faiss/faiss/IndexLSH.cpp +14 -16
- data/vendor/faiss/faiss/IndexNNDescent.cpp +3 -4
- data/vendor/faiss/faiss/IndexNSG.cpp +11 -27
- data/vendor/faiss/faiss/IndexNSG.h +10 -10
- data/vendor/faiss/faiss/IndexPQ.cpp +72 -88
- data/vendor/faiss/faiss/IndexPQ.h +1 -4
- data/vendor/faiss/faiss/IndexPQFastScan.cpp +1 -1
- data/vendor/faiss/faiss/IndexPreTransform.cpp +25 -31
- data/vendor/faiss/faiss/IndexRefine.cpp +49 -19
- data/vendor/faiss/faiss/IndexRefine.h +7 -0
- data/vendor/faiss/faiss/IndexReplicas.cpp +23 -26
- data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +22 -16
- data/vendor/faiss/faiss/IndexScalarQuantizer.h +6 -4
- data/vendor/faiss/faiss/IndexShards.cpp +21 -29
- data/vendor/faiss/faiss/IndexShardsIVF.cpp +1 -2
- data/vendor/faiss/faiss/MatrixStats.cpp +17 -32
- data/vendor/faiss/faiss/MatrixStats.h +21 -9
- data/vendor/faiss/faiss/MetaIndexes.cpp +35 -35
- data/vendor/faiss/faiss/VectorTransform.cpp +13 -26
- data/vendor/faiss/faiss/VectorTransform.h +7 -7
- data/vendor/faiss/faiss/clone_index.cpp +15 -10
- data/vendor/faiss/faiss/clone_index.h +3 -0
- data/vendor/faiss/faiss/gpu/GpuCloner.cpp +87 -4
- data/vendor/faiss/faiss/gpu/GpuCloner.h +22 -0
- data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +7 -0
- data/vendor/faiss/faiss/gpu/GpuDistance.h +46 -38
- data/vendor/faiss/faiss/gpu/GpuIndex.h +28 -4
- data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +4 -4
- data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +8 -9
- data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +18 -3
- data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +22 -11
- data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +1 -3
- data/vendor/faiss/faiss/gpu/GpuResources.cpp +24 -3
- data/vendor/faiss/faiss/gpu/GpuResources.h +39 -11
- data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +117 -17
- data/vendor/faiss/faiss/gpu/StandardGpuResources.h +57 -3
- data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +1 -1
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +25 -0
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +129 -9
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +267 -40
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +299 -208
- data/vendor/faiss/faiss/gpu/test/TestGpuMemoryException.cpp +1 -0
- data/vendor/faiss/faiss/gpu/utils/RaftUtils.h +75 -0
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +3 -1
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +5 -5
- data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +1 -1
- data/vendor/faiss/faiss/impl/AuxIndexStructures.h +1 -2
- data/vendor/faiss/faiss/impl/DistanceComputer.h +24 -1
- data/vendor/faiss/faiss/impl/FaissException.h +13 -34
- data/vendor/faiss/faiss/impl/HNSW.cpp +321 -70
- data/vendor/faiss/faiss/impl/HNSW.h +9 -8
- data/vendor/faiss/faiss/impl/IDSelector.h +4 -4
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +3 -1
- data/vendor/faiss/faiss/impl/NNDescent.cpp +29 -19
- data/vendor/faiss/faiss/impl/NSG.h +1 -1
- data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +14 -12
- data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.h +1 -1
- data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +24 -22
- data/vendor/faiss/faiss/impl/ProductQuantizer.h +1 -1
- data/vendor/faiss/faiss/impl/Quantizer.h +1 -1
- data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +27 -1015
- data/vendor/faiss/faiss/impl/ResidualQuantizer.h +5 -63
- data/vendor/faiss/faiss/impl/ResultHandler.h +232 -176
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +444 -104
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +0 -8
- data/vendor/faiss/faiss/impl/code_distance/code_distance-avx2.h +280 -42
- data/vendor/faiss/faiss/impl/code_distance/code_distance-generic.h +21 -14
- data/vendor/faiss/faiss/impl/code_distance/code_distance.h +22 -12
- data/vendor/faiss/faiss/impl/index_read.cpp +45 -19
- data/vendor/faiss/faiss/impl/index_write.cpp +60 -41
- data/vendor/faiss/faiss/impl/io.cpp +10 -10
- data/vendor/faiss/faiss/impl/lattice_Zn.cpp +1 -1
- data/vendor/faiss/faiss/impl/platform_macros.h +18 -1
- data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +3 -0
- data/vendor/faiss/faiss/impl/pq4_fast_scan.h +7 -6
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +52 -38
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +40 -49
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +960 -0
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +176 -0
- data/vendor/faiss/faiss/impl/simd_result_handlers.h +374 -202
- data/vendor/faiss/faiss/index_factory.cpp +10 -7
- data/vendor/faiss/faiss/invlists/DirectMap.cpp +1 -1
- data/vendor/faiss/faiss/invlists/InvertedLists.cpp +27 -9
- data/vendor/faiss/faiss/invlists/InvertedLists.h +12 -3
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +3 -3
- data/vendor/faiss/faiss/python/python_callbacks.cpp +1 -1
- data/vendor/faiss/faiss/utils/Heap.cpp +3 -1
- data/vendor/faiss/faiss/utils/WorkerThread.h +1 -0
- data/vendor/faiss/faiss/utils/distances.cpp +128 -74
- data/vendor/faiss/faiss/utils/distances.h +81 -4
- data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +5 -5
- data/vendor/faiss/faiss/utils/distances_fused/avx512.h +2 -2
- data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +2 -2
- data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +1 -1
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +5 -5
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.h +1 -1
- data/vendor/faiss/faiss/utils/distances_simd.cpp +428 -70
- data/vendor/faiss/faiss/utils/fp16-arm.h +29 -0
- data/vendor/faiss/faiss/utils/fp16.h +2 -0
- data/vendor/faiss/faiss/utils/hamming.cpp +162 -110
- data/vendor/faiss/faiss/utils/hamming.h +58 -0
- data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +16 -89
- data/vendor/faiss/faiss/utils/hamming_distance/common.h +1 -0
- data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +15 -87
- data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +57 -0
- data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +14 -104
- data/vendor/faiss/faiss/utils/partitioning.cpp +3 -4
- data/vendor/faiss/faiss/utils/prefetch.h +77 -0
- data/vendor/faiss/faiss/utils/quantize_lut.cpp +0 -14
- data/vendor/faiss/faiss/utils/simdlib_avx2.h +0 -6
- data/vendor/faiss/faiss/utils/simdlib_neon.h +72 -77
- data/vendor/faiss/faiss/utils/sorting.cpp +140 -5
- data/vendor/faiss/faiss/utils/sorting.h +27 -0
- data/vendor/faiss/faiss/utils/utils.cpp +112 -6
- data/vendor/faiss/faiss/utils/utils.h +57 -20
- metadata +10 -3
|
@@ -17,7 +17,9 @@
|
|
|
17
17
|
#define FAISS_utils_h
|
|
18
18
|
|
|
19
19
|
#include <stdint.h>
|
|
20
|
+
#include <set>
|
|
20
21
|
#include <string>
|
|
22
|
+
#include <vector>
|
|
21
23
|
|
|
22
24
|
#include <faiss/impl/platform_macros.h>
|
|
23
25
|
#include <faiss/utils/Heap.h>
|
|
@@ -47,25 +49,6 @@ uint64_t get_cycles();
|
|
|
47
49
|
* Misc matrix and vector manipulation functions
|
|
48
50
|
***************************************************************************/
|
|
49
51
|
|
|
50
|
-
/** compute c := a + bf * b for a, b and c tables
|
|
51
|
-
*
|
|
52
|
-
* @param n size of the tables
|
|
53
|
-
* @param a size n
|
|
54
|
-
* @param b size n
|
|
55
|
-
* @param c restult table, size n
|
|
56
|
-
*/
|
|
57
|
-
void fvec_madd(size_t n, const float* a, float bf, const float* b, float* c);
|
|
58
|
-
|
|
59
|
-
/** same as fvec_madd, also return index of the min of the result table
|
|
60
|
-
* @return index of the min of table c
|
|
61
|
-
*/
|
|
62
|
-
int fvec_madd_and_argmin(
|
|
63
|
-
size_t n,
|
|
64
|
-
const float* a,
|
|
65
|
-
float bf,
|
|
66
|
-
const float* b,
|
|
67
|
-
float* c);
|
|
68
|
-
|
|
69
52
|
/* perform a reflection (not an efficient implementation, just for test ) */
|
|
70
53
|
void reflection(const float* u, float* x, size_t n, size_t d, size_t nu);
|
|
71
54
|
|
|
@@ -121,7 +104,19 @@ int ivec_hist(size_t n, const int* v, int vmax, int* hist);
|
|
|
121
104
|
void bincode_hist(size_t n, size_t nbits, const uint8_t* codes, int* hist);
|
|
122
105
|
|
|
123
106
|
/// compute a checksum on a table.
|
|
124
|
-
|
|
107
|
+
uint64_t ivec_checksum(size_t n, const int32_t* a);
|
|
108
|
+
|
|
109
|
+
/// compute a checksum on a table.
|
|
110
|
+
uint64_t bvec_checksum(size_t n, const uint8_t* a);
|
|
111
|
+
|
|
112
|
+
/** compute checksums for the rows of a matrix
|
|
113
|
+
*
|
|
114
|
+
* @param n number of rows
|
|
115
|
+
* @param d size per row
|
|
116
|
+
* @param a matrix to handle, size n * d
|
|
117
|
+
* @param cs output checksums, size n
|
|
118
|
+
*/
|
|
119
|
+
void bvecs_checksum(size_t n, size_t d, const uint8_t* a, uint64_t* cs);
|
|
125
120
|
|
|
126
121
|
/** random subsamples a set of vectors if there are too many of them
|
|
127
122
|
*
|
|
@@ -163,6 +158,48 @@ uint64_t hash_bytes(const uint8_t* bytes, int64_t n);
|
|
|
163
158
|
/** Whether OpenMP annotations were respected. */
|
|
164
159
|
bool check_openmp();
|
|
165
160
|
|
|
161
|
+
/** This class is used to combine range and knn search results
|
|
162
|
+
* in contrib.exhaustive_search.range_search_gpu */
|
|
163
|
+
|
|
164
|
+
template <typename T>
|
|
165
|
+
struct CombinerRangeKNN {
|
|
166
|
+
int64_t nq; /// nb of queries
|
|
167
|
+
size_t k; /// number of neighbors for the knn search part
|
|
168
|
+
T r2; /// range search radius
|
|
169
|
+
bool keep_max; /// whether to keep max values instead of min.
|
|
170
|
+
|
|
171
|
+
CombinerRangeKNN(int64_t nq, size_t k, T r2, bool keep_max)
|
|
172
|
+
: nq(nq), k(k), r2(r2), keep_max(keep_max) {}
|
|
173
|
+
|
|
174
|
+
/// Knn search results
|
|
175
|
+
const int64_t* I = nullptr; /// size nq * k
|
|
176
|
+
const T* D = nullptr; /// size nq * k
|
|
177
|
+
|
|
178
|
+
/// optional: range search results (ignored if mask is NULL)
|
|
179
|
+
const bool* mask =
|
|
180
|
+
nullptr; /// mask for where knn results are valid, size nq
|
|
181
|
+
// range search results for remaining entries nrange = sum(mask)
|
|
182
|
+
const int64_t* lim_remain = nullptr; /// size nrange + 1
|
|
183
|
+
const T* D_remain = nullptr; /// size lim_remain[nrange]
|
|
184
|
+
const int64_t* I_remain = nullptr; /// size lim_remain[nrange]
|
|
185
|
+
|
|
186
|
+
const int64_t* L_res = nullptr; /// size nq + 1
|
|
187
|
+
// Phase 1: compute sizes into limits array (of size nq + 1)
|
|
188
|
+
void compute_sizes(int64_t* L_res);
|
|
189
|
+
|
|
190
|
+
/// Phase 2: caller allocates D_res and I_res (size L_res[nq])
|
|
191
|
+
/// Phase 3: fill in D_res and I_res
|
|
192
|
+
void write_result(T* D_res, int64_t* I_res);
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
struct CodeSet {
|
|
196
|
+
size_t d;
|
|
197
|
+
std::set<std::vector<uint8_t>> s;
|
|
198
|
+
|
|
199
|
+
explicit CodeSet(size_t d) : d(d) {}
|
|
200
|
+
void insert(size_t n, const uint8_t* codes, bool* inserted);
|
|
201
|
+
};
|
|
202
|
+
|
|
166
203
|
} // namespace faiss
|
|
167
204
|
|
|
168
205
|
#endif /* FAISS_utils_h */
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: faiss
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.3.
|
|
4
|
+
version: 0.3.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Andrew Kane
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2024-03-14 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rice
|
|
@@ -107,6 +107,8 @@ files:
|
|
|
107
107
|
- vendor/faiss/faiss/IndexIVFFastScan.h
|
|
108
108
|
- vendor/faiss/faiss/IndexIVFFlat.cpp
|
|
109
109
|
- vendor/faiss/faiss/IndexIVFFlat.h
|
|
110
|
+
- vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp
|
|
111
|
+
- vendor/faiss/faiss/IndexIVFIndependentQuantizer.h
|
|
110
112
|
- vendor/faiss/faiss/IndexIVFPQ.cpp
|
|
111
113
|
- vendor/faiss/faiss/IndexIVFPQ.h
|
|
112
114
|
- vendor/faiss/faiss/IndexIVFPQFastScan.cpp
|
|
@@ -202,6 +204,7 @@ files:
|
|
|
202
204
|
- vendor/faiss/faiss/gpu/test/TestUtils.h
|
|
203
205
|
- vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp
|
|
204
206
|
- vendor/faiss/faiss/gpu/utils/DeviceUtils.h
|
|
207
|
+
- vendor/faiss/faiss/gpu/utils/RaftUtils.h
|
|
205
208
|
- vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp
|
|
206
209
|
- vendor/faiss/faiss/gpu/utils/StackDeviceMemory.h
|
|
207
210
|
- vendor/faiss/faiss/gpu/utils/StaticUtils.h
|
|
@@ -261,6 +264,8 @@ files:
|
|
|
261
264
|
- vendor/faiss/faiss/impl/pq4_fast_scan.h
|
|
262
265
|
- vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp
|
|
263
266
|
- vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp
|
|
267
|
+
- vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp
|
|
268
|
+
- vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h
|
|
264
269
|
- vendor/faiss/faiss/impl/simd_result_handlers.h
|
|
265
270
|
- vendor/faiss/faiss/index_factory.cpp
|
|
266
271
|
- vendor/faiss/faiss/index_factory.h
|
|
@@ -299,6 +304,7 @@ files:
|
|
|
299
304
|
- vendor/faiss/faiss/utils/extra_distances-inl.h
|
|
300
305
|
- vendor/faiss/faiss/utils/extra_distances.cpp
|
|
301
306
|
- vendor/faiss/faiss/utils/extra_distances.h
|
|
307
|
+
- vendor/faiss/faiss/utils/fp16-arm.h
|
|
302
308
|
- vendor/faiss/faiss/utils/fp16-fp16c.h
|
|
303
309
|
- vendor/faiss/faiss/utils/fp16-inl.h
|
|
304
310
|
- vendor/faiss/faiss/utils/fp16.h
|
|
@@ -313,6 +319,7 @@ files:
|
|
|
313
319
|
- vendor/faiss/faiss/utils/ordered_key_value.h
|
|
314
320
|
- vendor/faiss/faiss/utils/partitioning.cpp
|
|
315
321
|
- vendor/faiss/faiss/utils/partitioning.h
|
|
322
|
+
- vendor/faiss/faiss/utils/prefetch.h
|
|
316
323
|
- vendor/faiss/faiss/utils/quantize_lut.cpp
|
|
317
324
|
- vendor/faiss/faiss/utils/quantize_lut.h
|
|
318
325
|
- vendor/faiss/faiss/utils/random.cpp
|
|
@@ -345,7 +352,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
345
352
|
- !ruby/object:Gem::Version
|
|
346
353
|
version: '0'
|
|
347
354
|
requirements: []
|
|
348
|
-
rubygems_version: 3.
|
|
355
|
+
rubygems_version: 3.5.3
|
|
349
356
|
signing_key:
|
|
350
357
|
specification_version: 4
|
|
351
358
|
summary: Efficient similarity search and clustering for Ruby
|