Files

112 lines
3.3 KiB
Rust

use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion};
use exo_core::{EntityId, Relation, RelationType};
use exo_hypergraph::{HypergraphConfig, HypergraphSubstrate};
fn create_test_hypergraph() -> HypergraphSubstrate {
let config = HypergraphConfig::default();
HypergraphSubstrate::new(config)
}
fn benchmark_hyperedge_creation(c: &mut Criterion) {
let mut group = c.benchmark_group("hypergraph_edge_creation");
for edge_size in [2, 5, 10, 20].iter() {
let mut graph = create_test_hypergraph();
// Pre-create entities
let mut entities = Vec::new();
for _ in 0..100 {
let entity = EntityId::new();
graph.add_entity(entity, serde_json::json!({}));
entities.push(entity);
}
let relation = Relation {
relation_type: RelationType::new("test"),
properties: serde_json::json!({"weight": 0.9}),
};
group.bench_with_input(
BenchmarkId::from_parameter(edge_size),
edge_size,
|b, &size| {
b.iter(|| {
let entity_set: Vec<EntityId> = entities.iter().take(size).copied().collect();
graph.create_hyperedge(black_box(&entity_set), black_box(&relation))
});
},
);
}
group.finish();
}
fn benchmark_query_performance(c: &mut Criterion) {
let mut group = c.benchmark_group("hypergraph_query");
for num_edges in [100, 500, 1000].iter() {
let mut graph = create_test_hypergraph();
// Create entities
let mut entities = Vec::new();
for _ in 0..200 {
let entity = EntityId::new();
graph.add_entity(entity, serde_json::json!({}));
entities.push(entity);
}
// Create hyperedges
let relation = Relation {
relation_type: RelationType::new("test"),
properties: serde_json::json!({}),
};
for _ in 0..*num_edges {
let entity_set: Vec<EntityId> = entities.iter().take(5).copied().collect();
graph.create_hyperedge(&entity_set, &relation).unwrap();
}
let query_entity = entities[0];
group.bench_with_input(BenchmarkId::from_parameter(num_edges), num_edges, |b, _| {
b.iter(|| graph.hyperedges_for_entity(black_box(&query_entity)));
});
}
group.finish();
}
fn benchmark_betti_numbers(c: &mut Criterion) {
let mut graph = create_test_hypergraph();
// Create a complex structure
let mut entities = Vec::new();
for _ in 0..100 {
let entity = EntityId::new();
graph.add_entity(entity, serde_json::json!({}));
entities.push(entity);
}
let relation = Relation {
relation_type: RelationType::new("test"),
properties: serde_json::json!({}),
};
for _ in 0..500 {
let entity_set: Vec<EntityId> = entities.iter().take(5).copied().collect();
graph.create_hyperedge(&entity_set, &relation).unwrap();
}
c.bench_function("hypergraph_betti_numbers", |b| {
b.iter(|| graph.betti_numbers(black_box(3)));
});
}
criterion_group!(
benches,
benchmark_hyperedge_creation,
benchmark_query_performance,
benchmark_betti_numbers
);
criterion_main!(benches);