Add Petersen graph generator
This commit is contained in:
@@ -0,0 +1,65 @@
|
|||||||
|
use crate::traits::GraphTopology;
|
||||||
|
|
||||||
|
pub fn petersen<G>(
|
||||||
|
graph: &mut G,
|
||||||
|
) -> (
|
||||||
|
[<G as GraphTopology>::Vertex; 10],
|
||||||
|
[<G as GraphTopology>::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<G: GraphTopology>(
|
||||||
|
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"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -128,6 +128,7 @@
|
|||||||
//! [`GraphTopologyDeletion`]: crate::traits::GraphTopologyDeletion
|
//! [`GraphTopologyDeletion`]: crate::traits::GraphTopologyDeletion
|
||||||
|
|
||||||
pub mod algorithms;
|
pub mod algorithms;
|
||||||
|
pub mod generators;
|
||||||
pub mod maps;
|
pub mod maps;
|
||||||
pub mod models;
|
pub mod models;
|
||||||
pub mod traits;
|
pub mod traits;
|
||||||
|
|||||||
Reference in New Issue
Block a user