§
    bŠtj·  ã                   ó  — d Z ddlZddlmZ g d¢Z ed¦  «        dd„¦   «         Zd„ Z ed¦  «        dd
„¦   «         Zd„ Z	 ed¦  «        dd„¦   «         Z
 ed¦  «        dd„¦   «         Z ed	¦  «        dd„¦   «         ZdS )zS
Utilities for generating random numbers, random sequences, and
random selections.
é    N)Úpy_random_state)Úpowerlaw_sequenceÚis_valid_tree_degree_sequenceÚzipf_rvÚcumulative_distributionÚdiscrete_sequenceÚrandom_weighted_sampleÚweighted_choiceé   ç       @c                 ó>   ‡‡— ˆˆfd„t          | ¦  «        D ¦   «         S )zK
    Return sample sequence of length n from a power law distribution.
    c                 ó@   •— g | ]}‰                      ‰d z
  ¦  «        ‘ŒS ©é   )Úparetovariate)Ú.0ÚiÚexponentÚseeds     €€ú\/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/networkx/utils/random_sequence.pyú
<listcomp>z%powerlaw_sequence.<locals>.<listcomp>   s+   ø€ Ð?Ð?Ð?°ˆD×Ò˜x¨!™|Ñ,Ô,Ð?Ð?Ð?ó    )Úrange)Únr   r   s    ``r   r   r      s*   øø€ ð
 @Ð?Ð?Ð?Ð?µe¸A±h´hÐ?Ñ?Ô?Ð?r   c                 óÀ   — t          | ¦  «        }t          |¦  «        }t          |¦  «        }d|z  |z
  dk    rdS |dgk    rt          d„ |D ¦   «         ¦  «        rdS dS )a$  Check if a degree sequence is valid for a tree.

    Two conditions must be met for a degree sequence to be valid for a tree:

    1. The number of nodes must be one more than the number of edges.
    2. The degree sequence must be trivial or have only strictly positive
       node degrees.

    Parameters
    ----------
    degree_sequence : iterable
        Iterable of node degrees.

    Returns
    -------
    bool
        Whether the degree sequence is valid for a tree.
    str
        Reason for invalidity, or dummy string if valid.
    r   )Fz1tree must have one more node than number of edgesr   c              3   ó"   K  — | ]
}|d k    V — ŒdS )r   N© )r   Úds     r   ú	<genexpr>z0is_valid_tree_degree_sequence.<locals>.<genexpr><   s&   è è € Ð0Ð0 q˜A šFÐ0Ð0Ð0Ð0Ð0Ð0r   )Fz8nontrivial tree must have strictly positive node degrees)TÚ )ÚlistÚlenÚsumÚany)Údegree_sequenceÚseqÚnumber_of_nodesÚtwice_number_of_edgess       r   r   r   !   su   € õ* ˆÑ
Ô
€CÝ˜#‘h”h€OÝ ™HœHÐàˆ?ÑÐ2Ñ2°aÒ7Ð7ØIÐIØ	��Šˆ�Ð0Ð0¨CÐ0Ñ0Ô0Ñ0Ô0ˆØPÐPØˆ8r   r   c                 óB  — |dk     rt          d¦  «        ‚| dk    rt          d¦  «        ‚| dz
  }d|z  }	 d|                     ¦   «         z
  }|                     ¦   «         }t          ||d|z   z  z  ¦  «        }dd|z  z   |z  }||z  |dz
  z  |dz
  z  ||z  k    rnŒi|S )aw  Returns a random value chosen from the Zipf distribution.

    The return value is an integer drawn from the probability distribution

    .. math::

        p(x)=\frac{x^{-\alpha}}{\zeta(\alpha, x_{\min})},

    where $\zeta(\alpha, x_{\min})$ is the Hurwitz zeta function.

    Parameters
    ----------
    alpha : float
      Exponent value of the distribution
    xmin : int
      Minimum value
    seed : integer, random_state, or None (default)
        Indicator of random number generation state.
        See :ref:`Randomness<randomness>`.

    Returns
    -------
    x : int
      Random value from Zipf distribution

    Raises
    ------
    ValueError:
      If xmin < 1 or
      If alpha <= 1

    Notes
    -----
    The rejection algorithm generates random values for a the power-law
    distribution in uniformly bounded expected time dependent on
    parameters.  See [1]_ for details on its operation.

    Examples
    --------
    >>> nx.utils.zipf_rv(alpha=2, xmin=3, seed=42)
    8

    References
    ----------
    .. [1] Luc Devroye, Non-Uniform Random Variate Generation,
       Springer-Verlag, New York, 1986.
    r   zxmin < 1za <= 1.0g      ð?r   )Ú
ValueErrorÚrandomÚint)	ÚalphaÚxminr   Úa1ÚbÚuÚvÚxÚts	            r   r   r   A   sÌ   € ðb ˆa‚x€xÝ˜Ñ$Ô$Ð$Ø�‚z€zÝ˜Ñ$Ô$Ð$Ø	�‰€BØ	ˆ2‰€AðØ�$—+’+‘-”-ÑˆØ�KŠK‰MŒMˆÝ��q˜c B™h˜KÑ'Ñ'Ñ(Ô(ˆØ�C˜!‘G‰_ Ñ#ˆØˆq‰5�A˜‘GÑ  C¡Ñ(¨A°©EÒ1Ð1Øðð €Hr   c                 óh   ‡— dg}dŠ| D ]}‰|z  Š|                      ‰¦  «         Œˆfd„|D ¦   «         S )zFReturns normalized cumulative distribution from discrete distribution.g        c                 ó   •— g | ]}|‰z  ‘ŒS r   r   )r   ÚelementÚ
cumulatives     €r   r   z+cumulative_distribution.<locals>.<listcomp>Š   s   ø€ Ð4Ð4Ð4 WˆG�jÑ Ð4Ð4Ð4r   )Úappend)ÚdistributionÚcdfr7   r8   s      @r   r   r   ‚   sY   ø€ ð ˆ%€CØ€JØð ð ˆØ�gÑˆ
Ø�
Š
�:ÑÔÐÐØ4Ð4Ð4Ð4°Ð4Ñ4Ô4Ð4r   é   c                 ó¾   ‡‡‡— ddl Š|�|Šn&|�t          |¦  «        Šnt          j        d¦  «        ‚ˆfd„t	          | ¦  «        D ¦   «         }ˆˆfd„|D ¦   «         }|S )a#  
    Return sample sequence of length n from a given discrete distribution
    or discrete cumulative distribution.

    One of the following must be specified.

    distribution = histogram of values, will be normalized

    cdistribution = normalized discrete cumulative distribution

    r   Nz8discrete_sequence: distribution or cdistribution missingc                 ó8   •— g | ]}‰                      ¦   «         ‘ŒS r   )r+   )r   r   r   s     €r   r   z%discrete_sequence.<locals>.<listcomp>¦   s!   ø€ Ð0Ð0Ð0 !�—’‘”Ð0Ð0Ð0r   c                 óB   •— g | ]}‰                      ‰|¦  «        d z
  ‘ŒS r   )Úbisect_left)r   ÚsÚbisectr;   s     €€r   r   z%discrete_sequence.<locals>.<listcomp>©   s.   ø€ Ð
<Ð
<Ð
<¨aˆ6×Ò˜c 1Ñ%Ô%¨Ñ)Ð
<Ð
<Ð
<r   )rB   r   ÚnxÚNetworkXErrorr   )r   r:   Úcdistributionr   Úinputseqr&   rB   r;   s      `  @@r   r   r   �   sŽ   øøø€ ð €M€M€MàÐ ØˆˆØ	Ð	!Ý% lÑ3Ô3ˆˆåÔØFñ
ô 
ð 	
ð
 1Ð0Ð0Ð0¥u¨Q¡x¤xÐ0Ñ0Ô0€Hð =Ð
<Ð
<Ð
<Ð
<°8Ð
<Ñ
<Ô
<€CØ€Jr   c                 ó  — |t          | ¦  «        k    rt          d¦  «        ‚t          ¦   «         }t          |¦  «        |k     r6|                     t	          | |¦  «        ¦  «         t          |¦  «        |k     °6t          |¦  «        S )z€Returns k items without replacement from a weighted sample.

    The input is a dictionary of items with weights as values.
    zsample larger than population)r"   r*   ÚsetÚaddr
   r!   )ÚmappingÚkr   Úsamples       r   r	   r	   ­   su   € ð 	�3ˆw‰<Œ<ÒÐÝÐ8Ñ9Ô9Ð9Ý‰UŒU€FÝ
ˆf‰+Œ+˜Š/ˆ/Ø�
Š
•? 7¨DÑ1Ô1Ñ2Ô2Ð2õ ˆf‰+Œ+˜Š/ˆ/å�‰<Œ<Ðr   c                 óÄ   — |                      ¦   «         t          |                      ¦   «         ¦  «        z  }|                      ¦   «         D ]\  }}||z  }|dk     r|c S ŒdS )zuReturns a single element from a weighted sample.

    The input is a dictionary of items with weights as values.
    r   N)r+   r#   ÚvaluesÚitems)rJ   r   ÚrndrK   Úws        r   r
   r
   »   sm   € ð �+Š+‰-Œ-�#˜gŸnšnÑ.Ô.Ñ/Ô/Ñ
/€CØ—’‘”ð ð ‰ˆˆ1Øˆq‰ˆØ�Š7ˆ7ØˆHˆHˆHð ðð r   )r   N)r   N)NNN)N)Ú__doc__ÚnetworkxrC   Únetworkx.utilsr   Ú__all__r   r   r   r   r   r	   r
   r   r   r   ú<module>rV      sE  ððð ð
 Ð Ð Ð Ø *Ð *Ð *Ð *Ð *Ð *ðð ð €ð  €�ÑÔð@ð @ð @ñ Ôð@ðð ð ð@ €�ÑÔð=ð =ð =ñ Ôð=ð@5ð 5ð 5ð €�ÑÔðð ð ñ Ôðð> €�ÑÔð
ð 
ð 
ñ Ôð
ð €�ÑÔð
ð 
ð 
ñ Ôð
ð 
ð 
r   