yog/community/louvain

Louvain method for community detection.

A fast, hierarchical algorithm that optimizes modularity. One of the most widely used community detection algorithms due to its excellent balance of speed and quality.

Algorithm

The Louvain method works in two phases that repeat until convergence:

  1. Local Optimization: Each node moves to the neighbor community that maximizes modularity gain
  2. Aggregation: Communities become super-nodes in a new aggregated graph
  3. Repeat until no improvement in modularity

When to Use

Use CaseRecommendation
Large graphs (millions of nodes)✓ Excellent
Hierarchical structure needed✓ Yes
General purpose✓ Works well on most networks
Quality over speedConsider Leiden

Complexity

Example

import yog
import yog/community/louvain
import yog/community/metrics

let graph =
  yog.undirected()
  |> yog.add_node(1, "A")
  |> yog.add_node(2, "B")
  |> yog.add_node(3, "C")
  |> yog.add_edges([#(1, 2, 1), #(2, 3, 1), #(1, 3, 1)])

// Basic usage
let communities = louvain.detect(graph)
io.debug(communities.num_communities)  // => 1 (all connected)

// With custom options
let options = louvain.LouvainOptions(
  min_modularity_gain: 0.0001,
  max_iterations: 100,
  seed: 42,
)
let communities = louvain.detect_with_options(graph, options)

// Evaluate quality with modularity
let q = metrics.modularity(graph, communities)
io.debug(q)  // => 0.0 to 1.0 (higher is better)

References

Types

Options for the Louvain algorithm.

pub type LouvainOptions {
  LouvainOptions(
    min_modularity_gain: Float,
    max_iterations: Int,
    seed: Int,
  )
}

Constructors

  • LouvainOptions(
      min_modularity_gain: Float,
      max_iterations: Int,
      seed: Int,
    )

    Arguments

    min_modularity_gain

    Stop when gain < threshold

    max_iterations

    Max iterations per phase

    seed

    Random seed for tie-breaking

Statistics from the Louvain algorithm run.

pub type LouvainStats {
  LouvainStats(
    num_phases: Int,
    final_modularity: Float,
    iteration_modularity: List(Float),
  )
}

Constructors

  • LouvainStats(
      num_phases: Int,
      final_modularity: Float,
      iteration_modularity: List(Float),
    )

    Arguments

    num_phases

    Number of phases executed

    final_modularity

    Final modularity achieved

    iteration_modularity

    Modularity at each iteration

Values

pub fn default_options() -> LouvainOptions

Default options for Louvain algorithm.

pub fn detect(
  graph: model.Graph(n, Int),
) -> community.Communities

Detects communities using the Louvain algorithm with default options.

pub fn detect_hierarchical(
  graph: model.Graph(n, Int),
) -> community.Dendrogram

Full hierarchical Louvain detection.

pub fn detect_hierarchical_with_options(
  graph: model.Graph(n, Int),
  options: LouvainOptions,
) -> community.Dendrogram

Full hierarchical Louvain detection with custom options.

pub fn detect_with_options(
  graph: model.Graph(n, Int),
  options: LouvainOptions,
) -> community.Communities

Detects communities using the Louvain algorithm with custom options.

pub fn detect_with_stats(
  graph: model.Graph(n, Int),
  options: LouvainOptions,
) -> #(community.Communities, LouvainStats)

Detects communities and returns statistics for debugging/analysis.

Search Document