Skip to content

Commit

Permalink
Migrate Johnson's algorithm to rustworkx-core (#1318)
Browse files Browse the repository at this point in the history
* 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]>
  • Loading branch information
3 people authored Dec 17, 2024
1 parent 6bc3933 commit 14be08f
Show file tree
Hide file tree
Showing 6 changed files with 646 additions and 274 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
features:
- |
Added a new function, ``johnson_simple_cycles``, to the ``rustworkx-core``
crate. This function implements `Johnson's algorithm <https://doi.org/10.1137/0204007>`__ for finding all
elementary cycles in a directed graph.
- |
Added a new trait ``EdgeFindable`` to find an ``EdgeIndex`` from a graph
given a pair of node indices.
- |
Added a new trait ``EdgeRemovable`` to remove an edge from a graph by
its ``EdgeIndex``.
Loading

0 comments on commit 14be08f

Please sign in to comment.