o
    i                     @   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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.ej/0d,ej1ej2ej3ej4gd-d. Z5dS )/    N)Counter)combinationsproduct)assert_allcloseassert_equalassert_array_equalassert_array_less)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,   T/home/kim/smarthome/.venv/lib/python3.10/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    
   r1   F)r!   T)r&   randomdefault_rngr   r%   r   )r(   rngsampleabZscaledZunscaledr,   r,   r-   test_scale_random4   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w   Y  t jtdd* 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 sWw   Y  t jtdd$ ddgd	d	gd
d
gg}g dddg}}tj|||d W d    n1 sw   Y  t jtdd* 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 sw   Y  t jtdd* 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 sw   Y  t jtdd, 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    d S 1 s8w   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=   s>   $zTestUtils.test_scale_errorsc              
   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 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 ]}t d|  }ttjt dg| gdd| qd 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   rC   r>          @   L2-star)r&   r'   r   r   discrepancysqrt)r(   space_1Zspace_2r5   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.w   Y  tjtd	d tddg W d    n1 sLw   Y  d
d
gddgddgg}tjtdd tj|dd W d    d S 1 svw   Y  d S )Nr   r#   r   r   rC   r   r=   r:   r9   r   r   'toto' is not a valid ...totorS   )r&   r'   r?   r@   rA   r   r^   r(   r5   r,   r,   r-   test_discrepancy_errors   s   ."z!TestUtils.test_discrepancy_errorsc              
   C   s`  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 ]}t d|  }ttjt dg| gddd| qK|tddd  tj	t
dd tj|dd W d    n1 sw   Y  tj	td d tj|d!d W d    d S 1 sw   Y  d S )"NrJ   rK   rL   rM   rN   rO   rP   rD   rE   rQ   rR   r>   )rT   workersr   rH   rI   rU   rV   rW   rX   rY   r#   r   r]   	cpu_countc                   S   s   d S Nr,   r,   r,   r,   r-   <lambda>   s    z5TestUtils.test_discrepancy_parallel.<locals>.<lambda>zCannot determine ther:   rh   zInvalid number of workers...r   )r&   r'   r   r   r^   r_   setattrosr?   r@   NotImplementedErrorrA   )r(   Zmonkeypatchr5   ra   rb   r,   r,   r-   test_discrepancy_parallel   sF   
"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.w   Y  tjtd	d tddg W d    n1 sLw   Y  d
d
gddgddgg}tjtdd tj|dd W d    n1 suw   Y  t d
d
gd
d
gd
dgg}tjtdd t| W d    n1 sw   Y  t ddgg}tjtdd t| W d    d S 1 sw   Y  d S )Nr   r#   r   r   rC   r   r=   r:   r9   r   r   rd   re   rS   z!Sample contains duplicate points.z'Sample must contain at least two points)	r&   r'   r?   r@   rA   r   geometric_discrepancywarnsUserWarningrf   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   mstrS   r         ?      ?rC   Z	chebyshev)metric)rT   ry   l	   s;80riR$ r#   dr4   2   gY$?guڗ8?)	r&   r'   r   r   rr   r_   r2   r3   LatinHypercube)r(   r5   r4   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   rS   r   )r&   r'   r   r   rr   rf   r,   r,   r-   2test_geometric_discrepancy_mst_with_zero_distances   s   z<TestUtils.test_geometric_discrepancy_mst_with_zero_distancesc              	   C   sJ  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 sw   Y  tj	t
dd t|d
 |d | W d    n1 sw   Y  ddg}tj	t
dd t||d d
 | W d    n1 sw   Y  ddgg}tj	t
dd t||d d
 | W d    n1 sw   Y  g d}tj	t
dd t||d d
 | W d    d S 1 sw   Y  d S )Nr   r#   r   r   rC   r   rD   rE   rF   ri   T)Z	iterativerG   rH   rI   l	   gy,!uUxFYo9"] )rC   r1   r=   r:   r9   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   r2   r3   r?   r@   rA   )r(   r`   Z	disc_initZ	disc_iterr4   Zdisc_refZx_newr,   r,   r-   test_update_discrepancy   s:   .


$z!TestUtils.test_update_discrepancyc           
      C   s   t jd}tjd|d}|d}t|}tdD ]8}|d}|d}|d}t|||||}|||f |||f |||f< |||f< t|}	t	||	 qd S )Nl	   PvWuW=lWx" r   r4   r1   d   )
r&   r2   r3   r   r}   r^   rangeintegersr   r   )
r(   r4   Zqmc_genr5   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_wd8  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_mdB  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 ]}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>W  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_l2R  s   
zKTestUtils.test_discrepancy_alternative_implementation.<locals>.disc_star_l2l	   j;<Q`siyX r/   rW   rS   rU   rR   r]   N)r&   r2   r3   r   r^   r   )	r(   r   r   r   r   r4   r5   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sJ t d}|d dks$J d S )Nr1   ri         i  i^  i5	  )r   )r(   primesr,   r,   r-   test_n_primesp  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_primesz  s   zTestUtils.test_primesN)__name__
__module____qualname__r.   r8   rB   rc   rg   rq   ru   r~   r?   markZxfailr   r   r   r   r   r   r,   r,   r,   r-   r      s&    	"%#
*J
r   c                   @   $   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 )	Nr1   )
        r   rx   rw         ?      ?      ?      ?g      ?g      ?rC   rm   r>   r   r#   )start_indexr   r   )r(   r5   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 r1   Tscrambler4   r   r#   )r   r   r4   rC   )r   r   r4   rh   r>   r   )r(   r4   r*   r5   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    d S 1 sw   Y  d S )Nz'base' must be at least 2r:   r1   r   )base)r?   r@   rA   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)r{   optimizationr4   )super__init__)r(   r{   r   r4   	__class__r,   r-   r     s   zRandomEngine.__init__r   rm   c                C   s   | j || jf}|S rk   )r4   r2   r{   )r(   r   rh   r5   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sJ |   | jdks$J | jdd}t|| |   | jdd | jdd}t|| | jdksKJ d S )	Nr   l	   F,@IY^+Ge r   r   r   r      r   )r   r2   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w   Y  t jtdd td W d    n1 s1w   Y  d} t jt| d td}|jddd W d    d S 1 sVw   Y  d S )	Nz d must be a non-negative integerr:   )r   ri   z*'u_bounds' and 'l_bounds' must be integersr   g?r   )r?   r@   rA   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   r1   r   r   int64T)r   endpointr      Fr   r   r   r   )r   r   r   r&   uniqueZdtyper   r2   floorastyper   minmax)r   r5   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 )Nr1   l	   G]	#0m$ave r   ri   )r   r   sizer   r   T)r   r   r   r   r   r   Fr   r   r   )r&   r2   r3   r   r   r   r   r   )r{   r4   r   r   r   r5   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-dedefd	d
Zdedejf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   s@   | j r| jd||d|S |rt  d S | jdd|i|S )N)r   seedr   r,   )can_scrambleqmcer?   skip)r(   r   r4   kwargsr,   r,   r-   r     s
   zQMCEngineTests.enginec                 C   s   |r| j S | jS rk   )scramble_ndunscramble_nd)r(   r   r,   r,   r-   	reference   s   zQMCEngineTests.reference)idsc                 C   ,   | j d|d}|d}ttd| d S )Nr   r{   r   rC   )rC   r   r   r2   r   r&   emptyr(   r   r   r5   r,   r,   r-   	test_0dim#     
zQMCEngineTests.test_0dimc                 C   r   )Nr   r   r   r   r   r   r   r,   r,   r-   test_0sample)  r   zQMCEngineTests.test_0samplec                 C   s*   | j d|d}|d}d|jksJ d S )Nr   r   r   r   r   )r   r2   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   r2   r&   allr   r,   r,   r-   test_bounds5  s   
zQMCEngineTests.test_boundsc                 C   sN   | j |d}| jd|d}|jt|d}t||dd |jt|ks%J d S )Nr   r   r   r   r   rI   )r   r   r2   lenr   r   )r(   r   r   r   r5   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   r   rI   )r   r2   r  r   )r(   r   r   r   Zn_half_r5   r,   r,   r-   test_continuingE  s   zQMCEngineTests.test_continuingr4   Nc                 C   sL   | j d||d}|jdd}|  |jdksJ |jdd}t|| d S )Nr   r{   r   r4   r>   r   r   )r   r2   r   r   r   )r(   r   r4   r   r   r5   r,   r,   r-   
test_resetR  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rD||  q4|d	 q4t|d
d tdD  t|dd d S )Nr   r   r>   r   rC   r   rI   r   r   c                 S   s   g | ]
}|d  dkr|qS )r   r   r,   )r   r   r,   r,   r-   r   z  s    z4QMCEngineTests.test_fast_forward.<locals>.<listcomp>h㈵>)	r   r2   r   r   r   r   appendr&   concatenate)r(   r   r   r   r5   Z
even_drawsr   r,   r,   r-   test_fast_forwarde  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?rI      rx   K   rw   )r   r2   r   r&   meanrepeatZ
percentile)r(   r   r{   r   r5   r,   r,   r-   test_distribution  s   

z QMCEngineTests.test_distributionc                 C   sH   d}t jt|d | jdddd W d    d S 1 sw   Y  d S )Nz)'toto' is not a valid optimization methodr:   r   Fre   r{   r   r   )r?   r@   rA   r   r(   messager,   r,   r-   test_raises_optimizer  s   "z$QMCEngineTests.test_raises_optimizerzoptimization,metric	random-CDZlloydc                 C   s
   t |  S rk   )r   r5   r,   r,   r-   rl     s   
 zQMCEngineTests.<lambda>c           	      C   sV   | j ddd}|jdd}||}| j dd|d}|jdd}||}||k s)J d S )Nr   Fr   r\   r   r  )r   r2   )	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 s:w   Y  tjtdd t	|d	 |d  W d    d S 1 s[w   Y  d S )Nl	   B"V6DGlUN r#   r   Tr  rC   zArrays are not equalr:   r   r   )
r&   r2   r3   r   r   r
  r?   r@   AssertionErrorr   )r(   r4   r5   r   r   r,   r,   r-   test_consume_prng_state  s   "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  r2   r3   r  r  r  r  r   r^   r  r  r,   r,   r,   r-   r     sb    












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   rh   gMbP?rI   r1   rm   )r   r   r2   r  r   r   r   r   )r(   r   r   r5   r,   r,   r-   test_workers  s   
zTestHalton.test_workersN)r   r   r   r   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      t d d S NzNot applicable: not a sequence.r?   r   r(   argsr,   r,   r-   r       zTestLHS.test_continuingc                 G   r'  r(  r)  r*  r,   r,   r-   r    r,  zTestLHS.test_fast_forwardc                 G   r'  NzJNot applicable: the value of reference sample is implementation dependent.r)  r*  r,   r,   r-   r    r,  zTestLHS.test_samplestrengthr   r   r   Fr   Nr  c                 C   s\  t jd}d}|d }d}tj|||||d}|j|d}	|	j||fks'J |j|ks.J t |d | }
t |
||fj	}t 
|	|ksIJ t j|	dd	}|rVd| nd}t|||d
 t 
|	| |ksjJ |dkr|d u rt |}tt||}tt|jdD ]%\}}|	d d ||gf }|| t}dd |D }t|| qd S d S d S )Nl	   pIrtS"Md@B r   r   r   )r{   r   r.  r   r4   r   r   r   r   rI   c                 S   s   h | ]}t |qS r,   )tuple)r   rowr,   r,   r-   	<setcomp>  s    z1TestLHS.test_sample_stratified.<locals>.<setcomp>)r&   r2   r3   r   r}   r   r   ZarangeZbroadcast_toTanysortr   setr   r   r   r{   r   intr   )r(   r   r   r.  r4   pr   r{   r   r5   Z
expected1dexpectedZsorted_sampleZtolZunique_elementsZdesiredr   r   Z
samples_2dresZres_setr,   r,   r-   test_sample_stratified  s:   
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   r2   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 sw   Y  d}t jt|d tjddd}|d	 W d    n1 s@w   Y  d}t jt|d tjddd}|d
 W d    n1 sew   Y  d}t jt|d tjd
dd}|d W d    d S 1 sw   Y  d S )Nznot a valid strengthr:   r   r#   )r.  z%n is not the square of a prime numberr   )r{   r.  rZ   r   zn is too small for d	   )r?   r@   rA   r   r}   r2   )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"  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   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   sH   t jtdd td}|d W d    d S 1 sw   Y  d S )N'The balance properties of Sobol' pointsr:   r   r1   )r?   rs   rt   r   Sobolr2   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    d S 1 s=w   Y  d S )Nr   Fr  rC   r>   r>  r:   )r   r?  Zrandom_base2r   r   r?   r@   rA   r(   r   r5   r,   r,   r-   test_random_base2D  s   

"zTestSobol.test_random_base2c                 C   s   t jtdd ttjjd  W d    n1 sw   Y  t jtdd tjddd W d    d S 1 s:w   Y  d S )Nz Maximum supported dimensionalityr:   r   zMaximum supported 'bits' is 64A   )bits)r?   r@   rA   r   r?  ZMAXDIMr   r,   r,   r-   
test_raiseR  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   r2   flattentolistr   )r(   r   Zcount1Zcount2r,   r,   r-   test_high_dim[  s
   zTestSobol.test_high_dimrE  r   r#   c                 C   sr   t jdd|d}d| }||}t| jd | | tjtdd |  W d    d S 1 s2w   Y  d S )Nr   Fr   rE  zincreasing `bits`r:   )r   r?  r2   r   r   r?   r@   rA   )r(   rE  r   nsr5   r,   r,   r-   	test_bitsb  s   

"zTestSobol.test_bitsc                 C   s*   t jdddd}|d}t| j| d S )Nr   Fr\   rJ  r>   )r   r?  r2   r   r   rB  r,   r,   r-   test_64bitsl  s   
zTestSobol.test_64bitsN)r   r   r   r   r?  r   r   r&   r'   r   r   rA  rC  rF  rI  r?   r   r"  rL  rM  r,   r,   r,   r-   r=  '  s8    


		
	r=  c                   @   s   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ejdg dg dgdd Zejdg dg dgdd Zdd Zejdg dddggejdddggdd Zdd Zd S )!TestPoissonFc                 G   r'  )NzToo costly in memory.r)  r*  r,   r,   r-   r  v  r,  zTestPoisson.test_boundsc                 G   r'  )Nz"Not applicable: recursive process.r)  r*  r,   r,   r-   r  y  r,  zTestPoisson.test_fast_forwardc                 G   r'  r-  r)  r*  r,   r,   r-   r  |  r,  zTestPoisson.test_samplec                 G   s   d}d}| j d|dd}|j|d}t||ksJ t||ks"J |j|d}t||ks0J t||ks8J tj||gdd}t||d ksKJ t||ksSJ d S )	N皙?r   r   F)r{   radiusr   r   r   r   )r   r2   r  l2_normr&   r  )r(   r+  rP  rK  r   Zsample_initZsample_continuedr5   r,   r,   r-   r    s   zTestPoisson.test_continuingc                 C   s   t jd}d}d\}}|| |d | }g d}ddg}t|||}|D ]#\}	}
}| j|	|
||d}||}t||ksBJ t||
ksJJ q'd S )	Nl	   x_4vZ.c r|   )g{Gz?皙?r   )r   r#   rC   volumeZsurface)r{   rP  hyperspherer4   )r&   r2   r3   r   r   r  rQ  )r(   r4   rK  r   r   Zradii
dimensionsZhypersphere_methodsgenr{   rP  rT  r   r5   r,   r,   r-   test_mindist  s   
zTestPoisson.test_mindistc                 C   s.   d}| j d|d}| }t||ksJ d S )NrR  r   )r{   rP  )r   Z
fill_spacerQ  )r(   rP  r   r5   r,   r,   r-   test_fill_space  s   zTestPoisson.test_fill_spacer   ri   r   ri   )r   r   r   c                 C   sJ   d}g d}| j d|||d}|d}|D ]}t|| t|| qd S )NrR  )r#   r#   r   r#   r{   rP  r   r   r0   r   r2   r   )r(   r   rP  r   r   r5   pointr,   r,   r-   test_sample_inside_lower_bounds     

z+TestPoisson.test_sample_inside_lower_boundsr   c                 C   sJ   d}g d}| j d|||d}|d}|D ]}t|| t|| qd S )NrR  )r_  r   r#   rZ  r0   r[  )r(   r   rP  r   r   r5   r\  r,   r,   r-   test_sample_inside_upper_bounds  r^  z+TestPoisson.test_sample_inside_upper_boundsc                 C   sZ   d}g d}g d}t jtdd | jd|||d W d    d S 1 s&w   Y  d S )NrR  )r#   r   r   rY  z1Bounds are not consistent 'l_bounds' < 'u_bounds'r:   r#   rZ  r?   r@   rA   r   )r(   rP  r   r   r,   r,   r-   test_inconsistent_bound_value  s   "z)TestPoisson.test_inconsistent_bound_valueri   r   r#   r   c                 C   sJ   d}t jtdd | jd|||d W d    d S 1 sw   Y  d S )NrR  zP'l_bounds' and 'u_bounds' must be broadcastable and respect the sample dimensionr:   r#   rZ  ra  )r(   r   r   rP  r,   r,   r-   test_inconsistent_bounds  s   "z$TestPoisson.test_inconsistent_boundsc                 C   sF   d}t jt|d tjddd W d    d S 1 sw   Y  d S )Nz*'toto' is not a valid hypersphere samplingr:   r   re   )rT  )r?   r@   rA   r   PoissonDiskr  r,   r,   r-   r     s   "zTestPoisson.test_raisesN)r   r   r   r   rd  r   r   r  r  r  r  rW  rX  r?   r   r"  r]  r`  rb  rc  r   r,   r,   r,   r-   rN  r  s$    

	rN  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 w   Y  t g d}d}tjt|d tj|dd W d    n1 sGw   Y  t g d}d	}tjt|d tj|dtjd
dd W d    n1 ssw   Y  d}tjt|d tj|dt j	 d W d    d S 1 sw   Y  d S )N)Q?p=
ף?gffffff?)\(?z'Elements of pvals must be non-negative.r:   r1   )n_trials)rf  rg  r   rh  ri  z Elements of pvals must sum to 1.rf  rg  rO  rh  ri  z Dimension of `engine` must be 1.r   r{   )rj  r   "`engine` must be an instance of...)
r&   r'   r?   r@   rA   r   MultinomialQMCr?  r2   r3   )r(   r7  r  r,   r,   r-   test_validations  s$   "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{- rk  r   )rj  r   r   rI   )
r&   r2   r3   r'   
atleast_2dr   r6  r   rn  r   )r(   r4   r7  rj  r8  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: rk  i    )rj  r4   r   rH   rI   )	r&   r2   r3   r'   r   rn  r   r   rp  )r(   r4   r7  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?rE   r   r   rs  r   gaۢ?g7?r#   rE   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< rk  r   r   Tr   )rj  r   r4   rI   )r&   r2   r3   r'   rp  r   r6  r   r?  rn  r   )r(   r4   r7  rj  r8  base_enginer   r,   r,   r-   test_other_engine  s   
z$TestMultinomialQMC.test_other_engineN)r   r   r   ro  r?   r   filterwarningsrq  rr  ru  rw  r,   r,   r,   r-   re    s    

	
	re  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&   zerosr2   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_transformrz  r   r   r{  r   r   r|  r}  r  r,   r,   r-   test_NormalQMCInvTransform4  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  r  r   r   LpɻgUygxDg?rH   rI   r#   r  r  r4   )r  r  gZ?)g#ڎrgΌ~42?gԻx?nrC   Tr   )r  r  r   r4   )	r&   r2   r3   r   r~  r  r'   r   r?  )r(   r4   r   r  samples_expectedrv  r,   r,   r-   test_NormalQMCSeededD  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  r4   r  r   <9\Mg+`?g]@"i?rH   rI   r#   )r  r  g,D?)g˚X`?g7@gaTR')r&   r2   r3   r   r~  r  r'   r   )r(   r4   r   r  r  r,   r,   r-    test_NormalQMCSeededInvTransformd  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   r  r   )r   r?  r~  r&   r  r2   r   r   )r(   r{   rv  r   r  r,   r,   r-   rw  w  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 s%J tt |j	ddd	 dk s6J d
D ]}t
|d d |f \}}|dksLJ q8t | }t |d
 dk s_J d S )Ni3  r   )r  r4      r   r   r   r  r   r   r   rt  r&   r2   r3   r   r~  r  r   r   r  stdr
   cov	transposer(   r4   r   r  r   r  Zpvalr  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 s&J tt |j	ddd
 d	k s7J dD ]}t
|d d |f \}}|dksMJ q9t | }t |d d	k s`J d S )Nir   Tr  r  r   r   r   r  r   r  rt  r  r  r,   r,   r-   !test_NormalQMCShapiroInvTransform  s   "z/TestNormalQMC.test_NormalQMCShapiroInvTransformN)
r   r   r   r  r  r  r  rw  r  r  r,   r,   r,   r-   ry  %  s     	ry  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 w   Y  d}t jt|d tjg dtjddd W d    n1 sFw   Y  d	}t jt|d tjddgtj d W d    n1 skw   Y  d
}t jt|d tddgddgddgg W d    n1 sw   Y  d}t jt|d tddgddgddgg W d    n1 sw   Y  d}t jt|d tdgddgddgg W d    d S 1 sw   Y  d S )Nz(Dimension of `engine` must be consistentr:   r   r   rl  )r   r"   rC   rm  zCovariance matrix not PSD.r   z#Covariance matrix is not symmetric.z/Dimension mismatch between mean and covariance.)	r?   r@   rA   r   r~  r?  r&   r2   r3   r  r,   r,   r-   ro    s0   "z*TestMultivariateNormalQMC.test_validationsc                 C   s4   t g dg dg dg dg}|jd usJ d S )Nr"   )r   r   r   )r   r   r   )r   r   r   )r   r~  Z_corr_matrixr@  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  rz  r   r{  r   r   r|  r  r   r   r   r   r   r   r   r   r   r   r#   r   r#   r   r~  r2   r   r   r&   r'   r(   r   r  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  r  rz  r   r{  r   r   r|  r  r  r  r  )r  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)r  r4   r   g X4g0<gΧU?gK\ @rH   rI   r#   r#   r#   r"   )gZh44gA->gZC)g~T~O?g*ʥo@gc}E?
r&   r2   r3   Zstandard_normalr  Zdiagr   r~  r'   r   r(   r4   r6   Ar   r  r  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)r4   r  r   gFX?ggR4gO=`?rH   rI   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 s+J tt |jddd dk s<J d	D ]}t	|d d |f \}}|d
ksRJ q>t 
| }t |d	 dk seJ 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 sJ tt |jddt d dk sJ d	D ]}t	|d d |f \}}|d
ksJ qt 
| }t |d	 d dk sJ d S )Nl   V^Am%2r   r   r  r  r4   r  r   r   r  r  rt  rE   rD   r$   r   r   r&   r2   r3   r   r~  r   r   r  r  r
   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 s,J tt |jddd d	k s=J d
D ]}t	|d d |f \}}|dksSJ q?t 
| }t |d
 d	k sfJ 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 sJ tt |jddt d d	k sJ d
D ]}t	|d d |f \}}|dksJ qt 
| }t |d
 d d	k sJ d S )Nl	   A"l7D#maxbwcuC r   r   T)r  r  r4   r  r  r   r   r  r  rt  rE   rD   r$   r   r   r  r  r,   r,   r-   -test_MultivariateNormalQMCShapiroInvTransformC  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 sBJ t t |d d df d dk sVJ t t |d d df t 	d dk smJ dD ]}t
|d d |f \}}|dksJ qot | }t |d dk sJ t |d d dk sJ 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   )rE   r   rE   )r   rE   rE   )rE   rE   rD   r  r   r   r   r   r  r   r   r  g?r  r   r	  )r&   r2   r3   r   r~  r   r   r  r  r_   r
   r  r  r  r,   r,   r-   $test_MultivariateNormalQMCDegeneratef  s(   ((.6z>TestMultivariateNormalQMC.test_MultivariateNormalQMCDegenerateN)r   r   r   ro  r  r  r  r  r  r  r  r  r,   r,   r,   r-   r    s     #r  c                   @   r   )	TestLloydc           	      C   s~   t jd}|jdddd}t|}t|}tdD ]"}t|dd}t|}t|}||k s0J ||k s6J |}|}|}qd S )Ni r   r   )   r   )r   rC   )maxiter)r&   r2   RandomStateuniformr   rQ  r   r   )	r(   r4   r5   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 ||r'J dS )z
        Verify that the input samples are not mutated in place and that they do
        not share memory with the output.
        r   rR  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 sw   Y  d}t jt|d dgdgdgg}t| W d    n1 s?w   Y  d}t jt|d d	dgd
dgddgg}t| W d    d S 1 shw   Y  d S )Nz`sample` is not a 2D arrayr:   r<   z`sample` dimension is not >= 2r   rs  r   z!`sample` is not in unit hypercubegr   r   )r?   r@   rA   r   )r(   r5   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 rk   )r	   Zpdistr   r  r,   r,   r-   rQ    r,  rQ  r   c                 C   s   d}t j|}| d|dd}t j|}| d|dd}t|| t j|}| d|dd}| d|dd}t|| t j|}| d|dd}t|| t|| d}tjt|d | d||d W d    d S 1 sww   Y  d S )	Nl   7P r   )r{   r   rC   rz   z3got multiple values for argument now known as `rng`r:   )r{   r4   r   )r&   r2   r  r   r3   r?   r@   	TypeError)r   Zseed_numberr4   Zres1Zres2Zres3r  r,   r,   r-   test_deterministic  s$   



"r  )6ro   collectionsr   	itertoolsr   r   r?   numpyr&   Znumpy.testingr   r   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=  rN  re  ry  r  r  rQ  r   r"  r%  r?  r}   rd  r  r,   r,   r,   r-   <module>   sH    (  m&	" ,!UKt?y a9