use crate::search::quantization::vector::Int8QuantizedVector;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum SerializationError {
#[error("Serialization failed: {0}")]
Serialization(String),
#[error("Deserialization failed: {0}")]
Deserialization(String),
}
pub fn to_bytes(vector: &Int8QuantizedVector) -> Result<Vec<u8>, SerializationError> {
bincode::serialize(vector).map_err(|e| SerializationError::Serialization(e.to_string()))
}
pub fn from_bytes(bytes: &[u8]) -> Result<Int8QuantizedVector, SerializationError> {
bincode::deserialize(bytes).map_err(|e| SerializationError::Deserialization(e.to_string()))
}
#[cfg(test)]
mod tests {
use super::*;
use crate::search::quantization::vector::Int8QuantizedVectorMetadata;
#[test]
fn test_serialization_roundtrip() {
let metadata = Int8QuantizedVectorMetadata::new(1.0, 0.0, 10.0, 100.0);
let data = vec![1, 2, 3, 4, 5];
let qv = Int8QuantizedVector::new(data, metadata, 5);
let bytes = to_bytes(&qv).unwrap();
let decoded = from_bytes(&bytes).unwrap();
assert_eq!(qv, decoded);
}
#[test]
fn test_serialization_size() {
let metadata = Int8QuantizedVectorMetadata::new(1.0, 0.0, 10.0, 100.0);
let data: Vec<i8> = (0..64).map(|i| i as i8).collect();
let qv = Int8QuantizedVector::new(data, metadata, 64);
let bytes = to_bytes(&qv).unwrap();
assert!(
bytes.len() < 112,
"Serialized size {} indicates padding was NOT skipped (expected ~96 bytes)",
bytes.len()
);
if std::mem::size_of::<usize>() == 8 {
assert_eq!(bytes.len(), 96, "Unexpected serialized size");
}
}
}