Skip to content

Commit 2e9f95e

Browse files
committed
feat(quantization): add EVP quantization and symmetric inner product metric
- Add EVP quantization (quantize_single, quantize_batch for float & FP16) - Add EvpInnerProduct distance module with ResidualMode SIMD dispatching (AVX2 & AVX-512) - Register Metric::EVPInnerProduct in FloatSpace and distances dispatcher - Add unit, integration, and builder regression test coverage for EVP
1 parent a252448 commit 2e9f95e

10 files changed

Lines changed: 1379 additions & 5 deletions

File tree

cpp/deglib/include/distance/evp_inner_product.h

Lines changed: 374 additions & 0 deletions
Large diffs are not rendered by default.

cpp/deglib/include/distances.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "distance/fp32_ip.h"
1212
#include "distance/fp16_ip.h"
1313
#include "distance/uint8_l2.h"
14+
#include "distance/evp_inner_product.h"
1415

1516
namespace deglib {
1617

@@ -20,6 +21,8 @@ namespace deglib {
2021
L2 = 0x00 | 1,
2122
InnerProduct = 0x00 | 2,
2223
FP16InnerProduct = 0x00 | 3,
24+
// 0x20 = EVP (bit-packed)
25+
EVPInnerProduct = 0x20 | 1,
2326

2427
// 0x10 = uint8
2528
L2_Uint8 = 0x10 | 1
@@ -64,7 +67,8 @@ namespace deglib {
6467
deglib::distances::fp32_l2::DistanceVariant,
6568
deglib::distances::fp32_ip::DistanceVariant,
6669
deglib::distances::fp16_ip::DistanceVariant,
67-
deglib::distances::uint8_l2::DistanceVariant
70+
deglib::distances::uint8_l2::DistanceVariant,
71+
deglib::distances::evp_ip::DistanceVariant
6872
>;
6973

7074
// Compile-time verification that every type in DistanceVariant fulfills the DistanceFunction concept
@@ -111,6 +115,8 @@ namespace deglib {
111115
return to_flat_variant(deglib::distances::fp16_ip::select_dist(dim));
112116
case deglib::Metric::L2_Uint8:
113117
return to_flat_variant(deglib::distances::uint8_l2::select_dist(dim));
118+
case deglib::Metric::EVPInnerProduct:
119+
return to_flat_variant(deglib::distances::evp_ip::select_dist(dim));
114120
default:
115121
throw std::invalid_argument("Unsupported metric type in select_dist_variant");
116122
}
@@ -119,6 +125,8 @@ namespace deglib {
119125
static size_t calculate_data_size(const size_t dim, const deglib::Metric metric) {
120126
if (metric == deglib::Metric::FP16InnerProduct)
121127
return dim * sizeof(uint16_t);
128+
if (metric == deglib::Metric::EVPInnerProduct)
129+
return 2 * (dim / 8); // EVP: [ones (dim/8 bytes)][negs (dim/8 bytes)]
122130
return (static_cast<int>(metric) & 0x10) ? dim * sizeof(uint8_t) : dim * sizeof(float);
123131
}
124132

0 commit comments

Comments
 (0)