From 1d69539b9b82b290a510bb3046c49f300f762c0d Mon Sep 17 00:00:00 2001 From: John Lancaster <32917998+jsl12@users.noreply.github.com> Date: Sat, 10 Oct 2026 11:04:53 -0500 Subject: [PATCH] subgraph isolation --- src/daglib/dag.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/daglib/dag.py b/src/daglib/dag.py index 4a9747e..2933f2b 100644 --- a/src/daglib/dag.py +++ b/src/daglib/dag.py @@ -23,7 +23,9 @@ class DAG[T](MutableMapping[T, DAGSetView[T]]): """ _succ: dictset[T] = field(default_factory=lambda: defaultdict(set)) + """Mapping of nodes to the set of nodes that succeed them in the DAG.""" _pred: dictset[T] = field(default_factory=lambda: defaultdict(set)) + """Mapping of nodes to the set of nodes that precede them in the DAG.""" on_add: Callable[[T, T], None] | None = None on_remove: Callable[[T, T], None] | None = None @@ -119,10 +121,11 @@ class DAG[T](MutableMapping[T, DAGSetView[T]]): self._pred.pop(u, None) def subgraph(self, sub: T | Iterable[T]) -> Self: + """Return an independent graph induced by the successor closure of sub.""" closure = transitive_closure(self, sub) subgraph = type(self)( - _succ=defaultdict(set, {k: self._succ[k] for k in set(self._succ.keys()) & closure}), - _pred=defaultdict(set, {k: self._pred[k] for k in set(self._pred.keys()) & closure}), + _succ=defaultdict(set, {node: self._succ[node] & closure for node in self._succ.keys() & closure}), + _pred=defaultdict(set, {node: self._pred[node] & closure for node in self._pred.keys() & closure}), ) subgraph.on_add = self.on_add subgraph.on_remove = self.on_remove