use graphops::graph::GraphRef;
use graphops::{leiden_seeded, louvain_seeded};
struct VecGraph {
adj: Vec<Vec<usize>>,
}
impl GraphRef for VecGraph {
fn node_count(&self) -> usize {
self.adj.len()
}
fn neighbors_ref(&self, node: usize) -> &[usize] {
&self.adj[node]
}
}
fn main() {
let g = VecGraph {
adj: vec![
vec![1, 2, 3, 4], vec![0, 2, 3], vec![0, 1, 3, 4], vec![0, 1, 2, 4, 5], vec![0, 2, 3], vec![3, 6, 7, 8], vec![5, 7, 8], vec![5, 6, 8], vec![5, 6, 7], ],
};
println!(
"Graph: {} nodes, two clusters connected by node 3 <-> 5\n",
g.node_count()
);
let louvain = louvain_seeded(&g, 1.0, 42);
println!("Louvain communities: {:?}", louvain);
print_communities(&louvain);
let leiden = leiden_seeded(&g, 1.0, 42);
println!("Leiden communities: {:?}", leiden);
print_communities(&leiden);
}
fn print_communities(labels: &[usize]) {
let max_label = labels.iter().copied().max().unwrap_or(0);
for c in 0..=max_label {
let members: Vec<usize> = labels
.iter()
.enumerate()
.filter(|(_, &l)| l == c)
.map(|(i, _)| i)
.collect();
if !members.is_empty() {
println!(" Community {}: nodes {:?}", c, members);
}
}
println!();
}