scone-core 0.2.1

The Scone memory engine: episodic + temporal-fact dual store with hybrid recall, offline-first
Documentation
#![allow(clippy::unwrap_used)]
use scone_core::embed::{EmbeddingProvider, HashEmbedder};

#[test]
fn hash_embedder_is_deterministic_and_normalized() {
    let e = HashEmbedder::new(64);
    assert_eq!(e.dim(), 64);
    assert_eq!(e.id(), "hash-v1");
    let a = e.embed(&["the quick brown fox"]).unwrap();
    let b = e.embed(&["the quick brown fox"]).unwrap();
    assert_eq!(a, b);
    let c = e.embed(&["completely different words"]).unwrap();
    assert_ne!(a[0], c[0]);
    let norm: f32 = a[0].iter().map(|x| x * x).sum::<f32>().sqrt();
    assert!((norm - 1.0).abs() < 1e-5);
    assert_eq!(a[0].len(), 64);
}

#[test]
fn empty_text_embeds_to_zero_vector_without_nan() {
    let e = HashEmbedder::new(16);
    let v = e.embed(&[""]).unwrap();
    assert!(v[0].iter().all(|x| *x == 0.0));
}

#[test]
fn batch_embeds_each_text() {
    let e = HashEmbedder::new(32);
    let v = e.embed(&["one", "two", "three"]).unwrap();
    assert_eq!(v.len(), 3);
}