U
    Gvf                     @   s  d dl Z d dlmZ d dlmZmZ d dlZd dlZd dl	m
Z
mZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZmZmZmZmZmZ G d
d dZG dd dZG dd dejZdd Z dd Z!dd Z"dd Z#G dd dZ$G dd de$Z%G dd de$Z&G dd de$Z'G d d! d!e$Z(G d"d# d#Z)G d$d% d%Z*G d&d' d'Z+G d(d) d)Z,d*d+ Z-dS ),    N)Counter)combinationsproduct)assert_allcloseassert_equalassert_array_equal)distance)shapiro)_test_find_index)qmc)van_der_corputn_primesprimes_from_2_toupdate_discrepancy	QMCEngine_l1_norm_perturb_discrepancy&_lloyd_centroidal_voronoi_tessellationc                   @   sd   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S )	TestUtilsc                 C   s(  dgdgdgg}dgdgdgg}t j|ddd}t|| ddgddgddgg}tddgddgg}ddgddgdd	gg}t j||d |d d}t|| t j||d |d d
d}t|| dddgdddgdddgg}ddddg }}dddgdddgdd	dgg}t j|||d}t|| d S )Nr            ?      l_boundsu_bounds         @Tr   r   reverse         ?)r   scaler   nparray)selfspaceoutZscaled_spaceboundsZscaled_back_spacer   r    r*   >/tmp/pip-unpacked-wheel-96ln3f52/scipy/stats/tests/test_qmc.py
test_scale   s&    

 
zTestUtils.test_scalec                 C   sf   t jd}|d}|d d }|dd }tj|||dd}tj|||dd}t|| d S )Nl	   EaT4G*wv    
   r/   F)r    T)r$   randomdefault_rngr   r#   r   )r&   rngsampleabZscaledZunscaledr*   r*   r+   test_scale_random3   s    
zTestUtils.test_scale_randomc              	   C   s
  t jtdd  dddg}tj|ddd W 5 Q R X t jtd	dJ ddgddgddgg}tddgdd
gg}tj||d |d d W 5 Q R X t jtdd@ ddgddgddgg}dddgdd
g }}tj|||d W 5 Q R X t jtddN ddgddgddgg}tdddgdd
d
gg}tj||d |d d W 5 Q R X t jtddJ ddgddgddgg}tddgdd
gg}tj||d |d d W 5 Q R X t jtddL ddgdd
gddgg}tddgdd
gg}tj||d |d dd W 5 Q R X d S )NSample is not a 2D arraymatchr   r   r   r   r   r   zBounds are not consistentr   z/'l_bounds' and 'u_bounds' must be broadcastabler   Sample is not in unit hypercuber"   zSample is out of bounds   r   Tr   )pytestraises
ValueErrorr   r#   r$   r%   )r&   r'   r)   r   r   r(   r*   r*   r+   test_scale_errors<   s2    
"""zTestUtils.test_scale_errorsc                 C   s  t ddgddgddgddgddgddgg}d| d d	 }t ddgddgddgddgddgddgg}d| d d	 }tt|d
dd tt|ddd t ddddddgddddddgddddddgddddddgddddddgddddddgddddddgg}d| d d }ttj|ddddd ttj|ddddd ttj|ddddd dD ]8}t d|  }ttjt dg| gdd| qld S )Nr   r!   r   r      r          @      ?      (@ǘ?-C6?Zatolg/$?      @MDmethodr   WDS?CD:M?r   r@   r;          @   L2-star)r$   r%   r   r   discrepancysqrt)r&   space_1Zspace_2r3   dimrefr*   r*   r+   test_discrepancy^   s>    ..zTestUtils.test_discrepancyc              	   C   s   t ddgddgddgddgddgddgg}tjtdd t| W 5 Q R X tjtd	d tddg W 5 Q R X d
d
gddgddgg}tjtdd tj|dd W 5 Q R X d S )Nr   r!   r   r   r@   r   r:   r8   r7   r   r   z'toto' is not a valid ...totorI   )r$   r%   r<   r=   r>   r   rT   )r&   r3   r*   r*   r+   test_discrepancy_errors   s    . z!TestUtils.test_discrepancy_errorsc                 C   sn  t ddddddgddddddgddddddgddddddgddddddgddddddgddddddgg}d| d d }ttj|dddd	d
d ttj|ddddd
d ttj|ddddd
d dD ]8}t d|  }ttjt dg| gddd| q|tddd  tj	t
dd tj|dd W 5 Q R X tj	tdd tj|dd W 5 Q R X d S )Nr   r   rA   rB   rG   rH   r;   )rJ   workersr   rE   rF   rK   rL   rM   rN   rO   r!   rS   	cpu_countc                   S   s   d S Nr*   r*   r*   r*   r+   <lambda>       z5TestUtils.test_discrepancy_parallel.<locals>.<lambda>zCannot determine ther8   r\   zInvalid number of workers...r   )r$   r%   r   r   rT   rU   setattrosr<   r=   NotImplementedErrorr>   )r&   Zmonkeypatchr3   rW   rX   r*   r*   r+   test_discrepancy_parallel   sD     z#TestUtils.test_discrepancy_parallelc              	   C   s  t ddgddgddgddgddgddgg}d| d d	 }tj|d d
 dd}t|d
 |d d
 |}t|ddd t jd}|d}t|}tj|d d
 dd}t|d
 |d d
 |}t||dd tj	t
dd" t|d
 |d d
 d | W 5 Q R X tj	t
dd t|d
 |d | W 5 Q R X ddg}tj	t
dd t||d d
 | W 5 Q R X ddgg}tj	t
dd t||d d
 | W 5 Q R X dddg}tj	t
dd t||d d
 | W 5 Q R X d S )Nr   r!   r   r   r@   r   rA   rB   rC   r]   T)Z	iterativerD   rE   rF   l	   gy,!uUxFYo9"] )r@   r/   r:   r8   r7   r   zx_new is not in unit hypercuber   zx_new is not a 1D arrayg333333?皙?z&x_new and sample must be broadcastable)r$   r%   r   rT   r   r   r0   r1   r<   r=   r>   )r&   rV   Z	disc_initZ	disc_iterr2   Zdisc_refZx_newr*   r*   r+   test_update_discrepancy   s0    .

&

z!TestUtils.test_update_discrepancyc           
      C   s   t jd}tjd|d}|d}t|}tdD ]p}|d}|d}|d}t|||||}|||f |||f  |||f< |||f< t|}	t	||	 q6d S )Nl	   PvWuW=lWx" r   seedr/   d   )
r$   r0   r1   r   LatinHypercuberT   rangeintegersr   r   )
r&   r2   Zqmc_genr3   disciZrow_1Zrow_2colZdisc_referencer*   r*   r+   test_perm_discrepancy   s    





 

zTestUtils.test_perm_discrepancyc           	      C   s   dd }dd }dd }dd }t jd	}|d
}tj|dd}||}t|| tj|dd}||}t|| tj|dd}||}t|| tj|dd}||}t|| dS )z,Alternative definitions from Matt Haberland.c              
   S   s   | j \}}| }ttjddt|d   dt|d d   dd}| d d d d d f }| d d d d d f }ttjtjddt|d   dt|d   dt||   dddd}d| d| |  d|d  |  S )Nr   r   r   Zaxisr   gUUUUUU?shaper$   sumprodabsxnsxijZdisc1xkjZdisc2r*   r*   r+   disc_c2   s.    

zFTestUtils.test_discrepancy_alternative_implementation.<locals>.disc_c2c              	   S   s   | j \}}| d d d d d f }| d d d d d f }ttjtjdt||  t|| d  dddd}d|  d|d  |  S )Nr"   r   rs   r   gUUUUUU?r   rt   )rz   r{   r|   r}   r~   ro   r*   r*   r+   disc_wd  s    
zFTestUtils.test_discrepancy_alternative_implementation.<locals>.disc_wdc              
   S   s  | j \}}| }ttjddt|d   dt|d d   dd}| d d d d d f }| d d d d d f }ttjtjddt|d   dt|d   dt||   dt|| d   ddd	d}d
| d| |  d|d  |  S )Ng?      ?r   r   r   rs   g      ?      ?r   gUUUUUU?rt   ry   r*   r*   r+   disc_md  s2    

zFTestUtils.test_discrepancy_alternative_implementation.<locals>.disc_mdc              
      sl   j \ }td|  dd|    ttjdd  dd  t fddt D  d   S )Nr!   r   r   rs   c                    sH   g | ]@}t  D ]2}td t|ddf |ddf  qqS )r   N)rm   r$   rw   maximum).0kjr{   rz   r*   r+   
<listcomp>!  s    
 z_TestUtils.test_discrepancy_alternative_implementation.<locals>.disc_star_l2.<locals>.<listcomp>)ru   r$   rU   rv   rw   rm   )rz   r|   r*   r   r+   disc_star_l2  s    
zKTestUtils.test_discrepancy_alternative_implementation.<locals>.disc_star_l2l	   j;<Q`siyX r-   rM   rI   rK   rH   rS   N)r$   r0   r1   r   rT   r   )	r&   r   r   r   r   r2   r3   Z	disc_currZdisc_altr*   r*   r+   +test_discrepancy_alternative_implementation   s$    




z5TestUtils.test_discrepancy_alternative_implementationc                 C   sL   t d}|d dkstt d}|d dks0tt d}|d dksHtd S )Nr/   r]         i  i^  i5	  )r   AssertionError)r&   primesr*   r*   r+   test_n_primes:  s    zTestUtils.test_n_primesc                 C   s8   t d}dddddddd	d
ddddddg}t|| d S )N2   r   r!   r                     r      %   )   +   /   )r   r   )r&   r   r(   r*   r*   r+   test_primesD  s    "zTestUtils.test_primesN)__name__
__module____qualname__r,   r6   r?   rY   r[   rf   rh   rr   r   r   r   r*   r*   r*   r+   r      s   	"%#*J
r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestVDCc              
   C   sx   t d}dddddddd	d
dg
}t|| t ddd}t|| t ddd}t|| t ddd}t||dd   d S )Nr/           r   r   r         ?      ?      ?      ?g      ?g      ?r@   rb   r;   r   r!   )start_indexr   r   )r&   r3   r(   r*   r*   r+   test_van_der_corputK  s       


zTestVDC.test_van_der_corputc                 C   s   d}t dd|d}t ddd|d}t||dd   t ddd|dd	}t||dd   t ddd|d
d	}t||dd   d S )Nl	   	XCf
Kl<{O8 r/   Tscramblerj   r   r!   )r   r   rj   r@   )r   r   rj   r\   r;   r   )r&   rj   r(   r3   r*   r*   r+   test_van_der_corput_scrambleZ  s(            z$TestVDC.test_van_der_corput_scramblec              	   C   s*   t jtdd tddd W 5 Q R X d S )Nz'base' must be at least 2r8   r/   r   )base)r<   r=   r>   r   r&   r*   r*   r+   test_invalid_base_errork  s    zTestVDC.test_invalid_base_errorN)r   r   r   r   r   r   r*   r*   r*   r+   r   J  s   r   c                       s.   e Zd Zd fdd	Zd	ddddZ  ZS )
RandomEngineNc                    s   t  j|||d d S )N)doptimizationrj   )super__init__)r&   r   r   rj   	__class__r*   r+   r   q  s    zRandomEngine.__init__r   rb   c                C   s   | j || jf}|S r_   )r2   r0   r   )r&   r{   r\   r3   r*   r*   r+   _randomt  s    zRandomEngine._random)NN)r   )r   r   r   r   r   __classcell__r*   r*   r   r+   r   p  s   r   c                  C   s   t ddd} | jdd}| jdd}| jdks2t|   | jdksHt| jdd}t|| |   | jdd | jdd}t|| | jdkstd S )	Nr   l	   F,@IY^+Ge ri   r   r{   r      r   )r   r0   num_generatedr   resetr   fast_forward)engineZsample_1Zsample_2Zsample_1_testZsample_2_testr*   r*   r+   test_subclassing_QMCEnginey  s    

r   c               	   C   s|   t jtdd td W 5 Q R X t jtdd td W 5 Q R X d} t jt| d td}|jddd W 5 Q R X d S )	Nz d must be a non-negative integerr8   )r   r]   z*'u_bounds' and 'l_bounds' must be integersr   g?r   )r<   r=   r>   r   rn   )msgr   r*   r*   r+   test_raises  s    r   c                  C   s$  t ddd} | jddd}tt|dg |jtdks@t| jdddd	}tt|ddg d
}d}|   | d}|||  | }t	|
tj}|   | j||ddd}t|| | j||ddd}t| | f||d f | j||ddd}t| | f||f d S )Nr   l	   llG[/Ww ri   r/   r   r   int64T)r{   endpointr      Fr   r{   r   rk   )r   rn   r   r$   uniqueZdtyper   r   r0   floorastyper   minmax)r   r3   lowhigh
ref_sampler*   r*   r+   test_integers  s&    

r   c                  C   s   d} t jd}|jdd| d}|jdd| dd	}t| |d
}|j||ddd}t|jdd| t|jdd|d  |j||ddd}t|jdd| t|jdd| d S )Nr/   l	   G]	#0m$ave r   r]   )r   r   sizer   r   T)r   r   r   r   ri   rk   Fr   r   rs   )r$   r0   r1   rn   r   r   r   r   )r   r2   r   r   r   r3   r*   r*   r+   test_integers_nd  s    r   c                   @   sj  e Zd ZdZeZeZeZeZddgZ	ddgZ
eedddZeejdd	d
Zejjde	e
ddd Zejjde	e
ddd Zejjde	e
ddd Zejjde	e
ddd Zejjde	e
ddd Zejjde	e
ddd Zejjde	e
ddd Zejjde	e
ddd Zejddgdd Zdd  Zejd!d"ejfd#d$d% fgd&d' Z d(S ))QMCEngineTestszGeneric tests for QMC engines.TFZ	ScrambledZUnscrambled)r   returnc                 K   sN   t jd}| jr(| jf ||d|S |r6t  n| jf d|i|S d S )Nl	   \v$PdvuL2+C r   rj   )r$   r0   r1   can_scrambleqmcer<   skip)r&   r   kwargsrj   r*   r*   r+   r     s    
zQMCEngineTests.enginec                 C   s   |r
| j S | jS r_   )scramble_ndunscramble_nd)r&   r   r*   r*   r+   	reference  s    zQMCEngineTests.referencer   )idsc                 C   s,   | j d|d}|d}ttd| d S )Nr   r   r   r@   )r@   r   r   r0   r   r$   emptyr&   r   r   r3   r*   r*   r+   	test_0dim  s    
zQMCEngineTests.test_0dimc                 C   s,   | j d|d}|d}ttd| d S )Nr   r   r   r   r   r   r   r*   r*   r+   test_0sample  s    
zQMCEngineTests.test_0samplec                 C   s*   | j d|d}|d}d|jks&td S )Nr   r   r   r   r   )r   r0   ru   r   r   r*   r*   r+   test_1sample  s    
zQMCEngineTests.test_1samplec                 C   s@   | j d|d}|d}t|dks*tt|dks<td S )Nrk   r      r   r   )r   r0   r$   allr   r   r*   r*   r+   test_bounds  s    
zQMCEngineTests.test_boundsc                 C   sN   | j |d}| jd|d}|jt|d}t||dd |jt|ksJtd S )Nr   r   r   r   rg   rF   )r   r   r0   lenr   r   r   )r&   r   r   r   r3   r*   r*   r+   test_sample   s
    zQMCEngineTests.test_samplec                 C   sf   | j d|d}|jdd}| j d|d}t|d }|j|d}|j|d}t|||d  dd d S )Nr   r   r;   r   rg   rF   )r   r0   r   r   )r&   r   r   r   Zn_half_r3   r*   r*   r+   test_continuing	  s    zQMCEngineTests.test_continuingc                 C   sJ   | j d|d}|jdd}|  |jdks0t|jdd}t|| d S )Nr   r   r;   r   r   )r   r0   r   r   r   r   )r&   r   r   r   r3   r*   r*   r+   
test_reset  s    zQMCEngineTests.test_resetc                 C   s   | j d|d}|jdd}| j d|d}|d |jdd}t||dd  dd |  g }tdD ]*}|d dkr||  qh|d	 qht|d
d tdD  t|dd d S )Nr   r   r;   r   r@   rg   rF   r   r   c                 S   s   g | ]}|d  dkr|qS )r   r   r*   )r   rp   r*   r*   r+   r   6  s      z4QMCEngineTests.test_fast_forward.<locals>.<listcomp>h㈵>)	r   r0   r   r   r   rm   appendr$   concatenate)r&   r   r   r   r3   Z
even_drawsrp   r*   r*   r+   test_fast_forward!  s"    
z QMCEngineTests.test_fast_forwardc                 C   s   d}| j ||d}|d}ttj|ddtd|dd ttj|d	ddtd
|dd ttj|dddtd|dd d S )Nr   r   i   r   rs   r   {Gz?rF      r   K   r   )r   r0   r   r$   meanrepeatZ
percentile)r&   r   r   r   r3   r*   r*   r+   test_distribution;  s$    
 
  
  
 z QMCEngineTests.test_distributionc              	   C   s2   d}t jt|d | jdddd W 5 Q R X d S )Nz)'toto' is not a valid optimization methodr8   r   FrZ   r   r   r   )r<   r=   r>   r   r&   messager*   r*   r+   test_raises_optimizerJ  s    z$QMCEngineTests.test_raises_optimizerzoptimization,metric	random-CDZlloydc                 C   s
   t |  S r_   )r   r3   r*   r*   r+   r`   S  ra   zQMCEngineTests.<lambda>c           	      C   sV   | j ddd}|jdd}||}| j dd|d}|jdd}||}||k sRtd S )Nr   Fr   rR   r   r   )r   r0   r   )	r&   r   Zmetricr   Z
sample_refZ
metric_refZoptimal_Zsample_Zmetric_r*   r*   r+   test_optimizersO  s    zQMCEngineTests.test_optimizersN)!r   r   r   __doc__NotImplementedr   r   r   r   r   r   boolr   r   r$   Zndarrayr   r<   markparametrizer   r   r   r   r   r   r   r   r   r   r   rT   r   r*   r*   r*   r+   r     sF   











r   c                   @   s   e Zd ZejZdZe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Z	e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Z
d!d" Zd#S )$
TestHaltonTr   r   gUUUUUU?r   gUUUUUU?r   gqq?r   gqq?r   g98?r   gqq?r   grq?g{'?gg_p?gz'd?gU?g{'?gvcj?g oO(?gɭj?g{'?gR2?gAP?givܟ?g{'?g9?g oO(?g-](f?c                 C   sp   | j dd}| jddd}|jt|dd}t||dd |  |d	}|  |jd	dd
}t|| d S )NTr   r   r   r;   )r{   r\   gMbP?rF   r/   rb   )r   r   r0   r   r   r   rn   r   )r&   r   r   r3   r*   r*   r+   test_workerss  s    
zTestHalton.test_workersN)r   r   r   r   ZHaltonr   r   r$   r%   r   r   r  r*   r*   r*   r+   r  a  s(      
	r  c                   @   st   e Zd ZejZdZdd Zdd Zdd Z	e
jdd	d
ge
jdddge
jdddgdd Zdd ZdS )TestLHSFc                 G   s   t d d S NzNot applicable: not a sequence.r<   r   r&   argsr*   r*   r+   r     s    zTestLHS.test_continuingc                 G   s   t d d S r  r  r	  r*   r*   r+   r     s    zTestLHS.test_fast_forwardc                 G   s   t d d S NzJNot applicable: the value of reference sample is implementation dependent.r  r	  r*   r*   r+   r     s    zTestLHS.test_samplestrengthr   r   r   Tr   Nr   c                 C   s^  t jd}d}|d }d}tj|||||d}|j|d}	|	j||fksNt|j|ks\tt |d | }
t 	|
||fj
}t |	|kstt j|	dd	}|rd| nd}t|||d
 t |	| |kst|dkrZ|d krZt |}tt||}tt|jdD ]H\}}|	d d ||gf }|| t}tdd |D }t|| qd S )Nl	   pIrtS"Md@B r   r   r   )r   r   r  r   rj   r   r   r   rs   rF   c                 s   s   | ]}t |V  qd S r_   )tuple)r   rowr*   r*   r+   	<genexpr>  s     z1TestLHS.test_sample_stratified.<locals>.<genexpr>)r$   r0   r1   r   rl   ru   r   r   ZarangeZbroadcast_toTanysortr   setr   r   rm   r   r   intr   )r&   r   r   r  rj   pr{   r   r   r3   Z
expected1dexpectedZsorted_sampleZtolZunique_elementsZdesiredrp   r   Z
samples_2dresZres_setr*   r*   r+   test_sample_stratified  s6    
zTestLHS.test_sample_stratifiedc              	   C   s   d}t jt|d tjddd W 5 Q R X d}t jt|d tjddd}|d	 W 5 Q R X d}t jt|d tjddd}|d
 W 5 Q R X d}t jt|d tjd
dd}|d W 5 Q R X d}t jt|d tjddd W 5 Q R X d S )Nznot a valid strengthr8   r   r!   )r  z%n is not the square of a prime numberr   )r   r  rP   r   zn is too small for d	   z'centered' is deprecatedT)Zcentered)r<   r=   r>   r   rl   r0   warnsUserWarning)r&   r   r   r*   r*   r+   r     s$    zTestLHS.test_raises)r   r   r   r   rl   r   r   r   r   r   r<   r  r  r  r   r*   r*   r*   r+   r    s   %r  c                   @   s   e Zd ZejZdZe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Z	e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Z
dd Zdd Zdd Zd d! Zejd"d#d$gd%d& Zd'd( Zd)S )*	TestSobolTr   r   r   r   r   r   r   r   ga6?gtAAz?g`?g_k m?gsAdn?grIâ?gqL?g|?g+&C?g#*H;?g&fb_?g]bnQ?gvD2(?gt|!?g$\?g4>z@?c              	   C   s2   t jtdd td}|d W 5 Q R X d S )N'The balance properties of Sobol' pointsr8   r   r/   )r<   r  r  r   Sobolr0   r&   r   r*   r*   r+   test_warning  s    
zTestSobol.test_warningc              	   C   sr   t jddd}|d}t| jd d | |d}t| jdd | tjtdd |d W 5 Q R X d S )Nr   Fr   r@   r;   r  r8   )r   r  Zrandom_base2r   r   r<   r=   r>   r&   r   r3   r*   r*   r+   test_random_base2  s    

zTestSobol.test_random_base2c              	   C   sX   t jtdd ttjjd  W 5 Q R X t jtdd tjddd W 5 Q R X d S )Nz Maximum supported dimensionalityr8   r   zMaximum supported 'bits' is 64A   )bits)r<   r=   r>   r   r  ZMAXDIMr   r*   r*   r+   
test_raise  s    zTestSobol.test_raisec                 C   s^   t jddd}t|   }t|   }t|tddi t|tddi d S )NiW  Fr   r   r   )r   r  r   r0   flattentolistr   )r&   r   Zcount1Zcount2r*   r*   r+   test_high_dim  s
    zTestSobol.test_high_dimr$  r   r!   c              	   C   s\   t jdd|d}d| }||}t| jd | | tjtdd |  W 5 Q R X d S )Nr   Fr   r$  zincreasing `bits`r8   )r   r  r0   r   r   r<   r=   r>   )r&   r$  r   nsr3   r*   r*   r+   	test_bits  s    
zTestSobol.test_bitsc                 C   s*   t jdddd}|d}t| j| d S )Nr   FrR   r)  r;   )r   r  r0   r   r   r!  r*   r*   r+   test_64bits  s    
zTestSobol.test_64bitsN)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    s6   


		
	r  c                   @   sN   e Zd ZejZdZdd Zdd Zdd Z	dd	 Z
d
d Zdd Zdd ZdS )TestPoissonFc                 G   s   t d d S )NzToo costly in memory.r  r	  r*   r*   r+   r      s    zTestPoisson.test_boundsc                 G   s   t d d S )Nz"Not applicable: recursive process.r  r	  r*   r*   r+   r   #  s    zTestPoisson.test_fast_forwardc                 G   s   t d d S r  r  r	  r*   r*   r+   r   &  s    zTestPoisson.test_samplec                 G   s   d}d}| j d|dd}|j|d}t||ks4tt||ksDt|j|d}t||ks`tt||kspttj||gdd}t||d kstt||kstd S )	N皙?r   r   F)r   radiusr   r   r   rs   )r   r0   r   r   l2_normr$   r   )r&   r
  r/  r*  r   Zsample_initZsample_continuedr3   r*   r*   r+   r   *  s    zTestPoisson.test_continuingc                 C   s   t jd}d}d\}}|| |d | }dddg}dd	g}t|||}|D ]F\}	}
}| j|	|
||d
}||}t||kstt||
ksPtqPd S )Nl	   x_4vZ.c r   )g{Gz?皙?r   r   r!   r@   volumeZsurface)r   r/  hypersphererj   )r$   r0   r1   r   r   r   r   r0  )r&   r2   r*  r   r   ZradiiZ
dimensionsZhypersphere_methodsgenr   r/  r3  r   r3   r*   r*   r+   test_mindist=  s"    
   
zTestPoisson.test_mindistc                 C   s.   d}| j d|d}| }t||ks*td S )Nr1  r   )r   r/  )r   Z
fill_spacer0  r   )r&   r/  r   r3   r*   r*   r+   test_fill_spaceR  s    zTestPoisson.test_fill_spacec              	   C   s0   d}t jt|d tjddd W 5 Q R X d S )Nz*'toto' is not a valid hypersphere samplingr8   r   rZ   )r3  )r<   r=   r>   r   PoissonDiskr   r*   r*   r+   r   Z  s    zTestPoisson.test_raisesN)r   r   r   r   r7  r   r   r   r   r   r   r5  r6  r   r*   r*   r*   r+   r-    s   r-  c                   @   sL   e Zd Zdd Zejddd Zdd Zdd	 Z	ejdd
d Z
dS )TestMultinomialQMCc              	   C   s   t dddddg}tjtdd tj|dd	 W 5 Q R X t ddd
ddg}d}tjt|d tj|dd	 W 5 Q R X t dddddg}d}tjt|d tj|dtjddd W 5 Q R X d}tjt|d tj|dt j	 d W 5 Q R X d S )NQ?p=
ף?gffffff?)\(?z'Elements of pvals must be non-negative.r8   r/   )n_trialsrg   z Elements of pvals must sum to 1.r.  z Dimension of `engine` must be 1.r   r   )r=  r   "`engine` must be an instance of...)
r$   r%   r<   r=   r>   r   MultinomialQMCr  r0   r1   )r&   r  r   r*   r*   r+   test_validationsa  s    "z#TestMultinomialQMC.test_validationszignore::UserWarningc                 C   sZ   t jd}t dddddg}t ddd	d
dgg}tj|d|d}t|d| d S )Nl	   (u@gP{- r9  r:  r.  r;  r<  r      r   #      rk   r=  rj   r   )r$   r0   r1   r%   r   r@  r   )r&   rj   r  r  r   r*   r*   r+   test_MultinomialBasicDrawx  s
    z,TestMultinomialQMC.test_MultinomialBasicDrawc                 C   s\   t jd}t dddddg}tj|d|d}|d	}t|t | t |d
d d S )Nl	   8X7:ct]+C: r9  r:  r.  r;  r<  i    rE  r   rE   rF   )	r$   r0   r1   r%   r   r@  r   rv   Z
atleast_2d)r&   rj   r  r   Zdrawsr*   r*   r+   test_MultinomialDistribution  s
    
z/TestMultinomialQMC.test_MultinomialDistributionc              
   C   s   t ddddddddg}t|}tt||d	d
 tt||dd tt||dd tt||dd tt||d|d  d S )Nrg   皙?g?g333333?r   ?gGz?rB   r   r   r   gaۢ?g7?r!   r   )r$   r%   r   r   r
   )r&   Zp_cumulativer   r*   r*   r+   test_FindIndex  s    z!TestMultinomialQMC.test_FindIndexc                 C   sl   t jd}t dddddg}t ddd	d
dgg}tjdd|d}tj|d||d}t|d| d S )Nl	   aFkq|'x< r9  r:  r.  r;  r<  r   r   r   $   rD  r   Tr   rk   )r=  r   rj   )r$   r0   r1   r%   r   r  r@  r   )r&   rj   r  r  base_enginer   r*   r*   r+   test_other_engine  s    
z$TestMultinomialQMC.test_other_engineN)r   r   r   rA  r<   r  filterwarningsrF  rG  rJ  rM  r*   r*   r*   r+   r8  `  s   

	
r8  c                   @   sD   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S )TestNormalQMCc                 C   s   t jtdd}| }t|jd |jdd}t|jd t jtdd}| }t|jd |jdd}t|jd	 d S )
Nr   )r   r   r   r   r   r   r   r   r   r   r   r   MultivariateNormalQMCr$   zerosr0   r   ru   r&   r   samplesr*   r*   r+   test_NormalQMC  s    zTestNormalQMC.test_NormalQMCc                 C   s   t jtddd}| }t|jd |jdd}t|jd t jtddd}| }t|jd	 |jdd}t|jd
 d S )Nr   T)r   inv_transformrP  r   r   rQ  r   r   rR  rS  rV  r*   r*   r+   test_NormalQMCInvTransform  s       z(TestNormalQMC.test_NormalQMCInvTransformc                 C   s  t jd}tjt dd|d}|jdd}t ddgdd	gg}t||d
d t jd}tjt dd|d}|jdd}t dddgdddgg}t||d
d t jd}tjdd|d}tjt dd||d}|jdd}t dddgdddgg}t||d
d d S )Nl	   q)*syRM@
K r   Fr   rY  rj   r   geO?g[nKg[XͿg1ZGU?rE   rF   r!   gv/?g;Og/.Ui?g}?r@   Tr   )r   rY  r   rj   )	r$   r0   r1   r   rT  rU  r%   r   r  )r&   rj   r   rW  samples_expectedrL  r*   r*   r+   test_NormalQMCSeeded  sF      
    z"TestNormalQMC.test_NormalQMCSeededc                 C   s   t jd}tjt d|dd}|jdd}t ddgdd	gg}t||d
d t jd}tjt d|dd}|jdd}t dddgdddgg}t||d
d d S )Nl	   9e)-%5Z%_6 r   T)r   rj   rY  r   gۆQ<gH?gF^_?g(+ rE   rF   r!   g/fKV?gr)?gAv"g9})r$   r0   r1   r   rT  rU  r%   r   )r&   rj   r   rW  r\  r*   r*   r+    test_NormalQMCSeededInvTransform  s,      
  z.TestNormalQMC.test_NormalQMCSeededInvTransformc                 C   sJ   dD ]@}t j|dd}t jt||dd}| }t|jd|f qd S )Nr   r   r   Fr   T)r   r   rY  r   )r   r  rT  r$   rU  r0   r   ru   )r&   r   rL  r   rW  r*   r*   r+   rM    s    zTestNormalQMC.test_other_enginec                 C   s   t jd}tjt d|d}|jdd}tt |jdddk sJt	tt |j
ddd	 dk slt	d
D ](}t|d d |f \}}|dkspt	qpt | }t |d
 dk st	d S )Ni3  r   )r   rj      r   r   rs   r   r   r   r   rI  r$   r0   r1   r   rT  rU  r   rx   r   r   stdr	   cov	transposer&   r2   r   rW  rp   r   pvalrd  r*   r*   r+   test_NormalQMCShapiro  s    "z#TestNormalQMC.test_NormalQMCShapiroc                 C   s   t jd}tjt dd|d}|jdd}tt |jddd	k sLt	tt |j
ddd
 d	k snt	dD ](}t|d d |f \}}|dksrt	qrt | }t |d d	k st	d S )NiZ1 r   Tr[  r`  r   r   rs   r   r   ra  rI  rb  rf  r*   r*   r+   !test_NormalQMCShapiroInvTransform  s      "z/TestNormalQMC.test_NormalQMCShapiroInvTransformN)
r   r   r   rX  rZ  r]  r^  rM  rh  ri  r*   r*   r*   r+   rO    s   	rO  c                   @   sT   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S )TestMultivariateNormalQMCc              	   C   sV  d}t jt|d tjdgtjddd W 5 Q R X d}t jt|d" tjdddgtjddd W 5 Q R X d}t jt|d tjddgtj d W 5 Q R X d	}t jt|d" tddgd
dgdd
gg W 5 Q R X d}t jt|d" tddgd
dgdd
gg W 5 Q R X d}t jt|d  tdgd
dgdd
gg W 5 Q R X d S )Nz(Dimension of `engine` must be consistentr8   r   r   r>  )r   r@   r?  zCovariance matrix not PSD.r   z#Covariance matrix is not symmetric.z/Dimension mismatch between mean and covariance.)	r<   r=   r>   r   rT  r  r$   r0   r1   r   r*   r*   r+   rA    s$    "&"&&z*TestMultivariateNormalQMC.test_validationsc                 C   s<   t dddgdddgdddgdddgg}|jd k	s8td S )Nr   r   r   )r   rT  Z_corr_matrixr   r  r*   r*   r+   test_MultivariateNormalQMCNonPD0  s
     z9TestMultivariateNormalQMC.test_MultivariateNormalQMCNonPDc                 C   s   t jddd}| }t|jd |jdd}t|jd t jddgddgddggd}| }t|jd |jdd}t|jd	 tddd
g}tdddgdddgdddgg}t ||}| }t|jd |jdd}t|jd d S )Nr   r   )r   rd  rP  r   rQ  r   r   rR  r   r   r!   r   r!   r   rT  r0   r   ru   r$   r%   r&   r   rW  r   rd  r*   r*   r+   test_MultivariateNormalQMC7  s"    "z4TestMultivariateNormalQMC.test_MultivariateNormalQMCc                 C   s   t jdddd}| }t|jd |jdd}t|jd t jddgddgddggdd}| }t|jd	 |jdd}t|jd
 tdddg}tdddgdddgdddgg}t j||dd}| }t|jd |jdd}t|jd d S )Nr   r   T)r   rd  rY  rP  r   rQ  r   r   rR  r   )rY  rl  rm  rn  ro  r*   r*   r+   &test_MultivariateNormalQMCInvTransformO  s*      "z@TestMultivariateNormalQMC.test_MultivariateNormalQMCInvTransformc                 C   s  t jd}|d}||  t |d }tjt ddg|d|d}|jdd}t dd	gd
dgg}t	||dd t jd}|d}||  t |d }tjt dddg|d|d}|jdd}t dddgdddgg}t	||dd d S )Nl	   b{1/YK $`F r   r   r   r   F)rY  rj   r   g6>W[?gP5z5@?g?Qٰf?gʤ6 ?rE   rF   r!   r!   r!   gc@gàL@gD`g
?go'?gIp
r$   r0   r1   Zstandard_normalre  Zdiagr   rT  r%   r   r&   r2   r4   Ar   rW  r\  r*   r*   r+    test_MultivariateNormalQMCSeededi  s0    
 

 z:TestMultivariateNormalQMC.test_MultivariateNormalQMCSeededc                 C   s  t jd}|d}||  t |d }tjt ddg||dd}|jdd}t dd	gd
dgg}t	||dd t jd}|d}||  t |d }tjt dddg||dd}|jdd}t dddgdddgg}t	||dd d S )Nl	   A^}KT0zubN rr  r   r   T)rj   rY  r   gBފgS"!g`s	M?g]¡x?rE   rF   rs  r!   g?g;ۤտgygtֿgc?g([Zӿrt  ru  r*   r*   r+   ,test_MultivariateNormalQMCSeededInvTransform  s8    
   

   zFTestMultivariateNormalQMC.test_MultivariateNormalQMCSeededInvTransformc                 C   s  t jd}tjddgddgddgg|d}|jdd}tt |jdddk sVttt |j	ddd dk sxtd	D ](}t
|d d |f \}}|d
ks|tq|t | }t |d	 dk sttjddgddgddgg|d}|jdd}tt |jddddg dk sttt |j	ddt d dk sHtd	D ],}t
|d d |f \}}|d
ksLtqLt | }t |d	 d dk std S )Nl	   R2qM}3i/ r   r   r   rd  rj   r`  r   rs   r   ra  rI  rB   rA   r"   r   r   r$   r0   r1   r   rT  r   rx   r   r   rc  r	   rd  re  rU   r&   rj   r   rW  rp   r   rg  rd  r*   r*   r+   !test_MultivariateNormalQMCShapiro  s6      "  (*z;TestMultivariateNormalQMC.test_MultivariateNormalQMCShapiroc                 C   s  t jd}tjddgddgddgg|dd}|jdd}tt |jddd	k sXttt |j	ddd d	k sztd
D ](}t
|d d |f \}}|dks~tq~t | }t |d
 d	k sttjddgddgddgg|dd}|jdd}tt |jddddg d	k s"ttt |j	ddt d d	k sLtd
D ],}t
|d d |f \}}|dksPtqPt | }t |d
 d d	k std S )Nl	   A"l7D#maxbwcuC r   r   T)r   rd  rj   rY  r`  r   rs   r   ra  rI  rB   rA   r"   r   r   rz  r{  r*   r*   r+   -test_MultivariateNormalQMCShapiroInvTransform  s:       "(*zGTestMultivariateNormalQMC.test_MultivariateNormalQMCShapiroInvTransformc                 C   s  t jd}tjdddgdddgdddgdddgg|d}|jdd}tt |jdd	d
k sdtt t 	|d d df d d
k stt t 	|d d df d d
k stt t 	|d d df t 
d d
k stdD ](}t|d d |f \}}|dkstqt | }t |d d
k s6tt |d d d
k sRttt |d d df |d d df  |d d df  dk std S )Nl	   A	+CIImG`3dz r   rB   rA   ry  r   r   r   rs   r   r   r   r_  g?ra  r   r   )r$   r0   r1   r   rT  r   rx   r   r   rc  rU   r	   rd  re  r{  r*   r*   r+   $test_MultivariateNormalQMCDegenerate  s(    ((.6z>TestMultivariateNormalQMC.test_MultivariateNormalQMCDegenerateN)r   r   r   rA  rk  rp  rq  rw  rx  r|  r}  r~  r*   r*   r*   r+   rj    s    #rj  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )	TestLloydc           	      C   s~   t jd}|jdddd}t|}t|}tdD ]D}t|dd}t|}t|}||k s`t||k slt|}|}|}q4d S )Ni r   r   )   r   )r   r@   )maxiter)	r$   r0   ZRandomStateuniformr   r0  rm   r   r   )	r&   r2   r3   Zbase_l1Zbase_l2r   Zsample_lloydZcurr_l1Zcurr_l2r*   r*   r+   
test_lloyd  s      zTestLloyd.test_lloydc                 C   sR   t ddgddgddgddgg}| }t|d}t|| t ||rNtdS )z
        Verify that the input samples are not mutated in place and that they do
        not share memory with the output.
        rg   r1  r   N)r$   r%   copyr   r   Zmay_share_memoryr   )r&   Zsample_origZsample_copyZ
new_sampler*   r*   r+   test_lloyd_non_mutating  s    

z!TestLloyd.test_lloyd_non_mutatingc              	   C   s   t jtdd dddg}t| W 5 Q R X d}t jt|d dgdgdgg}t| W 5 Q R X d}t jt|d$ d	dgd
dgddgg}t| W 5 Q R X d S )Nz`sample` is not a 2D arrayr8   r   r   r   z`sample` dimension is not >= 2rH  z!`sample` is not in unit hypercubegrg   r   )r<   r=   r>   r   )r&   r3   r   r*   r*   r+   test_lloyd_errors  s    
zTestLloyd.test_lloyd_errorsN)r   r   r   r  r  r  r*   r*   r*   r+   r    s   r  c                 C   s   t |  S r_   )r   Zpdistr   r   r*   r*   r+   r0  -  s    r0  ).rd   collectionsr   	itertoolsr   r   r<   Znumpyr$   Znumpy.testingr   r   r   Zscipy.spatialr   Zscipy.statsr	   Zscipy.stats._sobolr
   r   Zscipy.stats._qmcr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r-  r8  rO  rj  r  r0  r*   r*   r*   r+   <module>   s>   (  8&	" !OKD<x a9