a
    Qe1                    @   s  d Z ddlZddlmZmZmZmZmZmZ ddl	Z	ddl	m
Z ddlmZ ddlZddlZddlZddlmZmZmZ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!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 dd	lm4Z4m5Z5 dd
lm6Z6 ddl7m8Z8m9Z9m:Z: ddl;m<Z< ddl=m>Z> ddl?m@Z@ ddlAmBZB ddlCmDZD dd ZEG dd dZFd@ddZGdd ZHG dd dZIG dd dZJG dd dZKd d! ZLG d"d# d#ZMG d$d% d%ZNG d&d' d'ZOG d(d) d)ZPG d*d+ d+ZQG d,d- d-ZRG d.d/ d/ZSG d0d1 d1ZTG d2d3 d3ZUG d4d5 d5ZVG d6d7 d7ZWd8d9 ZXd:d; ZYG d<d= d=ZZG d>d? d?Z[dS )Az8
Test functions for multivariate normal distributions.

    N)assert_allcloseassert_almost_equalassert_array_almost_equalassert_equalassert_array_lessassert_)raises   )check_distribution_rvs)_PSD_lnB_cho_inv_batchmultivariate_normal_frozen)multivariate_normalmultivariate_hypergeommatrix_normalspecial_ortho_grouportho_grouprandom_correlationunitary_group	dirichletbetawishartmultinomial
invwishartchi2invgammanormuniformks_2sampkstestbinom	hypergeommultivariate_tcauchy
normaltestrandom_tableuniform_directionvonmises_fisherdirichlet_multinomialvonmises)_covariance
Covariance)stats)rombqmc_quadtplquad)multigammaln)Version)check_random_state_property)_qsimvtv)patchc                 O   s@   t | t | } }t| |g|R i | t| j|j d S N)npasarrayr   r   shape)resrefargskwargs r>   W/var/www/sunrise/env/lib/python3.9/site-packages/scipy/stats/tests/test_multivariate.pyassert_close-   s    r@   c                   @   s  e Zd Zdd Zejejjejjejj	dd dZ
eee
Zeg dg dg dg d	geg d
g dg dg dgdZeedd eg d edd dZejdedd dd Zejdeeejdedd Zejdde ddgejdeeejdedd Zejde dgejdedd Zd d! Zejd"d#d$ Zd%d& ZdS )'TestCovariancec                 C   s  d}t jt|d  ttd W d    n1 s80    Y  d}t jt|d* tjtdtdd W d    n1 s0    Y  d}t jt|d td W d    n1 s0    Y  d	}t jt|d  t	td W d    n1 s0    Y  d
}t jt|d$ t
dtdf W d    n1 sL0    Y  d}t jt|d$ t
tddf W d    n1 s0    Y  d}t jt|d( t
g dtdf W d    n1 s0    Y  d S )Nz:The input `precision` must be a square, two-dimensional...match   z0`precision.shape` must equal `covariance.shape`.   )
covariancez7The input `diagonal` must be a one-dimensional array...Zalpacaz9The input `cholesky` must be a square, two-dimensional...z4The input `eigenvalues` must be a one-dimensional...z,The input `eigenvectors` must be a square...z9The shapes of `eigenvalues` and `eigenvectors` must be...r	   rD   rE   )pytestr   
ValueErrorr+   CovViaPrecisionr7   oneseyeZCovViaDiagonalZCovViaCholeskyZCovViaEigendecompositionselfmessager>   r>   r?   test_input_validation5   s*    .8(044z$TestCovariance.test_input_validationc                 C   s   t | ddS )NTallow_singular)r   xr>   r>   r?   <lambda>W   s    zTestCovariance.<lambda>)ZDiagonalZ	PrecisionZCholeskyZEigendecompositionZPSDrG   )   r	   rE   )r	         )rE   rX      )r	   r   rE   )rV   r   )rZ   rV   r   r   r   r   )diagonal full rankzgeneral full rankzdiagonal singularzgeneral singularr	   N)r   rZ   r]   cov_type_namerZ   c           	      C   s   t g d}g d}ttd| }| j| }ttd|  }|||}|||}t|t|kspJ t|	||	| d S )NrG   )rD   rV   CovViafrom_)
r7   diaggetattrr+   _covariance_preprocessingr,   lowertyper   whiten)	rN   r^   ArT   cov_typepreprocessingfactoryr:   r;   r>   r>   r?   test_factoriesc   s    
zTestCovariance.test_factoriesmatrix_typec                 C   s  d| d| d}|| j | vr*t| | j| }ttd| }| j| }t|dd}|||}t|j	|j	 t
|j|j t
|jt|j t|jt| tjd}	|	jdd}
||
}|
|j }t|| ||  t|d	rd
|vrt|||
 |	jdd}
||
}|
|j }t|d jdd|d jdd t|d	rtd
|vrtt|||
 t|d	r|tt|}t|j| | d S )Nr`    does not support 	 matricesTrQ      VGiVK rE   sizeZ	_colorizesingularrD   rX   rE   rD   rZ   axis)
_cov_typesrH   skip	_matricesrc   r+   rd   r   r@   log_pdetr   rankr9   r7   r8   rF   randomdefault_rngrg   UhasattrZcolorizesumrL   lenT)rN   rm   r^   rO   rh   ri   rj   psd
cov_objectrngrT   r:   r;   r>   r>   r?   test_covarianceq   s8    






"zTestCovariance.test_covariancerr   rt   c                 C   s  d| d| d}|| j | vr*t| | j| }ttd| }| j| }g d}|||}	t}
t||dd}t||	dd}tj	
d}|j|||d}tj	
d}|
j||	||d	}tj	
d}|
||	|d
j|d}t|	tjrt|t| t|t| n&t|j|j t|j|j t|| t|
|||	|| t|||| t|
|||	|| t|||| t|
||	|  t| |  d S )Nr`   rn   ro   皙?皙?333333?TrQ   rp   rq   rr   random_stateseed)rw   rH   rx   ry   rc   r+   rd   r   r7   r|   r}   rvs
isinstanceZ	CovViaPSDr@   squeezer   r9   pdflogpdfentropy)rN   rr   rm   r^   rO   rh   ri   rj   meanr   mvndist0dist1r   rT   x1x2r>   r>   r?   test_mvn_with_covariance   s:    



z'TestCovariance.test_mvn_with_covariancec                 C   s   d}| j | }ttd| }| j| }g d}|||}t}	t||dd}
t||dd}tjd}|j|||d}t|		||||
	| t|	||
	| t|	
||||

| t|
||

| d S )Nr\   r`   r   TrQ   rp   rq   )ry   rc   r+   rd   r   r7   r|   r}   r@   cdflogcdf)rN   rr   r^   rm   rh   ri   rj   r   r   r   r   r   r   rT   r>   r>   r?   test_mvn_with_covariance_cdf   s    

z+TestCovariance.test_mvn_with_covariance_cdfc                 C   s<   d}t jt|d t  W d    n1 s.0    Y  d S )Nz7The `Covariance` class cannot be instantiated directly.rB   )rH   r   NotImplementedErrorr,   rM   r>   r>   r?   test_covariance_instantiation   s    z,TestCovariance.test_covariance_instantiationzignore::RuntimeWarningc                 C   s   t g d}|jd }t |}tjtdd t||  W d    n1 sT0    Y  d}t j	
|}t j	
|}tt j|}t||}|j|d}	tj|||d}
t|	|
 d S )N)r	   rD   g:0yEr   zThe input matrix must be...rB   l   .ypGw r   )r7   rb   r9   zerosrH   r   rI   r   r   r|   r}   r,   from_eigendecompositionlinalgeighr   )rN   rh   nr   r   Zrng1Zrng2covrvr:   r;   r>   r>   r?   test_gh9942   s    

,
zTestCovariance.test_gh9942c                 C   s   t d}tt dt df}tjj||d}|j	d d}t
|| tjjt ddgt ddgddggf}tjj||d}|j	d d}|d |d ksJ |d |d ksJ d S )	NrD   r   r   rq         ?        g      y@r   r	   )r7   rK   r,   r   r   rL   scipyr-   r   r   r   array)rN   r   r   distr   r>   r>   r?   test_gh19197   s    

"zTestCovariance.test_gh19197)__name__
__module____qualname__rP   r7   rb   r   invcholeskyr   rd   r   listZ_all_covariance_typesry   rw   rH   markparametrizerl   r   tupler   r   r   filterwarningsr   r   r>   r>   r>   r?   rA   3   sD   



/%

rA   Fc           	      C   s\   | | | f}||j }tj|\}}|rD|j| ddk}d||< |t| |j }|S )Nrq   r   )r|   r   r7   r   r   normalrb   )	dimZevalsr   rs   rh   _vZ	zero_eigsr   r>   r>   r?   _random_covariance  s    
r   c                 C   s$   t j| | }tj|\}}}|S r6   )r7   r|   randnr   r   svd)r   Musr   r>   r>   r?   _sample_orthonormal_matrix!  s    r   c                   @   s  e 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 Z
dd Zdd Zdd Zdd Zdd Zdd Zejdededdggd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Z d2d3 Z!d4d5 Z"d6d7 Z#d8d9 Z$d:d; Z%d<d= Z&d>d? Z'd@S )ATestMultivariateNormalc                 C   s`   t d}t d}tttjd|| tttjd|| tttjd|| tttjd|| d S )NrE   rD   r   r	   r   r	   rD   )r7   arangeidentityassert_raisesrI   r   r   r   )rN   mur   r>   r>   r?   test_input_shape(  s    

z'TestMultivariateNormal.test_input_shapec                 C   s   t jd d\}}}t|||}t|jd t jd}t jd}t t jd}t|||}t|jd d\}}}t	|||}t|jd t jd}t jd}t t jd}t	|||}t|jd d S )N  )      ?g333333?      @r   rV   )
r7   r|   r   r   r   r   ndimr   absr   )rN   rT   r   r   r   r   r>   r>   r?   test_scalar_values0  s"    

z)TestMultivariateNormal.test_scalar_valuesc                 C   sf   t jd t jd}t jd}t t jd}t|||}t|||}t|t 	| d S Nr   rV   )
r7   r|   r   r   r   r   r   r   r   logrN   rT   r   r   d1d2r>   r>   r?   test_logpdfK  s    z"TestMultivariateNormal.test_logpdfc                 C   sl   t jd t jd}t|}t|}t|d d}t|d d}t|t | t|t | d S Nr   rV   r	   )	r7   r|   r   r   r   r   r   r   r   rN   rT   r   r   Zd3Zd4r>   r>   r?   test_logpdf_default_valuesU  s    

z1TestMultivariateNormal.test_logpdf_default_valuesc                 C   sf   t jd t jd}t jd}t t jd}t|||}t|||}t|t 	| d S r   )
r7   r|   r   r   r   r   r   r   r   r   r   r>   r>   r?   test_logcdfb  s    z"TestMultivariateNormal.test_logcdfc                 C   sl   t jd t jd}t|}t|}t|d d}t|d d}t|t | t|t | d S r   )	r7   r|   r   r   r   r   r   r   r   r   r>   r>   r?   test_logcdf_default_valuesl  s    

z1TestMultivariateNormal.test_logcdf_default_valuesc                 C   sl   t jd d}t j|}td|d D ]<}t j||}t ||j}t||dd}t|j	j
| q*d S )Nr   rX   r	   TrQ   )r7   r|   r   r   rangedotr   r   r   r   r{   )rN   r   r   Zexpected_rankr   r   Zdistnr>   r>   r?   	test_ranky  s    z TestMultivariateNormal.test_rankc              	   C   s  t ddD ]}tj|}t d|D ]}tj||}t||j}t||f}||d |d |f< t|}|d | |d |< t|}t|t||j}	t||}
tt||dd}tt||dd}tt||	dd}t	|j
j| t	|j
j| t	|j
j| ||d | }||}||
}t|| t|| ||d | }||}||
}t|| t|| |
|d d df  }||}||}t	|d t	|tj  q&q
d S )Nr	   rV   TrQ   rZ   r   )r   r7   r|   r   r   r   r   r   r   r   r   r{   r   r   r   inf)rN   r   zkr   Zcov_kkZcov_nnrT   r   Zcov_rryZdistn_kkZdistn_nnZdistn_rrZpdf_kkZpdf_nnZpdf_rrZ	logpdf_kkZ	logpdf_nnZ	logpdf_rrZy_orthZpdf_rr_orthZlogpdf_rr_orthr>   r>   r?   test_degenerate_distributions  sN    











z4TestMultivariateNormal.test_degenerate_distributionsc           
      C   s   d}t ddD ]}t d|D ]}t|}t|d d d |f }t||j}tj|||d}tj|||dd}t	|j
| t|dksJ tj|||dd}	t	|	j
| t|	tj ksJ qqd S )	N
   rD   rW   r	   r   r   rr   T)r   r   rR   r   )r   r7   r   r   r   r   r   r   r   r   rr   allr   r   )
rN   r   r   rmnr   ZvrXr   r   r>   r>   r?   test_degenerate_array  s"    


z,TestMultivariateNormal.test_degenerate_arrayc                 C   s   d}d}d}t || }|| }t j||ftd}t || d|| d | d f< ttj|d ttj|d |d |f t j	 t
t j|d |d |f d|f t|}t
|j| d S )Ng     @@d   rD   Zdtyper   r	   )r7   expr   floatZfill_diagonalr   r   r   detr   r   slogdetr   rz   )rN   Zlarge_total_logZnposZnzeroZlarge_entryr   r   r   r>   r>   r?   test_large_pseudo_determinant  s    $z4TestMultivariateNormal.test_large_pseudo_determinantc                 C   s   t jd d}t j||}t ||j}t j|}t jdd|}t|||}t|||}t	dD ]f}t	dD ]X}	t|||	f ||}
t
|
|||	f  t|||	f ||}
t
|
|||	f dd qxqld S )Nr   rX   rD   rE   MbP?rtol)r7   r|   r   r   r   r   r   r   r   r   r   )rN   r   datar   r   r   Zdesired_pdfZdesired_cdfijactualr>   r>   r?   test_broadcasting  s    z(TestMultivariateNormal.test_broadcastingc                 C   sn   t ddd}d\}}|d }t|||}t|||}t|| t|||}t|||}t|| d S )Nr   rD   r   )333333??      ?)r7   linspacer   r   r   r   r   )rN   rT   r   r   scaler   r   r>   r>   r?   test_normal_1D  s    
z%TestMultivariateNormal.test_normal_1Dc                 C   s  t ddg}t ddgddgg}d}d|d  }t d	d|}t ||\}}t ||d
f}||d d d d d	f< ||d d d d df< t|||}	t|	|d	d}
t|	|dd}tj||d	 |d d d}tj||d |d d d}t	|
|ddd t	||ddd d S )Nr   g      @r   r   333333?i  rW   r	   r   rD   ru   r   r   )locr  )r	   r	   {Gz?r   atol)
r7   r   r   Zmeshgridemptyr   r   r.   r   r   )rN   r   r   r   deltar   ZxvZyvposr   Zmargin_xZmargin_yZgauss_xZgauss_yr>   r>   r?   test_marginalization  s     z+TestMultivariateNormal.test_marginalizationc                 C   s   t jd t jd}t jd}t t jd}t||}t||t||| t||t||| t|	|t	||| t|
|t
||| d S r   )r7   r|   r   r   r   r   r   r   r   r   r   )rN   rT   r   r   norm_frozenr>   r>   r?   test_frozen%  s    


z"TestMultivariateNormal.test_frozenrF   rD   r	   c                 C   sF   t d}t d}t||}t |j|s0J t |j|sBJ d S )NrD   rD   )r7   rK   rL   r   Zallcloser   r   )rN   rF   r   Zcov_should_ber  r>   r>   r?   2test_frozen_multivariate_normal_exposes_attributes3  s
    


zITestMultivariateNormal.test_frozen_multivariate_normal_exposes_attributesc           	   	   C   s   t jd d}t j||}t ||j}tj|\}}t 	|d}d|d< d|d< t |t t 
||j}d}t||d	}t|j|d	}t|jt t |d d  t|j |j d S )
Nr   rY   r   r   r   Hz>rZ   h㈵>)cond)r7   r|   r   r   r   r   r   r   r   fullrb   r   Zpinvr   rz   r   r   )	rN   r   rT   r   r   r   r  r   Zpsd_pinvr>   r>   r?   test_pseudodet_pinvA  s     z*TestMultivariateNormal.test_pseudodet_pinvc                 C   s    g dg dg}t tt| d S )NrG   rX   rV   rW   r   rI   r   rN   r   r>   r>   r?   test_exception_nonsquare_cov[  s    z3TestMultivariateNormal.test_exception_nonsquare_covc                 C   s@   ddgdt jgg}ttt| ddgdt jgg}ttt| d S )Nr	   r   )r7   nanr   rI   r   r   )rN   Zcov_nanZcov_infr>   r>   r?   test_exception_nonfinite_cov_  s    z3TestMultivariateNormal.test_exception_nonfinite_covc                 C   s    ddgddgg}t tt| d S )Nr	   r   rZ   r  r  r>   r>   r?   test_exception_non_psd_cove  s    z1TestMultivariateNormal.test_exception_non_psd_covc                 C   s   t jd t jd}t jd}t d}t jj}t|t|| t|tj	||| t|tj
||| t|tj||| t|tj||| ddgddgg}d}tjt jj|d t|d W d    n1 s0    Y  d S )	Nr   rV   )rV   rV   r   r   z0When `allow_singular is False`, the input matrixrB   r   )r7   r|   r   r   rK   r   LinAlgErrorr   r   r   r   r   r   rH   r   )rN   rT   r   r   emsgr>   r>   r?   test_exception_singular_covi  s    
z2TestMultivariateNormal.test_exception_singular_covc                 C   s"  t g d}t ddd}d| d }|t | }t |||gj}t g dd}t g dg d	g d
gd}t|||}t||dd t g d}	t|||}
t|
|	dd t g d}t ||gj}t ddgd}t ddgddggd}t|||}t||dd d S )N)g0Q-?gox'V?g[S, t?gDB?gc_.?r   rD   rV   rE   )r	   rE   rD   dr	   rD   r   )rD   rV   r   )r   r   rE   绽|=r  )gwk:E]?g̙Z?g0?gL8?gAG*?gh㈵>)gIى?gG?gƏ)?gėh?gEE?r	   r  )	r7   r   r   cosr   r   r   r   r   )rN   Zr_pdfrT   r   r   r   r   r   r   Zr_cdfr   Zr_cdf2Zr2mean2cov2cdf2r>   r>   r?   test_R_values|  s$    z$TestMultivariateNormal.test_R_valuesc                 C   s<   t d}t d}t||dd}| }t|ddg d S )NrD   rD   rD   TrQ   r   )r7   r   r   r   r   )rN   r   rF   modelsampler>   r>   r?   ,test_multivariate_normal_rvs_zero_covariance  s
    

zCTestMultivariateNormal.test_multivariate_normal_rvs_zero_covariancec                 C   s   d}d}t jt|d|d}t|j||f t jd tddgddgg|d}t|j|df t ddd}||}t|j|f d S )	Ni,  rX   r	   r   rD   r   r   r   )r   r   r7   r   r   r9   r   )rN   Nr"  r-  r   r>   r>   r?   test_rvs_shape  s    
z%TestMultivariateNormal.test_rvs_shapec                 C   sx   t jd d}t j|}t j||}t ||j}d}t|||}tt	
|j|dd t|d|dd d S )N  rE     r   r   r   )r7   r|   r   r   r   r   r   r   r   numpyr   r   )rN   r   r   r   r   rr   r-  r>   r>   r?   test_large_sample  s    z(TestMultivariateNormal.test_large_samplec                 C   s   t jd d}t j|}t j||}t ||j}t||}t| t|| t j	
|d }d|t dt j d  t t |  }t||  d S )Nr1  rE   r   r   rD   r	   )r7   r|   r   r   r   r   r   r   r   r   Zeigr   pir   )rN   r   r   r   r   r   eigsdesiredr>   r>   r?   test_entropy  s    
,z#TestMultivariateNormal.test_entropyc                 C   s*   t g d}d}tt t|| d S )Nr	   r	   r	   r   )r7   r   r   r   r   )rN   alphar7  r>   r>   r?   test_lnB  s    zTestMultivariateNormal.test_lnBc                 C   s   t jd}ddg}t d}|dd d }|dd d }tj||||d}t|||}t|||}t j|ddd	f |dd	df fd
d}	t j|dd	df |ddd	f fd
d}
t|	||}t|
||}|| | | }t|| d S )N   FYc@Y r   rD   )rX   rE   rD   rW   rE   lower_limit.r	   rZ   ru   )r7   r|   r}   rL   r   r   concatenater   )rN   r   r   r   abcdf1Zcdf2aZcdf2bZab1Zab2Zcdf2ab1Zcdf2ab2r)  r>   r>   r?    test_cdf_with_lower_limit_arrays  s    
**z7TestMultivariateNormal.test_cdf_with_lower_limit_arraysc           
      C   s   t jd}|d}|d}||j }|dd d }|dd d }tj||||d}t||j||d}t tj||||d}t t||j||d}	t||dd t||dd t|	|dd d S )	Nr<  rE   rE   rE   rD   rE   rW   r=  -C6?r   )	r7   r|   r}   r   r   r   r   r   r   )
rN   r   r   r   r@  rA  rB  r)  Zcdf3Zcdf4r>   r>   r?   %test_cdf_with_lower_limit_consistency  s    


z<TestMultivariateNormal.test_cdf_with_lower_limit_consistencyc                 C   s   t d}t d}g dg dg dg dg}g dg dg dg dg}t g d}tj||||d}t||d |  d S )	NrE   r9  r[   r	   r   r	   r   r	   r   r	   rZ   rZ   r	   r=  r   r7   r   rL   r   r   r   r   )rN   r   r   rA  r@  expected_signsr   r>   r>   r?   test_cdf_signs#  s    

z%TestMultivariateNormal.test_cdf_signsc                 C   s   t dt g d }t|}d}tjt|d  t	ddg| W d    n1 sZ0    Y  tjt|d tddg| W d    n1 s0    Y  g d}t
|g d|}ttj
||d| t
|g d	|}ttj
|d|d| d S )
Nr	   rG   z7`cov` represents a covariance matrix in 3 dimensions...rB   r   )r   r   r   r[   r  r9  )r7   rb   r   r+   rJ   rH   r   rI   r   r   r   r   )rN   Pr   rO   rT   r;   r>   r>   r?   test_mean_cov.  s    
.,z$TestMultivariateNormal.test_mean_covN)(r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  rH   r   r   r7   rL   r,   Zfrom_diagonalr  r  r  r  r  r!  r*  r.  r0  r4  r8  r;  rC  rG  rM  rO  r>   r>   r>   r?   r   '  sH   

4
@r   c                   @   sL   e 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 Z
dS )TestMatrixNormalc              	   C   s<  d}d}t ||fd}dt | t ||fd }dt | t ||fd }tttt d ttt|t d| ttt||t d ttt||| ttt||| ttt|j|| t jj	}t|tj
||t ||f t|tj
|t ||f| t|t||t ||f t|t|t ||f| d S )NrX   rE   r   r   ffffff?)rV   rX   rE   r   )r7   r  r   r   rI   r   r   r   r   r  r   rK   )rN   num_rowsnum_colsr   r~   Vr  r>   r>   r?   test_bad_inputD  s(    zTestMatrixNormal.test_bad_inputc                 C   s  d}d}t ||fd}dt | t ||fd }dt | t ||fd }t ||f}t |df}t d|f}t |}	t |}
t d}ttj|||dj||f ttj|dj||f ttj|d	j|df ttj|d
jd|f ttj||dj||f ttj||dj||f ttj||dj||f tt|dj|	 tt|dj	|
 tt|d	j
| tt|d	j	| tt|d
j
| tt|d
j| tt||dj	|
 tt||dj|	 tt||dj
| d S )NrX   rE   r   r   rQ  r	   r   rowcovcolcov)r   )rW  )rX  )r   rX  )r   rW  )rW  rX  )r7   r  r   r   r   r   r   r9   rW  rX  r   )rN   rR  rS  r   r~   rT  ZZZrZZcIrIcZI1r>   r>   r?   test_default_inputs^  sR    


z$TestMatrixNormal.test_default_inputsc           
      C   s   d}d}t ||fd}t |d}d}t |d}d}t |}t |}	tt|||djd|  tt|||djd|	  tt|||djd|  tt|||djd|	  d S )NrX   rE   r   r   r   rV  )r7   r  r   r   r   rW  rX  )
rN   rR  rS  r   ZUvZUsZVvZVsrZ  r[  r>   r>   r?   test_covariance_expansion  s*    

z*TestMatrixNormal.test_covariance_expansionc                 C   s   t ddD ]}t ddD ]}t||fd}dt| t||fd }dt| t||fd }t|||d}|jdd}tj|||dd	}t|| |jdd}	||	}
tj|	|||d}t|
| ||	}tj|	|||d}t|| qq
d S )
Nr	   rV   r   r   rQ  rV  r   r   )r   rW  rX  r   )	r   r7   r  r   r   r   r   r   r   )rN   r   r   r   r~   rT  frozenrvs1rvs2r   pdf1pdf2logpdf1logpdf2r>   r>   r?   test_frozen_matrix_normal  s$    




z*TestMatrixNormal.test_frozen_matrix_normalc                 C   s  t ddD ]
}t ddD ]}t||fd}dt| t||fd }dt| t||fd }t|||d}|jdd}||}||}	| }
|j	
 }|j	
 }t||}tj|||d	}tj|||d	}tj||d	}t||d
d t|	|d
d t|
| qq
d S )Nr	   rV   r   r   rQ  rV  r   r   r   r$  r   )r   r7   r  r   r   r   r   r   r   r   flattenZkronr   r   )rN   r   r   r   r~   rT  r^  r   ra  rc  Zentropy1ZvecXZvecMr   rb  rd  Zentropy2r>   r>   r?   test_matches_multivariate  s&    



z*TestMatrixNormal.test_matches_multivariatec                 C   sF  d}d}t ||fd}dt | t ||fd }dt | t ||fd }d}t|||d}|j|dd	}|j|d
d	}	t j|t jd d d d d d f |	t jd d d d d d f fdd}
t|
jd|||f |	|
}t|jd|f t
dD ]B}t
|D ]4}tj	|
||f |||d}t||||f d q
qd S )NrX   rE   r   r   rQ  r   rV  r   r   i  r   ru   rD   r$  )r7   r  r   r   r   r?  newaxisr   r9   r   r   r   )rN   rR  rS  r   r~   rT  r/  r^  ZX1ZX2r   Zarray_logpdfr   r   Zseparate_logpdfr>   r>   r?   test_array_input  s&    F
z!TestMatrixNormal.test_array_inputc                 C   s   d}d}t ||fd}dt | t ||fd }dt | t ||fd }d}t|||d}|j|dd	}t j|d
d}	t|	|dd t ||| |j	}
t|
|dd t t 
|dd|| |j	}t||dd d S )NrX   rE   r   r   rQ    rV  r   r   r   ru   r   r%  r	   rD   )r7   r  r   r   r   r   r   r   reshaper   Zswapaxes)rN   rR  rS  r   r~   rT  r/  r^  r   Zsample_meanZsample_colcovZsample_rowcovr>   r>   r?   test_moments  s     zTestMatrixNormal.test_momentsc                 C   s   t jtddgddggtddgddggtddgddggtjddd	}td
dgddggddgddggg}t|| d S )Nr	   rD   rE   rX   rZ   rV   r   r   )r   rW  rX  r   rr   g6?gǀgcϿ@g"'@gI2͖@g^jy%@gDn3@g|\3@)r   r   r7   r   r|   r}   r   )rN   r   expectedr>   r>   r?   test_samples  s"    
zTestMatrixNormal.test_samplesN)r   r   r   rU  r\  r]  re  rg  ri  rl  rn  r>   r>   r>   r?   rP  B  s   'rP  c                   @   s   e 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 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%d& Zd'S )(TestDirichletc                 C   s   t jd t jdd}t jdd|}t|}t| t| t| t| t|	 t	| d}t
|D ]r}t jdd|}|t | }t||d d t|d d | t||d d t|d d | qzd S Nr1  r	       &.>r   r   rZ   )r7   r|   r   randintr   r   r   varr   r   r   r   r   r   rN   r   r:  r"  	num_testsr   rT   r>   r>   r?   test_frozen_dirichlet  s    (z#TestDirichlet.test_frozen_dirichletc                 C   s   t jd t g d}t jj|dd}t|jd tttj	|| tttj
|| t	|j| t	|jd d | t
|j| t
|jd d | d S )Nr1  r          @      @rY   rq   )rY   rE   rZ   )r7   r|   r   r   r   r   r9   r   rI   r   r   r   rN   r:  rT   r>   r>   r?   "test_numpy_rvs_shape_compatibility!  s    z0TestDirichlet.test_numpy_rvs_shape_compatibilityc                 C   sR   t jd g d}t jjt d|ddj}tttj|| tttj	|| d S )Nr1  )r   r   rz  rr  rY   rq   
r7   r|   r   r   maximumr   r   rI   r   r   r{  r>   r>   r?   test_alpha_with_zeros-  s
    z#TestDirichlet.test_alpha_with_zerosc                 C   sR   t jd g d}t jjt d|ddj}tttj|| tttj	|| d S )Nr1  )r   g       rz  rr  rY   rq   r}  r{  r>   r>   r?    test_alpha_with_negative_entries5  s
    z.TestDirichlet.test_alpha_with_negative_entriesc                 C   sp   t g d}t g d}t|| t|| t g d}tt||d tt||t d d S )Nr   ry  rz        @r   r   r   rQ  )r   r   r   r   rW   )r7   r   r   r   r   r   r   r{  r>   r>   r?   test_data_with_zeros=  s    z"TestDirichlet.test_data_with_zerosc                 C   s@   t g d}t g d}tttj|| tttj|| d S )N)r   r   rz  r  r  r7   r   r   rI   r   r   r   r{  r>   r>   r?   $test_data_with_zeros_and_small_alphaF  s    z2TestDirichlet.test_data_with_zeros_and_small_alphac                 C   s@   t g d}t g d}tttj|| tttj|| d S )Nr  )r   皙r   rQ  r  r{  r>   r>   r?   test_data_with_negative_entriesL  s    z-TestDirichlet.test_data_with_negative_entriesc                 C   s@   t g d}t g d}tttj|| tttj|| d S )Nr  )r   皙?r   rQ  r  r{  r>   r>   r?    test_data_with_too_large_entriesR  s    z.TestDirichlet.test_data_with_too_large_entriesc                 C   s>   t g d}t dd}tttj|| tttj|| d S )Nrx  )rD   rY   rY   g$I$I?r7   r   r  r   rI   r   r   r   r{  r>   r>   r?   test_data_too_deep_cX  s    z"TestDirichlet.test_data_too_deep_cc                 C   sF   t ddgddgg}t dd}tttj|| tttj|| d S )Nr   ry  rz  r  )rD   rD   rY         ?r  r{  r>   r>   r?   test_alpha_too_deep^  s    z!TestDirichlet.test_alpha_too_deepc                 C   s6   t g d}t dd}t|| t|| d S )Nrx  rE   rY   UUUUUU?)r7   r   r  r   r   r   r{  r>   r>   r?   test_alpha_correct_depthd  s    z&TestDirichlet.test_alpha_correct_depthc                 C   s>   t g d}t dd}tttj|| tttj|| d S )Nrx  r  r   r  r{  r>   r>   r?   test_non_simplex_dataj  s    z#TestDirichlet.test_non_simplex_datac                 C   s>   t g d}t dd}tttj|| tttj|| d S )Nr  )rD   rY   r   r  r{  r>   r>   r?   test_data_vector_too_shortp  s    z(TestDirichlet.test_data_vector_too_shortc                 C   s>   t g d}t dd}tttj|| tttj|| d S )Nr  )rV   rY   r   r  r{  r>   r>   r?   test_data_vector_too_longv  s    z'TestDirichlet.test_data_vector_too_longc                 C   sF   t g d}t|}g d}g d}t| | t| | d S )N)r   皙?r   )gUUUUUU?g{Gz?gQ?r   皙?r   )r7   r   r   r   rt  r   )rN   r:  r"  Zexpected_varZexpected_meanr>   r>   r?   test_mean_and_var|  s    zTestDirichlet.test_mean_and_varc                 C   s`   t dg}t|}t| jd t| jd t|dgjd t|dgjd d S )Nr   r   r   )	r7   r   r   r   r   r   rt  r   r   )rN   r:  r"  r>   r>   r?   r     s    z TestDirichlet.test_scalar_valuesc                 C   s   t jd t jdd}t jdd|}t|}d}t|D ]@}t jdd|}|t | }t|	|d d |	| q>d S rp  )
r7   r|   r   rs  r   r   r   r   r   r   ru  r>   r>   r?    test_K_and_K_minus_1_calls_equal  s    z.TestDirichlet.test_K_and_K_minus_1_calls_equalc                 C   s   t jd t jdd}t jdd|}t|}d}d}d }t|D ]}t|D ]>}t jdd|}	|	t |	 }	|d urt ||	f}qR|	}qR|	|j
}
d }|D ](}|	|}|d urt ||}q|}qt|
| qFd S )Nr1  r	   rq  rr  r   r   rV   )r7   r|   r   rs  r   r   r   r   vstackr   r   appendr   )rN   r   r:  r"  rv  Znum_multipleZxmr   mrT   Zrmrsxsr   r>   r>   r?   test_multiple_entry_calls  s,    
z'TestDirichlet.test_multiple_entry_callsc                 C   s   t jd t jddd}t|}t|d |d }d}t|D ]:}t jddd}|t | }t|	||	|g qBt|
 |
 d  t| | d  d S )Nr1  rr  r   rD   r   r	   r   )r7   r|   r   r   r   r   r   r   r   r   r   rt  )rN   r:  r"  rA  rv  r   rT   r>   r>   r?   test_2D_dirichlet_is_beta  s    z'TestDirichlet.test_2D_dirichlet_is_betaN)r   r   r   rw  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r>   r>   r>   r?   ro    s&   	
ro  c               
   C   s   t ddg} t dgg}ttt| | zt| | W nB tyz } z*d}tt|d t| | W Y d }~n
d }~0 0 d S )Nr   r   zDimension mismatch)r7   r   r   rI   r   r   strr   )r   sigmar  r   r>   r>   r?   ,test_multivariate_normal_dimensions_mismatch  s    r  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestWishartc                 C   s  t jddd}ddgt dt jd t jdddg}|D ]*}td|}t|j| t|jj|j q8t ddgddgg}ddgt jd t ddgddggg}|D ]*}td|}t|j| t|jj|j qtttdt 	d tdt 	d t jddd}tttd| d S )Nr	   rD   Zndminr   r	   rD   r  rE   )
r7   r   r_r   r   r  r9   r   rI   rL   )rN   Z
true_scaleZscalesr  wr>   r>   r?   test_scale_dimensions  s8    



z!TestWishart.test_scale_dimensionsc              
   C   s  ddgt dt jd t jdddt jdgddg}tdd}|t jddd}|D ]}t||| qVg dt jd t jg dddg}tdd}|t jg ddd}|D ]}t||| qdddgt dt jd t ddgddggt ddgddggd d d d t jf g}tdt d}|t ddgddggd d d d t jf }|D ]}t||| qfd S )Nr	   rD   r  rE   rG   r+  r   )r7   r   r  r   r   r   rh  rL   )rN   r   r  ZdensityrT   r>   r>   r?   test_quantile_dimensions  sP    	



z$TestWishart.test_quantile_dimensionsc           	      C   sn  d}t t |d }t ||d  d |t j|dd< t |j|}g }tdD ]\}t t ||d d  }t ||d  d |t j|dd< t |j|}|| qVt |j}ddt 	dddfd||fg}|D ]\}}}t
||}t| t
|| t| t
|| t| t
|| t| t
|| t||t
||| qd S 	NrX   r	   rD   rZ   r   rV   r   r   )r7   rb   r   tril_indicesr   r   r   r  r   r   r   r   rt  r   moder   r   )	rN   r   r  r   r   rT   
parametersdfr  r>   r>   r?   r  >  s*    $$
zTestWishart.test_frozenc                 C   s   t jd d}d}t |}t jdddtd}t jdddd}|D ]}t||}t|}t	|
 |
  t	| |  t	| |  t	|||| |j|d	}	|f}
d
}td|
||	 qDd S )N^   r	   r   rD   r   r   numrq   r  r   )r7   r|   r   rL   r   r   r   r   r   r   rt  r   r   r   r   r
   )rN   snr   r  df_ranger   r  r  cr   r<   r:  r>   r>   r?   test_1D_is_chisquared^  s"    

z!TestWishart.test_1D_is_chisquaredc                 C   s  t jd d}d}d}t t dd }t d|t jddd< t |j|}t |df}|j||	 }t
||}t||d	}t| |  t| |  t| |  t jd
ddd}	t||	||	 |j|d}
|d|f}d}td|||
 d S )Nr  r  r   rX   r	   rW   rZ   r  r  r   r  rq   r   r  r   )r7   r|   r   rb   r   r  r   r   rK   r   r   r   r   rt  r   r   r   r   r   r
   )rN   r  r  r   r  ZlamdaZsigma_lamdar  r  r   r   r<   r:  r>   r>   r?   test_is_scaled_chisquared}  s(    

z%TestWishart.test_is_scaled_chisquaredN)r   r   r   r  r  r  r  r  r>   r>   r>   r?   r    s
   +1 r  c                   @   s   e Zd Zdd Zdd Zdd Zejddd	gd
d Z	dd Z
dd Zejdddgdd Zdd Zejdddgdd Zdd Zejdddgdd Zdd Zdd Zd d! Zd"S )#TestMultinomialc                 C   s   t ddd}t|ddd t ddgd	d
dg}|tj ksBJ t d	d	gd	d
dg}|d	ksdJ t ddgd	ddg}t|tjdd d S )NrE   rX   rY   r   rQ  g&Mty:0yE>r   rE   rX   r   r   rQ  r]   )r   logpmfr   r7   r   r  )rN   vals1vals2vals3vals4r>   r>   r?   test_logpmf  s    zTestMultinomial.test_logpmfc                 C   sX   t ddd}tddd}t||dd t dd	d
}tdd	d}t||dd d S )Nr  rY   r  rE   r   r  r   )rW         r   r   rW   r   )r   r  r!   r   pmfrN   val1val2r>   r>   r?   test_reduces_binomial  s    z%TestMultinomial.test_reduces_binomialc                 C   sR   dg d }}ddddddd	dd
dd
}|D ] }t t||||| dd q,d S )NrE   )g      ?r  g      ?g     @?g     ?g      ?g      `?g     ?g      ?g      ?g      ?g      ?)
)r   r   rE   )r	   r   rD   )rD   r   r	   )rE   r   r   r   r9  rD   r	   r   )r   rD   r	   r#  )r   rE   r   +=r%  )r   r   r  )rN   r   pZr_valsrT   r>   r>   r?   test_R  s    zTestMultinomial.test_Rr   r   rE   c                 C   sH   t j|dgd ddd}tjd}|j |dgd dd}t|| d S )Nr  rE   rY   {   r   rq   )r   r   r7   r|   RandomStater   )rN   r   Zsc_rvsrndmZnp_rvsr>   r>   r?   test_rvs_np  s    zTestMultinomial.test_rvs_npc           	      C   s@  t ddd}t|ddd t ddd	}t|d
dd t ddgddggddgddgggdd}t|ddgddggdd tjdtjd}t |dd	}t|tjg tjd t ddgdd	}t|ddd t g ddg d}t|ddd t g ddg d}|dksJ t g ddg d}|dks<J d S )N)rV   rV   r	   r	   r  r   r  rY   r  g5
?rE   r   r  rZ   	   r  g*7?g<Wƌ?r   rD   r   rX   rD   rE   rE   r   rW   )gUUUUUU?r  r   gߦ?r[   r  )r   r  r   r7   r	  float64r   )	rN   vals0r  r  rT   r  r  Zvals5Zvals6r>   r>   r?   test_pmf  s&    $zTestMultinomial.test_pmfc                 C   s
  t ddgdddgddgg}t|dd	gd
d t ddgddgddg}t|ddgd
d t ddgddgggdddg}t|ddggd
d t ddgdgdgggddg}t|dgdgggd
d t ddgddggdggggddg}t|ddggggd
d d S )Nr	   rD   rE   r   r   r   r  gv?g~jt?r  r   rX   r   )r   r  r   )rN   r  r  r  r  r  r>   r>   r?   test_pmf_broadcasting  s      &z%TestMultinomial.test_pmf_broadcastingrV   c                 C   s   t |d}|d d | d d | d d g| d d |d d | d d g| d d | d d |d d gg}t||dd d S )	N)r   r   r   r   r  r   r   rQ  r  r   r   r   r   )rN   r   cov1r(  r>   r>   r?   test_cov  s    $$$zTestMultinomial.test_covc                 C   s   t dddgddgg}ddgddggddgddggg}t||d	d
 t ddgddg}ddgddggddgddggg}t||d	d
 t ddgddgddgg}ddgddggddgddggg}t||d	d
 d S )NrV   r   r   r   r  g?gܿgr  r   rX   g
ףp=
?g
ףp=
׿r   rQ  r  r  gzG?gzGr   g333333r  rN   r  r(  cov3cov4cov5cov6r>   r>   r?   test_cov_broadcasting  s      z%TestMultinomial.test_cov_broadcastingrD   c                 C   s*   t |ddg}t|t|ddd d S Nr   r  r  r   r   r   r   r!   )rN   r   ent0r>   r>   r?   r8    s    zTestMultinomial.test_entropyc                 C   s   t ddgddg}t|tddtddgdd t ddgdd	gd
dgg}t|tddtdd
gdd t dgdggdd	gd
dgg}t|tddtdd
gtddtdd
ggdd d S )NrD   rE   r   r   r  r   rY   r  rQ  r  r  r  )rN   r  Zent1Zent2r>   r>   r?   test_entropy_broadcasting  s     z)TestMultinomial.test_entropy_broadcastingc                 C   s.   t |ddg}t||d |d gdd d S r  r   r   r   )rN   r   mean1r>   r>   r?   	test_mean)  s    zTestMultinomial.test_meanc                 C   s2   t ddgddg}t|ddgddggd	d
 d S )NrV   rW   r   r  r   r  g433333?g433333@r  r   r  )rN   r  r>   r>   r?   test_mean_broadcasting.  s    z&TestMultinomial.test_mean_broadcastingc                 C   s   t jd d}d}g dg dg dg dg dg}t j|t jd	}t||}t||t||| t||t||| t|	 t	|| d S )
Nr      )r   r   r   r  r   r   r   r  r   r   r	      r   r	   r	   r   r	   r	   r	   r  r	   r	   rD   r  r   )
r7   r|   r   r8   r  r   r   r  r  r   )rN   r   ZpvalsrT   Z	mn_frozenr>   r>   r?   r  2  s    "
zTestMultinomial.test_frozenc                 C   sZ   d}t jd}||}d|d< |t | }t |}t|||}t |sVJ d S )NX   l   iRZY gKH9rZ   )r7   r|   r}   r   rK   r   r  isfinite)rN   r   r   r  rT   r  r>   r>   r?   test_gh_11860>  s    

zTestMultinomial.test_gh_11860N)r   r   r   r  r  r  rH   r   r   r  r  r  r  r  r8  r  r  r  r  r  r>   r>   r>   r?   r    s$   



r  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestInvwishartc           	      C   sX  d}t t |d }t ||d  d |t j|dd< t |j|}g }tdD ]\}t t ||d d  }t ||d  d |t j|dd< t |j|}|| qVt |j}ddt 	dddfd||fg}|D ]p\}}}t
||}t| t
|| t| t
|| t| t
|| t||t
||| qd S r  )r7   rb   r   r  r   r   r   r  r   r   r   r   rt  r   r  r   r   )	rN   r   r  r   r   rT   r  r  iwr>   r>   r?   r  M  s(    $$
zTestInvwishart.test_frozenc                 C   s   t jd d}d}t |}t jdddtd}t jdd	d	d
}|D ]}t||}t|d dd}t	|
 |
  t	| |  t	|||| |j|d}	|d ddf}
d}td|
||	 t	| |  qDd S )Nr  r  r	   rV      rD   r   r   r   r  r   r  rq   r   r  r   )r7   r|   r   rL   r   r   r   r   r   r   rt  r   r   r   r
   r   )rN   r  r   r  r  r   r  r  Zigr   r<   r:  r>   r>   r?   test_1D_is_invgammam  s"    

z"TestInvwishart.test_1D_is_invgammac                 C   s|  d}d}t |}d|d< d|d< t||}t||}t jd t||}t jd | }t jd t||}t jd | }	t jd t jjdd}
t jt j	|t j	|d t j	|d	 f d }t 
|}|
|t j|d
d< t j|}||}t ||j}t jt j|}||}t jt ||j}t|| t|| t|| t|	| d S )NrE   r   r   r   r	   r   i rq   r	   rD   rZ   r  )r7   rL   r   r   r|   r   r   r   r  Z	chisquarerb   r  r   r   r   r   r   r   )rN   r   r  r  r  r  Zw_rvsZfrozen_w_rvsZiw_rvsZfrozen_iw_rvsZcovariancesZ	variancesrh   DZDAZmanual_w_rvsZiDZiDAZmanual_iw_rvsr>   r>   r?   test_wishart_invwishart_2D_rvs  sJ    









z-TestInvwishart.test_wishart_invwishart_2D_rvsc                 C   s   t g dg dg dg dg}t g dg dg dg dg}t ||g}| }t| t d}t|d	 |d	 |d
d t|d |d |d
d dS )Regression test for gh-8844.rD   r	   r   r   r	   rD   r   r   r   r   rE   r	   r   r   r	   rD   )rD   rZ   r   r   )rZ   rD   r   r   )r   r   r	   rX   rX   r   V瞯<r%  r	   N)r7   r   copyr   rL   r   r   )rN   Za0Za1r@  ainvidentr>   r>   r?   test_cho_inv_batch  s     


z!TestInvwishart.test_cho_inv_batchc                 C   s   t g dg dg dg dg}t g dg dg dg dg}d	}t|||}|jd
 }t j|\}}t j|\}}t j||}	|d | || d t d  t	|d | || d d |  d|	
   }
t||
 dS )r  r   r  r  r  )r  rY   rE   r	   )rY   r  rV   r	   )rE   rV   r  rD   )r	   r	   rD   r  rW   r   rD   r	   r   N)r7   r   r   r   r9   r   r   Zsolver   r1   tracer   )rN   r   PsinuZprobr  sigZlogdetXZ	logdetPsir   rm  r>   r>   r?   test_logpdf_4x4  s4    




zTestInvwishart.test_logpdf_4x4N)r   r   r   r  r  r  r  r  r>   r>   r>   r?   r  L  s
    !;r  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestSpecialOrthoGroupc                 C   sf   t jd td}t g dg dg dg}t|| t jjdd}tjd|d}t|| d S )N  rE   )g(fg^A.g*B?)g:d?g2ugi}?)gR#xlF?g^`D?g?r   r   )r7   r|   r   r   r   r   r   r  )rN   rT   rm  r   r>   r>   r?   test_reproducibility  s    


z*TestSpecialOrthoGroup.test_reproducibilityc                 C   s<   t ttjd  t ttjd t ttjd t ttjd d S Nr+  r	   r   )r   rI   r   r   rN   r>   r>   r?   test_invalid_dim   s    z&TestSpecialOrthoGroup.test_invalid_dimc                 C   s4   d}t |}|jdd}t j|dd}t|| d S )NrY   r   r   )r   r   r   )rN   r   r^  r_  r`  r>   r>   r?   test_frozen_matrix  s
    z(TestSpecialOrthoGroup.test_frozen_matrixc                 C   sd   dd t ddD }dd |D }t|dgd dd	 |D ]$}tt||jt|jd
  q:d S )Nc                 S   s$   g | ]}t d D ]}t|qqS rE   )r   r   r   .0r   r   r>   r>   r?   
<listcomp>  s   z<TestSpecialOrthoGroup.test_det_and_ortho.<locals>.<listcomp>rD   r  c                 S   s   g | ]}t j|qS r>   r7   r   r   r  rT   r>   r>   r?   r        r      vIh%<=r   r   )r   r   r   r7   r   r   rL   r9   )rN   r  detsrT   r>   r>   r?   test_det_and_ortho  s    z(TestSpecialOrthoGroup.test_det_and_orthoc                    sx   d}d}d}t jd tj||dd fdd D  fd	d
 D }fdd
|D }t|gt| | d S )NrV   rj  皙?r  rq   r  r  )r	   rX   rE  c                    s.   i | ]&\  ft  fd dD qS )c                    s   g | ]}|   qS r>   r>   r  ZecZerr>   r?   r  3  r  z>TestSpecialOrthoGroup.test_haar.<locals>.<dictcomp>.<listcomp>sortedr  r  r"  r?   
<dictcomp>3  r  z3TestSpecialOrthoGroup.test_haar.<locals>.<dictcomp>c                    s&   g | ]} D ]}||kr||fqqS r>   r>   r  Ze0e1elsr>   r?   r  4  r  z3TestSpecialOrthoGroup.test_haar.<locals>.<listcomp>c                    s&   g | ]\}}t  |  | d  qS r  r   r  Zp0p1projr>   r?   r  5  r  )r7   r|   r   r   r   r   r   rN   r   samplesZks_probpairsZks_testsr>   r+  r0  r  r?   	test_haar  s    
zTestSpecialOrthoGroup.test_haarN)r   r   r   r  r  r  r  r5  r>   r>   r>   r?   r    s
   	r  c                   @   s^   e Zd Zdd Zdd Zdd Zdd Zej	d	g d
dd Z
dd Zejjdd ZdS )TestOrthoGroupc                 C   sn   d}t j| td}tjd|d}tt j|d t g dg dg dg}t	|| t	|| d S )Nr  rE   r   rZ   )gm?gӠh"gEo?)g~7ݲC?g>Ŀg0J_ٿ)gݱ&ǿg 6qrg`X|[)
r7   r|   r   r   r   r   r   r   r   r   )rN   r   rT   r   rm  r>   r>   r?   r  :  s    


z#TestOrthoGroup.test_reproducibilityc                 C   s<   t ttjd  t ttjd t ttjd t ttjd d S r  )r   rI   r   r   r  r>   r>   r?   r  G  s    zTestOrthoGroup.test_invalid_dimc                 C   sV   d}t |}t |dd}|jdd}t j|dd}|jdd}t|| t|| d S )NrY   r   r   r   r	   rq   )r   r   r   rN   r   r^  frozen_seedr_  r`  rvs3r>   r>   r?   r  M  s    
z!TestOrthoGroup.test_frozen_matrixc                 C   s|   dd t ddD }tdd |D }tt|t|jdd |D ].}|D ]$}tt||j	t
|jd  qPqHd S )	Nc                    s"   g | ]  fd dt dD qS )c                    s   g | ]}t  qS r>   )r   r   r  r   r   r>   r?   r  Z  s   @TestOrthoGroup.test_det_and_ortho.<locals>.<listcomp>.<listcomp>r   )r   r%  r>   r;  r?   r  Z  s   
z5TestOrthoGroup.test_det_and_ortho.<locals>.<listcomp>rD   r  c                 S   s   g | ]}d d |D qS )c                 S   s   g | ]}t j|qS r>   r  r  r>   r>   r?   r  _  r  r<  r>   )r  xxr>   r>   r?   r  _  r  r  r   r   )r   r7   r   r   fabsrK   r9   r   r   r   rL   )rN   r  r  r=  rT   r>   r>   r?   r  Y  s    z!TestOrthoGroup.test_det_and_orthor   )rD   rV   r   r  c                 C   s   t jd}t|d}|jd|d}tj|}t |dk}t	|}t
||}|jdd\}	}
|	d  k rv|
k s|n J d S )	Nl   <`Lr r;  r2  r   r   gffffff?)Zconfidence_levelr   )r7   r|   r}   r   r   r   r   r   r   r   r-   Z	binomtestZproportion_ci)rN   r   r   r   r   r  r   r   r:   lowhighr>   r>   r?   test_det_distribution_gh18272h  s    
z,TestOrthoGroup.test_det_distribution_gh18272c                    sx   d}d}d}t jd tj||dd fdd D  fd	d
 D }fdd
|D }t|gt| | d S )NrV   rj  r   i  rq   r!  c                    s.   i | ]&\  ft  fd dD qS )c                    s   g | ]}|   qS r>   r>   r  r"  r>   r?   r    r  z7TestOrthoGroup.test_haar.<locals>.<dictcomp>.<listcomp>r#  r%  r&  r"  r?   r'    r  z,TestOrthoGroup.test_haar.<locals>.<dictcomp>c                    s&   g | ]} D ]}||kr||fqqS r>   r>   r(  r*  r>   r?   r    r  z,TestOrthoGroup.test_haar.<locals>.<listcomp>c                    s&   g | ]\}}t  |  | d  qS r  r,  r-  r/  r>   r?   r    r  )r7   r|   r   r   r   r   r   r1  r>   r4  r?   r5  u  s    
zTestOrthoGroup.test_haarc                    sh   t jd dd }tddD ]D d fdd		}||}|tjjj}tj||\}}t	d
| qd S )Nr  c                 S   s,   t jt jj| | fd\}}}t ||S Nrq   )r7   r   r   r|   r   r   )r   r   Z_sr   r>   r>   r?   random_ortho  s     z<TestOrthoGroup.test_pairwise_distances.<locals>.random_orthorD   rW   rj  r$  c                    s<   t  fddt|D }|t jj| ||jd7 }|S )Nc                    s*   g | ]"}t  d  d  d qS )r;  rD   )r7   r   )r  r   )r   r   r>   r?   r    s   z\TestOrthoGroup.test_pairwise_distances.<locals>.generate_test_statistics.<locals>.<listcomp>rq   )r7   r   r   r|   r   r9   )r   r/  Zepsr-   r;  )r   r?   generate_test_statistics  s
    zHTestOrthoGroup.test_pairwise_distances.<locals>.generate_test_statisticsr   )rj  r$  )
r7   r|   r   r   r   r-   r   r   r   r   )rN   rC  rD  rm  r   Z_Dr  r>   r;  r?   test_pairwise_distances  s    	z&TestOrthoGroup.test_pairwise_distancesN)r   r   r   r  r  r  r  rH   r   r   rA  r5  ZslowrE  r>   r>   r>   r?   r6  9  s   
r6  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestRandomCorrelationc                 C   sb   t jd d}t|}tj|dd}t g dg dg dg dg}t|| t|| d S )Nr  r   r  r   r   r   )r   ѓ2ǿA?Ϳ)rH  r   4($?R}%?)rI  rK  r   qTnƿ)rJ  rL  rM  r   )r7   r|   r   r   r   r   r   )rN   r6  rT   r   rm  r>   r>   r?   r    s    


z*TestRandomCorrelation.test_reproducibilityc                 C   s|   t ttjd  t ttjd t ttjd t ttjdg t ttjddgddgg t ttjddg t ttjg d d S )	Ntestr   r	   rD   rE   rX   g      )r	   rD   r   )r   rI   r   r   r  r>   r>   r?   test_invalid_eigs  s    z'TestRandomCorrelation.test_invalid_eigsc                 C   sR   d}t |}t |dd}t j|dd}|jdd}| }t|| t|| d S )NrG  r  r   r   )r   r   r   )rN   r6  r^  r8  r_  r`  r9  r>   r>   r?   r    s    
z(TestRandomCorrelation.test_frozen_matrixc           
         s   dd  t jd  fddtddD }|g d d	d |D }d
d |D }dd |D }dd |D }t||ddd dd |D }t||D ]\}}t||dd q|D ]}	t|	|	jdd qd S )Nc                 S   s   | | t | S r6   )r   )r   r  r>   r>   r?   r     s    z3TestRandomCorrelation.test_definition.<locals>.normr  c                    s    g | ]} |t jj|d qS )rq   )r7   r|   r   r:  r   r>   r?   r    r  z9TestRandomCorrelation.test_definition.<locals>.<listcomp>rD   rW   )rX   r   r   r   c                 S   s   g | ]}d gt | qS )r   )r   r  r  r>   r>   r?   r    r  c                 S   s   g | ]}t |qS r>   )r   r   rQ  r>   r>   r?   r    r  c                 S   s   g | ]}t t j|qS r>   )r7   r>  r   r   r  r>   r>   r?   r    r  c                 S   s   g | ]}t |qS r>   )r7   prodrQ  r>   r>   r?   r    r  r  r  c                 S   s   g | ]}t |qS r>   )r7   rb   r  r>   r>   r?   r    r  r   )r7   r|   r   r   r  r   zipr   )
rN   r6  rK   r  r  Z
dets_knownZdiagsr@  rA  rT   r>   rP  r?   test_definition  s    z%TestRandomCorrelation.test_definitionc                 C   s|  t jddgddggtd}t|}t|t ddgddgg t jdd t ddgddgg}t jddgdt ddggtd}t| }t||j	
|
| t jd	dgdd
ggtd}t| }t||j	
|
| W d    n1 s0    Y  t jddgddggtd}t| }t|d d t jddgddggtd}t| }t|d d d S )Nr   r   r	   r   ignore)ZoverrZ   gu <7~r   r  rD   r  gMk   @)r7   r   r   r   Z_to_corrr   errstate	nextafterr  r   r   )rN   r  gZm0r>   r>   r?   test_to_corr  s"    
"8z"TestRandomCorrelation.test_to_corrN)r   r   r   r  rO  r  rT  rY  r>   r>   r>   r?   rF    s
   	$rF  c                   @   st   e Zd Zejdddgejdg ddd Zejdg dd	d
 Zdd Zejdg ddd Z	dS )TestUniformDirectionr   r	   rE   rr   Nr	   rV   )rV   rX   c           
      C   sv   t jd}t||d}||}t |t | }}|j|||dj}|j|ksXJ t j	j
|dd}	t|	d d S )N   Sid)_i4 r   rq   rZ   ru   r   )r7   r|   r}   r'   r   r   rL   r   r9   r   r   r   )
rN   r   rr   r   Zuniform_direction_distr2  r   r   expected_shapenormsr>   r>   r?   rn    s    
z!TestUniformDirection.test_samples)Nr   r+  r   c                 C   s@   d}t jt|d t| W d    n1 s20    Y  d S )NzMDimension of vector must be specified, and must be an integer greater than 0.rB   )rH   r   rI   r'   r   )rN   r   rO   r>   r>   r?   r     s    z%TestUniformDirection.test_invalid_dimc                 C   sR   d}t |}t |dd}|jdd}t j|dd}| }t|| t|| d S )NrV   r  r   r   )r'   r   r   r7  r>   r>   r?   test_frozen_distribution'  s    
z-TestUniformDirection.test_frozen_distribution)rD   rV   r  c                 C   s   t jd}t||d}|jdd\}}||| | 8 }|t j| }t|| ddd |jdd}|| }|| }t ||}	|	t j	7 }	|	dt j	  }	t
 }
t|	|
j}|jd	ksJ d S )
Nl   @9Y sr   rD   rq   r   r  r%  '  r   )r7   r|   r}   r'   r   r   r   r   arctan2r5  r   r    r   pvalue)rN   r   r   Zspherical_distZv1Zv2r2  s1s2anglesZuniform_distZkstest_resultr>   r>   r?   test_uniform3  s    
z!TestUniformDirection.test_uniformN)
r   r   r   rH   r   r   rn  r  r_  rf  r>   r>   r>   r?   rZ    s   
rZ  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestUnitaryGroupc                 C   sX   t jd td}tjddd}t g dg dg dg}t|| t|| d S )Nr  rE   r   )y~p?yZ?y뉦?ĭ?y8Z?&4?)yEHξr?8i?ye??+ݓݿyu=ٿB۽'?)yqXQÿ?yN6ҿzܷy! 8l?2W'?)r7   r|   r   r   r   r   r   )rN   rT   r   rm  r>   r>   r?   r  L  s    


z%TestUnitaryGroup.test_reproducibilityc                 C   s<   t ttjd  t ttjd t ttjd t ttjd d S r  )r   rI   r   r   r  r>   r>   r?   r  X  s    z!TestUnitaryGroup.test_invalid_dimc                 C   sV   d}t |}t |dd}|jdd}t j|dd}|jdd}t|| t|| d S )NrY   r  r   r   r	   rq   )r   r   r   r7  r>   r>   r?   r  ^  s    
z#TestUnitaryGroup.test_frozen_matrixc                 C   sJ   dd t ddD }|D ],}tt|| jt|jd dd qd S )Nc                 S   s$   g | ]}t d D ]}t|qqS r  )r   r   r   r  r>   r>   r?   r  k  s   z3TestUnitaryGroup.test_unitarity.<locals>.<listcomp>rD   r  r   r  r%  )r   r   r7   r   Zconjr   rL   r9   )rN   r  rT   r>   r>   r?   test_unitarityj  s
    zTestUnitaryGroup.test_unitarityc                 C   sx   d}d}t jd tj||d}t dd |D }t |j|j}t	|
 tt j dt j j}t|jdk d S )	NrV   rj  r  rq   c                 S   s   g | ]}t j|qS r>   )r   r   Zeigvalsr  r>   r>   r?   r    r  z.TestUnitaryGroup.test_haar.<locals>.<listcomp>rD   r   )r7   r|   r   r   r   r  ra  imagrealr    Zravelr   r5  r   r   rb  )rN   r   r2  r  r6  rT   r:   r>   r>   r?   r5  s  s     zTestUnitaryGroup.test_haarN)r   r   r   r  r  r  rh  r5  r>   r>   r>   r?   rg  K  s
   	rg  c                   @   s
  e Zd Zddgddgddgddgddgddgddgddgddgddgg
ddgddgddggdg dfg dg d	g d
g dg dgg dg dg dg dgdg dfgZejdedd Zejdedd Zdd Z	dd Z
eddd Zdd  Zd!d" Zd#d$d%d&dgdd&ggd%ddgd&dgdd&ggdfd%d&dgdd&ggd&ddgd&dgdd&ggd&fd&d&gd%d%d&d&gddgddggdfd&d&gd%d&d&d&gddgddggd&fd&d&gd&dgdd&ggd%d&d&gd&dgdd&ggdfd&d&gd&dgdd&ggd&d&d&gd&dgdd&ggd&fgZejd'ed(d) Zd*ddd*gdggdfd*gdgdd*gdggdfed*gedgdd*gdggdfgZejd'ed+d, Zd-d. Zd/d0 Zd1d2 Zejd3d4d5gejd6g d7ejd8d9d:ejgd;d< Zd=d> Zejd6g d?d@dA Zejd6g dBdCdD ZdkdFdGZdHdI Zejd6g dJejdKg dLejdMdEdNgdOdP ZdQdR Z dSdT Z!dUdV Z"dWdX Z#ejd6dYdZd[ Z$d\d] Z%ejd8g d^d_d` Z&ejdadbe'dddcddfdeedfdgddbggdgdhfgdidj Z(d%S )lTestMultivariateTr	   rD   rX   rE   rV   r   )
|	ߌ?v
2R?rl  g0$H?rm  rm  gO`?gՒXO?g	ߌ,?g8N8?)gHP?gQI?go_?)g9m4?g=U?gˡE?)g$C?ghs?gǺ?)g!uq?g%C?gS㥛?)gOec?gz,C?g	h"l?)rZ   r	   2   )r   r   r  )r   r   r  )r  r  r   r  )gJ#R<g^<gL[<gN=<g`$<zx, loc, shape, df, ansc                 C   s(   t |||dd}||}t|| d S Nr   r   )r#   r   r   )rN   rT   r  r9   r  ansr   valr>   r>   r?   test_pdf_correctness  s    
z&TestMultivariateT.test_pdf_correctnessc           	      C   s8   t |||dd}||}||}tt|| d S ro  )r#   r   r   r   r7   r   )	rN   rT   r  r9   r  rp  r   r  r  r>   r>   r?   test_logpdf_correct  s    

z%TestMultivariateT.test_logpdf_correctc                 C   s.   g d}t j|dd}t|}t|| d S )N)
r  rY   rX   r	   r  r   rt  rZ   rE   r	   r  )r#   r   r$   r   )rN   rT   rq  rp  r>   r>   r?   test_mvt_with_df_one_is_cauchy  s    
z0TestMultivariateT.test_mvt_with_df_one_is_cauchyc                 C   s   d}t ddddd}|jdd}t|\}}||ks8J t ddgd	d
gd
d	ggddd}|jdd}t|\}}||k sJ d S )Nr   r   r	   順 r  r   rq   r]   rE   r   rZ   *   )r#   r   r%   r   )rN   Z	P_VAL_MINr   r2  r   r  r>   r>   r?   &test_mvt_with_high_df_is_approx_normal  s    z8TestMultivariateT.test_mvt_with_high_df_is_approx_normalz'scipy.stats.multivariate_normal._logpdfc                 C   s`   t ddtjdd}t|ts J t jdtjd |jdks>J t jdtjd |jdks\J d S )Nr   r	   rY   rx  ru  rD   )r#   r7   r   r   r   r   Z
call_countr   )rN   Zmockr   r>   r>   r?   !test_mvt_with_inf_df_calls_normal  s    z3TestMultivariateT.test_mvt_with_inf_df_calls_normalc           	      C   s"  d}t |}t |}d}t |}t||||}t |sFJ t||||}t |sfJ d}t j||f}t||||}|j|fksJ t||||}|j|fksJ tt dt dd	 }t |sJ d}tt dt ddj	|d}|j|fksJ d S )NrX         @rY   r	   rq   )
r7   r   rL   r#   r   Zisscalarr   r|   r9   r   )	rN   r   r  r9   r  rT   r:   	n_samplesrr   r>   r>   r?   test_shape_correctness  s(    


 z(TestMultivariateT.test_shape_correctnessc                 C   s6   t  }t|jdg t|jdgg |jdks2J d S )Nr   r	   r#   r   r  r9   r  )rN   r   r>   r>   r?   test_default_arguments	  s    z(TestMultivariateT.test_default_arguments)NNNr   r	   r	   )NNrY   r   r	   rY   NrY   z*loc, shape, df, loc_ans, shape_ans, df_ansc                 C   s8   t |||d}t|j| t|j| |j|ks4J d S )Nr  r9   r  r  rN   r  r9   r  Zloc_ansZ	shape_ansZdf_ansr   r>   r>   r?   test_default_args.	  s    z#TestMultivariateT.test_default_argsrZ   c                 C   s4   t |||}t|j| t|j| t|j| d S r6   r  r  r>   r>   r?   &test_scalar_list_and_ndarray_arguments;	  s    z8TestMultivariateT.test_scalar_list_and_ndarray_argumentsc                 C   s   ddgg}t ttfi t|d ddgddgddgg}t ttfi t||d td}td}d}t ttfi t|||d d}t ttfi t|||d d S )	Nr	   )r  rD   rE   )r  r9   rZ   r  r   )r   rI   r#   dictr7   r   rL   )rN   r  r9   r  r>   r>   r?   test_argument_error_handlingB	  s4    



z.TestMultivariateT.test_argument_error_handlingc                 C   sh   t jd}|jdd}t d}t||ddd}t||ddd}|jdd}|jdd}t|| d S )NrX   rE   rq   rD   rx  r   )r7   r|   r  r   rL   r#   r   r   )rN   r   r  r9   r   Zdist2Zsamples1Zsamples2r>   r>   r?   r  [	  s    
z&TestMultivariateT.test_reproducibilityc                 C   s:   t ddgddgddggddd}ttjjtfi | d S )Nr   r	   F)r  r9   r  rR   )r  r   r7   r   r  r#   )rN   r<   r>   r>   r?   test_allow_singulare	  s     z%TestMultivariateT.test_allow_singularrr   )r   rE   )rV   rW   rX   rE   r   )rD   rE   rX   rV   r  r   ry  c                 C   s<   t t|t||}|j|d}|j||f ks8J d S rB  )r#   r7   r   rL   r   r9   )rN   rr   r   r  r   r   r>   r>   r?   test_rvsj	  s    zTestMultivariateT.test_rvsc                 C   s   t d}t d}d}g dg dg dg dg}g dg dg dg dg}t g d}tj|||||d}t||d	 |  d S )
NrE   r   r9  r[   rH  rI  rJ  r=  r   rK  )rN   r   r   r  rA  r@  rL  r   r>   r>   r?   rM  r	  s    

z TestMultivariateT.test_cdf_signs)r	   rD   rV   r   c                 C   s   |  | d S r6   cdf_against_mvn_testrN   r   r>   r>   r?   $test_cdf_against_multivariate_normal~	  s    z6TestMultivariateT.test_cdf_against_multivariate_normal)rE   rW   r  c                 C   s   |  dd d S )NrE   Tr  r  r>   r>   r?   -test_cdf_against_multivariate_normal_singular	  s    z?TestMultivariateT.test_cdf_against_multivariate_normal_singularFc              	   C   s   t jd}d}d|jdd|d }t||||}d|jdd|d t |j|d }d|jdd||fd  | }d|jdd||fd | }	tjj	|	||d	|d
|d}
tj
j	|	||d
|d}t|
|dd d S )N   ]J>?a rE   r   r]   r	   rq   rZ   rD   r`  T)r  r>  rR   r   )rR   r>  Mb@?r%  )r7   r|   r}   r   r   signr   r-   r#   r   r   r   )rN   r   rs   r   r   r  r   r   r@  rA  r:   r;   r>   r>   r?   r  	  s    &z&TestMultivariateT.cdf_against_mvn_testc           	      C   s   t jd}d}d}|jdt |d}d}tjj||||t j |d}tj	|||t |}tj
||t |}t||dd	 t t || d
ksJ d S )Nr  rD   r   r   )rr   r  rE   )r>  r   r  r%  r   )r7   r|   r}   r   sqrtr-   r#   r   r   tr   r   r   r   )	rN   r   r   r   rT   r  r:   r;   Z	incorrectr>   r>   r?   test_cdf_against_univariate_t	  s    z/TestMultivariateT.test_cdf_against_univariate_t)rD   rE   rV   r   r   )   no l   m, l   sO l   U iOfYl   O_ rs   Tc              	   C   s^  |r|dkrt d tj|}d|jdd|d }t||||}||}|| }||}	| d }
tjj	|	|||
|dd	}tj
d
d0 td|
|tj| |	| |d }W d    n1 s0    Y  t||ddd tjj	|	|||
||dd}tj
d
d. td|
||| |	| |d }W d    n1 s@0    Y  t||ddd d S )Nr  z4Agreement with qsimvtv is not great in singular caser   r]   rD   rq   rV   T)r   rR   rU  )invalidi N  r   g-C6*?r   r  r   )r>  r   rR   rF  )rH   rx   r7   r|   r}   r   r   r-   r#   r   rV  r4   r   r   )rN   r   r   rs   r   r  r   r   r@  rA  r  r:   r;   r>   r>   r?   test_cdf_against_qsimvtv	  s*    


>>z*TestMultivariateT.test_cdf_against_qsimvtvc           	   	      s  d}t jd}d|jdd|d }t|||dd |||| }||}| d	 tjj| ||d
} fdd}t|||tj	j
||dd}t||jdd  fdd}t||d |d |d |d |d |d }t||d dd d S )NrE   l   	!y r   rZ   r	   rq   T)rs   rV   )r   r>  c                    s   t j| j S r6   )r-   r#   r   r   rS   r   r  r   r>   r?   	integrand	  s    zITestMultivariateT.test_cdf_against_generic_integrators.<locals>.integrand)r"  r   )Zqrngr   r   c                     s   t j| d d d  S )NrZ   )r-   r#   r   )Zzyxr  r>   r?   r  	  s    r   rD   )r7   r|   r}   r   r   r-   r#   r   r/   ZqmcZHaltonr   Zintegralr0   )	rN   r   r   r  r@  rA  r:   r  r;   r>   r  r?   $test_cdf_against_generic_integrators	  s"    

,z6TestMultivariateT.test_cdf_against_generic_integratorsc                 C   sb   t jd}t g dg dg dg}d}tj||d}|jg d|d}d	}t||d
d d S )Nl   Ja )go!@S<?^Ss@)r  gRP=@jT0@)r  r  gk`-3@gWK?r9   r  r[   r   g1%?r   r   )r7   r|   r}   r   r-   r#   r   r   )rN   r   r   r  r   r:   r;   r>   r>   r?   test_against_matlab	  s    
z%TestMultivariateT.test_against_matlabc                 C   s   d}t j|}|jdd}|jdd| }t d}| }|||f}t j|}t j|}	tj|d|i}
t|
|tj|g|R d|	i d S )Nl   2m rE   rq   r   r   )	r7   r|   r}   r   rL   r-   r#   r   r   )rN   r   r   r  rT   r9   r  r<   Z
rng_frozenZrng_unfrozenr   r>   r>   r?   r  	  s    


zTestMultivariateT.test_frozenc                    s   d}d}t jdj||fd}||j  |||f } d tjj| d} fdd}t |d	|}t||d
dd d S )NrX   rE  r  rq   rV   r   c                    s"   t d tj |  |  d S )Nr`  r   )r4   r7   r   rS   r   r  r   r   r>   r?   _cdf_1d
  s    z2TestMultivariateT.test_vectorized.<locals>._cdf_1drZ   rF  r   r  )	r7   r|   r}   r   r-   r#   r   Zapply_along_axisr   )rN   r   r   rh   rT   r:   r  r;   r>   r  r?   test_vectorized 
  s    

z!TestMultivariateT.test_vectorizedr  c                 C   sd   t jd}tjjdgdg|d   d}tj|djdg| |d}d|d  }t	||dd	 d S )
Nr  r	   r   )r  )r9   r   r   g-C6
?r   )
r7   r|   r}   r   r   Ztoeplitzr-   r#   r   r   )rN   r   r   rh   r:   r;   r>   r>   r?   test_against_analytical
  s
    z)TestMultivariateT.test_against_analyticalc                 C   s@   t dd}t j}tjj||d}tjd |}||ks<J d S )NrE   r  )r7   rL   r   r-   r#   r   r   )rN   r   r  mvt_entropyZmvn_entropyr>   r>   r?   test_entropy_inf_df
  s
    z%TestMultivariateT.test_entropy_inf_df)r	   r   r   c                 C   s0   t jjd|d}t jj|d}t||dd d S )Nr   r  ru  r  r   )r-   r#   r   r  r   )rN   r  r  Z	t_entropyr>   r>   r?   test_entropy_1d!
  s    z!TestMultivariateT.test_entropy_1dzdf, cov, ref, tolr   g}M@r  r   r   gNfh@r  c                 C   s.   t d}t|||}t| ||d d S )Nr  r   )r7   r   r-   r#   r   r   )rN   r  r   r;   Ztolr  Zmvtr>   r>   r?   %test_entropy_vs_numerical_integration5
  s    
z7TestMultivariateT.test_entropy_vs_numerical_integration)F))r   r   r   Z	PDF_TESTSrH   r   r   rr  rs  rv  rz  r5   r{  r~  r  ZDEFAULT_ARGS_TESTSr  r7   r   ZARGS_SHAPES_TESTSr  r  r  r  r   r  rM  r  r  r  r  r  r  r  r  r  r  r  r  rL   r  r>   r>   r>   r?   rk    s   
(B


 **""..
$






rk  c                   @   s  e Zd Zejdddgddgddfddgddgdej fd	dgddgdej fddgd
dgdejfddgddggddgd
dggddgejejgfd	dgd
dgdejfddgddgdejfddgddgdejfddgddgdejfddgddgdej fg
dd Z	dd Z
dd Zdd Zejdg ddfg ddfddgdfdgdffdd  Zejddgdgddfddgddgdd!fddgdd"ggdd#gddgggddgd"d"gd"dggd$d%gdd&ggfeg ejeg ejdg fddgddgddfg d'g d(d)d*fgd+d, Zejdddgddgdd-ggdd!d.gfdgdggdgdggddgd/d0gfdgdgggdgdggddgd/d0ggfdgdggdggggddgd/d0gggfgd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=d> Zd?d@ ZdAdB ZdCdD ZdEdF ZdGdH ZdIS )JTestMultivariateHypergeomzx, m, n, expectedrE   rX   rV   r   rY   gr   rt  r	   rD   r_   iir  r  rZ   ic                 C   s    t |||}t||dd d S )Ngư>r   )r   r  r   rN   rT   r  r   rm  valsr>   r>   r?   r  @
  s    z%TestMultivariateHypergeom.test_logpmfc                 C   st   t jddgddgdd}tjddddd}t||d	d
 t jddgddgdd}tjddddd}t||d	d
 d S )NrE   r	   r   rV   rX   )rT   r  r      )r   r   r   r/  r  r   rY      )r   r  r"   r   r  r>   r>   r?   test_reduces_hypergeom^
  s    z0TestMultivariateHypergeom.test_reduces_hypergeomc                 C   s:   t ddgdd}|jddd}t|d| d	d
 d S )NrE   rV   rX   r  r   rj  r  r   r   r  r   r   r   r   r   rN   r   r   r>   r>   r?   r  i
  s    z"TestMultivariateHypergeom.test_rvsc                 C   sF   t ddgddggddgd}|jddd	}t|d
| dd d S )NrE   rV   r   rX   r  r  rj  rD   r  r   r   r  r   r  r  r>   r>   r?   test_rvs_broadcastingp
  s    z/TestMultivariateHypergeom.test_rvs_broadcastingzm, n)r   r   r  r   r   )r   r   r   r   r   c                 C   s8   t ||}t|}| }|||dk< t|| d S )Nr   )r   r   r7   r8   r  r   )rN   r  r   r:   Zres_exr>   r>   r?   test_rvs_gh16171u
  s
    
z*TestMultivariateHypergeom.test_rvs_gh16171g zl?r  r  gQ?gE|?g
y?r  )rV   rW   rY   rW   gzp?c                 C   s    t |||}t||dd d S Nr  r   r   r  r   r  r>   r>   r?   r  
  s    z"TestMultivariateHypergeom.test_pmfr  g ?r   r   c                 C   s    t |||}t||dd d S r  r  r  r>   r>   r?   r  
  s    
z/TestMultivariateHypergeom.test_pmf_broadcastingc                 C   s:   t jg ddd}g dg dg dg}t||dd d S )	N)rE   rY   r   r  r  )gf_?&BUп疈Cx@ؿ)r  ggs>d?ZsK)r  r  g35?r  r   r   r   r   )rN   r  r(  r>   r>   r?   r  
  s    z"TestMultivariateHypergeom.test_covc                 C   s   t jddgddggddgd}dd	gd	dggd
dgdd
ggg}t||dd t jdgdggddgd}dggdggg}t||dd t jddgddgd}dd	gd	dggddgddggg}t||dd d S )NrY   r  r   r  r  r  r  g?gg(\?g(\r  r   rX   rV   r   g333333?g333333r  r  r>   r>   r?   r  
  s    z/TestMultivariateHypergeom.test_cov_broadcastingc                 C   s4   t jddgdd}tjdddd}t||dd d S )	Nr   rV   rX   r  r  r   r   r/  r  r   )r   rt  r"   r   )rN   var0var1r>   r>   r?   test_var
  s    z"TestMultivariateHypergeom.test_varc                 C   s   t jddgddgd}t jddgdd}t jddgdd}t|d |dd t|d	 |dd t jddgdd
ggddgd}ddgddgg}t||dd t jdgdggddgd}dgdgg}t||dd d S )Nr   rV   rX   r  r  r   r  r   r	   r  g̍3eY?gI{?r   )r   rt  r   )rN   r  r  var2var3Zvar4Zvar5Zvar6r>   r>   r?   test_var_broadcasting
  s    z/TestMultivariateHypergeom.test_var_broadcastingc                 C   s`   t jddgdd}tjdddd}t|d |dd	 t jd
dgdd}ddg}t||dd	 d S )Nr   rV   rX   r  r  r  r   r  r   r  r  g      @r  )r   r   r"   r   rN   mean0r  r'  Zmean3r>   r>   r?   r  
  s    z#TestMultivariateHypergeom.test_meanc                 C   s@   t jddgddggddgd}ddgd	d
gg}t||dd d S )NrE   rV   r   rX   r  r  r   r   gUUUUUU@gUUUUUU@r  r   )r   r   r   )rN   r  r  r>   r>   r?   r  
  s    z0TestMultivariateHypergeom.test_mean_broadcastingc                 C   s   t jg ddd}t|g d t jg ddd}t|tjtjtjg t jg dg dgdd}t|tjtjtjgg dgd	d
 t jtg tjdd}t|g  t|j	dk d S )Nr[   r   r  r   r   r   r	   r   r   rD   rH  )r   r   r   FFg<r   r   )
r   r   r   r7   r  r   r   int_r   r9   r  r>   r>   r?   test_mean_edge_cases
  s    
z.TestMultivariateHypergeom.test_mean_edge_casesc                 C   s   t jg ddd}t|g ddd t jg ddd}t|tjtjtjg t jg dg d	gdd}t|tjtjtjgg dgd
d t jtg tjdd}t|g  t|j	dk d S )Nr[   r   r  r  gؗҜ<r   r  rD   rH  r  r  )
r   rt  r   r   r7   r  r   r  r   r9   )rN   r  r  r  r  r>   r>   r?   test_var_edge_cases
  s    
z-TestMultivariateHypergeom.test_var_edge_casesc                 C   s   t jg ddd}g dg dg dg}t||dd t jg ddd}g dg dg dg}t|| t jtg tjdd}tjg tjd	dd}t||dd t	|j
d
k d S )Nr  r	   r  r  r  r   r[   r   r   r  )r   r   r   r   r7   r   r  Zfloat_rk  r   r9   )rN   Zcov0r  r  r  r  r  r>   r>   r?   test_cov_edge_cases
  s    
z-TestMultivariateHypergeom.test_cov_edge_casesc                 C   s   t jd d}g d}g dg dg dg dg dg}t j|t jd	}t||}t||t||| t||t||| t|	 t	|| t|
 t
|| d S )
Nr   r  )rY   r  r     r  r  r  r  r  r   )r7   r|   r   r8   r  r   r   r  r  rt  r   )rN   r   r  rT   Z
mhg_frozenr>   r>   r?   r    s     


z%TestMultivariateHypergeom.test_frozenc                 C   s   t ttjddd t ttjddgd t ttjddgdgd t ttjddgddgd t ttjddgddgd t ttjddgddgd d S )	NrV   r   rX   g      @r|  r  g      %@g      /@)r   rI   r   r  	TypeErrorr  r>   r>   r?   test_invalid_params  s    z-TestMultivariateHypergeom.test_invalid_paramsN)r   r   r   rH   r   r   r7   r   r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r>   r>   r>   r?   r  ?
  sv   


"&&	

r  c                   @   s0  e Zd Zdd Zdd Zejdddd Zd	d
 Z	ejddejdddd Z
ejdddd Zdd Zejdddd Zejdddd Zejdddd Zejddejdg dgfejdg dgfd d! Zejd"d#d$d% Zd&d' Zejddd(d) Zd*S )+TestRandomTablec                 C   s   t jdS )Nl   OfE)r7   r|   r}   r  r>   r>   r?   get_rng$  s    zTestRandomTable.get_rngc                 C   s>  d}t jt|d$ tddggddg W d    n1 s<0    Y  d}t jt|d$ tddgddgg W d    n1 s0    Y  d}t jt|d" tddgddg W d    n1 s0    Y  d}t jt|d" tddgdd	g W d    n1 s0    Y  d
}t jt|d" tddgddg W d    n1 sR0    Y  d}t jt|d" tddgg d W d    n1 s0    Y  d}t jt|d" tddgg d W d    n1 s0    Y  ddg}g d}tddgg d\}}}t|| t|| |t|ks:J d S )Nz`row` must be one-dimensionalrB   r	   rD   z`col` must be one-dimensionalz*each element of `row` must be non-negativerZ   z*each element of `col` must be non-negativer]   z'sums over `row` and `col` must be equalr   z(each element of `row` must be an integer @)r	   r	   rD   z(each element of `col` must be an integer)r  r  r	   rE   rD   r	   r	   )rH   r   rI   r&   Z_process_parametersr   r7   r   )rN   rO   rowcolr   r  r   r>   r>   r?   test_process_parameters'  s6    2202222

z'TestRandomTable.test_process_parameterszscale,method))r	   boyett)r   	patefieldc                 C   sZ   t ddg| }t g d| }t}|j|||dd}|j||d dd}t|| d S )Nr	   rE   r  methodr   )r7   r   r&   r   r   )rN   r  r  r  r  ctrm  gotr>   r>   r?   test_process_rvs_method_on_NoneK  s    z/TestRandomTable.test_process_rvs_method_on_Nonec                 C   sV   ddg}g d}d}t jt|d  tj||dd W d    n1 sH0    Y  d S )Nr	   rE   r  z$'foo' not recognized, must be one ofrB   Zfoor  )rH   r   rI   r&   r   )rN   r  r  rO   r>   r>   r?   $test_process_rvs_method_bad_argumentW  s
    z4TestRandomTable.test_process_rvs_method_bad_argumentr^  )TFr   c                    sR  |   }ddgg d tj dd|d}|r:t nt}t||rJdnd|sh fd	d
|rxfddn}tj|ddd\}}||}	t|	t| |dd |t|d }
t	|
|	d  |
d|jdd   }||}	|	jdksJ t|	jd D ]F}t|	jd D ]0}|	||f }|||f }||}t	|| qqg dg dg}t	tj|dd ||}	|	dksJ g dg dg}t	tj|dd  ||}	|	dksJ d}tjt|d |dg W d    n1 s0    Y  d}tjt|d |dgg W d    n1 s80    Y  d}tjt|d |tjgg W d    n1 sz0    Y  d}tjt|d |dgg W d    n1 s0    Y  d }tjt|d |g d!g W d    n1 s0    Y  d"}tjt|d$ |ddgd#d$gg W d    n1 sD0    Y  d S )%NrD   rW   r	   rE   rX   rj  r  rr   r  r   r  r  c                    s   |  S r6   r>   rS   )r  original_methodr  r>   r?   r  q  s    z/TestRandomTable.test_pmf_logpmf.<locals>.methodc                    s   t  | S r6   )r7   r   rS   r  r>   r?   rU   s  r  z1TestRandomTable.test_pmf_logpmf.<locals>.<lambda>r   Trv   Zreturn_countsr   r   )r   r   r	   )r   r	   r	   )rD   r	   rE   rZ   ru   r   )r	   rD   rD   r]   z$`x` must be at least two-dimensionalrB   z%`x` must contain only integral valuesr  z)`x` must contain only non-negative valuesz"shape of `x` must agree with `row`rG   z"shape of `x` must agree with `col`rE   rX   )r  r&   r   rc   r7   uniquer   r   r   r   rk  r9   r   r   rH   r   rI   r  )rN   r^  r   r   r   objr  
unique_rvscountsr  p2Zrvs_ndr   r   ZpijZrvijZqijrT   rO   r>   )r  r  r  r  r?   test_pmf_logpmf`  sl    
*,.,.zTestRandomTable.test_pmf_logpmfr  )r  r  c                 C   s   |   }ddg}g d}tj||d||d}t||}tt|t| t|d|dd t|jd	d
t|d t|jdd
t|d d S )NrD   rW   r  rj  r  r   r   r%  rZ   ru   r  r]   )rj  rE   )	r  r&   r   r   r   r7   r   r   Zbroadcast_to)rN   r  r   r  r  r   r   r>   r>   r?   test_rvs_mean  s    zTestRandomTable.test_rvs_meanc                 C   sn   |   }ddg}g d}tj||dd|d}tj||dd|d}tj|dd	}tj|dd	}t||d
d d S )NrD   rW   r  r`  r  r  r  r   ru   {Gz?r%  )r  r&   r   r7   rt  r   )rN   r   r  r  r_  r`  r  r(  r>   r>   r?   test_rvs_cov  s    zTestRandomTable.test_rvs_covc           
      C   s  ddg}g d}t j||||  d}|jdks4J t j||d||  d}|jdksZJ t||d	  t j||d	||  d}|jd
ksJ t j||d||  d}|jdksJ t j||d||  d}|jdksJ t|ddd|dd d}	tjt	|	d( t j||d||  d W d    n1 s40    Y  tjt	|	d* t j||t
j||  d W d    n1 s~0    Y  d S )NrD   rW   r  r  rE  r	   r  rG   r   )r   rD   rE   r  )r  rD   rE   )rX   rV   )rX   rV   rD   rE   rE   r  r   z/`size` must be a non-negative integer or `None`rB   rZ   )r&   r   r  r9   r   r   rk  rH   r   rI   r7   r  )
rN   r  r  r  r   Zrv2Zrv3Zrv4Zrv5rO   r>   r>   r?   test_rvs_size  sB    
&zTestRandomTable.test_rvs_sizec           	      C   sh   ddg}g d}t }|j||d||  d}tj|ddd\}}||||}t|t| |d	d
 d S )NrD   rW   r  rw  r  r   Tr  r  r   )r&   r   r  r7   r  r  r   r   )	rN   r  r  r  r  r   r  r  r  r>   r>   r?   test_rvs_method  s    zTestRandomTable.test_rvs_methodc                 C   sn   g d}g d}t ||}|jd||  d}tdt|t|f}g dg dg dg|d< t|| d S )NrI  )r	   r   r   r   rj  r  )r   r   r   r   .r&   r   r  r7   r   r   r   rN   r  r  r  r"  r   rm  r>   r>   r?   test_rvs_with_zeros_in_col_row  s    
z.TestRandomTable.test_rvs_with_zeros_in_col_row)Nr  r  r  r   r  c                 C   sD   t ||}|jd||  d}tdt|t|f}t|| d S )Nr   r  r  r  r>   r>   r?   test_rvs_with_edge_cases  s    
z(TestRandomTable.test_rvs_with_edge_casesr   r  c                 C   s   dd l m  m} tjddgtjd}tjg dtjd}t|d| }t|}||||d|  }|j	dt
|t
|fksJ t||ksJ d S )Nr   r	   rE   r   r  Z	rvs_rcont)Zscipy.stats._rcontr-   _rcontr7   r   int64rc   r   r  r9   r   )rN   r   r  r  r  r   Zntotresultr>   r>   r?   test_rvs_rcont!  s    
zTestRandomTable.test_rvs_rcontc                 C   s   ddg}g d}t |||  d}| }t ||}t||  t |||}t||| t |||}t||| d S )NrD   rW   r  r   )r&   r  r   r   r   r  r  )rN   r  r  r"  r-  rm  r>   r>   r?   r  2  s    zTestRandomTable.test_frozenc                 C   sV   ddg}g d}t |||  d}t j||d||  d}|jd|d}t|| d S )NrD   rW   r  r   r   r  )rr   r  )r&   r  r   r   )rN   r  r  r  r"  rm  r  r>   r>   r?   test_rvs_frozenB  s    zTestRandomTable.test_rvs_frozenN)r   r   r   r  r  rH   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r>   r>   r>   r?   r  #  s8   $

	N

)


r  c                 C   sd   | j }d| _ | j|ddi t| }| j|ddi}t|}|j|ddi}t|| || _ d S )Nr   rr   r  )r   r   pickledumpsloadsr   )distfnr<   r  r   Zr0Z	unpickledZr1r>   r>   r?   check_picklingN  s    


r  c                  C   s   t d} d| d< d| d< tdgtt dgfgtd| fgtd| fgtdg d	fgtd
gt	d
gg}|D ]\}}t
|| t|| qfd S )NrE   r   r   r  r>   r   r   rV   r  r  )r7   rL   r   r   r   r   r   r   r   r   r3   r  )r  distsr  r<   r>   r>   r?   test_random_state_propertyb  s    


	
r  c                   @   s  e Zd Zejdg dejdg ddd Zejdddgejd	g d
dd Zdd Zdd Z	dd Z
ejd	ddgdd Zejd	ddgdd Zejdejejgdd Zejdejejgdd Zejd eg d!eg d!d"d#feg d$eg d%d"d&feg d!eg d!d'd(feg d$eg d%d'd)feg d!eed*ed+dgd,d-feg d$eg d!d,d.feg d/eg d/d,d0feg d/eed*ed+dddgd,d1feg d/eed2ed3dddgd,d4fg	d5d6 Zejd eg d!eg d!d"d7feg d$eg d%d"d8feg d!eg d!d'd9feg d$eg d%d'd:feg d!eed*ed+dgd,d;feg d$eg d!d,d<feg d/eg d/d,d=feg d/eed*ed+dddgd,d>feg d/eed2ed3dddgd,d?fg	d@dA ZejdBg dCdDdE ZejdejejgdFdG ZdHdI Zejdg dJejdKg dLdMdN ZdOdP ZdQdR ZdSdT ZdUS )VTestVonMises_Fisherr   )rD   rE   rX   rW   rr   r[  c                 C   s   t jd}t |fdt | }t|d|d}||}t |t | }}|j	|||dj
}	|j
|	ksrJ t jj|dd}
t|
d d S )Nr\  r	   r   rq   rZ   ru   r   )r7   r|   r}   r  r  r(   r   r   rL   r   r9   r   r   r   )rN   r   rr   r   r   vmf_distr2  r   r   r]  r^  r>   r>   r?   rn  u  s    
z TestVonMises_Fisher.test_samplesrV   r  kappa)g  4&kCg@xDgꌠ9Y>)Fc                 C   s@   t jd}t |fdt | }t|||d}|d d S )Nr\  r	   r   r   )r7   r|   r}   r  r  r(   r   )rN   r   r   r   r   r  r>   r>   r?    test_sampling_high_concentration  s    z4TestVonMises_Fisher.test_sampling_high_concentrationc                 C   sJ   t d}d}tjt|d t|d W d    n1 s<0    Y  d S )Nr+  z%'mu' must have one-dimensional shape.rB   r	   r7   rK   rH   r   rI   r(   rN   r   r   r>   r>   r?   test_two_dimensional_mu  s    
z+TestVonMises_Fisher.test_two_dimensional_muc                 C   sJ   t d}d}tjt|d t|d W d    n1 s<0    Y  d S )Nr  z%'mu' must be a unit vector of norm 1.rB   r	   r  r  r>   r>   r?   test_wrong_norm_mu  s    
z&TestVonMises_Fisher.test_wrong_norm_muc                 C   sJ   t d}d}tjt|d t|d W d    n1 s<0    Y  d S )Nr  z$'mu' must have at least two entries.rB   r	   r  r  r>   r>   r?   test_one_entry_mu  s    
z%TestVonMises_Fisher.test_one_entry_murZ   )rV   rE   c                 C   sD   d}t jt|d tddg| W d    n1 s60    Y  d S )Nz"'kappa' must be a positive scalar.rB   r	   r   rH   r   rI   r(   rN   r   r   r>   r>   r?   test_kappa_validation  s    z)TestVonMises_Fisher.test_kappa_validationr   r   c                 C   sD   d}t jt|d tddg| W d    n1 s60    Y  d S )NzFor 'kappa=0' the von Mises-Fisher distribution becomes the uniform distribution on the sphere surface. Consider using 'scipy.stats.uniform_direction' instead.rB   r	   r   r  r  r>   r>   r?   test_kappa_zero  s    z#TestVonMises_Fisher.test_kappa_zeror  c                 C   sT   t g d}d}tjt|d  ||ddgd W d    n1 sF0    Y  d S )Nr   r   r   znThe dimensionality of the last axis of 'x' must match the dimensionality of the von Mises Fisher distribution.rB   r	   r   r7   r   rH   r   rI   rN   r  rT   r   r>   r>   r?   test_invalid_shapes_pdf_logpdf  s    z2TestVonMises_Fisher.test_invalid_shapes_pdf_logpdfc                 C   sT   t ddg}d}tjt|d  ||ddgd W d    n1 sF0    Y  d S )Nr   r   8'x' must be unit vectors of norm 1 along last dimension.rB   r	   r   r  r  r>   r>   r?   test_unnormalized_input  s    z+TestVonMises_Fisher.test_unnormalized_inputzx, mu, kappa, reference)r   r   r   rF  g0_?r  )r   r   r   g7m0_?r   gLI/@gFK:h*7g\(\?r  i  g3pB>g7Ks@)r   r   r   r   r   go齿@gW+x\(?r  r   gS-c                 C   s"   t |||}t||dd d S )Nr  r   )r(   r   r   )rN   rT   r   r   	referencer   r>   r>   r?   test_pdf_accuracy  s    z%TestVonMises_Fisher.test_pdf_accuracyg[d6U?g1*?gJ8j#@g=fNXg][,g1VV@g|'@gmF&!gehc                 C   s"   t |||}t||dd d S )Nr  r   )r(   r   r   )rN   rT   r   r   r  r   r>   r>   r?   test_logpdf_accuracy  s    z(TestVonMises_Fisher.test_logpdf_accuracyzdim, kappa, reference))rE   rF  g?@)rE   r   gp&F)rV   r2  gT;ӷ&)r  r	   goZ@c                 C   s8   t |fdt | }t|| }t||dd d S )Nr	   g+=r   )r7   r  r  r(   r   r   )rN   r   r   r  r   r   r>   r>   r?   test_entropy_accuracy!  s    z)TestVonMises_Fisher.test_entropy_accuracyc                 C   s   d}t jd}tdj||d}t ddt d }d}||||}|j|ksVJ t|d D ]F}t|d D ]4}	||||	d d f ||}
t	|
|||	f d	d
 qrqbd S )Nr+  r\  rE   r   r  r	   rV   r   r  r   )
r7   r|   r}   r'   r   r  r  r9   r   r   )rN   r  Z	testshaper   rT   r   r   Z
result_allr   r   Zcurrent_valr>   r>   r?   r   +  s    z%TestVonMises_Fisher.test_broadcastingc           	      C   s   t jd}t ddg}t |d |d }d}t||}t||d}tdjd|d}t |d d df |d d df }t	|
 |
  t	|||| t	|||| d S )	Nr\  r   r	   r  )r  r   rD   r   r   )r7   r|   r}   r   ra  r(   r*   r'   r   r   r   r   r   )	rN   r   r   Zmu_angler   ZvmfZvonmises_distZvectorsre  r>   r>   r?   test_vs_vonmises_2d;  s    
$z'TestVonMises_Fisher.test_vs_vonmises_2d)rD   rE   rW   zkappa, mu_tol, kappa_tol))r	   r   r   )r   r  r  )r   {Gzt?r  )rj  r   r  c                 C   s   t |fdt | }t||}t jd}d}|j||d}	t|	\}
}t |	|
}t
|d|dd t
|||d d S )	Nr	   r\  r`  r   r   r   r  r   )r7   r  r  r(   r|   r}   r   fitZarccosr   r   )rN   r   r   Zmu_tolZ	kappa_tolr   r  r   r}  r2  Zmu_fitZ	kappa_fitZangular_errorr>   r>   r?   test_fit_accuracyJ  s    
z%TestVonMises_Fisher.test_fit_accuracyc                 C   sJ   t d}d}tjt|d t| W d    n1 s<0    Y  d S )Nr  z'x' must be two dimensional.rB   )r7   r   rH   r   rI   r(   r  rN   rT   r   r>   r>   r?   #test_fit_error_one_dimensional_data[  s    
z7TestVonMises_Fisher.test_fit_error_one_dimensional_datac                 C   sJ   t d}d}tjt|d t| W d    n1 s<0    Y  d S )NrD  r  rB   )r7   rK   rH   r   rI   r(   r  r  r>   r>   r?    test_fit_error_unnormalized_dataa  s    
z4TestVonMises_Fisher.test_fit_error_unnormalized_datac                 C   sf   t g d}d}t||}t||dd}|jdd}tj||dd}| }t|| t|| d S )N)r   r   r	   rV   r  r   r   )r7   r   r(   r   r   )rN   r   r   r^  r8  r_  r`  r9  r>   r>   r?   r_  g  s    

z,TestVonMises_Fisher.test_frozen_distributionN)r   r   r   rH   r   r   rn  r  r  r  r  r	  r
  r(   r   r   r  r  r7   r   r  r  r  r  r   r  r  r  r  r_  r>   r>   r>   r?   r  t  s   

	





r  c                   @   s   e Zd Zedd Zdd Zdd Zdd Zd	d
 Ze	j
dddgdd Ze	j
dddgdd Zdd Zdd Ze	j
dddgdd Ze	j
dg ddd ZdS )TestDirichletMultinomialc                 C   sJ   t jd}|jdddd}|jdd|dfd}|jdd	}|||||fS )
N   t7)r   r   rD   rq   r	   r  rZ   ru   )r7   r|   r}   r   integersr   )rN   r  r   r:  rT   r   r>   r>   r?   
get_paramsv  s
    z#TestDirichletMultinomial.get_paramsc                 C   s   t jd}|ddd}|ddd}t j|dd}t||}t||t||| t|	|t	||| t|
 t
|| t| t|| t| t|| d S )Nr  r   r   r   rZ   ru   )r7   r|   r}   r   r  r   r)   r   r  r  r   rt  r   )rN   r   r:  rT   r   r"  r>   r>   r?   r  ~  s    
z$TestDirichletMultinomial.test_frozenc                 C   s   t g d}t |}t g d}t|||}t|||}d}t|| t|t | |j|j  krxdks~n J t j	
d}|ddd}|ddd}t j|d	d
}t|||}t|||}d}t|| t|t | d S )NrG   rE   rX   rV   gp.U.?r>   r  r   r   r   rZ   ru   g+T<)r7   r   r   r)   r  r  r   r   r9   r|   r}   r   r  )rN   rT   r   r:  r:   Zlogresr;   r   r>   r>   r?   test_pmf_logpmf_against_R  s$    


z2TestDirichletMultinomial.test_pmf_logpmf_against_Rc                 C   s  |  d\}}}}}|d7 }tt|||d tt|||tj  |  d\}}}}}|jdddk}t|| d ||< tt|||| d tt|||| tj  t	t||||  dksJ t	t||||  tj ksJ d S )Nr	   r   r   rq   r   rD   )
r  r   r)   r  r  r7   r   r|   roundr   )rN   r   r  r:  r   rT   r   r>   r>   r?   test_pmf_logpmf_support  s    $z0TestDirichletMultinomial.test_pmf_logpmf_supportc                 C   s   d}dg}t |g}t||}t||d t||d d t||d t||d t j  t| | t| d t|	 d d S )NrW   r   r	   r   )
r7   r8   r)   r   r  r  r   r   rt  r   )rN   r   r:  rT   r   r>   r>   r?   test_dimensionality_one  s    
z0TestDirichletMultinomial.test_dimensionality_onemethod_namer  r  c                 C   sb   |  d\}}}}}tt|||}ttj|g|jR  |}||}	||jd }
t|	|
 d S Nr   r   r  rc   r)   r-   Z	betabinomr   r   rN   r%  r   r  r:  r   rT   r  Z
ref_methodr:   r;   r>   r>   r?   test_against_betabinom_pmf  s    z3TestDirichletMultinomial.test_against_betabinom_pmfr   rt  c                 C   sd   |  d\}}}}}tt|||}ttj|g|jR  |}| d d df }	| }
t|	|
 d S r&  r'  r(  r>   r>   r?   test_against_betabinom_moments  s    z7TestDirichletMultinomial.test_against_betabinom_momentsc                 C   sB  d}t tjt dk r"tj|d tjd}d}|dd}|j|dd	 }t||}d
}|j	||d}|j
|||d}	t| tj|	dddd t| tj|	dddd | j| j  kr|fksn J | }
|
j||fksJ t|
t|	jdd tt|
|  ttj|
d dks>J d S )Nz/Needs NumPy 1.22.0 for multinomial broadcastingz1.22.0)reasonr  rV   r	   r   rq   r   rw  r   ru   r  r   r  r  )r2   r7   __version__rH   rx   r|   r}   r  r)   r   r   r   r   rt  r9   r   r   r   rb   r   r   r   r   )rN   rO   r   r   r   r:  r   r  r  rT   r   r>   r>   r?   rl    s&    
(z%TestDirichletMultinomial.test_momentsc                 C   s  t g d}t |}t g d}d}tt|d" tg d|| W d    n1 s^0    Y  tt|d" tg d|| W d    n1 s0    Y  d}tt|d" t|g d| W d    n1 s0    Y  tt|d" t|g d	| W d    n1 s0    Y  d
}tt|d t||d W d    n1 s^0    Y  tt|d t||d W d    n1 s0    Y  t g d}t g d}d}tt|d" t|||  W d    n1 s0    Y  d S )NrG   r   z,`x` must contain only non-negative integers.rB   )r	   rZ   rE   )r	   r  rE   z*`alpha` must contain only positive values.)rE   r   rX   )rE   rZ   rX   z`n` must be a positive integer.ǧH@r   )r	   rD   rE   rX   z&`x` and `alpha` must be broadcastable.)r7   r   r   r   rI   r)   r  )rN   Zx0Zn0Zalpha0textrT   r:  r>   r>   r?   rP     s.    
0002..z.TestDirichletMultinomial.test_input_validationr  c                 C   s   t g dg dg dg dg}t dgdgdgg}t g dg d	gd
}tt|}||||}|jdksxJ tt|D ]d}tt|D ]R}tt|D ]@}||||f }	|||  ||  ||  }
t	|	|
 qqqd S )Nr   r  rV   rV   rY   r  r  r   rW   rY   r  rG   )rD   rD   rE   )rD   r	   r	   rE   )rD   rE   rX   )
r7   r   rk  rc   r)   r9   r   r   r   r   )rN   r  r:  r   rT   r:   r   r   r   res_ijkr;   r>   r>   r?   test_broadcasting_pmf  s    "
$z.TestDirichletMultinomial.test_broadcasting_pmf)r   rt  r   c           
      C   s   t g dg dg dg dg}t dgdgdgg}tt|}|||}|dkr`|jd	kshnd
shJ tt|D ]F}tt|D ]4}|||f }|||  ||  }	t||	 qqtd S )Nr   r  r.  r/  rW   rY   r  r   )rE   rX   rE   )rE   rX   rE   rE   )	r7   r   rc   r)   r9   r   r   r   r   )
rN   r%  r:  r   r  r:   r   r   r0  r;   r>   r>   r?   test_broadcasting_moments'  s    "

z2TestDirichletMultinomial.test_broadcasting_momentsN)r   r   r   classmethodr  r  r!  r#  r$  rH   r   r   r)  r*  rl  rP   r1  r2  r>   r>   r>   r?   r  u  s    





r  )F)\__doc__r  Znumpy.testingr   r   r   r   r   r   rH   r   r   Ztest_continuous_basicr
   r3  r7   Zscipy.linalgr   Zscipy.stats._multivariater   r   r   r   Zscipy.statsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   Zscipy.integrater.   r/   r0   Zscipy.specialr1   Zscipy._lib._pep440r2   Zcommon_testsr3   Z	data._mvtr4   Zunittest.mockr5   r@   rA   r   r   r   rP  ro  r  r  r  r  r  r6  rF  rZ  rg  rk  r  r  r  r  r  r  r>   r>   r>   r?   <module>   sv    x	 a
     L B @ - (Frg9:   = e  -  