Skip to main content

clt_database/vector/operations/
serialize.rs

1use crate::{
2    vector::vector_types::{Vector, VectorType},
3    Value,
4};
5
6pub fn vector_serialize(x: Vector) -> Value {
7    match x.vector_type {
8        VectorType::Float32Dense => Value::from_blob(x.bin_eject()),
9        VectorType::Float64Dense => {
10            let mut data = x.bin_eject();
11            data.push(2);
12            Value::from_blob(data)
13        }
14        VectorType::Float32Sparse => {
15            let dims = x.dims;
16            let mut data = x.bin_eject();
17            data.extend_from_slice(&(dims as u32).to_le_bytes());
18            data.push(9);
19            Value::from_blob(data)
20        }
21        VectorType::Float1Bit => {
22            // Format: [data bytes][optional padding][trailing_bits][0x03]
23            let dims = x.dims;
24            let data_size = dims.div_ceil(8);
25            let needs_padding = data_size % 2 == 0;
26            let meta_size = if needs_padding { 3 } else { 2 };
27            let blob_size = data_size + meta_size;
28            let mut blob = Vec::with_capacity(blob_size);
29            let raw = x.bin_eject();
30            blob.extend_from_slice(&raw[..data_size]);
31            if needs_padding {
32                blob.push(0); // padding
33            }
34            let trailing_bits = (blob_size - 1) * 8 - dims;
35            blob.push(trailing_bits as u8);
36            blob.push(3); // type byte
37            Value::from_blob(blob)
38        }
39        VectorType::Float8 => {
40            // Format: [quantized bytes][alignment padding][alpha f32][shift f32][padding 0x00][trailing_bytes][0x04]
41            let dims = x.dims;
42            let data = x.bin_eject(); // ALIGN(dims, 4) + 8 bytes
43            let trailing_bytes = dims.div_ceil(4) * 4 - dims;
44            let mut blob = Vec::with_capacity(data.len() + 3);
45            blob.extend_from_slice(&data);
46            blob.push(0); // padding
47            blob.push(trailing_bytes as u8);
48            blob.push(4); // type byte
49            Value::from_blob(blob)
50        }
51    }
52}