U
    °»|evN  ã                   @   s2  d dl Zd dlZd dlm  mZ d dlm	Z	 dZ
e e d¡e
¡Ze e d¡e
 ¡Ze dej ¡Ze dej ¡ZdZe d¡Zejd Zejd Zejd	 Zd
dddddddgZdd„ Zdd„ Zd-dd„Zd.dd„Zdd„ Zd/dd„Zd0dd „Z d1d!d"„Z!d#d$„ Z"d%d&„ Z#d2d'd(„Z$d)d*„ Z%d3d+d,„Z&dS )4é    N)Ú_derivativeé€   é   é   i<ýÿÿé   é   é   g˜SË†Bž¿g¤A¤Az?g}<™Ù°j_¿g#ÿ+•K?g8�8�C¿g  J?glÁlÁf¿gUUUUUUµ?c                 C   s6   d|  }t  | ¡d |  td  |t  t||  ¡  S )Nç      ð?r   )ÚnpÚlogÚ_LOG_2PIÚpolyvalÚ_STIRLING_COEFFS)ÚnÚrn© r   úQ/var/www/website-v5/atlas_env/lib/python3.8/site-packages/scipy/stats/_ksstats.pyÚ_log_nfactorial_div_n_pow_n\   s    r   c                 C   s   t  | dd¡S )z%clips a probability to range 0<=p<=1.ç        r	   )r
   Úclip)Úpr   r   r   Ú
_clip_probf   s    r   Tc                 C   s   t  || |¡}t|ƒS )z>Selects either the CDF or SF, and then clips to range 0<=p<=1.)r
   Úwherer   )ÚcdfprobZsfprobÚcdfr   r   r   r   Ú_select_and_clip_probk   s    r   c                 C   s`  |dkrt dd|ƒS | | }|dkr0t dd|ƒS tt |¡ƒ}|| }d| d }t ||g¡}t d|d ¡}d||  }	t |¡}
d}|D ],}||
|d < || }|	|d   |9  < qŽtd| d dƒ| d||   }d| | |	d< td|ƒD ](}|
d|| d … ||d d…|f< qø|	|dd…df< tj	|	dd	�|ddd…f< t 
t |¡d ¡}| }d}d}|dk�rä|d �r”t ||¡}||7 }t ||¡}|d9 }t ||d |d f ¡tk�rØ|t }|t7 }|d }�ql||d |d f }td| d ƒD ]2}|| |  }t |¡tk �r|t9 }|t8 }�q|dk�rPt ||¡}t |d| |ƒS )
z§Computes the Kolmogorov CDF:  Pr(D_n <= d) using the MTW approach to
    the Durbin matrix algorithm.

    Durbin (1968); Marsaglia, Tsang, Wang (2003). [1], [3].
    r	   r   ç      à?r   r   r   éÿÿÿÿN)Úaxis)r   Úintr
   ÚceilÚzerosÚarangeÚemptyÚmaxÚrangeÚflipÚeyeÚshapeÚmatmulÚabsÚ_EP128Ú_E128Ú_EM128Úldexp)r   Údr   ÚndÚkÚhÚmÚHZintmÚvÚwÚfacÚjÚttÚiZHpwrÚnnÚexpntZHexpntr   r   r   r   Ú_kolmogn_DMTWq   s\    
"&

 
r=   c           	      C   sÖ   | dkr&| | d || d  }}n˜t | d dƒ\}}|dkrœ||d krp|| | d || | d  }}q¾|d | | d || d | d  }}n"|d | d || | d  }}t|d dƒt||ƒfS )z0Compute the endpoints of the interval for row i.r   r   r   )Údivmodr$   Úmin)	r:   r   ÚllÚceilfÚroundfÚj1Új2Zip1div2Zip1mod2r   r   r   Ú_pomeranz_compute_j1j2¼   s    $,"rE   c                  C   sô  | | }t t |¡ƒ}d||  }t|d| ƒ}|dkr<dnd}|dkrLdnd}d|d  }	t |	¡}
t |	¡}t |	¡}d|
d< d|d< d|d< d}||  d| |  dd|  |    }}}td|	ƒD ]L}|
|d  | | |
|< ||d  | | ||< ||d  | | ||< qÈt |	g¡}t |	g¡}d|d< d\}}td| |||ƒ\}}tdd|  d ƒD �]}|}|| }}|| }}| d¡ t|| |||ƒ\}}|dk�s¼|d|  d k�rÂ|
}n|d �rÐ|n|}|| d }|dk�rdt 	||| || | … |d|… ¡}|| }|| d }|||| … |d|…< dt 
|¡  k �r\tk �rpn n|t9 }|t8 }|| | }�qd|| |  }td| d ƒD ].}t |¡tk�r¾|t9 }|t7 }||9 }�qš|dk�ràt ||¡}t|d| |ƒ}|S )	z[Computes Pr(D_n <= d) using the Pomeranz recursion algorithm.

    Pomeranz (1974) [2]
    r	   r   r   r   r   )r   r   r   N)r   r
   Úfloorr?   r#   r%   r!   rE   ÚfillÚconvolver$   r-   r+   r,   r*   r.   r   ) r   Úxr   Útr@   ÚfÚgrA   rB   ZnpwrsZgpowerZ	twogpowerZonem2gpowerr<   Zg_over_nZtwo_g_over_nZone_minus_two_g_over_nr3   ZV0ZV1ZV0sZV1srC   rD   r:   Úk1ZpwrsZln2ÚconvZ
conv_startZconv_lenÚansr   r   r   Ú_kolmogn_PomeranzÎ   sj    


(



("
rP   c           %   	   C   s0  |dkrt dd|d�S |dkr,t dd|d�S t | ¡| }|d |d |d |d f\}}}}t d | }|tk r‚t dd|d�S t |¡}	| }
td }d| d|  }d| d	|  t d }td
d|   d }td	d|   d }td| d|   d }td| d|   d }d| d|d   }t d¡}t	t 
d| tj ¡ƒ}t|ddƒD ]�}d| d
 }|d |d |d   }}}t |	d| ¡}t d|
||  |||  ||  |||  ||  ||  g¡}||9 }||7 }�q\||	9 }|t9 }|t |d| d|d  d|d  g¡ }t t d | ¡}	t |dd¡}|d }t| }tj| }|	| } t ||  ¡}!|!tt d|  9 }!|d  |!7  < t || ||  | |  ¡}"|"tt d|  9 }"|d  |"7  < t | d t t|ƒ¡d ¡}#||# }|�s$|d9 }|d  d
7  < t|ƒ}$|$S )aP  Computes the Pelz-Good approximation to Prob(Dn <= x) with 0<=x<=1.

    Start with Li-Chien, Korolyuk approximation:
        Prob(Dn <= x) ~ K0(z) + K1(z)/sqrt(n) + K2(z)/n + K3(z)/n**1.5
    where z = x*sqrt(n).
    Transform each K_(z) using Jacobi theta functions into a form suitable
    for small z.
    Pelz-Good (1976). [6]
    r   r	   ©r   r   r   r   r   é   é   r   é   é   é@   iÄÿÿÿéÔ   é‡   é`   iâÿÿÿéZ   r   r   éH   é   iP  é
   iÜÿÿÿéØ   ç       @)r   r
   ÚsqrtÚ_PI_SQUAREDÚ_MIN_LOGÚexpÚ_PI_FOURÚ_PI_SIXr!   r   r    Úpir%   ÚpowerÚarrayÚ_SQRT2PIr"   Ú_SQRT3ÚsumÚlen)%r   rI   r   ÚzZzsquaredZzthreeZzfourZzsixZqlogÚqZk1aZk1bZk2aZk2bZk2cZk3dZk3cZk3bZk3aZK0to3Zmaxkr1   r3   ZmsquaredZmfourZmsixZqpowerÚcoeffsÚksZksquaredZsqrt3zZkspiZqpwersZk2extraZk3extraZpowers_of_nZKsumr   r   r   Ú_kolmogn_PelzGood"  sl    
$


ý*
rq   c                 C   s`  t  | ¡r| S t| ƒ| ks"| dkr(t jS |dkr>tdd|d�S |dkrTtdd|d�S | | }|dkrä|dkrztdd|d�S | dkr®t  t  d| d ¡d|   d| d  ¡}n$t  t| ƒ| t  	d| d ¡  ¡}t|d| |d�S || d k�rdd| |   }td| ||d�S |dk�rBdt
j | |¡ }td| ||d�S || }| dk�rÌ|d	k�r~t| |d
d�}t|d| |d�S |dk�r¨t| |d
d�}t|d| |d�S dt
j | |¡ }td| ||d�S |�s|dk�ràdS |dk�rdt
j | |¡ }t|ƒS |dk�rd}n:| dk�r@| |d  dk�r@t| |d
d�}nt| |d
d�}t|d| |d�S )z Computes the CDF(or SF) for the two-sided Kolmogorov-Smirnov statistic.

    x must be of type float, n of type integer.

    Simard & L'Ecuyer (2011) [7].
    r   r	   r   rQ   r   éŒ   r   r   gã¤0ïq&è?Tr   g      w@gš™™™™™@g      2@i † g      ø?gffffffö?)r
   Úisnanr   Únanr   Úprodr"   rc   r   r   ÚscipyÚspecialÚsmirnovr=   rP   r   rq   )r   rI   r   rJ   ÚprobZ	nxsquaredr   r   r   r   Ú_kolmognu  sX    
,$






rz   c                    sF  t  ˆ ¡rˆ S tˆ ƒˆ ks"ˆ dkr(t jS |dks8|dkr<dS ˆ | }|dkrÀ|dkrXdS ˆ dkrˆt  t  dˆ ¡dˆ   d| d  ¡}n(t  tˆ ƒˆ d t  d| d ¡  ¡}|d ˆ d  S |ˆ d krädd| ˆ d   ˆ  S |dk�rdt	j
j |ˆ ¡ S |d }t||dˆ   ƒ}t|d| ƒ}‡ fd	d
„}t|||dd�S )zvComputes the PDF for the two-sided Kolmogorov-Smirnov statistic.

    x must be of type float, n of type integer.
    r   r	   r   r   rr   r   r   g      ð@c                    s
   t ˆ | ƒS ©N)Úkolmogn)Ú_x©r   r   r   Ú_kkÕ  s    z_kolmogn_p.<locals>._kkrS   )ÚdxÚorder)r
   rs   r   rt   ru   r"   rc   r   r   rv   ÚstatsÚksoneÚpdfr?   r   )r   rI   rJ   ÚprdÚdeltar   r   r~   r   Ú
_kolmogn_p±  s.    
((
r‡   c                    sþ   t  ˆ ¡rˆ S tˆ ƒˆ ks"ˆ dkr(t jS ˆdkr8dˆ  S |dkrDdS t  t  ˆ¡tj ˆ d ¡ ˆ  ¡}|dˆ  kr„|dˆ   d S t  	t  |d ¡ˆ  ¡ }|ddˆ   kr²|S t
 ˆ¡t  ˆ ¡ }t|ddˆ   ƒ}‡ ‡fdd„}tjj|dˆ  |dd	�S )
zeComputes the PPF/ISF of kolmogn.

    n of type integer, n>= 1
    p is the CDF, q the SF, p+q=1
    r   r	   r   r   r_   c                    s   t ˆ | ƒˆ S r{   )rz   )rI   ©r   r   r   r   Ú<lambda>ñ  ó    z_kolmogni.<locals>.<lambda>g›+¡†›„=)Úxtol)r
   rs   r   rt   rc   r   rv   rw   ÚloggammaÚexpm1ÚscuÚ	_kolmogcir`   r?   ÚoptimizeÚbrentq)r   r   rn   r†   rI   Úx1Ú_fr   rˆ   r   Ú	_kolmogniÛ  s$    
$r”   c           	      C   sˆ   t j| ||dgdt jt jt jgd�}|D ]P\}}}}t  |¡rH||d< q(t|ƒ|krbtd|› �ƒ‚tt|ƒ||d�|d< q(|jd }|S )a  Computes the CDF for the two-sided Kolmogorov-Smirnov distribution.

    The two-sided Kolmogorov-Smirnov distribution has as its CDF Pr(D_n <= x),
    for a sample of size n drawn from a distribution with CDF F(t), where
    D_n &= sup_t |F_n(t) - F(t)|, and
    F_n(t) is the Empirical Cumulative Distribution Function of the sample.

    Parameters
    ----------
    n : integer, array_like
        the number of samples
    x : float, array_like
        The K-S statistic, float between 0 and 1
    cdf : bool, optional
        whether to compute the CDF(default=true) or the SF.

    Returns
    -------
    cdf : ndarray
        CDF (or SF it cdf is False) at the specified locations.

    The return value has shape the result of numpy broadcasting n and x.
    N)Z	op_dtypes.ún is not integral: rQ   r   )	r
   ÚnditerÚfloat64Úbool_rs   r   Ú
ValueErrorrz   Úoperands)	r   rI   r   ÚitÚ_nr}   Ú_cdfrm   Úresultr   r   r   r|   õ  s    ÿ

r|   c                 C   sn   t  | |dg¡}|D ]J\}}}t  |¡r2||d< qt|ƒ|krLtd|› �ƒ‚tt|ƒ|ƒ|d< q|jd }|S )aŒ  Computes the PDF for the two-sided Kolmogorov-Smirnov distribution.

    Parameters
    ----------
    n : integer, array_like
        the number of samples
    x : float, array_like
        The K-S statistic, float between 0 and 1

    Returns
    -------
    pdf : ndarray
        The PDF at the specified locations

    The return value has shape the result of numpy broadcasting n and x.
    N.r•   r   )r
   r–   rs   r   r™   r‡   rš   )r   rI   r›   rœ   r}   rm   rž   r   r   r   Úkolmognp  s    

rŸ   c                 C   s”   t  | ||dg¡}|D ]n\}}}}t  |¡r6||d< qt|ƒ|krPtd|› �ƒ‚|r`|d| fn
d| |f\}}	tt|ƒ||	ƒ|d< q|jd }
|
S )aû  Computes the PPF(or ISF) for the two-sided Kolmogorov-Smirnov distribution.

    Parameters
    ----------
    n : integer, array_like
        the number of samples
    q : float, array_like
        Probabilities, float between 0 and 1
    cdf : bool, optional
        whether to compute the PPF(default=true) or the ISF.

    Returns
    -------
    ppf : ndarray
        PPF (or ISF if cdf is False) at the specified locations

    The return value has shape the result of numpy broadcasting n and x.
    N.r•   r   r   )r
   r–   rs   r   r™   r”   rš   )r   rn   r   r›   rœ   Z_qr�   rm   Z_pcdfZ_psfrž   r   r   r   Úkolmogni7  s    
 
r    )T)T)T)T)T)T)T)'Únumpyr
   Úscipy.specialrv   Úscipy.special._ufuncsrw   Ú_ufuncsrŽ   Úscipy._lib._finite_differencesr   r,   r.   Ú
longdoubler+   r-   r`   rf   ri   r   r   rb   rj   ra   rd   re   r   r   r   r   r=   rE   rP   rq   rz   r‡   r”   r|   rŸ   r    r   r   r   r   Ú<module>D   sD   



   ý


K
T
S
<*
%