
    h                         S r SSKrSSKJr  / SQr\R                  S 5       r\" S5      \R                  S 5       5       r\" S5      \" S5      \R                  " S	S	S
9SS j5       5       5       r	g)z5Functions for computing and verifying regular graphs.    N)not_implemented_for)
is_regularis_k_regulark_factorc                   ^^^ [        U 5      S:X  a  [        R                  " S5      e[        R                  R	                  U 5      nU R                  5       (       d0  U R                  U5      m[        U4S jU R                   5       5      $ U R                  U5      m[        U4S jU R                   5       5      nU R                  U5      m[        U4S jU R                   5       5      nU=(       a    U$ )a  Determines whether the graph ``G`` is a regular graph.

A regular graph is a graph where each vertex has the same degree. A
regular digraph is a graph where the indegree and outdegree of each
vertex are equal.

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

Returns
-------
bool
    Whether the given graph or digraph is regular.

Examples
--------
>>> G = nx.DiGraph([(1, 2), (2, 3), (3, 4), (4, 1)])
>>> nx.is_regular(G)
True

r   zGraph has no nodes.c              3   2   >#    U  H  u  pTU:H  v   M     g 7fN ).0_dd1s      M/var/www/html/env/lib/python3.13/site-packages/networkx/algorithms/regular.py	<genexpr>is_regular.<locals>.<genexpr>&   s     0xtq27x   c              3   2   >#    U  H  u  pTU:H  v   M     g 7fr	   r
   )r   r   r   d_ins      r   r   r   )   s     ;{tq{r   c              3   2   >#    U  H  u  pTU:H  v   M     g 7fr	   r
   )r   r   r   d_outs      r   r   r   +   s     >%1*r   )
lennxNetworkXPointlessConceptutilsarbitrary_elementis_directeddegreeall	in_degree
out_degree)Gn1
in_regularout_regularr   r   r   s       @@@r   r   r   	   s    0 1v{))*?@@		#	#A	&B==??XXb\0qxx000{{2;q{{;;
R >>>)k)    directedc                 B   ^ [        U4S jU R                   5       5      $ )aJ  Determines whether the graph ``G`` is a k-regular graph.

A k-regular graph is a graph where each vertex has degree k.

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

Returns
-------
bool
    Whether the given graph is k-regular.

Examples
--------
>>> G = nx.Graph([(1, 2), (2, 3), (3, 4), (4, 1)])
>>> nx.is_k_regular(G, k=3)
False

c              3   2   >#    U  H  u  pUT:H  v   M     g 7fr	   r
   )r   nr   ks      r   r   is_k_regular.<locals>.<genexpr>F   s     +($!qAv(r   )r   r   )r!   r*   s    `r   r   r   /   s    . +!((+++r%   
multigraphT)preserve_edge_attrsreturns_graphc                   ^^ SSK JnJn   " U4S jS5      n " S S5      n[        U4S jU R                   5       5      (       a  [
        R                  " S5      eU R                  5       m/ n[        TR                  5       HD  u  pTU	S	-  :  a  U" TXT5      n
O
U" TXT5      n
U
R                  5         UR                  U
5        MF     U" TS
US9nU" TU5      (       d  [
        R                  " S5      eTR                  5        H2  nX;  d  M
  US   US   4U;  d  M  TR                  US   US   5        M4     U H  n
U
R                  5         M     T$ )ue  Compute a k-factor of G

A k-factor of a graph is a spanning k-regular subgraph.
A spanning k-regular subgraph of G is a subgraph that contains
each vertex of G and a subset of the edges of G such that each
vertex has degree k.

Parameters
----------
G : NetworkX graph
  Undirected graph

matching_weight: string, optional (default='weight')
   Edge data key corresponding to the edge weight.
   Used for finding the max-weighted perfect matching.
   If key not found, uses 1 as weight.

Returns
-------
G2 : NetworkX graph
    A k-factor of G

Examples
--------
>>> G = nx.Graph([(1, 2), (2, 3), (3, 4), (4, 1)])
>>> G2 = nx.k_factor(G, k=1)
>>> G2.edges()
EdgeView([(1, 2), (3, 4)])

References
----------
.. [1] "An algorithm for computing simple k-factors.",
   Meijer, Henk, Yurai Núñez-Rodríguez, and David Rappaport,
   Information processing letters, 2009.
r   )is_perfect_matchingmax_weight_matchingc                   .   > \ rS rSrS rS rU 4S jrSrg)k_factor.<locals>.LargeKGadgets   c                     X0l         X@l        Xl        X l        [	        U5       Vs/ s H  oSU4PM     snU l        [	        X!-
  5       Vs/ s H  oSXR-   4PM
     snU l        g s  snf s  snf r	   )originalgr*   r   rangeouter_verticescore_verticesselfr*   r   noder7   xs         r   __init__'k_factor.<locals>.LargeKGadget.__init__t   sa     MFF K6;Fm"Dm!9m"DD>CFJ>O!P>O"4>O!PD #E!Ps   A"
A'c                    U R                   U R                     n[        UR                  5       5      n[        UR	                  5       5      n[        U R                  X#5       H#  u  pEnU R                   R                  " XE40 UD6  M%     U R                   H1  nU R                   H  nU R                   R                  Xd5        M      M3     U R                   R                  U R                  5        g r	   )
r7   r6   listkeysvalueszipr9   add_edger:   remove_node)r<   adj_view	neighbors
edge_attrsouterneighborcores          r   replace_node+k_factor.<locals>.LargeKGadget.replace_node}   s    vvdmm,HX]]_-Ihoo/0J/2##Y0+ >:>0 **!00EFFOOD0 1 + FFt}}-r%   c                   > U R                   R                  U R                  5        U R                   Hn  nU R                   U   n[	        UR                  5       5       H?  u  p4X0R                  ;  d  M  U R                   R                  " U R                  U40 UD6    Ml     Mp     TR                  U R                  5        TR                  U R                  5        g r	   )	r7   add_noder6   r9   rB   itemsr:   rF   remove_nodes_from)r<   rK   rH   rL   rJ   r7   s        r   restore_node+k_factor.<locals>.LargeKGadget.restore_node   s    FFOODMM*,,66%=,01A,B(H'9'99xN:N -C -  3 34 2 23r%   )r:   r   r7   r*   r6   r9   N__name__
__module____qualname____firstlineno__r?   rN   rT   __static_attributes__)r7   s   r   LargeKGadgetr3   s   s    	Q	.		4 		4r%   r\   c                   &    \ rS rSrS rS rS rSrg)k_factor.<locals>.SmallKGadget   c                 .   X0l         Xl        X l        X@l        [	        U5       Vs/ s H  oSU4PM     snU l        [	        U5       Vs/ s H  oSXR-   4PM
     snU l        [	        U5       Vs/ s H  oSUSU-  -   4PM     snU l        g s  snf s  snf s  snf )N   )r6   r*   r   r7   r8   r9   inner_verticesr:   r;   s         r   r?   'k_factor.<locals>.SmallKGadget.__init__   s     MF KF6;Fm"Dm!9m"DD?DV}"M}!!*#5}"MDBG(!K(QQZ"8(!KD #E"M!Ks   BB,Bc                    U R                   U R                     n[        U R                  U R                  [        UR                  5       5      5       H@  u  p#u  pEU R                   R                  X#5        U R                   R                  " X$40 UD6  MB     U R                   H1  nU R                   H  nU R                   R                  Xc5        M      M3     U R                   R                  U R                  5        g r	   )
r7   r6   rE   r9   rb   rB   rR   rF   r:   rG   )r<   rH   rK   innerrL   rJ   rM   s          r   rN   +k_factor.<locals>.SmallKGadget.replace_node   s    vvdmm,H8;##T%8%8$x~~?O:P944x ->:>	9
 **!00EFFOOD0 1 + FFt}}-r%   c                    U R                   R                  U R                  5        U R                   He  nU R                   U   nUR	                  5        H?  u  p4X0R
                  ;  d  M  U R                   R                  " U R                  U40 UD6    Mc     Mg     U R                   R                  U R                  5        U R                   R                  U R                  5        U R                   R                  U R
                  5        g r	   )	r7   rQ   r6   r9   rR   r:   rF   rS   rb   )r<   rK   rH   rL   rJ   s        r   rT   +k_factor.<locals>.SmallKGadget.restore_node   s    FFOODMM*,,66%=,4NN,<(H'9'99xN:N -= - FF$$T%8%89FF$$T%8%89FF$$T%7%78r%   )r:   r   r7   rb   r*   r6   r9   NrV   r
   r%   r   SmallKGadgetr^      s    	L
	.
	9r%   ri   c              3   2   >#    U  H  u  pUT:  v   M     g 7fr	   r
   )r   r   r   r*   s      r   r   k_factor.<locals>.<genexpr>   s     
&XTQ1q5Xr   z/Graph contains a vertex with degree less than kg       @T)maxcardinalityweightz7Cannot find k-factor because no perfect matching exists   )networkx.algorithms.matchingr0   r1   anyr   r   NetworkXUnfeasiblecopyrB   rN   appendedgesremove_edgerT   )r!   r*   matching_weightr0   r1   r\   ri   gadgetsr=   r   gadgetmatchingedger7   s    `           @r   r   r   I   sE   P V 4  4D!9 !9H 
&QXX
&&&##$UVV	A GQXXv|!!V15F!!V15Fv ' #1T/RH q(++##E
 	
 	T!Wd1g$6h$FMM$q'47+    Hr%   )rm   )
__doc__networkxr   networkx.utilsr   __all___dispatchabler   r   r   r
   r%   r   <module>r      s    ;  .
4 "* "*J Z ,  !,0 Z \"d$?K @ # !Kr%   