U
    »mœd«Õ  ã                   @   sT  d dl mZ d dlZd dlmZ d dlmZmZmZm	Z
mZ d dlmZmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZmZ d dlZdd	lmZmZm Z m!Z! d dl"m#  m$Z$ dd
l%m&Z&m'Z'm(Z( dd„ Z)G dd„ deƒZ*e*dd�Z+G dd„ de*ƒZ,e,ddd�Z-G dd„ deƒZ.e.dd�Z/G dd„ deƒZ0e0dd�Z1G dd„ deƒZ2e2dddd�Z3G d d!„ d!eƒZ4e4d"d�Z5G d#d$„ d$eƒZ6e6d%d�Z7G d&d'„ d'eƒZ8e8dd(d)d�Z9G d*d+„ d+eƒZ:e:d,d-d.�Z;G d/d0„ d0eƒZ<e<d d1d2d�Z=G d3d4„ d4eƒZ>e>d5d d6d7�Z?G d8d9„ d9eƒZ@e@d:d;d.�ZAG d<d=„ d=eƒZBeBdd>d?d�ZCd@dA„ ZDdBdC„ ZEdDdE„ ZFG dFdG„ dGeƒZGeGddHdId�ZHG dJdK„ dKeƒZIeIejJ dLdMd�ZKG dNdO„ dOeƒZLeLejJ dPdQd�ZMG dRdS„ dSeƒZNeNdTddU�ZOdVdW„ ZPG dXdY„ dYeƒZQG dZd[„ d[eQƒZReRd\d]d.�ZSG d^d_„ d_eQƒZTeTd`dad.�ZUeVeWƒ  X¡  Y¡ ƒZZeeZeƒ\Z[Z\e[e\ Z]dS )bé    )ÚpartialN)Úspecial)ÚentrÚ	logsumexpÚbetalnÚgammalnÚzeta)Ú
_lazywhereÚrng_integers)Úinterp1d)
ÚfloorÚceilÚlogÚexpÚsqrtÚlog1pÚexpm1ÚtanhÚcoshÚsinhé   )Úrv_discreteÚget_distribution_namesÚ_check_shapeÚ
_ShapeInfo)Ú_PyFishersNCHypergeometricÚ_PyWalleniusNCHypergeometricÚ_PyStochasticLib3c                 C   s   | t  | ¡kS ©N)ÚnpÚround©Úx© r#   úU/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scipy/stats/_discrete_distns.pyÚ_isintegral   s    r%   c                   @   st   e Zd ZdZdd„ Zddd„Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zddd„Zdd„ ZdS )Ú	binom_gena  A binomial discrete random variable.

    %(before_notes)s

    Notes
    -----
    The probability mass function for `binom` is:

    .. math::

       f(k) = \binom{n}{k} p^k (1-p)^{n-k}

    for :math:`k \in \{0, 1, \dots, n\}`, :math:`0 \leq p \leq 1`

    `binom` takes :math:`n` and :math:`p` as shape parameters,
    where :math:`p` is the probability of a single success
    and :math:`1-p` is the probability of a single failure.

    %(after_notes)s

    %(example)s

    See Also
    --------
    hypergeom, nbinom, nhypergeom

    c                 C   s"   t dddtjfdƒt ddddƒgS ©	NÚnTr   ©TFÚpF©r   r   ©TT©r   r   Úinf©Úselfr#   r#   r$   Ú_shape_info9   s    ÿzbinom_gen._shape_infoNc                 C   s   |  |||¡S r   )Úbinomial©r0   r(   r*   ÚsizeÚrandom_stater#   r#   r$   Ú_rvs=   s    zbinom_gen._rvsc                 C   s    |dkt |ƒ@ |dk@ |dk@ S ©Nr   r   ©r%   ©r0   r(   r*   r#   r#   r$   Ú	_argcheck@   s    zbinom_gen._argcheckc                 C   s
   | j |fS r   ©Úar9   r#   r#   r$   Ú_get_supportC   s    zbinom_gen._get_supportc                 C   sR   t |ƒ}t|d ƒt|d ƒt|| d ƒ  }|t ||¡ t || | ¡ S ©Nr   )r   Úgamlnr   ÚxlogyÚxlog1py)r0   r"   r(   r*   ÚkÚcombilnr#   r#   r$   Ú_logpmfF   s    (zbinom_gen._logpmfc                 C   s   t  |||¡S r   )Ú_boostZ
_binom_pdf©r0   r"   r(   r*   r#   r#   r$   Ú_pmfK   s    zbinom_gen._pmfc                 C   s   t |ƒ}t |||¡S r   )r   rE   Z
_binom_cdf©r0   r"   r(   r*   rB   r#   r#   r$   Ú_cdfO   s    zbinom_gen._cdfc                 C   s   t |ƒ}t |||¡S r   )r   rE   Z	_binom_sfrH   r#   r#   r$   Ú_sfS   s    zbinom_gen._sfc                 C   s   t  |||¡S r   )rE   Z
_binom_isfrF   r#   r#   r$   Ú_isfW   s    zbinom_gen._isfc                 C   s   t  |||¡S r   )rE   Z
_binom_ppf)r0   Úqr(   r*   r#   r#   r$   Ú_ppfZ   s    zbinom_gen._ppfÚmvc                 C   sT   t  ||¡}t  ||¡}d\}}d|kr4t  ||¡}d|krHt  ||¡}||||fS )N©NNÚsrB   )rE   Z_binom_meanZ_binom_varianceZ_binom_skewnessZ_binom_kurtosis_excess)r0   r(   r*   ÚmomentsÚmuÚvarÚg1Úg2r#   r#   r$   Ú_stats]   s    zbinom_gen._statsc                 C   s2   t jd|d … }|  |||¡}t jt|ƒdd�S )Nr   r   ©Zaxis)r   Úr_rG   Úsumr   )r0   r(   r*   rB   Úvalsr#   r#   r$   Ú_entropyg   s    zbinom_gen._entropy)NN)rN   ©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r1   r6   r:   r=   rD   rG   rI   rJ   rK   rM   rV   r[   r#   r#   r#   r$   r&      s   


r&   Úbinom)Únamec                   @   sr   e Zd ZdZdd„ Zddd„Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )Úbernoulli_gena  A Bernoulli discrete random variable.

    %(before_notes)s

    Notes
    -----
    The probability mass function for `bernoulli` is:

    .. math::

       f(k) = \begin{cases}1-p  &\text{if } k = 0\\
                           p    &\text{if } k = 1\end{cases}

    for :math:`k` in :math:`\{0, 1\}`, :math:`0 \leq p \leq 1`

    `bernoulli` takes :math:`p` as shape parameter,
    where :math:`p` is the probability of a single success
    and :math:`1-p` is the probability of a single failure.

    %(after_notes)s

    %(example)s

    c                 C   s   t ddddƒgS ©Nr*   Fr+   r,   ©r   r/   r#   r#   r$   r1   ‰   s    zbernoulli_gen._shape_infoNc                 C   s   t j| d|||d�S )Nr   ©r4   r5   )r&   r6   ©r0   r*   r4   r5   r#   r#   r$   r6   Œ   s    zbernoulli_gen._rvsc                 C   s   |dk|dk@ S r7   r#   ©r0   r*   r#   r#   r$   r:   �   s    zbernoulli_gen._argcheckc                 C   s   | j | jfS r   )r<   Úbrh   r#   r#   r$   r=   ’   s    zbernoulli_gen._get_supportc                 C   s   t  |d|¡S r>   )ra   rD   ©r0   r"   r*   r#   r#   r$   rD   –   s    zbernoulli_gen._logpmfc                 C   s   t  |d|¡S r>   )ra   rG   rj   r#   r#   r$   rG   ™   s    zbernoulli_gen._pmfc                 C   s   t  |d|¡S r>   )ra   rI   rj   r#   r#   r$   rI   ž   s    zbernoulli_gen._cdfc                 C   s   t  |d|¡S r>   )ra   rJ   rj   r#   r#   r$   rJ   ¡   s    zbernoulli_gen._sfc                 C   s   t  |d|¡S r>   )ra   rK   rj   r#   r#   r$   rK   ¤   s    zbernoulli_gen._isfc                 C   s   t  |d|¡S r>   )ra   rM   )r0   rL   r*   r#   r#   r$   rM   §   s    zbernoulli_gen._ppfc                 C   s   t  d|¡S r>   )ra   rV   rh   r#   r#   r$   rV   ª   s    zbernoulli_gen._statsc                 C   s   t |ƒt d| ƒ S r>   )r   rh   r#   r#   r$   r[   ­   s    zbernoulli_gen._entropy)NNr\   r#   r#   r#   r$   rc   p   s   
rc   Ú	bernoulli)ri   rb   c                   @   sL   e Zd ZdZdd„ Zddd„Zdd„ Zd	d
„ Zdd„ Zdd„ Z	ddd„Z
dS )Úbetabinom_gena  A beta-binomial discrete random variable.

    %(before_notes)s

    Notes
    -----
    The beta-binomial distribution is a binomial distribution with a
    probability of success `p` that follows a beta distribution.

    The probability mass function for `betabinom` is:

    .. math::

       f(k) = \binom{n}{k} \frac{B(k + a, n - k + b)}{B(a, b)}

    for :math:`k \in \{0, 1, \dots, n\}`, :math:`n \geq 0`, :math:`a > 0`,
    :math:`b > 0`, where :math:`B(a, b)` is the beta function.

    `betabinom` takes :math:`n`, :math:`a`, and :math:`b` as shape parameters.

    References
    ----------
    .. [1] https://en.wikipedia.org/wiki/Beta-binomial_distribution

    %(after_notes)s

    .. versionadded:: 1.4.0

    See Also
    --------
    beta, binom

    %(example)s

    c                 C   s:   t dddtjfdƒt dddtjfdƒt dddtjfdƒgS )	Nr(   Tr   r)   r<   F©FFri   r-   r/   r#   r#   r$   r1   Ø   s    þzbetabinom_gen._shape_infoNc                 C   s   |  |||¡}| |||¡S r   )Úbetar2   )r0   r(   r<   ri   r4   r5   r*   r#   r#   r$   r6   Ý   s    zbetabinom_gen._rvsc                 C   s   d|fS ©Nr   r#   ©r0   r(   r<   ri   r#   r#   r$   r=   á   s    zbetabinom_gen._get_supportc                 C   s    |dkt |ƒ@ |dk@ |dk@ S ro   r8   rp   r#   r#   r$   r:   ä   s    zbetabinom_gen._argcheckc                 C   sP   t |ƒ}t|d ƒ t|| d |d ƒ }|t|| || | ƒ t||ƒ S r>   )r   r   r   )r0   r"   r(   r<   ri   rB   rC   r#   r#   r$   rD   ç   s    $zbetabinom_gen._logpmfc                 C   s   t |  ||||¡ƒS r   ©r   rD   )r0   r"   r(   r<   ri   r#   r#   r$   rG   ì   s    zbetabinom_gen._pmfrN   c                 C   sz  |||  }d| }|| }||| |  | | || d  }d\}	}
d|kr�dt |ƒ }	|	|| d|  ||  9 }	|	|| d ||   }	d|k�rn|| }
|
|| d d|  9 }
|
d| | |d  7 }
|
d|d  7 }
|
d| | | d|  8 }
|
d	| | |d  8 }
|
|| d d| |  9 }
|
|| | || d  || d  || |   }
|
d8 }
|||	|
fS )
Nr   rO   rP   ç      ð?é   rB   é   é   é   ©r   )r0   r(   r<   ri   rQ   Ze_pZe_qrR   rS   rT   rU   r#   r#   r$   rV   ï   s(    $
4zbetabinom_gen._stats)NN)rN   )r]   r^   r_   r`   r1   r6   r=   r:   rD   rG   rV   r#   r#   r#   r$   rl   ´   s   #
rl   Ú	betabinomc                   @   sj   e Zd ZdZdd„ Zddd„Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )Ú
nbinom_gena¹  A negative binomial discrete random variable.

    %(before_notes)s

    Notes
    -----
    Negative binomial distribution describes a sequence of i.i.d. Bernoulli
    trials, repeated until a predefined, non-random number of successes occurs.

    The probability mass function of the number of failures for `nbinom` is:

    .. math::

       f(k) = \binom{k+n-1}{n-1} p^n (1-p)^k

    for :math:`k \ge 0`, :math:`0 < p \leq 1`

    `nbinom` takes :math:`n` and :math:`p` as shape parameters where :math:`n`
    is the number of successes, :math:`p` is the probability of a single
    success, and :math:`1-p` is the probability of a single failure.

    Another common parameterization of the negative binomial distribution is
    in terms of the mean number of failures :math:`\mu` to achieve :math:`n`
    successes. The mean :math:`\mu` is related to the probability of success
    as

    .. math::

       p = \frac{n}{n + \mu}

    The number of successes :math:`n` may also be specified in terms of a
    "dispersion", "heterogeneity", or "aggregation" parameter :math:`\alpha`,
    which relates the mean :math:`\mu` to the variance :math:`\sigma^2`,
    e.g. :math:`\sigma^2 = \mu + \alpha \mu^2`. Regardless of the convention
    used for :math:`\alpha`,

    .. math::

       p &= \frac{\mu}{\sigma^2} \\
       n &= \frac{\mu^2}{\sigma^2 - \mu}

    %(after_notes)s

    %(example)s

    See Also
    --------
    hypergeom, binom, nhypergeom

    c                 C   s"   t dddtjfdƒt ddddƒgS r'   r-   r/   r#   r#   r$   r1   <  s    ÿznbinom_gen._shape_infoNc                 C   s   |  |||¡S r   )Znegative_binomialr3   r#   r#   r$   r6   @  s    znbinom_gen._rvsc                 C   s   |dk|dk@ |dk@ S r7   r#   r9   r#   r#   r$   r:   C  s    znbinom_gen._argcheckc                 C   s   t  |||¡S r   )rE   Z_nbinom_pdfrF   r#   r#   r$   rG   F  s    znbinom_gen._pmfc                 C   s>   t || ƒt |d ƒ t |ƒ }||t|ƒ  t || ¡ S r>   )r?   r   r   rA   )r0   r"   r(   r*   Zcoeffr#   r#   r$   rD   J  s     znbinom_gen._logpmfc                 C   s   t |ƒ}t |||¡S r   )r   rE   Z_nbinom_cdfrH   r#   r#   r$   rI   N  s    znbinom_gen._cdfc           	   	   C   sx   t |ƒ}|  |||¡}|dk}dd„ }|}tjdd��8 ||| || || ƒ||< t ||  ¡|| < W 5 Q R X |S )Nç      à?c                 S   s   t  t | d |d| ¡ ¡S r>   )r   r   r   Zbetainc)rB   r(   r*   r#   r#   r$   Úf1W  s    znbinom_gen._logcdf.<locals>.f1Úignore)Údivide)r   rI   r   Zerrstater   )	r0   r"   r(   r*   rB   ÚcdfÚcondr{   Úlogcdfr#   r#   r$   Ú_logcdfR  s     znbinom_gen._logcdfc                 C   s   t |ƒ}t |||¡S r   )r   rE   Z
_nbinom_sfrH   r#   r#   r$   rJ   a  s    znbinom_gen._sfc              
   C   s@   t  ¡ �. d}t jd|d� t |||¡W  5 Q R £ S Q R X d S )Nz#overflow encountered in _nbinom_isfr|   ©Úmessage)ÚwarningsÚcatch_warningsÚfilterwarningsrE   Z_nbinom_isf)r0   r"   r(   r*   rƒ   r#   r#   r$   rK   e  s    
znbinom_gen._isfc              
   C   s@   t  ¡ �. d}t jd|d� t |||¡W  5 Q R £ S Q R X d S )Nz#overflow encountered in _nbinom_ppfr|   r‚   )r„   r…   r†   rE   Z_nbinom_ppf)r0   rL   r(   r*   rƒ   r#   r#   r$   rM   l  s    
znbinom_gen._ppfc                 C   s,   t  ||¡t  ||¡t  ||¡t  ||¡fS r   )rE   Z_nbinom_meanZ_nbinom_varianceZ_nbinom_skewnessZ_nbinom_kurtosis_excessr9   r#   r#   r$   rV   r  s
    



üznbinom_gen._stats)NN)r]   r^   r_   r`   r1   r6   r:   rG   rD   rI   r�   rJ   rK   rM   rV   r#   r#   r#   r$   ry   	  s   2
ry   Únbinomc                   @   sb   e Zd ZdZdd„ Zddd„Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )Úgeom_genaÖ  A geometric discrete random variable.

    %(before_notes)s

    Notes
    -----
    The probability mass function for `geom` is:

    .. math::

        f(k) = (1-p)^{k-1} p

    for :math:`k \ge 1`, :math:`0 < p \leq 1`

    `geom` takes :math:`p` as shape parameter,
    where :math:`p` is the probability of a single success
    and :math:`1-p` is the probability of a single failure.

    %(after_notes)s

    See Also
    --------
    planck

    %(example)s

    c                 C   s   t ddddƒgS rd   re   r/   r#   r#   r$   r1   ›  s    zgeom_gen._shape_infoNc                 C   s   |j ||d�S ©N©r4   )Ú	geometricrg   r#   r#   r$   r6   ž  s    zgeom_gen._rvsc                 C   s   |dk|dk@ S ©Nr   r   r#   rh   r#   r#   r$   r:   ¡  s    zgeom_gen._argcheckc                 C   s   t  d| |d ¡| S r>   )r   Úpower©r0   rB   r*   r#   r#   r$   rG   ¤  s    zgeom_gen._pmfc                 C   s   t  |d | ¡t|ƒ S r>   )r   rA   r   rŽ   r#   r#   r$   rD   §  s    zgeom_gen._logpmfc                 C   s   t |ƒ}tt| ƒ| ƒ S r   )r   r   r   ©r0   r"   r*   rB   r#   r#   r$   rI   ª  s    zgeom_gen._cdfc                 C   s   t  |  ||¡¡S r   )r   r   Ú_logsfrj   r#   r#   r$   rJ   ®  s    zgeom_gen._sfc                 C   s   t |ƒ}|t| ƒ S r   )r   r   r�   r#   r#   r$   r�   ±  s    zgeom_gen._logsfc                 C   sF   t t| ƒt| ƒ ƒ}|  |d |¡}t ||k|dk@ |d |¡S rŒ   )r   r   rI   r   Úwhere)r0   rL   r*   rZ   Útempr#   r#   r$   rM   µ  s    zgeom_gen._ppfc                 C   sR   d| }d| }|| | }d| t |ƒ }t dddg|¡d|  }||||fS )Nrr   ç       @r   iúÿÿÿrt   )r   r   Zpolyval)r0   r*   rR   ZqrrS   rT   rU   r#   r#   r$   rV   º  s    zgeom_gen._stats)NN)r]   r^   r_   r`   r1   r6   r:   rG   rD   rI   rJ   r�   rM   rV   r#   r#   r#   r$   rˆ   ~  s   
rˆ   ÚgeomzA geometric)r<   rb   Úlongnamec                   @   sr   e Zd ZdZdd„ Zddd„Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )Úhypergeom_gena  A hypergeometric discrete random variable.

    The hypergeometric distribution models drawing objects from a bin.
    `M` is the total number of objects, `n` is total number of Type I objects.
    The random variate represents the number of Type I objects in `N` drawn
    without replacement from the total population.

    %(before_notes)s

    Notes
    -----
    The symbols used to denote the shape parameters (`M`, `n`, and `N`) are not
    universally accepted.  See the Examples for a clarification of the
    definitions used here.

    The probability mass function is defined as,

    .. math:: p(k, M, n, N) = \frac{\binom{n}{k} \binom{M - n}{N - k}}
                                   {\binom{M}{N}}

    for :math:`k \in [\max(0, N - M + n), \min(n, N)]`, where the binomial
    coefficients are defined as,

    .. math:: \binom{n}{k} \equiv \frac{n!}{k! (n - k)!}.

    %(after_notes)s

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.stats import hypergeom
    >>> import matplotlib.pyplot as plt

    Suppose we have a collection of 20 animals, of which 7 are dogs.  Then if
    we want to know the probability of finding a given number of dogs if we
    choose at random 12 of the 20 animals, we can initialize a frozen
    distribution and plot the probability mass function:

    >>> [M, n, N] = [20, 7, 12]
    >>> rv = hypergeom(M, n, N)
    >>> x = np.arange(0, n+1)
    >>> pmf_dogs = rv.pmf(x)

    >>> fig = plt.figure()
    >>> ax = fig.add_subplot(111)
    >>> ax.plot(x, pmf_dogs, 'bo')
    >>> ax.vlines(x, 0, pmf_dogs, lw=2)
    >>> ax.set_xlabel('# of dogs in our group of chosen animals')
    >>> ax.set_ylabel('hypergeom PMF')
    >>> plt.show()

    Instead of using a frozen distribution we can also use `hypergeom`
    methods directly.  To for example obtain the cumulative distribution
    function, use:

    >>> prb = hypergeom.cdf(x, M, n, N)

    And to generate random numbers:

    >>> R = hypergeom.rvs(M, n, N, size=10)

    See Also
    --------
    nhypergeom, binom, nbinom

    c                 C   s:   t dddtjfdƒt dddtjfdƒt dddtjfdƒgS )NÚMTr   r)   r(   ÚNr-   r/   r#   r#   r$   r1   	  s    þzhypergeom_gen._shape_infoNc                 C   s   |j ||| ||d�S r‰   )Zhypergeometric)r0   r—   r(   r˜   r4   r5   r#   r#   r$   r6     s    zhypergeom_gen._rvsc                 C   s    t  |||  d¡t  ||¡fS ro   ©r   ÚmaximumÚminimum)r0   r—   r(   r˜   r#   r#   r$   r=     s    zhypergeom_gen._get_supportc                 C   sL   |dk|dk@ |dk@ }|||k||k@ M }|t |ƒt |ƒ@ t |ƒ@ M }|S ro   r8   )r0   r—   r(   r˜   r   r#   r#   r$   r:     s    zhypergeom_gen._argcheckc           	      C   sŠ   || }}|| }t |d dƒt |d dƒ t || d |d ƒ t |d || d ƒ t || d || | d ƒ t |d dƒ }|S r>   ©r   )	r0   rB   r—   r(   r˜   ÚtotÚgoodÚbadÚresultr#   r#   r$   rD     s    
0ÿÿþzhypergeom_gen._logpmfc                 C   s   t  ||||¡S r   )rE   Z_hypergeom_pdf©r0   rB   r—   r(   r˜   r#   r#   r$   rG   "  s    zhypergeom_gen._pmfc                 C   s   t  ||||¡S r   )rE   Z_hypergeom_cdfr¡   r#   r#   r$   rI   %  s    zhypergeom_gen._cdfc                 C   sÚ   d| d| d|   }}}|| }||d  d| ||   d| |  }||d | | 9 }|d| | ||  | d| d  7 }||| ||  | |d  |d   }t  |||¡t  |||¡t  |||¡|fS )Nrr   r   g      @g      @rt   r“   ç      @)rE   Z_hypergeom_meanZ_hypergeom_varianceZ_hypergeom_skewness)r0   r—   r(   r˜   ÚmrU   r#   r#   r$   rV   (  s    (((üzhypergeom_gen._statsc                 C   sB   t j|||  t||ƒd … }|  ||||¡}t jt|ƒdd�S )Nr   r   rW   )r   rX   ÚminZpmfrY   r   )r0   r—   r(   r˜   rB   rZ   r#   r#   r$   r[   9  s     zhypergeom_gen._entropyc                 C   s   t  ||||¡S r   )rE   Z_hypergeom_sfr¡   r#   r#   r$   rJ   >  s    zhypergeom_gen._sfc                 C   s    g }t t ||||¡Ž D ]|\}}}}	|d |d  |d |	d  k rf| tt|  ||||	¡ƒ ƒ¡ qt |d |	d ¡}
| t|  	|
|||	¡ƒ¡ qt 
|¡S )Nrz   r   )Úzipr   Úbroadcast_arraysÚappendr   r   r€   Úaranger   rD   Úasarray©r0   rB   r—   r(   r˜   ÚresZquantr�   rž   ZdrawZk2r#   r#   r$   r�   A  s      "zhypergeom_gen._logsfc                 C   sœ   g }t t ||||¡Ž D ]x\}}}}	|d |d  |d |	d  krf| tt|  ||||	¡ƒ ƒ¡ qt d|d ¡}
| t|  	|
|||	¡ƒ¡ qt 
|¡S )Nrz   r   r   )r¥   r   r¦   r§   r   r   Zlogsfr¨   r   rD   r©   rª   r#   r#   r$   r�   M  s      "zhypergeom_gen._logcdf)NN)r]   r^   r_   r`   r1   r6   r=   r:   rD   rG   rI   rV   r[   rJ   r�   r�   r#   r#   r#   r$   r–   Æ  s   B
r–   Ú	hypergeomc                   @   sJ   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	d
„Zdd„ Zdd„ Z	dd„ Z
dS )Únhypergeom_genab  A negative hypergeometric discrete random variable.

    Consider a box containing :math:`M` balls:, :math:`n` red and
    :math:`M-n` blue. We randomly sample balls from the box, one
    at a time and *without* replacement, until we have picked :math:`r`
    blue balls. `nhypergeom` is the distribution of the number of
    red balls :math:`k` we have picked.

    %(before_notes)s

    Notes
    -----
    The symbols used to denote the shape parameters (`M`, `n`, and `r`) are not
    universally accepted. See the Examples for a clarification of the
    definitions used here.

    The probability mass function is defined as,

    .. math:: f(k; M, n, r) = \frac{{{k+r-1}\choose{k}}{{M-r-k}\choose{n-k}}}
                                   {{M \choose n}}

    for :math:`k \in [0, n]`, :math:`n \in [0, M]`, :math:`r \in [0, M-n]`,
    and the binomial coefficient is:

    .. math:: \binom{n}{k} \equiv \frac{n!}{k! (n - k)!}.

    It is equivalent to observing :math:`k` successes in :math:`k+r-1`
    samples with :math:`k+r`'th sample being a failure. The former
    can be modelled as a hypergeometric distribution. The probability
    of the latter is simply the number of failures remaining
    :math:`M-n-(r-1)` divided by the size of the remaining population
    :math:`M-(k+r-1)`. This relationship can be shown as:

    .. math:: NHG(k;M,n,r) = HG(k;M,n,k+r-1)\frac{(M-n-(r-1))}{(M-(k+r-1))}

    where :math:`NHG` is probability mass function (PMF) of the
    negative hypergeometric distribution and :math:`HG` is the
    PMF of the hypergeometric distribution.

    %(after_notes)s

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.stats import nhypergeom
    >>> import matplotlib.pyplot as plt

    Suppose we have a collection of 20 animals, of which 7 are dogs.
    Then if we want to know the probability of finding a given number
    of dogs (successes) in a sample with exactly 12 animals that
    aren't dogs (failures), we can initialize a frozen distribution
    and plot the probability mass function:

    >>> M, n, r = [20, 7, 12]
    >>> rv = nhypergeom(M, n, r)
    >>> x = np.arange(0, n+2)
    >>> pmf_dogs = rv.pmf(x)

    >>> fig = plt.figure()
    >>> ax = fig.add_subplot(111)
    >>> ax.plot(x, pmf_dogs, 'bo')
    >>> ax.vlines(x, 0, pmf_dogs, lw=2)
    >>> ax.set_xlabel('# of dogs in our group with given 12 failures')
    >>> ax.set_ylabel('nhypergeom PMF')
    >>> plt.show()

    Instead of using a frozen distribution we can also use `nhypergeom`
    methods directly.  To for example obtain the probability mass
    function, use:

    >>> prb = nhypergeom.pmf(x, M, n, r)

    And to generate random numbers:

    >>> R = nhypergeom.rvs(M, n, r, size=10)

    To verify the relationship between `hypergeom` and `nhypergeom`, use:

    >>> from scipy.stats import hypergeom, nhypergeom
    >>> M, n, r = 45, 13, 8
    >>> k = 6
    >>> nhypergeom.pmf(k, M, n, r)
    0.06180776620271643
    >>> hypergeom.pmf(k, M, n, k+r-1) * (M - n - (r-1)) / (M - (k+r-1))
    0.06180776620271644

    See Also
    --------
    hypergeom, binom, nbinom

    References
    ----------
    .. [1] Negative Hypergeometric Distribution on Wikipedia
           https://en.wikipedia.org/wiki/Negative_hypergeometric_distribution

    .. [2] Negative Hypergeometric Distribution from
           http://www.math.wm.edu/~leemis/chart/UDR/PDFs/Negativehypergeometric.pdf

    c                 C   s:   t dddtjfdƒt dddtjfdƒt dddtjfdƒgS )Nr—   Tr   r)   r(   Úrr-   r/   r#   r#   r$   r1   Â  s    þznhypergeom_gen._shape_infoc                 C   s   d|fS ro   r#   )r0   r—   r(   r®   r#   r#   r$   r=   Ç  s    znhypergeom_gen._get_supportc                 C   sD   |dk||k@ |dk@ ||| k@ }|t |ƒt |ƒ@ t |ƒ@ M }|S ro   r8   )r0   r—   r(   r®   r   r#   r#   r$   r:   Ê  s    $znhypergeom_gen._argcheckNc                    s"   t ‡ fdd„ƒ}||||||d�S )Nc                    sl   ˆ   | ||¡\}}t ||d ¡}ˆ  || ||¡}t||ddd�}	|	|j|d�ƒ t¡}
|d krh|
 ¡ S |
S )Nr   ÚnextZextrapolate)ÚkindZ
fill_valuerŠ   )	Zsupportr   r¨   r~   r   ÚuniformÚastypeÚintÚitem)r—   r(   r®   r4   r5   r<   ri   Úksr~   ZppfÚrvsr/   r#   r$   Ú_rvs1Ñ  s    z"nhypergeom_gen._rvs.<locals>._rvs1rf   ©Ú_vectorize_rvs_over_shapes)r0   r—   r(   r®   r4   r5   r·   r#   r/   r$   r6   Ï  s    znhypergeom_gen._rvsc                 C   s2   |dk|dk@ }t | ||||fdd„ dd�}|S )Nr   c                 S   sv   t | d |ƒ t | | dƒ t ||  d || | d ƒ t || |  d dƒ t |d || d ƒ t |d dƒ S r>   rœ   )rB   r—   r(   r®   r#   r#   r$   Ú<lambda>â  s    ÿÿþþz(nhypergeom_gen._logpmf.<locals>.<lambda>ç        )Ú	fillvalue)r	   )r0   rB   r—   r(   r®   r   r    r#   r#   r$   rD   ß  s    ûznhypergeom_gen._logpmfc                 C   s   t |  ||||¡ƒS r   rq   )r0   rB   r—   r(   r®   r#   r#   r$   rG   é  s    znhypergeom_gen._pmfc                 C   s€   d| d| d|   }}}|| || d  }||d  | || d || d   d||| d    }d\}}||||fS )Nrr   r   rs   rO   r#   )r0   r—   r(   r®   rR   rS   rT   rU   r#   r#   r$   rV   î  s
    <znhypergeom_gen._stats)NN)r]   r^   r_   r`   r1   r=   r:   r6   rD   rG   rV   r#   r#   r#   r$   r­   ]  s   d

r­   Ú
nhypergeomc                   @   s:   e Zd ZdZdd„ Zddd„Zdd„ Zd	d
„ Zdd„ ZdS )Ú
logser_genaÔ  A Logarithmic (Log-Series, Series) discrete random variable.

    %(before_notes)s

    Notes
    -----
    The probability mass function for `logser` is:

    .. math::

        f(k) = - \frac{p^k}{k \log(1-p)}

    for :math:`k \ge 1`, :math:`0 < p < 1`

    `logser` takes :math:`p` as shape parameter,
    where :math:`p` is the probability of a single success
    and :math:`1-p` is the probability of a single failure.

    %(after_notes)s

    %(example)s

    c                 C   s   t ddddƒgS rd   re   r/   r#   r#   r$   r1     s    zlogser_gen._shape_infoNc                 C   s   |j ||d�S r‰   )Z	logseriesrg   r#   r#   r$   r6     s    zlogser_gen._rvsc                 C   s   |dk|dk @ S r7   r#   rh   r#   r#   r$   r:   !  s    zlogser_gen._argcheckc                 C   s"   t  ||¡ d | t | ¡ S ©Nrr   )r   r�   r   r   rŽ   r#   r#   r$   rG   $  s    zlogser_gen._pmfc                 C   s  t  | ¡}||d  | }| | |d d  }|||  }| | d|  d| d  }|d| |  d|d   }|t |d¡ }| | d|d d  d| |d d   d| | |d d    }	|	d| |  d| | |  d|d   }
|
|d  d }||||fS )	Nrr   rs   ru   ç      ø?r   rt   é   r¢   )r   r   r   r�   )r0   r*   r®   rR   Zmu2prS   Zmu3pZmu3rT   Zmu4pÚmu4rU   r#   r#   r$   rV   (  s    :ÿ,zlogser_gen._stats)NN)	r]   r^   r_   r`   r1   r6   r:   rG   rV   r#   r#   r#   r$   r¾      s   
r¾   ÚlogserzA logarithmicc                   @   sZ   e Zd ZdZdd„ Zdd„ Zddd„Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )Úpoisson_gena›  A Poisson discrete random variable.

    %(before_notes)s

    Notes
    -----
    The probability mass function for `poisson` is:

    .. math::

        f(k) = \exp(-\mu) \frac{\mu^k}{k!}

    for :math:`k \ge 0`.

    `poisson` takes :math:`\mu \geq 0` as shape parameter.
    When :math:`\mu = 0`, the ``pmf`` method
    returns ``1.0`` at quantile :math:`k = 0`.

    %(after_notes)s

    %(example)s

    c                 C   s   t dddtjfdƒgS )NrR   Fr   r)   r-   r/   r#   r#   r$   r1   T  s    zpoisson_gen._shape_infoc                 C   s   |dkS ro   r#   )r0   rR   r#   r#   r$   r:   X  s    zpoisson_gen._argcheckNc                 C   s   |  ||¡S r   ©Úpoisson)r0   rR   r4   r5   r#   r#   r$   r6   [  s    zpoisson_gen._rvsc                 C   s    t  ||¡t|d ƒ | }|S r>   )r   r@   r?   )r0   rB   rR   ÚPkr#   r#   r$   rD   ^  s    zpoisson_gen._logpmfc                 C   s   t |  ||¡ƒS r   rq   )r0   rB   rR   r#   r#   r$   rG   b  s    zpoisson_gen._pmfc                 C   s   t |ƒ}t ||¡S r   )r   r   Úpdtr©r0   r"   rR   rB   r#   r#   r$   rI   f  s    zpoisson_gen._cdfc                 C   s   t |ƒ}t ||¡S r   )r   r   ZpdtrcrÉ   r#   r#   r$   rJ   j  s    zpoisson_gen._sfc                 C   s>   t t ||¡ƒ}t |d d¡}t ||¡}t ||k||¡S rŒ   )r   r   Zpdtrikr   rš   rÈ   r‘   )r0   rL   rR   rZ   Úvals1r’   r#   r#   r$   rM   n  s    zpoisson_gen._ppfc                 C   sN   |}t  |¡}|dk}t||fdd„ t jƒ}t||fdd„ t jƒ}||||fS )Nr   c                 S   s   t d|  ƒS r¿   rw   r!   r#   r#   r$   rº   x  ó    z$poisson_gen._stats.<locals>.<lambda>c                 S   s   d|  S r¿   r#   r!   r#   r#   r$   rº   y  rË   )r   r©   r	   r.   )r0   rR   rS   ÚtmpZ
mu_nonzerorT   rU   r#   r#   r$   rV   t  s    
zpoisson_gen._stats)NN)r]   r^   r_   r`   r1   r:   r6   rD   rG   rI   rJ   rM   rV   r#   r#   r#   r$   rÄ   ;  s   
rÄ   rÆ   z	A Poisson)rb   r•   c                   @   sb   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
ddd„Zdd„ Zdd„ ZdS )Ú
planck_gena  A Planck discrete exponential random variable.

    %(before_notes)s

    Notes
    -----
    The probability mass function for `planck` is:

    .. math::

        f(k) = (1-\exp(-\lambda)) \exp(-\lambda k)

    for :math:`k \ge 0` and :math:`\lambda > 0`.

    `planck` takes :math:`\lambda` as shape parameter. The Planck distribution
    can be written as a geometric distribution (`geom`) with
    :math:`p = 1 - \exp(-\lambda)` shifted by ``loc = -1``.

    %(after_notes)s

    See Also
    --------
    geom

    %(example)s

    c                 C   s   t dddtjfdƒgS )NÚlambdaFr   rm   r-   r/   r#   r#   r$   r1   œ  s    zplanck_gen._shape_infoc                 C   s   |dkS ro   r#   )r0   Úlambda_r#   r#   r$   r:   Ÿ  s    zplanck_gen._argcheckc                 C   s   t | ƒ t| | ƒ S r   )r   r   )r0   rB   rÏ   r#   r#   r$   rG   ¢  s    zplanck_gen._pmfc                 C   s   t |ƒ}t| |d  ƒ S r>   )r   r   ©r0   r"   rÏ   rB   r#   r#   r$   rI   ¥  s    zplanck_gen._cdfc                 C   s   t |  ||¡ƒS r   )r   r�   )r0   r"   rÏ   r#   r#   r$   rJ   ©  s    zplanck_gen._sfc                 C   s   t |ƒ}| |d  S r>   ©r   rÐ   r#   r#   r$   r�   ¬  s    zplanck_gen._logsfc                 C   sL   t d| t| ƒ d ƒ}|d j|  |¡Ž }|  ||¡}t ||k||¡S )Nç      ð¿r   )r   r   Úclipr=   rI   r   r‘   )r0   rL   rÏ   rZ   rÊ   r’   r#   r#   r$   rM   °  s    zplanck_gen._ppfNc                 C   s   t | ƒ }|j||d�d S )NrŠ   rr   )r   r‹   )r0   rÏ   r4   r5   r*   r#   r#   r$   r6   ¶  s    zplanck_gen._rvsc                 C   sP   dt |ƒ }t| ƒt | ƒd  }dt|d ƒ }ddt|ƒ  }||||fS )Nr   rs   r“   rÁ   )r   r   r   )r0   rÏ   rR   rS   rT   rU   r#   r#   r$   rV   »  s
    zplanck_gen._statsc                 C   s&   t | ƒ }|t| ƒ | t|ƒ S r   )r   r   r   )r0   rÏ   ÚCr#   r#   r$   r[   Â  s    zplanck_gen._entropy)NN)r]   r^   r_   r`   r1   r:   rG   rI   rJ   r�   rM   r6   rV   r[   r#   r#   r#   r$   rÍ   €  s   
rÍ   ÚplanckzA discrete exponential c                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )Úboltzmann_gena—  A Boltzmann (Truncated Discrete Exponential) random variable.

    %(before_notes)s

    Notes
    -----
    The probability mass function for `boltzmann` is:

    .. math::

        f(k) = (1-\exp(-\lambda)) \exp(-\lambda k) / (1-\exp(-\lambda N))

    for :math:`k = 0,..., N-1`.

    `boltzmann` takes :math:`\lambda > 0` and :math:`N > 0` as shape parameters.

    %(after_notes)s

    %(example)s

    c                 C   s(   t dddtjfdƒt dddtjfdƒgS )NrÏ   Fr   rm   r˜   Tr-   r/   r#   r#   r$   r1   à  s    ÿzboltzmann_gen._shape_infoc                 C   s   |dk|dk@ t |ƒ@ S ro   r8   ©r0   rÏ   r˜   r#   r#   r$   r:   ä  s    zboltzmann_gen._argcheckc                 C   s   | j |d fS r>   r;   r×   r#   r#   r$   r=   ç  s    zboltzmann_gen._get_supportc                 C   s2   dt | ƒ dt | | ƒ  }|t | | ƒ S r>   ©r   )r0   rB   rÏ   r˜   Zfactr#   r#   r$   rG   ê  s     zboltzmann_gen._pmfc                 C   s0   t |ƒ}dt| |d  ƒ dt| | ƒ  S r>   )r   r   )r0   r"   rÏ   r˜   rB   r#   r#   r$   rI   ð  s    zboltzmann_gen._cdfc                 C   sd   |dt | | ƒ  }td| td| ƒ d ƒ}|d  dtj¡}|  |||¡}t ||k||¡S )Nr   rÒ   r»   )r   r   r   rÓ   r   r.   rI   r‘   )r0   rL   rÏ   r˜   ZqnewrZ   rÊ   r’   r#   r#   r$   rM   ô  s
    zboltzmann_gen._ppfc                 C   s  t | ƒ}t | | ƒ}|d|  || d|   }|d| d  || | d| d   }d| d|  }||d  || |  }|d|  |d  |d | d|   }	|	|d  }	|dd|  ||   |d  |d | dd|  ||    }
|
| | }
|||	|
fS )Nrr   r   rs   ru   rÀ   rÁ   rØ   )r0   rÏ   r˜   ÚzZzNrR   rS   ZtrmZtrm2rT   rU   r#   r#   r$   rV   û  s    
((@zboltzmann_gen._statsN)r]   r^   r_   r`   r1   r:   r=   rG   rI   rM   rV   r#   r#   r#   r$   rÖ   Ê  s   rÖ   Ú	boltzmannz!A truncated discrete exponential )rb   r<   r•   c                   @   sZ   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
ddd„Zdd„ ZdS )Úrandint_gena”  A uniform discrete random variable.

    %(before_notes)s

    Notes
    -----
    The probability mass function for `randint` is:

    .. math::

        f(k) = \frac{1}{\texttt{high} - \texttt{low}}

    for :math:`k \in \{\texttt{low}, \dots, \texttt{high} - 1\}`.

    `randint` takes :math:`\texttt{low}` and :math:`\texttt{high}` as shape
    parameters.

    %(after_notes)s

    %(example)s

    c                 C   s0   t ddtj tjfdƒt ddtj tjfdƒgS )NÚlowTrm   Úhighr-   r/   r#   r#   r$   r1   %  s    ÿzrandint_gen._shape_infoc                 C   s   ||kt |ƒ@ t |ƒ@ S r   r8   ©r0   rÜ   rÝ   r#   r#   r$   r:   )  s    zrandint_gen._argcheckc                 C   s   ||d fS r>   r#   rÞ   r#   r#   r$   r=   ,  s    zrandint_gen._get_supportc                 C   s,   t  |¡||  }t  ||k||k @ |d¡S )Nr»   )r   Z	ones_liker‘   )r0   rB   rÜ   rÝ   r*   r#   r#   r$   rG   /  s    zrandint_gen._pmfc                 C   s   t |ƒ}|| d ||  S r¿   rÑ   )r0   r"   rÜ   rÝ   rB   r#   r#   r$   rI   4  s    zrandint_gen._cdfc                 C   sH   t |||  | ƒd }|d  ||¡}|  |||¡}t ||k||¡S r>   )r   rÓ   rI   r   r‘   )r0   rL   rÜ   rÝ   rZ   rÊ   r’   r#   r#   r$   rM   8  s    zrandint_gen._ppfc           
      C   sj   t  |¡t  |¡ }}|| d d }|| }|| d d }d}d|| d  || d  }	||||	fS )Nrr   rs   r   g      (@r»   g333333ó¿)r   r©   )
r0   rÜ   rÝ   Úm2Úm1rR   ÚdrS   rT   rU   r#   r#   r$   rV   >  s    zrandint_gen._statsNc                 C   sr   t  |¡jdkr0t  |¡jdkr0t||||d�S |dk	rPt  ||¡}t  ||¡}t jtt|ƒt jgd�}|||ƒS )z=An array of *size* random integers >= ``low`` and < ``high``.r   rŠ   N)Zotypes)r   r©   r4   r
   Zbroadcast_toÚ	vectorizer   Úint_)r0   rÜ   rÝ   r4   r5   Úrandintr#   r#   r$   r6   G  s     ÿzrandint_gen._rvsc                 C   s   t || ƒS r   )r   rÞ   r#   r#   r$   r[   X  s    zrandint_gen._entropy)NN)r]   r^   r_   r`   r1   r:   r=   rG   rI   rM   rV   r6   r[   r#   r#   r#   r$   rÛ     s   	
rÛ   rä   z#A discrete uniform (random integer)c                   @   s:   e Zd ZdZdd„ Zddd„Zdd„ Zd	d
„ Zdd„ ZdS )Úzipf_gena§  A Zipf (Zeta) discrete random variable.

    %(before_notes)s

    See Also
    --------
    zipfian

    Notes
    -----
    The probability mass function for `zipf` is:

    .. math::

        f(k, a) = \frac{1}{\zeta(a) k^a}

    for :math:`k \ge 1`, :math:`a > 1`.

    `zipf` takes :math:`a > 1` as shape parameter. :math:`\zeta` is the
    Riemann zeta function (`scipy.special.zeta`)

    The Zipf distribution is also known as the zeta distribution, which is
    a special case of the Zipfian distribution (`zipfian`).

    %(after_notes)s

    References
    ----------
    .. [1] "Zeta Distribution", Wikipedia,
           https://en.wikipedia.org/wiki/Zeta_distribution

    %(example)s

    Confirm that `zipf` is the large `n` limit of `zipfian`.

    >>> import numpy as np
    >>> from scipy.stats import zipfian
    >>> k = np.arange(11)
    >>> np.allclose(zipf.pmf(k, a), zipfian.pmf(k, a, n=10000000))
    True

    c                 C   s   t dddtjfdƒgS )Nr<   Fr   rm   r-   r/   r#   r#   r$   r1   �  s    zzipf_gen._shape_infoNc                 C   s   |j ||d�S r‰   )Úzipf)r0   r<   r4   r5   r#   r#   r$   r6   �  s    zzipf_gen._rvsc                 C   s   |dkS r>   r#   ©r0   r<   r#   r#   r$   r:   “  s    zzipf_gen._argcheckc                 C   s   dt  |d¡ ||  }|S ©Nrr   r   ©r   r   )r0   rB   r<   rÇ   r#   r#   r$   rG   –  s    zzipf_gen._pmfc                 C   s    t ||d k||fdd„ tjƒS )Nr   c                 S   s   t  | | d¡t  | d¡ S r>   ré   )r<   r(   r#   r#   r$   rº   ž  rË   z zipf_gen._munp.<locals>.<lambda>)r	   r   r.   )r0   r(   r<   r#   r#   r$   Ú_munp›  s    
 ýzzipf_gen._munp)NN)	r]   r^   r_   r`   r1   r6   r:   rG   rê   r#   r#   r#   r$   rå   a  s   +
rå   ræ   zA Zipfc                 C   s   t |dƒt || d ƒ S )z"Generalized harmonic number, a > 1r   )r   ©r(   r<   r#   r#   r$   Ú_gen_harmonic_gt1¥  s    rì   c                 C   sf   t  | ¡s| S t  | ¡}t j|td�}t j|ddtd�D ](}|| k}||  d|||   7  < q8|S )z#Generalized harmonic number, a <= 1©Zdtyper   éÿÿÿÿr   )r   r4   ÚmaxZ
zeros_likeÚfloatr¨   )r(   r<   Zn_maxÚoutÚiÚmaskr#   r#   r$   Ú_gen_harmonic_leq1«  s    

rô   c                 C   s(   t  | |¡\} }t|dk| |fttd�S )zGeneralized harmonic numberr   ©ÚfÚf2)r   r¦   r	   rì   rô   rë   r#   r#   r$   Ú_gen_harmonic¸  s
     ÿrø   c                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )Úzipfian_gena{  A Zipfian discrete random variable.

    %(before_notes)s

    See Also
    --------
    zipf

    Notes
    -----
    The probability mass function for `zipfian` is:

    .. math::

        f(k, a, n) = \frac{1}{H_{n,a} k^a}

    for :math:`k \in \{1, 2, \dots, n-1, n\}`, :math:`a \ge 0`,
    :math:`n \in \{1, 2, 3, \dots\}`.

    `zipfian` takes :math:`a` and :math:`n` as shape parameters.
    :math:`H_{n,a}` is the :math:`n`:sup:`th` generalized harmonic
    number of order :math:`a`.

    The Zipfian distribution reduces to the Zipf (zeta) distribution as
    :math:`n \rightarrow \infty`.

    %(after_notes)s

    References
    ----------
    .. [1] "Zipf's Law", Wikipedia, https://en.wikipedia.org/wiki/Zipf's_law
    .. [2] Larry Leemis, "Zipf Distribution", Univariate Distribution
           Relationships. http://www.math.wm.edu/~leemis/chart/UDR/PDFs/Zipf.pdf

    %(example)s

    Confirm that `zipfian` reduces to `zipf` for large `n`, `a > 1`.

    >>> import numpy as np
    >>> from scipy.stats import zipf
    >>> k = np.arange(11)
    >>> np.allclose(zipfian.pmf(k, a=3.5, n=10000000), zipf.pmf(k, a=3.5))
    True

    c                 C   s(   t dddtjfdƒt dddtjfdƒgS )Nr<   Fr   r)   r(   Trm   r-   r/   r#   r#   r$   r1   î  s    ÿzzipfian_gen._shape_infoc                 C   s"   |dk|dk@ |t j|td�k@ S )Nr   rí   )r   r©   r³   ©r0   r<   r(   r#   r#   r$   r:   ò  s    zzipfian_gen._argcheckc                 C   s   d|fS r>   r#   rú   r#   r#   r$   r=   ö  s    zzipfian_gen._get_supportc                 C   s   dt ||ƒ ||  S r¿   ©rø   ©r0   rB   r<   r(   r#   r#   r$   rG   ù  s    zzipfian_gen._pmfc                 C   s   t ||ƒt ||ƒ S r   rû   rü   r#   r#   r$   rI   ü  s    zzipfian_gen._cdfc                 C   s:   |d }|| t ||ƒt ||ƒ  d || t ||ƒ  S r>   rû   rü   r#   r#   r$   rJ   ÿ  s    ÿzzipfian_gen._sfc                 C   sþ   t ||ƒ}t ||d ƒ}t ||d ƒ}t ||d ƒ}t ||d ƒ}|| }|| |d  }	|d }
|	|
 }|| d| | |d   d|d  |d   |d  }|d | d|d  | |  d| |d  |  d|d   |	d  }|d8 }||||fS )Nr   rs   ru   rÁ   rÀ   rt   rû   )r0   r<   r(   ZHnaZHna1ZHna2ZHna3ZHna4Úmu1Zmu2nZmu2dÚmu2rT   rU   r#   r#   r$   rV     s"    
82
ÿÿzzipfian_gen._statsN)r]   r^   r_   r`   r1   r:   r=   rG   rI   rJ   rV   r#   r#   r#   r$   rù   ¿  s   .rù   Úzipfianz	A Zipfianc                   @   sJ   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	ddd„Z
dS )Údlaplace_genaL  A  Laplacian discrete random variable.

    %(before_notes)s

    Notes
    -----
    The probability mass function for `dlaplace` is:

    .. math::

        f(k) = \tanh(a/2) \exp(-a |k|)

    for integers :math:`k` and :math:`a > 0`.

    `dlaplace` takes :math:`a` as shape parameter.

    %(after_notes)s

    %(example)s

    c                 C   s   t dddtjfdƒgS )Nr<   Fr   rm   r-   r/   r#   r#   r$   r1   1  s    zdlaplace_gen._shape_infoc                 C   s   t |d ƒt| t|ƒ ƒ S ©Nr“   )r   r   Úabs)r0   rB   r<   r#   r#   r$   rG   4  s    zdlaplace_gen._pmfc                 C   s0   t |ƒ}dd„ }dd„ }t|dk||f||d�S )Nc                 S   s   dt | |  ƒt |ƒd   S rè   rØ   ©rB   r<   r#   r#   r$   rº   :  rË   z#dlaplace_gen._cdf.<locals>.<lambda>c                 S   s   t || d  ƒt |ƒd  S r>   rØ   r  r#   r#   r$   rº   ;  rË   r   rõ   )r   r	   )r0   r"   r<   rB   rö   r÷   r#   r#   r$   rI   8  s    zdlaplace_gen._cdfc                 C   st   dt |ƒ }tt |ddt | ƒ  k t|| ƒ| d td| | ƒ | ¡ƒ}|d }t |  ||¡|k||¡S )Nr   rr   )r   r   r   r‘   r   rI   )r0   rL   r<   ÚconstrZ   rÊ   r#   r#   r$   rM   >  s    þzdlaplace_gen._ppfc                 C   s\   t |ƒ}d| |d d  }d| |d d|  d  |d d  }d|d||d  d fS )Nr“   rr   rs   g      $@rÁ   r»   r¢   rØ   )r0   r<   Zearþ   rÂ   r#   r#   r$   rV   F  s    (zdlaplace_gen._statsc                 C   s   |t |ƒ tt|d ƒƒ S r  )r   r   r   rç   r#   r#   r$   r[   L  s    zdlaplace_gen._entropyNc                 C   s8   t  t  |¡ ¡ }|j||d�}|j||d�}|| S r‰   )r   r   r©   r‹   )r0   r<   r4   r5   ZprobOfSuccessr"   Úyr#   r#   r$   r6   O  s    zdlaplace_gen._rvs)NN)r]   r^   r_   r`   r1   rG   rI   rM   rV   r[   r6   r#   r#   r#   r$   r     s   r   ÚdlaplacezA discrete Laplacianc                   @   s:   e Zd ZdZdd„ Zddd„Zdd„ Zd	d
„ Zdd„ ZdS )Úskellam_genaÍ  A  Skellam discrete random variable.

    %(before_notes)s

    Notes
    -----
    Probability distribution of the difference of two correlated or
    uncorrelated Poisson random variables.

    Let :math:`k_1` and :math:`k_2` be two Poisson-distributed r.v. with
    expected values :math:`\lambda_1` and :math:`\lambda_2`. Then,
    :math:`k_1 - k_2` follows a Skellam distribution with parameters
    :math:`\mu_1 = \lambda_1 - \rho \sqrt{\lambda_1 \lambda_2}` and
    :math:`\mu_2 = \lambda_2 - \rho \sqrt{\lambda_1 \lambda_2}`, where
    :math:`\rho` is the correlation coefficient between :math:`k_1` and
    :math:`k_2`. If the two Poisson-distributed r.v. are independent then
    :math:`\rho = 0`.

    Parameters :math:`\mu_1` and :math:`\mu_2` must be strictly positive.

    For details see: https://en.wikipedia.org/wiki/Skellam_distribution

    `skellam` takes :math:`\mu_1` and :math:`\mu_2` as shape parameters.

    %(after_notes)s

    %(example)s

    c                 C   s(   t dddtjfdƒt dddtjfdƒgS )Nrý   Fr   rm   rþ   r-   r/   r#   r#   r$   r1   ‡  s    ÿzskellam_gen._shape_infoNc                 C   s   |}|  ||¡|  ||¡ S r   rÅ   )r0   rý   rþ   r4   r5   r(   r#   r#   r$   r6   ‹  s    

ÿzskellam_gen._rvsc                 C   sx   t  ¡ �f d}t jd|d� t |dk t d| dd|  d| ¡d t d| dd|  d| ¡d ¡}W 5 Q R X |S )Nz!overflow encountered in _ncx2_pdfr|   r‚   r   rs   r   )r„   r…   r†   r   r‘   rE   Z	_ncx2_pdf)r0   r"   rý   rþ   rƒ   Úpxr#   r#   r$   rG   �  s    

  þzskellam_gen._pmfc                 C   sR   t |ƒ}t |dk t d| d| d| ¡dt d| d|d  d| ¡ ¡}|S )Nr   rs   éþÿÿÿr   )r   r   r‘   rE   Z	_ncx2_cdf)r0   r"   rý   rþ   r  r#   r#   r$   rI   š  s    
 þzskellam_gen._cdfc                 C   s4   || }|| }|t |d ƒ }d| }||||fS )Nru   r   rw   )r0   rý   rþ   ZmeanrS   rT   rU   r#   r#   r$   rV   ¡  s
    zskellam_gen._stats)NN)	r]   r^   r_   r`   r1   r6   rG   rI   rV   r#   r#   r#   r$   r  i  s   

r  Úskellamz	A Skellamc                   @   sZ   e Zd ZdZdd„ Zddd„Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )Úyulesimon_genaî  A Yule-Simon discrete random variable.

    %(before_notes)s

    Notes
    -----

    The probability mass function for the `yulesimon` is:

    .. math::

        f(k) =  \alpha B(k, \alpha+1)

    for :math:`k=1,2,3,...`, where :math:`\alpha>0`.
    Here :math:`B` refers to the `scipy.special.beta` function.

    The sampling of random variates is based on pg 553, Section 6.3 of [1]_.
    Our notation maps to the referenced logic via :math:`\alpha=a-1`.

    For details see the wikipedia entry [2]_.

    References
    ----------
    .. [1] Devroye, Luc. "Non-uniform Random Variate Generation",
         (1986) Springer, New York.

    .. [2] https://en.wikipedia.org/wiki/Yule-Simon_distribution

    %(after_notes)s

    %(example)s

    c                 C   s   t dddtjfdƒgS )NÚalphaFr   rm   r-   r/   r#   r#   r$   r1   Î  s    zyulesimon_gen._shape_infoNc                 C   s6   |  |¡}|  |¡}t| tt| | ƒ ƒ ƒ}|S r   )Zstandard_exponentialr   r   r   )r0   r  r4   r5   ZE1ZE2Zansr#   r#   r$   r6   Ñ  s    

zyulesimon_gen._rvsc                 C   s   |t  ||d ¡ S r>   ©r   rn   ©r0   r"   r  r#   r#   r$   rG   ×  s    zyulesimon_gen._pmfc                 C   s   |dkS ro   r#   )r0   r  r#   r#   r$   r:   Ú  s    zyulesimon_gen._argcheckc                 C   s   t |ƒt ||d ¡ S r>   ©r   r   r   r  r#   r#   r$   rD   Ý  s    zyulesimon_gen._logpmfc                 C   s   d|t  ||d ¡  S r>   r  r  r#   r#   r$   rI   à  s    zyulesimon_gen._cdfc                 C   s   |t  ||d ¡ S r>   r  r  r#   r#   r$   rJ   ã  s    zyulesimon_gen._sfc                 C   s   t |ƒt ||d ¡ S r>   r  r  r#   r#   r$   r�   æ  s    zyulesimon_gen._logsfc                 C   s  t  |dkt j||d  ¡}t  |dk|d |d |d d   t j¡}t  |dkt j|¡}t  |dkt|d ƒ|d d  ||d   t j¡}t  |dkt j|¡}t  |dk|d |d d|  d ||d  |d    t j¡}t  |dkt j|¡}||||fS )Nr   rs   r“   ru   rÁ   é1   é   )r   r‘   r.   Únanr   )r0   r  rR   rþ   rT   rU   r#   r#   r$   rV   é  s*    
þ
"þ
ÿÿþzyulesimon_gen._stats)NN)r]   r^   r_   r`   r1   r6   rG   r:   rD   rI   rJ   r�   rV   r#   r#   r#   r$   r  ¬  s   !
r  Ú	yulesimon)rb   r<   c                    s   ‡ fdd„}|S )z?Decorator that vectorizes _rvs method to work on ndarray shapesc                    sÎ   t |d j| ƒ\}}t | ¡} t |¡}t |¡}t |¡rLˆ|| |fžŽ S t | ¡}t |j¡}t ||  || f¡}t 	|||¡}tj
| |  Ž D ]&‰ ˆ‡ fdd„|D ƒ||fžŽ |ˆ < q˜t 	|||¡S )Nr   c                    s   g | ]}t  |¡ˆ  ‘qS r#   )r   Zsqueeze)Ú.0Úarg©rò   r#   r$   Ú
<listcomp>  s     z<_vectorize_rvs_over_shapes.<locals>._rvs.<locals>.<listcomp>)r   Úshaper   ÚarrayÚallÚemptyr¨   ÚndimZhstackZmoveaxisZndindex)r4   r5   ÚargsZ
_rvs1_sizeZ_rvs1_indicesrñ   Zj0Zj1©r·   r  r$   r6     s     




 ÿz(_vectorize_rvs_over_shapes.<locals>._rvsr#   )r·   r6   r#   r  r$   r¹   ý  s    	r¹   c                   @   sJ   e Zd ZdZdZdZdd„ Zdd„ Zdd„ Zdd	d
„Z	dd„ Z
dd„ ZdS )Ú_nchypergeom_genz‰A noncentral hypergeometric discrete random variable.

    For subclassing by nchypergeom_fisher_gen and nchypergeom_wallenius_gen.

    Nc                 C   sL   t dddtjfdƒt dddtjfdƒt dddtjfdƒt dddtjfd	ƒgS )
Nr—   Tr   r)   r(   r˜   ÚoddsFrm   r-   r/   r#   r#   r$   r1   -  s
    ýz_nchypergeom_gen._shape_infoc           	      C   s<   |||  }}}|| }t  d|| ¡}t  ||¡}||fS ro   r™   )	r0   r—   r(   r˜   r   rà   rß   Zx_minZx_maxr#   r#   r$   r=   3  s
    z_nchypergeom_gen._get_supportc                 C   sž   t  |¡t  |¡ }}t  |¡t  |¡ }}| t¡|k|dk@ }| t¡|k|dk@ }| t¡|k|dk@ }|dk}||k}	||k}
||@ |@ |@ |	@ |
@ S ro   )r   r©   r²   r³   )r0   r—   r(   r˜   r   Zcond1Zcond2Zcond3Zcond4Zcond5Zcond6r#   r#   r$   r:   :  s    z_nchypergeom_gen._argcheckc                    s$   t ‡ fdd„ƒ}|||||||d�S )Nc           
         s<   t  |¡}tƒ }t|ˆ jƒ}|||| |||ƒ}	|	 |¡}	|	S r   )r   Úprodr   ÚgetattrÚrvs_nameZreshape)
r—   r(   r˜   r   r4   r5   ÚlengthÚurnZrv_genr¶   r/   r#   r$   r·   G  s    

z$_nchypergeom_gen._rvs.<locals>._rvs1rf   r¸   )r0   r—   r(   r˜   r   r4   r5   r·   r#   r/   r$   r6   E  s    z_nchypergeom_gen._rvsc                    sR   t  |||||¡\}}}}}|jdkr0t  |¡S t j‡ fdd„ƒ}||||||ƒS )Nr   c                    s   ˆ   ||||d¡}| | ¡S ©Ngê-�™—q=)ÚdistZprobability)r"   r—   r(   r˜   r   r%  r/   r#   r$   Ú_pmf1X  s    z$_nchypergeom_gen._pmf.<locals>._pmf1)r   r¦   r4   Z
empty_likerâ   )r0   r"   r—   r(   r˜   r   r(  r#   r/   r$   rG   R  s    

z_nchypergeom_gen._pmfc                    sL   t j‡ fdd„ƒ}d|ks"d|kr0|||||ƒnd\}}d\}	}
|||	|
fS )Nc                    s   ˆ   ||| |d¡}| ¡ S r&  )r'  rQ   )r—   r(   r˜   r   r%  r/   r#   r$   Ú	_moments1a  s    z*_nchypergeom_gen._stats.<locals>._moments1r£   ÚvrO   )r   râ   )r0   r—   r(   r˜   r   rQ   r)  r£   r*  rP   rB   r#   r/   r$   rV   _  s    ÿz_nchypergeom_gen._stats)NN)r]   r^   r_   r`   r#  r'  r1   r=   r:   r6   rG   rV   r#   r#   r#   r$   r  #  s   
r  c                   @   s   e Zd ZdZdZeZdS )Únchypergeom_fisher_genag	  A Fisher's noncentral hypergeometric discrete random variable.

    Fisher's noncentral hypergeometric distribution models drawing objects of
    two types from a bin. `M` is the total number of objects, `n` is the
    number of Type I objects, and `odds` is the odds ratio: the odds of
    selecting a Type I object rather than a Type II object when there is only
    one object of each type.
    The random variate represents the number of Type I objects drawn if we
    take a handful of objects from the bin at once and find out afterwards
    that we took `N` objects.

    %(before_notes)s

    See Also
    --------
    nchypergeom_wallenius, hypergeom, nhypergeom

    Notes
    -----
    Let mathematical symbols :math:`N`, :math:`n`, and :math:`M` correspond
    with parameters `N`, `n`, and `M` (respectively) as defined above.

    The probability mass function is defined as

    .. math::

        p(x; M, n, N, \omega) =
        \frac{\binom{n}{x}\binom{M - n}{N-x}\omega^x}{P_0},

    for
    :math:`x \in [x_l, x_u]`,
    :math:`M \in {\mathbb N}`,
    :math:`n \in [0, M]`,
    :math:`N \in [0, M]`,
    :math:`\omega > 0`,
    where
    :math:`x_l = \max(0, N - (M - n))`,
    :math:`x_u = \min(N, n)`,

    .. math::

        P_0 = \sum_{y=x_l}^{x_u} \binom{n}{y}\binom{M - n}{N-y}\omega^y,

    and the binomial coefficients are defined as

    .. math:: \binom{n}{k} \equiv \frac{n!}{k! (n - k)!}.

    `nchypergeom_fisher` uses the BiasedUrn package by Agner Fog with
    permission for it to be distributed under SciPy's license.

    The symbols used to denote the shape parameters (`N`, `n`, and `M`) are not
    universally accepted; they are chosen for consistency with `hypergeom`.

    Note that Fisher's noncentral hypergeometric distribution is distinct
    from Wallenius' noncentral hypergeometric distribution, which models
    drawing a pre-determined `N` objects from a bin one by one.
    When the odds ratio is unity, however, both distributions reduce to the
    ordinary hypergeometric distribution.

    %(after_notes)s

    References
    ----------
    .. [1] Agner Fog, "Biased Urn Theory".
           https://cran.r-project.org/web/packages/BiasedUrn/vignettes/UrnTheory.pdf

    .. [2] "Fisher's noncentral hypergeometric distribution", Wikipedia,
           https://en.wikipedia.org/wiki/Fisher's_noncentral_hypergeometric_distribution

    %(example)s

    Z
rvs_fisherN)r]   r^   r_   r`   r#  r   r'  r#   r#   r#   r$   r+  l  s   Ir+  Únchypergeom_fisherz$A Fisher's noncentral hypergeometricc                   @   s   e Zd ZdZdZeZdS )Únchypergeom_wallenius_gena}	  A Wallenius' noncentral hypergeometric discrete random variable.

    Wallenius' noncentral hypergeometric distribution models drawing objects of
    two types from a bin. `M` is the total number of objects, `n` is the
    number of Type I objects, and `odds` is the odds ratio: the odds of
    selecting a Type I object rather than a Type II object when there is only
    one object of each type.
    The random variate represents the number of Type I objects drawn if we
    draw a pre-determined `N` objects from a bin one by one.

    %(before_notes)s

    See Also
    --------
    nchypergeom_fisher, hypergeom, nhypergeom

    Notes
    -----
    Let mathematical symbols :math:`N`, :math:`n`, and :math:`M` correspond
    with parameters `N`, `n`, and `M` (respectively) as defined above.

    The probability mass function is defined as

    .. math::

        p(x; N, n, M) = \binom{n}{x} \binom{M - n}{N-x}
        \int_0^1 \left(1-t^{\omega/D}\right)^x\left(1-t^{1/D}\right)^{N-x} dt

    for
    :math:`x \in [x_l, x_u]`,
    :math:`M \in {\mathbb N}`,
    :math:`n \in [0, M]`,
    :math:`N \in [0, M]`,
    :math:`\omega > 0`,
    where
    :math:`x_l = \max(0, N - (M - n))`,
    :math:`x_u = \min(N, n)`,

    .. math::

        D = \omega(n - x) + ((M - n)-(N-x)),

    and the binomial coefficients are defined as

    .. math:: \binom{n}{k} \equiv \frac{n!}{k! (n - k)!}.

    `nchypergeom_wallenius` uses the BiasedUrn package by Agner Fog with
    permission for it to be distributed under SciPy's license.

    The symbols used to denote the shape parameters (`N`, `n`, and `M`) are not
    universally accepted; they are chosen for consistency with `hypergeom`.

    Note that Wallenius' noncentral hypergeometric distribution is distinct
    from Fisher's noncentral hypergeometric distribution, which models
    take a handful of objects from the bin at once, finding out afterwards
    that `N` objects were taken.
    When the odds ratio is unity, however, both distributions reduce to the
    ordinary hypergeometric distribution.

    %(after_notes)s

    References
    ----------
    .. [1] Agner Fog, "Biased Urn Theory".
           https://cran.r-project.org/web/packages/BiasedUrn/vignettes/UrnTheory.pdf

    .. [2] "Wallenius' noncentral hypergeometric distribution", Wikipedia,
           https://en.wikipedia.org/wiki/Wallenius'_noncentral_hypergeometric_distribution

    %(example)s

    Zrvs_walleniusN)r]   r^   r_   r`   r#  r   r'  r#   r#   r#   r$   r-  ¿  s   Ir-  Únchypergeom_walleniusz&A Wallenius' noncentral hypergeometric)^Ú	functoolsr   r„   Zscipyr   Zscipy.specialr   r   r   r   r?   r   Zscipy._lib._utilr	   r
   Zscipy.interpolater   Únumpyr   r   r   r   r   r   r   r   r   r   r   Z_distn_infrastructurer   r   r   r   Zscipy.stats._boostÚstatsrE   Z
_biasedurnr   r   r   r%   r&   ra   rc   rk   rl   rx   ry   r‡   rˆ   r”   r–   r¬   r­   r½   r¾   rÃ   rÄ   rÆ   rÍ   rÕ   rÖ   rÚ   rÛ   rä   rå   ræ   rì   rô   rø   rù   rÿ   r   r.   r  r  r
  r  r  r¹   r  r+  r,  r-  r.  ÚlistÚglobalsÚcopyÚitemsÚpairsZ_distn_namesZ_distn_gen_namesÚ__all__r#   r#   r#   r$   Ú<module>   sŒ   0P
AR
r
E 
  
8BG?ÿOAXK ÿ@N&INþNþ