o
    Eb                     @   sN  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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 G d	d
 d
ZG dd dZG dd dej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Z#dd Z$G dd deZ%G dd  d Z&G d!d" d"Z'dS )#    N)Counter)combinationsproduct)assert_allcloseassert_almost_equalassert_equalassert_array_almost_equalassert_array_equal)shapiro)_test_find_index)qmc)van_der_corputn_primesprimes_from_2_toupdate_discrepancy	QMCEngine_perturb_discrepancyc                   @   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|| 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*   </usr/lib/python3/dist-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    
   r/   F)r   T)r$   randomdefault_rngr   r#   r   )r&   rngsampleabZscaledZunscaledr*   r*   r+   test_scale_random2   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 consistent a < br   r   r   r   z=shape mismatch: objects cannot be broadcast to a single shape)r   r   r   z3Sample dimension is different than bounds dimension)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   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 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   r@   r   r:   r8   r7   r   r   z'toto' is not a valid ...totorP   )r$   r%   r<   r=   r>   r   r[   )r&   r3   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 )"NrG   rH   rI   rJ   rK   rL   rM   rA   rB   rN   rO   r;   )rQ   workersr   rE   rF   rR   rS   rT   rU   rV   r!   r   rZ   	cpu_countc                   S   s   d S Nr*   r*   r*   r*   r+   <lambda>   s    z5TestUtils.test_discrepancy_parallel.<locals>.<lambda>zCannot determine ther8   rc   zInvalid number of workers...r   )r$   r%   r   r   r[   r\   setattrosr<   r=   NotImplementedErrorr>   )r&   Zmonkeypatchr3   r^   r_   r*   r*   r+   test_discrepancy_parallel   sF   
"z#TestUtils.test_discrepancy_parallelc              	   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   r@   r   rA   rB   rC   rd   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 array)g333333?皙?r   z&x_new and sample must be broadcastable)r$   r%   r   r[   r   r   r0   r1   r<   r=   r>   )r&   r]   Z	disc_initZ	disc_iterr2   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   seedr/   d   )
r$   r0   r1   r   LatinHypercuber[   rangeZ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   ry   r   gUUUUUU?r   rz   )r   r   r   r   r   ru   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   ry   g      ?      ?r   gUUUUUU?rz   r   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   ry   c                    sH   g | ] }t  D ]}td t|ddf |ddf  qqS )r   N)rt   r$   r}   Zmaximum).0kjr   r   r*   r+   
<listcomp>"  s    ,z_TestUtils.test_discrepancy_alternative_implementation.<locals>.disc_star_l2.<locals>.<listcomp>)r{   r$   r\   r|   r}   rt   )r   r   r*   r   r+   disc_star_l2  s   
zKTestUtils.test_discrepancy_alternative_implementation.<locals>.disc_star_l2l	   j;<Q`siyX r-   rT   rP   rR   rO   rZ   N)r$   r0   r1   r   r[   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J t d}|d dksJ t d}|d dks$J d S )Nr/   rd         i  i^  i5	  )r   )r&   primesr*   r*   r+   test_n_primes;  s   zTestUtils.test_n_primesc                 C   s   t d}g d}t|| d S )N2   )r   r!   r                     r      %   )   +   /   )r   r   )r&   r   r(   r*   r*   r+   test_primesE  s   zTestUtils.test_primesN)__name__
__module____qualname__r,   r6   r?   r`   rb   rl   ro   rx   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 )	Nr/   )
        r   r   r         ?      ?      ?      ?g      ?g      ?r@   rh   r;   r   r!   )start_indexr   r   )r&   r3   r(   r*   r*   r+   test_van_der_corputL  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scramblerq   r   r!   )r   r   rq   r@   )r   r   rq   rc   r;   r   )r&   rq   r(   r3   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 2r8   r/   r   )base)r<   r=   r>   r   r&   r*   r*   r+   test_invalid_base_errorl  s   "zTestVDC.test_invalid_base_errorN)r   r   r   r   r   r   r*   r*   r*   r+   r   K  s    r   c                       s(   e Zd Zd fdd	ZdddZ  ZS )	RandomEngineNc                    s   t  j||d d S )Ndrq   )super__init__)r&   r   rq   	__class__r*   r+   r   r  s   zRandomEngine.__init__r   c                 C   s$   |  j |7  _ | j|| jf}|S rf   )num_generatedr2   r0   r   )r&   r   r3   r*   r*   r+   r0   u  s   zRandomEngine.randomrf   )r   )r   r   r   r   r0   __classcell__r*   r*   r   r+   r   q  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 tjtd	d
 t d W d    d S 1 sbw   Y  d S )Nr   l	   F,@IY^+Ge rp   r   r   r      r   zd must be an integer valuer8   )r   )	r   r0   r   resetr   fast_forwardr<   r=   r>   )engineZsample_1Zsample_2Zsample_1_testZsample_2_testr*   r*   r+   test_subclassing_QMCEngine{  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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dd Zejjde	e
ddd Zejddgdd ZdS ) QMCEngineTestszGeneric tests for QMC engines.TFZ	ScrambledZUnscrambledr   returnc                 K   sL   t jd}| jr| jd||d|S |rt  d S | jdd|i|S )Nl	   \v$PdvuL2+C r   rq   r*   )r$   r0   r1   can_scrambleqmcer<   skip)r&   r   kwargsrq   r*   r*   r+   r     s   zQMCEngineTests.enginec                 C   s   |r| j S | jS rf   )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   r@   )r@   r   r   r0   r	   r$   emptyr&   r   r   r3   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   r0   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 )Nrr   r      r   r   )r   r0   r$   allr   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s%J d S )Nr   r   r   r   r   Zdecimal)r   r   r0   lenr   r   )r&   r   
ref_sampler   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   r   r   )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sJ |jdd}t|| d S )Nr   r   r;   r   r   )r   r0   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rD||  q4|d q4t|d	d
 tdD  t|dd d S )Nr   r   r;   r   r@   r   r   r   c                 S   s   g | ]
}|d  dkr|qS )r   r   r*   )r   rv   r*   r*   r+   r     s    z4QMCEngineTests.test_fast_forward.<locals>.<listcomp>r   )	r   r0   r   r   r   rt   appendr$   Zconcatenate)r&   r   r   r   r3   Z
even_drawsrv   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   ry   r   r   r      r   K   r   )r   r0   r   r$   meanrepeatZ
percentile)r&   r   r   r   r3   r*   r*   r+   test_distribution  s   

z QMCEngineTests.test_distributionN)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*   r*   r+   r     s8    









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!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?N)r   r   r   r   ZHaltonr   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 )TestLHSFc                 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   centeredToptimizationN	random-CDc                 C   sX  t jd}d}|d }d}t |d | }t |||fj}	tj|||||d}
|
j|d}|j||fks9J |
j	|ks@J t j
|dd	}t ||	ksPJ t||	d| d
 t ||	 d| ksfJ |dkr|d u rt |}tt||}tt|
jdD ]'\}}|d d ||gf }|| t}tdd |D }t|| qd S d S d S )Nl	   pIrtS"Md@B r   r   r   r   )r   r   r   r   rq   r   r   ry   rF   c                 s   s    | ]}t |V  qd S rf   )tuple)r   rowr*   r*   r+   	<genexpr>R  s    z1TestLHS.test_sample_stratified.<locals>.<genexpr>)r$   r0   r1   ZarangeZbroadcast_toTr   rs   r{   r   sortanyr   setr   r   rt   r   Zastypeintr   )r&   r   r   r   rq   pr   r   Z
expected1dexpectedr   r3   Zsorted_sampleZunique_elementsZdesiredrv   r   Z
samples_2dresZres_setr*   r*   r+   test_sample_stratified2  s8   
zTestLHS.test_sample_stratifiedc                 C   s^   d}t jd|d}|jdd}t |}t jd|dd}|jdd}t |}||k s-J d S )Nl   #w+"z r   r      r   r   )r   rq   r   )r   rs   r0   r[   )r&   rq   ZlhsZ
sample_refrn   Zoptimal_Zsample_Zdisc_r*   r*   r+   test_discrepancy_hierarchyU  s   

z"TestLHS.test_discrepancy_hierarchyc                 C   sd  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 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 sw   Y  d}t jt|d tjdd
d}|d W d    d S 1 sw   Y  d S )Nz)'toto' is not a valid optimization methodr8   r   ra   )r   znot a valid strengthr!   )r   z%n is not the square of a prime numberr   )r   r   rW   r   zn is too small for d	   )r<   r=   r>   r   rs   r0   )r&   messager   r*   r*   r+   test_raisesa  s.   "zTestLHS.test_raises)r   r   r   r   rs   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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   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' pointsr8   r   r/   )r<   ZwarnsUserWarningr   Sobolr0   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   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   sF   t jtdd ttjjd  W d    d S 1 sw   Y  d S )Nz Maximum supported dimensionalityr8   r   )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   Zflattentolistr   )r&   r   Zcount1Zcount2r*   r*   r+   test_high_dim  s
   zTestSobol.test_high_dimN)r   r   r   r   r  r   r   r$   r%   r   r   r  r  r  r  r*   r*   r*   r+   r  z  s2    


	r  c                   @   sT   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d ZdS )TestMultinomialQMCc                 C   s2  t g d}tjtdd t| W d    n1 sw   Y  t g d}d}tjt|d t| W d    n1 sCw   Y  t g d}d}tjt|d tj|tjdd	d
 W d    n1 snw   Y  d}tjt|d tj|t j	 d
 W d    d S 1 sw   Y  d S )N)Q?p=
ף?gffffff?)\(?z'Elements of pvals must be non-negative.r8   )r  r  rm   r  r  z Elements of pvals must sum to 1.r  r  g?r  r  z Dimension of `engine` must be 1.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_validations  s$   "z#TestMultinomialQMC.test_validationszignore::UserWarningc                 C   sJ   t jd}t g d}t g d}tj||d}t|d| d S )Nl	   (u@gP{- r  )r      r   #      rp   rr   )r$   r0   r1   r%   r   r   r	   )r&   rq   r  r  r   r*   r*   r+   test_MultinomialBasicDraw  s
   z,TestMultinomialQMC.test_MultinomialBasicDrawc                 C   sN   t jd}t g d}tj||d}|d}t|t | |dd d S )Nl	   8X7:ct]+C: r  rp   i    r@   r   )r$   r0   r1   r%   r   r   r   r|   )r&   rq   r  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)rm   皙?g?g333333?r   ?gGz?rB   r   r   r'  r   gaۢ?g7?r!   rB   r   )r$   r%   r   r   r   )r&   Zp_cumulativesizer*   r*   r+   test_FindIndex  s   z!TestMultinomialQMC.test_FindIndexc                 C   s\   t jd}t g d}t g d}tjdd|d}tj|||d}t|d| d S )	Nl	   aFkq|'x< r  )r   r   r   $   r$  r   Tr   )r   rq   rr   )r$   r0   r1   r%   r   r  r   r	   )r&   rq   r  r  base_enginer   r*   r*   r+   test_other_engine  s   z$TestMultinomialQMC.test_other_enginec                 C   sR   t g d}t jd}tj||d}|d}|  |d}t|| d S )Nr  l	   V)sDx@ rp   r   )r$   r%   r0   r1   r   r   r   r	   )r&   r  rq   r   samplesZsamples_resetr*   r*   r+   r     s   

zTestMultinomialQMC.test_resetN)r   r   r   r!  r<   r   filterwarningsr%  r&  r*  r-  r   r*   r*   r*   r+   r    s    


	
	r  c                  O   s$   | d}tjddt|i|S )Nr   r   r*   )popr   MultivariateNormalQMCr$   zeros)r   r   r   r*   r*   r+   _wrapper_mv_qmc  s   
r3  c                   @   s,   e Zd ZeZdZdd Zdd Zdd ZdS )	TestMultivariateNormalQMCEngineFc                 G   r   r   r   r   r*   r*   r+   r     r   z+TestMultivariateNormalQMCEngine.test_samplec                 G   r   )Nz&Not applicable: normal is not bounded.r   r   r*   r*   r+   r     r   z+TestMultivariateNormalQMCEngine.test_boundsc                 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   inv_transformr   r   r  r1  r$   r2  r0   r   r{   )r&   r   r,  r   r.  r*   r*   r+   r-    s   z1TestMultivariateNormalQMCEngine.test_other_engineN)	r   r   r   r3  r   r   r   r   r-  r*   r*   r*   r+   r4    s    r4  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   r1  r$   r2  r0   r   r{   r&   r   r.  r*   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   r7  r:  r   r   r;  r   r   r<  r=  r>  r*   r*   r+   test_NormalQMCInvTransform   s   

z(TestNormalQMC.test_NormalQMCInvTransformc                 C   s<   t jddd}t jtd|dd}| }t|jd d S )Nr   Fr   Tr6  r   r8  )r&   r,  r   r.  r*   r*   r+   r-  0  s   zTestNormalQMC.test_other_enginec                 C   s   t jd}tjt dd|d}|jdd}t ddgdd	gg}t|| t jd}tjt d
d|d}|jdd}t g dg dg}t|| d S )Nl	   q)*syRM@
K r   Fr   r7  rq   r   eO?[nKg[XͿg1ZGU?r!   )rB  rC  gv/?)g;Og/.Ui?g}?r$   r0   r1   r   r1  r2  r%   r   r&   rq   r   r.  samples_expectedr*   r*   r+   test_NormalQMCSeeded8  $   


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|| t jd}tjt d
|dd}|jdd}t g dg dg}t|| d S )Nl	   9e)-%5Z%_6 r   T)r   rq   r7  r   ۆQ<H?gF^_?g(+ r!   )rI  rJ  g/fKV?)gr)?gAv"g9}rD  rE  r*   r*   r+    test_NormalQMCSeededInvTransformK  rH  z.TestNormalQMC.test_NormalQMCSeededInvTransformc                 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   rq      r   r   ry   {Gz?r   r   r   r(  r$   r0   r1   r   r1  r2  r   r~   r   stdr
   cov	transposer&   r2   r   r.  rv   r   pvalrQ  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 )NiZ1 r   TrA  rL  r   r   ry   rM  r   rN  r(  rO  rS  r*   r*   r+   !test_NormalQMCShapiroInvTransforml  s   "z/TestNormalQMC.test_NormalQMCShapiroInvTransformN)
r   r   r   r?  r@  r-  rG  rK  rU  rV  r*   r*   r*   r+   r9    s    r9  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ddgtj d W d    n1 sEw   Y  d}t jt|d tddgd	dgdd	gg W d    n1 slw   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 consistentr8   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   r1  r  r$   r0   r1   )r&   r  r*   r*   r+   r!  ~  s(   "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   r1  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   rQ  r:  r   r;  r   r   r<  r5  r   r   r   r   r   r   r   r   r   r   r!   r   r!   r   r1  r0   r   r{   r$   r%   r&   r   r.  r   rQ  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   rQ  r7  r:  r   r;  r   r   r<  r5  rY  rZ  r[  )r7  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	|| t jd}|d}||  t |d }tjt g d|d|d}|jdd}t g dg dg}t	|| d S )Nl	   b{1/YK $`F r   r   r   r   F)r7  rq   r   g6>W[?gP5z5@?g?Qٰf?gʤ6 ?r!   r!   r!   r    )gc@gàL@gD`)g
?go'?gIp
r$   r0   r1   Zstandard_normalrR  Zdiagr   r1  r%   r   r&   r2   r4   Ar   r.  rF  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	|| t jd}|d}||  t |d }tjt g d||dd}|jdd}t g dg dg}t	|| d S )Nl	   A^}KT0zubN rb  r   r   T)rq   r7  r   gBފgS"!g`s	M?g]¡x?rc  r!   r    )g?g;ۤտgy)gtֿgc?g([Zӿrd  re  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	   R2qM}3i/ r   r   r   rQ  rq   rL  r   ry   rM  rN  r(  rB   rA   r"   r   r   r$   r0   r1   r   r1  r   r~   r   rP  r
   rQ  rR  r\   r&   rq   r   r.  rv   r   rT  rQ  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   rQ  rq   r7  rL  r   ry   rM  rN  r(  rB   rA   r"   r   r   rj  rk  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 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	   A	+CIImG`3dz )r   r   r   )rB   r   rB   )r   rB   rB   )rB   rB   rA   ri  r   r   r   ry   rM  r   r   r5  g?rN  r   gh㈵>)r$   r0   r1   r   r1  r   r~   r   rP  r\   r
   rQ  rR  rk  r*   r*   r+   $test_MultivariateNormalQMCDegenerate@  s(   ((.6z>TestMultivariateNormalQMC.test_MultivariateNormalQMCDegenerateN)r   r   r   r!  rX  r`  ra  rg  rh  rl  rm  rn  r*   r*   r*   r+   rW  |  s     #rW  )(rj   collectionsr   	itertoolsr   r   r<   Znumpyr$   Znumpy.testingr   r   r   r   r	   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  r3  r4  r9  rW  r*   r*   r*   r+   <module>   s2       :&
{V:Dk