+
    )i                         R t ^ RIHt ^ RItRR.t]P                  ! RR/RR7      R
R l4       t]P                  RR	 l4       tR# )aY  Routines 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_boundarydatadefault)
edge_attrspreserve_edge_attrsc                  aa	 V Uu0 uF  qfV 9   g   K  VkK  	  upoV P                  4       '       d   V P                  SW4VR7      pMV P                  SW5R7      pVf   V3R lV 4       # \        V4      o	VV	3R lV 4       # u upi )a  Returns 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.

)r   keysr   )r   r   c              3   p   <"   T F+  q^ ,          S9   V^,          S9   ,          '       g   K'  Vx  K-  	  R# 5i    N ).0enset1s   & Z/var/www/html/photoedit/myenv/lib/python3.14/site-packages/networkx/algorithms/boundary.py	<genexpr> edge_boundary.<locals>.<genexpr>e   s+     F5aqTU]qtu}$E$E5s   $6
6c              3      <"   T FC  pV^ ,          S9   d   V^,          S9   g!   V^,          S9   g   K/  V^ ,          S9   g   K?  Vx  KE  	  R# 5ir   r   )r   r   r   nset2s   & r   r   r   g   sI      AaDEMadem1 	
CDQ45= 	
s   ,AA
A)is_multigraphedgesset)
Gnbunch1nbunch2r   r
   r   nr   r   r   s
   &&&&&&  @@r   r   r      s    F  *16QQ*E 	DWED:
 F5FFLE # +s
   BBc                   a  V Uu0 uF  q3S 9   g   K  VkK  	  pp\        \        P                  ! V 3R lV 4       4      4      V,
          pVe   V\        V4      ,          pV# u upi )a  Returns 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.

c              3   6   <"   T F  pSV,          x  K  	  R # 5iNr   )r   vr   s   & r   r    node_boundary.<locals>.<genexpr>   s     !61!A$$s   )r   r   from_iterable)r   r   r   r   r   bdys   f&&   r   r   r   n   s`    h  *16QQE*
e!!!6!66
7%
?C s7|J +s
   A#A#)NFFNr    )	__doc__	itertoolsr   networkxnx__all___dispatchabler   r   r       r   <module>r,      s`   	  O
, fi0fMW NWt 9 9r+   