From 5b6555dc239500e8ad246b6e3295a76e60f986b4 Mon Sep 17 00:00:00 2001 From: Lennard Hofmann Date: Mon, 3 Nov 2025 00:30:14 +0100 Subject: [PATCH] Fix G.subgraph(edges=generator) deleting all edges The edges generator was looped over twice. If the generator is a generator expression like `((0, v) for v in range(5))` it becomes empty after the first loop, causing `edges_to_keep_unlabeled` to be empty. --- src/sage/graphs/generic_graph.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/sage/graphs/generic_graph.py b/src/sage/graphs/generic_graph.py index 0d156608534..4f0b6c33b15 100644 --- a/src/sage/graphs/generic_graph.py +++ b/src/sage/graphs/generic_graph.py @@ -14367,6 +14367,14 @@ def subgraph(self, vertices=None, edges=None, inplace=False, sage: g.subgraph(list(range(10))) # uses the 'add' algorithm Subgraph of (Path graph): Graph on 10 vertices + The vertices and edges can be specified using generator expressions + (see :issue:`41130`):: + + sage: g = graphs.CompleteGraph(5) + sage: h = g.subgraph(vertices=(v for v in range(4)), edges=((0, v) for v in range(5))) + sage: h.edges(labels=False) + [(0, 1), (0, 2), (0, 3)] + TESTS: The appropriate properties are preserved:: @@ -14519,8 +14527,13 @@ def _subgraph_by_adding(self, vertices=None, edges=None, edge_property=None, imm G.add_vertices(self if vertices is None else vertices) if edges is not None: - edges_to_keep_labeled = frozenset(e for e in edges if len(e) == 3) - edges_to_keep_unlabeled = frozenset(e for e in edges if len(e) == 2) + edges_to_keep_labeled = set() + edges_to_keep_unlabeled = set() + for e in edges: + if len(e) == 3: + edges_to_keep_labeled.add(e) + elif len(e) == 2: + edges_to_keep_unlabeled.add(e) edges_to_keep = [] if self._directed: @@ -14701,8 +14714,13 @@ def _subgraph_by_deleting(self, vertices=None, edges=None, inplace=False, edges_to_delete = [] if edges is not None: - edges_to_keep_labeled = frozenset(e for e in edges if len(e) == 3) - edges_to_keep_unlabeled = frozenset(e for e in edges if len(e) == 2) + edges_to_keep_labeled = set() + edges_to_keep_unlabeled = set() + for e in edges: + if len(e) == 3: + edges_to_keep_labeled.add(e) + elif len(e) == 2: + edges_to_keep_unlabeled.add(e) edges_to_delete = [] if G._directed: for e in G.edge_iterator():