+
    )i(                        R t ^ RIHt ^ RIt. ROt]P                  ! RR7      RR l4       t]P                  ! RR7      RR l4       t]P                  ! RR7      RR l4       t	]P                  ! RR7      RR l4       t
]P                  ! RR7      RR	 l4       t]P                  ! RR7      RR
 l4       t]P                  R 4       t]P                  R 4       tR# )z5Functions for finding and evaluating cuts in a graph.)chainNweight)
edge_attrsc                    \         P                  ! WW#^R7      pV P                  4       '       d$   \        V\         P                  ! WW^R7      4      p\	        R V 4       4      # )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   *   "   T F	  w  rq3x  K  	  R # 5iN ).0uvr   s   &   V/var/www/html/photoedit/myenv/lib/python3.14/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   cut_sizer      sP    r Q11=E}}eR--aAANO0%000    c                    V P                  4       '       d   V P                  MV P                  p\        R V! WR7       4       4      # )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   *   "   T F	  w  rVx  K  	  R # 5ir	   r
   )r   r   ds   &  r   r   volume.<locals>.<genexpr>}   s     65TQq5r   r   )r   
out_degreedegreer   )r   r   r   r"   s   &&& r   volumer#   U   s4    N ]]__Q\\!((F6VA5666r   c                    Vf   \        V 4      \        V4      ,
          p\        WW#R7      p\        WVR7      p\        WVR7      pV^V,          ^V,          ,           ,          # )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    )setr   r#   r   r   r   r   num_cut_edgesvolume_Svolume_Ts   &&&&   r   normalized_cut_sizer+      sW    Z 	yFSVOQQ6Ma6*Ha6*HQ\a(l;<<r   c                    Vf   \        V 4      \        V4      ,
          p\        WW#R7      p\        WVR7      p\        WVR7      pV\        WV4      ,          # )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   conductancer.      sO    P 	yFSVOQ14Ma6*Ha6*H3x222r   c                    Vf   \        V 4      \        V4      ,
          p\        WW#R7      pV\        \        V4      \        V4      4      ,          # )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   r-   len)r   r   r   r   r(   s   &&&& r   edge_expansionr1      sA    R 	yFSVOQQ6M3s1vs1v...r   c                \    \        WW#R7      pV P                  4       pV^V,          ,          # )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   r(   num_total_edgess   &&&&  r   mixing_expansionr5     s/    R QQ6M'')OA/00r   c                   a  \        \        P                  ! V 3R lV 4       4      4      p\        V4      \        V4      ,          # )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   <"   T F  pSP                  V4      x  K  	  R # 5ir	   )	neighbors)r   r   r   s   & r   r   !node_expansion.<locals>.<genexpr>f  s     *E1a1;;q>>1s   !)r&   r   from_iterabler0   )r   r   neighborhoods   f& r   node_expansionr<   D  s5    D u***E1*EEFL|s1v%%r   c                `    \        \        P                  ! W4      4      \        V4      ,          # )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>
)r0   r   node_boundary)r   r   s   &&r   boundary_expansionr?   j  s$    l r%&Q//r   )r?   r.   r   r1   r5   r<   r+   r#   )NNr	   )__doc__	itertoolsr   networkxr   __all___dispatchabler   r#   r+   r.   r1   r5   r<   r?   r
   r   r   <module>rE      s
   ;  	 X&;1 ';1| X&'7 ''7T X&1= '1=h X&,3 ',3^ X&+/ '+/\ X&*1 '*1^ "& "&J 50 50r   