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,149 @@
|
|
|
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
|
+
// Copyright 2004-present Facebook. All Rights Reserved.
|
|
9
|
+
// -*- c -*-
|
|
10
|
+
|
|
11
|
+
#ifndef FAISS_AUX_INDEX_STRUCTURES_C_H
|
|
12
|
+
#define FAISS_AUX_INDEX_STRUCTURES_C_H
|
|
13
|
+
|
|
14
|
+
#include "../Index_c.h"
|
|
15
|
+
#include "../faiss_c.h"
|
|
16
|
+
|
|
17
|
+
#ifdef __cplusplus
|
|
18
|
+
extern "C" {
|
|
19
|
+
#endif
|
|
20
|
+
|
|
21
|
+
FAISS_DECLARE_CLASS(RangeSearchResult)
|
|
22
|
+
|
|
23
|
+
FAISS_DECLARE_GETTER(RangeSearchResult, size_t, nq)
|
|
24
|
+
|
|
25
|
+
int faiss_RangeSearchResult_new(FaissRangeSearchResult** p_rsr, idx_t nq);
|
|
26
|
+
|
|
27
|
+
int faiss_RangeSearchResult_new_with(FaissRangeSearchResult** p_rsr, idx_t nq, int alloc_lims);
|
|
28
|
+
|
|
29
|
+
/// called when lims contains the nb of elements result entries
|
|
30
|
+
/// for each query
|
|
31
|
+
int faiss_RangeSearchResult_do_allocation(FaissRangeSearchResult* rsr);
|
|
32
|
+
|
|
33
|
+
FAISS_DECLARE_DESTRUCTOR(RangeSearchResult)
|
|
34
|
+
|
|
35
|
+
/// getter for buffer_size
|
|
36
|
+
FAISS_DECLARE_GETTER(RangeSearchResult, size_t, buffer_size)
|
|
37
|
+
|
|
38
|
+
/// getter for lims: size (nq + 1)
|
|
39
|
+
void faiss_RangeSearchResult_lims(
|
|
40
|
+
FaissRangeSearchResult* rsr, size_t** lims);
|
|
41
|
+
|
|
42
|
+
/// getter for labels and respective distances (not sorted):
|
|
43
|
+
/// result for query i is labels[lims[i]:lims[i+1]]
|
|
44
|
+
void faiss_RangeSearchResult_labels(
|
|
45
|
+
FaissRangeSearchResult* rsr, idx_t** labels, float** distances);
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
/** Encapsulates a set of ids to remove. */
|
|
49
|
+
FAISS_DECLARE_CLASS(IDSelector)
|
|
50
|
+
FAISS_DECLARE_DESTRUCTOR(IDSelector)
|
|
51
|
+
|
|
52
|
+
int faiss_IDSelector_is_member(const FaissIDSelector* sel, idx_t id);
|
|
53
|
+
|
|
54
|
+
/** remove ids between [imni, imax) */
|
|
55
|
+
FAISS_DECLARE_CLASS(IDSelectorRange)
|
|
56
|
+
FAISS_DECLARE_DESTRUCTOR(IDSelectorRange)
|
|
57
|
+
|
|
58
|
+
FAISS_DECLARE_GETTER(IDSelectorRange, idx_t, imin)
|
|
59
|
+
FAISS_DECLARE_GETTER(IDSelectorRange, idx_t, imax)
|
|
60
|
+
|
|
61
|
+
int faiss_IDSelectorRange_new(FaissIDSelectorRange** p_sel, idx_t imin, idx_t imax);
|
|
62
|
+
|
|
63
|
+
/** Remove ids from a set. Repetitions of ids in the indices set
|
|
64
|
+
* passed to the constructor does not hurt performance. The hash
|
|
65
|
+
* function used for the bloom filter and GCC's implementation of
|
|
66
|
+
* unordered_set are just the least significant bits of the id. This
|
|
67
|
+
* works fine for random ids or ids in sequences but will produce many
|
|
68
|
+
* hash collisions if lsb's are always the same */
|
|
69
|
+
FAISS_DECLARE_CLASS(IDSelectorBatch)
|
|
70
|
+
|
|
71
|
+
FAISS_DECLARE_GETTER(IDSelectorBatch, int, nbits)
|
|
72
|
+
FAISS_DECLARE_GETTER(IDSelectorBatch, idx_t, mask)
|
|
73
|
+
|
|
74
|
+
int faiss_IDSelectorBatch_new(FaissIDSelectorBatch** p_sel, size_t n, const idx_t* indices);
|
|
75
|
+
|
|
76
|
+
// Below are structures used only by Index implementations
|
|
77
|
+
|
|
78
|
+
/** List of temporary buffers used to store results before they are
|
|
79
|
+
* copied to the RangeSearchResult object. */
|
|
80
|
+
FAISS_DECLARE_CLASS(BufferList)
|
|
81
|
+
FAISS_DECLARE_DESTRUCTOR(BufferList)
|
|
82
|
+
|
|
83
|
+
FAISS_DECLARE_GETTER(BufferList, size_t, buffer_size)
|
|
84
|
+
FAISS_DECLARE_GETTER(BufferList, size_t, wp)
|
|
85
|
+
|
|
86
|
+
typedef struct FaissBuffer {
|
|
87
|
+
idx_t *ids;
|
|
88
|
+
float *dis;
|
|
89
|
+
} FaissBuffer;
|
|
90
|
+
|
|
91
|
+
int faiss_BufferList_append_buffer(FaissBufferList* bl);
|
|
92
|
+
|
|
93
|
+
int faiss_BufferList_new(FaissBufferList** p_bl, size_t buffer_size);
|
|
94
|
+
|
|
95
|
+
int faiss_BufferList_add(FaissBufferList* bl, idx_t id, float dis);
|
|
96
|
+
|
|
97
|
+
/// copy elemnts ofs:ofs+n-1 seen as linear data in the buffers to
|
|
98
|
+
/// tables dest_ids, dest_dis
|
|
99
|
+
int faiss_BufferList_copy_range(
|
|
100
|
+
FaissBufferList* bl, size_t ofs, size_t n, idx_t *dest_ids, float *dest_dis);
|
|
101
|
+
|
|
102
|
+
/// the entries in the buffers are split per query
|
|
103
|
+
FAISS_DECLARE_CLASS(RangeSearchPartialResult)
|
|
104
|
+
|
|
105
|
+
/// result structure for a single query
|
|
106
|
+
FAISS_DECLARE_CLASS(RangeQueryResult)
|
|
107
|
+
FAISS_DECLARE_GETTER(RangeQueryResult, idx_t, qno)
|
|
108
|
+
FAISS_DECLARE_GETTER(RangeQueryResult, size_t, nres)
|
|
109
|
+
FAISS_DECLARE_GETTER(RangeQueryResult, FaissRangeSearchPartialResult*, pres)
|
|
110
|
+
|
|
111
|
+
int faiss_RangeQueryResult_add(FaissRangeQueryResult* qr, float dis, idx_t id);
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
FAISS_DECLARE_GETTER(RangeSearchPartialResult, FaissRangeSearchResult*, res)
|
|
115
|
+
|
|
116
|
+
int faiss_RangeSearchPartialResult_new(
|
|
117
|
+
FaissRangeSearchPartialResult** p_res, FaissRangeSearchResult* res_in);
|
|
118
|
+
|
|
119
|
+
int faiss_RangeSearchPartialResult_finalize(
|
|
120
|
+
FaissRangeSearchPartialResult* res);
|
|
121
|
+
|
|
122
|
+
/// called by range_search before do_allocation
|
|
123
|
+
int faiss_RangeSearchPartialResult_set_lims(
|
|
124
|
+
FaissRangeSearchPartialResult* res);
|
|
125
|
+
|
|
126
|
+
int faiss_RangeSearchPartialResult_new_result(
|
|
127
|
+
FaissRangeSearchPartialResult* res, idx_t qno, FaissRangeQueryResult** qr);
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
FAISS_DECLARE_CLASS(DistanceComputer)
|
|
131
|
+
/// called before computing distances
|
|
132
|
+
int faiss_DistanceComputer_set_query(FaissDistanceComputer *dc, const float *x);
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Compute distance of vector i to current query.
|
|
136
|
+
* This function corresponds to the function call operator: DistanceComputer::operator()
|
|
137
|
+
*/
|
|
138
|
+
int faiss_DistanceComputer_vector_to_query_dis( FaissDistanceComputer *dc, idx_t i, float *qd);
|
|
139
|
+
/// compute distance between two stored vectors
|
|
140
|
+
int faiss_DistanceComputer_symmetric_dis(FaissDistanceComputer *dc, idx_t i, idx_t j, float *vd);
|
|
141
|
+
|
|
142
|
+
FAISS_DECLARE_DESTRUCTOR(DistanceComputer)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
#ifdef __cplusplus
|
|
146
|
+
}
|
|
147
|
+
#endif
|
|
148
|
+
|
|
149
|
+
#endif
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
// Copyright 2004-present Facebook. All Rights Reserved.
|
|
9
|
+
// -*- c++ -*-
|
|
10
|
+
|
|
11
|
+
#include <cstring>
|
|
12
|
+
#include "index_factory.h"
|
|
13
|
+
#include "index_factory_c.h"
|
|
14
|
+
#include "macros_impl.h"
|
|
15
|
+
|
|
16
|
+
using faiss::Index;
|
|
17
|
+
|
|
18
|
+
/** Build and index with the sequence of processing steps described in
|
|
19
|
+
* the string.
|
|
20
|
+
*/
|
|
21
|
+
int faiss_index_factory(FaissIndex** p_index, int d, const char* description, FaissMetricType metric) {
|
|
22
|
+
try {
|
|
23
|
+
*p_index = reinterpret_cast<FaissIndex*>(faiss::index_factory(
|
|
24
|
+
d, description, static_cast<faiss::MetricType>(metric)));
|
|
25
|
+
} CATCH_AND_HANDLE
|
|
26
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
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
|
+
// Copyright 2004-present Facebook. All Rights Reserved.
|
|
9
|
+
// -*- c -*-
|
|
10
|
+
|
|
11
|
+
#ifndef FAISS_INDEX_FACTORY_C_H
|
|
12
|
+
#define FAISS_INDEX_FACTORY_C_H
|
|
13
|
+
|
|
14
|
+
#include "faiss_c.h"
|
|
15
|
+
#include "Index_c.h"
|
|
16
|
+
|
|
17
|
+
#ifdef __cplusplus
|
|
18
|
+
extern "C" {
|
|
19
|
+
#endif
|
|
20
|
+
|
|
21
|
+
/** Build and index with the sequence of processing steps described in
|
|
22
|
+
* the string.
|
|
23
|
+
*/
|
|
24
|
+
int faiss_index_factory(FaissIndex** p_index, int d, const char* description, FaissMetricType metric);
|
|
25
|
+
|
|
26
|
+
#ifdef __cplusplus
|
|
27
|
+
}
|
|
28
|
+
#endif
|
|
29
|
+
|
|
30
|
+
#endif
|
|
@@ -0,0 +1,42 @@
|
|
|
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
|
+
// Copyright 2004-present Facebook. All Rights Reserved
|
|
9
|
+
// -*- c++ -*-
|
|
10
|
+
// I/O code for indexes
|
|
11
|
+
|
|
12
|
+
#include "index_io_c.h"
|
|
13
|
+
#include "index_io.h"
|
|
14
|
+
#include "macros_impl.h"
|
|
15
|
+
|
|
16
|
+
using faiss::Index;
|
|
17
|
+
|
|
18
|
+
int faiss_write_index(const FaissIndex *idx, FILE *f) {
|
|
19
|
+
try {
|
|
20
|
+
faiss::write_index(reinterpret_cast<const Index*>(idx), f);
|
|
21
|
+
} CATCH_AND_HANDLE
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
int faiss_write_index_fname(const FaissIndex *idx, const char *fname) {
|
|
25
|
+
try {
|
|
26
|
+
faiss::write_index(reinterpret_cast<const Index*>(idx), fname);
|
|
27
|
+
} CATCH_AND_HANDLE
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
int faiss_read_index(FILE *f, int io_flags, FaissIndex **p_out) {
|
|
31
|
+
try {
|
|
32
|
+
auto out = faiss::read_index(f, io_flags);
|
|
33
|
+
*p_out = reinterpret_cast<FaissIndex*>(out);
|
|
34
|
+
} CATCH_AND_HANDLE
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
int faiss_read_index_fname(const char *fname, int io_flags, FaissIndex **p_out) {
|
|
38
|
+
try {
|
|
39
|
+
auto out = faiss::read_index(fname, io_flags);
|
|
40
|
+
*p_out = reinterpret_cast<FaissIndex*>(out);
|
|
41
|
+
} CATCH_AND_HANDLE
|
|
42
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
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
|
+
// Copyright 2004-present Facebook. All Rights Reserved
|
|
9
|
+
// -*- c++ -*-
|
|
10
|
+
// I/O code for indexes
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
#ifndef FAISS_INDEX_IO_C_H
|
|
14
|
+
#define FAISS_INDEX_IO_C_H
|
|
15
|
+
|
|
16
|
+
#include <stdio.h>
|
|
17
|
+
#include "faiss_c.h"
|
|
18
|
+
#include "Index_c.h"
|
|
19
|
+
|
|
20
|
+
#ifdef __cplusplus
|
|
21
|
+
extern "C" {
|
|
22
|
+
#endif
|
|
23
|
+
|
|
24
|
+
/** Write index to a file.
|
|
25
|
+
* This is equivalent to `faiss::write_index` when a file descriptor is provided.
|
|
26
|
+
*/
|
|
27
|
+
int faiss_write_index(const FaissIndex *idx, FILE *f);
|
|
28
|
+
|
|
29
|
+
/** Write index to a file.
|
|
30
|
+
* This is equivalent to `faiss::write_index` when a file path is provided.
|
|
31
|
+
*/
|
|
32
|
+
int faiss_write_index_fname(const FaissIndex *idx, const char *fname);
|
|
33
|
+
|
|
34
|
+
#define FAISS_IO_FLAG_MMAP 1
|
|
35
|
+
#define FAISS_IO_FLAG_READ_ONLY 2
|
|
36
|
+
|
|
37
|
+
/** Read index from a file.
|
|
38
|
+
* This is equivalent to `faiss:read_index` when a file descriptor is given.
|
|
39
|
+
*/
|
|
40
|
+
int faiss_read_index(FILE *f, int io_flags, FaissIndex **p_out);
|
|
41
|
+
|
|
42
|
+
/** Read index from a file.
|
|
43
|
+
* This is equivalent to `faiss:read_index` when a file path is given.
|
|
44
|
+
*/
|
|
45
|
+
int faiss_read_index_fname(const char *fname, int io_flags, FaissIndex **p_out);
|
|
46
|
+
|
|
47
|
+
#ifdef __cplusplus
|
|
48
|
+
}
|
|
49
|
+
#endif
|
|
50
|
+
#endif
|
|
@@ -0,0 +1,110 @@
|
|
|
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
|
+
// Copyright 2004-present Facebook. All Rights Reserved.
|
|
9
|
+
// -*- c++ -*-
|
|
10
|
+
|
|
11
|
+
/// Utility macros for the C wrapper implementation.
|
|
12
|
+
|
|
13
|
+
#ifndef MACROS_IMPL_H
|
|
14
|
+
#define MACROS_IMPL_H
|
|
15
|
+
|
|
16
|
+
#include "faiss_c.h"
|
|
17
|
+
#include "FaissException.h"
|
|
18
|
+
#include "error_impl.h"
|
|
19
|
+
#include <stdexcept>
|
|
20
|
+
#include <iostream>
|
|
21
|
+
|
|
22
|
+
#ifdef NDEBUG
|
|
23
|
+
#define CATCH_AND_HANDLE \
|
|
24
|
+
catch (faiss::FaissException& e) { \
|
|
25
|
+
faiss_last_exception = \
|
|
26
|
+
std::make_exception_ptr(e); \
|
|
27
|
+
return -2; \
|
|
28
|
+
} catch (std::exception& e) { \
|
|
29
|
+
faiss_last_exception = \
|
|
30
|
+
std::make_exception_ptr(e); \
|
|
31
|
+
return -4; \
|
|
32
|
+
} catch (...) { \
|
|
33
|
+
faiss_last_exception = \
|
|
34
|
+
std::make_exception_ptr( \
|
|
35
|
+
std::runtime_error("Unknown error")); \
|
|
36
|
+
return -1; \
|
|
37
|
+
} return 0;
|
|
38
|
+
#else
|
|
39
|
+
#define CATCH_AND_HANDLE \
|
|
40
|
+
catch (faiss::FaissException& e) { \
|
|
41
|
+
std::cerr << e.what() << '\n'; \
|
|
42
|
+
faiss_last_exception = \
|
|
43
|
+
std::make_exception_ptr(e); \
|
|
44
|
+
return -2; \
|
|
45
|
+
} catch (std::exception& e) { \
|
|
46
|
+
std::cerr << e.what() << '\n'; \
|
|
47
|
+
faiss_last_exception = \
|
|
48
|
+
std::make_exception_ptr(e); \
|
|
49
|
+
return -4; \
|
|
50
|
+
} catch (...) { \
|
|
51
|
+
std::cerr << "Unrecognized exception!\n"; \
|
|
52
|
+
faiss_last_exception = \
|
|
53
|
+
std::make_exception_ptr( \
|
|
54
|
+
std::runtime_error("Unknown error")); \
|
|
55
|
+
return -1; \
|
|
56
|
+
} return 0;
|
|
57
|
+
#endif
|
|
58
|
+
|
|
59
|
+
#define DEFINE_GETTER(clazz, ty, name) \
|
|
60
|
+
ty faiss_ ## clazz ## _ ## name (const Faiss ## clazz *obj) { \
|
|
61
|
+
return static_cast< ty >( \
|
|
62
|
+
reinterpret_cast< const faiss::clazz *>(obj)-> name \
|
|
63
|
+
); \
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
#define DEFINE_GETTER_SUBCLASS(clazz, parent, ty, name) \
|
|
67
|
+
ty faiss_ ## clazz ## _ ## name (const Faiss ## clazz *obj) { \
|
|
68
|
+
return static_cast< ty >( \
|
|
69
|
+
reinterpret_cast<const faiss::parent::clazz *>(obj)-> name \
|
|
70
|
+
); \
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
#define DEFINE_GETTER_PERMISSIVE(clazz, ty, name) \
|
|
74
|
+
ty faiss_ ## clazz ## _ ## name (const Faiss ## clazz *obj) { \
|
|
75
|
+
return ( ty ) ( \
|
|
76
|
+
reinterpret_cast<const faiss::clazz *>(obj)-> name \
|
|
77
|
+
); \
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
#define DEFINE_GETTER_SUBCLASS_PERMISSIVE(clazz, parent, ty, name) \
|
|
81
|
+
ty faiss_ ## clazz ## _ ## name (const Faiss ## clazz *obj) { \
|
|
82
|
+
return ( ty ) ( \
|
|
83
|
+
reinterpret_cast<const faiss::parent::clazz *>(obj)-> name \
|
|
84
|
+
); \
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
#define DEFINE_SETTER(clazz, ty, name) \
|
|
88
|
+
void faiss_ ## clazz ## _set_ ## name (Faiss ## clazz *obj, ty val) { \
|
|
89
|
+
reinterpret_cast< faiss::clazz *>(obj)-> name = val; \
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
#define DEFINE_SETTER_STATIC(clazz, ty_to, ty_from, name) \
|
|
93
|
+
void faiss_ ## clazz ## _set_ ## name (Faiss ## clazz *obj, ty_from val) { \
|
|
94
|
+
reinterpret_cast< faiss::clazz *>(obj)-> name = \
|
|
95
|
+
static_cast< ty_to >(val); \
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
#define DEFINE_DESTRUCTOR(clazz) \
|
|
99
|
+
void faiss_ ## clazz ## _free (Faiss ## clazz *obj) { \
|
|
100
|
+
delete reinterpret_cast<faiss::clazz *>(obj); \
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
#define DEFINE_INDEX_DOWNCAST(clazz) \
|
|
104
|
+
Faiss ## clazz * faiss_ ## clazz ## _cast (FaissIndex* index) { \
|
|
105
|
+
return reinterpret_cast<Faiss ## clazz *>( \
|
|
106
|
+
dynamic_cast< faiss::clazz *>( \
|
|
107
|
+
reinterpret_cast<faiss::Index*>(index))); \
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
#endif
|
|
@@ -0,0 +1,147 @@
|
|
|
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
|
+
#include <faiss/clone_index.h>
|
|
11
|
+
|
|
12
|
+
#include <cstdio>
|
|
13
|
+
#include <cstdlib>
|
|
14
|
+
|
|
15
|
+
#include <faiss/impl/FaissAssert.h>
|
|
16
|
+
|
|
17
|
+
#include <faiss/IndexFlat.h>
|
|
18
|
+
#include <faiss/VectorTransform.h>
|
|
19
|
+
#include <faiss/IndexPreTransform.h>
|
|
20
|
+
#include <faiss/IndexLSH.h>
|
|
21
|
+
#include <faiss/IndexPQ.h>
|
|
22
|
+
#include <faiss/IndexIVF.h>
|
|
23
|
+
#include <faiss/IndexIVFPQ.h>
|
|
24
|
+
#include <faiss/IndexIVFPQR.h>
|
|
25
|
+
#include <faiss/Index2Layer.h>
|
|
26
|
+
#include <faiss/IndexIVFFlat.h>
|
|
27
|
+
#include <faiss/IndexIVFSpectralHash.h>
|
|
28
|
+
#include <faiss/MetaIndexes.h>
|
|
29
|
+
#include <faiss/IndexScalarQuantizer.h>
|
|
30
|
+
#include <faiss/IndexHNSW.h>
|
|
31
|
+
#include <faiss/IndexLattice.h>
|
|
32
|
+
#include <faiss/Index2Layer.h>
|
|
33
|
+
|
|
34
|
+
namespace faiss {
|
|
35
|
+
|
|
36
|
+
/*************************************************************
|
|
37
|
+
* cloning functions
|
|
38
|
+
**************************************************************/
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
Index * clone_index (const Index *index)
|
|
43
|
+
{
|
|
44
|
+
Cloner cl;
|
|
45
|
+
return cl.clone_Index (index);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// assumes there is a copy constructor ready. Always try from most
|
|
49
|
+
// specific to most general. Most indexes don't have complicated
|
|
50
|
+
// structs, the default copy constructor often just works.
|
|
51
|
+
#define TRYCLONE(classname, obj) \
|
|
52
|
+
if (const classname *clo = dynamic_cast<const classname *>(obj)) { \
|
|
53
|
+
return new classname(*clo); \
|
|
54
|
+
} else
|
|
55
|
+
|
|
56
|
+
VectorTransform *Cloner::clone_VectorTransform (const VectorTransform *vt)
|
|
57
|
+
{
|
|
58
|
+
TRYCLONE (RemapDimensionsTransform, vt)
|
|
59
|
+
TRYCLONE (OPQMatrix, vt)
|
|
60
|
+
TRYCLONE (PCAMatrix, vt)
|
|
61
|
+
TRYCLONE (ITQMatrix, vt)
|
|
62
|
+
TRYCLONE (RandomRotationMatrix, vt)
|
|
63
|
+
TRYCLONE (LinearTransform, vt)
|
|
64
|
+
{
|
|
65
|
+
FAISS_THROW_MSG("clone not supported for this type of VectorTransform");
|
|
66
|
+
}
|
|
67
|
+
return nullptr;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
IndexIVF * Cloner::clone_IndexIVF (const IndexIVF *ivf)
|
|
71
|
+
{
|
|
72
|
+
TRYCLONE (IndexIVFPQR, ivf)
|
|
73
|
+
TRYCLONE (IndexIVFPQ, ivf)
|
|
74
|
+
TRYCLONE (IndexIVFFlat, ivf)
|
|
75
|
+
TRYCLONE (IndexIVFScalarQuantizer, ivf)
|
|
76
|
+
{
|
|
77
|
+
FAISS_THROW_MSG("clone not supported for this type of IndexIVF");
|
|
78
|
+
}
|
|
79
|
+
return nullptr;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
Index *Cloner::clone_Index (const Index *index)
|
|
83
|
+
{
|
|
84
|
+
TRYCLONE (IndexPQ, index)
|
|
85
|
+
TRYCLONE (IndexLSH, index)
|
|
86
|
+
TRYCLONE (IndexFlatL2, index)
|
|
87
|
+
TRYCLONE (IndexFlatIP, index)
|
|
88
|
+
TRYCLONE (IndexFlat, index)
|
|
89
|
+
TRYCLONE (IndexLattice, index)
|
|
90
|
+
TRYCLONE (IndexScalarQuantizer, index)
|
|
91
|
+
TRYCLONE (MultiIndexQuantizer, index)
|
|
92
|
+
if (const IndexIVF * ivf = dynamic_cast<const IndexIVF*>(index)) {
|
|
93
|
+
IndexIVF *res = clone_IndexIVF (ivf);
|
|
94
|
+
if (ivf->invlists == nullptr) {
|
|
95
|
+
res->invlists = nullptr;
|
|
96
|
+
} else if (auto *ails = dynamic_cast<const ArrayInvertedLists*>
|
|
97
|
+
(ivf->invlists)) {
|
|
98
|
+
res->invlists = new ArrayInvertedLists(*ails);
|
|
99
|
+
res->own_invlists = true;
|
|
100
|
+
} else {
|
|
101
|
+
FAISS_THROW_MSG( "clone not supported for this type of inverted lists");
|
|
102
|
+
}
|
|
103
|
+
res->own_fields = true;
|
|
104
|
+
res->quantizer = clone_Index (ivf->quantizer);
|
|
105
|
+
return res;
|
|
106
|
+
} else if (const IndexPreTransform * ipt =
|
|
107
|
+
dynamic_cast<const IndexPreTransform*> (index)) {
|
|
108
|
+
IndexPreTransform *res = new IndexPreTransform ();
|
|
109
|
+
res->d = ipt->d;
|
|
110
|
+
res->ntotal = ipt->ntotal;
|
|
111
|
+
res->is_trained = ipt->is_trained;
|
|
112
|
+
res->metric_type = ipt->metric_type;
|
|
113
|
+
res->metric_arg = ipt->metric_arg;
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
res->index = clone_Index (ipt->index);
|
|
117
|
+
for (int i = 0; i < ipt->chain.size(); i++)
|
|
118
|
+
res->chain.push_back (clone_VectorTransform (ipt->chain[i]));
|
|
119
|
+
res->own_fields = true;
|
|
120
|
+
return res;
|
|
121
|
+
} else if (const IndexIDMap *idmap =
|
|
122
|
+
dynamic_cast<const IndexIDMap*> (index)) {
|
|
123
|
+
IndexIDMap *res = new IndexIDMap (*idmap);
|
|
124
|
+
res->own_fields = true;
|
|
125
|
+
res->index = clone_Index (idmap->index);
|
|
126
|
+
return res;
|
|
127
|
+
} else if (const IndexHNSW *ihnsw =
|
|
128
|
+
dynamic_cast<const IndexHNSW*> (index)) {
|
|
129
|
+
IndexHNSW *res = new IndexHNSW (*ihnsw);
|
|
130
|
+
res->own_fields = true;
|
|
131
|
+
res->storage = clone_Index (ihnsw->storage);
|
|
132
|
+
return res;
|
|
133
|
+
} else if (const Index2Layer *i2l =
|
|
134
|
+
dynamic_cast<const Index2Layer*> (index)) {
|
|
135
|
+
Index2Layer *res = new Index2Layer (*i2l);
|
|
136
|
+
res->q1.own_fields = true;
|
|
137
|
+
res->q1.quantizer = clone_Index (i2l->q1.quantizer);
|
|
138
|
+
return res;
|
|
139
|
+
} else {
|
|
140
|
+
FAISS_THROW_MSG( "clone not supported for this type of Index");
|
|
141
|
+
}
|
|
142
|
+
return nullptr;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
} // namespace faiss
|