use gryf::{core::marker::Undirected, Graph};
use leiden_rs::{Leiden, LeidenConfig, QualityType};
fn main() {
let mut graph: Graph<i32, f64, Undirected> = Graph::new_undirected();
let vertices: Vec<_> = (0..12).map(|i| graph.add_vertex(i)).collect();
for t in 0..4 {
let b = t * 3;
graph.add_edge(&vertices[b], &vertices[b + 1], 1.0);
graph.add_edge(&vertices[b + 1], &vertices[b + 2], 1.0);
graph.add_edge(&vertices[b], &vertices[b + 2], 1.0);
}
graph.add_edge(&vertices[2], &vertices[3], 0.1);
graph.add_edge(&vertices[5], &vertices[6], 0.1);
graph.add_edge(&vertices[8], &vertices[9], 0.1);
graph.add_edge(&vertices[11], &vertices[0], 0.1);
println!(
"Ring of triangles: {} nodes, {} edges",
graph.vertex_count(),
graph.edge_count()
);
let config = LeidenConfig::builder()
.resolution(1.0)
.seed(42)
.epsilon(1e-10)
.build();
let leiden = Leiden::new(config);
let result = leiden.run(&graph).expect("leiden failed");
println!(
"Modularity (resolution=1.0): {} communities (quality: {:.4})\n",
result.partition.num_communities(),
result.quality
);
let cpm_config = LeidenConfig::builder()
.quality(QualityType::CPM)
.resolution(0.1)
.seed(42)
.build();
let cpm_leiden = Leiden::new(cpm_config);
let cpm_result = cpm_leiden.run(&graph).expect("leiden failed");
println!(
"CPM (resolution=0.1): {} communities (quality: {:.4})",
cpm_result.partition.num_communities(),
cpm_result.quality
);
let cpm_config2 = LeidenConfig::builder()
.quality(QualityType::CPM)
.resolution(0.5)
.seed(42)
.build();
let cpm_leiden2 = Leiden::new(cpm_config2);
let cpm_result2 = cpm_leiden2.run(&graph).expect("leiden failed");
println!(
"CPM (resolution=0.5): {} communities (quality: {:.4})",
cpm_result2.partition.num_communities(),
cpm_result2.quality
);
}