
    \Mh=                     b   d Z ddlZddlZg dZ ej        d          dd            Zd Z ej        d          d             Z ej        d          d	             Z	 ej        d          d
             Z
 ej        d          d             Z ej        d          d             ZdS )zTest sequences for graphiness.    N)is_graphicalis_multigraphicalis_pseudographicalis_digraphical%is_valid_degree_sequence_erdos_gallai%is_valid_degree_sequence_havel_hakimi)graphsegc                     |dk    rt          t          |                     }n9|dk    rt          t          |                     }nd}t          j        |          |S )us  Returns True if sequence is a valid degree sequence.

    A degree sequence is valid if some graph can realize it.

    Parameters
    ----------
    sequence : list or iterable container
        A sequence of integer node degrees

    method : "eg" | "hh"  (default: 'eg')
        The method used to validate the degree sequence.
        "eg" corresponds to the Erdős-Gallai algorithm
        [EG1960]_, [choudum1986]_, and
        "hh" to the Havel-Hakimi algorithm
        [havel1955]_, [hakimi1962]_, [CL1996]_.

    Returns
    -------
    valid : bool
        True if the sequence is a valid degree sequence and False if not.

    Examples
    --------
    >>> G = nx.path_graph(4)
    >>> sequence = (d for n, d in G.degree())
    >>> nx.is_graphical(sequence)
    True

    To test a non-graphical sequence:
    >>> sequence_list = [d for n, d in G.degree()]
    >>> sequence_list[-1] += 1
    >>> nx.is_graphical(sequence_list)
    False

    References
    ----------
    .. [EG1960] Erdős and Gallai, Mat. Lapok 11 264, 1960.
    .. [choudum1986] S.A. Choudum. "A simple proof of the Erdős-Gallai theorem on
       graph sequences." Bulletin of the Australian Mathematical Society, 33,
       pp 67-70, 1986. https://doi.org/10.1017/S0004972700002872
    .. [havel1955] Havel, V. "A Remark on the Existence of Finite Graphs"
       Casopis Pest. Mat. 80, 477-480, 1955.
    .. [hakimi1962] Hakimi, S. "On the Realizability of a Set of Integers as
       Degrees of the Vertices of a Graph." SIAM J. Appl. Math. 10, 496-506, 1962.
    .. [CL1996] G. Chartrand and L. Lesniak, "Graphs and Digraphs",
       Chapman and Hall/CRC, 1996.
    r
   hhz`method` must be 'eg' or 'hh')r   listr   nxNetworkXException)sequencemethodvalidmsgs       ]/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/networkx/algorithms/graphical.pyr   r      s\    b ~~5d8nnEE	45d8nnEE-"3'''L    c                    t           j                            |           } t          |           }dg|z  }d|ddf\  }}}}| D ]]}|dk     s||k    rt           j        |dk    r=t          ||          t          ||          ||z   |dz   f\  }}}}||xx         dz  cc<   ^|dz  s|||dz
  z  k    rt           j        |||||fS )Nr         )r   utilsmake_list_of_intslenNetworkXUnfeasiblemaxmin)deg_sequencepnum_degsdmaxdmindsumnds           r   _basic_graphical_testsr'   L   s    8--l;;LLAsQwHQ1*D$a  q55AFF''UU"%dA,,D!dQhA"MD$aQKKK1KKKax $4!q1u+%%##tQ((r   c                 X   	 t          |           \  }}}}}n# t          j        $ r Y dS w xY w|dk    sd|z  |z  ||z   dz   ||z   dz   z  k    rdS dg|dz   z  }|dk    r||         dk    r|dz  }||         dk    ||dz
  k    rdS ||         dz
  |dz
  c||<   }d}|}t          |          D ]F}	||         dk    r|dz  }||         dk    ||         dz
  |dz
  c||<   }|dk    r|dz
  ||<   |dz  }Gt          |          D ]}	||	         }
||
         dz   |dz   c||
<   }|dk    dS )a  Returns True if deg_sequence can be realized by a simple graph.

    The validation proceeds using the Havel-Hakimi theorem
    [havel1955]_, [hakimi1962]_, [CL1996]_.
    Worst-case run time is $O(s)$ where $s$ is the sum of the sequence.

    Parameters
    ----------
    deg_sequence : list
        A list of integers where each element specifies the degree of a node
        in a graph.

    Returns
    -------
    valid : bool
        True if deg_sequence is graphical and False if not.

    Examples
    --------
    >>> G = nx.Graph([(1, 2), (1, 3), (2, 3), (3, 4), (4, 2), (5, 1), (5, 4)])
    >>> sequence = (d for _, d in G.degree())
    >>> nx.is_valid_degree_sequence_havel_hakimi(sequence)
    True

    To test a non-valid sequence:
    >>> sequence_list = [d for _, d in G.degree()]
    >>> sequence_list[-1] += 1
    >>> nx.is_valid_degree_sequence_havel_hakimi(sequence_list)
    False

    Notes
    -----
    The ZZ condition says that for the sequence d if

    .. math::
        |d| >= \frac{(\max(d) + \min(d) + 1)^2}{4*\min(d)}

    then d is graphical.  This was shown in Theorem 6 in [1]_.

    References
    ----------
    .. [1] I.E. Zverovich and V.E. Zverovich. "Contributions to the theory
       of graphic sequences", Discrete Mathematics, 105, pp. 292-303 (1992).
    .. [havel1955] Havel, V. "A Remark on the Existence of Finite Graphs"
       Casopis Pest. Mat. 80, 477-480, 1955.
    .. [hakimi1962] Hakimi, S. "On the Realizability of a Set of Integers as
       Degrees of the Vertices of a Graph." SIAM J. Appl. Math. 10, 496-506, 1962.
    .. [CL1996] G. Chartrand and L. Lesniak, "Graphs and Digraphs",
       Chapman and Hall/CRC, 1996.
    Fr      r   Tr'   r   r   range)r   r"   r#   r$   r%   r!   modstubsmslenkistubs              r   r   r   `   s   h(>|(L(L%dD!XX    uu 	AvvTA$+/dTkAo!FFFtsdQhH
a%%tn!!AID tn!! !a%<<5 %TNQ.At 	 	A1+""Q 1+""%a[1_a!eNHQK1uu"#a%
u 	: 	:AA;D ( 2AEHTNAA1 a%%2 4    ++c                    	 t          |           \  }}}}}n# t          j        $ r Y dS w xY w|dk    sd|z  |z  ||z   dz   ||z   dz   z  k    rdS d\  }}}}	t          ||dz
  d          D ]}
|
|dz   k     r dS ||
         dk    ro||
         }|
||z   k     r|
|z
  }|||
z  z  }t          |          D ]$}||||z            z  }|	||z   |||z            z  z  }	%||z  }|||dz
  z  ||z  z
  |	z   k    r dS dS )u  Returns True if deg_sequence can be realized by a simple graph.

    The validation is done using the Erdős-Gallai theorem [EG1960]_.

    Parameters
    ----------
    deg_sequence : list
        A list of integers

    Returns
    -------
    valid : bool
        True if deg_sequence is graphical and False if not.

    Examples
    --------
    >>> G = nx.Graph([(1, 2), (1, 3), (2, 3), (3, 4), (4, 2), (5, 1), (5, 4)])
    >>> sequence = (d for _, d in G.degree())
    >>> nx.is_valid_degree_sequence_erdos_gallai(sequence)
    True

    To test a non-valid sequence:
    >>> sequence_list = [d for _, d in G.degree()]
    >>> sequence_list[-1] += 1
    >>> nx.is_valid_degree_sequence_erdos_gallai(sequence_list)
    False

    Notes
    -----

    This implementation uses an equivalent form of the Erdős-Gallai criterion.
    Worst-case run time is $O(n)$ where $n$ is the length of the sequence.

    Specifically, a sequence d is graphical if and only if the
    sum of the sequence is even and for all strong indices k in the sequence,

     .. math::

       \sum_{i=1}^{k} d_i \leq k(k-1) + \sum_{j=k+1}^{n} \min(d_i,k)
             = k(n-1) - ( k \sum_{j=0}^{k-1} n_j - \sum_{j=0}^{k-1} j n_j )

    A strong index k is any index where d_k >= k and the value n_j is the
    number of occurrences of j in d.  The maximal strong index is called the
    Durfee index.

    This particular rearrangement comes from the proof of Theorem 3 in [2]_.

    The ZZ condition says that for the sequence d if

    .. math::
        |d| >= \frac{(\max(d) + \min(d) + 1)^2}{4*\min(d)}

    then d is graphical.  This was shown in Theorem 6 in [2]_.

    References
    ----------
    .. [1] A. Tripathi and S. Vijay. "A note on a theorem of Erdős & Gallai",
       Discrete Mathematics, 265, pp. 417-420 (2003).
    .. [2] I.E. Zverovich and V.E. Zverovich. "Contributions to the theory
       of graphic sequences", Discrete Mathematics, 105, pp. 292-303 (1992).
    .. [EG1960] Erdős and Gallai, Mat. Lapok 11 264, 1960.
    Fr   r)   r   T)r   r   r   r   r*   )r   r"   r#   r$   r%   r!   r.   sum_degsum_njsum_jnjdkrun_sizevs                r   r   r      sz   @(>|(L(L%dD!XX    uu 	AvvTA$+/dTkAo!FFFt #-AwD$(B''  A::44B<!|HAL  6x"}$G8__ 5 5(1q5/)AEXa!e_44MAa!eq6z1G;;;uu4r1   c                     	 t           j                            |           }n# t           j        $ r Y dS w xY wd\  }}|D ] }|dk     r dS ||z   t	          ||          }}!|dz  s	|d|z  k     rdS dS )a  Returns True if some multigraph can realize the sequence.

    Parameters
    ----------
    sequence : list
        A list of integers

    Returns
    -------
    valid : bool
        True if deg_sequence is a multigraphic degree sequence and False if not.

    Examples
    --------
    >>> G = nx.MultiGraph([(1, 2), (1, 3), (2, 3), (3, 4), (4, 2), (5, 1), (5, 4)])
    >>> sequence = (d for _, d in G.degree())
    >>> nx.is_multigraphical(sequence)
    True

    To test a non-multigraphical sequence:
    >>> sequence_list = [d for _, d in G.degree()]
    >>> sequence_list[-1] += 1
    >>> nx.is_multigraphical(sequence_list)
    False

    Notes
    -----
    The worst-case run time is $O(n)$ where $n$ is the length of the sequence.

    References
    ----------
    .. [1] S. L. Hakimi. "On the realizability of a set of integers as
       degrees of the vertices of a linear graph", J. SIAM, 10, pp. 496-506
       (1962).
    Fr   r   r   r   T)r   r   r   NetworkXErrorr   )r   r   r$   r"   r&   s        r   r   r     s    Jx11(;;   uuJD$ , ,q5555AXs4||dax 4!d(??u4   " 55c                     	 t           j                            |           }n# t           j        $ r Y dS w xY wt	          |          dz  dk    ot          |          dk    S )a:  Returns True if some pseudograph can realize the sequence.

    Every nonnegative integer sequence with an even sum is pseudographical
    (see [1]_).

    Parameters
    ----------
    sequence : list or iterable container
        A sequence of integer node degrees

    Returns
    -------
    valid : bool
      True if the sequence is a pseudographic degree sequence and False if not.

    Examples
    --------
    >>> G = nx.Graph([(1, 2), (1, 3), (2, 3), (3, 4), (4, 2), (5, 1), (5, 4)])
    >>> sequence = (d for _, d in G.degree())
    >>> nx.is_pseudographical(sequence)
    True

    To test a non-pseudographical sequence:
    >>> sequence_list = [d for _, d in G.degree()]
    >>> sequence_list[-1] += 1
    >>> nx.is_pseudographical(sequence_list)
    False

    Notes
    -----
    The worst-case run time is $O(n)$ where n is the length of the sequence.

    References
    ----------
    .. [1] F. Boesch and F. Harary. "Line removal algorithms for graphs
       and their degree lists", IEEE Trans. Circuits and Systems, CAS-23(12),
       pp. 778-782 (1976).
    Fr   r   )r   r   r   r<   sumr   )r   r   s     r   r   r   H  sn    Px11(;;   uu|q A%@#l*;*;q*@@r=   c                 b   	 t           j                            |           }t           j                            |          }n# t           j        $ r Y dS w xY wddt	          |          t	          |          f\  }}}}t          ||          }d}	|dk    rdS g g }}
t          |          D ]}d\  }}||k     r||         }||k     r||         }|dk     s|dk     r dS ||z   ||z   t          |	|          }	}}|dk    r|
                    d|z  d|z  f           p|dk    r|                    d|z             ||k    rdS t          j	        |
           t          j	        |           dg|	dz   z  }|
r;t          j
        |
          \  }}|dz  }|t	          |
          t	          |          z   k    rdS d}t          |          D ]s}|r1|
r|
d         d         |d         k    rt          j
        |          }d}nt          j
        |
          \  }}|dk    r dS |dz   dk     s|dk     r|dz   |f||<   |dz  }tt          |          D ]G}||         }|d         dk     rt          j        |
|           ,t          j        ||d                    H|dk     rt          j        ||           |
;dS )a  Returns True if some directed graph can realize the in- and out-degree
    sequences.

    Parameters
    ----------
    in_sequence : list or iterable container
        A sequence of integer node in-degrees

    out_sequence : list or iterable container
        A sequence of integer node out-degrees

    Returns
    -------
    valid : bool
      True if in and out-sequences are digraphic False if not.

    Examples
    --------
    >>> G = nx.DiGraph([(1, 2), (1, 3), (2, 3), (3, 4), (4, 2), (5, 1), (5, 4)])
    >>> in_seq = (d for n, d in G.in_degree())
    >>> out_seq = (d for n, d in G.out_degree())
    >>> nx.is_digraphical(in_seq, out_seq)
    True

    To test a non-digraphical scenario:
    >>> in_seq_list = [d for n, d in G.in_degree()]
    >>> in_seq_list[-1] += 1
    >>> nx.is_digraphical(in_seq_list, out_seq)
    False

    Notes
    -----
    This algorithm is from Kleitman and Wang [1]_.
    The worst case runtime is $O(s \times \log n)$ where $s$ and $n$ are the
    sum and length of the sequences respectively.

    References
    ----------
    .. [1] D.J. Kleitman and D.L. Wang
       Algorithms for Constructing Graphs and Digraphs with Given Valences
       and Factors, Discrete Mathematics, 6(1), pp. 79-88 (1973)
    Fr   Tr;   r3   r   )r   r   r   r<   r   r   r+   appendheapqheapifyheappopheappush)in_sequenceout_sequencein_deg_sequenceout_deg_sequencesuminsumoutninnoutmaxnmaxinstubheapzeroheapr%   in_degout_degr,   freeoutfreeinr-   r/   stuboutstubinr0   s                          r   r   r   w  s,   X(44[AA855lCC   uu  !!S%9%93?O;P;PPE63sD>>DEqyytRhH4[[ * *t88&q)Gs77$Q'FA::155$v~v/?UFASASuvA::OOR'\2;78888q[[OOBL)))u	M(	M(x519%H
 .!M(33&"CMMCMM1115 v 	 	A < <Xa[^hqk-I-I-11$)M($;$;!&!||uu{Q&1**#*Q;"7
 u 	2 	2AA;DAw{{x....xa1111Q;;N8W---=  .> 4s   >A AA)r
   )__doc__rB   networkxr   __all___dispatchabler   r'   r   r   r   r   r    r   r   <module>r]      sj   $ $        7 7 7 7t) ) )( V V Vr W W Wt / / /d +A +A +A\ k k k k kr   