
    \Mh
                     \    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dS )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          |                     |          |          E d{V  ,dS )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      R/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/networkx/utils/rcm.pyr   r      s`      j $Q'' N N3AJJqMM9MMMMMMMMMMN N    c                 X    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GGHHIIIr   c              #     K   |t          |           }n ||           }|h}t          |g          }|r|                                }|V  t          |                     t          | |                   |z
            t          d                    }d |D             }|                    |           |                    |           |d S d S )N   keyc                     g | ]\  }}|S  r   ).0nds      r   
<listcomp>z4connected_cuthill_mckee_ordering.<locals>.<listcomp>   s    %%%$!QA%%%r   )	pseudo_peripheral_noder   popleftsorteddegreesetr   updateextend)r   r   startvisitedqueueparentndchildrens           r   r   r      s      &q))	!gG5'NNE
 AHHS6^^g566JqMMJJJ%%"%%%x   X      r   c                 X   t          |           }d}|}	 t          j        | |          }t          |                                          |k    rnW}fd|                                D             }t          |                     |          t          d                    \  }}|S )Nr   Tc              3   .   K   | ]\  }}|k    |V  d S Nr   )r   r   distls      r   	<genexpr>z)pseudo_peripheral_node.<locals>.<genexpr>   s+      >>'!TDAIIAIIII>>r   r   r   )	r   r
   shortest_path_lengthmaxvaluesitemsminr#   r   )r   ulpvsplfarthestdegr1   s          @r   r    r       s     	!A	
B	A<%a++

77>>>>SYY[[>>>QXXh''Z]];;;3< Hr   r/   )__doc__collectionsr   operatorr   networkxr
   utilsr   __all__r   r   r   r    r   r   r   <module>rD      s                     % % % % % %#%E
F6N 6N 6N 6Nr5J 5J 5J 5Jp   "    r   