o
    iG                     @   s  d dl m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 m!Z!m"Z" dd
l#m$Z$m%Z%m&Z& ddl'm(Z( d dl)m  m*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Z0e0ddZ1G dd deZ2e2ddZ3G dd deZ4e4ddZ5G dd deZ6e6ddd d!Z7G d"d# d#eZ8e8d$dZ9G d%d& d&eZ:e:d'dZ;G d(d) d)eZ<e<dd*d+d!Z=G d,d- d-eZ>e>d.d/d0Z?G d1d2 d2eZ@e@d d3d4d!ZAG d5d6 d6eZBeBd7d d8d9ZCG d:d; d;eZDeDd<d=d0ZEG d>d? d?eZFeFdd@dAd!ZGdBdC ZHdDdE ZIdFdG ZJG dHdI dIeZKeKddJdKd!ZLG dLdM dMeZMeMejN dNdOd!ZOG dPdQ dQeZPePdRdSdTdUZQdqdVdWZRdrdYdZZSdsd[d\ZTeQePZUZVeRWeUeVeQ_ReSWeUeVeQ_SeTWeUeVeQ_TG d]d^ d^e"ZXG d_d` d`eZYeYejN dadbd!ZZG dcdd ddeZ[e[deddfZ\G dgdh dheZ]G didj dje]Z^e^dkdld0Z_G dmdn dne]Z`e`dodpd0Zaebec d e Zfeefe\ZgZhegeh ZidS )t    )partial)special)entr	logsumexpbetalngammalnzeta)
_lazywhererng_integers)interp1d)
floorceillogexpsqrtlog1pexpm1tanhcoshsinhN   )rv_discreteget_distribution_names_vectorize_rvs_over_shapes
_ShapeInfo_isintegralrv_discrete_frozen)_PyFishersNCHypergeometric_PyWalleniusNCHypergeometric_PyStochasticLib3)_poisson_binomc                   @   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_gena2  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.

    This distribution uses routines from the Boost Math C++ library for
    the computation of the ``pmf``, ``cdf``, ``sf``, ``ppf`` and ``isf``
    methods. [1]_

    %(after_notes)s

    References
    ----------
    .. [1] The Boost Developers. "Boost C++ Libraries". https://www.boost.org/.

    %(example)s

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

    c                 C   "   t dddtjfdt ddddgS 	NnTr   TFpFr   r   TTr   npinfself r.   V/home/kim/smarthome/.venv/lib/python3.10/site-packages/scipy/stats/_discrete_distns.py_shape_infoA      zbinom_gen._shape_infoNc                 C      | |||S N)binomialr-   r$   r&   sizerandom_stater.   r.   r/   _rvsE      zbinom_gen._rvsc                 C   s    |dkt |@ |dk@ |dk@ S Nr   r   r   r-   r$   r&   r.   r.   r/   	_argcheckH       zbinom_gen._argcheckc                 C   s
   | j |fS r3   ar<   r.   r.   r/   _get_supportK   s   
zbinom_gen._get_supportc                 C   sR   t |}t|d t|d t|| d   }|t|| t|| |  S Nr   )r   gamlnr   xlogyxlog1py)r-   xr$   r&   kcombilnr.   r.   r/   _logpmfN   s   ("zbinom_gen._logpmfc                 C      t |||S r3   )scuZ
_binom_pmfr-   rF   r$   r&   r.   r.   r/   _pmfS      zbinom_gen._pmfc                 C      t |}t|||S r3   )r   rK   Z
_binom_cdfr-   rF   r$   r&   rG   r.   r.   r/   _cdfW      zbinom_gen._cdfc                 C   rO   r3   )r   rK   Z	_binom_sfrP   r.   r.   r/   _sf[   rR   zbinom_gen._sfc                 C   rJ   r3   )rK   Z
_binom_isfrL   r.   r.   r/   _isf_   r9   zbinom_gen._isfc                 C   rJ   r3   )rK   Z
_binom_ppfr-   qr$   r&   r.   r.   r/   _ppfb   r9   zbinom_gen._ppfmvc                 C   s   || }||t |  }d\}}d|v r2|t | }t || }	t |	}
d| |	 }|
| }d|v rN|t | }|| }t |}
d| }|
| }||||fS )NNNs       @rG         @)r*   Zsquarer   Z
reciprocal)r-   r$   r&   momentsmuvarg1g2ZpqZnpq_sqrtt1t2Znpqr.   r.   r/   _statse   s    

zbinom_gen._statsc                 C   s2   t jd|d  }| |||}t jt|ddS )Nr   r   Zaxis)r*   r_rM   sumr   )r-   r$   r&   rG   valsr.   r.   r/   _entropyw   s   zbinom_gen._entropyrY   rX   __name__
__module____qualname____doc__r0   r8   r=   rA   rI   rM   rQ   rS   rT   rW   rd   ri   r.   r.   r.   r/   r!      s    #

r!   binom)namec                   @   r   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      t ddddgS Nr&   Fr'   r(   r   r,   r.   r.   r/   r0         zbernoulli_gen._shape_infoNc                 C   s   t j| d|||dS )Nr   r6   r7   )r!   r8   r-   r&   r6   r7   r.   r.   r/   r8         zbernoulli_gen._rvsc                 C   s   |dk|dk@ S r:   r.   r-   r&   r.   r.   r/   r=      rw   zbernoulli_gen._argcheckc                 C   s   | j | jfS r3   )r@   br{   r.   r.   r/   rA      s   zbernoulli_gen._get_supportc                 C      t |d|S rB   )rp   rI   r-   rF   r&   r.   r.   r/   rI      r9   zbernoulli_gen._logpmfc                 C   r}   rB   )rp   rM   r~   r.   r.   r/   rM         zbernoulli_gen._pmfc                 C   r}   rB   )rp   rQ   r~   r.   r.   r/   rQ      r9   zbernoulli_gen._cdfc                 C   r}   rB   )rp   rS   r~   r.   r.   r/   rS      r9   zbernoulli_gen._sfc                 C   r}   rB   )rp   rT   r~   r.   r.   r/   rT      r9   zbernoulli_gen._isfc                 C   r}   rB   )rp   rW   )r-   rV   r&   r.   r.   r/   rW      r9   zbernoulli_gen._ppfc                 C   s   t d|S rB   )rp   rd   r{   r.   r.   r/   rd         zbernoulli_gen._statsc                 C   s   t |t d|  S rB   )r   r{   r.   r.   r/   ri      rz   zbernoulli_gen._entropyrY   rk   r.   r.   r.   r/   rs      s    
rs   	bernoulli)r|   rq   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   :   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FFr|   r)   r,   r.   r.   r/   r0         zbetabinom_gen._shape_infoNc                 C      | |||}||||S r3   )betar4   r-   r$   r@   r|   r6   r7   r&   r.   r.   r/   r8         zbetabinom_gen._rvsc                 C   s   d|fS Nr   r.   r-   r$   r@   r|   r.   r.   r/   rA         zbetabinom_gen._get_supportc                 C       |dkt |@ |dk@ |dk@ S r   r;   r   r.   r.   r/   r=      r>   zbetabinom_gen._argcheckc                 C   sP   t |}t|d  t|| d |d  }|t|| || |  t|| S rB   )r   r   r   r-   rF   r$   r@   r|   rG   rH   r.   r.   r/   rI      s   $$zbetabinom_gen._logpmfc                 C      t | ||||S r3   r   rI   r-   rF   r$   r@   r|   r.   r.   r/   rM      rz   zbetabinom_gen._pmfrX   c                 C   s  |||  }d| }|| }||| |  | | || d  }d\}	}
d|v rHdt | }	|	|| d|  ||  9 }	|	|| d ||   }	d|v r|| |j}
|
|| 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   rY   rZ         ?   rG            )r   astypedtype)r-   r$   r@   r|   r]   Ze_pZe_qr^   r_   r`   ra   r.   r.   r/   rd      s(   $4zbetabinom_gen._statsrY   rj   )rl   rm   rn   ro   r0   r8   rA   r=   rI   rM   rd   r.   r.   r.   r/   r      s    #
r   	betabinomc                   @   j   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}

    This distribution uses routines from the Boost Math C++ library for
    the computation of the ``pmf``, ``cdf``, ``sf``, ``ppf``, ``isf``
    and ``stats`` methods. [1]_

    %(after_notes)s

    References
    ----------
    .. [1] The Boost Developers. "Boost C++ Libraries". https://www.boost.org/.

    %(example)s

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

    c                 C   r"   r#   r)   r,   r.   r.   r/   r0   T  r1   znbinom_gen._shape_infoNc                 C   r2   r3   )negative_binomialr5   r.   r.   r/   r8   X  r9   znbinom_gen._rvsc                 C   s   |dk|dk@ |dk@ S r:   r.   r<   r.   r.   r/   r=   [     znbinom_gen._argcheckc                 C   rJ   r3   )rK   Z_nbinom_pmfrL   r.   r.   r/   rM   ^  rN   znbinom_gen._pmfc                 C   s>   t || t |d  t | }||t|  t||  S rB   )rC   r   r   rE   )r-   rF   r$   r&   Zcoeffr.   r.   r/   rI   b  s    znbinom_gen._logpmfc                 C   rO   r3   )r   rK   Z_nbinom_cdfrP   r.   r.   r/   rQ   f  rR   znbinom_gen._cdfc           	      C   s   t |}t|||\}}}| |||}|dk}dd }|}tjdd" ||| || || ||< t||  || < W d    |S 1 sJw   Y  |S )N      ?c                 S   s   t t| d |d|  S rB   )r*   r   r   Zbetainc)rG   r$   r&   r.   r.   r/   f1o     znbinom_gen._logcdf.<locals>.f1ignore)divide)r   r*   broadcast_arraysrQ   errstater   )	r-   rF   r$   r&   rG   cdfcondr   logcdfr.   r.   r/   _logcdfj  s   
znbinom_gen._logcdfc                 C   rO   r3   )r   rK   Z
_nbinom_sfrP   r.   r.   r/   rS   y  rR   znbinom_gen._sfc                 C   >   t jdd t|||W  d    S 1 sw   Y  d S Nr   Zover)r*   r   rK   Z_nbinom_isfrL   r.   r.   r/   rT   }     $znbinom_gen._isfc                 C   r   r   )r*   r   rK   Z_nbinom_ppfrU   r.   r.   r/   rW     r   znbinom_gen._ppfc                 C   s,   t ||t ||t ||t ||fS r3   )rK   Z_nbinom_meanZ_nbinom_varianceZ_nbinom_skewnessZ_nbinom_kurtosis_excessr<   r.   r.   r/   rd     s
   



znbinom_gen._statsrY   )rl   rm   rn   ro   r0   r8   r=   rM   rI   rQ   r   rS   rT   rW   rd   r.   r.   r.   r/   r     s    :
r   nbinomc                   @   sD   e Zd ZdZdd ZdddZdd Zd	d
 Zdd ZdddZ	dS )betanbinom_genaK  A beta-negative-binomial discrete random variable.

    %(before_notes)s

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

    The probability mass function for `betanbinom` is:

    .. math::

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

    for :math:`k \ge 0`, :math:`n \geq 0`, :math:`a > 0`,
    :math:`b > 0`, where :math:`B(a, b)` is the beta function.

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

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

    %(after_notes)s

    .. versionadded:: 1.12.0

    See Also
    --------
    betabinom : Beta binomial distribution

    %(example)s

    c                 C   r   r   r)   r,   r.   r.   r/   r0     r   zbetanbinom_gen._shape_infoNc                 C   r   r3   )r   r   r   r.   r.   r/   r8     r   zbetanbinom_gen._rvsc                 C   r   r   r;   r   r.   r.   r/   r=     r>   zbetanbinom_gen._argcheckc                 C   sF   t |}t||  t||d  }|t|| ||  t|| S rB   )r   r*   r   r   r   r.   r.   r/   rI     s    zbetanbinom_gen._logpmfc                 C   r   r3   r   r   r.   r.   r/   rM     rz   zbetanbinom_gen._pmfrX   c                 C   s   dd }t |dk|||f|tjd}dd }t |dk|||f|tjd}d\}}	d	d
 }
d|v r>t |dk|||f|
tjd}dd }d|v rTt |dk|||f|tjd}	||||	fS )Nc                 S   s   | | |d  S Nr   r.   r$   r@   r|   r.   r.   r/   mean  rw   z#betanbinom_gen._stats.<locals>.meanr   )f	fillvaluec                 S   s4   | | | | d  || d  |d |d d   S )Nr   r[   r.   r   r.   r.   r/   r_     s   z"betanbinom_gen._stats.<locals>.varr   rY   c                 S   sT   d|  | d d| | d  |d  t | | | | d  || d  |d   S )Nr   r         @r[   r   r   r.   r.   r/   skew  s    z#betanbinom_gen._stats.<locals>.skewrZ   r   c                 S   s   |d }|d d |d |d| d   d|d  |   d| d  |d |d  |d |d  |  d|d d     d|d  |  |d |d  |d |d  |  d|d d     }|d	 |d  | |  || d  ||  d  }|| | d S )
Nr[   r   r   r\   r         @r   r   g      @r.   )r$   r@   r|   termZterm_2denominatorr.   r.   r/   kurtosis  s0    "

z'betanbinom_gen._stats.<locals>.kurtosisrG      r	   r*   r+   )r-   r$   r@   r|   r]   r   r^   r_   r`   ra   r   r   r.   r.   r/   rd     s   zbetanbinom_gen._statsrY   rj   )
rl   rm   rn   ro   r0   r8   r=   rI   rM   rd   r.   r.   r.   r/   r     s    $
r   
betanbinomc                   @   r   )geom_gena5  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.

    Note that when drawing random samples, the probability of observations that exceed
    ``np.iinfo(np.int64).max`` increases rapidly as $p$ decreases below $10^{-17}$. For
    $p < 10^{-20}$, almost all observations would exceed the maximum ``int64``; however,
    the output dtype is always ``int64``, so these values are clipped to the maximum.

    %(after_notes)s

    See Also
    --------
    planck

    %(example)s

    c                 C   rt   ru   rv   r,   r.   r.   r/   r0     rw   zgeom_gen._shape_infoNc                 C   s.   |j ||d}t|jj}t|dk ||S )Nr6   r   )	geometricr*   Ziinfor   maxwhere)r-   r&   r6   r7   resZmax_intr.   r.   r/   r8     s   zgeom_gen._rvsc                 C   s   |dk|dk@ S Nr   r   r.   r{   r.   r.   r/   r=     rw   zgeom_gen._argcheckc                 C   s   t d| |d | S rB   )r*   powerr-   rG   r&   r.   r.   r/   rM      r   zgeom_gen._pmfc                 C   s   t |d | t| S rB   )r   rE   r   r   r.   r.   r/   rI   #     zgeom_gen._logpmfc                 C   s   t |}tt| |  S r3   )r   r   r   r-   rF   r&   rG   r.   r.   r/   rQ   &     zgeom_gen._cdfc                 C   s   t | ||S r3   )r*   r   _logsfr~   r.   r.   r/   rS   *  s   zgeom_gen._sfc                 C   s   t |}|t|  S r3   )r   r   r   r.   r.   r/   r   -  rR   zgeom_gen._logsfc                 C   sF   t t| t|  }| |d |}t||k|dk@ |d |S r   )r   r   rQ   r*   r   )r-   rV   r&   rh   tempr.   r.   r/   rW   1  s   zgeom_gen._ppfc                 C   sP   d| }d| }|| | }d| t | }tg d|d|  }||||fS )Nr   r[   )r   ir   )r   r*   Zpolyval)r-   r&   r^   Zqrr_   r`   ra   r.   r.   r/   rd   6  s   zgeom_gen._statsc                 C   s$   t | t | d|  |  S r   )r*   r   r   r{   r.   r.   r/   ri   >  s   $zgeom_gen._entropyrY   )rl   rm   rn   ro   r0   r8   r=   rM   rI   rQ   rS   r   rW   rd   ri   r.   r.   r.   r/   r     s    !
r   geomzA geometric)r@   rq   longnamec                   @   rr   )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)!}.

    This distribution uses routines from the Boost Math C++ library for
    the computation of the ``pmf``, ``cdf``, ``sf`` and ``stats`` methods. [1]_

    %(after_notes)s

    References
    ----------
    .. [1] The Boost Developers. "Boost C++ Libraries". https://www.boost.org/.

    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   :   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/   r0     r   zhypergeom_gen._shape_infoNc                 C   s   |j ||| ||dS Nr   )Zhypergeometric)r-   r   r$   r   r6   r7   r.   r.   r/   r8        zhypergeom_gen._rvsc                 C   s    t |||  dt ||fS r   r*   maximumminimum)r-   r   r$   r   r.   r.   r/   rA     r>   zhypergeom_gen._get_supportc                 C   sL   |dk|dk@ |dk@ }|||k||k@ M }|t |t |@ t |@ M }|S r   r;   )r-   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 rB   r   )	r-   rG   r   r$   r   totgoodbadresultr.   r.   r/   rI     s   
0zhypergeom_gen._logpmfc                 C      t ||||S r3   )rK   Z_hypergeom_pmfr-   rG   r   r$   r   r.   r.   r/   rM     rw   zhypergeom_gen._pmfc                 C   r   r3   )rK   Z_hypergeom_cdfr   r.   r.   r/   rQ     rw   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   r\   r   r   r[   r   )rK   Z_hypergeom_meanZ_hypergeom_varianceZ_hypergeom_skewness)r-   r   r$   r   mra   r.   r.   r/   rd     s   (((zhypergeom_gen._statsc                 C   sB   t j|||  t||d  }| ||||}t jt|ddS )Nr   r   re   )r*   rf   minpmfrg   r   )r-   r   r$   r   rG   rh   r.   r.   r/   ri     s    zhypergeom_gen._entropyc                 C   r   r3   )rK   Z_hypergeom_sfr   r.   r.   r/   rS     rw   zhypergeom_gen._sfc                 C   s   g }t t|||| D ]>\}}}}	|d |d  |d |	d  k r3|tt| ||||	  qt|d |	d }
|t| 	|
|||	 qt
|S )Nr   r   )zipr*   r   appendr   r   r   aranger   rI   asarrayr-   rG   r   r$   r   r   Zquantr   r   ZdrawZk2r.   r.   r/   r     s     "
zhypergeom_gen._logsfc                 C   s   g }t t|||| D ]<\}}}}	|d |d  |d |	d  kr3|tt| ||||	  qtd|d }
|t| 	|
|||	 qt
|S )Nr   r   r   )r   r*   r   r   r   r   Zlogsfr   r   rI   r   r   r.   r.   r/   r     s     "
zhypergeom_gen._logcdfrY   )rl   rm   rn   ro   r0   r8   rA   r=   rI   rM   rQ   rd   ri   rS   r   r   r.   r.   r.   r/   r   E  s    I
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   r   )Nr   Tr   r%   r$   rr)   r,   r.   r.   r/   r0   H  r   znhypergeom_gen._shape_infoc                 C      d|fS r   r.   )r-   r   r$   r   r.   r.   r/   rA   M  r   znhypergeom_gen._get_supportc                 C   sD   |dk||k@ |dk@ ||| k@ }|t |t |@ t |@ M }|S r   r;   )r-   r   r$   r   r   r.   r.   r/   r=   P  s   $znhypergeom_gen._argcheckNc                    s"   t  fdd}||||||dS )Nc                    sl     | ||\}}t||d } || ||}t||ddd}	|	|j|dt}
|d u r4|
 S |
S )Nr   nextZextrapolate)kindZ
fill_valuer   )	Zsupportr*   r   r   r   uniformr   intitem)r   r$   r   r6   r7   r@   r|   ksr   Zppfrvsr,   r.   r/   _rvs1W  s   z"nhypergeom_gen._rvs.<locals>._rvs1rx   r   )r-   r   r$   r   r6   r7   r   r.   r,   r/   r8   U  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 rB   r   )rG   r   r$   r   r.   r.   r/   <lambda>h  s   z(nhypergeom_gen._logpmf.<locals>.<lambda>        )r   )r	   )r-   rG   r   r$   r   r   r   r.   r.   r/   rI   e  s   znhypergeom_gen._logpmfc                 C   r   r3   r   )r-   rG   r   r$   r   r.   r.   r/   rM   o  s   znhypergeom_gen._pmfc                 C   s   d| d| d| }}}|| || d  }||d  | || d || d   d||| d    }d\}}||||fS )Nr   r   r   rY   r.   )r-   r   r$   r   r^   r_   r`   ra   r.   r.   r/   rd   t  s
   <znhypergeom_gen._statsrY   )rl   rm   rn   ro   r0   rA   r=   r8   rI   rM   rd   r.   r.   r.   r/   r     s    d

r   
nhypergeomc                   @   :   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   rt   ru   rv   r,   r.   r.   r/   r0     rw   zlogser_gen._shape_infoNc                 C      |j ||dS r   )Z	logseriesry   r.   r.   r/   r8     r   zlogser_gen._rvsc                 C   s   |dk|dk @ S r:   r.   r{   r.   r.   r/   r=     rw   zlogser_gen._argcheckc                 C   s"   t || d | t|  S r   )r*   r   r   r   r   r.   r.   r/   rM        "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*   r   )r-   r&   r   r^   Zmu2pr_   Zmu3pZmu3r`   Zmu4pmu4ra   r.   r.   r/   rd     s   :,zlogser_gen._statsrY   )	rl   rm   rn   ro   r0   r8   r=   rM   rd   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      t dddtjfdgS )Nr^   Fr   r%   r)   r,   r.   r.   r/   r0     r   zpoisson_gen._shape_infoc                 C   s   |dkS r   r.   )r-   r^   r.   r.   r/   r=     r   zpoisson_gen._argcheckNc                 C   s   | ||S r3   poisson)r-   r^   r6   r7   r.   r.   r/   r8     r   zpoisson_gen._rvsc                 C   s    t ||t|d  | }|S rB   )r   rD   rC   )r-   rG   r^   Pkr.   r.   r/   rI     s   zpoisson_gen._logpmfc                 C      t | ||S r3   r   )r-   rG   r^   r.   r.   r/   rM     s   zpoisson_gen._pmfc                 C      t |}t||S r3   )r   r   pdtrr-   rF   r^   rG   r.   r.   r/   rQ        zpoisson_gen._cdfc                 C   r  r3   )r   r   Zpdtrcr  r.   r.   r/   rS     r  zpoisson_gen._sfc                 C   s>   t t||}t|d d}t||}t||k||S r   )r   r   Zpdtrikr*   r   r  r   )r-   rV   r^   rh   vals1r   r.   r.   r/   rW     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   rF   r.   r.   r/   r     s    z$poisson_gen._stats.<locals>.<lambda>c                 S   s   d|  S r   r.   r	  r.   r.   r/   r     s    )r*   r   r	   r+   )r-   r^   r_   tmpZ
mu_nonzeror`   ra   r.   r.   r/   rd     s   
zpoisson_gen._statsrY   )rl   rm   rn   ro   r0   r=   r8   rI   rM   rQ   rS   rW   rd   r.   r.   r.   r/   r     s    
r   r  z	A Poisson)rq   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   r   )NlambdaFr   r   r)   r,   r.   r.   r/   r0   "  r   zplanck_gen._shape_infoc                 C      |dkS r   r.   )r-   lambda_r.   r.   r/   r=   %  r   zplanck_gen._argcheckc                 C   s   t |  t| |  S r3   )r   r   )r-   rG   r  r.   r.   r/   rM   (  r   zplanck_gen._pmfc                 C   s   t |}t| |d   S rB   )r   r   r-   rF   r  rG   r.   r.   r/   rQ   +  r   zplanck_gen._cdfc                 C   r  r3   )r   r   )r-   rF   r  r.   r.   r/   rS   /  rw   zplanck_gen._sfc                 C   s   t |}| |d  S rB   r   r  r.   r.   r/   r   2  rR   zplanck_gen._logsfc                 C   sL   t d| t|  d }|d j| | }| ||}t||k||S )N      r   )r   r   cliprA   rQ   r*   r   )r-   rV   r  rh   r  r   r.   r.   r/   rW   6  s   zplanck_gen._ppfNc                 C   s   t |  }|j||dd S )Nr   r   )r   r   )r-   r  r6   r7   r&   r.   r.   r/   r8   <  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   )r-   r  r^   r_   r`   ra   r.   r.   r/   rd   A  s
   zplanck_gen._statsc                 C   s&   t |  }|t|  | t| S r3   )r   r   r   )r-   r  Cr.   r.   r/   ri   H  s   zplanck_gen._entropyrY   )rl   rm   rn   ro   r0   r=   rM   rQ   rS   r   rW   r8   rd   ri   r.   r.   r.   r/   r    s    
r  planckzA discrete exponential c                   @   H   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   r   r   Tr)   r,   r.   r.   r/   r0   f     zboltzmann_gen._shape_infoc                 C   s   |dk|dk@ t |@ S r   r;   r-   r  r   r.   r.   r/   r=   j  r   zboltzmann_gen._argcheckc                 C   s   | j |d fS rB   r?   r  r.   r.   r/   rA   m  r9   zboltzmann_gen._get_supportc                 C   s2   dt |  dt | |   }|t | |  S rB   r   )r-   rG   r  r   Zfactr.   r.   r/   rM   p  s    zboltzmann_gen._pmfc                 C   s0   t |}dt| |d   dt| |   S rB   )r   r   )r-   rF   r  r   rG   r.   r.   r/   rQ   v  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+   rQ   r   )r-   rV   r  r   Zqnewrh   r  r   r.   r.   r/   rW   z  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  )r-   r  r   zZzNr^   r_   ZtrmZtrm2r`   ra   r.   r.   r/   rd     s   
((@zboltzmann_gen._statsN)rl   rm   rn   ro   r0   r=   rA   rM   rQ   rW   rd   r.   r.   r.   r/   r  P  s    r  	boltzmannz!A truncated discrete exponential )rq   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

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.stats import randint
    >>> import matplotlib.pyplot as plt
    >>> fig, ax = plt.subplots(1, 1)

    Calculate the first four moments:

    >>> low, high = 7, 31
    >>> mean, var, skew, kurt = randint.stats(low, high, moments='mvsk')

    Display the probability mass function (``pmf``):

    >>> x = np.arange(low - 5, high + 5)
    >>> ax.plot(x, randint.pmf(x, low, high), 'bo', ms=8, label='randint pmf')
    >>> ax.vlines(x, 0, randint.pmf(x, low, high), colors='b', lw=5, alpha=0.5)

    Alternatively, the distribution object can be called (as a function) to
    fix the shape and location. This returns a "frozen" RV object holding the
    given parameters fixed.

    Freeze the distribution and display the frozen ``pmf``:

    >>> rv = randint(low, high)
    >>> ax.vlines(x, 0, rv.pmf(x), colors='k', linestyles='-',
    ...           lw=1, label='frozen pmf')
    >>> ax.legend(loc='lower center')
    >>> plt.show()

    Check the relationship between the cumulative distribution function
    (``cdf``) and its inverse, the percent point function (``ppf``):

    >>> q = np.arange(low, high)
    >>> p = randint.cdf(q, low, high)
    >>> np.allclose(q, randint.ppf(p, low, high))
    True

    Generate random numbers:

    >>> r = randint.rvs(low, high, size=1000)

    c                 C   s0   t ddtj tjfdt ddtj tjfdgS )NlowTr   highr)   r,   r.   r.   r/   r0     s   zrandint_gen._shape_infoc                 C   s   ||kt |@ t |@ S r3   r;   r-   r  r  r.   r.   r/   r=     r   zrandint_gen._argcheckc                 C   s   ||d fS rB   r.   r  r.   r.   r/   rA     r   zrandint_gen._get_supportc                 C   s8   t |t j|t jd|  }t ||k||k @ |dS )Nr   r   )r*   Z	ones_liker   int64r   )r-   rG   r  r  r&   r.   r.   r/   rM     s   zrandint_gen._pmfc                 C   s   t |}|| d ||  S r   r  )r-   rF   r  r  rG   r.   r.   r/   rQ     r   zrandint_gen._cdfc                 C   sH   t |||  | d }|d ||}| |||}t||k||S rB   )r   r  rQ   r*   r   )r-   rV   r  r  rh   r  r   r.   r.   r/   rW     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   )
r-   r  r  m2m1r^   dr_   r`   ra   r.   r.   r/   rd     s   zrandint_gen._statsNc                 C   sv   t |jdkrt |jdkrt||||dS |dur(t ||}t ||}t jtt|t tgd}|||S )z=An array of *size* random integers >= ``low`` and < ``high``.r   r   N)Zotypes)	r*   r   r6   r
   Zbroadcast_to	vectorizer   r   r   )r-   r  r  r6   r7   randintr.   r.   r/   r8     s    

zrandint_gen._rvsc                 C   s   t || S r3   )r   r  r.   r.   r/   ri     r   zrandint_gen._entropyrY   )rl   rm   rn   ro   r0   r=   rA   rM   rQ   rW   rd   r8   ri   r.   r.   r.   r/   r    s    ?
	r  r&  z#A discrete uniform (random integer)c                   @   r   )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 zipf, zipfian
    >>> k = np.arange(11)
    >>> np.allclose(zipf.pmf(k, a), zipfian.pmf(k, a, n=10000000))
    True

    c                 C   r   )Nr@   Fr   r   r)   r,   r.   r.   r/   r0   ;  r   zzipf_gen._shape_infoNc                 C   r   r   )zipf)r-   r@   r6   r7   r.   r.   r/   r8   >  r9   zzipf_gen._rvsc                 C   r  rB   r.   r-   r@   r.   r.   r/   r=   A  r   zzipf_gen._argcheckc                 C   s*   | tj}dt|d ||   }|S Nr   r   )r   r*   float64r   r   )r-   rG   r@   r  r.   r.   r/   rM   D  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 rB   )r   r   )r@   r$   r.   r.   r/   r   M  s    z zipf_gen._munp.<locals>.<lambda>r   )r-   r$   r@   r.   r.   r/   _munpJ  s
   zzipf_gen._munprY   )	rl   rm   rn   ro   r0   r8   r=   rM   r,  r.   r.   r.   r/   r'    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_gt1T  s   r.  c                 C   sf   t | s| S t | }t j|td}t j|ddtdD ]}|| k}||  d|||   7  < q|S )z#Generalized harmonic number, a <= 1r   r   r   )r*   r6   r   Z
zeros_likefloatr   )r$   r@   Zn_maxoutimaskr.   r.   r/   _gen_harmonic_leq1Z  s   

r4  c                 C   s(   t | |\} }t|dk| |fttdS )zGeneralized harmonic numberr   r   f2)r*   r   r	   r.  r4  r-  r.   r.   r/   _gen_harmonicg  s   r7  c                   @   r  )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, zipfian
    >>> 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$   Tr   r)   r,   r.   r.   r/   r0     r  zzipfian_gen._shape_infoc                 C   s"   |dk|dk@ |t j|tdk@ S )Nr   r   )r*   r   r   r-   r@   r$   r.   r.   r/   r=     r   zzipfian_gen._argcheckc                 C   r   rB   r.   r9  r.   r.   r/   rA     r   zzipfian_gen._get_supportc                 C   s$   | tj}dt|| ||   S r   )r   r*   r+  r7  r-   rG   r@   r$   r.   r.   r/   rM     s   zzipfian_gen._pmfc                 C   s   t ||t || S r3   r7  r:  r.   r.   r/   rQ     rz   zzipfian_gen._cdfc                 C   s:   |d }|| t ||t ||  d || t ||  S rB   r;  r:  r.   r.   r/   rS     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   r;  )r-   r@   r$   ZHnaZHna1ZHna2ZHna3ZHna4mu1Zmu2nZmu2dmu2r`   ra   r.   r.   r/   rd     s"   
82
zzipfian_gen._statsN)rl   rm   rn   ro   r0   r=   rA   rM   rQ   rS   rd   r.   r.   r.   r/   r8  n  s    .r8  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   r   )Nr@   Fr   r   r)   r,   r.   r.   r/   r0     r   zdlaplace_gen._shape_infoc                 C   s   t |d t| t|  S Nr[   )r   r   abs)r-   rG   r@   r.   r.   r/   rM     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  rG   r@   r.   r.   r/   r     r   zdlaplace_gen._cdf.<locals>.fc                 S   s   t || d  t |d  S rB   r  rB  r.   r.   r/   r6       zdlaplace_gen._cdf.<locals>.f2r   r5  )r   r	   )r-   rF   r@   rG   r   r6  r.   r.   r/   rQ     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   rQ   )r-   rV   r@   constrh   r  r.   r.   r/   rW     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  )r-   r@   Zear=  r   r.   r.   r/   rd     s   (zdlaplace_gen._statsc                 C   s   |t | tt|d  S r@  )r   r   r   r)  r.   r.   r/   ri     rC  zdlaplace_gen._entropyNc                 C   s8   t t |  }|j||d}|j||d}|| S r   )r*   r   r   r   )r-   r@   r6   r7   ZprobOfSuccessrF   yr.   r.   r/   r8     s   zdlaplace_gen._rvsrY   )rl   rm   rn   ro   r0   rM   rQ   rW   rd   ri   r8   r.   r.   r.   r/   r?    s    r?  dlaplacezA discrete Laplacianc                   @   sX   e Zd ZdZdd Zdd Zddddd	Zd
d Zdd Zdd Z	dd Z
dd ZdS )poisson_binom_genul  A Poisson Binomial discrete random variable.

    %(before_notes)s

    See Also
    --------
    binom

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

    .. math::

     f(k; p_1, p_2, ..., p_n) = \sum_{A \in F_k} \prod_{i \in A} p_i \prod_{j \in A^C} 1 - p_j

    where :math:`k \in \{0, 1, \dots, n-1, n\}`, :math:`F_k` is the set of all
    subsets of :math:`k` integers that can be selected :math:`\{0, 1, \dots, n-1, n\}`,
    and :math:`A^C` is the complement of a set :math:`A`.

    `poisson_binom` accepts a single array argument ``p`` for shape parameters
    :math:`0 ≤ p_i ≤ 1`, where the last axis corresponds with the index :math:`i` and
    any others are for batch dimensions. Broadcasting behaves according to the usual
    rules except that the last axis of ``p`` is ignored. Instances of this class do
    not support serialization/unserialization.

    %(after_notes)s

    References
    ----------
    .. [1] "Poisson binomial distribution", Wikipedia,
           https://en.wikipedia.org/wiki/Poisson_binomial_distribution
    .. [2] Biscarri, William, Sihai Dave Zhao, and Robert J. Brunner. "A simple and
           fast method for computing the Poisson binomial distribution function".
           Computational Statistics & Data Analysis 122 (2018) 92-100.
           :doi:`10.1016/j.csda.2018.01.007`

    %(example)s

    c                 C   s   g S r3   r.   r,   r.   r.   r/   r0   G  s   zpoisson_binom_gen._shape_infoc                 G   s,   t j|dd}d|k|dk@ }t j|ddS Nr   re   r   )r*   stackall)r-   argsr&   Zcondsr.   r.   r/   r=   L  s   zpoisson_binom_gen._argcheckNrx   c                G   s`   t j|dd}|d u r|jnt |r|dfnt|d }t |j|}tj|||djddS )Nr/  re   r   )r   rx   )	r*   rI  shapeZisscalartupleZbroadcast_shapesr   r8   rg   )r-   r6   r7   rK  r&   r.   r.   r/   r8   Q  s   zpoisson_binom_gen._rvsc                 G   s   dt |fS r   )len)r-   rK  r.   r.   r/   rA   [  r   zpoisson_binom_gen._get_supportc                 G   D   t |t j}t j|g|R  ^}}t j|t jd}t||dS )Nr   r   r*   Z
atleast_1dr   r!  r   r   r+  r    r-   rG   rK  r.   r.   r/   rM   ^     zpoisson_binom_gen._pmfc                 G   rO  )Nr   r   rP  rQ  r.   r.   r/   rQ   d  rR  zpoisson_binom_gen._cdfc                 O   s>   t j|dd}t j|dd}t j|d|  dd}||d d fS rH  )r*   rI  rg   )r-   rK  kwdsr&   r   r_   r.   r.   r/   rd   j  s   zpoisson_binom_gen._statsc                 O   s   t | g|R i |S r3   )poisson_binomial_frozen)r-   rK  rS  r.   r.   r/   __call__p  r   zpoisson_binom_gen.__call__)rl   rm   rn   ro   r0   r=   r8   rA   rM   rQ   rd   rU  r.   r.   r.   r/   rG    s    (
rG  poisson_binomzA Poisson binomialr&   )rq   r   shapesc                 C      t t|dd|d|fS Nr/  r   r   rM  r*   Zmoveaxis)r-   r&   locr6   r.   r.   r/   _parse_args_rvs|  r   r\  rX   c                 C   rX  rY  rZ  )r-   r&   r[  r]   r.   r.   r/   _parse_args_stats  r   r]  c                 C   s   t t|dd|dfS rY  rZ  )r-   r&   r[  r.   r.   r/   _parse_args  r   r^  c                   @   s   e Zd Zdd ZdddZdS )rT  c                 O   s   || _ || _|jdi | | _ttt| j_t	tt| j_	t
tt| j_
| jj
|i |\}}}| jj| \| _| _d S )Nr.   )rK  rS  	__class__Z_updated_ctor_paramdistr\  __get___pb_obj_pb_clsr]  r^  rA   r@   r|   )r-   r`  rK  rS  rW  _r.   r.   r/   __init__  s   z poisson_binomial_frozen.__init__NFc           	      K   s<   | j j| ji | j\}}}| j j|| j||||fi |S r3   )r`  r^  rK  rS  expect)	r-   funcZlbZubZconditionalrS  r@   r[  scaler.   r.   r/   rf    s    zpoisson_binomial_frozen.expect)NNNF)rl   rm   rn   re  rf  r.   r.   r.   r/   rT    s    rT  c                   @   r   )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   r   r=  r)   r,   r.   r.   r/   r0     r  zskellam_gen._shape_infoNc                 C   s   |}| ||| || S r3   r   )r-   r<  r=  r6   r7   r$   r.   r.   r/   r8     s   

zskellam_gen._rvsc                 C   s   t jdd0 t |dk td| dd|  d| d td| dd|  d| d }W d    |S 1 s9w   Y  |S )Nr   r   r   r   r   )r*   r   r   rK   Z	_ncx2_pdfr-   rF   r<  r=  Zpxr.   r.   r/   rM     s   
  
zskellam_gen._pmfc                 C   s   t |}tjdd, t|dk td| d| d| dtd| d|d  d|  }W d    |S 1 s9w   Y  |S )Nr   r   r   r   r   )r   r*   r   r   rK   Z	_ncx2_cdfrj  r.   r.   r/   rQ     s   
 
zskellam_gen._cdfc                 C   s4   || }|| }|t |d  }d| }||||fS )Nr   r   r   )r-   r<  r=  r   r_   r`   ra   r.   r.   r/   rd     s
   zskellam_gen._statsrY   )	rl   rm   rn   ro   r0   r8   rM   rQ   rd   r.   r.   r.   r/   ri    s    
ri  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   r   )NalphaFr   r   r)   r,   r.   r.   r/   r0     r   zyulesimon_gen._shape_infoNc                 C   s6   | |}| |}t| tt| |   }|S r3   )Zstandard_exponentialr   r   r   )r-   rn  r6   r7   ZE1ZE2Zansr.   r.   r/   r8     s   

zyulesimon_gen._rvsc                 C   s   |t ||d  S rB   r   r   r-   rF   rn  r.   r.   r/   rM     rz   zyulesimon_gen._pmfc                 C   r  r   r.   )r-   rn  r.   r.   r/   r=     r   zyulesimon_gen._argcheckc                 C   s   t |t||d  S rB   r   r   r   rp  r.   r.   r/   rI     r   zyulesimon_gen._logpmfc                 C   s   d|t ||d   S rB   ro  rp  r.   r.   r/   rQ     r   zyulesimon_gen._cdfc                 C   s   |t ||d  S rB   ro  rp  r.   r.   r/   rS     rz   zyulesimon_gen._sfc                 C   s   t |t||d  S rB   rq  rp  r.   r.   r/   r      r   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  |d    t j}t |dkt j|}||||fS )	Nr   r   r[   r   r      1      )r*   r   r+   nanr   )r-   rn  r^   r=  r`   ra   r.   r.   r/   rd   #  s&   

"
zyulesimon_gen._statsrY   )rl   rm   rn   ro   r0   r8   rM   r=   rI   rQ   rS   r   rd   r.   r.   r.   r/   rm    s    !
rm  	yulesimon)rq   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   oddsFr   r)   r,   r.   r.   r/   r0   B  s
   z_nchypergeom_gen._shape_infoc           	      C   s<   |||}}}|| }t d|| }t ||}||fS r   r   )	r-   r   r$   r   rx  r#  r"  Zx_minZx_maxr.   r.   r/   rA   H  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 r   )r*   r   r   r   )r-   r   r$   r   rx  Zcond1Zcond2Zcond3Zcond4Zcond5Zcond6r.   r.   r/   r=   O  s   z_nchypergeom_gen._argcheckc                    s$   t  fdd}|||||||dS )Nc           
         s<   t |}t }t| j}|||| |||}	|	|}	|	S r3   )r*   prodr   getattrrvs_nameZreshape)
r   r$   r   rx  r6   r7   lengthurnZrv_genr   r,   r.   r/   r   \  s   

z$_nchypergeom_gen._rvs.<locals>._rvs1rx   r   )r-   r   r$   r   rx  r6   r7   r   r.   r,   r/   r8   Z  s   z_nchypergeom_gen._rvsc                    sR   t |||||\}}}}}|jdkrt |S t j fdd}||||||S )Nr   c                    s     ||||d}|| S Ng-q=)r`  Zprobability)rF   r   r$   r   rx  r}  r,   r.   r/   _pmf1m  s   
z$_nchypergeom_gen._pmf.<locals>._pmf1)r*   r   r6   Z
empty_liker%  )r-   rF   r   r$   r   rx  r  r.   r,   r/   rM   g  s   

z_nchypergeom_gen._pmfc                    sL   t j fdd}d|v sd|v r|||||nd\}}d\}	}
|||	|
fS )Nc                    s     ||| |d}| S r~  )r`  r]   )r   r$   r   rx  r}  r,   r.   r/   	_moments1v  s   z*_nchypergeom_gen._stats.<locals>._moments1r   vrY   )r*   r%  )r-   r   r$   r   rx  r]   r  r   r  rZ   rG   r.   r,   r/   rd   t  s   z_nchypergeom_gen._statsrY   )rl   rm   rn   ro   r{  r`  r0   rA   r=   r8   rM   rd   r.   r.   r.   r/   rw  8  s    
rw  c                   @      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)rl   rm   rn   ro   r{  r   r`  r.   r.   r.   r/   r        Ir  nchypergeom_fisherz$A Fisher's noncentral hypergeometricc                   @   r  )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)rl   rm   rn   ro   r{  r   r`  r.   r.   r.   r/   r    r  r  nchypergeom_walleniusz&A Wallenius' noncentral hypergeometric)r   N)r   rX   )r   )j	functoolsr   Zscipyr   Zscipy.specialr   r   r   r   rC   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   r   r   Z
_biasedurnr   r   r   Z_stats_pythranr    Zscipy.special._ufuncsZ_ufuncsrK   r!   rp   rs   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.  r4  r7  r8  r>  r?  r+   rF  rG  rV  r\  r]  r^  rb  rc  ra  rT  ri  rl  rm  rv  rw  r  r  r  r  listglobalscopyitemspairsZ_distn_namesZ_distn_gen_names__all__r.   r.   r.   r/   <module>   s   0 
`A
R
u
]Q 
 
 8BG?wBYPV



?OINN