
    Pi                      D   d Z ddlmZ ddlmZ ddlmZ ddlZddl	m
Z
 ddlmZ g d	Zej        d
             Zd Z e
d           e
d          ej        d                                     Z e
d           e
d          ej        d                                     ZdS )zI
=======================
Distance-regular graphs
=======================
    )defaultdict)combinations_with_replacement)logN)not_implemented_for   )diameter)is_distance_regularis_strongly_regularintersection_arrayglobal_parametersc                 R    	 t          |            dS # t          j        $ r Y dS w xY w)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

    TF)r   nxNetworkXErrorGs    x/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/networkx/algorithms/distance_regular.pyr	   r	      s@    R1t   uus    &&c                 L      fdt           dgz   dg|z             D             S )a  Returns global parameters for a given intersection array.

    Given a distance-regular graph G with diameter d and 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   @   K   | ]\  }}|d          |z
  |z
  |fV  dS )r   N ).0xybs      r   	<genexpr>z$global_parameters.<locals>.<genexpr>q   s:      CCTQQ!q1a CCCCCC    r   )zip)r   cs   ` r   r   r   H   s7    R DCCCSaS1#'-B-BCCCCr   directed
multigraphc                    t          j        |           rt          j        |           st          j        d          t	          t
                    }i i d}dt          t          |           d          z  dz  }t          | d          D ]\  }}||         |vrM	                    t          j
        | |                                                     D ]\  }}|||         |<   ||         |         t          |          }||k    rt          j        d          | |         }|D ][}	||	         }
||
vrM|
	                    t          j
        | |	                     |
                                D ]\  }}|||         |	<   \t          fd|D                       }t          fd|D                       }                    |          |k    s                    |          |k    rt          j        d          |<   |<   fd	t          |          D             f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.r            c              3   :   K   | ]}|         d z
  k    d V  dS r   Nr   r   nipl_us     r   r   z%intersection_array.<locals>.<genexpr>   5      55aDGq1u$4$4$4$4$4$455r   c              3   :   K   | ]}|         d z   k    d V  dS r%   r   r&   s     r   r   z%intersection_array.<locals>.<genexpr>   r*   r   zGraph is not distance regularc                 <    g | ]}                     |d           S )r   get)r   jbints     r   
<listcomp>z&intersection_array.<locals>.<listcomp>   s%    ---A!Q---r   c                 B    g | ]}                     |d z   d          S )r   r   r-   )r   r/   cints     r   r1   z&intersection_array.<locals>.<listcomp>   s+    111!a%		111r   )r   
is_regularis_connectedr   r   dictr   lenr   update"single_source_shortest_path_lengthitemsmaxsumr.   range)r   path_lengthdiammax_diameter_for_dr_graphsuvr   distancevnbrsr'   pl_nr   r   r0   r3   r(   r)   s                @@@@r   r   r   t   s   d = A2?1#5#5 A?@@@d##KDD
 D"#c#a&&!nn"4!9-a33    11~D==KK=aCCDDD#zz|| - -8$,Aq!!N14|| ,,,"#CDDD! 	1 	1Aq>D}}BA!QGGHHH#'::<< 1 1KAx(0KN1%% 555555555555555555555588Aq>>Q$((1a..A"5"5"#BCCCQQ 	.---t---1111U4[[111 r   c                 F    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   s    r   r
   r
      s#    j q!!6hqkkQ&66r   )__doc__collectionsr   	itertoolsr   mathr   networkxr   networkx.utilsr   distance_measuresr   __all___dispatchabler	   r   r   r
   r   r   r   <module>rP      s_    $ # # # # # 3 3 3 3 3 3           . . . . . . ' ' ' ' ' '   , , ,^)D )D )DX Z  \""` `  #" ! `H Z  \""27 27  #" ! 27 27 27r   