#![deny(unsafe_code, nonstandard_style)]
#![forbid(rust_2021_compatibility)]
mod common;
use common::{Hyperedge, Vertex};
use hypergraph::{errors::HypergraphError, HyperedgeIndex, Hypergraph, VertexIndex};
#[test]
fn integration_contration() {
let mut graph = Hypergraph::<Vertex, Hyperedge>::new();
let a = graph.add_vertex(Vertex::new("a")).unwrap();
let b = graph.add_vertex(Vertex::new("b")).unwrap();
let c = graph.add_vertex(Vertex::new("c")).unwrap();
let d = graph.add_vertex(Vertex::new("d")).unwrap();
let e = graph.add_vertex(Vertex::new("e")).unwrap();
let alpha = graph
.add_hyperedge(vec![a, b, c, d, e], Hyperedge::new("α", 1))
.unwrap();
let beta = graph
.add_hyperedge(vec![a, c, d, e, c], Hyperedge::new("β", 1))
.unwrap();
let gamma = graph
.add_hyperedge(vec![a, e, b], Hyperedge::new("γ", 1))
.unwrap();
let delta = graph
.add_hyperedge(vec![b, c, b, d, c], Hyperedge::new("δ", 1))
.unwrap();
let epsilon = graph
.add_hyperedge(vec![c, c, c], Hyperedge::new("ε", 1))
.unwrap();
assert_eq!(
graph.contract_hyperedge_vertices(alpha, vec![b, c], b),
Ok(vec![a, b, d, e]),
"should contract vertices b and c into b for alpha hyperedge"
);
assert_eq!(
graph.get_hyperedge_vertices(beta),
Ok(vec![a, b, d, e, b]),
"should update beta hyperedge accordingly"
);
assert_eq!(
graph.get_hyperedge_vertices(gamma),
Ok(vec![a, e, b]),
"should not update gamma hyperedge"
);
assert_eq!(
graph.get_hyperedge_vertices(delta),
Ok(vec![b, d, b]),
"should not update delta hyperedge"
);
assert_eq!(
graph.get_hyperedge_vertices(epsilon),
Ok(vec![b]),
"should update epsilon hyperedge accordingly"
);
assert_eq!(
graph.contract_hyperedge_vertices(HyperedgeIndex(5), vec![b, c], b),
Err(HypergraphError::HyperedgeIndexNotFound(HyperedgeIndex(5))),
"should return an explicit error when HyperIndex is not found"
);
assert_eq!(
graph.contract_hyperedge_vertices(alpha, vec![d, e], a),
Err(HypergraphError::HyperedgeInvalidContraction {
index: alpha,
target: a,
vertices: vec![d, e],
}),
"should return an explicit error when the contraction is invalid"
);
assert_eq!(
graph.contract_hyperedge_vertices(
alpha,
vec![VertexIndex(5), VertexIndex(6)],
VertexIndex(5)
),
Err(HypergraphError::HyperedgeVerticesIndexesNotFound {
index: HyperedgeIndex(0),
vertices: vec![VertexIndex(5), VertexIndex(6)],
}),
"should return an explicit error when the hyperedge doesn't contains the vertices"
);
}