B
    0d                 @   sF  d dl Z d dl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 d dl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)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)Versionc               @   sz   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Ze	j
jeejedk dddd Zdd Zdd Zdd ZdS )	TestUtilsc             C   s(  dgdgdgg}dgdgdgg}t j|ddd}t|| ddgddgddgg}tddgddgg}ddgddgdd	gg}t j||d |d d}t|| t j||d |d d
d}t|| dddgdddgdddgg}ddddg }}dddgdddgdd	dgg}t j|||d}t|| d S )Nr      g      ?      )l_boundsu_bounds   g      @T)r   r   reverse   g      ?)r
   scaler   nparray)selfspaceoutZscaled_spaceboundsZscaled_back_spacer   r    r"   L/var/www/html/venv/lib/python3.7/site-packages/scipy/stats/tests/test_qmc.py
test_scale   s"    


zTestUtils.test_scalec             C   sn   t jd t jdd}t jd d }t jdd }tj|||dd}tj|||dd}t|| d S )Nr      
   F)r   T)r   randomseedrandr
   r   r   )r   sampleabZscaledZunscaledr"   r"   r#   test_scale_random1   s    zTestUtils.test_scale_randomc          	   C   s
  t jtdd  dddg}tj|ddd W d Q R X t jtd	dJ ddgddgddgg}tddgdd
gg}tj||d |d d W d Q R X t jtdd@ ddgddgddgg}dddgdd
g }}tj|||d W d Q R X t jtddN ddgddgddgg}tdddgdd
d
gg}tj||d |d d W d Q R X t jtddJ ddgddgddgg}tddgdd
gg}tj||d |d d W d Q R X t jtddL ddgdd
gddgg}tddgdd
gg}tj||d |d dd W d Q R X d S )NzSample is not a 2D array)matchr   r   g      ?r   r   )r   r   zBounds are not consistent a < br   z=shape mismatch: objects cannot be broadcast to a single shaper   z3Sample dimension is different than bounds dimensionzSample is not in unit hypercubeg      ?zSample is out of bounds   g      @T)r   r   r   )pytestraises
ValueErrorr
   r   r   r   )r   r   r!   r   r   r    r"   r"   r#   test_scale_errors:   s0    
"""zTestUtils.test_scale_errorsc             C   s  t ddgddgddgddgddgddgg}d| d d	 }t ddgddgddgddgddgddgg}d| d d	 }tt|d
dd tt|ddd t ddddddgddddddgddddddgddddddgddddddgddddddgddddddgg}d| d d }ttj|ddddd ttj|ddddd ttj|ddddd x@dD ]8}t d|  }ttjt dg| gdd| qnW d S )Nr   r   r   r      r   g       @g      ?g      (@gǘ?g-C6?)atolg/$?g      @MD)methodg      @WDgS?CDg:M?)r   r4   r/          @   zL2-star)r   r   r   r
   discrepancysqrt)r   space_1Zspace_2r*   dimrefr"   r"   r#   test_discrepancy^   s0    ..
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 Q R X tjtd	d tddg W d Q R X d
d
gddgddgg}tjtdd tj|dd W d Q R X d S )Nr   r   r   r   r4   r   zSample is not in unit hypercube)r.   zSample is not a 2D arrayr   g      ?z'toto' is not a valid ...Ztoto)r7   )r   r   r0   r1   r2   r
   r=   )r   r*   r"   r"   r#   test_discrepancy_errors   s    .z!TestUtils.test_discrepancy_errorsc             C   sr  t ddddddgddddddgddddddgddddddgddddddgddddddgddddddgg}d| d d }ttj|dddd	d
d ttj|ddddd
d ttj|ddddd
d x@dD ]8}t d|  }ttjt dg| gddd| qW |tddd  tj	t
dd tj|dd W d Q R X tj	tdd tj|dd W d Q R X d S )Nr   r   g       @g      ?g      @r6   r/   )r7   workersg      @g-C6?)r5   r8   gS?r9   g:M?)r   r4   r/   r:   r;   r<   r   zL2-star	cpu_countc               S   s   d S )Nr"   r"   r"   r"   r#   <lambda>       z5TestUtils.test_discrepancy_parallel.<locals>.<lambda>zCannot determine the)r.   )rD   zInvalid number of workers...r   )r   r   r   r
   r=   r>   setattrosr0   r1   NotImplementedErrorr2   )r   Zmonkeypatchr*   r@   rA   r"   r"   r#   test_discrepancy_parallel   s4    
z#TestUtils.test_discrepancy_parallelz1.17z+default_rng not available for numpy, < 1.17)reasonc          	   C   s  t ddgddgddgddgddgddgg}d| d d	 }tj|d d
 dd}t|d
 |d d
 |}t|ddd t jd}|d}t|}tj|d d
 dd}t|d
 |d d
 |}t||dd tj	t
dd" t|d
 |d d
 d | W d Q R X tj	t
dd t|d
 |d | W d Q R X ddg}tj	t
dd t||d d
 | W d Q R X ddgg}tj	t
dd t||d d
 | W d Q R X dddg}tj	t
dd t||d d
 | W d Q R X d S )Nr   r   r   r   r4   r   g       @g      ?g      (@rE   T)Z	iterativegǘ?g-C6?)r5   l	   gy,!uUxFYo9"] )r4   r&   zSample is not in unit hypercube)r.   zSample is not a 2D arrayr   zx_new is not in unit hypercubeg      ?zx_new is not a 1D arrayg333333?g?z&x_new and sample must be broadcastable)r   r   r
   r=   r   r   r'   Zdefault_rngr0   r1   r2   )r   r?   Z	disc_initZ	disc_iterrngZdisc_refZx_newr"   r"   r#   test_update_discrepancy   s0    .

&

z!TestUtils.test_update_discrepancyc             C   s   dd }dd }dd }dd }t j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   g      ?r   )axisr   gUUUUUU?)shaper   sumprodabs)xnsxijdisc1xkjdisc2r"   r"   r#   disc_c2   s    
4>
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 )Ng      ?r   )rP   r   gUUUUUU?r   )rQ   r   rR   rS   rT   )rU   rV   rW   rX   rZ   Zdiscr"   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?g      ?g      ?r   r   )rP   g      ?g      ?r   gUUUUUU?)rQ   r   rR   rS   rT   )rU   rV   rW   rX   rY   rZ   r[   r"   r"   r#   disc_md   s    
4N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   )rP   c                sH   g | ]@}t  D ]2}td t|ddf |ddf  qqS )r   N)ranger   rS   maximum).0kj)rV   rU   r"   r#   
<listcomp>  s   z_TestUtils.test_discrepancy_alternative_implementation.<locals>.disc_star_l2.<locals>.<listcomp>)rQ   r   r>   rR   rS   r_   )rU   rW   r"   )rV   rU   r#   disc_star_l2  s    
8zKTestUtils.test_discrepancy_alternative_implementation.<locals>.disc_star_l2r   r%   r&   r9   )r7   r8   r6   zL2-starN)r   r'   r(   r)   r
   r=   r   )r   r\   r]   r^   re   r*   Z	disc_currZdisc_altr"   r"   r#   +test_discrepancy_alternative_implementation   s$    



z5TestUtils.test_discrepancy_alternative_implementationc             C   sL   t d}|d dkstt d}|d dks0tt d}|d dksHtd S )Nr&   rE         i  i^  i5	  )r   AssertionError)r   primesr"   r"   r#   test_n_primes*  s    zTestUtils.test_n_primesc             C   s8   t d}dddddddd	d
ddddddg}t|| d S )N2   r   r   r                     rg      %   )   +   /   )r   r   )r   rj   r    r"   r"   r#   test_primes4  s    "zTestUtils.test_primesN)__name__
__module____qualname__r$   r-   r3   rB   rC   rL   r0   markZskipifr   r   __version__rO   rf   rk   rx   r"   r"   r"   r#   r      s   	$%#+I
r   c               @   s   e Zd Zdd Zdd ZdS )TestVDCc          
   C   s^   t jd}td|d}dddddd	d
dddg
}t|| tdd|d}t||dd   d S )Ni90  r&   )r(   g        g      ?g      ?g      ?g      ?g      ?g      ?g      ?g      ?g      ?rm   r   )start_indexr(   )r   r'   RandomStater   r   )r   r(   r*   r    r"   r"   r#   test_van_der_corput;  s    
zTestVDC.test_van_der_corputc             C   sL   t jd}tdd|d}t jd}tddd|d}t||dd   d S )Ni@ r&   T)scrambler(   rm   r   )r   r   r(   )r   r'   r   r   r   )r   r(   r    r*   r"   r"   r#   test_van_der_corput_scrambleD  s    z$TestVDC.test_van_der_corput_scrambleN)ry   rz   r{   r   r   r"   r"   r"   r#   r~   :  s   	r~   c                   s&   e Zd Z fddZdddZ  ZS )RandomEnginec                s   t  j||d d S )N)dr(   )super__init__)r   r   r(   )	__class__r"   r#   r   O  s    zRandomEngine.__init__r   c             C   sP   |  j |7  _ y| j|| jf}W n& tk
rJ   | j|| jf}Y nX |S )N)num_generatedrN   r'   r   AttributeErrorZrandom_sample)r   rV   r*   r"   r"   r#   r'   R  s    zRandomEngine.random)r   )ry   rz   r{   r   r'   __classcell__r"   r"   )r   r#   r   N  s   r   c           	   C   s   t jd} td| d}|jdd}|jdd}|jdks>t|  |jdksTt|jdd}t|| |  |jdd |jdd}t|| |jdkstt	j
td	d
 td| d W d Q R X d S )Ni@ r   )r(   r   )rV   rm      r   zd must be an integer value)r.   )r   )r   r'   r   r   r   ri   resetr   fast_forwardr0   r1   r2   )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
eedddZeejdd	d
Zejjde	e
ddd Zejjde	e
ddd Zejjde	e
ddd Zejjde	e
ddd Zejjde	e
ddd Zejjde	e
ddd Zejjde	e
ddd Zejjde	e
ddd Zejddgdd ZdS ) QMCEngineTestszGeneric tests for QMC engines.TFZ	ScrambledZUnscrambled)r   returnc             K   sN   t jd}| jr(| jf ||d|S |r6t  n| jf d|i|S d S )Ni@ )r   r(   r(   )r   r'   r   can_scrambleqmcer0   skip)r   r   kwargsr(   r"   r"   r#   r     s    
zQMCEngineTests.enginec             C   s   |r
| j S | jS )N)scramble_ndunscramble_nd)r   r   r"   r"   r#   	reference  s    zQMCEngineTests.referencer   )idsc             C   s,   | j d|d}|d}ttd| d S )Nr   )r   r   r4   )r4   r   )r   r'   r   r   empty)r   r   r   r*   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   r   )r   r   r   r*   r"   r"   r#   test_0sample  s    
zQMCEngineTests.test_0samplec             C   s*   | j d|d}|d}d|jks&td S )Nr   )r   r   r   )r   r   )r   r'   rQ   ri   )r   r   r   r*   r"   r"   r#   test_1sample  s    
zQMCEngineTests.test_1samplec             C   s@   | j d|d}|d}t|dks*tt|dks<td S )Nd   )r   r   i   r   r   )r   r'   r   allri   )r   r   r   r*   r"   r"   r#   test_bounds  s    
zQMCEngineTests.test_boundsc             C   sN   | j |d}| jd|d}|jt|d}t||dd |jt|ksJtd S )N)r   r   )r   r   )rV   r   )decimal)r   r   r'   lenr   r   ri   )r   r   
ref_sampler   r*   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/   )rV   r   )r   )r   r'   r   r   )r   r   r   r   Zn_half_r*   r"   r"   r#   test_continuing  s    zQMCEngineTests.test_continuingc             C   sJ   | j d|d}|jdd}|  |jdks0t|jdd}t|| d S )Nr   )r   r   r/   )rV   r   )r   r'   r   r   ri   r   )r   r   r   r   r*   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 }x6tdD ]*}|d dkr||  qj|d qjW t|d	d
 tdD  t|dd d S )Nr   )r   r   r/   )rV   r4   r   )r   r   c             S   s   g | ]}|d  dkr|qS )r   r   r"   )ra   ir"   r"   r#   rd     s    z4QMCEngineTests.test_fast_forward.<locals>.<listcomp>r   )	r   r'   r   r   r   r_   appendr   Zconcatenate)r   r   r   r   r*   Z
even_drawsr   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 )Nrl   )r   r   i   r   )rP   g      ?r   )r      g      ?K   g      ?)r   r'   r   r   meanrepeatZ
percentile)r   r   r   r   r*   r"   r"   r#   test_distribution  s    
 z QMCEngineTests.test_distributionN)ry   rz   r{   __doc__NotImplementedr   r   r   r   r   r   boolr   r   r   Zndarrayr   r0   r|   Zparametrizer   r   r   r   r   r   r   r   r   r"   r"   r"   r#   r   w  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!S )"
TestHaltonTr   g      ?gUUUUUU?g      ?gUUUUUU?g      ?gqq?g      ?gqq?g      ?g98?g      ?gqq?g      ?grq?gݵ D,?g?gZ "?g,D?gkX?g^-wfB?gZ "?g)?gݵ D,?g뢮?gZ "?g(2l?g bA?gNZ?gZ "?gWB%?N)ry   rz   r{   r
   ZHaltonr   r   r   r   r   r   r"   r"   r"   r#   r     s   
r   c               @   s6   e Zd ZejZdZdd Zdd Zdd Z	dd	 Z
d
S )TestLHSFc             G   s   t d d S )NzNot applicable: not a sequence.)r0   r   )r   argsr"   r"   r#   r   	  s    zTestLHS.test_continuingc             G   s   t d d S )NzNot applicable: not a sequence.)r0   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.)r0   r   )r   r   r"   r"   r#   r     s    zTestLHS.test_samplec             C   s   d\}}t |d | }t |||fj}| j|ddd}|j|d}t j|dd}t|| t ||ksrt	| j|ddd}|j|d}t j|dd}t
||d| d	 t || d| kst	d S )
N)r4      g      ?FT)r   r   Zcentered)rV   r   )rP   )r5   )r   ZarangeZbroadcast_toTr   r'   sortr   anyri   r   )r   r   rV   Z
expected1dexpectedr   r*   Zsorted_sampler"   r"   r#   test_sample_stratified  s    
zTestLHS.test_sample_stratifiedN)ry   rz   r{   r
   ZLatinHypercuber   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 )#	TestSobolTg        g      ?g      ?g      ?g      ?g      ?g      ?g      ?g@F?gt?g:(8?gB䟕?gY.?gX-?gO?g_dz?gnyz?gk=l?g?g.zn?gH	 
?g9<(?gT`?g-m?c          	   C   sB   t jtdd* tjd}tjd|d}|d W d Q R X d S )Nz'The balance properties of Sobol' points)r.   i90  r   )r(   r&   )r0   ZwarnsUserWarningr   r'   r   r
   Sobol)r   r(   r   r"   r"   r#   test_warning=  s    zTestSobol.test_warningc          	   C   s   t jd}tjdd|d}|d}t| jd d | |d}t| jdd | tj	t
dd |d W d Q R X d S )	Ni90  r   F)r   r(   r4   r/   z'The balance properties of Sobol' points)r.   )r   r'   r   r
   r   Zrandom_base2r   r   r0   r1   r2   )r   r(   r   r*   r"   r"   r#   test_random_base2D  s    

zTestSobol.test_random_base2c          	   C   s@   t jd}tjtdd tjtjjd |d W d Q R X d S )Ni90  z Maximum supported dimensionality)r.   r   )r(   )	r   r'   r   r0   r1   r2   r
   r   ZMAXDIM)r   r(   r"   r"   r#   
test_raiseU  s    zTestSobol.test_raisec             C   sl   t jd}tjdd|d}t|   }t|   }t|tddi t|tddi d S )Ni90  iW  F)r   r(   g        g      ?)	r   r'   r   r
   r   r   flattentolistr   )r   r(   r   Zcount1Zcount2r"   r"   r#   test_high_dim[  s    zTestSobol.test_high_dimN)ry   rz   r{   r
   r   r   r   r   r   r   r   r   r   r   r   r"   r"   r"   r#   r   &  s,   

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   s   t dddddg}tjtdd t| W d Q R X t dddddg}d	}tjt|d t| W d Q R X t ddd
ddg}t jd}d}tjt|d tj|tj	d|dd W d Q R X d}tjt|d tj|t jjd W d Q R X d S )NgQ?gp=
ף?ggffffff?g)\(?z'Elements of pvals must be non-negative.)r.   g?z Elements of pvals must sum to 1.g?i90  z Dimension of `engine` must be 1.r   )r   r(   )r   z"`engine` must be an instance of...)
r   r   r0   r1   r2   r
   MultinomialQMCr'   r   r   )r   pmessager(   r"   r"   r#   test_validationse  s    "z#TestMultinomialQMC.test_validationszignore::UserWarningc             C   sV   t jd}t dddddg}t ddd	d
dg}tj||d}t|d| d S )Ni90  gQ?gp=
ף?g?gffffff?g)\(?r   r   r   #      )r(   r   )r   r'   r   r   r
   r   r   )r   r(   r   r   r   r"   r"   r#   test_MultinomialBasicDraw|  s
    z,TestMultinomialQMC.test_MultinomialBasicDrawc             C   sT   t jd}t dddddg}tj||d}|d}t|t | |d	d
 d S )Ni90  gQ?gp=
ף?g?gffffff?g)\(?)r(   i    r4   )r   )r   r'   r   r   r
   r   r   rR   )r   r(   r   r   Zdrawsr"   r"   r#   test_MultinomialDistribution  s
    
z/TestMultinomialQMC.test_MultinomialDistributionc          
   C   s   t ddddddddg}t|}tt||d	d
 tt||dd tt||dd tt||dd tt||d|d  d S )Ng?g?g?g333333?g      ?g?gGz?g      ?g        r   r   gaۢ?g7?r   r   )r   r   r   r   r	   )r   Zp_cumulativesizer"   r"   r#   test_FindIndex  s    z!TestMultinomialQMC.test_FindIndexc             C   sh   t jd}t dddddg}t ddd	d
dg}tjdd|d}tj|||d}t|d| d S )Ni90  gQ?gp=
ף?g?gffffff?g)\(?r   r   r   r   r   r   T)r   r(   )r   r(   r   )r   r'   r   r   r
   r   r   r   )r   r(   r   r   base_enginer   r"   r"   r#   test_other_engine  s    z$TestMultinomialQMC.test_other_enginec             C   sX   t dddddg}t jd}tj||d}|d}|  |d}t|| d S )	NgQ?gp=
ף?g?gffffff?g)\(?i90  )r(   r   )r   r   r'   r   r
   r   r   r   )r   r   r(   r   samplesZsamples_resetr"   r"   r#   r     s    

zTestMultinomialQMC.test_resetN)ry   rz   r{   r   r0   r|   filterwarningsr   r   r   r   r   r"   r"   r"   r#   r   d  s   	
r   c              O   s$   | d}tjf dt|i|S )Nr   r   )popr
   MultivariateNormalQMCr   zeros)r   r   r   r"   r"   r#   _wrapper_mv_qmc  s    
r   c               @   s$   e Zd ZeZdZdd Zdd ZdS )TestMultivariateNormalQMCEngineFc             G   s   t d d S )NzJNot applicable: the value of reference sample is implementation dependent.)r0   r   )r   r   r"   r"   r#   r     s    z+TestMultivariateNormalQMCEngine.test_samplec             G   s   t d d S )Nz&Not applicable: normal is not bounded.)r0   r   )r   r   r"   r"   r#   r     s    z+TestMultivariateNormalQMCEngine.test_boundsN)ry   rz   r{   r   r   r   r   r   r"   r"   r"   r#   r     s   r   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d}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 )Ni@ r   )r   r(   )r   r   r   )rV   )r   r   r   )r   r   )r   r   )r   r'   r   r
   r   r   r   rQ   )r   r(   r   r   r"   r"   r#   test_NormalQMC  s    zTestNormalQMC.test_NormalQMCc             C   s   t jd}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 )Ni@ r   T)r   inv_transformr(   )r   r   r   )rV   )r   r   r   )r   r   )r   r   )r   r'   r   r
   r   r   r   rQ   )r   r(   r   r   r"   r"   r#   test_NormalQMCInvTransform  s    z(TestNormalQMC.test_NormalQMCInvTransformc             C   sL   t jd}tjdd|d}tjt d|d|d}| }t|jd d S )Ni@ r   F)r   r   r(   T)r   r   r   r(   )r   r   )	r   r'   r   r
   r   r   r   r   rQ   )r   r(   r   r   r   r"   r"   r#   r     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 dddgdddgg}t|| d S )Ni90  r   F)r   r   r(   )rV   g"10gŨk?g̹1gVEr   g[z4?g^qN?g2`ygT	&?)r   r'   r   r
   r   r   r   r   )r   r(   r   r   samples_expectedr"   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|| t jd}tjt d
|dd}|jdd}t dddgdddgg}t|| d S )Ni90  r   T)r   r(   r   )rV   g0:9?g|҉SĿgڿgft8?r   guSk?gv6{g{>?guOC)r   r'   r   r
   r   r   r   r   )r   r(   r   r   r   r"   r"   r#    test_NormalQMCSeededInvTransform  s    
z.TestNormalQMC.test_NormalQMCSeededInvTransformc             C   s   t jd}tjt d|d}|jdd}tt |jdddk sJt	tt |j
ddd	 dk slt	x0d
D ](}t|d d |f \}}|dksrt	qrW t | }t |d
 dk st	d S )Ni90  r   )r   r(      )rV   r   )rP   g{Gz?r   )r   r   g?)r   r'   r   r
   r   r   r   rT   r   ri   stdr   cov	transpose)r   r(   r   r   r   r   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 sLt	tt |j
ddd
 d	k snt	x0dD ](}t|d d |f \}}|dkstt	qtW t | }t |d d	k st	d S )Ni90  r   T)r   r(   r   r   )rV   r   )rP   g{Gz?r   )r   r   g?)r   r'   r   r
   r   r   r   rT   r   ri   r   r   r   r   )r   r(   r   r   r   r   r   r   r"   r"   r#   !test_NormalQMCShapiroInvTransform!  s    "
z/TestNormalQMC.test_NormalQMCShapiroInvTransformN)
ry   rz   r{   r   r   r   r   r   r   r   r"   r"   r"   r#   r     s   	r   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   s6  t j }d}tjt|d" tjdgtjd|d|d W d Q R X d}tjt|d tjddgt jj|d W d Q R X d}tjt|d& tjddgd	dgdd	gg|d
 W d Q R X d}tjt|d& tjddgd	dgdd	gg|d
 W d Q R X d}tjt|d$ tjdgd	dgdd	gg|d
 W d Q R X d S )Nz(Dimension of `engine` must be consistent)r.   r   r   )r   r(   )r   r(   z"`engine` must be an instance of...zCovariance matrix not PSD.r   )r(   z#Covariance matrix is not symmetric.z/Dimension mismatch between mean and covariance.)	r   r'   r   r0   r1   r2   r
   r   r   )r   r(   r   r"   r"   r#   r   3  s$    
**z*TestMultivariateNormalQMC.test_validationsc             C   sL   t jd}tjdddgdddgdddgdddgg|d}|jd k	sHtd S )Ni@ r   r   r   )r(   )r   r'   r   r
   r   Z_corr_matrixri   )r   r(   r   r"   r"   r#   test_MultivariateNormalQMCNonPDL  s
    "z9TestMultivariateNormalQMC.test_MultivariateNormalQMCNonPDc             C   s  t jd}tjdd|d}| }t|jd |jdd}t|jd tjddgddgddgg|d}| }t|jd	 |jdd}t|jd
 t dddg}t dddgdddgdddgg}tj|||d}| }t|jd |jdd}t|jd d S )Ni@ r   r   )r   r   r(   )r   r   )rV   )r   r   r   )r   r   )r   r   r   )r(   )r   r   )r   r   )r   r'   r   r
   r   r   rQ   r   )r   r(   r   r   r   r   r"   r"   r#   test_MultivariateNormalQMCU  s&    "z4TestMultivariateNormalQMC.test_MultivariateNormalQMCc             C   s  t jd}tjddd|d}| }t|jd |jdd}t|jd tjdd	gd	dgdd	ggd|d}| }t|jd
 |jdd}t|jd t dd	dg}t d	ddgdd	dgddd	gg}tj||d|d}| }t|jd |jdd}t|jd d S )Ni@ r   r   T)r   r   r   r(   )r   r   )rV   )r   r   r   )r   r   )r   r   r   )r   r(   )r   r   )r   r   )r   r'   r   r
   r   r   rQ   r   )r   r(   r   r   r   r   r"   r"   r#   &test_MultivariateNormalQMCInvTransformo  s,    
"
z@TestMultivariateNormalQMC.test_MultivariateNormalQMCInvTransformc             C   s"  t jd}t jd t jdd}||  t t jd }tj	t 
ddg|d|d}|jdd}t 
dd	gd
dgg}t|| t jd}t jd t jdd}||  t t jd }tj	t 
dddg|d|d}|jdd}t 
dddgdddgg}t|| d S )Ni90  i1  r   r   F)r   r(   )rV   gb+ggԿgFvg]hx1r   gWдg-@g遏S?gd j @g?Bngu:?)r   r'   r   r(   randnr   diagr)   r
   r   r   r   )r   r(   r+   Ar   r   r   r"   r"   r#    test_MultivariateNormalQMCSeeded  s*    


z:TestMultivariateNormalQMC.test_MultivariateNormalQMCSeededc             C   s"  t jd}t jd t jdd}||  t t jd }tj	t 
ddg||dd}|jdd}t 
dd	gd
dgg}t|| t jd}t jd t jdd}||  t t jd }tj	t 
dddg||dd}|jdd}t 
dddgdddgg}t|| d S )Ni90  i1  r   r   T)r(   r   )rV   giTN?g_@/ܹ0rg~rܿgM ?r   g^?g.^gq?gd/gJg:q@g
Bԃ)r   r'   r   r(   r   r   r   r)   r
   r   r   r   )r   r(   r+   r   r   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 sVttt |j	ddd dk sxtx0d	D ](}t
|d d |f \}}|d
ks~tq~W t | }t |d	 dk st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dg dk s.ttt |j	ddt d dk sXtx4d	D ],}t
|d d |f \}}|d
ks^tq^W t | }t |d	 d dk std S )Ni90  r   r   )r   r   r(   r   )rV   )rP   g{Gz?)r   r   g?g      ?g       @g      ?g      ?r   )r   r'   r   r
   r   r   rT   r   ri   r   r   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 sXttt |j	ddd d	k sztx0d
D ](}t
|d d |f \}}|dkstqW t | }t |d
 d	k st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dg d	k s2ttt |j	ddt d d	k s\tx4d
D ],}t
|d d |f \}}|dksbtqbW t | }t |d
 d d	k std S )Ni90  r   r   T)r   r   r(   r   r   )rV   )rP   g{Gz?)r   r   g?g      ?g       @g      ?g      ?r   )r   r'   r   r
   r   r   rT   r   ri   r   r   r   r   r>   )r   r(   r   r   r   r   r   r   r"   r"   r#   -test_MultivariateNormalQMCShapiroInvTransform  s2    "
(*
zGTestMultivariateNormalQMC.test_MultivariateNormalQMCShapiroInvTransformc             C   s  t jd}tjdddgdddgdddgdddgg|d}|jdd}tt |jdd	d
k sdtt t 	|d d df d d
k stt t 	|d d df d d
k stt t 	|d d df t 
d d
k stx0dD ](}t|d d |f \}}|dkstqW t | }t |d d
k s:tt |d d d
k sVttt |d d df |d d df  |d d df  dk std S )Ni90  g        g      ?g       @)r   r   r(   i   )rV   r   )rP   g{Gz?r   r   )r   r   r   g?)r   r   )r   r   gh㈵>)r   r'   r   r
   r   r   rT   r   ri   r   r>   r   r   r   )r   r(   r   r   r   r   r   r   r"   r"   r#   $test_MultivariateNormalQMCDegenerate  s$    ((.
6z>TestMultivariateNormalQMC.test_MultivariateNormalQMCDegenerateN)ry   rz   r{   r   r   r   r   r   r   r   r   r   r"   r"   r"   r#   r   1  s   	 !$r   )&rJ   collectionsr   r0   numpyr   Znumpy.testingr   r   r   r   r   Zscipy.statsr   Zscipy.stats._sobolr	   r
   Zscipy.stats._qmcr   r   r   r   r   Zscipy._lib._pep440r   r   r~   r   r   r   r   r   r   r   r   r   r   r   r"   r"   r"   r#   <module>   s0     *{!>Dx