leiden-rs 0.7.1

High-performance Leiden community detection algorithm for graphs in Rust
Documentation
//! WebAssembly bindings for the Leiden community detection algorithm.
//!
//! Enable with the `wasm` feature flag. Provides a JavaScript-friendly API
//! that takes a flat edge list and returns community assignments.

use crate::graph::GraphDataBuilder;
use crate::leiden::{Leiden, LeidenConfig};

/// Run Leiden community detection from a flat edge list.
///
/// # Arguments
/// * `edges` - Flat array of `[src0, dst0, weight0, src1, dst1, weight1, ...]`
/// * `num_nodes` - Total number of nodes (IDs must be in `0..num_nodes`)
/// * `seed` - Optional RNG seed for reproducibility
///
/// # Returns
/// Community assignment vector where `result[i]` is the community ID of node `i`.
/// Returns singleton partition (each node in its own community) on error.
#[cfg_attr(feature = "wasm", wasm_bindgen::prelude::wasm_bindgen)]
pub fn leiden_from_edgelist(edges: &[f64], num_nodes: usize, seed: Option<u64>) -> Vec<usize> {
    let mut builder = GraphDataBuilder::new(num_nodes);
    for chunk in edges.chunks_exact(3) {
        let u = chunk[0] as usize;
        let v = chunk[1] as usize;
        let w = chunk[2];
        if builder.add_edge(u, v, w).is_err() {
            return (0..num_nodes).collect();
        }
    }
    let graph_data = match builder.build() {
        Ok(g) => g,
        Err(_) => return (0..num_nodes).collect(),
    };

    let config = LeidenConfig {
        seed,
        ..Default::default()
    };

    match Leiden::new(config).run(&graph_data) {
        Ok(result) => {
            let membership: Vec<usize> = (0..num_nodes)
                .map(|i| result.partition.community_of(i))
                .collect();
            membership
        }
        Err(_) => (0..num_nodes).collect(),
    }
}