File tree 2 files changed +16
-0
lines changed
2 files changed +16
-0
lines changed Original file line number Diff line number Diff line change @@ -25,6 +25,7 @@ enum MetricType {
25
25
METRIC_L1, // /< L1 (aka cityblock)
26
26
METRIC_Linf, // /< infinity distance
27
27
METRIC_Lp, // /< L_p distance, p is given by a faiss::Index
28
+ METRIC_HAMMING, // /< Hamming distance for binary vectors
28
29
// / metric_arg
29
30
30
31
// / some additional metrics defined in scipy.spatial.distance
Original file line number Diff line number Diff line change 10
10
11
11
#include < faiss/MetricType.h>
12
12
#include < faiss/utils/distances.h>
13
+ #include < climits>
13
14
#include < type_traits>
15
+ #include < cstddef>
16
+ #include < faiss/utils/hamming_distance/common.h>
14
17
15
18
namespace faiss {
16
19
@@ -21,6 +24,7 @@ struct VectorDistance {
21
24
static constexpr bool is_similarity = is_similarity_metric(mt);
22
25
23
26
inline float operator ()(const float * x, const float * y) const ;
27
+ inline size_t operator ()(const uint8_t * x, const uint8_t * y) const ;
24
28
25
29
// heap template to use for this type of metric
26
30
using C = typename std::conditional<
@@ -43,6 +47,17 @@ inline float VectorDistance<METRIC_INNER_PRODUCT>::operator()(
43
47
return fvec_inner_product (x, y, d);
44
48
}
45
49
50
+ template <>
51
+ inline size_t VectorDistance<METRIC_HAMMING>::operator ()(
52
+ const uint8_t * x,
53
+ const uint8_t * y) const {
54
+ int h = 0 ;
55
+ for (size_t i = 0 ; i < d; i++) {
56
+ h += (int )hamdis_tab_ham_bytes[x[i] ^ y[i]];
57
+ }
58
+ return h;
59
+ }
60
+
46
61
template <>
47
62
inline float VectorDistance<METRIC_L1>::operator ()(
48
63
const float * x,
You can’t perform that action at this time.
0 commit comments