faiss 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/ext/faiss/extconf.rb +1 -1
- data/lib/faiss/version.rb +1 -1
- data/vendor/faiss/benchs/bench_6bit_codec.cpp +80 -0
- data/vendor/faiss/c_api/AutoTune_c.h +2 -0
- data/vendor/faiss/c_api/IndexShards_c.cpp +0 -6
- data/vendor/faiss/c_api/IndexShards_c.h +1 -4
- data/vendor/faiss/c_api/gpu/GpuAutoTune_c.cpp +4 -2
- data/vendor/faiss/c_api/gpu/GpuClonerOptions_c.cpp +1 -1
- data/vendor/faiss/c_api/gpu/GpuIndex_c.cpp +1 -1
- data/vendor/faiss/c_api/gpu/GpuResources_c.cpp +1 -1
- data/vendor/faiss/c_api/gpu/StandardGpuResources_c.cpp +1 -1
- data/vendor/faiss/demos/demo_imi_flat.cpp +5 -2
- data/vendor/faiss/demos/demo_imi_pq.cpp +6 -2
- data/vendor/faiss/demos/demo_ivfpq_indexing.cpp +7 -2
- data/vendor/faiss/{AutoTune.cpp → faiss/AutoTune.cpp} +9 -9
- data/vendor/faiss/{AutoTune.h → faiss/AutoTune.h} +0 -0
- data/vendor/faiss/{Clustering.cpp → faiss/Clustering.cpp} +13 -12
- data/vendor/faiss/{Clustering.h → faiss/Clustering.h} +0 -0
- data/vendor/faiss/{DirectMap.cpp → faiss/DirectMap.cpp} +0 -0
- data/vendor/faiss/{DirectMap.h → faiss/DirectMap.h} +0 -0
- data/vendor/faiss/{IVFlib.cpp → faiss/IVFlib.cpp} +86 -11
- data/vendor/faiss/{IVFlib.h → faiss/IVFlib.h} +26 -8
- data/vendor/faiss/{Index.cpp → faiss/Index.cpp} +0 -0
- data/vendor/faiss/{Index.h → faiss/Index.h} +1 -1
- data/vendor/faiss/{Index2Layer.cpp → faiss/Index2Layer.cpp} +12 -11
- data/vendor/faiss/{Index2Layer.h → faiss/Index2Layer.h} +0 -0
- data/vendor/faiss/{IndexBinary.cpp → faiss/IndexBinary.cpp} +2 -1
- data/vendor/faiss/{IndexBinary.h → faiss/IndexBinary.h} +0 -0
- data/vendor/faiss/{IndexBinaryFlat.cpp → faiss/IndexBinaryFlat.cpp} +0 -0
- data/vendor/faiss/{IndexBinaryFlat.h → faiss/IndexBinaryFlat.h} +0 -0
- data/vendor/faiss/{IndexBinaryFromFloat.cpp → faiss/IndexBinaryFromFloat.cpp} +1 -0
- data/vendor/faiss/{IndexBinaryFromFloat.h → faiss/IndexBinaryFromFloat.h} +0 -0
- data/vendor/faiss/{IndexBinaryHNSW.cpp → faiss/IndexBinaryHNSW.cpp} +1 -2
- data/vendor/faiss/{IndexBinaryHNSW.h → faiss/IndexBinaryHNSW.h} +0 -0
- data/vendor/faiss/{IndexBinaryHash.cpp → faiss/IndexBinaryHash.cpp} +16 -7
- data/vendor/faiss/{IndexBinaryHash.h → faiss/IndexBinaryHash.h} +2 -1
- data/vendor/faiss/{IndexBinaryIVF.cpp → faiss/IndexBinaryIVF.cpp} +10 -16
- data/vendor/faiss/{IndexBinaryIVF.h → faiss/IndexBinaryIVF.h} +1 -1
- data/vendor/faiss/{IndexFlat.cpp → faiss/IndexFlat.cpp} +0 -0
- data/vendor/faiss/{IndexFlat.h → faiss/IndexFlat.h} +0 -0
- data/vendor/faiss/{IndexHNSW.cpp → faiss/IndexHNSW.cpp} +63 -32
- data/vendor/faiss/{IndexHNSW.h → faiss/IndexHNSW.h} +0 -0
- data/vendor/faiss/{IndexIVF.cpp → faiss/IndexIVF.cpp} +129 -46
- data/vendor/faiss/{IndexIVF.h → faiss/IndexIVF.h} +7 -3
- data/vendor/faiss/{IndexIVFFlat.cpp → faiss/IndexIVFFlat.cpp} +6 -5
- data/vendor/faiss/{IndexIVFFlat.h → faiss/IndexIVFFlat.h} +0 -0
- data/vendor/faiss/{IndexIVFPQ.cpp → faiss/IndexIVFPQ.cpp} +9 -8
- data/vendor/faiss/{IndexIVFPQ.h → faiss/IndexIVFPQ.h} +4 -2
- data/vendor/faiss/{IndexIVFPQR.cpp → faiss/IndexIVFPQR.cpp} +3 -1
- data/vendor/faiss/{IndexIVFPQR.h → faiss/IndexIVFPQR.h} +0 -0
- data/vendor/faiss/{IndexIVFSpectralHash.cpp → faiss/IndexIVFSpectralHash.cpp} +1 -1
- data/vendor/faiss/{IndexIVFSpectralHash.h → faiss/IndexIVFSpectralHash.h} +0 -0
- data/vendor/faiss/{IndexLSH.cpp → faiss/IndexLSH.cpp} +0 -0
- data/vendor/faiss/{IndexLSH.h → faiss/IndexLSH.h} +0 -0
- data/vendor/faiss/{IndexLattice.cpp → faiss/IndexLattice.cpp} +0 -0
- data/vendor/faiss/{IndexLattice.h → faiss/IndexLattice.h} +0 -0
- data/vendor/faiss/{IndexPQ.cpp → faiss/IndexPQ.cpp} +6 -6
- data/vendor/faiss/{IndexPQ.h → faiss/IndexPQ.h} +3 -1
- data/vendor/faiss/{IndexPreTransform.cpp → faiss/IndexPreTransform.cpp} +0 -0
- data/vendor/faiss/{IndexPreTransform.h → faiss/IndexPreTransform.h} +0 -0
- data/vendor/faiss/{IndexReplicas.cpp → faiss/IndexReplicas.cpp} +102 -10
- data/vendor/faiss/{IndexReplicas.h → faiss/IndexReplicas.h} +6 -0
- data/vendor/faiss/{IndexScalarQuantizer.cpp → faiss/IndexScalarQuantizer.cpp} +3 -3
- data/vendor/faiss/{IndexScalarQuantizer.h → faiss/IndexScalarQuantizer.h} +0 -0
- data/vendor/faiss/{IndexShards.cpp → faiss/IndexShards.cpp} +37 -12
- data/vendor/faiss/{IndexShards.h → faiss/IndexShards.h} +3 -4
- data/vendor/faiss/{InvertedLists.cpp → faiss/InvertedLists.cpp} +2 -2
- data/vendor/faiss/{InvertedLists.h → faiss/InvertedLists.h} +1 -0
- data/vendor/faiss/{MatrixStats.cpp → faiss/MatrixStats.cpp} +0 -0
- data/vendor/faiss/{MatrixStats.h → faiss/MatrixStats.h} +0 -0
- data/vendor/faiss/{MetaIndexes.cpp → faiss/MetaIndexes.cpp} +5 -3
- data/vendor/faiss/{MetaIndexes.h → faiss/MetaIndexes.h} +0 -0
- data/vendor/faiss/{MetricType.h → faiss/MetricType.h} +0 -0
- data/vendor/faiss/{OnDiskInvertedLists.cpp → faiss/OnDiskInvertedLists.cpp} +141 -3
- data/vendor/faiss/{OnDiskInvertedLists.h → faiss/OnDiskInvertedLists.h} +27 -7
- data/vendor/faiss/{VectorTransform.cpp → faiss/VectorTransform.cpp} +4 -3
- data/vendor/faiss/{VectorTransform.h → faiss/VectorTransform.h} +0 -0
- data/vendor/faiss/{clone_index.cpp → faiss/clone_index.cpp} +0 -0
- data/vendor/faiss/{clone_index.h → faiss/clone_index.h} +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/GpuAutoTune.cpp +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/GpuAutoTune.h +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/GpuCloner.cpp +14 -14
- data/vendor/faiss/{gpu → faiss/gpu}/GpuCloner.h +6 -7
- data/vendor/faiss/{gpu → faiss/gpu}/GpuClonerOptions.cpp +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/GpuClonerOptions.h +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/GpuDistance.h +12 -4
- data/vendor/faiss/{gpu → faiss/gpu}/GpuFaissAssert.h +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/GpuIndex.h +3 -9
- data/vendor/faiss/{gpu → faiss/gpu}/GpuIndexBinaryFlat.h +7 -7
- data/vendor/faiss/{gpu → faiss/gpu}/GpuIndexFlat.h +35 -10
- data/vendor/faiss/{gpu → faiss/gpu}/GpuIndexIVF.h +1 -2
- data/vendor/faiss/{gpu → faiss/gpu}/GpuIndexIVFFlat.h +4 -3
- data/vendor/faiss/{gpu → faiss/gpu}/GpuIndexIVFPQ.h +21 -4
- data/vendor/faiss/{gpu → faiss/gpu}/GpuIndexIVFScalarQuantizer.h +4 -3
- data/vendor/faiss/{gpu → faiss/gpu}/GpuIndicesOptions.h +0 -0
- data/vendor/faiss/faiss/gpu/GpuResources.cpp +200 -0
- data/vendor/faiss/faiss/gpu/GpuResources.h +264 -0
- data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +572 -0
- data/vendor/faiss/{gpu → faiss/gpu}/StandardGpuResources.h +83 -15
- data/vendor/faiss/{gpu → faiss/gpu}/impl/RemapIndices.cpp +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/impl/RemapIndices.h +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/perf/IndexWrapper-inl.h +1 -1
- data/vendor/faiss/{gpu → faiss/gpu}/perf/IndexWrapper.h +1 -1
- data/vendor/faiss/{gpu → faiss/gpu}/perf/PerfClustering.cpp +1 -1
- data/vendor/faiss/{gpu → faiss/gpu}/perf/PerfIVFPQAdd.cpp +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/perf/WriteIndex.cpp +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/test/TestGpuIndexBinaryFlat.cpp +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/test/TestGpuIndexFlat.cpp +1 -1
- data/vendor/faiss/{gpu → faiss/gpu}/test/TestGpuIndexIVFFlat.cpp +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/test/TestGpuIndexIVFPQ.cpp +141 -52
- data/vendor/faiss/{gpu → faiss/gpu}/test/TestGpuMemoryException.cpp +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/test/TestUtils.cpp +4 -2
- data/vendor/faiss/{gpu → faiss/gpu}/test/TestUtils.h +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/test/demo_ivfpq_indexing_gpu.cpp +7 -5
- data/vendor/faiss/{gpu → faiss/gpu}/utils/DeviceUtils.h +1 -1
- data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +213 -0
- data/vendor/faiss/{gpu → faiss/gpu}/utils/StackDeviceMemory.h +25 -40
- data/vendor/faiss/{gpu → faiss/gpu}/utils/StaticUtils.h +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/utils/Timer.cpp +0 -0
- data/vendor/faiss/{gpu → faiss/gpu}/utils/Timer.h +0 -0
- data/vendor/faiss/{impl → faiss/impl}/AuxIndexStructures.cpp +1 -0
- data/vendor/faiss/{impl → faiss/impl}/AuxIndexStructures.h +3 -1
- data/vendor/faiss/{impl → faiss/impl}/FaissAssert.h +1 -0
- data/vendor/faiss/{impl → faiss/impl}/FaissException.cpp +26 -0
- data/vendor/faiss/{impl → faiss/impl}/FaissException.h +4 -0
- data/vendor/faiss/{impl → faiss/impl}/HNSW.cpp +26 -26
- data/vendor/faiss/{impl → faiss/impl}/HNSW.h +19 -11
- data/vendor/faiss/{impl → faiss/impl}/PolysemousTraining.cpp +1 -1
- data/vendor/faiss/{impl → faiss/impl}/PolysemousTraining.h +1 -1
- data/vendor/faiss/{impl → faiss/impl}/ProductQuantizer-inl.h +0 -1
- data/vendor/faiss/{impl → faiss/impl}/ProductQuantizer.cpp +9 -9
- data/vendor/faiss/{impl → faiss/impl}/ProductQuantizer.h +0 -0
- data/vendor/faiss/{impl → faiss/impl}/ScalarQuantizer.cpp +63 -39
- data/vendor/faiss/{impl → faiss/impl}/ScalarQuantizer.h +1 -1
- data/vendor/faiss/{impl → faiss/impl}/ThreadedIndex-inl.h +0 -0
- data/vendor/faiss/{impl → faiss/impl}/ThreadedIndex.h +0 -0
- data/vendor/faiss/{impl → faiss/impl}/index_read.cpp +99 -116
- data/vendor/faiss/{impl → faiss/impl}/index_write.cpp +15 -50
- data/vendor/faiss/{impl → faiss/impl}/io.cpp +15 -10
- data/vendor/faiss/{impl → faiss/impl}/io.h +22 -8
- data/vendor/faiss/faiss/impl/io_macros.h +57 -0
- data/vendor/faiss/{impl → faiss/impl}/lattice_Zn.cpp +52 -36
- data/vendor/faiss/{impl → faiss/impl}/lattice_Zn.h +3 -3
- data/vendor/faiss/faiss/impl/platform_macros.h +24 -0
- data/vendor/faiss/{index_factory.cpp → faiss/index_factory.cpp} +33 -12
- data/vendor/faiss/{index_factory.h → faiss/index_factory.h} +0 -0
- data/vendor/faiss/{index_io.h → faiss/index_io.h} +55 -1
- data/vendor/faiss/faiss/python/python_callbacks.cpp +112 -0
- data/vendor/faiss/faiss/python/python_callbacks.h +45 -0
- data/vendor/faiss/{utils → faiss/utils}/Heap.cpp +5 -5
- data/vendor/faiss/{utils → faiss/utils}/Heap.h +1 -3
- data/vendor/faiss/{utils → faiss/utils}/WorkerThread.cpp +0 -0
- data/vendor/faiss/{utils → faiss/utils}/WorkerThread.h +0 -0
- data/vendor/faiss/{utils → faiss/utils}/distances.cpp +28 -13
- data/vendor/faiss/{utils → faiss/utils}/distances.h +2 -1
- data/vendor/faiss/{utils → faiss/utils}/distances_simd.cpp +5 -5
- data/vendor/faiss/{utils → faiss/utils}/extra_distances.cpp +8 -7
- data/vendor/faiss/{utils → faiss/utils}/extra_distances.h +0 -0
- data/vendor/faiss/{utils → faiss/utils}/hamming-inl.h +1 -3
- data/vendor/faiss/{utils → faiss/utils}/hamming.cpp +8 -7
- data/vendor/faiss/{utils → faiss/utils}/hamming.h +7 -1
- data/vendor/faiss/{utils → faiss/utils}/random.cpp +5 -5
- data/vendor/faiss/{utils → faiss/utils}/random.h +0 -0
- data/vendor/faiss/{utils → faiss/utils}/utils.cpp +27 -28
- data/vendor/faiss/{utils → faiss/utils}/utils.h +4 -0
- data/vendor/faiss/misc/test_blas.cpp +4 -1
- data/vendor/faiss/tests/test_binary_flat.cpp +0 -2
- data/vendor/faiss/tests/test_dealloc_invlists.cpp +6 -1
- data/vendor/faiss/tests/test_ivfpq_codec.cpp +4 -1
- data/vendor/faiss/tests/test_ivfpq_indexing.cpp +6 -4
- data/vendor/faiss/tests/test_lowlevel_ivf.cpp +12 -5
- data/vendor/faiss/tests/test_merge.cpp +6 -3
- data/vendor/faiss/tests/test_ondisk_ivf.cpp +7 -2
- data/vendor/faiss/tests/test_pairs_decoding.cpp +5 -1
- data/vendor/faiss/tests/test_params_override.cpp +7 -2
- data/vendor/faiss/tests/test_sliding_ivf.cpp +10 -4
- data/vendor/faiss/tutorial/cpp/1-Flat.cpp +14 -8
- data/vendor/faiss/tutorial/cpp/2-IVFFlat.cpp +11 -7
- data/vendor/faiss/tutorial/cpp/3-IVFPQ.cpp +12 -7
- data/vendor/faiss/tutorial/cpp/4-GPU.cpp +6 -3
- data/vendor/faiss/tutorial/cpp/5-Multiple-GPUs.cpp +7 -3
- metadata +154 -153
- data/vendor/faiss/gpu/GpuResources.cpp +0 -52
- data/vendor/faiss/gpu/GpuResources.h +0 -73
- data/vendor/faiss/gpu/StandardGpuResources.cpp +0 -303
- data/vendor/faiss/gpu/utils/DeviceMemory.cpp +0 -77
- data/vendor/faiss/gpu/utils/DeviceMemory.h +0 -71
- data/vendor/faiss/gpu/utils/MemorySpace.cpp +0 -89
- data/vendor/faiss/gpu/utils/MemorySpace.h +0 -44
- data/vendor/faiss/gpu/utils/StackDeviceMemory.cpp +0 -239
File without changes
|
@@ -14,6 +14,9 @@
|
|
14
14
|
|
15
15
|
|
16
16
|
#include <cstdio>
|
17
|
+
#include <typeinfo>
|
18
|
+
#include <string>
|
19
|
+
#include <vector>
|
17
20
|
|
18
21
|
/** I/O functions can read/write to a filename, a file handle or to an
|
19
22
|
* object that abstracts the medium.
|
@@ -42,11 +45,15 @@ void write_index_binary (const IndexBinary *idx, FILE *f);
|
|
42
45
|
void write_index_binary (const IndexBinary *idx, IOWriter *writer);
|
43
46
|
|
44
47
|
// 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
48
|
const int IO_FLAG_READ_ONLY = 2;
|
47
49
|
// strip directory component from ondisk filename, and assume it's in
|
48
50
|
// the same directory as the index file
|
49
51
|
const int IO_FLAG_ONDISK_SAME_DIR = 4;
|
52
|
+
// don't load IVF data to RAM, only list sizes
|
53
|
+
const int IO_FLAG_SKIP_IVF_DATA = 8;
|
54
|
+
// try to memmap data (useful for OnDiskInvertedLists)
|
55
|
+
const int IO_FLAG_MMAP = IO_FLAG_SKIP_IVF_DATA | 0x646f0000;
|
56
|
+
|
50
57
|
|
51
58
|
Index *read_index (const char *fname, int io_flags = 0);
|
52
59
|
Index *read_index (FILE * f, int io_flags = 0);
|
@@ -69,6 +76,53 @@ void write_InvertedLists (const InvertedLists *ils, IOWriter *f);
|
|
69
76
|
InvertedLists *read_InvertedLists (IOReader *reader, int io_flags = 0);
|
70
77
|
|
71
78
|
|
79
|
+
#ifndef _MSC_VER
|
80
|
+
/** Callbacks to handle other types of InvertedList objects.
|
81
|
+
*
|
82
|
+
* The callbacks should be registered with add_callback before calling
|
83
|
+
* read_index or read_InvertedLists. The callbacks for
|
84
|
+
* OnDiskInvertedLists are registrered by default. The invlist type is
|
85
|
+
* identified by:
|
86
|
+
*
|
87
|
+
* - the key (a fourcc) at read time
|
88
|
+
* - the class name (as given by typeid.name) at write time
|
89
|
+
*/
|
90
|
+
struct InvertedListsIOHook {
|
91
|
+
const std::string key; ///< string version of the fourcc
|
92
|
+
const std::string classname; ///< typeid.name
|
93
|
+
|
94
|
+
InvertedListsIOHook(const std::string & key, const std::string & classname);
|
95
|
+
|
96
|
+
/// write the index to the IOWriter (including the fourcc)
|
97
|
+
virtual void write(const InvertedLists *ils, IOWriter *f) const = 0;
|
98
|
+
|
99
|
+
/// called when the fourcc matches this class's fourcc
|
100
|
+
virtual InvertedLists * read(IOReader *f, int io_flags) const = 0;
|
101
|
+
|
102
|
+
/** read from a ArrayInvertedLists into this invertedlist type.
|
103
|
+
* For this to work, the callback has to be enabled and the io_flag has to be set to
|
104
|
+
* IO_FLAG_SKIP_IVF_DATA | (16 upper bits of the fourcc)
|
105
|
+
*/
|
106
|
+
virtual InvertedLists * read_ArrayInvertedLists(
|
107
|
+
IOReader *f, int io_flags,
|
108
|
+
size_t nlist, size_t code_size,
|
109
|
+
const std::vector<size_t> &sizes) const = 0;
|
110
|
+
|
111
|
+
virtual ~InvertedListsIOHook() {}
|
112
|
+
|
113
|
+
/**************************** Manage the set of callbacks ******/
|
114
|
+
|
115
|
+
// transfers ownership
|
116
|
+
static void add_callback(InvertedListsIOHook *);
|
117
|
+
static void print_callbacks();
|
118
|
+
static InvertedListsIOHook* lookup(int h);
|
119
|
+
static InvertedListsIOHook* lookup_classname(const std::string & classname);
|
120
|
+
|
121
|
+
};
|
122
|
+
|
123
|
+
#endif // !_MSC_VER
|
124
|
+
|
125
|
+
|
72
126
|
} // namespace faiss
|
73
127
|
|
74
128
|
|
@@ -0,0 +1,112 @@
|
|
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 <faiss/python/python_callbacks.h>
|
9
|
+
#include <faiss/impl/FaissAssert.h>
|
10
|
+
|
11
|
+
namespace {
|
12
|
+
|
13
|
+
struct PyThreadLock {
|
14
|
+
PyGILState_STATE gstate;
|
15
|
+
|
16
|
+
PyThreadLock () {
|
17
|
+
gstate = PyGILState_Ensure();
|
18
|
+
}
|
19
|
+
|
20
|
+
~PyThreadLock () {
|
21
|
+
PyGILState_Release(gstate);
|
22
|
+
}
|
23
|
+
};
|
24
|
+
|
25
|
+
|
26
|
+
};
|
27
|
+
|
28
|
+
|
29
|
+
/***********************************************************
|
30
|
+
* Callbacks for IO reader and writer
|
31
|
+
***********************************************************/
|
32
|
+
|
33
|
+
PyCallbackIOWriter::PyCallbackIOWriter(PyObject *callback, size_t bs):
|
34
|
+
callback(callback), bs(bs) {
|
35
|
+
PyThreadLock gil;
|
36
|
+
Py_INCREF(callback);
|
37
|
+
name = "PyCallbackIOWriter";
|
38
|
+
}
|
39
|
+
|
40
|
+
|
41
|
+
|
42
|
+
size_t PyCallbackIOWriter::operator()(const void *ptrv, size_t size, size_t nitems) {
|
43
|
+
size_t ws = size * nitems;
|
44
|
+
const char *ptr = (const char*)ptrv;
|
45
|
+
PyThreadLock gil;
|
46
|
+
while(ws > 0) {
|
47
|
+
size_t wi = ws > bs ? bs : ws;
|
48
|
+
PyObject * result = PyObject_CallFunction(
|
49
|
+
callback, "(N)", PyBytes_FromStringAndSize(ptr, wi));
|
50
|
+
if (result == NULL) {
|
51
|
+
FAISS_THROW_MSG("py err");
|
52
|
+
}
|
53
|
+
// TODO check nb of bytes written
|
54
|
+
ptr += wi;
|
55
|
+
ws -= wi;
|
56
|
+
Py_DECREF(result);
|
57
|
+
}
|
58
|
+
return nitems;
|
59
|
+
}
|
60
|
+
|
61
|
+
PyCallbackIOWriter::~PyCallbackIOWriter() {
|
62
|
+
PyThreadLock gil;
|
63
|
+
Py_DECREF(callback);
|
64
|
+
}
|
65
|
+
|
66
|
+
|
67
|
+
PyCallbackIOReader::PyCallbackIOReader(PyObject *callback, size_t bs):
|
68
|
+
callback(callback), bs(bs) {
|
69
|
+
PyThreadLock gil;
|
70
|
+
Py_INCREF(callback);
|
71
|
+
name = "PyCallbackIOReader";
|
72
|
+
}
|
73
|
+
|
74
|
+
size_t PyCallbackIOReader::operator()(void *ptrv, size_t size, size_t nitems)
|
75
|
+
{
|
76
|
+
size_t rs = size * nitems;
|
77
|
+
size_t nb = 0;
|
78
|
+
char *ptr = (char*)ptrv;
|
79
|
+
PyThreadLock gil;
|
80
|
+
while(rs > 0) {
|
81
|
+
size_t ri = rs > bs ? bs : rs;
|
82
|
+
PyObject * result = PyObject_CallFunction(callback, "(n)", ri);
|
83
|
+
if (result == NULL) {
|
84
|
+
FAISS_THROW_MSG("propagate py error");
|
85
|
+
}
|
86
|
+
if(!PyBytes_Check(result)) {
|
87
|
+
Py_DECREF(result);
|
88
|
+
FAISS_THROW_MSG("read callback did not return a bytes object");
|
89
|
+
}
|
90
|
+
size_t sz = PyBytes_Size(result);
|
91
|
+
if (sz == 0) {
|
92
|
+
Py_DECREF(result);
|
93
|
+
break;
|
94
|
+
}
|
95
|
+
nb += sz;
|
96
|
+
if (sz > rs) {
|
97
|
+
Py_DECREF(result);
|
98
|
+
FAISS_THROW_FMT("read callback returned %zd bytes (asked %zd)",
|
99
|
+
sz, rs);
|
100
|
+
}
|
101
|
+
memcpy(ptr, PyBytes_AsString(result), sz);
|
102
|
+
Py_DECREF(result);
|
103
|
+
ptr += sz;
|
104
|
+
rs -= sz;
|
105
|
+
}
|
106
|
+
return nb / size;
|
107
|
+
}
|
108
|
+
|
109
|
+
PyCallbackIOReader::~PyCallbackIOReader() {
|
110
|
+
PyThreadLock gil;
|
111
|
+
Py_DECREF(callback);
|
112
|
+
}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
#include "Python.h"
|
4
|
+
#include <faiss/impl/io.h>
|
5
|
+
#include <faiss/InvertedLists.h>
|
6
|
+
|
7
|
+
// all callbacks have to acquire the GIL on input
|
8
|
+
|
9
|
+
|
10
|
+
/***********************************************************
|
11
|
+
* Callbacks for IO reader and writer
|
12
|
+
***********************************************************/
|
13
|
+
|
14
|
+
struct PyCallbackIOWriter: faiss::IOWriter {
|
15
|
+
|
16
|
+
PyObject * callback;
|
17
|
+
size_t bs; // maximum write size
|
18
|
+
|
19
|
+
/** Callback: Python function that takes a bytes object and
|
20
|
+
* returns the number of bytes successfully written.
|
21
|
+
*/
|
22
|
+
explicit PyCallbackIOWriter(PyObject *callback,
|
23
|
+
size_t bs = 1024 * 1024);
|
24
|
+
|
25
|
+
size_t operator()(const void *ptrv, size_t size, size_t nitems) override;
|
26
|
+
|
27
|
+
~PyCallbackIOWriter() override;
|
28
|
+
|
29
|
+
};
|
30
|
+
|
31
|
+
|
32
|
+
struct PyCallbackIOReader: faiss::IOReader {
|
33
|
+
PyObject * callback;
|
34
|
+
size_t bs; // maximum buffer size
|
35
|
+
|
36
|
+
/** Callback: Python function that takes a size and returns a
|
37
|
+
* bytes object with the resulting read */
|
38
|
+
explicit PyCallbackIOReader(PyObject *callback,
|
39
|
+
size_t bs = 1024 * 1024);
|
40
|
+
|
41
|
+
size_t operator()(void *ptrv, size_t size, size_t nitems) override;
|
42
|
+
|
43
|
+
~PyCallbackIOReader() override;
|
44
|
+
|
45
|
+
};
|
@@ -19,7 +19,7 @@ template <typename C>
|
|
19
19
|
void HeapArray<C>::heapify ()
|
20
20
|
{
|
21
21
|
#pragma omp parallel for
|
22
|
-
for (
|
22
|
+
for (int64_t j = 0; j < nh; j++)
|
23
23
|
heap_heapify<C> (k, val + j * k, ids + j * k);
|
24
24
|
}
|
25
25
|
|
@@ -27,7 +27,7 @@ template <typename C>
|
|
27
27
|
void HeapArray<C>::reorder ()
|
28
28
|
{
|
29
29
|
#pragma omp parallel for
|
30
|
-
for (
|
30
|
+
for (int64_t j = 0; j < nh; j++)
|
31
31
|
heap_reorder<C> (k, val + j * k, ids + j * k);
|
32
32
|
}
|
33
33
|
|
@@ -38,7 +38,7 @@ void HeapArray<C>::addn (size_t nj, const T *vin, TI j0,
|
|
38
38
|
if (ni == -1) ni = nh;
|
39
39
|
assert (i0 >= 0 && i0 + ni <= nh);
|
40
40
|
#pragma omp parallel for
|
41
|
-
for (
|
41
|
+
for (int64_t i = i0; i < i0 + ni; i++) {
|
42
42
|
T * __restrict simi = get_val(i);
|
43
43
|
TI * __restrict idxi = get_ids (i);
|
44
44
|
const T *ip_line = vin + (i - i0) * nj;
|
@@ -65,7 +65,7 @@ void HeapArray<C>::addn_with_ids (
|
|
65
65
|
if (ni == -1) ni = nh;
|
66
66
|
assert (i0 >= 0 && i0 + ni <= nh);
|
67
67
|
#pragma omp parallel for
|
68
|
-
for (
|
68
|
+
for (int64_t i = i0; i < i0 + ni; i++) {
|
69
69
|
T * __restrict simi = get_val(i);
|
70
70
|
TI * __restrict idxi = get_ids (i);
|
71
71
|
const T *ip_line = vin + (i - i0) * nj;
|
@@ -87,7 +87,7 @@ void HeapArray<C>::per_line_extrema (
|
|
87
87
|
TI * out_ids) const
|
88
88
|
{
|
89
89
|
#pragma omp parallel for
|
90
|
-
for (
|
90
|
+
for (int64_t j = 0; j < nh; j++) {
|
91
91
|
int64_t imin = -1;
|
92
92
|
typename C::T xval = C::Crev::neutral ();
|
93
93
|
const typename C::T * x_ = val + j * k;
|
@@ -57,10 +57,8 @@ struct CMin {
|
|
57
57
|
inline static bool cmp (T a, T b) {
|
58
58
|
return a < b;
|
59
59
|
}
|
60
|
-
// value that will be popped first -> must be smaller than all others
|
61
|
-
// for int types this is not strictly the smallest val (-max - 1)
|
62
60
|
inline static T neutral () {
|
63
|
-
return
|
61
|
+
return std::numeric_limits<T>::lowest();
|
64
62
|
}
|
65
63
|
};
|
66
64
|
|
File without changes
|
File without changes
|
@@ -9,6 +9,7 @@
|
|
9
9
|
|
10
10
|
#include <faiss/utils/distances.h>
|
11
11
|
|
12
|
+
#include <algorithm>
|
12
13
|
#include <cstdio>
|
13
14
|
#include <cassert>
|
14
15
|
#include <cstring>
|
@@ -93,7 +94,7 @@ void fvec_norms_L2 (float * __restrict nr,
|
|
93
94
|
{
|
94
95
|
|
95
96
|
#pragma omp parallel for
|
96
|
-
for (
|
97
|
+
for (int64_t i = 0; i < nx; i++) {
|
97
98
|
nr[i] = sqrtf (fvec_norm_L2sqr (x + i * d, d));
|
98
99
|
}
|
99
100
|
}
|
@@ -103,7 +104,7 @@ void fvec_norms_L2sqr (float * __restrict nr,
|
|
103
104
|
size_t d, size_t nx)
|
104
105
|
{
|
105
106
|
#pragma omp parallel for
|
106
|
-
for (
|
107
|
+
for (int64_t i = 0; i < nx; i++)
|
107
108
|
nr[i] = fvec_norm_L2sqr (x + i * d, d);
|
108
109
|
}
|
109
110
|
|
@@ -112,7 +113,7 @@ void fvec_norms_L2sqr (float * __restrict nr,
|
|
112
113
|
void fvec_renorm_L2 (size_t d, size_t nx, float * __restrict x)
|
113
114
|
{
|
114
115
|
#pragma omp parallel for
|
115
|
-
for (
|
116
|
+
for (int64_t i = 0; i < nx; i++) {
|
116
117
|
float * __restrict xi = x + i * d;
|
117
118
|
|
118
119
|
float nr = fvec_norm_L2sqr (xi, d);
|
@@ -158,7 +159,7 @@ static void knn_inner_product_sse (const float * x,
|
|
158
159
|
size_t i1 = std::min(i0 + check_period, nx);
|
159
160
|
|
160
161
|
#pragma omp parallel for
|
161
|
-
for (
|
162
|
+
for (int64_t i = i0; i < i1; i++) {
|
162
163
|
const float * x_i = x + i * d;
|
163
164
|
const float * y_j = y;
|
164
165
|
|
@@ -198,7 +199,7 @@ static void knn_L2sqr_sse (
|
|
198
199
|
size_t i1 = std::min(i0 + check_period, nx);
|
199
200
|
|
200
201
|
#pragma omp parallel for
|
201
|
-
for (
|
202
|
+
for (int64_t i = i0; i < i1; i++) {
|
202
203
|
const float * x_i = x + i * d;
|
203
204
|
const float * y_j = y;
|
204
205
|
size_t j;
|
@@ -312,7 +313,7 @@ static void knn_L2sqr_blas (const float * x,
|
|
312
313
|
|
313
314
|
/* collect minima */
|
314
315
|
#pragma omp parallel for
|
315
|
-
for (
|
316
|
+
for (int64_t i = i0; i < i1; i++) {
|
316
317
|
float * __restrict simi = res->get_val(i);
|
317
318
|
int64_t * __restrict idxi = res->get_ids (i);
|
318
319
|
const float *ip_line = ip_block + (i - i0) * (j1 - j0);
|
@@ -420,7 +421,7 @@ void fvec_inner_products_by_idx (float * __restrict ip,
|
|
420
421
|
size_t d, size_t nx, size_t ny)
|
421
422
|
{
|
422
423
|
#pragma omp parallel for
|
423
|
-
for (
|
424
|
+
for (int64_t j = 0; j < nx; j++) {
|
424
425
|
const int64_t * __restrict idsj = ids + j * ny;
|
425
426
|
const float * xj = x + j * d;
|
426
427
|
float * __restrict ipj = ip + j * ny;
|
@@ -443,7 +444,7 @@ void fvec_L2sqr_by_idx (float * __restrict dis,
|
|
443
444
|
size_t d, size_t nx, size_t ny)
|
444
445
|
{
|
445
446
|
#pragma omp parallel for
|
446
|
-
for (
|
447
|
+
for (int64_t j = 0; j < nx; j++) {
|
447
448
|
const int64_t * __restrict idsj = ids + j * ny;
|
448
449
|
const float * xj = x + j * d;
|
449
450
|
float * __restrict disj = dis + j * ny;
|
@@ -462,7 +463,7 @@ void pairwise_indexed_L2sqr (
|
|
462
463
|
float *dis)
|
463
464
|
{
|
464
465
|
#pragma omp parallel for
|
465
|
-
for (
|
466
|
+
for (int64_t j = 0; j < n; j++) {
|
466
467
|
if (ix[j] >= 0 && iy[j] >= 0) {
|
467
468
|
dis[j] = fvec_L2sqr (x + d * ix[j], y + d * iy[j], d);
|
468
469
|
}
|
@@ -476,7 +477,7 @@ void pairwise_indexed_inner_product (
|
|
476
477
|
float *dis)
|
477
478
|
{
|
478
479
|
#pragma omp parallel for
|
479
|
-
for (
|
480
|
+
for (int64_t j = 0; j < n; j++) {
|
480
481
|
if (ix[j] >= 0 && iy[j] >= 0) {
|
481
482
|
dis[j] = fvec_inner_product (x + d * ix[j], y + d * iy[j], d);
|
482
483
|
}
|
@@ -495,7 +496,7 @@ void knn_inner_products_by_idx (const float * x,
|
|
495
496
|
size_t k = res->k;
|
496
497
|
|
497
498
|
#pragma omp parallel for
|
498
|
-
for (
|
499
|
+
for (int64_t i = 0; i < nx; i++) {
|
499
500
|
const float * x_ = x + i * d;
|
500
501
|
const int64_t * idsi = ids + i * ny;
|
501
502
|
size_t j;
|
@@ -526,7 +527,7 @@ void knn_L2sqr_by_idx (const float * x,
|
|
526
527
|
size_t k = res->k;
|
527
528
|
|
528
529
|
#pragma omp parallel for
|
529
|
-
for (
|
530
|
+
for (int64_t i = 0; i < nx; i++) {
|
530
531
|
const float * x_ = x + i * d;
|
531
532
|
const int64_t * __restrict idsi = ids + i * ny;
|
532
533
|
float * __restrict simi = res->get_val(i);
|
@@ -649,7 +650,7 @@ static void range_search_sse (const float * x,
|
|
649
650
|
RangeSearchPartialResult pres (res);
|
650
651
|
|
651
652
|
#pragma omp for
|
652
|
-
for (
|
653
|
+
for (int64_t i = 0; i < nx; i++) {
|
653
654
|
const float * x_ = x + i * d;
|
654
655
|
const float * y_ = y;
|
655
656
|
size_t j;
|
@@ -760,5 +761,19 @@ void pairwise_L2sqr (int64_t d,
|
|
760
761
|
|
761
762
|
}
|
762
763
|
|
764
|
+
void inner_product_to_L2sqr(float* __restrict dis,
|
765
|
+
const float* nr1,
|
766
|
+
const float* nr2,
|
767
|
+
size_t n1, size_t n2)
|
768
|
+
{
|
769
|
+
|
770
|
+
#pragma omp parallel for
|
771
|
+
for (int64_t j = 0; j < n1; j++) {
|
772
|
+
float* disj = dis + j * n2;
|
773
|
+
for (size_t i = 0; i < n2; i++)
|
774
|
+
disj[i] = nr1[j] + nr2[i] - 2 * disj[i];
|
775
|
+
}
|
776
|
+
}
|
777
|
+
|
763
778
|
|
764
779
|
} // namespace faiss
|
@@ -15,6 +15,7 @@
|
|
15
15
|
#include <stdint.h>
|
16
16
|
|
17
17
|
#include <faiss/utils/Heap.h>
|
18
|
+
#include <faiss/impl/platform_macros.h>
|
18
19
|
|
19
20
|
|
20
21
|
namespace faiss {
|
@@ -153,7 +154,7 @@ void pairwise_indexed_inner_product (
|
|
153
154
|
***************************************************************************/
|
154
155
|
|
155
156
|
// threshold on nx above which we switch to BLAS to compute distances
|
156
|
-
extern int distance_compute_blas_threshold;
|
157
|
+
FAISS_API extern int distance_compute_blas_threshold;
|
157
158
|
|
158
159
|
/** Return the k nearest neighors of each of the nx vectors x among the ny
|
159
160
|
* vector y, w.r.t to max inner product
|