From 8db7a86187c5af677c3dd73f0930605348df3361 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20M=C3=BCller?= Date: Sat, 18 Jul 2026 23:38:08 +0200 Subject: [PATCH] Add Petersen graph generator --- src/generators.rs | 65 +++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + 2 files changed, 66 insertions(+) create mode 100644 src/generators.rs diff --git a/src/generators.rs b/src/generators.rs new file mode 100644 index 0000000..d257851 --- /dev/null +++ b/src/generators.rs @@ -0,0 +1,65 @@ +use crate::traits::GraphTopology; + +pub fn petersen( + graph: &mut G, +) -> ( + [::Vertex; 10], + [::Edge; 15], +) +where + G: GraphTopology, +{ + const N: usize = 5; + const K: usize = 2; + + let vertices = core::array::from_fn(|_| graph.add_vertex()); + let edges = core::array::from_fn(|j| { + let i = j / 3; + match j % 3 { + 0 => { + let outer = if i < N - 1 { i + 1 } else { 0 }; + graph.add_edge(vertices[i], vertices[outer]) + } + 1 => { + let inner = if i < N - K { i + N + K } else { i + K }; + graph.add_edge(vertices[i + N], vertices[inner]) + } + _ => graph.add_edge(vertices[i], vertices[i + N]), + } + }); + (vertices, edges) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::models::AppendGraph; + + #[test] + fn petersen() { + let mut graph = AppendGraph::new(); + let (vertices, edges) = super::petersen(&mut graph); + assert_eq!(graph.vertex_count(), 10, "unexpected number of added vertices"); + assert_eq!(graph.edge_count(), 15, "unexpected number of added edges"); + assert!( + graph.vertices().all(|v| graph.degree(v) == 3), + "all vertices should have degree 3" + ); + assert_handles_in_graph(&graph, &vertices, &edges); + } + + fn assert_handles_in_graph( + graph: &G, + vertices: &[G::Vertex], + edges: &[G::Edge], + ) { + assert!( + vertices.iter().all(|&v| graph.vertices().any(|u| u == v)), + "all returned vertices should be in the graph" + ); + assert!( + edges.iter().all(|&e| graph.edges().any(|f| f == e)), + "all returned edges should be in the graph" + ); + } +} diff --git a/src/lib.rs b/src/lib.rs index ffb77ee..593f258 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -128,6 +128,7 @@ //! [`GraphTopologyDeletion`]: crate::traits::GraphTopologyDeletion pub mod algorithms; +pub mod generators; pub mod maps; pub mod models; pub mod traits;