Ë
    D^(h  ã                   óZ   — d Z ddlmZ ddlmZ ddlZddlmZ ddgZ	dd	„Z
dd
„Zdd„Zd„ Zy)zB
Cuthill-McKee ordering of graph nodes to produce sparse matrices
é    )Údeque)Ú
itemgetterNé   )Úarbitrary_elementÚcuthill_mckee_orderingÚreverse_cuthill_mckee_orderingc              #   óŠ   K  — t        j                  | «      D ]%  }t        | j                  |«      |«      E d{  –—†  Œ' y7 Œ­w)aÝ  Generate an ordering (permutation) of the graph nodes to make
    a sparse matrix.

    Uses the Cuthill-McKee heuristic (based on breadth-first search) [1]_.

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

    heuristic : function, optional
      Function to choose starting node for RCM algorithm.  If None
      a node from a pseudo-peripheral pair is used.  A user-defined function
      can be supplied that takes a graph object and returns a single node.

    Returns
    -------
    nodes : generator
       Generator of nodes in Cuthill-McKee ordering.

    Examples
    --------
    >>> from networkx.utils import cuthill_mckee_ordering
    >>> G = nx.path_graph(4)
    >>> rcm = list(cuthill_mckee_ordering(G))
    >>> A = nx.adjacency_matrix(G, nodelist=rcm)

    Smallest degree node as heuristic function:

    >>> def smallest_degree(G):
    ...     return min(G, key=G.degree)
    >>> rcm = list(cuthill_mckee_ordering(G, heuristic=smallest_degree))


    See Also
    --------
    reverse_cuthill_mckee_ordering

    Notes
    -----
    The optimal solution the bandwidth reduction is NP-complete [2]_.


    References
    ----------
    .. [1] E. Cuthill and J. McKee.
       Reducing the bandwidth of sparse symmetric matrices,
       In Proc. 24th Nat. Conf. ACM, pages 157-172, 1969.
       http://doi.acm.org/10.1145/800195.805928
    .. [2]  Steven S. Skiena. 1997. The Algorithm Design Manual.
       Springer-Verlag New York, Inc., New York, NY, USA.
    N)ÚnxÚconnected_componentsÚ connected_cuthill_mckee_orderingÚsubgraph)ÚGÚ	heuristicÚcs      úP/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/networkx/utils/rcm.pyr   r      s@   è ø€ ôj ×$Ñ$ QÓ'ò NˆÜ3°A·J±J¸q³MÀ9ÓM×MÑMñNØMús   ‚7A¹AºAc                 ó@   — t        t        t        | |¬«      «      «      S )aÿ  Generate an ordering (permutation) of the graph nodes to make
    a sparse matrix.

    Uses the reverse Cuthill-McKee heuristic (based on breadth-first search)
    [1]_.

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

    heuristic : function, optional
      Function to choose starting node for RCM algorithm.  If None
      a node from a pseudo-peripheral pair is used.  A user-defined function
      can be supplied that takes a graph object and returns a single node.

    Returns
    -------
    nodes : generator
       Generator of nodes in reverse Cuthill-McKee ordering.

    Examples
    --------
    >>> from networkx.utils import reverse_cuthill_mckee_ordering
    >>> G = nx.path_graph(4)
    >>> rcm = list(reverse_cuthill_mckee_ordering(G))
    >>> A = nx.adjacency_matrix(G, nodelist=rcm)

    Smallest degree node as heuristic function:

    >>> def smallest_degree(G):
    ...     return min(G, key=G.degree)
    >>> rcm = list(reverse_cuthill_mckee_ordering(G, heuristic=smallest_degree))


    See Also
    --------
    cuthill_mckee_ordering

    Notes
    -----
    The optimal solution the bandwidth reduction is NP-complete [2]_.

    References
    ----------
    .. [1] E. Cuthill and J. McKee.
       Reducing the bandwidth of sparse symmetric matrices,
       In Proc. 24th Nat. Conf. ACM, pages 157-72, 1969.
       http://doi.acm.org/10.1145/800195.805928
    .. [2]  Steven S. Skiena. 1997. The Algorithm Design Manual.
       Springer-Verlag New York, Inc., New York, NY, USA.
    )r   )ÚreversedÚlistr   )r   r   s     r   r   r   H   s   € ôj ”DÔ/°¸YÔGÓHÓIÐIó    c              #   ój  K  — |€t        | «      }n || «      }|h}t        |g«      }|r‚|j                  «       }|–— t        | j	                  t        | |   «      |z
  «      t        d«      ¬«      }|D ��cg c]  \  }}|‘Œ	 }	}}|j                  |	«       |j                  |	«       |rŒ�y y c c}}w ­w)Né   ©Úkey)	Úpseudo_peripheral_noder   ÚpopleftÚsortedÚdegreeÚsetr   ÚupdateÚextend)
r   r   ÚstartÚvisitedÚqueueÚparentÚndÚnÚdÚchildrens
             r   r   r   €   s£   è ø€ àÐÜ& qÓ)‰á˜!“ˆØˆg€GÜ�5�'‹N€EÙ
Ø—‘“ˆØŠÜ�A—H‘HœS  6¡›^¨gÑ5Ó6¼JÀq»MÔJˆØ"$×%™$˜!˜Q’AÐ%ˆÑ%Ø�‰�xÔ Ø�‰�XÔô ùó &ùs   ‚A5B3Á7B-Â'B3Â+B3c                 ó,  ‡— t        | «      }d}|}	 t        t        j                  | |«      «      }t	        |j                  «       «      Š‰|k  r	 |S ‰}ˆfd„|j                  «       D «       }t        | j                  |«      t        d«      ¬«      \  }}Œ„)Nr   c              3   ó4   •K  — | ]  \  }}|‰k(  sŒ|–— Œ y ­w©N© )Ú.0r&   ÚdistÚls      €r   ú	<genexpr>z)pseudo_peripheral_node.<locals>.<genexpr>�   s   øè ø€ Ò>™'˜!˜T°D¸A³I”AÑ>ùs   ƒ‘r   r   )
r   Údictr
   Úshortest_path_lengthÚmaxÚvaluesÚitemsÚminr   r   )r   ÚuÚlpÚvÚsplÚfarthestÚdegr/   s          @r   r   r   ‘   s�   ø€ ô 	˜!Ó€AØ	
€BØ	€AØ
Ü”2×*Ñ*¨1¨aÓ0Ó1ˆÜ�—
‘
“ÓˆØ�Š7Øð €Hð ˆÛ> S§Y¡Y£[Ô>ˆÜ�Q—X‘X˜hÓ'¬Z¸«]Ô;‰ˆˆ3ð r   r+   )Ú__doc__Úcollectionsr   Úoperatorr   Únetworkxr
   Úutilsr   Ú__all__r   r   r   r   r,   r   r   ú<module>rC      s;   ðñõ Ý ã å %à#Ð%EÐ
F€ó6Nór5Jópó"r   