
    h                         S r SSKrSSKJr  SSKJr  / SQr\R                  S 5       r	S r
\" S	5      \" S
5      \R                  S 5       5       5       r\" S	5      \" S
5      \R                  S 5       5       5       rg)zI
=======================
Distance-regular graphs
=======================
    N)not_implemented_for   )diameter)is_distance_regularis_strongly_regularintersection_arrayglobal_parametersc                 P     [        U 5        g! [        R                   a     gf = f)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    V/var/www/html/env/lib/python3.13/site-packages/networkx/algorithms/distance_regular.pyr   r      s+    R1 s    %%c                 @   ^  U 4S j[        T S/-   S/U-   5       5       $ )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   D   >#    U  H  u  pUTS    U-
  U-
  U4v   M     g7f)r   N ).0xybs      r   	<genexpr>$global_parameters.<locals>.<genexpr>m   s(     C-BTQQ!q1a -Bs    r   )zip)r   cs   ` r   r	   r	   D   s%    R DSaS1#'-BCC    directed
multigraphc           
        ^ [        U 5      S:X  a  [        R                  " S5      e[        U R	                  5       5      n[        U5      u  p#U H"  u  p$XC:w  a  [        R                  " S5      eUnM$     [        [        R                  " U 5      5      m[        U4S jT 5       5      n0 n0 nU  H  nU  H  n	 TU   U	   n
[        X	    Vs/ s H  nTU   U   U
S-
  :X  d  M  UPM     sn5      n[        X	    Vs/ s H  nTU   U   U
S-   :X  d  M  UPM     sn5      nUR                  X5      U:w  d  UR                  X5      U:w  a  [        R                  " S5      eXU
'   XU
'   M     M     [        U5       Vs/ s H  oR                  US5      PM     sn[        U5       Vs/ s H  oR                  US-   S5      PM     sn4$ ! [         a  n[        R                  " S5      UeSnAff = fs  snf s  snf s  snf s  snf )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
r   zGraph has no nodes.zGraph is not distance regular.c              3   \   >#    U  H!  n[        TU   R                  5       5      v   M#     g 7f)N)maxvalues)r   npath_lengths     r   r   %intersection_array.<locals>.<genexpr>   s&     EA3{1~,,.//s   ),Nr   zGraph is not distance regular)lenr   NetworkXPointlessConceptiterdegreenextr   dictall_pairs_shortest_path_lengthr    KeyErrorgetrange)r   r(   _kknextr   bintcintuvierrr"   r   r   jr#   s                   @r   r   r   p   s   N 1v{))*?@@!((*F&\FQ:""#CDD  r88;<KEEEHDDARN1% C1Aq(9QU(BQCDAC1Aq(9QU(BQCDAxx~"dhhqn&9&&'FGGGG    "'x1A!Q1%*8_5_!a%	_5   R&&'GHcQR DC 	25s<   8GG0"G0:G5G5;G:%G?
G-G((G-c                 B    [        U 5      =(       a    [        U 5      S:H  $ )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   s    r   r   r      s    j q!6hqkQ&66r   )__doc__networkxr   networkx.utilsr   distance_measuresr   __all___dispatchabler   r	   r   r   r   r   r   <module>rA      s     . ' , ,^)DX Z \"B  # !BL Z \"27  # !27r   