Ë
    D^(h'  ã                   ó¤  — d Z ddlmZ ddlZg d¢Z ej                  d¬«      dd„«       Z ej                  d¬«      dd„«       Z ej                  d¬«      dd	„«       Z	 ej                  d¬«      dd
„«       Z
 ej                  d¬«      dd„«       Z ej                  d¬«      dd„«       Zej                  d„ «       Zej                  d„ «       Zy)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           
      óÂ   — t        j                  | |||d¬«      }| j                  «       r$t        |t        j                  | |||d¬«      «      }t	        d„ |D «       «      S )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   ó(   K  — | ]
  \  }}}|–— Œ y ­w©N© )Ú.0ÚuÚvr   s       úV/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/networkx/algorithms/cuts.pyú	<genexpr>zcut_size.<locals>.<genexpr>R   s   è ø€ Ò0™,˜!˜Q ŒvÑ0ùs   ‚)ÚnxÚedge_boundaryÚis_directedr   Úsum)ÚGÚSÚTr   Úedgess        r   r   r      sV   € ôr ×Ñ˜Q  1¨6¸1Ô=€EØ‡}�}„Ü�eœR×-Ñ-¨a°°A¸FÈAÔNÓOˆÜÑ0¨%Ô0Ó0Ð0ó    c                 ó†   — | j                  «       r| j                  n| j                  }t        d„  |||¬«      D «       «      S )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   ó&   K  — | ]	  \  }}|–— Œ y ­wr   r   )r   r   Úds      r   r   zvolume.<locals>.<genexpr>}   s   è ø€ Ò6‘T�Q˜ŒqÑ6ùs   ‚©r   )r   Ú
out_degreeÚdegreer   )r   r   r   r(   s       r   r   r   U   s4   € ðN Ÿ]™]œ_ˆQ�\Š\°!·(±(€FÜÑ6™V A¨fÔ5Ô6Ó6Ð6r"   c                 ó¦   — |€t        | «      t        |«      z
  }t        | |||¬«      }t        | ||¬«      }t        | ||¬«      }|d|z  d|z  z   z  S )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
   €   s_   € ðZ 	€yÜ�‹F”S˜“V‰OˆÜ˜Q  Q¨vÔ6€MÜ�a˜ 6Ô*€HÜ�a˜ 6Ô*€HØ˜Q ™\¨a°(©lÑ;Ñ<Ð<r"   c                 ó¨   — |€t        | «      t        |«      z
  }t        | |||¬«      }t        | ||¬«      }t        | ||¬«      }|t        ||«      z  S )ap  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   µ   sY   € ðP 	€yÜ�‹F”S˜“V‰OˆÜ˜Q  1¨VÔ4€MÜ�a˜ 6Ô*€HÜ�a˜ 6Ô*€HØœ3˜x¨Ó2Ñ2Ð2r"   c                 ó”   — |€t        | «      t        |«      z
  }t        | |||¬«      }|t        t        |«      t        |«      «      z  S )a©  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   r1   Úlen)r   r   r    r   r-   s        r   r   r   å   sE   € ðR 	€yÜ�‹F”S˜“V‰OˆÜ˜Q  Q¨vÔ6€MØœ3œs 1›v¤s¨1£vÓ.Ñ.Ð.r"   c                 óP   — t        | |||¬«      }| j                  «       }|d|z  z  S )us  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   r   r     s3   € ôR ˜Q  Q¨vÔ6€MØ×'Ñ'Ó)€OØ˜A Ñ/Ñ0Ð0r"   c                 ó€   ‡ — t        t        j                  ˆ fd„|D «       «      «      }t        |«      t        |«      z  S )u±  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   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr   )Ú	neighbors)r   r   r   s     €r   r   z!node_expansion.<locals>.<genexpr>f  s   øè ø€ Ò*E¸a¨1¯;©;°q¯>Ñ*Eùs   ƒ)r+   r   Úfrom_iterabler3   )r   r   Úneighborhoods   `  r   r	   r	   D  s5   ø€ ôD ”u×*Ñ*Ó*EÀ1Ô*EÓEÓF€LÜˆ|Óœs 1›vÑ%Ð%r"   c                 óX   — t        t        j                  | |«      «      t        |«      z  S )u²  Returns the boundary expansion of the set `S`.

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

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

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

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

    See also
    --------
    edge_expansion
    mixing_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>

    )r3   r   Únode_boundary)r   r   s     r   r   r   l  s&   € ôD Œr×Ñ  1Ó%Ó&¬¨Q«Ñ/Ð/r"   )NNr   )Ú__doc__Ú	itertoolsr   Únetworkxr   Ú__all__Ú_dispatchabler   r   r
   r   r   r   r	   r   r   r"   r   ú<module>rD      s  ðÙ ;å ã ò	€ð €×Ñ˜XÔ&ò;1ó 'ð;1ð| €×Ñ˜XÔ&ò'7ó 'ð'7ðT €×Ñ˜XÔ&ò1=ó 'ð1=ðh €×Ñ˜XÔ&ò,3ó 'ð,3ð^ €×Ñ˜XÔ&ò+/ó 'ð+/ð\ €×Ñ˜XÔ&ò*1ó 'ð*1ð^ ×Ññ"&ó ð"&ðN ×Ññ!0ó ñ!0r"   