K idZddlmZddlZddgZej ddidd d Zej d d Zy) aYRoutines to find the boundary of a set of nodes. An edge boundary is a set of edges, each of which has exactly one endpoint in a given set of nodes (or, in the case of directed graphs, the set of edges whose source node is in the set). A node boundary of a set *S* of nodes is the set of (out-)neighbors of nodes in *S* that are outside *S*. )chainN edge_boundary node_boundarydatadefault) edge_attrspreserve_edge_attrsc |Dchc] }||vs| c}|jr|j|||}n|j||}| fd|DSt|  fd|DScc}w)aReturns the edge boundary of `nbunch1`. The *edge boundary* of a set *S* with respect to a set *T* is the set of edges (*u*, *v*) such that *u* is in *S* and *v* is in *T*. If *T* is not specified, it is assumed to be the set of all nodes not in *S*. Parameters ---------- G : NetworkX graph nbunch1 : iterable Iterable of nodes in the graph representing the set of nodes whose edge boundary will be returned. (This is the set *S* from the definition above.) nbunch2 : iterable Iterable of nodes representing the target (or "exterior") set of nodes. (This is the set *T* from the definition above.) If not specified, this is assumed to be the set of all nodes in `G` not in `nbunch1`. keys : bool This parameter has the same meaning as in :meth:`MultiGraph.edges`. data : bool or object This parameter has the same meaning as in :meth:`MultiGraph.edges`. default : object This parameter has the same meaning as in :meth:`MultiGraph.edges`. Returns ------- iterator An iterator over the edges in the boundary of `nbunch1` with respect to `nbunch2`. If `keys`, `data`, or `default` are specified and `G` is a multigraph, then edges are returned with keys and/or data, as in :meth:`MultiGraph.edges`. Examples -------- >>> G = nx.wheel_graph(6) When nbunch2=None: >>> list(nx.edge_boundary(G, (1, 3))) [(1, 0), (1, 2), (1, 5), (3, 0), (3, 2), (3, 4)] When nbunch2 is given: >>> list(nx.edge_boundary(G, (1, 3), (2, 0))) [(1, 0), (1, 2), (3, 0), (3, 2)] Notes ----- Any element of `nbunch` that is not in the graph `G` will be ignored. `nbunch1` and `nbunch2` are usually meant to be disjoint, but in the interest of speed and generality, that is not required here. )rkeysr)rrc3BK|]}|dv|dvz s|ywrN).0enset1s b/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/networkx/algorithms/boundary.py z edge_boundary..es(FaQqTU]qtu}$EFsc3ZK|]"}|dvr|dvs|dvr |dvr|$ywr r)rrrnset2s rrz edge_boundary..gsB  aDEMadem11Q45=  s(+) is_multigraphedgesset) Gnbunch1nbunch2rr rnrrrs @@rrrsF *116Q *E  DtWED': F5FF LE  # +s A6A6c|Dchc] }|vs| }}ttjfd|D|z }||t|z}|Scc}w)acReturns the node boundary of `nbunch1`. The *node boundary* of a set *S* with respect to a set *T* is the set of nodes *v* in *T* such that for some *u* in *S*, there is an edge joining *u* to *v*. If *T* is not specified, it is assumed to be the set of all nodes not in *S*. Parameters ---------- G : NetworkX graph nbunch1 : iterable Iterable of nodes in the graph representing the set of nodes whose node boundary will be returned. (This is the set *S* from the definition above.) nbunch2 : iterable Iterable of nodes representing the target (or "exterior") set of nodes. (This is the set *T* from the definition above.) If not specified, this is assumed to be the set of all nodes in `G` not in `nbunch1`. Returns ------- set The node boundary of `nbunch1` with respect to `nbunch2`. Examples -------- >>> G = nx.wheel_graph(6) When nbunch2=None: >>> list(nx.node_boundary(G, (3, 4))) [0, 2, 5] When nbunch2 is given: >>> list(nx.node_boundary(G, (3, 4), (0, 1, 5))) [0, 5] Notes ----- Any element of `nbunch` that is not in the graph `G` will be ignored. `nbunch1` and `nbunch2` are usually meant to be disjoint, but in the interest of speed and generality, that is not required here. c3(K|] }| ywNr)rvrs rrz node_boundary..s!61!A$!6s)rr from_iterable)rrrrrbdys` rrrns_h *116Q *E * e!!!6!66 7% ?C s7| J +s AA)NFFNr ) __doc__ itertoolsrnetworkxnx__all__ _dispatchablerrrrr+sb  O ,fi0fMWNWt99r*