-
Notifications
You must be signed in to change notification settings - Fork 430
feat: Fix self-loop bug in all_simple_paths and enable multiple targets #865
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
starovoid
merged 7 commits into
petgraph:master
from
lazyhope:enable-all-simple-path-multiple-targets
Sep 7, 2025
Merged
feat: Fix self-loop bug in all_simple_paths and enable multiple targets #865
starovoid
merged 7 commits into
petgraph:master
from
lazyhope:enable-all-simple-path-multiple-targets
Sep 7, 2025
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
…version and tests
6ee82d3 to
aa3e76c
Compare
starovoid
approved these changes
Sep 7, 2025
Collaborator
starovoid
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great!
test bipartite_multi_bench ... bench: 660,654.35 ns/iter (+/- 13,496.46)
test bipartite_single_bench ... bench: 3,642,804.80 ns/iter (+/- 69,981.22)
This difference is impressive, and the new algorithm will be really useful.
Contributor
Author
Thanks a lot for the review and approving it! Really glad to contribute to it. |
RaoulLuque
pushed a commit
to RaoulLuque/petgraph
that referenced
this pull request
Sep 21, 2025
…ts (petgraph#865) <!-- -- Thanks for contributing to `petgraph`! -- -- We require PR titles to follow the Conventional Commits specification, -- https://www.conventionalcommits.org/en/v1.0.0/. This helps us generate -- changelogs and follow semantic versioning. -- -- Start the PR title with one of the following: -- * `feat:` for new features -- * `fix:` for bug fixes -- * `refactor:` for code refactors -- * `docs:` for documentation changes -- * `test:` for test changes -- * `perf:` for performance improvements -- * `revert:` for reverting changes -- * `ci:` for CI/CD changes -- * `chore:` for changes that don't fit in any of the above categories -- The last two categories will not be included in the changelog. -- -- If your PR includes a breaking change, please add a `!` after the type -- and include a `BREAKING CHANGE:` line in the body of the PR describing -- the necessary changes for users to update their code. -- --> ### Description This pull request resolves petgraph#864. 1. **Fixes a bug in `all_simple_paths`**: The original implementation could return a self-looping path when `from`=`to`, as described in the issue. 2. **Adds `all_simple_paths_multi` for multiple targets**: A new function, [`all_simple_paths_multi`](src/algo/simple_paths.rs:144), has been implemented. This function finds all simple paths from a single source node to a `HashSet` of possible target nodes, in a single DFS traversal. Unit tests have been added to validate the fix and to ensure the correctness of the new multi-target pathfinding functionality across various graph types and edge cases. TODOs: - [x] Add benchmarks to the functions in `src/algo/simple_paths.rs` - [x] Add docstrings for the new `all_simple_path_multi` function. Help needed: Finalise the design choice to exclude the single node path when `source = target`
RaoulLuque
pushed a commit
to cactusdualcore/petgraph
that referenced
this pull request
Sep 21, 2025
…ts (petgraph#865) <!-- -- Thanks for contributing to `petgraph`! -- -- We require PR titles to follow the Conventional Commits specification, -- https://www.conventionalcommits.org/en/v1.0.0/. This helps us generate -- changelogs and follow semantic versioning. -- -- Start the PR title with one of the following: -- * `feat:` for new features -- * `fix:` for bug fixes -- * `refactor:` for code refactors -- * `docs:` for documentation changes -- * `test:` for test changes -- * `perf:` for performance improvements -- * `revert:` for reverting changes -- * `ci:` for CI/CD changes -- * `chore:` for changes that don't fit in any of the above categories -- The last two categories will not be included in the changelog. -- -- If your PR includes a breaking change, please add a `!` after the type -- and include a `BREAKING CHANGE:` line in the body of the PR describing -- the necessary changes for users to update their code. -- --> ### Description This pull request resolves petgraph#864. 1. **Fixes a bug in `all_simple_paths`**: The original implementation could return a self-looping path when `from`=`to`, as described in the issue. 2. **Adds `all_simple_paths_multi` for multiple targets**: A new function, [`all_simple_paths_multi`](src/algo/simple_paths.rs:144), has been implemented. This function finds all simple paths from a single source node to a `HashSet` of possible target nodes, in a single DFS traversal. Unit tests have been added to validate the fix and to ensure the correctness of the new multi-target pathfinding functionality across various graph types and edge cases. TODOs: - [x] Add benchmarks to the functions in `src/algo/simple_paths.rs` - [x] Add docstrings for the new `all_simple_path_multi` function. Help needed: Finalise the design choice to exclude the single node path when `source = target`
RaoulLuque
pushed a commit
to RaoulLuque/petgraph
that referenced
this pull request
Sep 21, 2025
…ts (petgraph#865) <!-- -- Thanks for contributing to `petgraph`! -- -- We require PR titles to follow the Conventional Commits specification, -- https://www.conventionalcommits.org/en/v1.0.0/. This helps us generate -- changelogs and follow semantic versioning. -- -- Start the PR title with one of the following: -- * `feat:` for new features -- * `fix:` for bug fixes -- * `refactor:` for code refactors -- * `docs:` for documentation changes -- * `test:` for test changes -- * `perf:` for performance improvements -- * `revert:` for reverting changes -- * `ci:` for CI/CD changes -- * `chore:` for changes that don't fit in any of the above categories -- The last two categories will not be included in the changelog. -- -- If your PR includes a breaking change, please add a `!` after the type -- and include a `BREAKING CHANGE:` line in the body of the PR describing -- the necessary changes for users to update their code. -- --> ### Description This pull request resolves petgraph#864. 1. **Fixes a bug in `all_simple_paths`**: The original implementation could return a self-looping path when `from`=`to`, as described in the issue. 2. **Adds `all_simple_paths_multi` for multiple targets**: A new function, [`all_simple_paths_multi`](src/algo/simple_paths.rs:144), has been implemented. This function finds all simple paths from a single source node to a `HashSet` of possible target nodes, in a single DFS traversal. Unit tests have been added to validate the fix and to ensure the correctness of the new multi-target pathfinding functionality across various graph types and edge cases. TODOs: - [x] Add benchmarks to the functions in `src/algo/simple_paths.rs` - [x] Add docstrings for the new `all_simple_path_multi` function. Help needed: Finalise the design choice to exclude the single node path when `source = target`
github-merge-queue bot
pushed a commit
that referenced
this pull request
Sep 30, 2025
## 🤖 New release * `petgraph`: 0.8.2 -> 0.8.3 (✓ API compatible changes) <details><summary><i><b>Changelog</b></i></summary><p> <blockquote> ## [0.8.3](https://github.com/petgraph/petgraph/compare/petgraph@v0.8.2...petgraph@v0.8.3) - 2025-09-28 ### Bug Fixes - Infinite `subgraph_isomorphisms_iter` for empty isomorphisms ([#780](#780)) - Algos don't work on `UndirectedAdaptor` ([#870](#870)) ([#871](#871)) - use a queue for SPFA ([#893](#893)) - `StableGraph::reverse` breaks free lists ([#890](#890)) ### Documentation - Fix examples link in README and unify typesetting of one word ([#823](#823)) - Add link to multigraph definition to isomorphism algos ([#824](#824)) - Fix auxiliary space (and time) complexity of bron-kerbosch ([#825](#825)) - Fix Typo in Operator Module Documentation ([#831](#831)) - Sync the crate feature flags in the README and docs ([#832](#832)) - Remove all \[Generic\] tags from algo docstrings ([#835](#835)) - Fix typos in comments ([#836](#836)) - Revamp CONTRIBUTING.md ([#833](#833)) - Update `GraphMap` link in README ([#857](#857)) - Add doc comment for `Dot::with_attr_getters` ([#850](#850)) - Specify iteration order for neighbors and edges and their variants ([#790](#790)) - Collection of Doc fixes ([#856](#856)) ### New Features - Add `into_nodes_edges_iters` to `StableGraph` ([#841](#841)) - Add methods to reserve & shrink `StableGraph` capacity ([#846](#846)) - Add Dinic's Maximum Flow Algorithm ([#739](#739)) - make Csr::from_sorted_edges generic over edge type and properly increase edge_count in Csr::from_sorted_edges ([#861](#861)) - Add `map_owned` and `filter_map_owned` for `Graph` and `StableGraph` ([#863](#863)) - Add dijkstra::with_dynamic_goal ([#855](#855)) - Fix self-loop bug in all_simple_paths and enable multiple targets ([#865](#865)) - mark petgraph::dot::Dot::graph_fmt as public ([#866](#866)) - Add bidirectional Dijkstra algorithm ([#782](#782)) ### Performance - Make A* tie break on lower h-values ([#882](#882)) ### Refactor - add examples for scc algorithms and reorganize into dedicated module ([#830](#830)) - Remove unnecessary trait bounds from impls/methods ([#828](#828)) - replace uses of 'crate::util::zip' with 'core::iter::zip' ([#849](#849)) - Fix clippy (and other) lints ([#851](#851)) - Cleanup repo ([#854](#854)) - replace crate::util::enumerate with Iterator::enumerate ([#881](#881)) ### Testing - Add dependency list for 'quickcheck' feature ([#822](#822)) - Fix feature cfg capitalization in doctest ([#852](#852)) </blockquote> </p></details> --- This PR was generated with [release-plz](https://github.com/release-plz/release-plz/). --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Egor Starovoitov <52821033+starovoid@users.noreply.github.com>
4 tasks
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Labels
C-bugfix
Category: PR with bug fix
C-feature-accepted
Category: A feature request that has been accepted pending implementation
S-waiting-on-review
Status: Awaiting review from the assignee but also other interested parties
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Description
This pull request resolves #864.
Fixes a bug in
all_simple_paths: The original implementation could return a self-looping path whenfrom=to, as described in the issue.Adds
all_simple_paths_multifor multiple targets: A new function,all_simple_paths_multi, has been implemented. This function finds all simple paths from a single source node to aHashSetof possible target nodes, in a single DFS traversal.Unit tests have been added to validate the fix and to ensure the correctness of the new multi-target pathfinding functionality across various graph types and edge cases.
TODOs:
src/algo/simple_paths.rsall_simple_path_multifunction.Help needed: Finalise the design choice to exclude the single node path when
source = target