use bytemuck::{Pod, Zeroable};
use crate::VectorType;
#[repr(C)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Default, Pod, Zeroable)]
pub struct BqSignature {
pub data: [u64; 8],
}
impl BqSignature {
pub fn empty() -> Self {
Self { data: [0; 8] }
}
pub fn from_vector<T: VectorType>(vec: &[T]) -> Self {
let mut data = [0u64; 8];
for i in 0..8 {
let mut chunk_bits = 0u64;
for j in 0..64 {
let idx = i * 64 + j;
if idx < vec.len() && vec[idx].to_f32() > 0.0 {
chunk_bits |= 1u64 << j;
}
}
data[i] = chunk_bits;
}
Self { data }
}
#[inline]
pub fn hamming_distance(&self, other: &Self) -> u32 {
self.data.iter()
.zip(other.data.iter())
.map(|(a, b)| (a ^ b).count_ones())
.sum()
}
}