U
    ¹mœdØ  ã                   @   sh   d Z ddlZddlmZ ddlmZ dddd	gZd
d„ Zdd	„ Z	eddƒdd„ ƒZ
eddƒdd„ ƒZdS )zI
=======================
Distance-regular graphs
=======================
é    N)Únot_implemented_foré   )ÚdiameterÚis_distance_regularÚis_strongly_regularÚintersection_arrayÚglobal_parametersc                 C   s,   zt | ƒ W dS  tjk
r&   Y dS X dS )a  Returns True if the graph is distance regular, False otherwise.

    A connected graph G is distance-regular if for any nodes x,y
    and any integers i,j=0,1,...,d (where d is the graph
    diameter), the number of vertices at distance i from x and
    distance j from y depends only on i,j and the graph distance
    between x and y, independently of the choice of x and y.

    Parameters
    ----------
    G: Networkx graph (undirected)

    Returns
    -------
    bool
      True if the graph is Distance Regular, False otherwise

    Examples
    --------
    >>> G = nx.hypercube_graph(6)
    >>> nx.is_distance_regular(G)
    True

    See Also
    --------
    intersection_array, global_parameters

    Notes
    -----
    For undirected and simple graphs only

    References
    ----------
    .. [1] Brouwer, A. E.; Cohen, A. M.; and Neumaier, A.
        Distance-Regular Graphs. New York: Springer-Verlag, 1989.
    .. [2] Weisstein, Eric W. "Distance-Regular Graph."
        http://mathworld.wolfram.com/Distance-RegularGraph.html

    TFN)r   ÚnxÚNetworkXError©ÚG© r   ú]/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/networkx/algorithms/distance_regular.pyr      s
    (c                    s$   ‡ fdd„t ˆ dg dg| ƒD ƒS )a„  Returns global parameters for a given intersection array.

    Given a distance-regular graph G with integers b_i, c_i,i = 0,....,d
    such that for any 2 vertices x,y in G at a distance i=d(x,y), there
    are exactly c_i neighbors of y at a distance of i-1 from x and b_i
    neighbors of y at a distance of i+1 from x.

    Thus, a distance regular graph has the global parameters,
    [[c_0,a_0,b_0],[c_1,a_1,b_1],......,[c_d,a_d,b_d]] for the
    intersection array  [b_0,b_1,.....b_{d-1};c_1,c_2,.....c_d]
    where a_i+b_i+c_i=k , k= degree of every vertex.

    Parameters
    ----------
    b : list

    c : list

    Returns
    -------
    iterable
       An iterable over three tuples.

    Examples
    --------
    >>> G = nx.dodecahedral_graph()
    >>> b, c = nx.intersection_array(G)
    >>> list(nx.global_parameters(b, c))
    [(0, 0, 3), (1, 0, 2), (1, 1, 1), (1, 1, 1), (2, 0, 1), (3, 0, 0)]

    References
    ----------
    .. [1] Weisstein, Eric W. "Global Parameters."
       From MathWorld--A Wolfram Web Resource.
       http://mathworld.wolfram.com/GlobalParameters.html

    See Also
    --------
    intersection_array
    c                 3   s(   | ] \}}|ˆ d  | | |fV  qdS )r   Nr   )Ú.0ÚxÚy©Úbr   r   Ú	<genexpr>l   s     z$global_parameters.<locals>.<genexpr>r   )Úzip)r   Úcr   r   r   r   C   s    )ZdirectedZ
multigraphc           
         sb  t |  ¡ ƒ}t|ƒ\}}|D ]\}}||kr6t d¡‚|}qtt | ¡ƒ‰t‡fdd„ˆD ƒƒ}i ‰ i ‰| D ]È‰| D ]¾}zˆˆ | ‰W n. tk
r¶ } zt d¡|‚W 5 d}~X Y nX t	‡‡‡fdd„| | D ƒƒ}t	‡‡‡fdd„| | D ƒƒ}	ˆ 
ˆ|¡|k�sˆ  
ˆ|	¡|	k�r"t d¡‚|	ˆ ˆ< |ˆˆ< qtql‡ fd	d„t|ƒD ƒ‡fd
d„t|ƒD ƒfS )a�  Returns the intersection array of a distance-regular graph.

    Given a distance-regular graph G with integers b_i, c_i,i = 0,....,d
    such that for any 2 vertices x,y in G at a distance i=d(x,y), there
    are exactly c_i neighbors of y at a distance of i-1 from x and b_i
    neighbors of y at a distance of i+1 from x.

    A distance regular graph's intersection array is given by,
    [b_0,b_1,.....b_{d-1};c_1,c_2,.....c_d]

    Parameters
    ----------
    G: Networkx graph (undirected)

    Returns
    -------
    b,c: tuple of lists

    Examples
    --------
    >>> G = nx.icosahedral_graph()
    >>> nx.intersection_array(G)
    ([5, 2, 1], [1, 2, 5])

    References
    ----------
    .. [1] Weisstein, Eric W. "Intersection Array."
       From MathWorld--A Wolfram Web Resource.
       http://mathworld.wolfram.com/IntersectionArray.html

    See Also
    --------
    global_parameters
    zGraph is not distance regular.c                 3   s   | ]}t ˆ |  ¡ ƒV  qd S )N)ÚmaxÚvalues©r   Ún)Úpath_lengthr   r   r   ›   s     z%intersection_array.<locals>.<genexpr>Nc                    s$   g | ]}ˆ| ˆ ˆ d  kr|‘qS ©r   r   r   ©Úir   Úur   r   Ú
<listcomp>¥   s      z&intersection_array.<locals>.<listcomp>c                    s$   g | ]}ˆ| ˆ ˆ d  kr|‘qS r   r   r   r   r   r   r    §   s      zGraph is not distance regularc                    s   g | ]}ˆ   |d ¡‘qS )r   ©Úget©r   Új)Úbintr   r   r    ®   s     c                    s   g | ]}ˆ   |d  d¡‘qS )r   r   r!   r#   )Úcintr   r   r    ¯   s     )ÚiterÚdegreeÚnextr	   r
   ÚdictZall_pairs_shortest_path_lengthr   ÚKeyErrorÚlenr"   Úrange)
r   r(   Ú_ÚkZknextr   ÚvÚerrr   r   r   )r%   r&   r   r   r   r   r   o   s2    %
$
þc                 C   s   t | ƒot| ƒdkS )a  Returns True if and only if the given graph is strongly
    regular.

    An undirected graph is *strongly regular* if

    * it is regular,
    * each pair of adjacent vertices has the same number of neighbors in
      common,
    * each pair of nonadjacent vertices has the same number of neighbors
      in common.

    Each strongly regular graph is a distance-regular graph.
    Conversely, if a distance-regular graph has diameter two, then it is
    a strongly regular graph. For more information on distance-regular
    graphs, see :func:`is_distance_regular`.

    Parameters
    ----------
    G : NetworkX graph
        An undirected graph.

    Returns
    -------
    bool
        Whether `G` is strongly regular.

    Examples
    --------

    The cycle graph on five vertices is strongly regular. It is
    two-regular, each pair of adjacent vertices has no shared neighbors,
    and each pair of nonadjacent vertices has one shared neighbor::

        >>> G = nx.cycle_graph(5)
        >>> nx.is_strongly_regular(G)
        True

    é   )r   r   r   r   r   r   r   ´   s    3)Ú__doc__Znetworkxr	   Znetworkx.utilsr   Zdistance_measuresr   Ú__all__r   r   r   r   r   r   r   r   Ú<module>   s   ü/,
D