4 releases (breaking)
Uses new Rust 2024
| 0.4.0 | Mar 21, 2026 |
|---|---|
| 0.3.0 | Mar 15, 2026 |
| 0.2.0 | Mar 15, 2026 |
| 0.1.0 | Mar 14, 2026 |
#1820 in Algorithms
Used in oku
600KB
1K
SLoC
Ogun
[github] [crates.io](https://crates.io/crates/ogun) [docs.rs](https://docs.rs/ogun)
Spatial layout generation via sequential logit dynamics on potential games.
Given a weighted graph and a 2D grid, Ogun places nodes and routes edges at a controllable optimization level. Agents arrive sequentially and select positions via Boltzmann sampling against a potential function encoding overlap, repulsion, and attraction. The inverse temperature β governs output character — from near-random (low β) to near-optimal (high β).
Named after the Yoruba deity of iron, metalwork, and pathfinding — a god who routes paths through uncharted space.
[dependencies]
ogun = "0.4"
Example
use ogun::*;
let graph = Graph {
nodes: vec![
Node { id: NodeId(0), width: 3, height: 3, fixed: None },
Node { id: NodeId(1), width: 3, height: 3, fixed: None },
],
edges: vec![Edge {
id: EdgeId(0),
src: NodeId(0),
dst: NodeId(1),
weight: 1.0,
}],
};
let space = Space { width: 20, height: 20, obstacles: vec![], routing_costs: None };
let config = OgunConfig { seed: 42, ..OgunConfig::default() };
let layout = generate(&graph, &space, &config);
assert!(layout.score.composite > 0.0);
Algorithm
for each agent in arrival order:
1. EVAL — score every grid position via potential Φ
2. CHOOSE — Boltzmann sample: P(p) ∝ exp(β · Φ(p))
3. COMMIT — place irrevocably, block footprint
4. ROUTE — negotiated Dijkstra to already-placed neighbors
score the completed layout
The potential Φ combines overlap penalty, pairwise repulsion (inverse-square),
and edge attraction (distance to placed neighbors). See
docs/research/ for theoretical foundations and complexity
analysis.
Performance
Benchmarks across problem sizes, measured in --release mode. The stress test
(500 nodes on a 500×500 grid) is the primary target.
| Nodes | Grid | Naive | Optimized | Speedup |
|---|---|---|---|---|
| 50 | 100×100 | 139 ms | 44 ms | 3.2× |
| 100 | 250×110 | 1.62 s | 323 ms | 5.0× |
| 200 | 250×250 | 12.2 s | 1.28 s | 9.5× |
| 500 | 500×500 | 280 s | 11.3 s | 24.8× |
Key optimizations: pre-built adjacency lists, SoA placed-node layout, fused
overlap/repulsion pass, buffer reuse, Rayon parallel utility evaluation, and
spatial repulsion cutoff. Full breakdown in docs/BENCHMARKS.md.
You can run the benchmarks with:
$ cargo test --release --test perf -- --ignored --nocapture
Paper
The algorithm is described in detail in docs/paper/ogun_paper.pdf:
Elias Vahlberg. Ogun: Spatial Layout Generation via Sequential Logit Dynamics on Potential Games. March 2026.
License
MIT
Dependencies
~2.2–3MB
~58K SLoC