Ë
    D^(hŠ  ã                   óä   — d Z ddlZddlmZ g d¢Zej                  d„ «       Z ed«      ej                  d„ «       «       Z ed«       ed«       ej                  d	d	¬
«      dd„«       «       «       Z	y)z5Functions for computing and verifying regular graphs.é    N)Únot_implemented_for)Ú
is_regularÚis_k_regularÚk_factorc                 óÒ  ‡‡‡— t        | «      dk(  rt        j                  d«      ‚t        j                  j	                  | «      }| j                  «       s/| j                  |«      Št        ˆfd„| j                  D «       «      S | j                  |«      Št        ˆfd„| j                  D «       «      }| j                  |«      Št        ˆfd„| j                  D «       «      }|xr |S )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   ó.   •K  — | ]  \  }}‰|k(  –— Œ y ­w©N© )Ú.0Ú_ÚdÚd1s      €úY/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/networkx/algorithms/regular.pyú	<genexpr>zis_regular.<locals>.<genexpr>&   s   øè ø€ Ò0™t˜q !�2˜•7Ñ0ùó   ƒc              3   ó.   •K  — | ]  \  }}‰|k(  –— Œ y ­wr	   r
   )r   r   r   Úd_ins      €r   r   zis_regular.<locals>.<genexpr>)   s   øè ø€ Ò;¡t q¨!˜ �Ñ;ùr   c              3   ó.   •K  — | ]  \  }}‰|k(  –— Œ y ­wr	   r
   )r   r   r   Úd_outs      €r   r   zis_regular.<locals>.<genexpr>+   s   øè ø€ Ò>©¨¨A˜% 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 ˆ1ƒv�‚{Ü×)Ñ)Ð*?Ó@Ð@Ü	�‰×	#Ñ	# AÓ	&€BØ�=‰=Œ?Ø�X‰X�b‹\ˆÜÓ0 q§x¡xÔ0Ó0Ð0à�{‰{˜2‹ˆÜÓ;¨q¯{©{Ô;Ó;ˆ
Ø—‘˜RÓ ˆÜÓ>°·±Ô>Ó>ˆØÒ)˜kÐ)ó    Údirectedc                 ó@   ‡— t        ˆfd„| j                  D «       «      S )a‚  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   ó.   •K  — | ]  \  }}|‰k(  –— Œ y ­wr	   r
   )r   Únr   Úks      €r   r   zis_k_regular.<locals>.<genexpr>F   s   øè ø€ Ò+™$˜!˜Qˆq�A�vÑ+ùr   )r   r   )r    r)   s    `r   r   r   /   s   ø€ ô. Ó+ !§(¡(Ô+Ó+Ð+r$   Ú
multigraphT)Úpreserve_edge_attrsÚreturns_graphc                 óˆ  ‡‡— ddl m}m}  G ˆfd„d«      } G d„ d«      }t        ˆfd„| j                  D «       «      rt        j                  d«      ‚| j                  «       Šg }t        ‰j                  «      D ]E  \  }}	‰|	d	z  k  r |‰|	|‰«      }
n |‰|	|‰«      }
|
j                  «        |j                  |
«       ŒG  |‰d
|¬«      } |‰|«      st        j                  d«      ‚‰j                  «       D ],  }||vsŒ|d   |d   f|vsŒ‰j                  |d   |d   «       Œ. |D ]  }
|
j                  «        Œ ‰S )uÕ  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                   ó$   •— e Zd Zd„ Zd„ Zˆ fd„Zy)úk_factor.<locals>.LargeKGadgetc                 óÜ   — || _         || _        || _        || _        t	        |«      D �cg c]  }||f‘Œ c}| _        t	        ||z
  «      D �cg c]	  }|||z   f‘Œ c}| _        y c c}w c c}w r	   )ÚoriginalÚgr)   r   ÚrangeÚouter_verticesÚcore_vertices©Úselfr)   r   Únoder4   Úxs         r   Ú__init__z'k_factor.<locals>.LargeKGadget.__init__t   sg   € Ø ˆDŒMØˆDŒFØˆDŒFØ ˆDŒKä6;¸F³mÖ"D° D¨!¢9Ò"DˆDÔÜ>CÀFÈQÁJÓ>OÖ!P¸ 4¨¨V©Ò"4Ò!PˆDÕùò #EùÚ!Ps   ªA$ÁA)c                 óÜ  — | j                   | j                     }t        |j                  «       «      }t        |j	                  «       «      }t        | j                  ||«      D ]$  \  }}} | j                   j                  ||fi |¤Ž Œ& | j                  D ]/  }| j                  D ]  }| j                   j                  ||«       Œ  Œ1 | j                   j                  | j                  «       y r	   )
r4   r3   ÚlistÚkeysÚvaluesÚzipr6   Úadd_edger7   Úremove_node)r9   Úadj_viewÚ	neighborsÚ
edge_attrsÚouterÚneighborÚcores          r   Úreplace_nodez+k_factor.<locals>.LargeKGadget.replace_node}   sÎ   € Ø—v‘v˜dŸm™mÑ,ˆHÜ˜XŸ]™]›_Ó-ˆIÜ˜hŸo™oÓ/Ó0ˆJÜ/2Ø×#Ñ# Y°
ó0ò ?Ñ+��x ð  �—‘—‘  xÑ>°:Ó>ð?ð ×*Ñ*ò 1�Ø!×0Ñ0ò 1�EØ—F‘F—O‘O D¨%Õ0ñ1ð1ð �F‰F×Ñ˜tŸ}™}Õ-r$   c                 ó®  •— | j                   j                  | j                  «       | j                  D ]j  }| j                   |   }t	        |j                  «       «      D ]=  \  }}|| j                  vsŒ | j                   j                  | j                  |fi |¤Ž  Œj Œl ‰j                  | j                  «       ‰j                  | j                  «       y r	   )	r4   Úadd_noder3   r6   r>   Úitemsr7   rB   Úremove_nodes_from)r9   rG   rD   rH   rF   r4   s        €r   Úrestore_nodez+k_factor.<locals>.LargeKGadget.restore_nodeŠ   s±   ø€ Ø�F‰F�O‰O˜DŸM™MÔ*Ø×,Ñ,ò �ØŸ6™6 %™=�Ü,0°·±Ó1AÓ,Bò Ñ(�H˜jØ t×'9Ñ'9Ò9Ø'˜Ÿ™Ÿ™¨¯©°xÑNÀ:ÒNÙñðð ×Ñ × 3Ñ 3Ô4Ø×Ñ × 2Ñ 2Õ3r$   N©Ú__name__Ú
__module__Ú__qualname__r<   rJ   rO   )r4   s   €r   ÚLargeKGadgetr1   s   s   ø„ ò	Qò	.õ		4r$   rT   c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)úk_factor.<locals>.SmallKGadgetc                 ó,  — || _         || _        || _        || _        t	        |«      D �cg c]  }||f‘Œ c}| _        t	        |«      D �cg c]	  }|||z   f‘Œ c}| _        t	        |«      D �cg c]  }||d|z  z   f‘Œ c}| _        y c c}w c c}w c c}w )Né   )r3   r)   r   r4   r5   r6   Úinner_verticesr7   r8   s         r   r<   z'k_factor.<locals>.SmallKGadget.__init__–   s‰   € Ø ˆDŒMØˆDŒFØ ˆDŒKØˆDŒFä6;¸F³mÖ"D° D¨!¢9Ò"DˆDÔÜ?DÀV»}Ö"M¸! D¨!¨f©*Ò#5Ò"MˆDÔÜBGÈÃ(Ö!K¸Q 4¨¨Q°©Z©Ò"8Ò!KˆDÕùò #EùÚ"MùÚ!Ks   ªBÁ
BÁ-Bc                 óø  — | j                   | j                     }t        | j                  | j                  t        |j                  «       «      «      D ]C  \  }}\  }}| j                   j                  ||«        | j                   j                  ||fi |¤Ž ŒE | j                  D ]/  }| j                  D ]  }| j                   j                  ||«       Œ  Œ1 | j                   j                  | j                  «       y r	   )
r4   r3   rA   r6   rY   r>   rM   rB   r7   rC   )r9   rD   rG   ÚinnerrH   rF   rI   s          r   rJ   z+k_factor.<locals>.SmallKGadget.replace_node    sÖ   € Ø—v‘v˜dŸm™mÑ,ˆHÜ8;Ø×#Ñ# T×%8Ñ%8¼$¸x¿~¹~Ó?OÓ:Pó9ò ?Ñ4��uÑ4˜x¨ð —‘—‘  uÔ-Ø�—‘—‘  xÑ>°:Ó>ð	?ð
 ×*Ñ*ò 1�Ø!×0Ñ0ò 1�EØ—F‘F—O‘O D¨%Õ0ñ1ð1ð �F‰F×Ñ˜tŸ}™}Õ-r$   c                 ó  — | j                   j                  | j                  «       | j                  D ]a  }| j                   |   }|j	                  «       D ]=  \  }}|| j
                  vsŒ | j                   j                  | j                  |fi |¤Ž  Œa Œc | j                   j                  | j                  «       | j                   j                  | j                  «       | j                   j                  | j
                  «       y r	   )	r4   rL   r3   r6   rM   r7   rB   rN   rY   )r9   rG   rD   rH   rF   s        r   rO   z+k_factor.<locals>.SmallKGadget.restore_node¬   sË   € Ø�F‰F�O‰O˜DŸM™MÔ*Ø×,Ñ,ò �ØŸ6™6 %™=�Ø,4¯N©NÓ,<ò Ñ(�H˜jØ t×'9Ñ'9Ò9Ø'˜Ÿ™Ÿ™¨¯©°xÑNÀ:ÒNÙñðð �F‰F×$Ñ$ T×%8Ñ%8Ô9Ø�F‰F×$Ñ$ T×%8Ñ%8Ô9Ø�F‰F×$Ñ$ T×%7Ñ%7Õ8r$   NrP   r
   r$   r   ÚSmallKGadgetrV   •   s   „ ò	Lò
	.ó
	9r$   r]   c              3   ó.   •K  — | ]  \  }}|‰k  –— Œ y ­wr	   r
   )r   r   r   r)   s      €r   r   zk_factor.<locals>.<genexpr>¹   s   øè ø€ Ò
&‘T�Q˜ˆ1ˆq�5Ñ
&ùr   z/Graph contains a vertex with degree less than kg       @T)ÚmaxcardinalityÚweightz7Cannot find k-factor because no perfect matching existsé   )Únetworkx.algorithms.matchingr.   r/   Úanyr   r   ÚNetworkXUnfeasibleÚcopyr>   rJ   ÚappendÚedgesÚremove_edgerO   )r    r)   Úmatching_weightr.   r/   rT   r]   Úgadgetsr:   r   ÚgadgetÚmatchingÚedger4   s    `           @r   r   r   I   sV  ù€ ÷P V÷ 4ó  4÷D!9ñ !9ôH Ó
&˜QŸX™XÔ
&Ô&Ü×#Ñ#Ð$UÓVÐVØ	�‰‹€Að €GÜ˜QŸX™X›ò ‰ˆˆfØˆv˜‰|ÒÙ! ! V¨T°1Ó5‰Fá! ! V¨T°1Ó5ˆFØ×ÑÔØ�‰�vÕðñ # 1°TÀ/ÔR€Hñ ˜q (Ô+Ü×#Ñ#ØEó
ð 	
ð —‘“	ò ,ˆØ�xÒ T¨!¡W¨d°1©gÐ$6¸hÒ$FØ�M‰M˜$˜q™' 4¨¡7Õ+ð,ð ò ˆØ×ÑÕðð €Hr$   )r`   )
Ú__doc__Únetworkxr   Únetworkx.utilsr   Ú__all__Ú_dispatchabler   r   r   r
   r$   r   ú<module>rs      s•   ðÙ ;ã Ý .â
4€ð ×Ññ"*ó ð"*ñJ �ZÓ Ø×Ññ,ó ó !ð,ñ0 �ZÓ Ù�\Ó"Ø€×Ñ d¸$Ô?òKó @ó #ó !ñKr$   