a
    BCCfu                     @   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                   @   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
ejjddd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|| g dg dg dg}dg d }}g dg dg dg}t j|||d}t|| d S )Nr            ?      l_boundsu_bounds         @Tr   r   reverser   r   r   )r   r   r   )r   r   r   )r   r      )r"   r         ?)r   scaler   nparray)selfspaceoutZscaled_spaceboundsZscaled_back_spacer   r    r+   V/var/www/html/django/DPS/env/lib/python3.9/site-packages/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    
   r0   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( g d}tj|ddd W d    n1 s<0    Y  t jtddT ddgd	d	gd
d
gg}tddgddgg}tj||d |d	 d W d    n1 s0    Y  t jtddH ddgd	d	gd
d
gg}g dddg }}tj|||d W d    n1 s0    Y  t jtddT ddgd	d	gd
d
gg}tg dg dg}tj||d |d	 d W d    n1 s0    Y  t jtddT ddgd	dgd
d
gg}tddgddgg}tj||d |d	 d W d    n1 s0    Y  t jtddV 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 d    n1 st0    Y  d S )NSample is not a 2D arraymatchr   r   r   r   r   r   zBounds are not consistentr   r   r   r   z/'l_bounds' and 'u_bounds' must be broadcastable)r   r   r   )r   r   r   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    .6088zTestUtils.test_scale_errorsc              
   C   sr  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 g dg dg dg dg dg dg d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| q4d S )Nr   r"   r   r      r          @      ?      (@ǘ?-C6?Zatolg/$?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   r   r   r   r   r   r   r   r   r   r         @MDmethodr   WDS?CD:M?r   rB   r=          @   L2-star)r%   r&   r   r   discrepancysqrt)r'   space_1Zspace_2r4   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 d    n1 s\0    Y  tjtd	d tddg W d    n1 s0    Y  d
d
gddgddgg}tjtdd tj|dd W d    n1 s0    Y  d S )Nr   r"   r   r   rB   r   r<   r9   r8   r   r   'toto' is not a valid ...totorR   )r%   r&   r>   r?   r@   r   r]   r'   r4   r+   r+   r,   test_discrepancy_errors   s    .(,z!TestUtils.test_discrepancy_errorsc              
   C   sb  t g dg dg dg dg dg dg d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 d    n1 s0    Y  tj	td d tj|d!d W d    n1 sT0    Y  d S )"NrI   rJ   rK   rL   rM   rN   rO   rC   rD   rP   rQ   r=   )rS   workersr   rG   rH   rT   rU   rV   rW   rX   r"   r   r\   	cpu_countc                   S   s   d S Nr+   r+   r+   r+   r,   <lambda>       z5TestUtils.test_discrepancy_parallel.<locals>.<lambda>zCannot determine ther9   rg   zInvalid number of workers...r   )r%   r&   r   r   r]   r^   setattrosr>   r?   NotImplementedErrorr@   )r'   Zmonkeypatchr4   r`   ra   r+   r+   r,   test_discrepancy_parallel   sB    
.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}tjtdd t| W d    n1 s\0    Y  tjtd	d tddg W d    n1 s0    Y  d
d
gddgddgg}tjtdd tj|dd W d    n1 s0    Y  t d
d
gd
d
gd
dgg}tjtdd t| W d    n1 s@0    Y  t ddgg}tjtdd t| W d    n1 s0    Y  d S )Nr   r"   r   r   rB   r   r<   r9   r8   r   r   rc   rd   rR   z!Sample contains duplicate points.z'Sample must contain at least two points)	r%   r&   r>   r?   r@   r   geometric_discrepancywarnsUserWarningre   r+   r+   r,   !test_geometric_discrepancy_errors   s    .(,,*z+TestUtils.test_geometric_discrepancy_errorsc                 C   sL  t ddgddgg}tt|t d ttj|ddt d t ddgddgddgg}tt|d ttj|ddd t ddgddgddgg}tt|t dd	  ttj|ddt dd  ttj|d
dd ttj|dd
dd t jd}tjd|dd}tt|d ttj|ddd d S )Nr   r   r   mstrR   r         ?      ?rB   Z	chebyshev)metric)rS   ry   l	   s;80riR$ r"   )dseed2   gY$?guڗ8?)	r%   r&   r   r   rr   r^   r1   r2   LatinHypercube)r'   r4   r3   r+   r+   r,   test_geometric_discrepancy   s&    z$TestUtils.test_geometric_discrepancyz5minimum_spanning_tree ignores zero distances (#18892)T)reasonstrictc                 C   s4   t ddgddgddgg}ttj|ddd d S )Nr   r   rv   rR   r   )r%   r&   r   r   rr   re   r+   r+   r,   2test_geometric_discrepancy_mst_with_zero_distances   s    z<TestUtils.test_geometric_discrepancy_mst_with_zero_distancesc              	   C   sP  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 d    n1 s0    Y  tj	t
dd$ t|d
 |d | W d    n1 s\0    Y  ddg}tj	t
dd$ t||d d
 | W d    n1 s0    Y  ddgg}tj	t
dd$ t||d d
 | W d    n1 s0    Y  g d}tj	t
dd$ t||d d
 | W d    n1 sB0    Y  d S )Nr   r"   r   r   rB   r   rC   rD   rE   rh   T)Z	iterativerF   rG   rH   l	   gy,!uUxFYo9"] )rB   r0   r<   r9   r8   r   zx_new is not in unit hypercuber   zx_new is not a 1D array)g333333?皙?r   z&x_new and sample must be broadcastable)r%   r&   r   r]   r   r   r1   r2   r>   r?   r@   )r'   r_   Z	disc_initZ	disc_iterr3   Zdisc_refZx_newr+   r+   r,   test_update_discrepancy   s0    .

<44
4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   r{   r0   d   )
r%   r1   r2   r   r}   r]   rangeintegersr   r   )
r'   r3   Zqmc_genr4   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   r   r   gUUUUUU?r   r   )r   r   r   r   r   r   r+   r+   r,   disc_wd7  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?rx   r   r   r   r   g      ?rw   r   gUUUUUU?r   r   r+   r+   r,   disc_mdA  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   r   c                    sH   g | ]@}t  D ]2}td t|ddf |ddf  qqS )r   N)r   r%   r   maximum).0kjr   r   r+   r,   
<listcomp>V  s   z_TestUtils.test_discrepancy_alternative_implementation.<locals>.disc_star_l2.<locals>.<listcomp>)r   r%   r^   r   r   r   )r   r   r+   r   r,   disc_star_l2Q  s    
zKTestUtils.test_discrepancy_alternative_implementation.<locals>.disc_star_l2l	   j;<Q`siyX r.   rV   rR   rT   rQ   r\   N)r%   r1   r2   r   r]   r   )	r'   r   r   r   r   r3   r4   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J t d}|d dks0J t d}|d dksHJ d S )Nr0   rh         i  i^  i5	  )r   )r'   primesr+   r+   r,   test_n_primeso  s    zTestUtils.test_n_primesc                 C   s   t d}g d}t|| d S )Nr|   )r   r"   r                     r      %   )   +   /   )r   r   )r'   r   r)   r+   r+   r,   test_primesy  s    zTestUtils.test_primesN)__name__
__module____qualname__r-   r7   rA   rb   rf   rq   ru   r~   r>   markZxfailr   r   r   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   sh   t d}g d}t|| t ddd}t|| t ddd}t|| t ddd}t||dd   d S )	Nr0   )
        r   rx   rw         ?      ?      ?      ?g      ?g      ?rB   rm   r=   r   r"   )start_indexr   r   )r'   r4   r)   r+   r+   r,   test_van_der_corput  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 r0   Tscrambler{   r   r"   )r   r   r{   rB   )r   r   r{   rg   r=   r   )r'   r{   r)   r4   r+   r+   r,   test_van_der_corput_scramble  s    

z$TestVDC.test_van_der_corput_scramblec                 C   s>   t jtdd tddd W d    n1 s00    Y  d S )Nz'base' must be at least 2r9   r0   r   )base)r>   r?   r@   r   r'   r+   r+   r,   test_invalid_base_error  s    zTestVDC.test_invalid_base_errorN)r   r   r   r   r   r   r+   r+   r+   r,   r     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)rz   optimizationr{   )super__init__)r'   rz   r   r{   	__class__r+   r,   r     s    zRandomEngine.__init__r   rm   c                C   s   | j || jf}|S rj   )r3   r1   rz   )r'   r   rg   r4   r+   r+   r,   _random  s    zRandomEngine._random)NN)r   )r   r   r   r   r   __classcell__r+   r+   r   r,   r     s   r   c                  C   s   t ddd} | jdd}| jdd}| jdks2J |   | jdksHJ | jdd}t|| |   | jdd | jdd}t|| | jdksJ d S )	Nr   l	   F,@IY^+Ge r   r   r   r      r   )r   r1   num_generatedresetr   fast_forward)engineZsample_1Zsample_2Zsample_1_testZsample_2_testr+   r+   r,   test_subclassing_QMCEngine  s    

r   c                  C   s   t jtdd td W d    n1 s,0    Y  t jtdd td W d    n1 sb0    Y  d} t jt| d& td}|jddd W d    n1 s0    Y  d S )	Nz d must be a non-negative integerr9   )r   rh   z*'u_bounds' and 'l_bounds' must be integersr   g?r   )r>   r?   r@   r   r   )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@J | 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 r   r0   r   r   int64T)r   endpointr      Fr   r   r   r   )r   r   r   r%   uniqueZdtyper   r1   floorastyper   minmax)r   r4   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 )Nr0   l	   G]	#0m$ave r   rh   )r   r   sizer   r   T)r   r   r   r   r   r   Fr   r   r   )r%   r1   r2   r   r   r   r   r   )rz   r3   r   r   r   r4   r+   r+   r,   test_integers_nd  s    r   c                   @   s  e Zd ZdZeZeZeZeZddgZ	ddgZ
d-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ejddejddf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+d, Z#dS ).QMCEngineTestszGeneric tests for QMC engines.TFZ	ScrambledZUnscrambled	   \v$PdvuL2+C )r   returnc                 K   sB   | j r| jf ||d|S |r*t  n| jf d|i|S d S )Nr   r{   )can_scrambleqmcer>   skip)r'   r   r{   kwargsr+   r+   r,   r     s
    
zQMCEngineTests.enginec                 C   s   |r
| j S | jS rj   )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   rz   r   rB   )rB   r   r   r1   r   r%   emptyr'   r   r   r4   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&J d S )Nr   r   r   r   r   )r   r1   r   r   r+   r+   r,   test_1sample+  s    
zQMCEngineTests.test_1samplec                 C   s@   | j d|d}|d}t|dks*J t|dks<J d S )Nr   r      r   r   )r   r1   r%   allr   r+   r+   r,   test_bounds1  s    
zQMCEngineTests.test_boundsc                 C   sN   | j |d}| jd|d}|jt|d}t||dd |jt|ksJJ d S )Nr   r   r   r   r   rH   )r   r   r1   lenr   r   )r'   r   r   r   r4   r+   r+   r,   test_sample8  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   r   rH   )r   r1   r   r   )r'   r   r   r   Zn_half_r4   r+   r+   r,   test_continuingA  s    zQMCEngineTests.test_continuingr{   Nc                 C   sL   | j d||d}|jdd}|  |jdks2J |jdd}t|| d S )Nr   rz   r   r{   r=   r   r   )r   r1   r   r   r   )r'   r   r{   r   r   r4   r+   r+   r,   
test_resetN  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   rB   r   rH   r   r   c                 S   s   g | ]}|d  dkr|qS )r   r   r+   )r   r   r+   r+   r,   r   v  rl   z4QMCEngineTests.test_fast_forward.<locals>.<listcomp>h㈵>)	r   r1   r   r   r   r   appendr%   concatenate)r'   r   r   r   r4   Z
even_drawsr   r+   r+   r,   test_fast_forwarda  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   r   r   {Gz?rH      rx   K   rw   )r   r1   r   r%   meanrepeatZ
percentile)r'   r   rz   r   r4   r+   r+   r,   test_distribution{  s    
z QMCEngineTests.test_distributionc                 C   sF   d}t jt|d  | jdddd W d    n1 s80    Y  d S )Nz)'toto' is not a valid optimization methodr9   r   Frd   rz   r   r   )r>   r?   r@   r   r'   messager+   r+   r,   test_raises_optimizer  s    z$QMCEngineTests.test_raises_optimizerzoptimization,metric	random-CDZlloydc                 C   s
   t |  S rj   )r   r4   r+   r+   r,   rk     rl   zQMCEngineTests.<lambda>c           	      C   sV   | j ddd}|jdd}||}| j dd|d}|jdd}||}||k sRJ d S )Nr   Fr   r[   r   r  )r   r1   )	r'   r   ry   r   
sample_refZ
metric_refoptimal_sample_Zmetric_r+   r+   r,   test_optimizers  s    zQMCEngineTests.test_optimizersc                 C   s   t jd}g }tdD ]$}| jdd|d}||d qtjtdd" t	|d	 |d
  W d    n1 st0    Y  tjtdd" t	|d	 |d  W d    n1 s0    Y  d S )Nl	   B"V6DGlUN r"   r   Tr  rB   zArrays are not equalr9   r   r   )
r%   r1   r2   r   r   r  r>   r?   AssertionErrorr   )r'   r3   r4   r   r   r+   r+   r,   test_consume_prng_state  s    0z&QMCEngineTests.test_consume_prng_state)r   )$r   r   r   __doc__NotImplementedr   r   r   r   r   r   boolr   r   r%   Zndarrayr   r>   r   parametrizer   r   r   r   r   r  r1   r2   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#S )$
TestHaltonTr   r   gUUUUUU?rx   gUUUUUU?rw   gqq?r   gqq?r   g98?r   gqq?r   grq?g{'?gؖd?gz'd?gG?g{'?gk97?g oO(?goS?g{'?ggrY?gAP?gR?g{'?gyr?g oO(?g͟E?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   rg   gMbP?rH   r0   rm   )r   r   r1   r   r   r   r   r   )r'   r   r   r4   r+   r+   r,   test_workers  s    
zTestHalton.test_workersN)r   r   r   r   ZHaltonr   r   r%   r&   r   r   r   r+   r+   r+   r,   r    s"   
	r  c                   @   s|   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d ZdS )TestLHSTc                 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   Fr   Nr  c                 C   sZ  t jd}d}|d }d}tj|||||d}|j|d}	|	j||fksNJ |j|ks\J t |d | }
t |
||fj	}t 
|	|ksJ t j|	dd	}|rd| nd}t|||d
 t 
|	| |ksJ |dkrV|d u rVt |}tt||}tt|jdD ]D\}}|	d d ||gf }|| t}dd |D }t|| qd S )Nl	   pIrtS"Md@B r   r   r   )rz   r   r'  r   r{   r   r   r   r   rH   c                 S   s   h | ]}t |qS r+   )tuple)r   rowr+   r+   r,   	<setcomp>  rl   z1TestLHS.test_sample_stratified.<locals>.<setcomp>)r%   r1   r2   r   r}   r   r   ZarangeZbroadcast_toTanysortr   setr   r   r   rz   r   intr   )r'   r   r   r'  r{   pr   rz   r   r4   Z
expected1dexpectedZsorted_sampleZtolZunique_elementsZdesiredr   r   Z
samples_2dresZres_setr+   r+   r,   test_sample_stratified  s6    
zTestLHS.test_sample_stratifiedc                 C   sD   | j ddd}|jdd}| j dddd}|jdd}t|| d S )Nr   Fr   r[   r   r  r  )r   r1   r   )r'   r   r  r  r  r+   r+   r,   test_optimizer_1d  s
    zTestLHS.test_optimizer_1dc                 C   s$  d}t jt|d tjddd W d    n1 s60    Y  d}t jt|d( tjddd}|d	 W d    n1 s0    Y  d}t jt|d( tjddd}|d
 W d    n1 s0    Y  d}t jt|d( tjd
dd}|d W d    n1 s0    Y  d S )Nznot a valid strengthr9   r   r"   )r'  z%n is not the square of a prime numberr   )rz   r'  rY   r   zn is too small for d	   )r>   r?   r@   r   r}   r1   )r'   r  r   r+   r+   r,   r     s    ,((zTestLHS.test_raises)r   r   r   r   r}   r   r   r  r  r   r>   r   r  r3  r4  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   rw   rx   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   sF   t jtdd$ td}|d W d    n1 s80    Y  d S )N'The balance properties of Sobol' pointsr9   r   r0   )r>   rs   rt   r   Sobolr1   r'   r   r+   r+   r,   test_warning:  s    
zTestSobol.test_warningc                 C   s   t jddd}|d}t| jd d | |d}t| jdd | tjtdd |d W d    n1 sx0    Y  d S )Nr   Fr   rB   r=   r7  r9   )r   r8  Zrandom_base2r   r   r>   r?   r@   r'   r   r4   r+   r+   r,   test_random_base2@  s    

zTestSobol.test_random_base2c                 C   s   t jtdd" ttjjd  W d    n1 s60    Y  t jtdd tjddd W d    n1 sr0    Y  d S )Nz Maximum supported dimensionalityr9   r   zMaximum supported 'bits' is 64A   )bits)r>   r?   r@   r   r8  ZMAXDIMr   r+   r+   r,   
test_raiseN  s    0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   r8  r   r1   flattentolistr   )r'   r   Zcount1Zcount2r+   r+   r,   test_high_dimW  s
    zTestSobol.test_high_dimr>  r   r"   c                 C   sp   t jdd|d}d| }||}t| jd | | tjtdd |  W d    n1 sb0    Y  d S )Nr   Fr   r>  zincreasing `bits`r9   )r   r8  r1   r   r   r>   r?   r@   )r'   r>  r   nsr4   r+   r+   r,   	test_bits^  s    
zTestSobol.test_bitsc                 C   s*   t jdddd}|d}t| j| d S )Nr   Fr[   rC  r=   )r   r8  r1   r   r   r;  r+   r+   r,   test_64bitsh  s    
zTestSobol.test_64bitsN)r   r   r   r   r8  r   r   r%   r&   r   r   r:  r<  r?  rB  r>   r   r  rE  rF  r+   r+   r+   r,   r6  #  s6   


		
	r6  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   r  s    zTestPoisson.test_boundsc                 G   s   t d d S )Nz"Not applicable: recursive process.r#  r$  r+   r+   r,   r  u  s    zTestPoisson.test_fast_forwardc                 G   s   t d d S r&  r#  r$  r+   r+   r,   r   x  s    zTestPoisson.test_samplec                 G   s   d}d}| j d|dd}|j|d}t||ks4J t||ksDJ |j|d}t||ks`J t||kspJ tj||gdd}t||d ksJ t||ksJ d S )	N皙?r   r   F)rz   radiusr   r   r   r   )r   r1   r   l2_normr%   r  )r'   r%  rI  rD  r   Zsample_initZsample_continuedr4   r+   r+   r,   r  |  s    zTestPoisson.test_continuingc                 C   s   t jd}d}d\}}|| |d | }g d}ddg}t|||}|D ]F\}	}
}| j|	|
||d}||}t||ksJ t||
ksNJ qNd S )	Nl	   x_4vZ.c r|   )g{Gz?皙?r   )r   r"   rB   volumeZsurface)rz   rI  hyperspherer{   )r%   r1   r2   r   r   r   rJ  )r'   r3   rD  r   r   Zradii
dimensionsZhypersphere_methodsgenrz   rI  rM  r   r4   r+   r+   r,   test_mindist  s    
zTestPoisson.test_mindistc                 C   s.   d}| j d|d}| }t||ks*J d S )NrK  r   )rz   rI  )r   Z
fill_spacerJ  )r'   rI  r   r4   r+   r+   r,   test_fill_space  s    zTestPoisson.test_fill_spacec                 C   sD   d}t jt|d tjddd W d    n1 s60    Y  d S )Nz*'toto' is not a valid hypersphere samplingr9   r   rd   )rM  )r>   r?   r@   r   PoissonDiskr  r+   r+   r,   r     s    zTestPoisson.test_raisesN)r   r   r   r   rR  r   r   r   r  r   r  rP  rQ  r   r+   r+   r+   r,   rG  n  s   rG  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 g d}tjtdd tj|dd W d    n1 s@0    Y  t g d}d}tjt|d tj|dd W d    n1 s0    Y  t g d}d	}tjt|d( tj|dtjd
dd W d    n1 s0    Y  d}tjt|d& tj|dt j	 d W d    n1 s00    Y  d S )N)Q?p=
ף?gffffff?)\(?z'Elements of pvals must be non-negative.r9   r0   )n_trials)rT  rU  r   rV  rW  z Elements of pvals must sum to 1.rT  rU  rH  rV  rW  z Dimension of `engine` must be 1.r   rz   )rX  r   "`engine` must be an instance of...)
r%   r&   r>   r?   r@   r   MultinomialQMCr8  r1   r2   )r'   r0  r  r+   r+   r,   test_validations  s    ,,6z#TestMultinomialQMC.test_validationszignore::UserWarningc                 C   sZ   t jd}t g d}d}t || t}tj|||d}t	|d|dd d S )Nl	   (u@gP{- rY  r   rX  r{   r   rH   )
r%   r1   r2   r&   
atleast_2dr   r/  r   r\  r   )r'   r{   r0  rX  r1  r   r+   r+   r,   test_MultinomialBasicDraw  s    z,TestMultinomialQMC.test_MultinomialBasicDrawc                 C   sV   t jd}t g d}tj|d|d}|d}t|t | t |dd d S )Nl	   8X7:ct]+C: rY  i    r^  r   rG   rH   )	r%   r1   r2   r&   r   r\  r   r   r_  )r'   r{   r0  r   Zdrawsr+   r+   r,   test_MultinomialDistribution  s
    
z/TestMultinomialQMC.test_MultinomialDistributionc                 C   sx   t g d}t|}tt||dd tt||dd tt||dd tt||dd tt||d	|d
  d S )N)r   皙?g?g333333?rw   ?gGz?rD   r   r   rb  r   gaۢ?g7?r"   rD   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 g d}d}t || t}tjdd|d}tj	||||d}t
|d|dd d S )	Nl	   aFkq|'x< rY  r   r   Tr   )rX  r   r{   rH   )r%   r1   r2   r&   r_  r   r/  r   r8  r\  r   )r'   r{   r0  rX  r1  base_enginer   r+   r+   r,   test_other_engine  s    
z$TestMultinomialQMC.test_other_engineN)r   r   r   r]  r>   r   filterwarningsr`  ra  rd  rf  r+   r+   r+   r,   rS    s   

	
rS  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%   zerosr1   r   r   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_transformri  r   r   rj  r   r   rk  rl  ro  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 g dg dg}t||d
d t jd}tjdd|d}tjt dd||d}|jdd}t g dg dg}t||d
d d S )Nl	   q)*syRM@
K r   Fr  rr  r{   r   LpɻgUygxDg?rG   rH   r"   )ru  rv  gZ?)g#ڎrgΌ~42?gԻx?nrB   Tr   )r  rr  r   r{   )	r%   r1   r2   r   rm  rn  r&   r   r8  )r'   r{   r   rp  samples_expectedre  r+   r+   r,   test_NormalQMCSeeded  s:    



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 g dg dg}t||d
d d S )Nl	   9e)-%5Z%_6 r   T)r  r{   rr  r   <9\Mg+`?g]@"i?rG   rH   r"   )ry  rz  g,D?)g˚X`?g7@gaTR')r%   r1   r2   r   rm  rn  r&   r   )r'   r{   r   rp  rw  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   rr  r   )r   r8  rm  r%   rn  r1   r   r   )r'   rz   re  r   rp  r+   r+   r,   rf  A  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 sJJ tt |j	ddd	 dk slJ d
D ](}t
|d d |f \}}|dkspJ qpt | }t |d
 dk sJ d S )Ni3  r   )r  r{      r   r   r   r	  r   r   r   rc  r%   r1   r2   r   rm  rn  r   r   r  stdr	   cov	transposer'   r3   r   rp  r   r  pvalr  r+   r+   r,   test_NormalQMCShapiroJ  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 sLJ tt |j	ddd
 d	k snJ dD ](}t
|d d |f \}}|dksrJ qrt | }t |d d	k sJ d S )Nir   Trt  r}  r   r   r   r	  r   r~  rc  r  r  r+   r+   r,   !test_NormalQMCShapiroInvTransformX  s    "z/TestNormalQMC.test_NormalQMCShapiroInvTransformN)
r   r   r   rq  rs  rx  r{  rf  r  r  r+   r+   r+   r,   rh    s   	rh  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   s  d}t jt|d( tjdgtjddd W d    n1 s@0    Y  d}t jt|d* tjg dtjddd W d    n1 s0    Y  d	}t jt|d( tjddgtj d W d    n1 s0    Y  d
}t jt|d, tddgddgddgg W d    n1 s&0    Y  d}t jt|d, tddgddgddgg W d    n1 sv0    Y  d}t jt|d* tdgddgddgg W d    n1 s0    Y  d S )Nz(Dimension of `engine` must be consistentr9   r   r   rZ  )r   r!   rB   r[  zCovariance matrix not PSD.r   z#Covariance matrix is not symmetric.z/Dimension mismatch between mean and covariance.)	r>   r?   r@   r   rm  r8  r%   r1   r2   r  r+   r+   r,   r]  j  s$    686<<z*TestMultivariateNormalQMC.test_validationsc                 C   s4   t g dg dg dg dg}|jd us0J d S )Nr!   )r   r   r   )r   r   r   )r   r   r   )r   rm  Z_corr_matrixr9  r+   r+   r,   test_MultivariateNormalQMCNonPD  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g d
}tg dg dg dg}t ||}| }t|jd |jdd}t|jd d S )Nr   r   )r  r  ri  r   rj  r   r   rk  r|  r   r   r   r   r   r   r   r   r   r   r"   r   r"   r   rm  r1   r   r   r%   r&   r'   r   rp  r  r  r+   r+   r,   test_MultivariateNormalQMC  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g d}tg dg dg dg}t j||dd}| }t|jd |jdd}t|jd d S )Nr   r   T)r  r  rr  ri  r   rj  r   r   rk  r|  r  r  r  )rr  r  r  r  r  r+   r+   r,   &test_MultivariateNormalQMCInvTransform  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 g d|d|d}|jdd}t g dg dg}t	||dd d S )Nl	   b{1/YK $`F r   r   r   r   F)rr  r{   r   g X4g0<gΧU?gK\ @rG   rH   r"   r"   r"   r!   )gZh44gA->gZC)g~T~O?g*ʥo@gc}E?
r%   r1   r2   Zstandard_normalr  Zdiagr   rm  r&   r   r'   r3   r5   Ar   rp  rw  r+   r+   r,    test_MultivariateNormalQMCSeeded  s,    



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 g d||dd}|jdd}t g dg dg}t	||dd d S )Nl	   A^}KT0zubN r  r   r   T)r{   rr  r   gFX?ggR4gO=`?rG   rH   r  r"   r!   )go.2?gikD0NgPN)g4YgҫJC?g-v2 @r  r  r+   r+   r,   ,test_MultivariateNormalQMCSeededInvTransform  s,    



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 sVJ tt |jddd dk sxJ d	D ](}t	|d d |f \}}|d
ks|J q|t 
| }t |d	 dk sJ 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J tt |jddt d dk sHJ d	D ],}t	|d d |f \}}|d
ksLJ qLt 
| }t |d	 d dk sJ d S )Nl   V^Am%2r   r   r  r  r{   r}  r   r   r	  r~  rc  rD   rC   r#   r   r   r%   r1   r2   r   rm  r   r   r  r  r	   r  r  r^   r'   r{   r   rp  r   r  r  r  r+   r+   r,   !test_MultivariateNormalQMCShapiro  s.    "(*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 sXJ tt |jddd d	k szJ d
D ](}t	|d d |f \}}|dks~J q~t 
| }t |d
 d	k sJ 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"J tt |jddt d d	k sLJ d
D ],}t	|d d |f \}}|dksPJ qPt 
| }t |d
 d d	k sJ d S )Nl	   A"l7D#maxbwcuC r   r   T)r  r  r{   rr  r}  r   r   r	  r~  rc  rD   rC   r#   r   r   r  r  r+   r+   r,   -test_MultivariateNormalQMCShapiroInvTransform  s4    "(*zGTestMultivariateNormalQMC.test_MultivariateNormalQMCShapiroInvTransformc                 C   s  t jd}tjg dg dg dg dg|d}|jdd}tt |jd	d
dk s\J t t |d d d	f d dk sJ t t |d d df d dk sJ t t |d d df t 	d dk sJ dD ](}t
|d d |f \}}|dksJ qt | }t |d dk s.J t |d d dk sJJ tt |d d d	f |d d df  |d d df  dk sJ d S )Nl	   @jSm-\1:c# )r   r   r   )rD   r   rD   )r   rD   rD   )rD   rD   rC   r  r   r   r   r   r	  r   r   r|  g?r~  r   r  )r%   r1   r2   r   rm  r   r   r  r  r^   r	   r  r  r  r+   r+   r,   $test_MultivariateNormalQMCDegenerate0  s(    ((.6z>TestMultivariateNormalQMC.test_MultivariateNormalQMCDegenerateN)r   r   r   r]  r  r  r  r  r  r  r  r  r+   r+   r+   r,   r  h  s    #r  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`J ||k slJ |}|}|}q4d S )Ni r   r   )   r   )r   rB   )maxiter)r%   r1   ZRandomStateuniformr   rJ  r   r   )	r'   r3   r4   Zbase_l1Zbase_l2r  Zsample_lloydZcurr_l1Zcurr_l2r+   r+   r,   
test_lloydI  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 ||rNJ dS )z
        Verify that the input samples are not mutated in place and that they do
        not share memory with the output.
        r   rK  r  N)r%   r&   copyr   r   Zmay_share_memory)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  g d}t| W d    n1 s40    Y  d}t jt|d( dgdgdgg}t| W d    n1 s~0    Y  d}t jt|d. d	dgd
dgddgg}t| W d    n1 s0    Y  d S )Nz`sample` is not a 2D arrayr9   r;   z`sample` dimension is not >= 2r   rb  r   z!`sample` is not in unit hypercubegr   r   )r>   r?   r@   r   )r'   r4   r   r+   r+   r,   test_lloyd_errorsp  s    &&zTestLloyd.test_lloyd_errorsN)r   r   r   r  r  r  r+   r+   r+   r,   r  H  s   r  c                 C   s   t |  S rj   )r   Zpdistr   r  r+   r+   r,   rJ    s    rJ  ).ro   collectionsr   	itertoolsr   r   r>   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!  r6  rG  rS  rh  r  r  rJ  r+   r+   r+   r,   <module>   s>   (  m&	" )!UKD>x a9