Skip to content

add weighted cycle enumeration in digraph #40114

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

Open
wants to merge 2 commits into
base: develop
Choose a base branch
from

Conversation

kappybar
Copy link
Contributor

@kappybar kappybar commented May 16, 2025

Add feature of enumerating weighted cycle in digraph. Specifically, I added several arguments related to weight in
_all_cycles_iterator_vertex, all_cycles_iterator, all_simple_cycles functions.

_all_cycles_iterator_vertex function enumerates cycles whose starting point is specifed in increasing weight order by using PriorityQueue instread of normal queue. By using this, all_cycls_iterator can enumerate cycles in increasing weight order.

📝 Checklist

  • The title is concise and informative.
  • The description explains in detail what this PR is about.
  • I have linked a relevant issue or discussion.
  • I have created tests covering the changes.
  • I have updated the documentation and checked the documentation preview.

⌛ Dependencies

Copy link
Contributor

@dcoudert dcoudert left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

otherwise, LGTM.

@@ -3010,6 +3126,22 @@ def all_cycles_iterator(self, starting_vertices=None, simple=False,
h = copy(self)
h.delete_edges((u, v) for u, v in h.edge_iterator(labels=False) if d[u] != d[v])

# set by_weight, weight_function
if weight_function is not None:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is done in _get_weight_function.

if weight_function is not None:
by_weight = True

if weight_function is None and by_weight:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is also done in _get_weight_function

weight_function=weight_function,
check_weight=check_weight)

for e in h.edge_iterator():
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this should be done only when by_weight is True.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for review. I fixed it

Copy link
Contributor

@dcoudert dcoudert left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

vbraun pushed a commit to vbraun/sage that referenced this pull request May 18, 2025
<!-- ^ Please provide a concise and informative title. -->
<!-- ^ Don't put issue numbers in the title, do this in the PR
description below. -->
<!-- ^ For example, instead of "Fixes sagemath#12345" use "Introduce new method
to calculate 1 + 2". -->
<!-- v Describe your changes below in detail. -->
<!-- v Why is this change required? What problem does it solve? -->
<!-- v If this PR resolves an open issue, please link to it here. For
example, "Fixes sagemath#12345". -->

Add feature of enumerating weighted cycle in digraph. Specifically, I
added several arguments related to weight in
_all_cycles_iterator_vertex, all_cycles_iterator, all_simple_cycles
functions.

_all_cycles_iterator_vertex function enumerates cycles whose starting
point is specifed in increasing weight order by using PriorityQueue
instread of normal queue. By using this, all_cycls_iterator can
enumerate cycles in increasing weight order.

### 📝 Checklist

<!-- Put an `x` in all the boxes that apply. -->

- [x] The title is concise and informative.
- [x] The description explains in detail what this PR is about.
- [x] I have linked a relevant issue or discussion.
- [x] I have created tests covering the changes.
- [ ] I have updated the documentation and checked the documentation
preview.

### ⌛ Dependencies

<!-- List all open PRs that this PR logically depends on. For example,
-->
<!-- - sagemath#12345: short description why this is a dependency -->
<!-- - sagemath#34567: ... -->

URL: sagemath#40114
Reported by: Yuta Inoue
Reviewer(s): David Coudert, Yuta Inoue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants