Skip to content

Conversation

@lazyhope
Copy link
Contributor

@lazyhope lazyhope commented Aug 2, 2025

Description

This pull request resolves #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, 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:

  • Add benchmarks to the functions in src/algo/simple_paths.rs
  • 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

@lazyhope lazyhope changed the title Feat: Fix self-loop bug in all_simple_path and enable multiple targets feat: Fix self-loop bug in all_simple_path and enable multiple targets Aug 2, 2025
@lazyhope lazyhope changed the title feat: Fix self-loop bug in all_simple_path and enable multiple targets feat: Fix self-loop bug in all_simple_paths and enable multiple targets Aug 4, 2025
@starovoid starovoid added 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 labels Aug 29, 2025
@starovoid starovoid added this to the 0.8.3 milestone Aug 29, 2025
@starovoid starovoid force-pushed the enable-all-simple-path-multiple-targets branch from 6ee82d3 to aa3e76c Compare September 7, 2025 17:53
Copy link
Collaborator

@starovoid starovoid left a 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.

@starovoid starovoid added this pull request to the merge queue Sep 7, 2025
Merged via the queue into petgraph:master with commit 8f7a0d9 Sep 7, 2025
11 checks passed
@github-actions github-actions bot mentioned this pull request Sep 7, 2025
@lazyhope
Copy link
Contributor Author

lazyhope commented Sep 7, 2025

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.

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>
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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug in all_simple_paths when source=target and feature request for multiple targets

2 participants