pub mod adapters;
pub mod ffi;
pub mod formats;
pub mod kernel_interop;
#[cfg(feature = "python")]
pub mod bindings;
pub use kernel_interop::*;
pub use formats::{FormatError, OutputFormat};
pub use adapters::{AutoFormatAdapter, BatchAdapter, EnvelopeAdapter, FileAdapter, StreamAdapter};
pub fn export_to_json(vec: &embeddenator_vsa::SparseVec) -> Result<String, FormatError> {
let bytes = formats::sparse_vec_to_format(vec, OutputFormat::Json)?;
String::from_utf8(bytes).map_err(|e| FormatError::SerializationFailed(e.to_string()))
}
pub fn import_from_json(json: &str) -> Result<embeddenator_vsa::SparseVec, FormatError> {
formats::sparse_vec_from_format(json.as_bytes(), OutputFormat::Json)
}
pub struct VSAHandle {
vec: embeddenator_vsa::SparseVec,
}
impl VSAHandle {
pub fn from_sparse_vec(vec: embeddenator_vsa::SparseVec) -> Self {
Self { vec }
}
pub fn to_sparse_vec(&self) -> embeddenator_vsa::SparseVec {
self.vec.clone()
}
pub fn dimensions(&self) -> (usize, usize) {
let nnz = self.vec.pos.len() + self.vec.neg.len();
(embeddenator_vsa::DIM, nnz)
}
}
#[cfg(test)]
mod integration_tests {
use super::*;
use adapters::BatchAdapter;
use embeddenator_vsa::{ReversibleVSAConfig, SparseVec};
use formats::{sparse_vec_from_format, sparse_vec_to_format};
#[test]
fn test_format_roundtrip() {
let vec = SparseVec {
pos: vec![1, 2, 3],
neg: vec![4, 5],
};
let json = sparse_vec_to_format(&vec, OutputFormat::Json).unwrap();
let from_json = sparse_vec_from_format(&json, OutputFormat::Json).unwrap();
assert_eq!(vec.pos, from_json.pos);
let bincode = sparse_vec_to_format(&vec, OutputFormat::Bincode).unwrap();
let from_bincode = sparse_vec_from_format(&bincode, OutputFormat::Bincode).unwrap();
assert_eq!(vec.pos, from_bincode.pos);
}
#[test]
fn test_batch_operations() {
let config = ReversibleVSAConfig::default();
let data = vec![b"test1".as_slice(), b"test2".as_slice()];
let vectors = BatchAdapter::batch_encode(&data, &config);
assert_eq!(vectors.len(), 2);
let decoded = BatchAdapter::batch_decode(&vectors, &config, 5);
assert_eq!(decoded.len(), 2);
}
#[test]
fn test_kernel_backend() {
let backend = SparseVecBackend;
let config = ReversibleVSAConfig::default();
let data = b"test data";
let vec = backend.encode_data(data, &config, None);
let decoded = backend.decode_data(&vec, &config, None, data.len());
assert_eq!(data.len(), decoded.len());
let vec2 = backend.encode_data(b"other", &config, None);
let _bundled = backend.bundle(&vec, &vec2);
let _bound = backend.bind(&vec, &vec2);
let similarity = backend.cosine(&vec, &vec2);
assert!((0.0..=1.0).contains(&similarity));
}
}