faiss 0.1.0 → 0.1.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/README.md +103 -3
- data/ext/faiss/ext.cpp +99 -32
- data/ext/faiss/extconf.rb +12 -2
- data/lib/faiss/ext.bundle +0 -0
- data/lib/faiss/index.rb +3 -3
- data/lib/faiss/index_binary.rb +3 -3
- data/lib/faiss/kmeans.rb +1 -1
- data/lib/faiss/pca_matrix.rb +2 -2
- data/lib/faiss/product_quantizer.rb +3 -3
- data/lib/faiss/version.rb +1 -1
- data/vendor/faiss/AutoTune.cpp +719 -0
- data/vendor/faiss/AutoTune.h +212 -0
- data/vendor/faiss/Clustering.cpp +261 -0
- data/vendor/faiss/Clustering.h +101 -0
- data/vendor/faiss/IVFlib.cpp +339 -0
- data/vendor/faiss/IVFlib.h +132 -0
- data/vendor/faiss/Index.cpp +171 -0
- data/vendor/faiss/Index.h +261 -0
- data/vendor/faiss/Index2Layer.cpp +437 -0
- data/vendor/faiss/Index2Layer.h +85 -0
- data/vendor/faiss/IndexBinary.cpp +77 -0
- data/vendor/faiss/IndexBinary.h +163 -0
- data/vendor/faiss/IndexBinaryFlat.cpp +83 -0
- data/vendor/faiss/IndexBinaryFlat.h +54 -0
- data/vendor/faiss/IndexBinaryFromFloat.cpp +78 -0
- data/vendor/faiss/IndexBinaryFromFloat.h +52 -0
- data/vendor/faiss/IndexBinaryHNSW.cpp +325 -0
- data/vendor/faiss/IndexBinaryHNSW.h +56 -0
- data/vendor/faiss/IndexBinaryIVF.cpp +671 -0
- data/vendor/faiss/IndexBinaryIVF.h +211 -0
- data/vendor/faiss/IndexFlat.cpp +508 -0
- data/vendor/faiss/IndexFlat.h +175 -0
- data/vendor/faiss/IndexHNSW.cpp +1090 -0
- data/vendor/faiss/IndexHNSW.h +170 -0
- data/vendor/faiss/IndexIVF.cpp +909 -0
- data/vendor/faiss/IndexIVF.h +353 -0
- data/vendor/faiss/IndexIVFFlat.cpp +502 -0
- data/vendor/faiss/IndexIVFFlat.h +118 -0
- data/vendor/faiss/IndexIVFPQ.cpp +1207 -0
- data/vendor/faiss/IndexIVFPQ.h +161 -0
- data/vendor/faiss/IndexIVFPQR.cpp +219 -0
- data/vendor/faiss/IndexIVFPQR.h +65 -0
- data/vendor/faiss/IndexIVFSpectralHash.cpp +331 -0
- data/vendor/faiss/IndexIVFSpectralHash.h +75 -0
- data/vendor/faiss/IndexLSH.cpp +225 -0
- data/vendor/faiss/IndexLSH.h +87 -0
- data/vendor/faiss/IndexLattice.cpp +143 -0
- data/vendor/faiss/IndexLattice.h +68 -0
- data/vendor/faiss/IndexPQ.cpp +1188 -0
- data/vendor/faiss/IndexPQ.h +199 -0
- data/vendor/faiss/IndexPreTransform.cpp +288 -0
- data/vendor/faiss/IndexPreTransform.h +91 -0
- data/vendor/faiss/IndexReplicas.cpp +123 -0
- data/vendor/faiss/IndexReplicas.h +76 -0
- data/vendor/faiss/IndexScalarQuantizer.cpp +317 -0
- data/vendor/faiss/IndexScalarQuantizer.h +127 -0
- data/vendor/faiss/IndexShards.cpp +317 -0
- data/vendor/faiss/IndexShards.h +100 -0
- data/vendor/faiss/InvertedLists.cpp +623 -0
- data/vendor/faiss/InvertedLists.h +334 -0
- data/vendor/faiss/LICENSE +21 -0
- data/vendor/faiss/MatrixStats.cpp +252 -0
- data/vendor/faiss/MatrixStats.h +62 -0
- data/vendor/faiss/MetaIndexes.cpp +351 -0
- data/vendor/faiss/MetaIndexes.h +126 -0
- data/vendor/faiss/OnDiskInvertedLists.cpp +674 -0
- data/vendor/faiss/OnDiskInvertedLists.h +127 -0
- data/vendor/faiss/VectorTransform.cpp +1157 -0
- data/vendor/faiss/VectorTransform.h +322 -0
- data/vendor/faiss/c_api/AutoTune_c.cpp +83 -0
- data/vendor/faiss/c_api/AutoTune_c.h +64 -0
- data/vendor/faiss/c_api/Clustering_c.cpp +139 -0
- data/vendor/faiss/c_api/Clustering_c.h +117 -0
- data/vendor/faiss/c_api/IndexFlat_c.cpp +140 -0
- data/vendor/faiss/c_api/IndexFlat_c.h +115 -0
- data/vendor/faiss/c_api/IndexIVFFlat_c.cpp +64 -0
- data/vendor/faiss/c_api/IndexIVFFlat_c.h +58 -0
- data/vendor/faiss/c_api/IndexIVF_c.cpp +92 -0
- data/vendor/faiss/c_api/IndexIVF_c.h +135 -0
- data/vendor/faiss/c_api/IndexLSH_c.cpp +37 -0
- data/vendor/faiss/c_api/IndexLSH_c.h +40 -0
- data/vendor/faiss/c_api/IndexShards_c.cpp +44 -0
- data/vendor/faiss/c_api/IndexShards_c.h +42 -0
- data/vendor/faiss/c_api/Index_c.cpp +105 -0
- data/vendor/faiss/c_api/Index_c.h +183 -0
- data/vendor/faiss/c_api/MetaIndexes_c.cpp +49 -0
- data/vendor/faiss/c_api/MetaIndexes_c.h +49 -0
- data/vendor/faiss/c_api/clone_index_c.cpp +23 -0
- data/vendor/faiss/c_api/clone_index_c.h +32 -0
- data/vendor/faiss/c_api/error_c.h +42 -0
- data/vendor/faiss/c_api/error_impl.cpp +27 -0
- data/vendor/faiss/c_api/error_impl.h +16 -0
- data/vendor/faiss/c_api/faiss_c.h +58 -0
- data/vendor/faiss/c_api/gpu/GpuAutoTune_c.cpp +96 -0
- data/vendor/faiss/c_api/gpu/GpuAutoTune_c.h +56 -0
- data/vendor/faiss/c_api/gpu/GpuClonerOptions_c.cpp +52 -0
- data/vendor/faiss/c_api/gpu/GpuClonerOptions_c.h +68 -0
- data/vendor/faiss/c_api/gpu/GpuIndex_c.cpp +17 -0
- data/vendor/faiss/c_api/gpu/GpuIndex_c.h +30 -0
- data/vendor/faiss/c_api/gpu/GpuIndicesOptions_c.h +38 -0
- data/vendor/faiss/c_api/gpu/GpuResources_c.cpp +86 -0
- data/vendor/faiss/c_api/gpu/GpuResources_c.h +66 -0
- data/vendor/faiss/c_api/gpu/StandardGpuResources_c.cpp +54 -0
- data/vendor/faiss/c_api/gpu/StandardGpuResources_c.h +53 -0
- data/vendor/faiss/c_api/gpu/macros_impl.h +42 -0
- data/vendor/faiss/c_api/impl/AuxIndexStructures_c.cpp +220 -0
- data/vendor/faiss/c_api/impl/AuxIndexStructures_c.h +149 -0
- data/vendor/faiss/c_api/index_factory_c.cpp +26 -0
- data/vendor/faiss/c_api/index_factory_c.h +30 -0
- data/vendor/faiss/c_api/index_io_c.cpp +42 -0
- data/vendor/faiss/c_api/index_io_c.h +50 -0
- data/vendor/faiss/c_api/macros_impl.h +110 -0
- data/vendor/faiss/clone_index.cpp +147 -0
- data/vendor/faiss/clone_index.h +38 -0
- data/vendor/faiss/demos/demo_imi_flat.cpp +151 -0
- data/vendor/faiss/demos/demo_imi_pq.cpp +199 -0
- data/vendor/faiss/demos/demo_ivfpq_indexing.cpp +146 -0
- data/vendor/faiss/demos/demo_sift1M.cpp +252 -0
- data/vendor/faiss/gpu/GpuAutoTune.cpp +95 -0
- data/vendor/faiss/gpu/GpuAutoTune.h +27 -0
- data/vendor/faiss/gpu/GpuCloner.cpp +403 -0
- data/vendor/faiss/gpu/GpuCloner.h +82 -0
- data/vendor/faiss/gpu/GpuClonerOptions.cpp +28 -0
- data/vendor/faiss/gpu/GpuClonerOptions.h +53 -0
- data/vendor/faiss/gpu/GpuDistance.h +52 -0
- data/vendor/faiss/gpu/GpuFaissAssert.h +29 -0
- data/vendor/faiss/gpu/GpuIndex.h +148 -0
- data/vendor/faiss/gpu/GpuIndexBinaryFlat.h +89 -0
- data/vendor/faiss/gpu/GpuIndexFlat.h +190 -0
- data/vendor/faiss/gpu/GpuIndexIVF.h +89 -0
- data/vendor/faiss/gpu/GpuIndexIVFFlat.h +85 -0
- data/vendor/faiss/gpu/GpuIndexIVFPQ.h +143 -0
- data/vendor/faiss/gpu/GpuIndexIVFScalarQuantizer.h +100 -0
- data/vendor/faiss/gpu/GpuIndicesOptions.h +30 -0
- data/vendor/faiss/gpu/GpuResources.cpp +52 -0
- data/vendor/faiss/gpu/GpuResources.h +73 -0
- data/vendor/faiss/gpu/StandardGpuResources.cpp +295 -0
- data/vendor/faiss/gpu/StandardGpuResources.h +114 -0
- data/vendor/faiss/gpu/impl/RemapIndices.cpp +43 -0
- data/vendor/faiss/gpu/impl/RemapIndices.h +24 -0
- data/vendor/faiss/gpu/perf/IndexWrapper-inl.h +71 -0
- data/vendor/faiss/gpu/perf/IndexWrapper.h +39 -0
- data/vendor/faiss/gpu/perf/PerfClustering.cpp +115 -0
- data/vendor/faiss/gpu/perf/PerfIVFPQAdd.cpp +139 -0
- data/vendor/faiss/gpu/perf/WriteIndex.cpp +102 -0
- data/vendor/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +130 -0
- data/vendor/faiss/gpu/test/TestGpuIndexFlat.cpp +371 -0
- data/vendor/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +550 -0
- data/vendor/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +450 -0
- data/vendor/faiss/gpu/test/TestGpuMemoryException.cpp +84 -0
- data/vendor/faiss/gpu/test/TestUtils.cpp +315 -0
- data/vendor/faiss/gpu/test/TestUtils.h +93 -0
- data/vendor/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +159 -0
- data/vendor/faiss/gpu/utils/DeviceMemory.cpp +77 -0
- data/vendor/faiss/gpu/utils/DeviceMemory.h +71 -0
- data/vendor/faiss/gpu/utils/DeviceUtils.h +185 -0
- data/vendor/faiss/gpu/utils/MemorySpace.cpp +89 -0
- data/vendor/faiss/gpu/utils/MemorySpace.h +44 -0
- data/vendor/faiss/gpu/utils/StackDeviceMemory.cpp +239 -0
- data/vendor/faiss/gpu/utils/StackDeviceMemory.h +129 -0
- data/vendor/faiss/gpu/utils/StaticUtils.h +83 -0
- data/vendor/faiss/gpu/utils/Timer.cpp +60 -0
- data/vendor/faiss/gpu/utils/Timer.h +52 -0
- data/vendor/faiss/impl/AuxIndexStructures.cpp +305 -0
- data/vendor/faiss/impl/AuxIndexStructures.h +246 -0
- data/vendor/faiss/impl/FaissAssert.h +95 -0
- data/vendor/faiss/impl/FaissException.cpp +66 -0
- data/vendor/faiss/impl/FaissException.h +71 -0
- data/vendor/faiss/impl/HNSW.cpp +818 -0
- data/vendor/faiss/impl/HNSW.h +275 -0
- data/vendor/faiss/impl/PolysemousTraining.cpp +953 -0
- data/vendor/faiss/impl/PolysemousTraining.h +158 -0
- data/vendor/faiss/impl/ProductQuantizer.cpp +876 -0
- data/vendor/faiss/impl/ProductQuantizer.h +242 -0
- data/vendor/faiss/impl/ScalarQuantizer.cpp +1628 -0
- data/vendor/faiss/impl/ScalarQuantizer.h +120 -0
- data/vendor/faiss/impl/ThreadedIndex-inl.h +192 -0
- data/vendor/faiss/impl/ThreadedIndex.h +80 -0
- data/vendor/faiss/impl/index_read.cpp +793 -0
- data/vendor/faiss/impl/index_write.cpp +558 -0
- data/vendor/faiss/impl/io.cpp +142 -0
- data/vendor/faiss/impl/io.h +98 -0
- data/vendor/faiss/impl/lattice_Zn.cpp +712 -0
- data/vendor/faiss/impl/lattice_Zn.h +199 -0
- data/vendor/faiss/index_factory.cpp +392 -0
- data/vendor/faiss/index_factory.h +25 -0
- data/vendor/faiss/index_io.h +75 -0
- data/vendor/faiss/misc/test_blas.cpp +84 -0
- data/vendor/faiss/tests/test_binary_flat.cpp +64 -0
- data/vendor/faiss/tests/test_dealloc_invlists.cpp +183 -0
- data/vendor/faiss/tests/test_ivfpq_codec.cpp +67 -0
- data/vendor/faiss/tests/test_ivfpq_indexing.cpp +98 -0
- data/vendor/faiss/tests/test_lowlevel_ivf.cpp +566 -0
- data/vendor/faiss/tests/test_merge.cpp +258 -0
- data/vendor/faiss/tests/test_omp_threads.cpp +14 -0
- data/vendor/faiss/tests/test_ondisk_ivf.cpp +220 -0
- data/vendor/faiss/tests/test_pairs_decoding.cpp +189 -0
- data/vendor/faiss/tests/test_params_override.cpp +231 -0
- data/vendor/faiss/tests/test_pq_encoding.cpp +98 -0
- data/vendor/faiss/tests/test_sliding_ivf.cpp +240 -0
- data/vendor/faiss/tests/test_threaded_index.cpp +253 -0
- data/vendor/faiss/tests/test_transfer_invlists.cpp +159 -0
- data/vendor/faiss/tutorial/cpp/1-Flat.cpp +98 -0
- data/vendor/faiss/tutorial/cpp/2-IVFFlat.cpp +81 -0
- data/vendor/faiss/tutorial/cpp/3-IVFPQ.cpp +93 -0
- data/vendor/faiss/tutorial/cpp/4-GPU.cpp +119 -0
- data/vendor/faiss/tutorial/cpp/5-Multiple-GPUs.cpp +99 -0
- data/vendor/faiss/utils/Heap.cpp +122 -0
- data/vendor/faiss/utils/Heap.h +495 -0
- data/vendor/faiss/utils/WorkerThread.cpp +126 -0
- data/vendor/faiss/utils/WorkerThread.h +61 -0
- data/vendor/faiss/utils/distances.cpp +765 -0
- data/vendor/faiss/utils/distances.h +243 -0
- data/vendor/faiss/utils/distances_simd.cpp +809 -0
- data/vendor/faiss/utils/extra_distances.cpp +336 -0
- data/vendor/faiss/utils/extra_distances.h +54 -0
- data/vendor/faiss/utils/hamming-inl.h +472 -0
- data/vendor/faiss/utils/hamming.cpp +792 -0
- data/vendor/faiss/utils/hamming.h +220 -0
- data/vendor/faiss/utils/random.cpp +192 -0
- data/vendor/faiss/utils/random.h +60 -0
- data/vendor/faiss/utils/utils.cpp +783 -0
- data/vendor/faiss/utils/utils.h +181 -0
- metadata +216 -2
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// -*- c++ -*-
|
|
9
|
+
|
|
10
|
+
#pragma once
|
|
11
|
+
|
|
12
|
+
#include <faiss/Index.h>
|
|
13
|
+
#include <faiss/IndexBinary.h>
|
|
14
|
+
|
|
15
|
+
namespace faiss {
|
|
16
|
+
|
|
17
|
+
/** Build and index with the sequence of processing steps described in
|
|
18
|
+
* the string. */
|
|
19
|
+
Index *index_factory (int d, const char *description,
|
|
20
|
+
MetricType metric = METRIC_L2);
|
|
21
|
+
|
|
22
|
+
IndexBinary *index_binary_factory (int d, const char *description);
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// -*- c++ -*-
|
|
9
|
+
|
|
10
|
+
// I/O code for indexes
|
|
11
|
+
|
|
12
|
+
#ifndef FAISS_INDEX_IO_H
|
|
13
|
+
#define FAISS_INDEX_IO_H
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
#include <cstdio>
|
|
17
|
+
|
|
18
|
+
/** I/O functions can read/write to a filename, a file handle or to an
|
|
19
|
+
* object that abstracts the medium.
|
|
20
|
+
*
|
|
21
|
+
* The read functions return objects that should be deallocated with
|
|
22
|
+
* delete. All references within these objectes are owned by the
|
|
23
|
+
* object.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
namespace faiss {
|
|
27
|
+
|
|
28
|
+
struct Index;
|
|
29
|
+
struct IndexBinary;
|
|
30
|
+
struct VectorTransform;
|
|
31
|
+
struct ProductQuantizer;
|
|
32
|
+
struct IOReader;
|
|
33
|
+
struct IOWriter;
|
|
34
|
+
struct InvertedLists;
|
|
35
|
+
|
|
36
|
+
void write_index (const Index *idx, const char *fname);
|
|
37
|
+
void write_index (const Index *idx, FILE *f);
|
|
38
|
+
void write_index (const Index *idx, IOWriter *writer);
|
|
39
|
+
|
|
40
|
+
void write_index_binary (const IndexBinary *idx, const char *fname);
|
|
41
|
+
void write_index_binary (const IndexBinary *idx, FILE *f);
|
|
42
|
+
void write_index_binary (const IndexBinary *idx, IOWriter *writer);
|
|
43
|
+
|
|
44
|
+
// The read_index flags are implemented only for a subset of index types.
|
|
45
|
+
const int IO_FLAG_MMAP = 1; // try to memmap if possible
|
|
46
|
+
const int IO_FLAG_READ_ONLY = 2;
|
|
47
|
+
// strip directory component from ondisk filename, and assume it's in
|
|
48
|
+
// the same directory as the index file
|
|
49
|
+
const int IO_FLAG_ONDISK_SAME_DIR = 4;
|
|
50
|
+
|
|
51
|
+
Index *read_index (const char *fname, int io_flags = 0);
|
|
52
|
+
Index *read_index (FILE * f, int io_flags = 0);
|
|
53
|
+
Index *read_index (IOReader *reader, int io_flags = 0);
|
|
54
|
+
|
|
55
|
+
IndexBinary *read_index_binary (const char *fname, int io_flags = 0);
|
|
56
|
+
IndexBinary *read_index_binary (FILE * f, int io_flags = 0);
|
|
57
|
+
IndexBinary *read_index_binary (IOReader *reader, int io_flags = 0);
|
|
58
|
+
|
|
59
|
+
void write_VectorTransform (const VectorTransform *vt, const char *fname);
|
|
60
|
+
VectorTransform *read_VectorTransform (const char *fname);
|
|
61
|
+
|
|
62
|
+
ProductQuantizer * read_ProductQuantizer (const char*fname);
|
|
63
|
+
ProductQuantizer * read_ProductQuantizer (IOReader *reader);
|
|
64
|
+
|
|
65
|
+
void write_ProductQuantizer (const ProductQuantizer*pq, const char *fname);
|
|
66
|
+
void write_ProductQuantizer (const ProductQuantizer*pq, IOWriter *f);
|
|
67
|
+
|
|
68
|
+
void write_InvertedLists (const InvertedLists *ils, IOWriter *f);
|
|
69
|
+
InvertedLists *read_InvertedLists (IOReader *reader, int io_flags = 0);
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
} // namespace faiss
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
#endif
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#include <cstdio>
|
|
9
|
+
#include <cstdlib>
|
|
10
|
+
|
|
11
|
+
#undef FINTEGER
|
|
12
|
+
#define FINTEGER long
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
extern "C" {
|
|
16
|
+
|
|
17
|
+
/* declare BLAS functions, see http://www.netlib.org/clapack/cblas/ */
|
|
18
|
+
|
|
19
|
+
int sgemm_ (const char *transa, const char *transb, FINTEGER *m, FINTEGER *
|
|
20
|
+
n, FINTEGER *k, const float *alpha, const float *a,
|
|
21
|
+
FINTEGER *lda, const float *b, FINTEGER *
|
|
22
|
+
ldb, float *beta, float *c, FINTEGER *ldc);
|
|
23
|
+
|
|
24
|
+
/* Lapack functions, see http://www.netlib.org/clapack/old/single/sgeqrf.c */
|
|
25
|
+
|
|
26
|
+
int sgeqrf_ (FINTEGER *m, FINTEGER *n, float *a, FINTEGER *lda,
|
|
27
|
+
float *tau, float *work, FINTEGER *lwork, FINTEGER *info);
|
|
28
|
+
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
float *new_random_vec(int size)
|
|
32
|
+
{
|
|
33
|
+
float *x = new float[size];
|
|
34
|
+
for (int i = 0; i < size; i++)
|
|
35
|
+
x[i] = drand48();
|
|
36
|
+
return x;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
int main() {
|
|
41
|
+
|
|
42
|
+
FINTEGER m = 10, n = 20, k = 30;
|
|
43
|
+
float *a = new_random_vec(m * k), *b = new_random_vec(n * k), *c = new float[n * m];
|
|
44
|
+
float one = 1.0, zero = 0.0;
|
|
45
|
+
|
|
46
|
+
printf("BLAS test\n");
|
|
47
|
+
|
|
48
|
+
sgemm_("Not transposed", "Not transposed",
|
|
49
|
+
&m, &n, &k, &one, a, &m, b, &k, &zero, c, &m);
|
|
50
|
+
|
|
51
|
+
printf("errors=\n");
|
|
52
|
+
|
|
53
|
+
for (int i = 0; i < m; i++) {
|
|
54
|
+
for (int j = 0; j < n; j++) {
|
|
55
|
+
float accu = 0;
|
|
56
|
+
for (int l = 0; l < k; l++)
|
|
57
|
+
accu += a[i + l * m] * b[l + j * k];
|
|
58
|
+
printf ("%6.3f ", accu - c[i + j * m]);
|
|
59
|
+
}
|
|
60
|
+
printf("\n");
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
long info = 0x64bL << 32;
|
|
64
|
+
long mi = 0x64bL << 32 | m;
|
|
65
|
+
float *tau = new float[m];
|
|
66
|
+
FINTEGER lwork = -1;
|
|
67
|
+
|
|
68
|
+
float work1;
|
|
69
|
+
|
|
70
|
+
printf("Intentional Lapack error (appears only for 64-bit INTEGER):\n");
|
|
71
|
+
sgeqrf_ (&mi, &n, c, &m, tau, &work1, &lwork, (FINTEGER*)&info);
|
|
72
|
+
|
|
73
|
+
// sgeqrf_ (&m, &n, c, &zeroi, tau, &work1, &lwork, (FINTEGER*)&info);
|
|
74
|
+
printf("info=%016lx\n", info);
|
|
75
|
+
|
|
76
|
+
if(info >> 32 == 0x64b) {
|
|
77
|
+
printf("Lapack uses 32-bit integers\n");
|
|
78
|
+
} else {
|
|
79
|
+
printf("Lapack uses 64-bit integers\n");
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
return 0;
|
|
84
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#include <cstdio>
|
|
9
|
+
#include <cstdlib>
|
|
10
|
+
|
|
11
|
+
#include <gtest/gtest.h>
|
|
12
|
+
|
|
13
|
+
#include <faiss/IndexBinaryFlat.h>
|
|
14
|
+
#include <faiss/utils/hamming.h>
|
|
15
|
+
|
|
16
|
+
TEST(BinaryFlat, accuracy) {
|
|
17
|
+
// dimension of the vectors to index
|
|
18
|
+
int d = 64;
|
|
19
|
+
|
|
20
|
+
// size of the database we plan to index
|
|
21
|
+
size_t nb = 1000;
|
|
22
|
+
|
|
23
|
+
// make the index object and train it
|
|
24
|
+
faiss::IndexBinaryFlat index(d);
|
|
25
|
+
|
|
26
|
+
srand(35);
|
|
27
|
+
|
|
28
|
+
std::vector<uint8_t> database(nb * (d / 8));
|
|
29
|
+
for (size_t i = 0; i < nb * (d / 8); i++) {
|
|
30
|
+
database[i] = rand() % 0x100;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
{ // populating the database
|
|
34
|
+
index.add(nb, database.data());
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
size_t nq = 200;
|
|
38
|
+
|
|
39
|
+
{ // searching the database
|
|
40
|
+
|
|
41
|
+
std::vector<uint8_t> queries(nq * (d / 8));
|
|
42
|
+
for (size_t i = 0; i < nq * (d / 8); i++) {
|
|
43
|
+
queries[i] = rand() % 0x100;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
int k = 5;
|
|
47
|
+
std::vector<faiss::IndexBinary::idx_t> nns(k * nq);
|
|
48
|
+
std::vector<int> dis(k * nq);
|
|
49
|
+
|
|
50
|
+
index.search(nq, queries.data(), k, dis.data(), nns.data());
|
|
51
|
+
|
|
52
|
+
for (size_t i = 0; i < nq; ++i) {
|
|
53
|
+
faiss::HammingComputer8 hc(queries.data() + i * (d / 8), d / 8);
|
|
54
|
+
hamdis_t dist_min = hc.hamming(database.data());
|
|
55
|
+
for (size_t j = 1; j < nb; ++j) {
|
|
56
|
+
hamdis_t dist = hc.hamming(database.data() + j * (d / 8));
|
|
57
|
+
if (dist < dist_min) {
|
|
58
|
+
dist_min = dist;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
EXPECT_EQ(dist_min, dis[k * i]);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#include <cstdio>
|
|
9
|
+
#include <cstdlib>
|
|
10
|
+
|
|
11
|
+
#include <memory>
|
|
12
|
+
#include <vector>
|
|
13
|
+
|
|
14
|
+
#include <gtest/gtest.h>
|
|
15
|
+
|
|
16
|
+
#include <faiss/IndexIVF.h>
|
|
17
|
+
#include <faiss/index_factory.h>
|
|
18
|
+
#include <faiss/AutoTune.h>
|
|
19
|
+
#include <faiss/index_io.h>
|
|
20
|
+
#include <faiss/IVFlib.h>
|
|
21
|
+
|
|
22
|
+
using namespace faiss;
|
|
23
|
+
|
|
24
|
+
namespace {
|
|
25
|
+
|
|
26
|
+
typedef Index::idx_t idx_t;
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
// dimension of the vectors to index
|
|
30
|
+
int d = 32;
|
|
31
|
+
|
|
32
|
+
// nb of training vectors
|
|
33
|
+
size_t nt = 5000;
|
|
34
|
+
|
|
35
|
+
// size of the database points per window step
|
|
36
|
+
size_t nb = 1000;
|
|
37
|
+
|
|
38
|
+
// nb of queries
|
|
39
|
+
size_t nq = 200;
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
std::vector<float> make_data(size_t n)
|
|
43
|
+
{
|
|
44
|
+
std::vector <float> database (n * d);
|
|
45
|
+
for (size_t i = 0; i < n * d; i++) {
|
|
46
|
+
database[i] = drand48();
|
|
47
|
+
}
|
|
48
|
+
return database;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
std::unique_ptr<Index> make_trained_index(const char *index_type)
|
|
52
|
+
{
|
|
53
|
+
auto index = std::unique_ptr<Index>(index_factory(d, index_type));
|
|
54
|
+
auto xt = make_data(nt * d);
|
|
55
|
+
index->train(nt, xt.data());
|
|
56
|
+
ParameterSpace().set_index_parameter (index.get(), "nprobe", 4);
|
|
57
|
+
return index;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
std::vector<idx_t> search_index(Index *index, const float *xq) {
|
|
61
|
+
int k = 10;
|
|
62
|
+
std::vector<idx_t> I(k * nq);
|
|
63
|
+
std::vector<float> D(k * nq);
|
|
64
|
+
index->search (nq, xq, k, D.data(), I.data());
|
|
65
|
+
return I;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
/*************************************************************
|
|
73
|
+
* Test functions for a given index type
|
|
74
|
+
*************************************************************/
|
|
75
|
+
|
|
76
|
+
struct EncapsulateInvertedLists: InvertedLists {
|
|
77
|
+
|
|
78
|
+
const InvertedLists *il;
|
|
79
|
+
|
|
80
|
+
EncapsulateInvertedLists(const InvertedLists *il):
|
|
81
|
+
InvertedLists(il->nlist, il->code_size),
|
|
82
|
+
il(il)
|
|
83
|
+
{}
|
|
84
|
+
|
|
85
|
+
static void * memdup (const void *m, size_t size) {
|
|
86
|
+
if (size == 0) return nullptr;
|
|
87
|
+
return memcpy (malloc(size), m, size);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
size_t list_size(size_t list_no) const override {
|
|
91
|
+
return il->list_size (list_no);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const uint8_t * get_codes (size_t list_no) const override {
|
|
95
|
+
return (uint8_t*)memdup (il->get_codes(list_no),
|
|
96
|
+
list_size(list_no) * code_size);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const idx_t * get_ids (size_t list_no) const override {
|
|
100
|
+
return (idx_t*)memdup (il->get_ids(list_no),
|
|
101
|
+
list_size(list_no) * sizeof(idx_t));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
void release_codes (size_t, const uint8_t *codes) const override {
|
|
105
|
+
free ((void*)codes);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
void release_ids (size_t, const idx_t *ids) const override {
|
|
109
|
+
free ((void*)ids);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const uint8_t * get_single_code (size_t list_no, size_t offset)
|
|
113
|
+
const override {
|
|
114
|
+
return (uint8_t*)memdup (il->get_single_code(list_no, offset),
|
|
115
|
+
code_size);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
size_t add_entries(size_t, size_t, const idx_t*, const uint8_t*) override {
|
|
119
|
+
assert(!"not implemented");
|
|
120
|
+
return 0;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
void update_entries(size_t, size_t, size_t, const idx_t*, const uint8_t*)
|
|
124
|
+
override {
|
|
125
|
+
assert(!"not implemented");
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
void resize(size_t, size_t) override {
|
|
129
|
+
assert(!"not implemented");
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
~EncapsulateInvertedLists() override {}
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
int test_dealloc_invlists (const char *index_key) {
|
|
138
|
+
|
|
139
|
+
std::unique_ptr<Index> index = make_trained_index(index_key);
|
|
140
|
+
IndexIVF * index_ivf = ivflib::extract_index_ivf (index.get());
|
|
141
|
+
|
|
142
|
+
auto xb = make_data (nb * d);
|
|
143
|
+
index->add(nb, xb.data());
|
|
144
|
+
|
|
145
|
+
auto xq = make_data (nq * d);
|
|
146
|
+
|
|
147
|
+
auto ref_res = search_index (index.get(), xq.data());
|
|
148
|
+
|
|
149
|
+
EncapsulateInvertedLists eil(index_ivf->invlists);
|
|
150
|
+
|
|
151
|
+
index_ivf->own_invlists = false;
|
|
152
|
+
index_ivf->replace_invlists (&eil, false);
|
|
153
|
+
|
|
154
|
+
// TEST: this could crash or leak mem
|
|
155
|
+
auto new_res = search_index (index.get(), xq.data());
|
|
156
|
+
|
|
157
|
+
// delete explicitly
|
|
158
|
+
delete eil.il;
|
|
159
|
+
|
|
160
|
+
// just to make sure
|
|
161
|
+
EXPECT_EQ (ref_res, new_res);
|
|
162
|
+
return 0;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
} // anonymous namespace
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
/*************************************************************
|
|
170
|
+
* Test entry points
|
|
171
|
+
*************************************************************/
|
|
172
|
+
|
|
173
|
+
TEST(TestIvlistDealloc, IVFFlat) {
|
|
174
|
+
test_dealloc_invlists ("IVF32,Flat");
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
TEST(TestIvlistDealloc, IVFSQ) {
|
|
178
|
+
test_dealloc_invlists ("IVF32,SQ8");
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
TEST(TestIvlistDealloc, IVFPQ) {
|
|
182
|
+
test_dealloc_invlists ("IVF32,PQ4np");
|
|
183
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#include <cstdio>
|
|
9
|
+
#include <cstdlib>
|
|
10
|
+
|
|
11
|
+
#include <gtest/gtest.h>
|
|
12
|
+
|
|
13
|
+
#include <faiss/IndexIVFPQ.h>
|
|
14
|
+
#include <faiss/IndexFlat.h>
|
|
15
|
+
#include <faiss/utils/utils.h>
|
|
16
|
+
#include <faiss/utils/distances.h>
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
namespace {
|
|
20
|
+
|
|
21
|
+
// dimension of the vectors to index
|
|
22
|
+
int d = 64;
|
|
23
|
+
|
|
24
|
+
// size of the database we plan to index
|
|
25
|
+
size_t nb = 8000;
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
double eval_codec_error (long ncentroids, long m, const std::vector<float> &v)
|
|
29
|
+
{
|
|
30
|
+
faiss::IndexFlatL2 coarse_quantizer (d);
|
|
31
|
+
faiss::IndexIVFPQ index (&coarse_quantizer, d,
|
|
32
|
+
ncentroids, m, 8);
|
|
33
|
+
index.pq.cp.niter = 10; // speed up train
|
|
34
|
+
index.train (nb, v.data());
|
|
35
|
+
|
|
36
|
+
// encode and decode to compute reconstruction error
|
|
37
|
+
|
|
38
|
+
std::vector<faiss::Index::idx_t> keys (nb);
|
|
39
|
+
std::vector<uint8_t> codes (nb * m);
|
|
40
|
+
index.encode_multiple (nb, keys.data(), v.data(), codes.data(), true);
|
|
41
|
+
|
|
42
|
+
std::vector<float> v2 (nb * d);
|
|
43
|
+
index.decode_multiple (nb, keys.data(), codes.data(), v2.data());
|
|
44
|
+
|
|
45
|
+
return faiss::fvec_L2sqr (v.data(), v2.data(), nb * d);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
} // namespace
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
TEST(IVFPQ, codec) {
|
|
52
|
+
|
|
53
|
+
std::vector <float> database (nb * d);
|
|
54
|
+
for (size_t i = 0; i < nb * d; i++) {
|
|
55
|
+
database[i] = drand48();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
double err0 = eval_codec_error(16, 8, database);
|
|
59
|
+
|
|
60
|
+
// should be more accurate as there are more coarse centroids
|
|
61
|
+
double err1 = eval_codec_error(128, 8, database);
|
|
62
|
+
EXPECT_GT(err0, err1);
|
|
63
|
+
|
|
64
|
+
// should be more accurate as there are more PQ codes
|
|
65
|
+
double err2 = eval_codec_error(16, 16, database);
|
|
66
|
+
EXPECT_GT(err0, err2);
|
|
67
|
+
}
|