Skip to content

Commit 14be08f

Browse files
Migrate Johnson's algorithm to rustworkx-core (#1318)
* Migrate Johnson's algorithm to rustworkx-core This commit adds Johnson's algorithm for computing simple cycles to rustworkx-core. This implementation returns an iterator-like struct which requires a reference to the graph for each step of the iterator. This mirrors the structure of the Bfs and similar structs in petgraph. While an implementor of Iterator could be used for this, this complicates using it from Python because we can't have a shared reference in a pyclass struct. This also has the advantage of enabling mutable references while iterating over the cycles. To facilitate this 2 traits are added `EdgeFindable` and `EdgeRemovable` which add traits for `remove_edge()` and `find_edge()` to petgraph graph types. The `EdgeRemovable` trait isn't actually used currently, it was in an earlier local draft of the PR which attempted to remove self cycles from a clone before changing direction of the interface. Since the implementation was done and relatively simple, and the potential general usefulness this was left in. `EdgeFindable` is actively used by this new function however. * Simplify python side logic * Set name of pyclass to SimpleCycleIter for backwards compat * Fix rustdoc warnings --------- Co-authored-by: Ivan Carvalho <[email protected]> Co-authored-by: Ivan Carvalho <[email protected]>
1 parent 6bc3933 commit 14be08f

File tree

6 files changed

+646
-274
lines changed

6 files changed

+646
-274
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
---
2+
features:
3+
- |
4+
Added a new function, ``johnson_simple_cycles``, to the ``rustworkx-core``
5+
crate. This function implements `Johnson's algorithm <https://doi.org/10.1137/0204007>`__ for finding all
6+
elementary cycles in a directed graph.
7+
- |
8+
Added a new trait ``EdgeFindable`` to find an ``EdgeIndex`` from a graph
9+
given a pair of node indices.
10+
- |
11+
Added a new trait ``EdgeRemovable`` to remove an edge from a graph by
12+
its ``EdgeIndex``.

0 commit comments

Comments
 (0)