faiss 0.2.0 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -0
- data/LICENSE.txt +1 -1
- data/README.md +7 -7
- data/ext/faiss/extconf.rb +6 -3
- data/ext/faiss/numo.hpp +4 -4
- data/ext/faiss/utils.cpp +1 -1
- data/ext/faiss/utils.h +1 -1
- data/lib/faiss/version.rb +1 -1
- data/vendor/faiss/faiss/AutoTune.cpp +292 -291
- data/vendor/faiss/faiss/AutoTune.h +55 -56
- data/vendor/faiss/faiss/Clustering.cpp +365 -194
- data/vendor/faiss/faiss/Clustering.h +102 -35
- data/vendor/faiss/faiss/IVFlib.cpp +171 -195
- data/vendor/faiss/faiss/IVFlib.h +48 -51
- data/vendor/faiss/faiss/Index.cpp +85 -103
- data/vendor/faiss/faiss/Index.h +54 -48
- data/vendor/faiss/faiss/Index2Layer.cpp +126 -224
- data/vendor/faiss/faiss/Index2Layer.h +22 -36
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +407 -0
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.h +195 -0
- data/vendor/faiss/faiss/IndexBinary.cpp +45 -37
- data/vendor/faiss/faiss/IndexBinary.h +140 -132
- data/vendor/faiss/faiss/IndexBinaryFlat.cpp +73 -53
- data/vendor/faiss/faiss/IndexBinaryFlat.h +29 -24
- data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +46 -43
- data/vendor/faiss/faiss/IndexBinaryFromFloat.h +16 -15
- data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +215 -232
- data/vendor/faiss/faiss/IndexBinaryHNSW.h +25 -24
- data/vendor/faiss/faiss/IndexBinaryHash.cpp +182 -177
- data/vendor/faiss/faiss/IndexBinaryHash.h +41 -34
- data/vendor/faiss/faiss/IndexBinaryIVF.cpp +489 -461
- data/vendor/faiss/faiss/IndexBinaryIVF.h +97 -68
- data/vendor/faiss/faiss/IndexFlat.cpp +115 -176
- data/vendor/faiss/faiss/IndexFlat.h +42 -59
- data/vendor/faiss/faiss/IndexFlatCodes.cpp +67 -0
- data/vendor/faiss/faiss/IndexFlatCodes.h +47 -0
- data/vendor/faiss/faiss/IndexHNSW.cpp +372 -348
- data/vendor/faiss/faiss/IndexHNSW.h +57 -41
- data/vendor/faiss/faiss/IndexIVF.cpp +545 -453
- data/vendor/faiss/faiss/IndexIVF.h +169 -118
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +316 -0
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.h +121 -0
- data/vendor/faiss/faiss/IndexIVFFlat.cpp +247 -252
- data/vendor/faiss/faiss/IndexIVFFlat.h +48 -51
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +459 -517
- data/vendor/faiss/faiss/IndexIVFPQ.h +75 -67
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +406 -372
- data/vendor/faiss/faiss/IndexIVFPQFastScan.h +82 -57
- data/vendor/faiss/faiss/IndexIVFPQR.cpp +104 -102
- data/vendor/faiss/faiss/IndexIVFPQR.h +33 -28
- data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +163 -150
- data/vendor/faiss/faiss/IndexIVFSpectralHash.h +38 -25
- data/vendor/faiss/faiss/IndexLSH.cpp +66 -113
- data/vendor/faiss/faiss/IndexLSH.h +20 -38
- data/vendor/faiss/faiss/IndexLattice.cpp +42 -56
- data/vendor/faiss/faiss/IndexLattice.h +11 -16
- data/vendor/faiss/faiss/IndexNNDescent.cpp +229 -0
- data/vendor/faiss/faiss/IndexNNDescent.h +72 -0
- data/vendor/faiss/faiss/IndexNSG.cpp +301 -0
- data/vendor/faiss/faiss/IndexNSG.h +85 -0
- data/vendor/faiss/faiss/IndexPQ.cpp +387 -495
- data/vendor/faiss/faiss/IndexPQ.h +64 -82
- data/vendor/faiss/faiss/IndexPQFastScan.cpp +143 -170
- data/vendor/faiss/faiss/IndexPQFastScan.h +46 -32
- data/vendor/faiss/faiss/IndexPreTransform.cpp +120 -150
- data/vendor/faiss/faiss/IndexPreTransform.h +33 -36
- data/vendor/faiss/faiss/IndexRefine.cpp +139 -127
- data/vendor/faiss/faiss/IndexRefine.h +32 -23
- data/vendor/faiss/faiss/IndexReplicas.cpp +147 -153
- data/vendor/faiss/faiss/IndexReplicas.h +62 -56
- data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +111 -172
- data/vendor/faiss/faiss/IndexScalarQuantizer.h +41 -59
- data/vendor/faiss/faiss/IndexShards.cpp +256 -240
- data/vendor/faiss/faiss/IndexShards.h +85 -73
- data/vendor/faiss/faiss/MatrixStats.cpp +112 -97
- data/vendor/faiss/faiss/MatrixStats.h +7 -10
- data/vendor/faiss/faiss/MetaIndexes.cpp +135 -157
- data/vendor/faiss/faiss/MetaIndexes.h +40 -34
- data/vendor/faiss/faiss/MetricType.h +7 -7
- data/vendor/faiss/faiss/VectorTransform.cpp +654 -475
- data/vendor/faiss/faiss/VectorTransform.h +64 -89
- data/vendor/faiss/faiss/clone_index.cpp +78 -73
- data/vendor/faiss/faiss/clone_index.h +4 -9
- data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +33 -38
- data/vendor/faiss/faiss/gpu/GpuAutoTune.h +11 -9
- data/vendor/faiss/faiss/gpu/GpuCloner.cpp +198 -171
- data/vendor/faiss/faiss/gpu/GpuCloner.h +53 -35
- data/vendor/faiss/faiss/gpu/GpuClonerOptions.cpp +12 -14
- data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +27 -25
- data/vendor/faiss/faiss/gpu/GpuDistance.h +116 -112
- data/vendor/faiss/faiss/gpu/GpuFaissAssert.h +1 -2
- data/vendor/faiss/faiss/gpu/GpuIcmEncoder.h +60 -0
- data/vendor/faiss/faiss/gpu/GpuIndex.h +134 -137
- data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +76 -73
- data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +173 -162
- data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +67 -64
- data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +89 -86
- data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +150 -141
- data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +101 -103
- data/vendor/faiss/faiss/gpu/GpuIndicesOptions.h +17 -16
- data/vendor/faiss/faiss/gpu/GpuResources.cpp +116 -128
- data/vendor/faiss/faiss/gpu/GpuResources.h +182 -186
- data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +433 -422
- data/vendor/faiss/faiss/gpu/StandardGpuResources.h +131 -130
- data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.cpp +468 -456
- data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.h +25 -19
- data/vendor/faiss/faiss/gpu/impl/RemapIndices.cpp +22 -20
- data/vendor/faiss/faiss/gpu/impl/RemapIndices.h +9 -8
- data/vendor/faiss/faiss/gpu/perf/IndexWrapper-inl.h +39 -44
- data/vendor/faiss/faiss/gpu/perf/IndexWrapper.h +16 -14
- data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +77 -71
- data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +109 -88
- data/vendor/faiss/faiss/gpu/perf/WriteIndex.cpp +75 -64
- data/vendor/faiss/faiss/gpu/test/TestCodePacking.cpp +230 -215
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +80 -86
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +284 -277
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +416 -416
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +611 -517
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +166 -164
- data/vendor/faiss/faiss/gpu/test/TestGpuMemoryException.cpp +61 -53
- data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +274 -238
- data/vendor/faiss/faiss/gpu/test/TestUtils.h +73 -57
- data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +47 -50
- data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +79 -72
- data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +140 -146
- data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.h +69 -71
- data/vendor/faiss/faiss/gpu/utils/StaticUtils.h +21 -16
- data/vendor/faiss/faiss/gpu/utils/Timer.cpp +25 -29
- data/vendor/faiss/faiss/gpu/utils/Timer.h +30 -29
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +503 -0
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +175 -0
- data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +90 -120
- data/vendor/faiss/faiss/impl/AuxIndexStructures.h +81 -65
- data/vendor/faiss/faiss/impl/FaissAssert.h +73 -58
- data/vendor/faiss/faiss/impl/FaissException.cpp +56 -48
- data/vendor/faiss/faiss/impl/FaissException.h +41 -29
- data/vendor/faiss/faiss/impl/HNSW.cpp +606 -617
- data/vendor/faiss/faiss/impl/HNSW.h +179 -200
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +855 -0
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +244 -0
- data/vendor/faiss/faiss/impl/NNDescent.cpp +487 -0
- data/vendor/faiss/faiss/impl/NNDescent.h +154 -0
- data/vendor/faiss/faiss/impl/NSG.cpp +679 -0
- data/vendor/faiss/faiss/impl/NSG.h +199 -0
- data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +484 -454
- data/vendor/faiss/faiss/impl/PolysemousTraining.h +52 -55
- data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +26 -47
- data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +469 -459
- data/vendor/faiss/faiss/impl/ProductQuantizer.h +76 -87
- data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +758 -0
- data/vendor/faiss/faiss/impl/ResidualQuantizer.h +188 -0
- data/vendor/faiss/faiss/impl/ResultHandler.h +96 -132
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +647 -707
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +48 -46
- data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +129 -131
- data/vendor/faiss/faiss/impl/ThreadedIndex.h +61 -55
- data/vendor/faiss/faiss/impl/index_read.cpp +631 -480
- data/vendor/faiss/faiss/impl/index_write.cpp +547 -407
- data/vendor/faiss/faiss/impl/io.cpp +76 -95
- data/vendor/faiss/faiss/impl/io.h +31 -41
- data/vendor/faiss/faiss/impl/io_macros.h +60 -29
- data/vendor/faiss/faiss/impl/kmeans1d.cpp +301 -0
- data/vendor/faiss/faiss/impl/kmeans1d.h +48 -0
- data/vendor/faiss/faiss/impl/lattice_Zn.cpp +137 -186
- data/vendor/faiss/faiss/impl/lattice_Zn.h +40 -51
- data/vendor/faiss/faiss/impl/platform_macros.h +29 -8
- data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +77 -124
- data/vendor/faiss/faiss/impl/pq4_fast_scan.h +39 -48
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +41 -52
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +80 -117
- data/vendor/faiss/faiss/impl/simd_result_handlers.h +109 -137
- data/vendor/faiss/faiss/index_factory.cpp +619 -397
- data/vendor/faiss/faiss/index_factory.h +8 -6
- data/vendor/faiss/faiss/index_io.h +23 -26
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +67 -75
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +22 -24
- data/vendor/faiss/faiss/invlists/DirectMap.cpp +96 -112
- data/vendor/faiss/faiss/invlists/DirectMap.h +29 -33
- data/vendor/faiss/faiss/invlists/InvertedLists.cpp +307 -364
- data/vendor/faiss/faiss/invlists/InvertedLists.h +151 -151
- data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +29 -34
- data/vendor/faiss/faiss/invlists/InvertedListsIOHook.h +17 -18
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +257 -293
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +50 -45
- data/vendor/faiss/faiss/python/python_callbacks.cpp +23 -26
- data/vendor/faiss/faiss/python/python_callbacks.h +9 -16
- data/vendor/faiss/faiss/utils/AlignedTable.h +79 -44
- data/vendor/faiss/faiss/utils/Heap.cpp +40 -48
- data/vendor/faiss/faiss/utils/Heap.h +186 -209
- data/vendor/faiss/faiss/utils/WorkerThread.cpp +67 -76
- data/vendor/faiss/faiss/utils/WorkerThread.h +32 -33
- data/vendor/faiss/faiss/utils/distances.cpp +305 -312
- data/vendor/faiss/faiss/utils/distances.h +170 -122
- data/vendor/faiss/faiss/utils/distances_simd.cpp +498 -508
- data/vendor/faiss/faiss/utils/extra_distances-inl.h +117 -0
- data/vendor/faiss/faiss/utils/extra_distances.cpp +113 -232
- data/vendor/faiss/faiss/utils/extra_distances.h +30 -29
- data/vendor/faiss/faiss/utils/hamming-inl.h +260 -209
- data/vendor/faiss/faiss/utils/hamming.cpp +375 -469
- data/vendor/faiss/faiss/utils/hamming.h +62 -85
- data/vendor/faiss/faiss/utils/ordered_key_value.h +16 -18
- data/vendor/faiss/faiss/utils/partitioning.cpp +393 -318
- data/vendor/faiss/faiss/utils/partitioning.h +26 -21
- data/vendor/faiss/faiss/utils/quantize_lut.cpp +78 -66
- data/vendor/faiss/faiss/utils/quantize_lut.h +22 -20
- data/vendor/faiss/faiss/utils/random.cpp +39 -63
- data/vendor/faiss/faiss/utils/random.h +13 -16
- data/vendor/faiss/faiss/utils/simdlib.h +4 -2
- data/vendor/faiss/faiss/utils/simdlib_avx2.h +88 -85
- data/vendor/faiss/faiss/utils/simdlib_emulated.h +226 -165
- data/vendor/faiss/faiss/utils/simdlib_neon.h +832 -0
- data/vendor/faiss/faiss/utils/utils.cpp +304 -287
- data/vendor/faiss/faiss/utils/utils.h +54 -49
- metadata +29 -4
|
@@ -5,8 +5,6 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
// -*- c++ -*-
|
|
9
|
-
|
|
10
8
|
#pragma once
|
|
11
9
|
|
|
12
10
|
#include <faiss/Index.h>
|
|
@@ -16,10 +14,14 @@ namespace faiss {
|
|
|
16
14
|
|
|
17
15
|
/** Build and index with the sequence of processing steps described in
|
|
18
16
|
* the string. */
|
|
19
|
-
Index
|
|
20
|
-
|
|
17
|
+
Index* index_factory(
|
|
18
|
+
int d,
|
|
19
|
+
const char* description,
|
|
20
|
+
MetricType metric = METRIC_L2);
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
/// set to > 0 to get more logs from index_factory
|
|
23
|
+
FAISS_API extern int index_factory_verbose;
|
|
23
24
|
|
|
25
|
+
IndexBinary* index_binary_factory(int d, const char* description);
|
|
24
26
|
|
|
25
|
-
}
|
|
27
|
+
} // namespace faiss
|
|
@@ -12,10 +12,9 @@
|
|
|
12
12
|
#ifndef FAISS_INDEX_IO_H
|
|
13
13
|
#define FAISS_INDEX_IO_H
|
|
14
14
|
|
|
15
|
-
|
|
16
15
|
#include <cstdio>
|
|
17
|
-
#include <typeinfo>
|
|
18
16
|
#include <string>
|
|
17
|
+
#include <typeinfo>
|
|
19
18
|
#include <vector>
|
|
20
19
|
|
|
21
20
|
/** I/O functions can read/write to a filename, a file handle or to an
|
|
@@ -36,13 +35,13 @@ struct IOReader;
|
|
|
36
35
|
struct IOWriter;
|
|
37
36
|
struct InvertedLists;
|
|
38
37
|
|
|
39
|
-
void write_index
|
|
40
|
-
void write_index
|
|
41
|
-
void write_index
|
|
38
|
+
void write_index(const Index* idx, const char* fname);
|
|
39
|
+
void write_index(const Index* idx, FILE* f);
|
|
40
|
+
void write_index(const Index* idx, IOWriter* writer);
|
|
42
41
|
|
|
43
|
-
void write_index_binary
|
|
44
|
-
void write_index_binary
|
|
45
|
-
void write_index_binary
|
|
42
|
+
void write_index_binary(const IndexBinary* idx, const char* fname);
|
|
43
|
+
void write_index_binary(const IndexBinary* idx, FILE* f);
|
|
44
|
+
void write_index_binary(const IndexBinary* idx, IOWriter* writer);
|
|
46
45
|
|
|
47
46
|
// The read_index flags are implemented only for a subset of index types.
|
|
48
47
|
const int IO_FLAG_READ_ONLY = 2;
|
|
@@ -51,32 +50,30 @@ const int IO_FLAG_READ_ONLY = 2;
|
|
|
51
50
|
const int IO_FLAG_ONDISK_SAME_DIR = 4;
|
|
52
51
|
// don't load IVF data to RAM, only list sizes
|
|
53
52
|
const int IO_FLAG_SKIP_IVF_DATA = 8;
|
|
54
|
-
// try to memmap data (useful to load an ArrayInvertedLists as an
|
|
53
|
+
// try to memmap data (useful to load an ArrayInvertedLists as an
|
|
54
|
+
// OnDiskInvertedLists)
|
|
55
55
|
const int IO_FLAG_MMAP = IO_FLAG_SKIP_IVF_DATA | 0x646f0000;
|
|
56
56
|
|
|
57
|
+
Index* read_index(const char* fname, int io_flags = 0);
|
|
58
|
+
Index* read_index(FILE* f, int io_flags = 0);
|
|
59
|
+
Index* read_index(IOReader* reader, int io_flags = 0);
|
|
57
60
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
+
IndexBinary* read_index_binary(const char* fname, int io_flags = 0);
|
|
62
|
+
IndexBinary* read_index_binary(FILE* f, int io_flags = 0);
|
|
63
|
+
IndexBinary* read_index_binary(IOReader* reader, int io_flags = 0);
|
|
61
64
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
IndexBinary *read_index_binary (IOReader *reader, int io_flags = 0);
|
|
65
|
+
void write_VectorTransform(const VectorTransform* vt, const char* fname);
|
|
66
|
+
VectorTransform* read_VectorTransform(const char* fname);
|
|
65
67
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
+
ProductQuantizer* read_ProductQuantizer(const char* fname);
|
|
69
|
+
ProductQuantizer* read_ProductQuantizer(IOReader* reader);
|
|
68
70
|
|
|
69
|
-
ProductQuantizer
|
|
70
|
-
ProductQuantizer
|
|
71
|
-
|
|
72
|
-
void write_ProductQuantizer (const ProductQuantizer*pq, const char *fname);
|
|
73
|
-
void write_ProductQuantizer (const ProductQuantizer*pq, IOWriter *f);
|
|
74
|
-
|
|
75
|
-
void write_InvertedLists (const InvertedLists *ils, IOWriter *f);
|
|
76
|
-
InvertedLists *read_InvertedLists (IOReader *reader, int io_flags = 0);
|
|
71
|
+
void write_ProductQuantizer(const ProductQuantizer* pq, const char* fname);
|
|
72
|
+
void write_ProductQuantizer(const ProductQuantizer* pq, IOWriter* f);
|
|
77
73
|
|
|
74
|
+
void write_InvertedLists(const InvertedLists* ils, IOWriter* f);
|
|
75
|
+
InvertedLists* read_InvertedLists(IOReader* reader, int io_flags = 0);
|
|
78
76
|
|
|
79
77
|
} // namespace faiss
|
|
80
78
|
|
|
81
|
-
|
|
82
79
|
#endif
|
|
@@ -12,81 +12,80 @@
|
|
|
12
12
|
#include <faiss/impl/io.h>
|
|
13
13
|
#include <faiss/impl/io_macros.h>
|
|
14
14
|
|
|
15
|
-
|
|
16
15
|
namespace faiss {
|
|
17
16
|
|
|
18
|
-
BlockInvertedLists::BlockInvertedLists
|
|
19
|
-
size_t nlist,
|
|
20
|
-
size_t
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
17
|
+
BlockInvertedLists::BlockInvertedLists(
|
|
18
|
+
size_t nlist,
|
|
19
|
+
size_t n_per_block,
|
|
20
|
+
size_t block_size)
|
|
21
|
+
: InvertedLists(nlist, InvertedLists::INVALID_CODE_SIZE),
|
|
22
|
+
n_per_block(n_per_block),
|
|
23
|
+
block_size(block_size) {
|
|
24
|
+
ids.resize(nlist);
|
|
25
|
+
codes.resize(nlist);
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
BlockInvertedLists::BlockInvertedLists
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
{}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
size_t
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
{
|
|
38
|
-
if (n_entry == 0)
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
28
|
+
BlockInvertedLists::BlockInvertedLists()
|
|
29
|
+
: InvertedLists(0, InvertedLists::INVALID_CODE_SIZE),
|
|
30
|
+
n_per_block(0),
|
|
31
|
+
block_size(0) {}
|
|
32
|
+
|
|
33
|
+
size_t BlockInvertedLists::add_entries(
|
|
34
|
+
size_t list_no,
|
|
35
|
+
size_t n_entry,
|
|
36
|
+
const idx_t* ids_in,
|
|
37
|
+
const uint8_t* code) {
|
|
38
|
+
if (n_entry == 0)
|
|
39
|
+
return 0;
|
|
40
|
+
FAISS_THROW_IF_NOT(list_no < nlist);
|
|
41
|
+
size_t o = ids[list_no].size();
|
|
42
|
+
FAISS_THROW_IF_NOT(
|
|
43
|
+
o == 0); // not clear how we should handle subsequent adds
|
|
44
|
+
ids[list_no].resize(o + n_entry);
|
|
45
|
+
memcpy(&ids[list_no][o], ids_in, sizeof(ids_in[0]) * n_entry);
|
|
44
46
|
|
|
45
47
|
// copy whole blocks
|
|
46
48
|
size_t n_block = (n_entry + n_per_block - 1) / n_per_block;
|
|
47
|
-
codes
|
|
48
|
-
memcpy
|
|
49
|
+
codes[list_no].resize(n_block * block_size);
|
|
50
|
+
memcpy(&codes[list_no][o * code_size], code, n_block * block_size);
|
|
49
51
|
return o;
|
|
50
52
|
}
|
|
51
53
|
|
|
52
|
-
size_t BlockInvertedLists::list_size(size_t list_no) const
|
|
53
|
-
|
|
54
|
-
assert (list_no < nlist);
|
|
54
|
+
size_t BlockInvertedLists::list_size(size_t list_no) const {
|
|
55
|
+
assert(list_no < nlist);
|
|
55
56
|
return ids[list_no].size();
|
|
56
57
|
}
|
|
57
58
|
|
|
58
|
-
const uint8_t
|
|
59
|
-
|
|
60
|
-
assert (list_no < nlist);
|
|
59
|
+
const uint8_t* BlockInvertedLists::get_codes(size_t list_no) const {
|
|
60
|
+
assert(list_no < nlist);
|
|
61
61
|
return codes[list_no].get();
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
const InvertedLists::idx_t
|
|
65
|
-
|
|
66
|
-
assert (list_no < nlist);
|
|
64
|
+
const InvertedLists::idx_t* BlockInvertedLists::get_ids(size_t list_no) const {
|
|
65
|
+
assert(list_no < nlist);
|
|
67
66
|
return ids[list_no].data();
|
|
68
67
|
}
|
|
69
68
|
|
|
70
|
-
void BlockInvertedLists::resize
|
|
71
|
-
|
|
72
|
-
ids[list_no].resize (new_size);
|
|
69
|
+
void BlockInvertedLists::resize(size_t list_no, size_t new_size) {
|
|
70
|
+
ids[list_no].resize(new_size);
|
|
73
71
|
size_t prev_nbytes = codes[list_no].size();
|
|
74
72
|
size_t n_block = (new_size + n_per_block - 1) / n_per_block;
|
|
75
73
|
size_t new_nbytes = n_block * block_size;
|
|
76
|
-
codes[list_no].resize
|
|
74
|
+
codes[list_no].resize(new_nbytes);
|
|
77
75
|
if (prev_nbytes < new_nbytes) {
|
|
78
76
|
// set new elements to 0
|
|
79
|
-
memset(
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
);
|
|
77
|
+
memset(codes[list_no].data() + prev_nbytes,
|
|
78
|
+
0,
|
|
79
|
+
new_nbytes - prev_nbytes);
|
|
83
80
|
}
|
|
84
81
|
}
|
|
85
82
|
|
|
86
|
-
void BlockInvertedLists::update_entries
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
83
|
+
void BlockInvertedLists::update_entries(
|
|
84
|
+
size_t,
|
|
85
|
+
size_t,
|
|
86
|
+
size_t,
|
|
87
|
+
const idx_t*,
|
|
88
|
+
const uint8_t*) {
|
|
90
89
|
FAISS_THROW_MSG("not impemented");
|
|
91
90
|
/*
|
|
92
91
|
assert (list_no < nlist);
|
|
@@ -96,29 +95,25 @@ void BlockInvertedLists::update_entries (
|
|
|
96
95
|
*/
|
|
97
96
|
}
|
|
98
97
|
|
|
99
|
-
|
|
100
|
-
BlockInvertedLists::~BlockInvertedLists ()
|
|
101
|
-
{}
|
|
98
|
+
BlockInvertedLists::~BlockInvertedLists() {}
|
|
102
99
|
|
|
103
100
|
/**************************************************
|
|
104
101
|
* IO hook implementation
|
|
105
102
|
**************************************************/
|
|
106
103
|
|
|
107
|
-
BlockInvertedListsIOHook::BlockInvertedListsIOHook()
|
|
108
|
-
|
|
109
|
-
{}
|
|
110
|
-
|
|
104
|
+
BlockInvertedListsIOHook::BlockInvertedListsIOHook()
|
|
105
|
+
: InvertedListsIOHook("ilbl", typeid(BlockInvertedLists).name()) {}
|
|
111
106
|
|
|
112
|
-
void BlockInvertedListsIOHook::write(const InvertedLists
|
|
113
|
-
{
|
|
114
|
-
uint32_t h = fourcc
|
|
115
|
-
WRITE1
|
|
116
|
-
const BlockInvertedLists
|
|
117
|
-
|
|
118
|
-
WRITE1
|
|
119
|
-
WRITE1
|
|
120
|
-
WRITE1
|
|
121
|
-
WRITE1
|
|
107
|
+
void BlockInvertedListsIOHook::write(const InvertedLists* ils_in, IOWriter* f)
|
|
108
|
+
const {
|
|
109
|
+
uint32_t h = fourcc("ilbl");
|
|
110
|
+
WRITE1(h);
|
|
111
|
+
const BlockInvertedLists* il =
|
|
112
|
+
dynamic_cast<const BlockInvertedLists*>(ils_in);
|
|
113
|
+
WRITE1(il->nlist);
|
|
114
|
+
WRITE1(il->code_size);
|
|
115
|
+
WRITE1(il->n_per_block);
|
|
116
|
+
WRITE1(il->block_size);
|
|
122
117
|
|
|
123
118
|
for (size_t i = 0; i < il->nlist; i++) {
|
|
124
119
|
WRITEVECTOR(il->ids[i]);
|
|
@@ -126,13 +121,13 @@ void BlockInvertedListsIOHook::write(const InvertedLists *ils_in, IOWriter *f) c
|
|
|
126
121
|
}
|
|
127
122
|
}
|
|
128
123
|
|
|
129
|
-
InvertedLists
|
|
130
|
-
{
|
|
131
|
-
BlockInvertedLists
|
|
132
|
-
READ1
|
|
133
|
-
READ1
|
|
134
|
-
READ1
|
|
135
|
-
READ1
|
|
124
|
+
InvertedLists* BlockInvertedListsIOHook::read(IOReader* f, int /* io_flags */)
|
|
125
|
+
const {
|
|
126
|
+
BlockInvertedLists* il = new BlockInvertedLists();
|
|
127
|
+
READ1(il->nlist);
|
|
128
|
+
READ1(il->code_size);
|
|
129
|
+
READ1(il->n_per_block);
|
|
130
|
+
READ1(il->block_size);
|
|
136
131
|
|
|
137
132
|
il->ids.resize(il->nlist);
|
|
138
133
|
il->codes.resize(il->nlist);
|
|
@@ -145,7 +140,4 @@ InvertedLists * BlockInvertedListsIOHook::read(IOReader *f, int /* io_flags */)
|
|
|
145
140
|
return il;
|
|
146
141
|
}
|
|
147
142
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
143
|
} // namespace faiss
|
|
@@ -5,13 +5,12 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
|
|
9
8
|
#pragma once
|
|
10
9
|
|
|
10
|
+
#include <faiss/index_io.h>
|
|
11
11
|
#include <faiss/invlists/InvertedLists.h>
|
|
12
12
|
#include <faiss/invlists/InvertedListsIOHook.h>
|
|
13
13
|
#include <faiss/utils/AlignedTable.h>
|
|
14
|
-
#include <faiss/index_io.h>
|
|
15
14
|
|
|
16
15
|
namespace faiss {
|
|
17
16
|
|
|
@@ -28,49 +27,48 @@ namespace faiss {
|
|
|
28
27
|
* The writing functions add_entries and update_entries operate on block-aligned
|
|
29
28
|
* data.
|
|
30
29
|
*/
|
|
31
|
-
struct BlockInvertedLists: InvertedLists {
|
|
32
|
-
|
|
33
|
-
size_t
|
|
34
|
-
size_t block_size; // nb bytes per block
|
|
30
|
+
struct BlockInvertedLists : InvertedLists {
|
|
31
|
+
size_t n_per_block; // nb of vectors stored per block
|
|
32
|
+
size_t block_size; // nb bytes per block
|
|
35
33
|
|
|
36
34
|
std::vector<AlignedTable<uint8_t>> codes;
|
|
37
35
|
std::vector<std::vector<idx_t>> ids;
|
|
38
36
|
|
|
39
|
-
|
|
40
|
-
BlockInvertedLists (
|
|
41
|
-
size_t nlist, size_t vec_per_block,
|
|
42
|
-
size_t block_size
|
|
43
|
-
);
|
|
37
|
+
BlockInvertedLists(size_t nlist, size_t vec_per_block, size_t block_size);
|
|
44
38
|
|
|
45
39
|
BlockInvertedLists();
|
|
46
40
|
|
|
47
41
|
size_t list_size(size_t list_no) const override;
|
|
48
|
-
const uint8_t
|
|
49
|
-
const idx_t
|
|
42
|
+
const uint8_t* get_codes(size_t list_no) const override;
|
|
43
|
+
const idx_t* get_ids(size_t list_no) const override;
|
|
50
44
|
|
|
51
45
|
// works only on empty BlockInvertedLists
|
|
52
46
|
// the codes should be of size ceil(n_entry / n_per_block) * block_size
|
|
53
47
|
// and padded with 0s
|
|
54
|
-
size_t add_entries
|
|
55
|
-
|
|
56
|
-
|
|
48
|
+
size_t add_entries(
|
|
49
|
+
size_t list_no,
|
|
50
|
+
size_t n_entry,
|
|
51
|
+
const idx_t* ids,
|
|
52
|
+
const uint8_t* code) override;
|
|
57
53
|
|
|
58
54
|
/// not implemented
|
|
59
|
-
void update_entries
|
|
60
|
-
|
|
55
|
+
void update_entries(
|
|
56
|
+
size_t list_no,
|
|
57
|
+
size_t offset,
|
|
58
|
+
size_t n_entry,
|
|
59
|
+
const idx_t* ids,
|
|
60
|
+
const uint8_t* code) override;
|
|
61
61
|
|
|
62
62
|
// also pads new data with 0s
|
|
63
|
-
void resize
|
|
64
|
-
|
|
65
|
-
~BlockInvertedLists () override;
|
|
63
|
+
void resize(size_t list_no, size_t new_size) override;
|
|
66
64
|
|
|
65
|
+
~BlockInvertedLists() override;
|
|
67
66
|
};
|
|
68
67
|
|
|
69
68
|
struct BlockInvertedListsIOHook : InvertedListsIOHook {
|
|
70
69
|
BlockInvertedListsIOHook();
|
|
71
|
-
void write(const InvertedLists
|
|
72
|
-
InvertedLists
|
|
70
|
+
void write(const InvertedLists* ils, IOWriter* f) const override;
|
|
71
|
+
InvertedLists* read(IOReader* f, int io_flags) const override;
|
|
73
72
|
};
|
|
74
73
|
|
|
75
|
-
|
|
76
74
|
} // namespace faiss
|