"""Identify paired execution zones and their exclusive input calculations.""" from graphlib import TopologicalSorter def node_zones(node_group): """Return each paired entry, exit, and its data-dependent node membership.""" parents = {node: set() for node in node_group.nodes} children = {node: set() for node in node_group.nodes} for link in node_group.links: parents[link.to_node].add(link.from_node) children[link.from_node].add(link.to_node) order = list(TopologicalSorter(parents).static_order()) ancestors = {} for node in order: ancestors[node] = parents[node] | set().union(*(ancestors[parent] for parent in parents[node])) zones = [] for entry in order: end = getattr(entry, "paired_output", None) if end is None: continue members = {node for node in ancestors[end] if entry in ancestors[node]} | {entry, end} for node in reversed(order): if (node not in members and node in ancestors[end] and children[node] and children[node] <= members and entry not in children[node]): members.add(node) zones.append((entry, end, members)) return zones