#![allow(clippy::cast_precision_loss)]
use rust_igraph::{Graph, connected_components, grg_game};
fn mean_degree(g: &Graph) -> f64 {
2.0 * (g.ecount() as f64) / f64::from(g.vcount())
}
fn largest_component_size(g: &Graph) -> usize {
let cc = connected_components(g).expect("connected_components on undirected graph");
let n_components = cc.membership.iter().copied().max().unwrap_or(0) as usize + 1;
let mut sizes = vec![0usize; n_components];
for &c in &cc.membership {
sizes[c as usize] += 1;
}
sizes.into_iter().max().unwrap_or(0)
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let n: u32 = 500;
let r: f64 = 0.08;
let expected_deg = f64::from(n - 1) * std::f64::consts::PI * r * r;
let plane = grg_game(n, r, false, 0x6E0_1057)?;
let torus = grg_game(n, r, true, 0x6E0_1057)?;
println!("geometric random graph: n = {n}, r = {r}");
println!(" E[deg] (interior bulk) = {expected_deg:.2}");
println!(
" plane mean degree = {:.2} (edges = {})",
mean_degree(&plane),
plane.ecount(),
);
println!(
" torus mean degree = {:.2} (edges = {})",
mean_degree(&torus),
torus.ecount(),
);
println!(
" largest CC: plane = {} / {n}, torus = {} / {n}",
largest_component_size(&plane),
largest_component_size(&torus),
);
Ok(())
}