ó
    …~i³(  ã                   óŒ  • S r SSKJr  SSKr/ SQr\R                  " SS9SS j5       r\R                  " SS9SS j5       r\R                  " SS9SS	 j5       r	\R                  " SS9SS
 j5       r
\R                  " SS9SS j5       r\R                  " SS9SS j5       r\R                  S 5       r\R                  S 5       rg)z5Functions for finding and evaluating cuts in a graph.é    )ÚchainN)Úboundary_expansionÚconductanceÚcut_sizeÚedge_expansionÚmixing_expansionÚnode_expansionÚnormalized_cut_sizeÚvolumeÚweight)Ú
edge_attrsc                 ó¼   • [         R                  " XX#SS9nU R                  5       (       a   [        U[         R                  " XXSS95      n[	        S U 5       5      $ )aß  Returns the size of the cut between two sets of nodes.

A *cut* is a partition of the nodes of a graph into two sets. The
*cut size* is the sum of the weights of the edges "between" the two
sets of nodes.

Parameters
----------
G : NetworkX graph

S : collection
    A collection of nodes in `G`.

T : collection
    A collection of nodes in `G`. If not specified, this is taken to
    be the set complement of `S`.

weight : object
    Edge attribute key to use as weight. If not specified, edges
    have weight one.

Returns
-------
number
    Total weight of all edges from nodes in set `S` to nodes in
    set `T` (and, in the case of directed graphs, all edges from
    nodes in `T` to nodes in `S`).

Examples
--------
In the graph with two cliques joined by a single edges, the natural
bipartition of the graph into two blocks, one for each clique,
yields a cut of weight one:

>>> G = nx.barbell_graph(3, 0)
>>> S = {0, 1, 2}
>>> T = {3, 4, 5}
>>> nx.cut_size(G, S, T)
1

Each parallel edge in a multigraph is counted when determining the
cut size:

>>> G = nx.MultiGraph(["ab", "ab"])
>>> S = {"a"}
>>> T = {"b"}
>>> nx.cut_size(G, S, T)
2

Notes
-----
In a multigraph, the cut size is the total weight of edges including
multiplicity.

é   )ÚdataÚdefaultc              3   ó*   #   • U  H	  u  po3v •  M     g 7f©N© )Ú.0ÚuÚvr   s       ÚU/home/mande/repo/quber/.venv/lib/python3.13/site-packages/networkx/algorithms/cuts.pyÚ	<genexpr>Úcut_size.<locals>.<genexpr>R   s   é € Ð0ª%™,˜! Œvª%ùó   ‚)ÚnxÚedge_boundaryÚis_directedr   Úsum)ÚGÚSÚTr   Úedgess        r   r   r      sP   € ôr ×Ò˜Q 1¸1Ñ=€EØ‡}�}‡�Ü�eœR×-Ò-¨a°AÈAÑNÓOˆÜÑ0©%Ó0Ó0Ð0ó    c                 óˆ   • U R                  5       (       a  U R                  OU R                  n[        S U" XS9 5       5      $ )a  Returns the volume of a set of nodes.

The *volume* of a set *S* is the sum of the (out-)degrees of nodes
in *S* (taking into account parallel edges in multigraphs). [1]

Parameters
----------
G : NetworkX graph

S : collection
    A collection of nodes in `G`.

weight : object
    Edge attribute key to use as weight. If not specified, edges
    have weight one.

Returns
-------
number
    The volume of the set of nodes represented by `S` in the graph
    `G`.

See also
--------
conductance
cut_size
edge_expansion
edge_boundary
normalized_cut_size

References
----------
.. [1] David Gleich.
       *Hierarchical Directed Spectral Graph Partitioning*.
       <https://www.cs.purdue.edu/homes/dgleich/publications/Gleich%202005%20-%20hierarchical%20directed%20spectral.pdf>

c              3   ó*   #   • U  H	  u  pUv •  M     g 7fr   r   )r   r   Úds      r   r   Úvolume.<locals>.<genexpr>}   s   é € Ð6Ò5‘T�Q�qÒ5ùr   ©r   )r   Ú
out_degreeÚdegreer   )r    r!   r   r+   s       r   r   r   U   s4   € ðN Ÿ]™]Ÿ_™_ˆQ�\Š\°!·(±(€FÜÑ6™V AÒ5Ó6Ó6Ð6r$   c                 óŽ   • Uc  [        U 5      [        U5      -
  n[        XX#S9n[        XUS9n[        XUS9nUSU-  SU-  -   -  $ )a‚  Returns the normalized size of the cut between two sets of nodes.

The *normalized cut size* is the cut size times the sum of the
reciprocal sizes of the volumes of the two sets. [1]

Parameters
----------
G : NetworkX graph

S : collection
    A collection of nodes in `G`.

T : collection
    A collection of nodes in `G`.

weight : object
    Edge attribute key to use as weight. If not specified, edges
    have weight one.

Returns
-------
number
    The normalized cut size between the two sets `S` and `T`.

Notes
-----
In a multigraph, the cut size is the total weight of edges including
multiplicity.

See also
--------
conductance
cut_size
edge_expansion
volume

References
----------
.. [1] David Gleich.
       *Hierarchical Directed Spectral Graph Partitioning*.
       <https://www.cs.purdue.edu/homes/dgleich/publications/Gleich%202005%20-%20hierarchical%20directed%20spectral.pdf>

©r"   r   r)   r   )Úsetr   r   ©r    r!   r"   r   Únum_cut_edgesÚvolume_SÚvolume_Ts          r   r
   r
   €   sW   € ðZ 	�yÜ�‹F”S˜“V‰OˆÜ˜Q QÑ6€MÜ�a 6Ñ*€HÜ�a 6Ñ*€HØ˜Q ™\¨a°(©lÑ;Ñ<Ð<r$   c                 óŽ   • Uc  [        U 5      [        U5      -
  n[        XX#S9n[        XUS9n[        XUS9nU[        XV5      -  $ )a   Returns the conductance of two sets of nodes.

The *conductance* is the quotient of the cut size and the smaller of
the volumes of the two sets. [1]

Parameters
----------
G : NetworkX graph

S : collection
    A collection of nodes in `G`.

T : collection
    A collection of nodes in `G`.

weight : object
    Edge attribute key to use as weight. If not specified, edges
    have weight one.

Returns
-------
number
    The conductance between the two sets `S` and `T`.

See also
--------
cut_size
edge_expansion
normalized_cut_size
volume

References
----------
.. [1] David Gleich.
       *Hierarchical Directed Spectral Graph Partitioning*.
       <https://www.cs.purdue.edu/homes/dgleich/publications/Gleich%202005%20-%20hierarchical%20directed%20spectral.pdf>

r)   )r.   r   r   Úminr/   s          r   r   r   µ   sO   € ðP 	�yÜ�‹F”S˜“V‰OˆÜ˜Q 1Ñ4€MÜ�a 6Ñ*€HÜ�a 6Ñ*€HØœ3˜xÓ2Ñ2Ð2r$   c                 óŒ   • Uc  [        U 5      [        U5      -
  n[        XX#S9nU[        [        U5      [        U5      5      -  $ )a5  Returns the edge expansion between two node sets.

The *edge expansion* is the quotient of the cut size and the smaller
of the cardinalities of the two sets. [1]

Parameters
----------
G : NetworkX graph

S : collection
    A collection of nodes in `G`.

T : collection
    A collection of nodes in `G`.

weight : object
    Edge attribute key to use as weight. If not specified, edges
    have weight one.

Returns
-------
number
    The edge expansion between the two sets `S` and `T`.

See also
--------
boundary_expansion
mixing_expansion
node_expansion

References
----------
.. [1] Fan Chung.
       *Spectral Graph Theory*.
       (CBMS Regional Conference Series in Mathematics, No. 92),
       American Mathematical Society, 1997, ISBN 0-8218-0315-8
       <http://www.math.ucsd.edu/~fan/research/revised.html>

r-   )r.   r   r4   Úlen)r    r!   r"   r   r0   s        r   r   r   å   sA   € ðR 	�yÜ�‹F”S˜“V‰OˆÜ˜Q QÑ6€MØœ3œs 1›v¤s¨1£vÓ.Ñ.Ð.r$   c                 óF   • [        XX#S9nU R                  5       nUSU-  -  $ )uÿ  Returns the mixing expansion between two node sets.

The *mixing expansion* is the quotient of the cut size and twice the
number of edges in the graph. [1]

Parameters
----------
G : NetworkX graph

S : collection
    A collection of nodes in `G`.

T : collection
    A collection of nodes in `G`.

weight : object
    Edge attribute key to use as weight. If not specified, edges
    have weight one.

Returns
-------
number
    The mixing expansion between the two sets `S` and `T`.

See also
--------
boundary_expansion
edge_expansion
node_expansion

References
----------
.. [1] Vadhan, Salil P.
       "Pseudorandomness."
       *Foundations and Trends
       in Theoretical Computer Science* 7.1â€“3 (2011): 1â€“336.
       <https://doi.org/10.1561/0400000010>

r-   é   )r   Únumber_of_edges)r    r!   r"   r   r0   Únum_total_edgess         r   r   r     s/   € ôR ˜Q QÑ6€MØ×'Ñ'Ó)€OØ˜A Ñ/Ñ0Ð0r$   c                 ó„   ^ • [        [        R                  " U 4S jU 5       5      5      n[        U5      [        U5      -  $ )uQ  Returns the node expansion of the set `S`.

The *node expansion* is the quotient of the size of the node
boundary of *S* and the cardinality of *S*. [1]

Parameters
----------
G : NetworkX graph

S : collection
    A collection of nodes in `G`.

Returns
-------
number
    The node expansion of the set `S`.

See also
--------
boundary_expansion
edge_expansion
mixing_expansion

References
----------
.. [1] Vadhan, Salil P.
       "Pseudorandomness."
       *Foundations and Trends
       in Theoretical Computer Science* 7.1â€“3 (2011): 1â€“336.
       <https://doi.org/10.1561/0400000010>

c              3   óF   >#   • U  H  nTR                  U5      v •  M     g 7fr   )Ú	neighbors)r   r   r    s     €r   r   Ú!node_expansion.<locals>.<genexpr>f  s   øé € Ð*EÂ1¸a¨1¯;©;°q¯>¨>Â1ùs   ƒ!)r.   r   Úfrom_iterabler6   )r    r!   Úneighborhoods   `  r   r	   r	   D  s5   ø€ ôD ”u×*Ò*Ô*EÁ1Ó*EÓEÓF€LÜˆ|Óœs 1›vÑ%Ð%r$   c                 óX   • [        [        R                  " X5      5      [        U5      -  $ )u[  Returns the boundary expansion of the set `S`.

The *boundary expansion* of a set `S` is the ratio between the size of its
node boundary and the cardinality of the set itself [1]_ .

Parameters
----------
G : NetworkX graph
    The input graph.

S : collection
    A collection of nodes in `G`.

Returns
-------
number
    The boundary expansion ratio: size of node boundary / size of `S`.

Examples
--------
The node boundary is {2, 3} (size 2), divided by ``|S|=2``:

>>> G = nx.cycle_graph(4)
>>> S = {0, 1}
>>> nx.boundary_expansion(G, S)
1.0

For disconnected sets, e.g. here where the node boundary is ``{1, 3, 5}``:

>>> G = nx.cycle_graph(6)
>>> S = {0, 2, 4}
>>> nx.boundary_expansion(G, S)
1.0

See also
--------
:func:`~networkx.algorithms.boundary.node_boundary`
edge_expansion
mixing_expansion
node_expansion

Notes
-----
The node boundary is defined as all nodes not in `S` that are adjacent to
nodes in `S`.

References
----------
.. [1] Vadhan, Salil P.
   "Pseudorandomness." *Foundations and Trends in Theoretical Computer Science*
   7.1â€“3 (2011): 1â€“336. <https://doi.org/10.1561/0400000010>
)r6   r   Únode_boundary)r    r!   s     r   r   r   j  s$   € ôl Œr×Ò Ó%Ó&¬¨Q«Ñ/Ð/r$   )NNr   )Ú__doc__Ú	itertoolsr   Únetworkxr   Ú__all__Ú_dispatchabler   r   r
   r   r   r   r	   r   r   r$   r   Ú<module>rH      s
  ðÙ ;å ã ò	€ð ×Ò˜XÑ&ó;1ó 'ð;1ð| ×Ò˜XÑ&ó'7ó 'ð'7ðT ×Ò˜XÑ&ó1=ó 'ð1=ðh ×Ò˜XÑ&ó,3ó 'ð,3ð^ ×Ò˜XÑ&ó+/ó 'ð+/ð\ ×Ò˜XÑ&ó*1ó 'ð*1ð^ ×Ññ"&ó ð"&ðJ ×Ññ50ó ñ50r$   