From 14e104f8308ae87f0ba5600709c930e032d01027 Mon Sep 17 00:00:00 2001 From: Nikita Sivukhin Date: Thu, 9 Oct 2025 16:56:36 +0400 Subject: [PATCH] add convert operation --- core/vector/mod.rs | 2 ++ core/vector/operations/concat.rs | 16 ++++++++++++---- core/vector/operations/convert.rs | 25 +++++++++++++++++++++++++ core/vector/operations/deserialize.rs | 0 core/vector/operations/mod.rs | 2 +- 5 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 core/vector/operations/convert.rs delete mode 100644 core/vector/operations/deserialize.rs diff --git a/core/vector/mod.rs b/core/vector/mod.rs index 9fcba41d1..5087cacfd 100644 --- a/core/vector/mod.rs +++ b/core/vector/mod.rs @@ -35,6 +35,7 @@ pub fn vector32(args: &[Register]) -> Result { )); } let vector = parse_vector(&args[0], Some(VectorType::Float32Dense))?; + let vector = operations::convert::vector_convert(vector, VectorType::Float32Dense)?; Ok(operations::serialize::vector_serialize(vector)) } @@ -45,6 +46,7 @@ pub fn vector64(args: &[Register]) -> Result { )); } let vector = parse_vector(&args[0], Some(VectorType::Float64Dense))?; + let vector = operations::convert::vector_convert(vector, VectorType::Float64Dense)?; Ok(operations::serialize::vector_serialize(vector)) } diff --git a/core/vector/operations/concat.rs b/core/vector/operations/concat.rs index 3b4ebf302..c8cfda2aa 100644 --- a/core/vector/operations/concat.rs +++ b/core/vector/operations/concat.rs @@ -1,4 +1,7 @@ -use crate::{vector::vector_types::Vector, LimboError, Result}; +use crate::{ + vector::vector_types::{Vector, VectorType}, + LimboError, Result, +}; pub fn vector_concat(v1: &Vector, v2: &Vector) -> Result { if v1.vector_type != v2.vector_type { @@ -7,9 +10,14 @@ pub fn vector_concat(v1: &Vector, v2: &Vector) -> Result { )); } - let mut data = Vec::with_capacity(v1.data.len() + v2.data.len()); - data.extend_from_slice(&v1.data); - data.extend_from_slice(&v2.data); + let data = match v1.vector_type { + VectorType::Float32Dense | VectorType::Float64Dense => { + let mut data = Vec::with_capacity(v1.data.len() + v2.data.len()); + data.extend_from_slice(&v1.data); + data.extend_from_slice(&v2.data); + data + } + }; Ok(Vector { vector_type: v1.vector_type, diff --git a/core/vector/operations/convert.rs b/core/vector/operations/convert.rs new file mode 100644 index 000000000..3703c69a4 --- /dev/null +++ b/core/vector/operations/convert.rs @@ -0,0 +1,25 @@ +use crate::{ + vector::vector_types::{Vector, VectorType}, + Result, +}; + +pub fn vector_convert(v: Vector, target_type: VectorType) -> Result { + match (v.vector_type, target_type) { + (VectorType::Float32Dense, VectorType::Float32Dense) + | (VectorType::Float64Dense, VectorType::Float64Dense) => Ok(v), + (VectorType::Float32Dense, VectorType::Float64Dense) => { + let mut data = Vec::with_capacity(v.dims * 8); + for &x in v.as_f32_slice() { + data.extend_from_slice(&f64::to_le_bytes(x as f64)); + } + Vector::from_data(target_type, data) + } + (VectorType::Float64Dense, VectorType::Float32Dense) => { + let mut data = Vec::with_capacity(v.dims * 4); + for &x in v.as_f32_slice() { + data.extend_from_slice(&f64::to_le_bytes(x as f64)); + } + Vector::from_data(target_type, data) + } + } +} diff --git a/core/vector/operations/deserialize.rs b/core/vector/operations/deserialize.rs deleted file mode 100644 index e69de29bb..000000000 diff --git a/core/vector/operations/mod.rs b/core/vector/operations/mod.rs index 55b249aa8..c0d10a0f0 100644 --- a/core/vector/operations/mod.rs +++ b/core/vector/operations/mod.rs @@ -1,5 +1,5 @@ pub mod concat; -pub mod deserialize; +pub mod convert; pub mod distance_cos; pub mod distance_l2; pub mod serialize;