leiden-rs 0.6.0

High-performance Leiden community detection algorithm for graphs in Rust
Documentation
//! Builder pattern example: configure Leiden algorithm with builder API.
//!
//! Run with: cargo run --example builder

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();

    // Triangle edges (strong intra-cluster connections)
    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);
    }

    // Bridge edges between triangles (weak inter-cluster connections)
    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()
    );

    // Configure using builder pattern with modularity
    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
    );

    // Try CPM with low resolution (favors larger communities)
    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
    );

    // Try CPM with higher resolution (favors smaller communities)
    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
    );
}