clt_database/vector/operations/
serialize.rs1use 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 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); }
34 let trailing_bits = (blob_size - 1) * 8 - dims;
35 blob.push(trailing_bits as u8);
36 blob.push(3); Value::from_blob(blob)
38 }
39 VectorType::Float8 => {
40 let dims = x.dims;
42 let data = x.bin_eject(); 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); blob.push(trailing_bytes as u8);
48 blob.push(4); Value::from_blob(blob)
50 }
51 }
52}