Files
wifi-densepose/crates/ruvector-nervous-system/benches/hdc_bench.rs
ruv d803bfe2b1 Squashed 'vendor/ruvector/' content from commit b64c2172
git-subtree-dir: vendor/ruvector
git-subtree-split: b64c21726f2bb37286d9ee36a7869fef60cc6900
2026-02-28 14:39:40 -05:00

140 lines
3.5 KiB
Rust

use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion};
use ruvector_nervous_system::hdc::{bind, bundle, HdcMemory, Hypervector};
fn bench_vector_creation(c: &mut Criterion) {
c.bench_function("hypervector_random", |b| {
b.iter(|| {
black_box(Hypervector::random());
});
});
c.bench_function("hypervector_from_seed", |b| {
b.iter(|| {
black_box(Hypervector::from_seed(42));
});
});
}
fn bench_binding(c: &mut Criterion) {
let v1 = Hypervector::random();
let v2 = Hypervector::random();
c.bench_function("bind_two_vectors", |b| {
b.iter(|| {
black_box(v1.bind(&v2));
});
});
c.bench_function("bind_function", |b| {
b.iter(|| {
black_box(bind(&v1, &v2));
});
});
}
fn bench_bundling(c: &mut Criterion) {
let mut group = c.benchmark_group("bundling");
for size in [3, 5, 10, 20, 50].iter() {
let vectors: Vec<_> = (0..*size).map(|_| Hypervector::random()).collect();
group.bench_with_input(BenchmarkId::from_parameter(size), size, |b, _| {
b.iter(|| {
black_box(bundle(&vectors).unwrap());
});
});
}
group.finish();
}
fn bench_similarity(c: &mut Criterion) {
let v1 = Hypervector::random();
let v2 = Hypervector::random();
c.bench_function("similarity", |b| {
b.iter(|| {
black_box(v1.similarity(&v2));
});
});
c.bench_function("hamming_distance", |b| {
b.iter(|| {
black_box(v1.hamming_distance(&v2));
});
});
}
fn bench_memory_operations(c: &mut Criterion) {
let mut group = c.benchmark_group("memory");
// Store operation
group.bench_function("store_single", |b| {
let mut memory = HdcMemory::new();
let vector = Hypervector::random();
let mut i = 0;
b.iter(|| {
memory.store(format!("key_{}", i), vector.clone());
i += 1;
});
});
// Retrieve with different memory sizes
for size in [10, 100, 1000, 10_000].iter() {
let mut memory = HdcMemory::with_capacity(*size);
for i in 0..*size {
memory.store(format!("key_{}", i), Hypervector::random());
}
let query = Hypervector::random();
group.bench_with_input(BenchmarkId::new("retrieve", size), size, |b, _| {
b.iter(|| {
black_box(memory.retrieve(&query, 0.8));
});
});
group.bench_with_input(BenchmarkId::new("retrieve_top_k", size), size, |b, _| {
b.iter(|| {
black_box(memory.retrieve_top_k(&query, 10));
});
});
}
group.finish();
}
fn bench_end_to_end(c: &mut Criterion) {
c.bench_function("end_to_end_workflow", |b| {
b.iter(|| {
let mut memory = HdcMemory::new();
// Create and store 100 vectors
for i in 0..100 {
let v = Hypervector::random();
memory.store(format!("item_{}", i), v);
}
// Retrieve similar items
let query = Hypervector::random();
let results = memory.retrieve_top_k(&query, 10);
black_box(results);
});
});
}
criterion_group!(
benches,
bench_vector_creation,
bench_binding,
bench_bundling,
bench_similarity,
bench_memory_operations,
bench_end_to_end
);
criterion_main!(benches);