faiss 0.1.7 → 0.2.3
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 +18 -0
- data/README.md +7 -7
- data/ext/faiss/ext.cpp +1 -1
- data/ext/faiss/extconf.rb +8 -2
- data/ext/faiss/index.cpp +102 -69
- data/ext/faiss/index_binary.cpp +24 -30
- data/ext/faiss/kmeans.cpp +20 -16
- data/ext/faiss/numo.hpp +867 -0
- data/ext/faiss/pca_matrix.cpp +13 -14
- data/ext/faiss/product_quantizer.cpp +23 -24
- data/ext/faiss/utils.cpp +10 -37
- data/ext/faiss/utils.h +2 -13
- data/lib/faiss/version.rb +1 -1
- data/lib/faiss.rb +0 -5
- data/vendor/faiss/faiss/AutoTune.cpp +292 -291
- data/vendor/faiss/faiss/AutoTune.h +55 -56
- data/vendor/faiss/faiss/Clustering.cpp +334 -195
- data/vendor/faiss/faiss/Clustering.h +88 -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 +139 -164
- data/vendor/faiss/faiss/Index2Layer.h +22 -22
- 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 +116 -147
- data/vendor/faiss/faiss/IndexFlat.h +35 -46
- data/vendor/faiss/faiss/IndexHNSW.cpp +372 -348
- data/vendor/faiss/faiss/IndexHNSW.h +57 -41
- data/vendor/faiss/faiss/IndexIVF.cpp +474 -454
- data/vendor/faiss/faiss/IndexIVF.h +146 -113
- data/vendor/faiss/faiss/IndexIVFFlat.cpp +248 -250
- data/vendor/faiss/faiss/IndexIVFFlat.h +48 -51
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +457 -516
- data/vendor/faiss/faiss/IndexIVFPQ.h +74 -66
- 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 +125 -133
- data/vendor/faiss/faiss/IndexIVFSpectralHash.h +19 -21
- data/vendor/faiss/faiss/IndexLSH.cpp +75 -96
- data/vendor/faiss/faiss/IndexLSH.h +21 -26
- data/vendor/faiss/faiss/IndexLattice.cpp +42 -56
- data/vendor/faiss/faiss/IndexLattice.h +11 -16
- data/vendor/faiss/faiss/IndexNNDescent.cpp +231 -0
- data/vendor/faiss/faiss/IndexNNDescent.h +72 -0
- data/vendor/faiss/faiss/IndexNSG.cpp +303 -0
- data/vendor/faiss/faiss/IndexNSG.h +85 -0
- data/vendor/faiss/faiss/IndexPQ.cpp +405 -464
- data/vendor/faiss/faiss/IndexPQ.h +64 -67
- 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 +115 -131
- data/vendor/faiss/faiss/IndexRefine.h +22 -23
- data/vendor/faiss/faiss/IndexReplicas.cpp +147 -153
- data/vendor/faiss/faiss/IndexReplicas.h +62 -56
- data/vendor/faiss/faiss/IndexResidual.cpp +291 -0
- data/vendor/faiss/faiss/IndexResidual.h +152 -0
- data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +120 -155
- data/vendor/faiss/faiss/IndexScalarQuantizer.h +41 -45
- 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 +652 -474
- data/vendor/faiss/faiss/VectorTransform.h +61 -89
- data/vendor/faiss/faiss/clone_index.cpp +77 -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 +197 -170
- 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/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 +270 -0
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +115 -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 +595 -611
- data/vendor/faiss/faiss/impl/HNSW.h +179 -200
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +672 -0
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +172 -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 +682 -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 +448 -0
- data/vendor/faiss/faiss/impl/ResidualQuantizer.h +130 -0
- data/vendor/faiss/faiss/impl/ResultHandler.h +96 -132
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +648 -701
- 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 +547 -479
- data/vendor/faiss/faiss/impl/index_write.cpp +497 -407
- data/vendor/faiss/faiss/impl/io.cpp +75 -94
- data/vendor/faiss/faiss/impl/io.h +31 -41
- data/vendor/faiss/faiss/impl/io_macros.h +40 -29
- 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 +269 -218
- data/vendor/faiss/faiss/index_factory.h +6 -7
- 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 +301 -310
- data/vendor/faiss/faiss/utils/distances.h +133 -118
- data/vendor/faiss/faiss/utils/distances_simd.cpp +456 -516
- 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 +53 -48
- metadata +26 -12
- data/lib/faiss/index.rb +0 -20
- data/lib/faiss/index_binary.rb +0 -20
- data/lib/faiss/kmeans.rb +0 -15
- data/lib/faiss/pca_matrix.rb +0 -15
- data/lib/faiss/product_quantizer.rb +0 -22
|
@@ -12,85 +12,100 @@
|
|
|
12
12
|
|
|
13
13
|
#include <faiss/impl/FaissException.h>
|
|
14
14
|
#include <faiss/impl/platform_macros.h>
|
|
15
|
-
#include <cstdlib>
|
|
16
15
|
#include <cstdio>
|
|
16
|
+
#include <cstdlib>
|
|
17
17
|
#include <string>
|
|
18
18
|
|
|
19
19
|
///
|
|
20
20
|
/// Assertions
|
|
21
21
|
///
|
|
22
22
|
|
|
23
|
-
#define FAISS_ASSERT(X)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
23
|
+
#define FAISS_ASSERT(X) \
|
|
24
|
+
do { \
|
|
25
|
+
if (!(X)) { \
|
|
26
|
+
fprintf(stderr, \
|
|
27
|
+
"Faiss assertion '%s' failed in %s " \
|
|
28
|
+
"at %s:%d\n", \
|
|
29
|
+
#X, \
|
|
30
|
+
__PRETTY_FUNCTION__, \
|
|
31
|
+
__FILE__, \
|
|
32
|
+
__LINE__); \
|
|
33
|
+
abort(); \
|
|
34
|
+
} \
|
|
35
|
+
} while (false)
|
|
32
36
|
|
|
33
|
-
#define FAISS_ASSERT_MSG(X, MSG)
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
#define FAISS_ASSERT_MSG(X, MSG) \
|
|
38
|
+
do { \
|
|
39
|
+
if (!(X)) { \
|
|
40
|
+
fprintf(stderr, \
|
|
41
|
+
"Faiss assertion '%s' failed in %s " \
|
|
42
|
+
"at %s:%d; details: " MSG "\n", \
|
|
43
|
+
#X, \
|
|
44
|
+
__PRETTY_FUNCTION__, \
|
|
45
|
+
__FILE__, \
|
|
46
|
+
__LINE__); \
|
|
47
|
+
abort(); \
|
|
48
|
+
} \
|
|
49
|
+
} while (false)
|
|
42
50
|
|
|
43
|
-
#define FAISS_ASSERT_FMT(X, FMT, ...)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
51
|
+
#define FAISS_ASSERT_FMT(X, FMT, ...) \
|
|
52
|
+
do { \
|
|
53
|
+
if (!(X)) { \
|
|
54
|
+
fprintf(stderr, \
|
|
55
|
+
"Faiss assertion '%s' failed in %s " \
|
|
56
|
+
"at %s:%d; details: " FMT "\n", \
|
|
57
|
+
#X, \
|
|
58
|
+
__PRETTY_FUNCTION__, \
|
|
59
|
+
__FILE__, \
|
|
60
|
+
__LINE__, \
|
|
61
|
+
__VA_ARGS__); \
|
|
62
|
+
abort(); \
|
|
63
|
+
} \
|
|
64
|
+
} while (false)
|
|
52
65
|
|
|
53
66
|
///
|
|
54
67
|
/// Exceptions for returning user errors
|
|
55
68
|
///
|
|
56
69
|
|
|
57
|
-
#define FAISS_THROW_MSG(MSG)
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
70
|
+
#define FAISS_THROW_MSG(MSG) \
|
|
71
|
+
do { \
|
|
72
|
+
throw faiss::FaissException( \
|
|
73
|
+
MSG, __PRETTY_FUNCTION__, __FILE__, __LINE__); \
|
|
74
|
+
} while (false)
|
|
61
75
|
|
|
62
|
-
#define FAISS_THROW_FMT(FMT, ...)
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
76
|
+
#define FAISS_THROW_FMT(FMT, ...) \
|
|
77
|
+
do { \
|
|
78
|
+
std::string __s; \
|
|
79
|
+
int __size = snprintf(nullptr, 0, FMT, __VA_ARGS__); \
|
|
80
|
+
__s.resize(__size + 1); \
|
|
81
|
+
snprintf(&__s[0], __s.size(), FMT, __VA_ARGS__); \
|
|
82
|
+
throw faiss::FaissException( \
|
|
83
|
+
__s, __PRETTY_FUNCTION__, __FILE__, __LINE__); \
|
|
84
|
+
} while (false)
|
|
70
85
|
|
|
71
86
|
///
|
|
72
87
|
/// Exceptions thrown upon a conditional failure
|
|
73
88
|
///
|
|
74
89
|
|
|
75
|
-
#define FAISS_THROW_IF_NOT(X)
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
90
|
+
#define FAISS_THROW_IF_NOT(X) \
|
|
91
|
+
do { \
|
|
92
|
+
if (!(X)) { \
|
|
93
|
+
FAISS_THROW_FMT("Error: '%s' failed", #X); \
|
|
94
|
+
} \
|
|
95
|
+
} while (false)
|
|
81
96
|
|
|
82
|
-
#define FAISS_THROW_IF_NOT_MSG(X, MSG)
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
97
|
+
#define FAISS_THROW_IF_NOT_MSG(X, MSG) \
|
|
98
|
+
do { \
|
|
99
|
+
if (!(X)) { \
|
|
100
|
+
FAISS_THROW_FMT("Error: '%s' failed: " MSG, #X); \
|
|
101
|
+
} \
|
|
102
|
+
} while (false)
|
|
88
103
|
|
|
89
|
-
#define FAISS_THROW_IF_NOT_FMT(X, FMT, ...)
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
104
|
+
#define FAISS_THROW_IF_NOT_FMT(X, FMT, ...) \
|
|
105
|
+
do { \
|
|
106
|
+
if (!(X)) { \
|
|
107
|
+
FAISS_THROW_FMT("Error: '%s' failed: " FMT, #X, __VA_ARGS__); \
|
|
108
|
+
} \
|
|
109
|
+
} while (false)
|
|
95
110
|
|
|
96
111
|
#endif
|
|
@@ -10,71 +10,81 @@
|
|
|
10
10
|
#include <faiss/impl/FaissException.h>
|
|
11
11
|
#include <sstream>
|
|
12
12
|
|
|
13
|
-
#ifdef
|
|
13
|
+
#ifdef __GNUG__
|
|
14
14
|
#include <cxxabi.h>
|
|
15
15
|
#endif
|
|
16
16
|
|
|
17
17
|
namespace faiss {
|
|
18
18
|
|
|
19
|
-
FaissException::FaissException(const std::string& m)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
19
|
+
FaissException::FaissException(const std::string& m) : msg(m) {}
|
|
20
|
+
|
|
21
|
+
FaissException::FaissException(
|
|
22
|
+
const std::string& m,
|
|
23
|
+
const char* funcName,
|
|
24
|
+
const char* file,
|
|
25
|
+
int line) {
|
|
26
|
+
int size = snprintf(
|
|
27
|
+
nullptr,
|
|
28
|
+
0,
|
|
29
|
+
"Error in %s at %s:%d: %s",
|
|
30
|
+
funcName,
|
|
31
|
+
file,
|
|
32
|
+
line,
|
|
33
|
+
m.c_str());
|
|
34
|
+
msg.resize(size + 1);
|
|
35
|
+
snprintf(
|
|
36
|
+
&msg[0],
|
|
37
|
+
msg.size(),
|
|
38
|
+
"Error in %s at %s:%d: %s",
|
|
39
|
+
funcName,
|
|
40
|
+
file,
|
|
41
|
+
line,
|
|
42
|
+
m.c_str());
|
|
32
43
|
}
|
|
33
44
|
|
|
34
|
-
const char*
|
|
35
|
-
|
|
36
|
-
return msg.c_str();
|
|
45
|
+
const char* FaissException::what() const noexcept {
|
|
46
|
+
return msg.c_str();
|
|
37
47
|
}
|
|
38
48
|
|
|
39
49
|
void handleExceptions(
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
50
|
+
std::vector<std::pair<int, std::exception_ptr>>& exceptions) {
|
|
51
|
+
if (exceptions.size() == 1) {
|
|
52
|
+
// throw the single received exception directly
|
|
53
|
+
std::rethrow_exception(exceptions.front().second);
|
|
54
|
+
|
|
55
|
+
} else if (exceptions.size() > 1) {
|
|
56
|
+
// multiple exceptions; aggregate them and return a single exception
|
|
57
|
+
std::stringstream ss;
|
|
58
|
+
|
|
59
|
+
for (auto& p : exceptions) {
|
|
60
|
+
try {
|
|
61
|
+
std::rethrow_exception(p.second);
|
|
62
|
+
} catch (std::exception& ex) {
|
|
63
|
+
if (ex.what()) {
|
|
64
|
+
// exception message available
|
|
65
|
+
ss << "Exception thrown from index " << p.first << ": "
|
|
66
|
+
<< ex.what() << "\n";
|
|
67
|
+
} else {
|
|
68
|
+
// No message available
|
|
69
|
+
ss << "Unknown exception thrown from index " << p.first
|
|
70
|
+
<< "\n";
|
|
71
|
+
}
|
|
72
|
+
} catch (...) {
|
|
73
|
+
ss << "Unknown exception thrown from index " << p.first << "\n";
|
|
74
|
+
}
|
|
60
75
|
}
|
|
61
|
-
} catch (...) {
|
|
62
|
-
ss << "Unknown exception thrown from index " << p.first << "\n";
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
76
|
|
|
66
|
-
|
|
67
|
-
|
|
77
|
+
throw FaissException(ss.str());
|
|
78
|
+
}
|
|
68
79
|
}
|
|
69
80
|
|
|
70
|
-
|
|
71
81
|
// From
|
|
72
82
|
// https://stackoverflow.com/questions/281818/unmangling-the-result-of-stdtype-infoname
|
|
73
83
|
|
|
74
84
|
std::string demangle_cpp_symbol(const char* name) {
|
|
75
85
|
#ifdef __GNUG__
|
|
76
86
|
int status = -1;
|
|
77
|
-
const char
|
|
87
|
+
const char* res = abi::__cxa_demangle(name, nullptr, nullptr, &status);
|
|
78
88
|
std::string sres;
|
|
79
89
|
if (status == 0) {
|
|
80
90
|
sres = res;
|
|
@@ -87,6 +97,4 @@ std::string demangle_cpp_symbol(const char* name) {
|
|
|
87
97
|
#endif
|
|
88
98
|
}
|
|
89
99
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
} // namespace
|
|
100
|
+
} // namespace faiss
|
|
@@ -12,56 +12,69 @@
|
|
|
12
12
|
|
|
13
13
|
#include <exception>
|
|
14
14
|
#include <string>
|
|
15
|
-
#include <vector>
|
|
16
15
|
#include <utility>
|
|
16
|
+
#include <vector>
|
|
17
17
|
|
|
18
18
|
namespace faiss {
|
|
19
19
|
|
|
20
20
|
/// Base class for Faiss exceptions
|
|
21
21
|
class FaissException : public std::exception {
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
public:
|
|
23
|
+
explicit FaissException(const std::string& msg);
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
FaissException(
|
|
26
|
+
const std::string& msg,
|
|
27
|
+
const char* funcName,
|
|
28
|
+
const char* file,
|
|
29
|
+
int line);
|
|
29
30
|
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
/// from std::exception
|
|
32
|
+
const char* what() const noexcept override;
|
|
32
33
|
|
|
33
|
-
|
|
34
|
+
std::string msg;
|
|
34
35
|
};
|
|
35
36
|
|
|
36
37
|
/// Handle multiple exceptions from worker threads, throwing an appropriate
|
|
37
38
|
/// exception that aggregates the information
|
|
38
39
|
/// The pair int is the thread that generated the exception
|
|
39
|
-
void
|
|
40
|
-
|
|
40
|
+
void handleExceptions(
|
|
41
|
+
std::vector<std::pair<int, std::exception_ptr>>& exceptions);
|
|
41
42
|
|
|
42
43
|
/** bare-bones unique_ptr
|
|
43
44
|
* this one deletes with delete [] */
|
|
44
|
-
template<class T>
|
|
45
|
+
template <class T>
|
|
45
46
|
struct ScopeDeleter {
|
|
46
|
-
const T
|
|
47
|
-
explicit ScopeDeleter
|
|
48
|
-
void release
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
47
|
+
const T* ptr;
|
|
48
|
+
explicit ScopeDeleter(const T* ptr = nullptr) : ptr(ptr) {}
|
|
49
|
+
void release() {
|
|
50
|
+
ptr = nullptr;
|
|
51
|
+
}
|
|
52
|
+
void set(const T* ptr_in) {
|
|
53
|
+
ptr = ptr_in;
|
|
54
|
+
}
|
|
55
|
+
void swap(ScopeDeleter<T>& other) {
|
|
56
|
+
std::swap(ptr, other.ptr);
|
|
57
|
+
}
|
|
58
|
+
~ScopeDeleter() {
|
|
59
|
+
delete[] ptr;
|
|
53
60
|
}
|
|
54
61
|
};
|
|
55
62
|
|
|
56
63
|
/** same but deletes with the simple delete (least common case) */
|
|
57
|
-
template<class T>
|
|
64
|
+
template <class T>
|
|
58
65
|
struct ScopeDeleter1 {
|
|
59
|
-
const T
|
|
60
|
-
explicit ScopeDeleter1
|
|
61
|
-
void release
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
66
|
+
const T* ptr;
|
|
67
|
+
explicit ScopeDeleter1(const T* ptr = nullptr) : ptr(ptr) {}
|
|
68
|
+
void release() {
|
|
69
|
+
ptr = nullptr;
|
|
70
|
+
}
|
|
71
|
+
void set(const T* ptr_in) {
|
|
72
|
+
ptr = ptr_in;
|
|
73
|
+
}
|
|
74
|
+
void swap(ScopeDeleter1<T>& other) {
|
|
75
|
+
std::swap(ptr, other.ptr);
|
|
76
|
+
}
|
|
77
|
+
~ScopeDeleter1() {
|
|
65
78
|
delete ptr;
|
|
66
79
|
}
|
|
67
80
|
};
|
|
@@ -69,7 +82,6 @@ struct ScopeDeleter1 {
|
|
|
69
82
|
/// make typeids more readable
|
|
70
83
|
std::string demangle_cpp_symbol(const char* name);
|
|
71
84
|
|
|
72
|
-
|
|
73
|
-
}
|
|
85
|
+
} // namespace faiss
|
|
74
86
|
|
|
75
87
|
#endif
|