
    ܛ7i                         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                  |      fd| j                  D        }| j                  |      fd| j                  D        }t        |      xr t        |      S )a  Determines whether a graph is regular.

    A regular graph is a graph where all nodes have the same degree. A regular
    digraph is a graph where all nodes have the same indegree and all nodes
    have the same outdegree.

    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      X/home/rose/Desktop/poly/venv/lib/python3.12/site-packages/networkx/algorithms/regular.py	<genexpr>zis_regular.<locals>.<genexpr>&   s     0xtq!27x   c              3   .   K   | ]  \  }}|k(    y wr	   r
   )r   r   r   d_ins      r   r   zis_regular.<locals>.<genexpr>)   s     8KDAqdaiKr   c              3   .   K   | ]  \  }}|k(    y wr	   r
   )r   r   r   d_outs      r   r   zis_regular.<locals>.<genexpr>+   s     ;ldauzlr   )
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8AKK8
R ;all;:33{#33    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     +($!QqAv(r   )r   r   )r    r)   s    `r   r   r   /   s    . +!((+++r$   
multigraphT)preserve_edge_attrsreturns_graphc                    t        fd| j                  D              rt        j                  d      | j	                         }g }| j                  D ]+  \  }}|dz  k\  t        |      D cg c]  }||f c}r$t        |d|z  z
        D cg c]  }||f }}g nCt        d|z  d|z  z         D cg c]  }||f }}t        |d|z        D cg c]  }||f c}|j                  t                     t        ||   j                               D ]  \  }	\  }
} |j                  |	|
fi |  |j                  fd|D               |j                  |       |j                  ||f       . t        j                  |d|      t        j                  |      st        j                  d      |j                  fd	|j                  D               |D ]  \  }}|j!                  |       t#        |      }D ]A  }	|j$                  |	   j                         D ]  \  }
}|
|vs |j                  ||
fi |  A C |j'                  |z   z           |S c c}w c c}w c c}w c c}w )
u<  Compute a `k`-factor of a graph.

    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 node of `G` and a subset of the edges of `G` such that each
    node has degree `k`.

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

    k : int
        The degree of the `k`-factor.

    matching_weight: string, optional (default="weight")
        Edge attribute name corresponding to the edge weight.
        If not present, the edge is assumed to have weight 1.
        Used for finding the max-weighted perfect matching.

    Returns
    -------
    NetworkX graph
        A `k`-factor of `G`.

    Examples
    --------
    >>> G = nx.Graph([(1, 2), (2, 3), (3, 4), (4, 1)])
    >>> KF = nx.k_factor(G, k=1)
    >>> KF.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.
    c              3   .   K   | ]  \  }}|k    y wr	   r
   )r   r   r   r)   s      r   r   zk_factor.<locals>.<genexpr>t   s     
&XTQ1q5Xr   z/Graph contains a vertex with degree less than kg       @   c              3   <   K   | ]  }rnD ]  }||f 
  y wr	   r
   )r   uvinneris_largeouters      r   r   zk_factor.<locals>.<genexpr>   s&     VAu8T!!Q8Ts   T)maxcardinalityweightz7Cannot find k-factor because no perfect matching existsc              3   B   K   | ]  }|vs|d d d   vs|  y w)Nr
   )r   ems     r   r   zk_factor.<locals>.<genexpr>   s'     N7aaqjQttWA=M7s   	
)anyr   r   NetworkXUnfeasiblecopyrangeadd_edges_fromzipitemsadd_edgeremove_nodeappendmax_weight_matchingis_perfect_matchingremove_edges_fromedgesadd_nodeset_adjremove_nodes_from)r    r)   matching_weightggadgetsnoder   icoreouter_nneighborattrscore_setr3   r4   r;   r5   s    `           @@@@r   r   r   I   s   V 
&QXX
&&##$UVV	AG f$ %*&M2Mq$M2',VQZ!^'DE'D!T1I'DDEE',QZVa'HI'H!T1I'HDI(-fa&j(AB(A1dAY(ABE 	
UE*+*-eQtW]]_*E&G&hAJJw2E2 +F 	
VVV	deT512+ !0 	qoNA!!!Q'##E
 	

 N177NN %, eT5	

4t9G#$66'?#8#8#:%8+AJJtX77 $; 
 	
EDL501 %, HQ 3E JBs   3I4I9>I>J)r7   )
__doc__networkxr   networkx.utilsr   __all___dispatchabler   r   r   r
   r$   r   <module>r]      s    ;  .
4 "4 "4J Z ,  !,0 Z \"d$?[ @ # ![r$   