U
    Hvf                    @   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/m0Z0 dd	lm1Z1m2Z2 dd
l3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z: dd Z;G dd dZ<dd Z=G dd dZ>G dd dZ?G dd dZ@dd ZAG dd dZBG dd dZCG d d! d!ZDG d"d# d#ZEG d$d% d%ZFG d&d' d'ZGG d(d) d)ZHG d*d+ d+ZIG d,d- d-ZJG d.d/ d/ZKG d0d1 d1ZLd2d3 ZMd4d5 ZNdS )6z8
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)_covariance
Covariance)romb)multigammaln)check_random_state_property)patchc                 O   s:   t | t | } }t| |f|| t| j|j d S N)npasarrayr   r   shape)resrefargskwargs r6   G/tmp/pip-unpacked-wheel-96ln3f52/scipy/stats/tests/test_multivariate.pyassert_close(   s    r8   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dddgd	ddgdd
dgdddggedddgd	ddgdd	dgdddggdZeedd edddg 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S )#TestCovariancec              	   C   s\  d}t jt|d ttd W 5 Q R X d}t jt|d  tjtdtdd W 5 Q R X d}t jt|d td W 5 Q R X d	}t jt|d t	td W 5 Q R X d
}t jt|d t
dtdf W 5 Q R X d}t jt|d t
tddf W 5 Q R X d}t jt|d  t
dddgtdf W 5 Q R X 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	   )pytestr   
ValueErrorr(   CovViaPrecisionr/   oneseyeZCovViaDiagonalZCovViaCholeskyZCovViaEigendecompositionselfmessager6   r6   r7   test_input_validation0   s*    $z$TestCovariance.test_input_validationc                 C   s   t | ddS )NTallow_singular)r   xr6   r6   r7   <lambda>R   s    zTestCovariance.<lambda>)ZDiagonalZ	PrecisionZCholeskyZEigendecompositionZPSDr	   r<   r=               r   )diagonal full rankzgeneral full rankzdiagonal singularzgeneral singularNcov_type_namec           	      C   s   t dddg}dddg}ttd| }| j| }ttd|  }|||}|||}t|t|ksttt	|
||
| d S )Nr	   r<   r=   rM   CovViafrom_)r/   diaggetattrr(   _covariance_preprocessingr)   lowertypeAssertionErrorr   whiten)	rE   rT   ArK   cov_typepreprocessingfactoryr2   r3   r6   r6   r7   test_factories^   s    

zTestCovariance.test_factoriesmatrix_typec                 C   sx  d| d| d}|| j | k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
|krt|||
 |	jdd}
||
}|
|j }t|d jdd|d jdd t|d	rtd
|krtt|||
 d S )NrV    does not support 	 matricesTrH      VGiVK r=   sizeZ	_colorizeZsingularr<   rO   r=   r<   rQ   axis)
_cov_typesr?   skip	_matricesrY   r(   rZ   r   r8   log_pdetr   rankr1   r/   r0   r>   randomdefault_rngr^   UhasattrZcolorizesum)rE   rd   rT   rF   r_   r`   ra   psd
cov_objectrngrK   r2   r3   r6   r6   r7   test_covariancel   s2    






"zTestCovariance.test_covarianceri   rj   c                 C   s  d| d| d}|| j | kr*t| | j| }ttd| }| j| }dddg}|||}	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 )NrV   re   rf   皙?皙?333333?TrH   rg   rh   ri   random_stateseed)rm   r?   rn   ro   rY   r(   rZ   r   r/   rr   rs   rvs
isinstanceZ	CovViaPSDr8   squeezer   r1   pdflogpdfentropy)rE   ri   rd   rT   rF   r_   r`   ra   meanrx   mvndist0dist1ry   rK   x1x2r6   r6   r7   test_mvn_with_covariance   s:    




z'TestCovariance.test_mvn_with_covariancec                 C   s   d}| j | }ttd| }| j| }dddg}|||}t}	t||dd}
t||dd}tjd}|j|||d	}t|		||||
	| t|	||
	| t|	
||||

| t|
||

| d S )
NrR   rV   r{   r|   r}   TrH   rg   rh   )ro   rY   r(   rZ   r   r/   rr   rs   r8   cdflogcdf)rE   ri   rT   rd   r_   r`   ra   r   rx   r   r   r   ry   rK   r6   r6   r7   test_mvn_with_covariance_cdf   s    


z+TestCovariance.test_mvn_with_covariance_cdfc              	   C   s(   d}t jt|d t  W 5 Q R X d S )Nz7The `Covariance` class cannot be instantiated directly.r:   )r?   r   NotImplementedErrorr)   rD   r6   r6   r7   test_covariance_instantiation   s    z,TestCovariance.test_covariance_instantiationzignore::RuntimeWarningc              	   C   s   t dddg}|jd }t |}tjtdd t||  W 5 Q R X d}t j	
|}t j	
|}tt j|}t||}|j|d}	tj|||d}
t|	|
 d S )	Nr	   r<   g:0yEr   zThe input matrix must be...r:   l   .ypGw r   )r/   rX   r1   zerosr?   r   r@   r   r   rr   rs   r)   Zfrom_eigendecompositionlinalgeighr   )rE   r_   nr   r   Zrng1Zrng2covrvr2   r3   r6   r6   r7   test_gh9942   s    


zTestCovariance.test_gh9942)__name__
__module____qualname__rG   r/   rX   r   invcholeskyr   rZ   arraylistZ_all_covariance_typesro   rm   r?   markparametrizerc   rz   tupler   r   r   filterwarningsr   r6   r6   r6   r7   r9   .   sB   


&%
r9   c                 C   s$   t j| | }tj|\}}}|S r.   )r/   rr   randnscipyr   svd)r   Musvr6   r6   r7   _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 )Nr=   r<   r   r	   r   r	   r<   )r/   arangeidentityassert_raisesr@   r   r   r   )rE   mur   r6   r6   r7   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   rM   )
r/   rr   r   r   r   r   ndimr   absr   )rE   rK   r   r   r   r   r6   r6   r7   test_scalar_values  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   rM   )
r/   rr   r   r   r   r   r   r   r   logrE   rK   r   r   d1d2r6   r6   r7   test_logpdf  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   rM   r	   )	r/   rr   r   r   r   r   r   r   r   rE   rK   r   r   Zd3Zd4r6   r6   r7   test_logpdf_default_values'  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   )
r/   rr   r   r   r   r   r   r   r   r   r   r6   r6   r7   test_logcdf4  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   )	r/   rr   r   r   r   r   r   r   r   r   r6   r6   r7   test_logcdf_default_values>  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   rO   r	   TrH   )r/   rr   r   r   rangedotTr   r   rx   rq   )rE   r   r   Zexpected_rankr   r   Zdistnr6   r6   r7   	test_rankK  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	   rM   TrH   rQ           )r   r/   rr   r   r   r   r   r   r   r   rx   rq   r   r   r   inf)rE   r   zkr   Zcov_kkZcov_nnrK   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_orthr6   r6   r7   test_degenerate_distributionsV  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sttj|||dd}	t	|	j
| t|	tj kstqqd S )	N
   r<   rN   r	   r   r   ri   T)r   r   rI   r   )r   r/   r   r   r   r   r   r   r   r   ri   allr]   r   r   )
rE   r   r   rmnr   ZvrXr   r   r6   r6   r7   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   r<   Zdtyper   r	   )r/   expr   floatZfill_diagonalr   r   r   detr   r   slogdetr   rp   )rE   Zlarge_total_logZnposZnzeroZlarge_entryr   r   rw   r6   r6   r7   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   rO   r<   r=   gMbP?rtol)r/   rr   r   r   r   r   r   r   r   r   r   )rE   r   datar   r   r   Zdesired_pdfZdesired_cdfijactualr6   r6   r7   test_broadcasting  s    z(TestMultivariateNormal.test_broadcastingc                 C   sn   t ddd}d\}}|d }t|||}t|||}t|| t|||}t|||}t|| d S )Nr   r<   r   )333333??      ?)r/   linspacer   r   r   r   r   )rE   rK   r   r   scaler   r   r6   r6   r7   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  rN   r	   r   r<   rk   r   r   )locr   )r	   r	   {Gz?r   atol)
r/   r   r   Zmeshgridemptyr   r   r*   r   r   )rE   r   r   r   deltar   ZxvZyvposr   Zmargin_xZmargin_yZgauss_xZgauss_yr6   r6   r7   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   )r/   rr   r   r   r   r   r   r   r   r   r   )rE   rK   r   r   norm_frozenr6   r6   r7   test_frozen  s    


z"TestMultivariateNormal.test_frozenr>   r<   r	   c                 C   sF   t d}t d}t||}t |j|s0tt |j|sBtd S )Nr<   r<   )r/   rB   rC   r   Zallcloser   r]   r   )rE   r>   r   Zcov_should_ber   r6   r6   r7   2test_frozen_multivariate_normal_exposes_attributes  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   rP   r         ?r   Hz>rQ   h㈵>)cond)r/   rr   r   r   r   r   r   r   r   fullrX   r   Zpinvr   rp   rv   r   )	rE   r   rK   r   r   r   r   rw   Zpsd_pinvr6   r6   r7   test_pseudodet_pinv  s     z*TestMultivariateNormal.test_pseudodet_pinvc                 C   s$   dddgdddgg}t tt| d S )Nr	   r<   r=   rO   rM   rN   r   r@   r   rE   r   r6   r6   r7   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   )r/   nanr   r@   r   r   )rE   Zcov_nanZcov_infr6   r6   r7   test_exception_nonfinite_cov1  s    z3TestMultivariateNormal.test_exception_nonfinite_covc                 C   s    ddgddgg}t tt| d S )Nr	   r   rQ   r  r  r6   r6   r7   test_exception_non_psd_cov7  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 5 Q R X d S )	Nr   rM   )rM   rM   r   r   z0When `allow_singular is False`, the input matrixr:   r   )r/   rr   r   r   rB   r   LinAlgErrorr   r   r   r   r   r   r?   r   )rE   rK   r   r   emsgr6   r6   r7   test_exception_singular_cov;  s    
z2TestMultivariateNormal.test_exception_singular_covc                 C   s<  t dddddg}t ddd}d	| d }|t | }t |||gj}t d
d	dgd}t d
ddgdddgddd	ggd}t|||}t||dd t dddddg}	t|||}
t|
|	dd t dddddg}t ||gj}t d
d	gd}t d
dgddggd}t|||}t||dd d S )Ng0Q-?gox'V?g[S, t?gDB?gc_.?r   r<   rM   r=   r	   dr   绽|=r   gwk:E]?g̙Z?g0?gL8?gAG*?gh㈵>gIى?gG?gƏ)?gėh?gEE?r   )	r/   r   r   cosr   r   r   r   r   )rE   Zr_pdfrK   r   r   r   r   r   r   Zr_cdfr   Zr_cdf2Zr2mean2cov2cdf2r6   r6   r7   test_R_valuesN  s6    
 $
 
 z$TestMultivariateNormal.test_R_valuesc                 C   s<   t d}t d}t||dd}| }t|ddg d S )Nr<   r<   r<   TrH   r   )r/   r   r   r   r   )rE   r   r>   modelsampler6   r6   r7   ,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,  rO   r	   r   r<   r{   r   r   r   )r   r   r/   r   r   r1   r   )rE   Nr  r  r   r6   r6   r7   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  r=   i  r{   r   r   )r/   rr   r   r   r   r   r   r   r   numpyr   r   )rE   r   r   r   r   ri   r  r6   r6   r7   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 )Nr  r=   r   r   r<   r	   )r/   rr   r   r   r   r   r   r   r   r   Zeigr   pirv   )rE   r   r   r   r   r   eigsdesiredr6   r6   r7   test_entropy  s    
,z#TestMultivariateNormal.test_entropyc                 C   s,   t dddg}d}tt t|| d S )Nr	   r   )r/   r   r   r   r   )rE   alphar   r6   r6   r7   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   r<   )rO   r=   r<   rN   r=   Zlower_limit.r	   rQ   rk   )r/   rr   rs   rC   r   r   concatenater   )rE   ry   r   r   abcdf1Zcdf2aZcdf2bZab1Zab2Zcdf2ab1Zcdf2ab2r  r6   r6   r7    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$  r=   )r=   r=   r<   r=   rN   r%  g-C6?r   )	r/   rr   rs   r   r   r   r   r   r   )
rE   ry   r   r   r'  r(  r)  r  Zcdf3Zcdf4r6   r6   r7   %test_cdf_with_lower_limit_consistency  s    


z<TestMultivariateNormal.test_cdf_with_lower_limit_consistencyc                 C   s   t d}t d}dddgdddgdddgdddgg}dddgdddgdddgdddgg}t ddddg}tj||||d}t||d |  d S )Nr=   r	   r   rQ   r%  )r/   r   rC   r   r   r   r   )rE   r   r   r(  r'  Zexpected_signsr   r6   r6   r7   test_cdf_signs  s    

$$z%TestMultivariateNormal.test_cdf_signsc              	   C   s   t dt dddg }t|}d}tjt|d t	ddg| W 5 Q R X tjt|d tddg| W 5 Q R X dddg}t
|dddg|}ttj
||d| t
|dddg|}ttj
|d|d| d S )	Nr	   r<   r=   z7`cov` represents a covariance matrix in 3 dimensions...r:   r   r   r  )r/   rX   r   r(   rA   r?   r   r@   r   r   r   r   )rE   Prx   rF   rK   r3   r6   r6   r7   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   r?   r   r   r/   rC   r)   Zfrom_diagonalr   r   r  r  r  r  r  r  r  r  r!  r#  r*  r,  r-  r/  r6   r6   r6   r7   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 )NrO   r=   r}   r   ffffff?)rM   rO   r=   r   )r/   r   r   r   r@   r   r   r   r   r  r   rB   )rE   num_rowsnum_colsr   rt   Vr	  r6   r6   r7   test_bad_input  s0        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 )NrO   r=   r}   r   r1  r	   r   rowcovcolcov)r   )r7  )r8  )r   r8  )r   r7  )r7  r8  )r/   r   r   r   r   r   r   r1   r7  r8  r   )rE   r2  r3  r   rt   r4  ZZZrZZcIrIcZI1r6   r6   r7   test_default_inputs0  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 )NrO   r=   r}   r|   r{   r6  )r/   r   r   r   r   r7  r8  )
rE   r2  r3  r   ZUvZUsZVvZVsr:  r;  r6   r6   r7   test_covariance_expansionW  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	   rM   r}   r   r1  r6  r   r   )r   r7  r8  r   )	r   r/   r   r   r   r   r   r   r   )rE   r   r   r   rt   r4  frozenrvs1rvs2r   pdf1pdf2logpdf1logpdf2r6   r6   r7   test_frozen_matrix_normalm  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||d
d t|	|d
d qq
d S )Nr	   rM   r}   r   r1  r6  r   r   r  r  r   )r   r/   r   r   r   r   r   r   r   flattenZkronr   r   )rE   r   r   r   rt   r4  r>  r   rA  rC  ZvecXZvecMr   rB  rD  r6   r6   r7   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 )NrO   r=   r}   r   r1  r   r6  r   r~   i  r   rk   r<   r  )r/   r   r   r   r   r&  newaxisr   r1   r   r   r   )rE   r2  r3  r   rt   r4  r  r>  ZX1ZX2r   Zarray_logpdfr   r   Zseparate_logpdfr6   r6   r7   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 )NrO   r=   r}   r   r1    r6  r   r~   r   rk   r{   r  r	   r<   )r/   r   r   r   r   r   r   r   reshaper   Zswapaxes)rE   r2  r3  r   rt   r4  r  r>  r   Zsample_meanZsample_colcovZsample_rowcovr6   r6   r7   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	   r<   r=   rO   rQ   rM   r   r   )r   r7  r8  r   ri   g6?gǀgcϿ@g"'@gI2͖@g^jy%@gDn3@g|\3@)r   r   r/   r   rr   rs   r   )rE   r   expectedr6   r6   r7   test_samples  s"    
zTestMatrixNormal.test_samplesN)r   r   r   r5  r<  r=  rE  rG  rI  rL  rN  r6   r6   r6   r7   r0    s   'r0  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 Nr  r	       &.>r   r   rQ   )r/   rr   r   randintr   r   r   varr   r   r   rv   r   r   rE   r   r"  r  	num_testsr   rK   r6   r6   r7   test_frozen_dirichlet  s    (z#TestDirichlet.test_frozen_dirichletc                 C   s   t jd t dddg}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 )	Nr  r          @      @rP   rh   )rP   r=   rQ   )r/   rr   r   r   r   r   r1   r   r@   r   r   r   rE   r"  rK   r6   r6   r7   "test_numpy_rvs_shape_compatibility  s    z0TestDirichlet.test_numpy_rvs_shape_compatibilityc                 C   sT   t jd dddg}t jjt d|ddj}tttj|| tttj	|| d S )Nr  r   r   rY  rR  rP   rh   
r/   rr   r   r   maximumr   r   r@   r   r   rZ  r6   r6   r7   test_alpha_with_zeros  s
    
z#TestDirichlet.test_alpha_with_zerosc                 C   sT   t jd dddg}t jjt d|ddj}tttj|| tttj	|| d S )Nr  r   g       rY  rR  rP   rh   r\  rZ  r6   r6   r7    test_alpha_with_negative_entries  s
    
z.TestDirichlet.test_alpha_with_negative_entriesc                 C   s|   t ddddg}t ddddg}t|| t|| t ddddg}tt||d	 tt||t d	 d S )
Nr   rX  rY        @r{   r   r|   r1  rN   )r/   r   r   r   r   r   r   rZ  r6   r6   r7   test_data_with_zeros  s    z"TestDirichlet.test_data_with_zerosc                 C   sH   t ddddg}t ddddg}tttj|| tttj|| d S )	Nr   r   rY  r`  r{   r   r|   r1  r/   r   r   r@   r   r   r   rZ  r6   r6   r7   $test_data_with_zeros_and_small_alpha  s    z2TestDirichlet.test_data_with_zeros_and_small_alphac                 C   sH   t ddddg}t ddddg}tttj|| tttj|| d S )	Nr   rX  rY  r`  r{   皙r}   r1  rb  rZ  r6   r6   r7   test_data_with_negative_entries  s    z-TestDirichlet.test_data_with_negative_entriesc                 C   sH   t ddddg}t ddddg}tttj|| tttj|| d S )	Nr   rX  rY  r`  r{   皙?r}   r1  rb  rZ  r6   r6   r7    test_data_with_too_large_entries!  s    z.TestDirichlet.test_data_with_too_large_entriesc                 C   s@   t dddg}t dd}tttj|| tttj|| d S )Nr   rX  rY  )r<   rP   rP   g$I$I?r/   r   r   r   r@   r   r   r   rZ  r6   r6   r7   test_data_too_deep_c'  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   rX  rY  r`  )r<   r<   rP         ?rh  rZ  r6   r6   r7   test_alpha_too_deep-  s    z!TestDirichlet.test_alpha_too_deepc                 C   s8   t dddg}t dd}t|| t|| d S )Nr   rX  rY  r=   rP   UUUUUU?)r/   r   r   r   r   r   rZ  r6   r6   r7   test_alpha_correct_depth3  s    z&TestDirichlet.test_alpha_correct_depthc                 C   s@   t dddg}t dd}tttj|| tttj|| d S )Nr   rX  rY  rl  r   rh  rZ  r6   r6   r7   test_non_simplex_data9  s    z#TestDirichlet.test_non_simplex_datac                 C   sB   t ddddg}t dd}tttj|| tttj|| d S )Nr   rX  rY  r`  )r<   rP   r   rh  rZ  r6   r6   r7   test_data_vector_too_short?  s    z(TestDirichlet.test_data_vector_too_shortc                 C   sB   t ddddg}t dd}tttj|| tttj|| d S )Nr   rX  rY  r`  )rM   rP   r|   rh  rZ  r6   r6   r7   test_data_vector_too_longE  s    z'TestDirichlet.test_data_vector_too_longc                 C   sL   t dddg}t|}dddg}ddd	g}t| | t| | d S )
Nr   皙?r|   gUUUUUU?g{Gz?gQ?r   皙?r{   )r/   r   r   r   rT  r   )rE   r"  r  Zexpected_varZexpected_meanr6   r6   r7   test_mean_and_varK  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   )	r/   r   r   r   r   r   rT  r   r   )rE   r"  r  r6   r6   r7   r   U  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  )
r/   rr   r   rS  r   r   r   rv   r   r   rU  r6   r6   r7    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 k	rt ||	f}qR|	}qR|	|j
}
d }|D ](}|	|}|d k	rt ||}q|}qt|
| qFd S )Nr  r	   rQ  rR  r   r   rM   )r/   rr   r   rS  r   r   r   rv   vstackr   r   appendr   )rE   r   r"  r  rV  Znum_multipleZxmr   mrK   Zrmrsxsr   r6   r6   r7   test_multiple_entry_callso  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 )Nr  rR  r   r<   r   r	   r   )r/   rr   r   r   r   r   r   rv   r   r   r   rT  )rE   r"  r  r(  rV  r   rK   r6   r6   r7   test_2D_dirichlet_is_beta  s    z'TestDirichlet.test_2D_dirichlet_is_betaN)r   r   r   rW  r[  r^  r_  ra  rc  re  rg  ri  rk  rn  ro  rp  rq  rt  r   ru  r{  r|  r6   r6   r6   r7   rO    s&   	
rO  c               
   C   s~   t ddg} t dgg}ttt| | zt| | W n@ tk
rx } z"d}tt|d t| | W 5 d }~X Y nX d S )Nr   r   zDimension mismatch)r/   r   r   r@   r   r   strlen)r   sigmar	  r
  r6   r6   r7   ,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	   r<   Zndminr   r	   r<   rf  r=   )
r/   r   r_r   r   r   r1   r   r@   rC   )rE   Z
true_scaleZscalesr   wr6   r6   r7   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||| qVdddgt jd t jdddgddg}tdd}|t jdddg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||| qld S )Nr	   r<   r  r=   r	   r<   r=   r  r   )r/   r   r  r   r   r   rH  rC   )rE   r   r  ZdensityrK   r6   r6   r7   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 	NrO   r	   r<   rQ   r   rM   r   r{   )r/   rX   r   tril_indicesr   r   r   rw  r   r   r   r   rT  r   moder   r   )	rE   dimr   r   r   rK   
parametersdfr  r6   r6   r7   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   r<   r   r{   numrh   r   r   )r/   rr   r   rC   r   r   r   r   r   r   rT  r   r   r   r   r
   )rE   snr  r   df_ranger   r  r  cr   r4   r"  r6   r6   r7   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   rO   r	   rN   rQ   r  r   r{   r  rh   r   r   r   )r/   rr   r   rX   r   r  r   r   rB   r   r   r   r   rT  r   r   r   r   r   r
   )rE   r  r  r  r   ZlamdaZsigma_lamdar  r  r   r   r4   r"  r6   r6   r7   test_is_scaled_chisquaredL  s(    

z%TestWishart.test_is_scaled_chisquaredN)r   r   r   r  r  r   r  r  r6   r6   r6   r7   r    s
   +1 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dS )TestMultinomialc                 C   sl   t ddd}t|ddd t ddgd	d
dg}t|tjdd t ddgd	ddg}t|tjdd d S )Nr=   rO   rP   r}   r1  g&Mty:0yE>r   r=   rO   r   r}   r1  rS   )r   logpmfr   r/   ZNAN)rE   vals1vals2vals3r6   r6   r7   test_logpmfp  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  rP   r  r=   r}   r  r   )rN         r{   r   rN   r{   )r   r  r!   r   pmfrE   val1val2r6   r6   r7   test_reduces_binomialz  s    z%TestMultinomial.test_reduces_binomialc                 C   sT   ddddg }}ddddd	d
dd
ddd
}|D ] }t t||||| dd q.d S )Nr=   g      ?rj  g      ?g     @?g     ?g      ?g      `?g     ?g      ?g      ?g      ?g      ?)
)r   r   r=   )r	   r   r<   )r<   r   r	   )r=   r   r   r   )r	   r	   r	   )r<   r	   r   )r   r<   r	   )r	   r<   r   )r   r=   r   +=r  )r   r   r  )rE   r   pZr_valsrK   r6   r6   r7   test_R  s        zTestMultinomial.test_Rc                 C   sH   t jddgd ddd}tjd}|j ddgd dd}t|| d S )Nr=   rj  rP   {   r~   rh   )r   r   r/   rr   RandomStater   )rE   Zsc_rvsrndmZnp_rvsr6   r6   r7   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 dddgddddg}t|ddd d S )N)rM   rM   r	   r	   r  r   r  rP   r  g5
?r=   r   r  rQ   	   r  g*7?g<Wƌ?r   r<   r   rO   r<   rN   gUUUUUU?rm  gߦ?)r   r  r   r/   r   float64r   )rE   vals0r  r  rK   r  vals4Zvals5r6   r6   r7   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	   r<   r=   r{   r   r|   rr  gv?g~jt?r  r   rO   r   )r   r  r   )rE   r  r  r  r  r  r6   r6   r7   test_pmf_broadcasting  s      &z%TestMultinomial.test_pmf_broadcastingc                 C   s:   t dd}dddgdddgddd	gg}t||d
d d S )NrM   )r|   r}   r   rr  g333333ӿ      g433333ӿg?g      g      ?r  r   r   r   r   rE   cov1r  r6   r6   r7   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 )NrM   r{   r   r|   rr  g?gܿgr  r   rO   g
ףp=
?g
ףp=
׿r}   r1  rs  r   gzG?gzGr   g333333r  rE   r  r  cov3cov4cov5cov6r6   r6   r7   test_cov_broadcasting  s      z%TestMultinomial.test_cov_broadcastingc                 C   s*   t dddg}t|tdddd d S )Nr<   r|   rr  r  r   r   r   r   r!   )rE   ent0r6   r6   r7   r!    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 )Nr<   r=   r|   r}   r  r   rP   r  r1  rs  r   r  )rE   r  Zent1Zent2r6   r6   r7   test_entropy_broadcasting  s     z)TestMultinomial.test_entropy_broadcastingc                 C   s&   t dddg}t|ddgdd d S )NrM   r|   rr  r   r`  r  r   r   r   r   rE   mean1r6   r6   r7   	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 )NrM   rN   r|   rr  r   r`  g433333?g433333@r  r   r  r  r6   r6   r7   test_mean_broadcasting  s    z&TestMultinomial.test_mean_broadcastingc                 C   s   t jd d}d}ddddgddddgddddgddddgddd	d
gg}t j|t jd}t||}t||t||| t||t||| t|	 t	|| d S )Nr      )r{   r|   r}   rs  r   r	      r   r  r<   r  r   )
r/   rr   r   r0   r  r   r   r  r  r   )rE   r   ZpvalsrK   Z	mn_frozenr6   r6   r7   r     s    6
zTestMultinomial.test_frozenc                 C   sZ   d}t jd}||}d|d< |t | }t |}t|||}t |sVtd S )NX   l   iRZY gKH9rQ   )	r/   rr   rs   rv   rB   r   r  isfiniter]   )rE   r   ry   r  rK   r  r6   r6   r7   test_gh_11860   s    

zTestMultinomial.test_gh_11860N)r   r   r   r  r  r  r  r  r  r  r  r!  r  r  r  r   r  r6   r6   r6   r7   r  o  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  )r/   rX   r   r  r   r   r   rw  r   r   r   r   rT  r   r  r   r   )	rE   r  r   r   r   rK   r  r  iwr6   r6   r7   r     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|
||	 qDd S )Nr  r  r	   rM      r<   r   r{   r   r  r   r  rh   r   r   r   )r/   rr   r   rC   r   r   r   r   r   r   rT  r   r   r   r
   )rE   r  r  r   r  r   r  r  Zigr   r4   r"  r6   r6   r7   test_1D_is_invgamma/  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 )Nr=   r   r   r   r	   r   i rh   r	   r<   rQ   r  )r/   rC   r   r   rr   r   r   normalr  Z	chisquarerX   r  r   r   r   r   r   r   )rE   r  r  r   r  r  Zw_rvsZfrozen_w_rvsZiw_rvsZfrozen_iw_rvsZcovariancesZ	variancesr_   DZDAZmanual_w_rvsZiDZiDAZmanual_iw_rvsr6   r6   r7   test_wishart_invwishart_2D_rvsM  sJ    









z-TestInvwishart.test_wishart_invwishart_2D_rvsc              	   C   s   t ddddgddddgddddgddddgg}t ddddgddddgddddgddddgg}t ||g}| }t| t d}t|d |d |dd	 t|d |d |dd	 d
S )Regression test for gh-8844.r<   r	   r   r   r=   rQ   rO   V瞯<r  N)r/   r   copyr   rC   r   r   )rE   Za0Za1r'  ainvidentr6   r6   r7   test_cho_inv_batch  s     






z!TestInvwishart.test_cho_inv_batchc              	   C   s  t ddddgddddgddddgddddgg}t ddddgddddgddd	dgddddg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=   r  rP   rM   r  rN   N)r/   r   r   r   r1   r   r   Zsolver   r+   tracer   )rE   r   PsinuZprobr  sigZlogdetXZ	logdetPsir   rM  r6   r6   r7   test_logpdf_4x4  s4    








zTestInvwishart.test_logpdf_4x4N)r   r   r   r   r  r  r  r  r6   r6   r6   r7   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 )TestSpecialOrthoGroupc                 C   sl   t jd td}t dddgdddgd	d
dgg}t|| t jjdd}tjd|d}t|| d S )N  r=   g(fg^A.g*B?g:d?g2ugi}?gR#xlF?g^`D?g?r   r   )r/   rr   r   r   r   r   r   r  )rE   rK   rM  r   r6   r6   r7   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   r@   r   r   rE   r6   r6   r7   test_invalid_dim  s    z&TestSpecialOrthoGroup.test_invalid_dimc                 C   s4   d}t |}|jdd}t j|dd}t|| d S )NrP   r   r   )r   r   r   )rE   r  r>  r?  r@  r6   r6   r7   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 r=   )r   r   r   .0r  r   r6   r6   r7   
<listcomp>  s   
 z<TestSpecialOrthoGroup.test_det_and_ortho.<locals>.<listcomp>r<   r  c                 S   s   g | ]}t j|qS r6   r/   r   r   r  rK   r6   r6   r7   r    s     r      vIh%<=r   r   )r   r   r   r/   r   r   rC   r1   )rE   rz  detsrK   r6   r6   r7   test_det_and_ortho  s    z(TestSpecialOrthoGroup.test_det_and_orthoc                    s|   d}d}d}t jd tj||dd tfdd D  fd	d
 D }fdd
|D }t|gt| | d S )NrM   rJ  皙?r  rh   r   r  )r	   rO   r+  c                 3   s2   | ]*\  ft  fd dD fV  qdS )c                    s   g | ]}|   qS r6   r6   r  ZecZerr6   r7   r    s     z=TestSpecialOrthoGroup.test_haar.<locals>.<genexpr>.<listcomp>Nsortedr  rz  r  r7   	<genexpr>  s     z2TestSpecialOrthoGroup.test_haar.<locals>.<genexpr>c                    s&   g | ]} D ]}||kr||fqqS r6   r6   r  Ze0e1elsr6   r7   r    s
        z3TestSpecialOrthoGroup.test_haar.<locals>.<listcomp>c                    s&   g | ]\}}t  |  | d  qS r  r   r  Zp0p1projr6   r7   r    s     )r/   rr   r   r   r   dictr   r~  rE   r  samplesZks_probpairsZks_testsr6   r  r  rz  r7   	test_haar  s    
zTestSpecialOrthoGroup.test_haarN)r   r   r   r  r  r  r  r  r6   r6   r6   r7   r    s
   	r  c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zej	j
dd ZdS )TestOrthoGroupc                 C   st   d}t j| td}tjd|d}tt j|d t dddgdd	d
gdddgg}t	|| t	|| d S )Nr  r=   r   rQ   gm?gӠh"gEo?g~7ݲC?g>Ŀg0J_ٿgݱ&ǿg 6qrg`X|[)
r/   rr   r   r   r   r   r   r   r   r   )rE   r   rK   r   rM  r6   r6   r7   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   r@   r   r   r  r6   r6   r7   r    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 )NrP   r   r   r   r	   rh   )r   r   r   rE   r  r>  frozen_seedr?  r@  rvs3r6   r6   r7   r    s    
z!TestOrthoGroup.test_frozen_matrixc                 C   s   dd t ddD }tdd |D }tt|t|jdd tdgd	 d
d |D  tdd |D d	gd	  |D ].}|D ]$}tt	||j
t|jd  qq|d S )Nc                    s"   g | ]  fd dt dD qS )c                    s   g | ]}t  qS r6   )r   r   r  r   r  r6   r7   r    s   @TestOrthoGroup.test_det_and_ortho.<locals>.<listcomp>.<listcomp>r   )r   r  r6   r  r7   r    s   
z5TestOrthoGroup.test_det_and_ortho.<locals>.<listcomp>r<   r  c                 S   s   g | ]}d d |D qS )c                 S   s   g | ]}t j|qS r6   r  r  r6   r6   r7   r    s     r  r6   )r  xxr6   r6   r7   r    s     r  r   r   r   c                 S   s$   g | ]}t |d k d  jd  qS r   r/   Znonzeror1   r  r  r6   r6   r7   r  #  s     c                 S   s$   g | ]}t |d k d  jd  qS r  r  r  r6   r6   r7   r  $  s     )r   r/   r   r   fabsrB   r1   r   r   r   r   rC   )rE   rz  r  r  rK   r6   r6   r7   r    s    z!TestOrthoGroup.test_det_and_orthoc                    s|   d}d}d}t jd tj||dd tfdd D  fd	d
 D }fdd
|D }t|gt| | d S )NrM   rJ  r  i  rh   r  c                 3   s2   | ]*\  ft  fd dD fV  qdS )c                    s   g | ]}|   qS r6   r6   r  r  r6   r7   r  B  s     z6TestOrthoGroup.test_haar.<locals>.<genexpr>.<listcomp>Nr  r  r  r  r7   r  B  s     z+TestOrthoGroup.test_haar.<locals>.<genexpr>c                    s&   g | ]} D ]}||kr||fqqS r6   r6   r  r   r6   r7   r  C  s
        z,TestOrthoGroup.test_haar.<locals>.<listcomp>c                    s&   g | ]\}}t  |  | d  qS r  r  r  r  r6   r7   r  D  s     )r/   rr   r   r   r   r  r   r~  r  r6   r  r7   r  ,  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 Nrh   )r/   r   r   rr   r  r   )r  r   Z_sr   r6   r6   r7   random_orthoL  s     z<TestOrthoGroup.test_pairwise_distances.<locals>.random_orthor<   rN   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  r<   )r/   rv   )r  _)r  r   r6   r7   r  R  s   z\TestOrthoGroup.test_pairwise_distances.<locals>.generate_test_statistics.<locals>.<listcomp>rh   )r/   r   r   rr   r   r1   )r   r  Zepsstatsr  )r   r7   generate_test_statisticsQ  s
    zHTestOrthoGroup.test_pairwise_distances.<locals>.generate_test_statisticsr  )rJ  r  )
r/   rr   r   r   r   r  r   r   r   r   )rE   r  r  rM  r   Z_Dr  r6   r  r7   test_pairwise_distancesG  s    	z&TestOrthoGroup.test_pairwise_distancesN)r   r   r   r  r  r  r  r  r?   r   Zslowr  r6   r6   r6   r7   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 )TestRandomCorrelationc              	   C   sr   t jd d}t|}tj|dd}t ddddgdddd	gdddd
gdd	d
dgg}t|| t|| d S )Nr  r   rr  r   r   r   r   gѓ2ǿgA?gͿg4($?gR}%?gqTnƿ)r/   rr   r   r   r   r   r   )rE   r  rK   r   rM  r6   r6   r7   r  b  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dddg d S )	Ntestr   r	   r<   r=   rO   r  r{   )r   r@   r   r   r  r6   r6   r7   test_invalid_eigsn  s    z'TestRandomCorrelation.test_invalid_eigsc                 C   sR   d}t |}t |dd}t j|dd}|jdd}| }t|| t|| d S )Nr   r  r   r   )r   r   r   )rE   r  r>  r  r?  r@  r  r6   r6   r7   r  w  s    
z(TestRandomCorrelation.test_frozen_matrixc           
         s   dd  t jd  fddtddD }|dd	d	d	g 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 r.   )rv   )r   r	  r6   r6   r7   r     s    z3TestRandomCorrelation.test_definition.<locals>.normr  c                    s    g | ]} |t jj|d qS )rh   )r/   rr   r   r  r   r6   r7   r    s     z9TestRandomCorrelation.test_definition.<locals>.<listcomp>r<   rN   rO   r   c                 S   s   g | ]}d gt | qS )r   )r~  r  r	  r6   r6   r7   r    s     c                 S   s   g | ]}t |qS r6   )r   r   r$  r6   r6   r7   r    s     c                 S   s   g | ]}t t j|qS r6   )r/   r  r   r   r  r6   r6   r7   r    s     c                 S   s   g | ]}t |qS r6   )r/   prodr$  r6   r6   r7   r    s     r  r   c                 S   s   g | ]}t |qS r6   )r/   rX   r  r6   r6   r7   r    s     r   )r/   rr   r   r   rw  r   zipr   )
rE   r  rB   rz  r  Z
dets_knownZdiagsr'  r(  rK   r6   r#  r7   test_definition  s    z%TestRandomCorrelation.test_definitionc              	   C   sf  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 5 Q R X 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overrQ   gu <7~r   rf  r<   r   gMk   @)r/   r   r   r   Z_to_corrr   ZerrstateZ	nextafterr  r   r   )rE   rx  gZm0r6   r6   r7   test_to_corr  s"    
""z"TestRandomCorrelation.test_to_corrN)r   r   r   r  r"  r  r'  r*  r6   r6   r6   r7   r  a  s
   	$r  c                   @   s~   e Zd Zejdddgejdddddgdd	 Zejddd
ddgdd Zdd Zejddddgdd Z	dS )TestUniformDirectionr  r	   r=   ri   NrM   )rM   rO   c           
      C   sv   t jd}t||d}||}t |t | }}|j|||dj}|j|ksXt	t j
j|dd}	t|	d d S )Nl   Sid)_i4 r   rh   rQ   rk   r   )r/   rr   rs   r'   r   r   rC   r   r1   r]   r   r   r   )
rE   r  ri   ry   Zuniform_direction_distr	  r   r   Zexpected_shapeZnormsr6   r6   r7   rN    s    
z!TestUniformDirection.test_samplesr   r  r   c              	   C   s,   d}t jt|d t| W 5 Q R X d S )NzMDimension of vector must be specified, and must be an integer greater than 0.r:   )r?   r   r@   r'   r   )rE   r  rF   r6   r6   r7   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 )NrM   r  r   r   )r'   r   r   r  r6   r6   r7   test_frozen_distribution  s    
z-TestUniformDirection.test_frozen_distributionr<   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std S )
Nl   @9Y sr   r<   rh   r   r  r  '  r  )r/   rr   rs   r'   r   r   r   r   arctan2r  r   r    r   pvaluer]   )rE   r  ry   Zspherical_distZv1Zv2r	  s1s2ZanglesZuniform_distZkstest_resultr6   r6   r7   test_uniform  s    
z!TestUniformDirection.test_uniform)
r   r   r   r?   r   r   rN  r  r,  r2  r6   r6   r6   r7   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 )TestUnitaryGroupc                 C   s^   t jd td}tjddd}t dddgddd	gd
ddgg}t|| t|| d S )Nr  r=   r   y~p?yZ?y뉦?ĭ?y8Z?&4?yEHξr?8i?ye??+ݓݿyu=ٿB۽'?yqXQÿ?yN6ҿzܷy! 8l?2W'?)r/   rr   r   r   r   r   r   )rE   rK   r   rM  r6   r6   r7   r    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   r@   r   r   r  r6   r6   r7   r    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 )NrP   r  r   r   r	   rh   )r   r   r   r  r6   r6   r7   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  r6   r6   r7   r     s   
 z3TestUnitaryGroup.test_unitarity.<locals>.<listcomp>r<   r  r   r  r  )r   r   r/   r   Zconjr   rC   r1   )rE   rz  rK   r6   r6   r7   test_unitarity  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 )	NrM   rJ  r  rh   c                 S   s   g | ]}t j|qS r6   )r   r   Zeigvalsr  r6   r6   r7   r  4  s     z.TestUnitaryGroup.test_haar.<locals>.<listcomp>r<   r  )r/   rr   r   r   r   rv  r.  imagrealr    Zravelr   r  r   r   r/  )rE   r  r	  rz  r  rK   r2   r6   r6   r7   r  (  s     zTestUnitaryGroup.test_haarN)r   r   r   r  r  r  r4  r  r6   r6   r6   r7   r3     s
   	r3  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dddd	ddd
dddg
fdddgdddgdddgdddgdddggdddgdd d!gd dd"gd!d"dggd#d$d%d&d'd(gfgZejd)ed*d+ Zejd)ed,d- Zd.d/ Z	d0d1 Z
ed2d3d4 Zd5d6 Zd7d8 Zd9d: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@dA ZdBdC ZdDdE ZdFdG ZejdHdIdJgejdKddddgejdLddMejgdNdO Zd;S )PTestMultivariateTr	   r<   rO   r=   rM   r   g|	ߌ?gv
2R?g0$H?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?rQ   2   r   r   rj  rd  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   )rE   rK   r   r1   r  ansdistvalr6   r6   r7   test_pdf_correctness  s    
z&TestMultivariateT.test_pdf_correctnessc           	      C   s8   t |||dd}||}||}tt|| d S r9  )r#   r   r   r   r/   r   )	rE   rK   r   r1   r  r:  r;  r  r  r6   r6   r7   test_logpdf_correct  s    

z%TestMultivariateT.test_logpdf_correctc              
   C   s>   ddddddddddg
}t j|dd	}t|}t|| d S )
Nr  rP   rO   r	   r   rQ   r=   r  )r#   r   r$   r   )rE   rK   r<  r:  r6   r6   r7   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s8tt ddgd	d
gd
d	ggddd}|jdd}t|\}}||k std S )Nr{   r   r	   順 r  r   rh   rS   r=   r   rQ   *   )r#   r   r%   r]   r   )rE   Z	P_VAL_MINr;  r	  r  r  r6   r6   r7   &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 tt jdtjd |jdks>tt jdtjd |jdks\td S )Nr   r	   rP   rC  r@  r<   )	r#   r/   r   r   r   r]   r   Z
call_countr   )rE   Zmockr;  r6   r6   r7   !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 |sFtt||||}t |sftd}t j||f}t||||}|j	|fkstt||||}|j	|fksttt dt dd
 }t |std}tt dt ddj
|d}|j	|fkstd S )NrO         @rP   r	   rh   )r/   r   rC   r#   r   Zisscalarr]   r   rr   r1   r   )	rE   r  r   r1   r  rK   r2   Z	n_samplesri   r6   r6   r7   test_shape_correctness  s(    


 z(TestMultivariateT.test_shape_correctnessc                 C   s6   t  }t|jdg t|jdgg |jdks2td S )Nr   r	   r#   r   r   r1   r  r]   )rE   r;  r6   r6   r7   test_default_arguments  s    z(TestMultivariateT.test_default_arguments)NNNr   r	   r	   )NNrP   r   r	   rP   NrP   z*loc, shape, df, loc_ans, shape_ans, df_ansc                 C   s8   t |||d}t|j| t|j| |j|ks4td S )Nr   r1   r  rI  rE   r   r1   r  Zloc_ansZ	shape_ansZdf_ansr;  r6   r6   r7   test_default_args  s    z#TestMultivariateT.test_default_argsc                 C   s4   t |||}t|j| t|j| t|j| d S r.   )r#   r   r   r1   r  rL  r6   r6   r7   &test_scalar_list_and_ndarray_arguments  s    z8TestMultivariateT.test_scalar_list_and_ndarray_argumentsc                 C   s   ddgg}t ttft|d ddgddgddgg}t ttft||d td}td}d}t ttft|||d d}t ttft|||d d S )	Nr	   )r   r<   r=   )r   r1   rQ   rK  r   )r   r@   r#   r  r/   r   rC   )rE   r   r1   r  r6   r6   r7   test_argument_error_handling  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 )NrO   r=   rh   r<   rC  r   )r/   rr   r  r   rC   r#   r   r   )rE   ry   r   r1   r   Zdist2Zsamples1Zsamples2r6   r6   r7   r  	  s    
z&TestMultivariateT.test_reproducibilityc                 C   s6   t ddgddgddggddd}ttjjtf| d S )Nr   r	   F)r   r1   r  rI   )r  r   r/   r   r  r#   )rE   r4   r6   r6   r7   test_allow_singular	  s     z%TestMultivariateT.test_allow_singularri   )r   r=   )rM   rN   rO   r=   r  r  rX  c                 C   s<   t t|t||}|j|d}|j||f ks8td S r  )r#   r/   r   rC   r   r1   r]   )rE   ri   r  r  r;  r   r6   r6   r7   test_rvs	  s    zTestMultivariateT.test_rvs)r   r   r   Z	PDF_TESTSr?   r   r   r=  r>  rA  rE  r-   rF  rH  rJ  ZDEFAULT_ARGS_TESTSrM  r/   r   ZARGS_SHAPES_TESTSrN  rO  r  rP  r   rQ  r6   r6   r6   r7   r7  :  s   
(B


 **""..
$

r7  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dddddgdfdddddg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dddgdd&dg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,d-gfdgdgggdgdggddgd,d-ggfdgdggdggggddgd,d-gggfgd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? Zd@dA ZdBdC ZdDdE ZdFS )GTestMultivariateHypergeomzx, m, n, expectedr=   rO   rM   r   rP   gr   r?  r	   r<   rU   iir  r  rQ   ic                 C   s    t |||}t||dd d S )Ngư>r   )r   r  r   rE   rK   rx  r   rM  valsr6   r6   r7   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 )Nr=   r	   r   rM   rO   )rK   rx  r      )r   r   r   r  r  r   rP      )r   r  r"   r   r  r6   r6   r7   test_reduces_hypergeomG	  s    z0TestMultivariateHypergeom.test_reduces_hypergeomc                 C   s:   t ddgdd}|jddd}t|d| d	d
 d S )Nr=   rM   rO   rx  r   rJ  r  r~   r   r   r   r   r   r   r   rE   r   r   r6   r6   r7   rQ  R	  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 )Nr=   rM   r   rO   r  rY  rJ  r<   r  r~   r   r   r   rZ  r[  r6   r6   r7   test_rvs_broadcastingY	  s    z/TestMultivariateHypergeom.test_rvs_broadcastingzm, nr  c                 C   s8   t ||}t|}| }|||dk< t|| d S )Nr   )r   r   r/   r0   r  r   )rE   rx  r   r2   Zres_exr6   r6   r7   test_rvs_gh16171^	  s
    
z*TestMultivariateHypergeom.test_rvs_gh16171g zl?r  r  gQ?gE|?g
y?rN   gzp?c                 C   s    t |||}t||dd d S Nr   r   r   r  r   rT  r6   r6   r7   r  i	  s    z"TestMultivariateHypergeom.test_pmfrV  g ?r   r   c                 C   s    t |||}t||dd d S r_  r`  rT  r6   r6   r7   r  }	  s    
z/TestMultivariateHypergeom.test_pmf_broadcastingc                 C   sB   t jdddgdd}dddgdd	d
gdd
dgg}t||dd d S )Nr=   rP   r   r  rY  gf_?g&BUпgCx@ؿggs>d?gZsKg35?r  r   r   r   r   r  r6   r6   r7   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 )NrP   r  r   rV  r  r  rY  g?gg(\?g(\r  r   rO   rM   r   g333333?g333333ra  r  r6   r6   r7   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   rM   rO   rY  rV  r   r   r  r  r   )r   rT  r"   r   )rE   var0var1r6   r6   r7   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   rM   rO   r  rY  r   r  r   r	   r  g̍3eY?gI{?r   )r   rT  r   )rE   rc  rd  var2var3Zvar4Zvar5Zvar6r6   r6   r7   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   rM   rO   rY  rV  rb  r   r  r   r  r  g      @r`  )r   r   r"   r   rE   mean0r  r  Zmean3r6   r6   r7   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 )Nr=   rM   r   rO   r  rY  r   r   gUUUUUU@gUUUUUU@r  r   )r   r   r   )rE   rj  r  r6   r6   r7   r  	  s    z0TestMultivariateHypergeom.test_mean_broadcastingc                 C   s   t jdddgdd}t|dddg t jdddgdd}t|tjtjtjg t jdddgdddggdd}t|tjtjtjgdddggdd t jtg tjdd}t|g  t|j	d	k d S )
Nr   rY  r   r	   r<   r   FFg<r   r  )
r   r   r   r/   r  r   r   int_r   r1   ri  r6   r6   r7   test_mean_edge_cases	  s    
z.TestMultivariateHypergeom.test_mean_edge_casesc                 C   s   t jdddgdd}t|dddgdd t jdddgdd}t|tjtjtjg t jdddgdddggdd}t|tjtjtjgdddggdd t jtg tjdd}t|g  t|j	d	k d S )
Nr   rY  r   gؗҜ<r   r	   r<   rk  r  )
r   rT  r   r   r/   r  r   rl  r   r1   )rE   rc  rd  rf  rg  r6   r6   r7   test_var_edge_cases	  s    
z-TestMultivariateHypergeom.test_var_edge_casesc                 C   s   t jdddgdd}dddgdddgdddgg}t||dd t jdddgdd}dddgdddgdddg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   rY  r   rk  r   r   r   )r   r   r   r   r/   r   rl  Zfloat_rK  r   r1   )rE   Zcov0r  r  r  r  r  r6   r6   r7   test_cov_edge_cases	  s    
z-TestMultivariateHypergeom.test_cov_edge_casesc                 C   s   t jd d}ddddg}ddddgddddgdddd	gddddgddd
dgg}t j|t jd}t||}t||t||| t||t||| t|	 t	|| t|
 t
|| d S )Nr   r  rP   r  r     r   r	   r   r<   r  r   )r/   rr   r   r0   rl  r   r   r  r  rT  r   )rE   r   rx  rK   Z
mhg_frozenr6   r6   r7   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 )	NrM   r   rO   g      @rG  rV  g      %@g      /@)r   r@   r   r  	TypeErrorr  r6   r6   r7   test_invalid_params 
  s       z-TestMultivariateHypergeom.test_invalid_paramsN)r   r   r   r?   r   r   r/   ZNINFr  r  rX  rQ  r]  r^  r   rl  r  r  r  r  re  rh  r  r  rm  rn  ro  r   rr  r6   r6   r6   r7   rR  (	  s~    

 
 
 
"&&	

rR  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)r/   rr   rs   r  r6   r6   r7   get_rng
  s    zTestRandomTable.get_rngc              	   C   s  d}t jt|d tddggddg W 5 Q R X d}t jt|d tddgddgg W 5 Q R X d}t jt|d tddgddg W 5 Q R X d}t jt|d tddgdd	g W 5 Q R X d
}t jt|d tddgddg W 5 Q R X d}t jt|d tddgdddg W 5 Q R X d}t jt|d tddgdddg W 5 Q R X ddg}dddg}tddgdddg\}}}t|| t|| |t|kstd S )Nz`row` must be one-dimensionalr:   r	   r<   z`col` must be one-dimensionalz*each element of `row` must be non-negativerQ   z*each element of `col` must be non-negativerS   z'sums over `row` and `col` must be equalr   z(each element of `row` must be an integerg @z(each element of `col` must be an integerrf  r=   )	r?   r   r@   r&   Z_process_parametersr   r/   rv   r]   )rE   rF   rowcolr   r  r   r6   r6   r7   test_process_parameters
  s6    


z'TestRandomTable.test_process_parameterszscale,method))r	   boyett)r   	patefieldc                 C   s\   t ddg| }t dddg| }t}|j|||dd}|j||d dd}t|| d S )Nr	   r=   r<   methodr   )r/   r   r&   r   r   )rE   r   r{  ru  rv  ctrM  gotr6   r6   r7   test_process_rvs_method_on_None4
  s    z/TestRandomTable.test_process_rvs_method_on_Nonec              	   C   sD   ddg}dddg}d}t jt|d tj||dd W 5 Q R X d S )Nr	   r=   r<   z$'foo' not recognized, must be one ofr:   Zfoor{  )r?   r   r@   r&   r   )rE   ru  rv  rF   r6   r6   r7   $test_process_rvs_method_bad_argument@
  s
    
z4TestRandomTable.test_process_rvs_method_bad_argumentr>  )TFr   c              	      s  |   }ddgdddg tj dd|d}|r<t nt}t||rLd	nd
|sj fdd|rzfddn}tj|ddd\}}||}	t|	t| |dd |t|d }
t	|
|	d  |
d|jdd   }||}	|	jdkstt|	jd D ]F}t|	jd D ]0}|	||f }|||f }||}t	|| qq
dddgdddgg}t	tj|dd ||}	|	dkstdddgdddgg}t	tj|dd  ||}	|	dkstd}tjt|d |dg W 5 Q R X d}tjt|d |dgg W 5 Q R X d}tjt|d |tjgg W 5 Q R X d}tjt|d |dgg W 5 Q R X d}tjt|d |dddgg W 5 Q R X d}tjt|d |ddgddgg W 5 Q R X d S )Nr<   rN   r	   r=   rO   rJ  rx  ri   r{  r   r  r  c                    s   |  S r.   r6   rJ   )rv  original_methodru  r6   r7   r{  Z
  s    z/TestRandomTable.test_pmf_logpmf.<locals>.methodc                    s   t  | S r.   )r/   r   rJ   r  r6   r7   rL   \
      z1TestRandomTable.test_pmf_logpmf.<locals>.<lambda>r   Trl   Zreturn_countsr{   r   )r   r   rQ   rk   rS   z$`x` must be at least two-dimensionalr:   z%`x` must contain only integral valuesrf  z)`x` must contain only non-negative valuesz"shape of `x` must agree with `row`z"shape of `x` must agree with `col`)rt  r&   r   rY   r/   uniquer   r~  r   r   rK  r1   r]   r   rv   r?   r   r@   r  )rE   r>  r   ry   r   objr  
unique_rvscountsr  p2Zrvs_ndr   r   ZpijZrvijZqijrK   rF   r6   )rv  r{  r  ru  r7   test_pmf_logpmfI
  sn    

 zTestRandomTable.test_pmf_logpmfr{  )rx  ry  c                 C   s   |   }ddg}dddg}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 )Nr<   rN   r	   r=   rO   rJ  r  r   r  r  rQ   rk   r\  rS   )rJ  r=   )	rt  r&   r   r   r   r/   rv   r   Zbroadcast_to)rE   r{  ry   ru  rv  r   r   r6   r6   r7   test_rvs_mean
  s    
zTestRandomTable.test_rvs_meanc                 C   sp   |   }ddg}dddg}tj||dd|d}tj||dd	|d}tj|d
d}tj|d
d}t||dd d S )Nr<   rN   r	   r=   rO   r-  rx  r  ry  r   rk   {Gz?r  )rt  r&   r   r/   rT  r   )rE   ry   ru  rv  r?  r@  r  r  r6   r6   r7   test_rvs_cov
  s    
zTestRandomTable.test_rvs_covc           
   	   C   sb  ddg}dddg}t j||||  d}|jdks6tt j||d||  d}|jd	ks\tt||d
  t j||d
||  d}|jdkstt j||d||  d}|jdkstt j||d||  d}|jdkstt|ddd|dd d}	tj	t
|	d t j||d||  d W 5 Q R X tj	t
|	d  t j||tj||  d W 5 Q R X d S )Nr<   rN   r	   r=   rO   rz  r+  r  r  r   )r   r<   r=   r  )r  r<   r=   )rO   rM   )rO   rM   r<   r=   r  r   z/`size` must be a non-negative integer or `None`r:   rQ   )r&   r   rt  r1   r]   r   r   rK  r?   r   r@   r/   r  )
rE   r{  ru  rv  r   Zrv2Zrv3Zrv4Zrv5rF   r6   r6   r7   test_rvs_size
  sB    

zTestRandomTable.test_rvs_sizec           	      C   sj   ddg}dddg}t }|j||d||  d}tj|dd	d
\}}||||}t|t| |dd d S )Nr<   rN   r	   r=   rO   rB  r  r   Tr  r  r   )r&   r   rt  r/   r  r  r   r~  )	rE   r{  ru  rv  r|  r   r  r  r  r6   r6   r7   test_rvs_method
  s    
zTestRandomTable.test_rvs_methodc                 C   s   dddg}ddddg}t ||}|jd||  d}tdt|t|f}ddddgddddgddddgg|d< t|| d S )Nr   r	   rJ  rz  .r&   r   rt  r/   r   r~  r   rE   r{  ru  rv  r  r   rM  r6   r6   r7   test_rvs_with_zeros_in_col_row
  s    




z.TestRandomTable.test_rvs_with_zeros_in_col_row)Nrx  ry  rv  r   ru  c                 C   sD   t ||}|jd||  d}tdt|t|f}t|| d S )Nr   rz  r  r  r6   r6   r7   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dddgtjd}t|d| }t|}||||d|  }|j	dt
|t
|fkstt||kstd S )Nr   r	   r=   r   r<   Z	rvs_rcont)Zscipy.stats._rcontr  _rcontr/   r   Zint64rY   rv   rt  r1   r~  r]   )rE   r   r  ru  rv  r   Zntotresultr6   r6   r7   test_rvs_rcont
  s    
zTestRandomTable.test_rvs_rcontc                 C   s   ddg}dddg}t |||  d}| }t ||}t||  t |||}t||| t |||}t||| d S )Nr<   rN   r	   r=   rO   r   )r&   rt  r   r   r   r  r  )rE   ru  rv  r  r  rM  r6   r6   r7   r     s    
zTestRandomTable.test_frozenc                 C   sX   ddg}dddg}t |||  d}t j||d||  d}|jd|d	}t|| d S )
Nr<   rN   r	   r=   rO   r   r   r  )ri   r{  )r&   rt  r   r   )rE   r{  ru  rv  r  rM  r}  r6   r6   r7   test_rvs_frozen+  s    
zTestRandomTable.test_rvs_frozenN)r   r   r   rt  rw  r?   r   r   r~  r  r  r  r  r  r  r  r  r  r   r  r6   r6   r6   r7   rs  
  s8   $

	N

)


rs  c                 C   sd   | j }d| _ | j|ddi t| }| j|ddi}t|}|j|ddi}t|| || _ d S )Nr   ri   r  )r   r   pickledumpsloadsr   )distfnr4   r  r   Zr0Z	unpickledZr1r6   r6   r7   check_pickling6  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dd	d
gfgtdgt	dgg}|D ]\}}t
|| t|| qhd S )Nr=   r   r   r  r6   r   r   rM   rs  r{   r   )r/   rC   r   r   r   r   r   r   r   r   r,   r  )r   distsr  r4   r6   r6   r7   test_random_state_propertyJ  s    


	
r  )O__doc__r  Znumpy.testingr   r   r   r   r   r   r?   r   r   Ztest_continuous_basicr
   r  r/   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)   Zscipy.integrater*   Zscipy.specialr+   Zcommon_testsr,   Zunittest.mockr-   r8   r9   r   r   r0  rO  r  r  r  r  r  r  r  r+  r3  r7  rR  rs  r  r  r6   r6   r6   r7   <module>   sb    l F     I B @   %Ejg8: o e  ,