Skip to content

Commit c50158c

Browse files
authored
Merge pull request #4 from LiuRuoyu01/main
[feat]Add calculate hamming distance
2 parents 6797877 + e33a2e5 commit c50158c

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

faiss/MetricType.h

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ enum MetricType {
2525
METRIC_L1, ///< L1 (aka cityblock)
2626
METRIC_Linf, ///< infinity distance
2727
METRIC_Lp, ///< L_p distance, p is given by a faiss::Index
28+
METRIC_HAMMING, ///< Hamming distance for binary vectors
2829
/// metric_arg
2930

3031
/// some additional metrics defined in scipy.spatial.distance

faiss/utils/extra_distances-inl.h

+15
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010

1111
#include <faiss/MetricType.h>
1212
#include <faiss/utils/distances.h>
13+
#include <climits>
1314
#include <type_traits>
15+
#include <cstddef>
16+
#include <faiss/utils/hamming_distance/common.h>
1417

1518
namespace faiss {
1619

@@ -21,6 +24,7 @@ struct VectorDistance {
2124
static constexpr bool is_similarity = is_similarity_metric(mt);
2225

2326
inline float operator()(const float* x, const float* y) const;
27+
inline size_t operator()(const uint8_t* x, const uint8_t* y) const;
2428

2529
// heap template to use for this type of metric
2630
using C = typename std::conditional<
@@ -43,6 +47,17 @@ inline float VectorDistance<METRIC_INNER_PRODUCT>::operator()(
4347
return fvec_inner_product(x, y, d);
4448
}
4549

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+
4661
template <>
4762
inline float VectorDistance<METRIC_L1>::operator()(
4863
const float* x,

0 commit comments

Comments
 (0)