"""float32 embedding (de)serialization and cosine similarity.""" from __future__ import annotations import logging import numpy as np logger = logging.getLogger(__name__) def vector_to_bytes(vector: list[float]) -> bytes: """Convert a vector to bytes for SQLite storage.""" logger.debug("Converting vector (length: %d) to bytes", len(vector)) result = np.array(vector, dtype=np.float32).tobytes() logger.debug("Vector converted to %d bytes", len(result)) return result def bytes_to_vector(blob: bytes) -> np.ndarray: """Convert bytes back to a vector.""" logger.debug("Converting %d bytes back to vector", len(blob)) result = np.frombuffer(blob, dtype=np.float32) logger.debug("Vector reconstructed with %d dimensions", len(result)) return result def cosine_similarity(vec1: np.ndarray, vec2: np.ndarray) -> float: """Calculate cosine similarity between two vectors.""" vec1 = vec1.flatten() vec2 = vec2.flatten() logger.debug( "Calculating cosine similarity between vectors of dimension %d", len(vec1), ) norm1 = np.linalg.norm(vec1) norm2 = np.linalg.norm(vec2) if norm1 == 0 or norm2 == 0: return 0.0 result = float(np.dot(vec1, vec2) / (norm1 * norm2)) logger.debug("Similarity calculated: %.4f", result) return result