ó
    …~iÛ  ã                   ó‚   • S r SSKJr  SSKrSS/r\R                  " SS0SS9SS	 j5       r\R                  SS
 j5       rg)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                 ó   ^^	• U Vs1 s H  ofU ;   d  M
  UiM     snmU R                  5       (       a  U R                  TX4US9nOU R                  TX5S9nUc  U4S jU 5       $ [        U5      m	UU	4S jU 5       $ s  snf )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   óV   >#   • U  H  oS    T;   US   T;   -  (       d  M  Uv •  M      g7f©r   é   N© )Ú.0ÚeÚnset1s     €ÚY/home/mande/repo/quber/.venv/lib/python3.13/site-packages/networkx/algorithms/boundary.pyÚ	<genexpr>Ú edge_boundary.<locals>.<genexpr>e   s(   øé € ÐFš5�a q¡T¨U¡]°q¸±t¸u±}Õ$E—‘š5ùs   ƒ) 	)c              3   óx   >#   • U  H/  nUS    T;   a	  US   T;   d  US   T;   d  M   US    T;   d  M+  Uv •  M1     g7fr   r   )r   r   r   Únset2s     €€r   r   r   g   sI   øé € ð âˆAØˆa‰D�E‹M˜a ™d e›m°°1±¸±ó 	
àCDÀQÁ4È5Á=÷ 	
‰Úùs   ƒ:¦:±	:)Úis_multigraphÚedgesÚset)
ÚGÚnbunch1Únbunch2r   r   r   Únr   r   r   s
           @@r   r   r      s…   ù€ ñF  Ó*š�1¨¡6�Q™Ñ*€Eð 	‡�×ÑØ—‘˜ D¸W�ÐE‰à—‘˜ D�Ð:ˆð
 �ÜF™5ÓFÐFÜ�‹L€Eõáóð ùò# +s
   ‡	A;”A;c                 ó¾   ^ • U Vs1 s H  o3T ;   d  M
  UiM     nn[        [        R                  " U 4S jU 5       5      5      U-
  nUb  U[        U5      -  nU$ s  snf )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   ó.   >#   • U  H
  nTU   v •  M     g 7f©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   `     r   r   r   n   s^   ø€ ñh  Ó*š�1¨¡6�Q™€EÐ*Ü
Œe×!Ò!Ô!6±Ó!6Ó6Ó
7¸%Ñ
?€Cð ÑØŒs�7‹|ÑˆØ€Jùò +s
   †	A“A)NFFNr!   )	Ú__doc__Ú	itertoolsr   ÚnetworkxÚnxÚ__all__Ú_dispatchabler   r   r   ó    r   Ú<module>r-      s`   ðñ	õ ã à˜OÐ
,€ð ×Ò˜f iÐ0ÀfÑMóWó NðWðt ×Ñó9ó ñ9r,   