U
    |e                     @   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#   Y/var/www/website-v5/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   )_boost
_binom_pdfr0   r"   r(   r*   r#   r#   r$   _pmfK   s    zbinom_gen._pmfc                 C   s   t |}t|||S r   )r   rE   
_binom_cdfr0   r"   r(   r*   rB   r#   r#   r$   _cdfO   s    zbinom_gen._cdfc                 C   s   t |}t|||S r   )r   rE   	_binom_sfrJ   r#   r#   r$   _sfS   s    zbinom_gen._sfc                 C   s   t |||S r   )rE   
_binom_isfrG   r#   r#   r$   _isfW   s    zbinom_gen._isfc                 C   s   t |||S r   )rE   
_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   _binom_mean_binom_variance_binom_skewness_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   axis)r   r_rH   sumr   )r0   r(   r*   rB   valsr#   r#   r$   _entropyg   s    zbinom_gen._entropy)NN)rS   __name__
__module____qualname____doc__r1   r6   r:   r=   rD   rH   rK   rM   rO   rR   r_   re   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<   brr   r#   r#   r$   r=      s    zbernoulli_gen._get_supportc                 C   s   t |d|S r>   )rk   rD   r0   r"   r*   r#   r#   r$   rD      s    zbernoulli_gen._logpmfc                 C   s   t |d|S r>   )rk   rH   rt   r#   r#   r$   rH      s    zbernoulli_gen._pmfc                 C   s   t |d|S r>   )rk   rK   rt   r#   r#   r$   rK      s    zbernoulli_gen._cdfc                 C   s   t |d|S r>   )rk   rM   rt   r#   r#   r$   rM      s    zbernoulli_gen._sfc                 C   s   t |d|S r>   )rk   rO   rt   r#   r#   r$   rO      s    zbernoulli_gen._isfc                 C   s   t |d|S r>   )rk   rR   )r0   rQ   r*   r#   r#   r$   rR      s    zbernoulli_gen._ppfc                 C   s   t d|S r>   )rk   r_   rr   r#   r#   r$   r_      s    zbernoulli_gen._statsc                 C   s   t |t d|  S r>   )r   rr   r#   r#   r$   re      s    zbernoulli_gen._entropy)NNrf   r#   r#   r#   r$   rm   p   s   
rm   	bernoulli)rs   rl   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FFrs   r-   r/   r#   r#   r$   r1      s    zbetabinom_gen._shape_infoNc                 C   s   | |||}||||S r   )betar2   )r0   r(   r<   rs   r4   r5   r*   r#   r#   r$   r6      s    zbetabinom_gen._rvsc                 C   s   d|fS Nr   r#   r0   r(   r<   rs   r#   r#   r$   r=      s    zbetabinom_gen._get_supportc                 C   s    |dkt |@ |dk@ |dk@ S ry   r8   rz   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<   rs   rB   rC   r#   r#   r$   rD      s    $zbetabinom_gen._logpmfc                 C   s   t | ||||S r   r   rD   )r0   r"   r(   r<   rs   r#   r#   r$   rH      s    zbetabinom_gen._pmfrS   c                 C   sz  |||  }d| }|| }||| |  | | || d  }d\}	}
d|krd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   rT   rU         ?   rB            r   )r0   r(   r<   rs   rZ   Ze_pZe_qr[   r\   r]   r^   r#   r#   r$   r_      s(    $
4zbetabinom_gen._stats)NN)rS   )rg   rh   ri   rj   r1   r6   r=   r:   rD   rH   r_   r#   r#   r#   r$   rv      s   #
rv   	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   )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   _nbinom_pdfrG   r#   r#   r$   rH   F  s    znbinom_gen._pmfc                 C   s>   t || t |d  t | }||t|  t||  S r>   )r?   r   r   rA   )r0   r"   r(   r*   coeffr#   r#   r$   rD   J  s     znbinom_gen._logpmfc                 C   s   t |}t|||S r   )r   rE   _nbinom_cdfrJ   r#   r#   r$   rK   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   betainc)rB   r(   r*   r#   r#   r$   f1W  s    znbinom_gen._logcdf.<locals>.f1ignore)divide)r   rK   r   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   
_nbinom_sfrJ   r#   r#   r$   rM   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   _nbinom_isf)r0   r"   r(   r*   r   r#   r#   r$   rO   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   _nbinom_ppf)r0   rQ   r(   r*   r   r#   r#   r$   rR   l  s    
znbinom_gen._ppfc                 C   s,   t ||t ||t ||t ||fS r   )rE   _nbinom_mean_nbinom_variance_nbinom_skewness_nbinom_kurtosis_excessr9   r#   r#   r$   r_   r  s
    



znbinom_gen._stats)NN)rg   rh   ri   rj   r1   r6   r:   rH   rD   rK   r   rM   rO   rR   r_   r#   r#   r#   r$   r   	  s   2
r   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 rn   ro   r/   r#   r#   r$   r1     s    zgeom_gen._shape_infoNc                 C   s   |j ||dS Nr4   )	geometricrq   r#   r#   r$   r6     s    zgeom_gen._rvsc                 C   s   |dk|dk@ S Nr   r   r#   rr   r#   r#   r$   r:     s    zgeom_gen._argcheckc                 C   s   t d| |d | S r>   )r   powerr0   rB   r*   r#   r#   r$   rH     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$   rK     s    zgeom_gen._cdfc                 C   s   t | ||S r   )r   r   _logsfrt   r#   r#   r$   rM     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   rK   r   where)r0   rQ   r*   rd   tempr#   r#   r$   rR     s    zgeom_gen._ppfc                 C   sR   d| }d| }|| | }d| t | }tdddg|d|  }||||fS )Nr|          @r   ir~   )r   r   polyval)r0   r*   r[   qrr\   r]   r^   r#   r#   r$   r_     s    zgeom_gen._stats)NN)rg   rh   ri   rj   r1   r6   r:   rH   rD   rK   rM   r   rR   r_   r#   r#   r#   r$   r   ~  s   
r   geomzA geometric)r<   rl   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   )hypergeometric)r0   r   r(   r   r4   r5   r#   r#   r$   r6     s    zhypergeom_gen._rvsc                 C   s    t |||  dt ||fS ry   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 ry   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goodZbadresultr#   r#   r$   rD     s    
0zhypergeom_gen._logpmfc                 C   s   t ||||S r   )rE   _hypergeom_pdfr0   rB   r   r(   r   r#   r#   r$   rH   "  s    zhypergeom_gen._pmfc                 C   s   t ||||S r   )rE   _hypergeom_cdfr   r#   r#   r$   rK   %  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 )Nr|   r   g      @g      @r~   r         @)rE   _hypergeom_mean_hypergeom_variance_hypergeom_skewness)r0   r   r(   r   mr^   r#   r#   r$   r_   (  s    (((zhypergeom_gen._statsc                 C   sB   t j|||  t||d  }| ||||}t jt|ddS )Nr   r   r`   )r   rb   minpmfrc   r   )r0   r   r(   r   rB   rd   r#   r#   r$   re   9  s     zhypergeom_gen._entropyc                 C   s   t ||||S r   )rE   _hypergeom_sfr   r#   r#   r$   rM   >  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 )Nr   r   )zipr   broadcast_arraysappendr   r   r   aranger   rD   asarrayr0   rB   r   r(   r   resquantr   r   Zdraw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 )Nr   r   r   )r   r   r   r   r   r   logsfr   r   rD   r   r   r#   r#   r$   r   M  s      "zhypergeom_gen._logcdf)NN)rg   rh   ri   rj   r1   r6   r=   r:   rD   rH   rK   r_   re   rM   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 ry   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 ry   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   nextextrapolate)kind
fill_valuer   )	supportr   r   r   r   uniformastypeintitem)r   r(   r   r4   r5   r<   rs   ksr   ppfrvsr/   r#   r$   _rvs1  s    z"nhypergeom_gen._rvs.<locals>._rvs1rp   _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   r{   )r0   rB   r   r(   r   r#   r#   r$   rH     s    znhypergeom_gen._pmfc                 C   s   d| d| d|   }}}|| || d  }||d  | || d || d   d||| d    }d\}}||||fS )Nr|   r   r}   rT   r#   )r0   r   r(   r   r[   r\   r]   r^   r#   r#   r$   r_     s
    <znhypergeom_gen._stats)NN)rg   rh   ri   rj   r1   r=   r:   r6   rD   rH   r_   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 rn   ro   r/   r#   r#   r$   r1     s    zlogser_gen._shape_infoNc                 C   s   |j ||dS r   )	logseriesrq   r#   r#   r$   r6     s    zlogser_gen._rvsc                 C   s   |dk|dk @ S r7   r#   rr   r#   r#   r$   r:   !  s    zlogser_gen._argcheckc                 C   s"   t || d | t|  S Nr|   )r   r   r   r   r   r#   r#   r$   rH   $  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 )	Nr|   r}   r         ?r   r~      r   )r   r   r   r   )r0   r*   r   r[   mu2pr\   mu3pmu3r]   mu4pmu4r^   r#   r#   r$   r_   (  s    :,zlogser_gen._stats)NN)	rg   rh   ri   rj   r1   r6   r:   rH   r_   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 )Nr[   Fr   r)   r-   r/   r#   r#   r$   r1   T  s    zpoisson_gen._shape_infoc                 C   s   |dkS ry   r#   )r0   r[   r#   r#   r$   r:   X  s    zpoisson_gen._argcheckNc                 C   s   | ||S r   poisson)r0   r[   r4   r5   r#   r#   r$   r6   [  s    zpoisson_gen._rvsc                 C   s    t ||t|d  | }|S r>   )r   r@   r?   )r0   rB   r[   Pkr#   r#   r$   rD   ^  s    zpoisson_gen._logpmfc                 C   s   t | ||S r   r{   )r0   rB   r[   r#   r#   r$   rH   b  s    zpoisson_gen._pmfc                 C   s   t |}t||S r   )r   r   pdtrr0   r"   r[   rB   r#   r#   r$   rK   f  s    zpoisson_gen._cdfc                 C   s   t |}t||S r   )r   r   pdtrcr   r#   r#   r$   rM   j  s    zpoisson_gen._sfc                 C   s>   t t||}t|d d}t||}t||k||S r   )r   r   pdtrikr   r   r   r   )r0   rQ   r[   rd   vals1r   r#   r#   r$   rR   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   r   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   r[   r\   tmpZ
mu_nonzeror]   r^   r#   r#   r$   r_   t  s    
zpoisson_gen._stats)NN)rg   rh   ri   rj   r1   r:   r6   rD   rH   rK   rM   rR   r_   r#   r#   r#   r$   r   ;  s   
r   r   z	A Poisson)rl   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   rw   r-   r/   r#   r#   r$   r1     s    zplanck_gen._shape_infoc                 C   s   |dkS ry   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$   rH     s    zplanck_gen._pmfc                 C   s   t |}t| |d   S r>   )r   r   r0   r"   r   rB   r#   r#   r$   rK     s    zplanck_gen._cdfc                 C   s   t | ||S r   )r   r   )r0   r"   r   r#   r#   r$   rM     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=   rK   r   r   )r0   rQ   r   rd   r   r   r#   r#   r$   rR     s    zplanck_gen._ppfNc                 C   s   t |  }|j||dd S )Nr   r|   )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   r}   r   r   )r   r   r   )r0   r   r[   r\   r]   r^   r#   r#   r$   r_     s
    zplanck_gen._statsc                 C   s&   t |  }|t|  | t| S r   )r   r   r   )r0   r   Cr#   r#   r$   re     s    zplanck_gen._entropy)NN)rg   rh   ri   rj   r1   r:   rH   rK   rM   r   rR   r6   r_   re   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   rw   r   Tr-   r/   r#   r#   r$   r1     s    zboltzmann_gen._shape_infoc                 C   s   |dk|dk@ t |@ S ry   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   factr#   r#   r$   rH     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$   rK     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.   rK   r   )r0   rQ   r   r   qnewrd   r   r   r#   r#   r$   rR     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 )Nr|   r   r}   r   r   r   r  )r0   r   r   zZzNr[   r\   trmtrm2r]   r^   r#   r#   r$   r_     s    
((@zboltzmann_gen._statsN)rg   rh   ri   rj   r1   r:   r=   rH   rK   rR   r_   r#   r#   r#   r$   r    s   r  	boltzmannz!A truncated discrete exponential )rl   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lowTrw   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   	ones_liker   )r0   rB   r  r  r*   r#   r#   r$   rH   /  s    zrandint_gen._pmfc                 C   s   t |}|| d ||  S r   r   )r0   r"   r  r  rB   r#   r#   r$   rK   4  s    zrandint_gen._cdfc                 C   sH   t |||  | d }|d ||}| |||}t||k||S r>   )r   r  rK   r   r   )r0   rQ   r  r  rd   r   r   r#   r#   r$   rR   8  s    zrandint_gen._ppfc           
      C   sj   t |t | }}|| d d }|| }|| d d }d}d|| d  || d  }	||||	fS )Nr|   r}   r   g      (@r   g333333)r   r   )
r0   r  r  m2m1r[   dr\   r]   r^   r#   r#   r$   r_   >  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)otypes)r   r   r4   r
   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$   re   X  s    zrandint_gen._entropy)NN)rg   rh   ri   rj   r1   r:   r=   rH   rK   rR   r_   r6   re   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   rw   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 Nr|   r   r   r   )r0   rB   r<   r   r#   r#   r$   rH     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)	rg   rh   ri   rj   r1   r6   r:   rH   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dtyper   r   )r   r4   max
zeros_likefloatr   )r(   r<   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
     r0  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(   Trw   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#   r2  r#   r#   r$   r=     s    zzipfian_gen._get_supportc                 C   s   dt || ||  S r   r0  r0   rB   r<   r(   r#   r#   r$   rH     s    zzipfian_gen._pmfc                 C   s   t ||t || S r   r3  r4  r#   r#   r$   rK     s    zzipfian_gen._cdfc                 C   s:   |d }|| t ||t ||  d || t ||  S r>   r3  r4  r#   r#   r$   rM     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   r}   r   r   r   r~   r3  )r0   r<   r(   ZHnaZHna1ZHna2ZHna3ZHna4mu1Zmu2nZmu2dmu2r]   r^   r#   r#   r$   r_     s"    
82
zzipfian_gen._statsN)rg   rh   ri   rj   r1   r:   r=   rH   rK   rM   r_   r#   r#   r#   r$   r1    s   .r1  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   rw   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$   rH   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$   rK   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   r|   )r   r   r   r   r   rK   )r0   rQ   r<   constrd   r   r#   r#   r$   rR   >  s    zdlaplace_gen._ppfc                 C   s\   t |}d| |d d  }d| |d d|  d  |d d  }d|d||d  d fS )Nr   r|   r}   g      $@r   r   r   r  )r0   r<   ear6  r   r#   r#   r$   r_   F  s    (zdlaplace_gen._statsc                 C   s   |t | tt|d  S r9  )r   r   r   r  r#   r#   r$   re   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)rg   rh   ri   rj   r1   rH   rK   rR   r_   re   r6   r#   r#   r#   r$   r8    s   r8  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 )Nr5  Fr   rw   r6  r-   r/   r#   r#   r$   r1     s    zskellam_gen._shape_infoNc                 C   s   |}| ||| || S r   r   )r0   r5  r6  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   r}   r   )r   r   r   r   r   rE   	_ncx2_pdf)r0   r"   r5  r6  r   pxr#   r#   r$   rH     s    

  zskellam_gen._pmfc                 C   sR   t |}t|dk td| d| d| dtd| d|d  d|  }|S )Nr   r}   r   )r   r   r   rE   	_ncx2_cdf)r0   r"   r5  r6  rB  r#   r#   r$   rK     s    
 zskellam_gen._cdfc                 C   s4   || }|| }|t |d  }d| }||||fS )Nr   r   r   )r0   r5  r6  meanr\   r]   r^   r#   r#   r$   r_     s
    zskellam_gen._stats)NN)	rg   rh   ri   rj   r1   r6   rH   rK   r_   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   rw   r-   r/   r#   r#   r$   r1     s    zyulesimon_gen._shape_infoNc                 C   s6   | |}| |}t| tt| |   }|S r   )standard_exponentialr   r   r   )r0   rH  r4   r5   ZE1ZE2ansr#   r#   r$   r6     s    

zyulesimon_gen._rvsc                 C   s   |t ||d  S r>   r   rx   r0   r"   rH  r#   r#   r$   rH     s    zyulesimon_gen._pmfc                 C   s   |dkS ry   r#   )r0   rH  r#   r#   r$   r:     s    zyulesimon_gen._argcheckc                 C   s   t |t||d  S r>   r   r   r   rL  r#   r#   r$   rD     s    zyulesimon_gen._logpmfc                 C   s   d|t ||d   S r>   rK  rL  r#   r#   r$   rK     s    zyulesimon_gen._cdfc                 C   s   |t ||d  S r>   rK  rL  r#   r#   r$   rM     s    zyulesimon_gen._sfc                 C   s   t |t||d  S r>   rM  rL  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   r}   r   r   r   1      )r   r   r.   nanr   )r0   rH  r[   r6  r]   r^   r#   r#   r$   r_     s*    

"
zyulesimon_gen._stats)NN)rg   rh   ri   rj   r1   r6   rH   r:   rD   rK   rM   r   r_   r#   r#   r#   r$   rG    s   !
rG  	yulesimon)rl   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 | < qt	|||S )Nr   c                    s   g | ]}t |  qS r#   )r   squeeze).0argr*  r#   r$   
<listcomp>  s     z<_vectorize_rvs_over_shapes.<locals>._rvs.<locals>.<listcomp>)r   shaper   arrayallemptyr   ndimhstackmoveaxisndindex)r4   r5   argsZ
_rvs1_sizeZ_rvs1_indicesr)  j0j1r   rU  r$   r6     s     




 z(_vectorize_rvs_over_shapes.<locals>._rvsr#   )r   r6   r#   rb  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_genzA 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   oddsFrw   r-   r/   r#   r#   r$   r1   -  s
    z_nchypergeom_gen._shape_infoc           	      C   s<   |||  }}}|| }t d|| }t ||}||fS ry   r   )	r0   r   r(   r   rd  r  r  x_min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 ry   )r   r   r   r   )r0   r   r(   r   rd  cond1cond2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_namereshape)
r   r(   r   rd  r4   r5   lengthurnZrv_genr   r/   r#   r$   r   G  s    

z$_nchypergeom_gen._rvs.<locals>._rvs1rp   r   )r0   r   r(   r   rd  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   rd  ro  r/   r#   r$   _pmf1X  s    z$_nchypergeom_gen._pmf.<locals>._pmf1)r   r   r4   
empty_liker  )r0   r"   r   r(   r   rd  rr  r#   r/   r$   rH   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 rp  )rq  rZ   )r   r(   r   rd  ro  r/   r#   r$   	_moments1a  s    z*_nchypergeom_gen._stats.<locals>._moments1r   vrT   )r   r  )r0   r   r(   r   rd  rZ   rt  r   ru  rU   rB   r#   r/   r$   r_   _  s    z_nchypergeom_gen._stats)NN)rg   rh   ri   rj   rl  rq  r1   r=   r:   r6   rH   r_   r#   r#   r#   r$   rc  #  s   
rc  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)rg   rh   ri   rj   rl  r   rq  r#   r#   r#   r$   rv  l  s   Irv  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)rg   rh   ri   rj   rl  r   rq  r#   r#   r#   r$   rx    s   Irx  nchypergeom_walleniusz&A Wallenius' noncentral hypergeometric)^	functoolsr   r   scipyr   scipy.specialr   r   r   r   r?   r   scipy._lib._utilr	   r
   scipy.interpolater   numpyr   r   r   r   r   r   r   r   r   r   r   _distn_infrastructurer   r   r   r   scipy.stats._booststatsrE   Z
_biasedurnr   r   r   r%   r&   rk   rm   ru   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r!  r,  r0  r1  r7  r8  r.   r?  r@  rF  rG  rQ  r   rc  rv  rw  rx  ry  listglobalscopyitemspairs_distn_names_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