#![allow(clippy::disallowed_methods)]
use aprender::graph::Graph;
fn main() {
let edges = vec![
(0, 1, 1.0),
(0, 2, 1.0),
(1, 2, 1.0),
(1, 3, 1.0),
(2, 3, 1.0),
(4, 5, 1.0),
(4, 6, 1.0),
(5, 6, 1.0),
(5, 7, 1.0),
(6, 7, 1.0),
(3, 4, 1.0),
];
let g = Graph::from_weighted_edges(&edges, false);
println!("Graph: {} nodes, {} edges", g.num_nodes(), g.num_edges());
assert!(g.num_nodes() >= 8, "Graph must have 8 nodes");
if let Some((path, dist)) = g.dijkstra(0, 7) {
println!("\nDijkstra 0 -> 7: path={:?}, distance={dist:.0}", path);
assert!(dist > 0.0, "Distance must be positive");
assert!(path.len() >= 2, "Path must have start and end");
}
let density = g.density();
println!("\nGraph metrics:");
println!(" Density: {density:.3}");
assert!(density > 0.0 && density <= 1.0, "Density in (0,1]");
let cc = g.clustering_coefficient();
println!(" Clustering coefficient: {cc:.3}");
assert!(cc >= 0.0 && cc <= 1.0, "CC in [0,1]");
assert!(cc > 0.3, "Two cliques should yield CC > 0.3");
let labels = g.label_propagation(100, Some(42));
println!("\nLabel propagation communities:");
for (node, &label) in labels.iter().enumerate() {
println!(" node {node}: community {label}");
}
assert_eq!(labels.len(), g.num_nodes(), "One label per node");
let c1_label = labels[0];
let c2_label = labels[4];
let c1_coherent = labels[0..4].iter().all(|&l| l == c1_label);
let c2_coherent = labels[4..8].iter().all(|&l| l == c2_label);
println!(" Community 1 coherent: {c1_coherent}");
println!(" Community 2 coherent: {c2_coherent}");
println!("\nChapter 18 contracts: PASSED");
}