
    -iiy                        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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          Z G d d          Z  G d dej                  Z!d Z"d Z#d Z$d Z% G d d          Z& G d de&          Z' G d de&          Z( G d de&          Z) G d d          Z* G d de&          Z+ G d  d!          Z, G d" d#          Z- G d$ d%          Z. G d& d'          Z/d( Z0ej1        2                    d)ej3        ej4        ej5        ej6        g          d*             Z7dS )+    N)Counter)combinationsproduct)assert_allcloseassert_equalassert_array_equalassert_array_less)distance)shapiro)_test_find_index_test_low_0_bit)qmc)van_der_corputn_primesprimes_from_2_toupdate_discrepancy	QMCEngine_l1_norm_perturb_discrepancy&_lloyd_centroidal_voronoi_tessellationc                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
ej                            d	d
          ej        j        d                         Zd Zd Zd Zd Zd ZdS )	TestUtilsc                 (   dgdgdgg}dgdgdgg}t          j        |dd          }t          ||           ddgddgddgg}t          j        ddgddgg          }ddgddgdd	gg}t          j        ||d         |d                   }t          ||           t          j        ||d         |d         d
          }t          ||           g dg dg dg}dg d}}g dg dg dg}t          j        |||          }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outscaled_spaceboundsscaled_back_spacer    r!   s           `/var/www/html/bet.cuttalo.com/ml/venv/lib/python3.11/site-packages/scipy/stats/tests/test_qmc.py
test_scalezTestUtils.test_scale   so   qcC5!taS1#ya@@@c*** Q!Q#s,B7QF+,,AwAC)yVAYOOOc***IlVAY/5ay$H H H)5111 III7			(yy)))]]]3yHMMMc*****    c                 P   t           j                            d          }|                    d          }|                    d           dz  }|                    d          dz  }t          j        |||d          }t          j        |||d          }t          ||           d S )Nl	   EaT4G*wv    
   r8   F)r%   T)r*   randomdefault_rngr   r)   r   )r,   rngsampleabscaledunscaleds          r2   test_scale_randomzTestUtils.test_scale_random4   s    i##$KLLH%%ZZ^^Ob JJrNNR61a7779VQ4888&)))))r4   c                 8   t          j        t          d          5  g d}t          j        |dd           d d d            n# 1 swxY w Y   t          j        t          d          5  ddgd	d	gd
d
gg}t          j        ddgddgg          }t          j        ||d         |d	                    d d d            n# 1 swxY w Y   t          j        t          d          5  ddgd	d	gd
d
gg}g dddg}}t          j        |||           d d d            n# 1 swxY w Y   t          j        t          d          5  ddgd	d	gd
d
gg}t          j        g dg dg          }t          j        ||d         |d	                    d d d            n# 1 swxY w Y   t          j        t          d          5  ddgd	dgd
d
gg}t          j        ddgddgg          }t          j        ||d         |d	                    d d d            n# 1 swxY w Y   t          j        t          d          5  ddgddgddgg}t          j        ddgddgg          }t          j        ||d         |d	         d           d d d            d S # 1 swxY w 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-   r0   r    r!   r.   s         r2   test_scale_errorszTestUtils.test_scale_errors=   s   ]:-HIII 	6 	6KKEIeb15555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 ]:-IJJJ 	E 	EVaVc3Z0EXAwA/00FIefQi&)DDDD	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E
 ]: .G H H H 	C 	CVaVc3Z0E!+aVhHIehBBBB		C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C ]: .G H H H 	E 	EVaVc3Z0EXzzz999566FIefQi&)DDDD		E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E ]: .: ; ; ; 	E 	EVaXSz2EXAwA/00FIefQi&)DDDD		E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E ]:-GHHH 	$ 	$7QFQH-CXAwA/00FIcF1Iq	"$ $ $ $	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$so   AAA*A	B??CC%+DD #D A	FFF=A	HHH8A
JJJc           
      V   t          j        ddgddgddgddgddgddgg          }d|z  dz
  d	z  }t          j        ddgddgddgddgddgddgg          }d|z  dz
  d	z  }t          t          j        |          d
d           t          t          j        |          dd           t          j        g dg dg dg dg dg dg dg          }d|z  dz
  dz  }t          t          j        |d          dd           t          t          j        |d          dd           t          t          j        |d          dd           dD ]U}t          j        d| z            }t          t          j        t          j        dg|z  g          d          |           Vd S )Nr   r'   r   r      r"          @      ?      (@ǘ?-C6?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   rN   rH          @   L2-star)r*   r+   r   r   discrepancysqrt)r,   space_1space_2r<   dimrefs         r2   test_discrepancyzTestUtils.test_discrepancy_   s?   (QFQFQFQFQFQFKLL=3&95(QFQFQFQFQFQFKLL=3&95 	00&tDDDD00&tDDDD
 ---------------------/ 0 0 ,$3t<<<f!	# 	# 	# 	#t<<<f!	# 	# 	# 	#t<<<f!	# 	# 	# 	# ) 	D 	DC'!sd)$$CCOBHqc#gY,?,?3<> > >?BD D D D	D 	Dr4   c           	         t          j        ddgddgddgddgddgddgg          }t          j        t          d          5  t          j        |           d d d            n# 1 swxY w Y   t          j        t          d	          5  t          j        ddg           d d d            n# 1 swxY w Y   d
d
gddgddgg}t          j        t          d          5  t          j        |d           d d d            d S # 1 swxY w Y   d S )Nr   r'   r   r   rN   r"   rG   rD   rC   r   r   'toto' is not a valid ...totor_   )r*   r+   rI   rJ   rK   r   rj   r,   r<   s     r2   test_discrepancy_errorsz!TestUtils.test_discrepancy_errors   s   Aq6Aq6Aq6Aq6Aq6Aq6JKK]@
 
 
 	$ 	$ OF###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$
 ]:-HIII 	$ 	$OQF###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ a&1a&3*-]:-IJJJ 	3 	3OF62222	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3s6   A##A'*A'	B,,B03B0DDDc           
      j   t          j        g dg dg dg dg dg dg dg          }d|z  d	z
  d
z  }t          t          j        |dd          dd           t          t          j        |dd          dd           t          t          j        |dd          dd           dD ]V}t          j        d| z            }t          t          j        t          j        dg|z  g          dd          |           W|                    t          dd            t          j	        t          d          5  t          j        |d           d d d            n# 1 swxY w Y   t          j	        t          d          5  t          j        |d            d d d            d S # 1 swxY w Y   d S )!NrV   rW   rX   rY   rZ   r[   r\   rO   rP   r]   r^   rH   )r`   workersr#   rS   rT   ra   rb   rc   rd   re   r'   r   ri   	cpu_countc                      d S N r|   r4   r2   <lambda>z5TestUtils.test_discrepancy_parallel.<locals>.<lambda>   s    T r4   zCannot determine therD   rw   zInvalid number of workers...r   )r*   r+   r   r   rj   rk   setattrosrI   rJ   NotImplementedErrorrK   )r,   monkeypatchr<   rn   ro   s        r2   test_discrepancy_parallelz#TestUtils.test_discrepancy_parallel   s   ---------------------/ 0 0 ,$3tQGGG!	# 	# 	# 	# 	tQGGG!	# 	# 	# 	# 	tQGGG!	# 	# 	# 	# ) 	P 	PC'!+&&CCOBHqcCi[,A,A3<bJ J JKNP P P P 	B\\:::].6LMMM 	0 	0OFB////	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 ]:-KLLL 	0 	0OFB////	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0s$   ;EE"%E"F((F,/F,c           	         t          j        ddgddgddgddgddgddgg          }t          j        t          d          5  t          j        |           d d d            n# 1 swxY w Y   t          j        t          d	          5  t          j        ddg           d d d            n# 1 swxY w Y   d
d
gddgddgg}t          j        t          d          5  t          j        |d           d d d            n# 1 swxY w Y   t          j        d
d
gd
d
gd
dgg          }t          j        t          d          5  t          j        |           d d d            n# 1 swxY w Y   t          j        ddgg          }t          j        t          d          5  t          j        |           d d d            d S # 1 swxY w Y   d S )Nr   r'   r   r   rN   r"   rG   rD   rC   r   r   rr   rs   r_   z!Sample contains duplicate points.z'Sample must contain at least two points)	r*   r+   rI   rJ   rK   r   geometric_discrepancywarnsUserWarningrt   s     r2   !test_geometric_discrepancy_errorsz+TestUtils.test_geometric_discrepancy_errors   s   Aq6Aq6Aq6Aq6Aq6Aq6JKK]:-OPPP 	. 	.%f---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. ]:-HIII 	. 	.%q!f---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. a&1a&3*-]:-IJJJ 	= 	=%fV<<<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= Aq6Aq6Aq6233\+-PQQQ 	. 	.%f---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. C:,'']:-VWWW 	. 	.%f---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.sZ   A##A'*A'	B,,B03B0D  DDE$$E(+E(!GG
Gc                    t          j        ddgddgg          }t          t          j        |          t          j        d                     t          t          j        |d          t          j        d                     t          j        ddgddgddgg          }t          t          j        |          d           t          t          j        |d          d           t          j        ddgddgddgg          }t          t          j        |          t          j        d          d	z             t          t          j        |d          t          j        d          dz             t          t          j        |d
          d           t          t          j        |dd
          d           t           j                            d          }t          j        d|                              d          }t          t          j        |          d           t          t          j        |d          d           d S )Nr   r   r   mstr_   r         ?      ?rN   	chebyshev)metric)r`   r   l	   s;80riR$ r'   dr;   2   gY$?guڗ8?)	r*   r+   r   r   r   rk   r9   r:   LatinHypercube)r,   r<   r;   s      r2   test_geometric_discrepancyz$TestUtils.test_geometric_discrepancy   s   Aq6Aq6*++1&99271::FFF1&GGGQRTTTAq6Aq6C84551&993???1&GGGNNNAq6D$<!Q8991&99271::>JJJ1&GGGQRVWXXX1&MMMtTTT%fU;OOOQT	
 	
 	
 i##$KLL#aS11188<<1&99;NOOO%fU;;;=P	
 	
 	
 	
 	
r4   z5minimum_spanning_tree ignores zero distances (#18892)T)reasonstrictc                     t          j        ddgddgddgg          }t          t          j        |d          d           d S )Nr   r   r   r_   r   )r*   r+   r   r   r   rt   s     r2   2test_geometric_discrepancy_mst_with_zero_distancesz<TestUtils.test_geometric_discrepancy_mst_with_zero_distances   sL     Aq6Aq6Aq62331&GGGMMMMMr4   c           	      b   t          j        ddgddgddgddgddgddgg          }d|z  dz
  d	z  }t          j        |d d
         d          }t	          |d
         |d d
         |          }t          |dd           t           j                            d          }|                    d          }t          j        |          }t          j        |d d
         d          }t	          |d
         |d d
         |          }t          ||d           t          j	        t          d          5  t	          |d
         |d d
         dz   |           d d d            n# 1 swxY w Y   t          j	        t          d          5  t	          |d
         |d         |           d d d            n# 1 swxY w Y   ddg}t          j	        t          d          5  t	          ||d d
         |           d d d            n# 1 swxY w Y   ddgg}t          j	        t          d          5  t	          ||d d
         |           d d d            n# 1 swxY w Y   g d}t          j	        t          d          5  t	          ||d d
         |           d d d            d S # 1 swxY w Y   d S )Nr   r'   r   r   rN   r"   rO   rP   rQ   rx   T)	iterativerR   rS   rT   l	   gy,!uUxFYo9"] )rN   r8   rG   rD   rC   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   rj   r   r   r9   r:   rI   rJ   rK   )r,   rl   	disc_init	disc_iterr;   disc_refx_news          r2   test_update_discrepancyz!TestUtils.test_update_discrepancy   s/   (QFQFQFQFQFQFKLL=3&95OGCRCLDAAA	&wr{GCRCL)LL		65555 i##$KLL**W%%?7++OGCRCLDAAA	&wr{GCRCL)LL		8$7777 ]: .: ; ; ; 	I 	Iwr{GCRCL1,<iHHH	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I ]:-HIII 	C 	Cwr{GAJ	BBB	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C A]: .: ; ; ; 	? 	?ugcrclI>>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? s]:-GHHH 	? 	?ugcrclI>>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? ]: .> ? ? ? 	? 	?ugcrclI>>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	?sZ   3#E""E&)E&F22F69F6HH	H-III=J$$J(+J(c                    t           j                            d          }t          j        d|          }|                    d          }t          j        |          }t          d          D ]}|                    d          }|                    d          }|                    d          }t          |||||          }|||f         |||f         c|||f<   |||f<   t          j        |          }	t          ||	           d S )Nl	   PvWuW=lWx" r"   r;   r8   d   )
r*   r9   r:   r   r   rj   rangeintegersr   r   )
r,   r;   qmc_genr<   discirow_1row_2coldisc_references
             r2   test_perm_discrepancyzTestUtils.test_perm_discrepancy  s   i##$JKK$QC000##v&&s 		2 		2ALL$$ELL$$E,,q//C'uc4HHDucz"F5#:$6 3F5#:ucz 2 _V44ND.1111		2 		2r4   c                    d }d }d }d }t           j                            d          }|                    d          }t          j        |d          } ||          }t          ||           t          j        |d	          } ||          }t          ||           t          j        |d
          } ||          }t          ||           t          j        |d          } ||          }t          ||           dS )z,Alternative definitions from Matt Haberland.c                 f   | j         \  }}| }t          j        t          j        ddt          j        |dz
            z  z   dt          j        |dz
            dz  z  z
  d                    }| d d d d d f         }| d d d d d f         }t          j        t          j        t          j        ddt          j        |dz
            z  z   dt          j        |dz
            z  z   dt          j        ||z
            z  z
  d          d                    }d|z  d|z  |z  z
  d|dz  z  |z  z   S )Nr   r   r   axisr   gUUUUUU?shaper*   sumprodabsxnsxijdisc1xkjdisc2s          r2   disc_c2zFTestUtils.test_discrepancy_alternative_implementation.<locals>.disc_c2*  so   7DAqCF27A&)"&S//&9%:&)"&S//1*<&<%=DEG G G H HE D!!!QQQJ-CAAAtQQQJ-CF26"'!,/sSy0A0A,A+B,/sSy0A0A,A+B -0sSy0A0A,A+B IJ#K #K #K ()	* * * + +E
 A:!e+a1fUl::r4   c                 T   | j         \  }}| d d d d d f         }| d d d d d f         }t          j        t          j        t          j        dt          j        ||z
            z
  t          j        ||z
            dz  z   d          d                    }d|z   d|dz  z  |z  z   S )Nr(   r   r   r   gUUUUUU?r   r   )r   r   r   r   r   r   s         r2   disc_wdzFTestUtils.test_discrepancy_alternative_implementation.<locals>.disc_wd9  s    7DAqD!!!QQQJ-CAAAtQQQJ-C6"&+-6#)+<+<*=+-6#)+<+<a+?*@FG"I "I "I '() ) ) * *D 1H9qAv},,r4   c                    | j         \  }}| }t          j        t          j        ddt          j        |dz
            z  z
  dt          j        |dz
            dz  z  z
  d                    }| d d d d d f         }| d d d d d f         }t          j        t          j        t          j        ddt          j        |dz
            z  z
  dt          j        |dz
            z  z
  dt          j        ||z
            z  z
  dt          j        ||z
            dz  z  z   d          d	                    }d
|z  d|z  |z  z
  d|dz  z  |z  z   S )Ng?r   r   r   r   r   g      ?r   r   gUUUUUU?r   r   s          r2   disc_mdzFTestUtils.test_discrepancy_alternative_implementation.<locals>.disc_mdC  s   7DAqCF27C&)"&S//&9%:&)"&S//1*<&<%=DEG G G H HE D!!!QQQJ-CAAAtQQQJ-CF26"'$,/sSy0A0A,A+B,/sSy0A0A,A+B -0sSy0A0A,A+B -0sSy0A0A10D,D	+E
 01#2 #2 #2
 9:; ; ; < <E A:!e+a1fUl::r4   c                 *     j         \  }t          j        d| z  dd|z
  z  z  t          j        t          j        d dz  z
  d                    z  z
  t          j         fdt                    D                       dz  z  z             S )Nr'   r   r   r   c                     g | ]R}t                    D ]@}t          j        d t          j        |ddf         |ddf                   z
            ASS )r   N)r   r*   r   maximum).0kjr   r   s      r2   
<listcomp>z_TestUtils.test_discrepancy_alternative_implementation.<locals>.disc_star_l2.<locals>.<listcomp>X  sv       uQxx *+ GA
1QT7AadG < <<==   r4   )r   r*   rk   r   r   r   )r   r   r   s   ` @r2   disc_star_l2zKTestUtils.test_discrepancy_alternative_implementation.<locals>.disc_star_l2S  s    7DAq7qb	A!a%L1,&Q!V!444556 6&     "1XX     !V  r4   l	   j;<Q`siyX r6   rc   r_   ra   r^   ri   N)r*   r9   r:   r   rj   r   )	r,   r   r   r   r   r;   r<   	disc_currdisc_alts	            r2   +test_discrepancy_alternative_implementationz5TestUtils.test_discrepancy_alternative_implementation'  s3   	; 	; 	;	- 	- 	-	; 	; 	; 		 		 		 i##$KLLH%%OF4888	76??	8,,,OF4888	76??	8,,,OF4888	76??	8,,,OF9===	<''	8,,,,,r4   c                     t          d          }|d         dk    sJ t          d          }|d         dk    sJ t          d          }|d         dk    sJ d S )Nr8   rx         i  i^  i5	  )r   )r,   primess     r2   test_n_primeszTestUtils.test_n_primesq  sh    "bzR#bzS    #bzT!!!!!!r4   c                 L    t          d          }g d}t          ||           d S )Nr   )r   r'   r"                     r      %   )   +   /   )r   r   )r,   r   r.   s      r2   test_primeszTestUtils.test_primes{  s0    !"%%FFF$$$$$r4   N)__name__
__module____qualname__r3   rA   rL   rp   ru   r   r   r   rI   markxfailthread_unsafer   r   r   r   r   r   r|   r4   r2   r   r      s2       + + +<* * * $  $  $D#D #D #DJ3 3 3!0 !0 !0F. . .*
 
 
0 [J    [N N 	 
N(? (? (?T2 2 2"H- H- H-T" " "% % % % %r4   r   c                        e Zd Zd Zd Zd ZdS )TestVDCc                 "   t          d          }g d}t          ||           t          dd          }t          ||           t          dd          }t          ||           t          dd          }t          ||dd                     d S )	Nr8   )
        r   r   r         ?      ?      ?      ?g      ?g      ?rN   r~   rH   r   r'   )start_indexr   r   )r,   r<   r.   s      r2   test_van_der_corputzTestVDC.test_van_der_corput  s    ##- - -$$$A...$$$A...$$$q111ABB(((((r4   c                 4   d}t          dd|          }t          ddd|          }t          ||dd                     t          ddd|d	          }t          ||dd                     t          ddd|d
	          }t          ||dd                     d S )Nl	   	XCf
Kl<{O8 r8   Tscrambler;   r   r'   )r   r   r;   rN   )r   r   r;   rw   rH   r   )r,   r;   r.   r<   s       r2   test_van_der_corput_scramblez$TestVDC.test_van_der_corput_scramble  s    5R$C888q4SIIIABB(((1ta
 
 
 	ABB(((1ta
 
 
 	ABB(((((r4   c                     t          j        t          d          5  t          dd           d d d            d S # 1 swxY w Y   d S )Nz'base' must be at least 2rD   r8   r   )base)rI   rJ   rK   r   r,   s    r2   test_invalid_base_errorzTestVDC.test_invalid_base_error  s    ]:-IJJJ 	' 	'2A&&&&	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	's   ;??N)r   r   r   r   r   r   r|   r4   r2   r   r     sA        ) ) )) ) )"' ' ' ' 'r4   r   c                   .     e Zd Zd fd	ZddddZ xZS )RandomEngineNc                 P    t                                          |||           d S )N)r   optimizationr;   )super__init__)r,   r   r   r;   	__class__s       r2   r   zRandomEngine.__init__  s(    1<SAAAAAr4   r   r~   c                H    | j                             || j        f          }|S r{   )r;   r9   r   )r,   r   rw   r<   s       r2   _randomzRandomEngine._random  s     !TV--r4   )NN)r   )r   r   r   r   r  __classcell__)r   s   @r2   r   r     sc        B B B B B Ba         r4   r   c                     t          dd          } |                     d          }|                     d          }| j        dk    sJ |                                  | j        dk    sJ |                     d          }t	          ||           |                                  |                     d           |                     d          }t	          ||           | j        dk    sJ d S )	Nr   l	   F,@IY^+Ge r   r"   r   r      r   )r   r9   num_generatedresetr   fast_forward)enginesample_1sample_2sample_1_testsample_2_tests        r2   test_subclassing_QMCEnginer    s    !!HIIIF}}q}!!H}}q}!!H2%%%% LLNNN1$$$$MMAM&&M=))) LLNNN
!MMAM&&M=)))2%%%%%%r4   c                     t          j        t          d          5  t          d           d d d            n# 1 swxY w Y   t          j        t          d          5  t          d           d d d            n# 1 swxY w Y   d} t          j        t          |           5  t          d          }|                    dd           d d d            d S # 1 swxY w Y   d S )	Nz d must be a non-negative integerrD   )r   rx   z*'u_bounds' and 'l_bounds' must be integersr   g?r   )rI   rJ   rK   r   r   )msgr	  s     r2   test_raisesr    s   	z)L	M	M	M  T               
z)L	M	M	M  R               8C	z	-	-	- 2 2aS1112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2s0   8<<A::A>A>"'CCCc                     t          dd          } |                     dd          }t          t          j        |          dg           |j        t          j        d          k    sJ |                     ddd	          }t          t          j        |          ddg           d
}d}|                                  |                     d          }|||z
  z  |z   }t          j        |          	                    t          j
                  }|                                  |                     ||dd          }t          ||           |                     ||dd          }t          |                                |                                f||dz
  f           |                     ||dd          }t          |                                |                                f||f           d S )Nr   l	   llG[/Ww r   r8   r  r   int64T)r   endpointr      Fr!   r   r  r   )r   r   r   r*   uniquedtyper  r9   floorastyper  minmax)r	  r<   lowhigh
ref_samples        r2   test_integersr!    s   !!HIIIF __Q"_%%F6""QC(((<28G,,,,,,__Q"t_44F6""QF+++
CD LLNNNr""Jtcz*S0J*%%,,RX66J
LLNNN__S42_FFF$$$ __S43_GGF&**,,

-T!V}===__S43_FFF&**,,

-T{;;;;;r4   c                  V   d} t           j                            d          }|                    dd|           }|                    dd| d	          }t	          | |
          }|                    ||dd          }t          |                    d          |           t          |                    d          |dz
             |                    ||dd          }t          |                    d          |           t          |                    d          |           d S )Nr8   l	   G]	#0m$ave r  rx   )r  r  sizer   r"   T)r  r  r#  r  r   r   Fr  r   r   )r*   r9   r:   r   r   r   r  r  )r   r;   r  r  r	  r<   s         r2   test_integers_ndr$    s   
A
)

 E
F
FC
,,2BQ,
/
/C<<AAA<==D!%%%F__S43_GGF##S)))##T!V,,,__S43_FFF##S)))##T*****r4   c            
          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	Zdedej        fd
Zej                            de	e
          d             Zej                            de	e
          d             Zej                            de	e
          d             Zej                            de	e
          d             Zej                            de	e
          d             Zej                            de	e
          d             Zej                            de	e
          ej                            ddd  ej        dej        j                  f          d                         Zej                            de	e
          d             Zej                            ddg          d             Zd Zej                            dde j!        fdd fg          d             Z"d Z#dS )!QMCEngineTestszGeneric tests for QMC engines.TF	ScrambledUnscrambled	   \v$PdvuL2+C r   returnc                 |    | j         r | j        d||d|S |rt          j                     d S  | j        dd|i|S )N)r   seedr,  r|   )can_scrambleqmcerI   skip)r,   r   r;   kwargss       r2   r	  zQMCEngineTests.engine  sb      	549ChSCCFCCC 5 ty44c4V444r4   c                 "    |r| j         n| j        S r{   )scramble_ndunscramble_nd)r,   r   s     r2   	referencezQMCEngineTests.reference!  s    #+Ct1CCr4   )idsc                     |                      d|          }|                    d          }t          t          j        d          |           d S )Nr   r   r   rN   )rN   r   r	  r9   r   r*   emptyr,   r   r	  r<   s       r2   	test_0dimzQMCEngineTests.test_0dim$  H    q844q!!28F++V44444r4   c                     |                      d|          }|                    d          }t          t          j        d          |           d S )Nr   r7  r   r   r   r8  r:  s       r2   test_0samplezQMCEngineTests.test_0sample*  r<  r4   c                 x    |                      d|          }|                    d          }d|j        k    sJ d S )Nr   r7  r   r   r   )r	  r9   r   r:  s       r2   test_1samplezQMCEngineTests.test_1sample0  sA    q844q!!%%%%%%r4   c                     |                      d|          }|                    d          }t          j        |dk              sJ t          j        |dk              sJ d S )Nr   r7     r   r   )r	  r9   r*   allr:  s       r2   test_boundszQMCEngineTests.test_bounds6  sb    sX66s##vfk"""""vfk"""""""r4   c                     |                      |          }|                     d|          }|                    t          |                    }t	          ||d           |j        t          |          k    sJ d S )Nr   r   r7  r  r   rT   )r4  r	  r9   lenr   r  )r,   r   r   r	  r<   s        r2   test_samplezQMCEngineTests.test_sample=  sx    ^^X^66
q844Z11
6666#s:666666r4   c                 >   |                      d|          }|                    d          }|                      d|          }t          |          dz  }|                    |          }|                    |          }t          |||d          d           d S )Nr   r7  rH   r  r   rT   )r	  r9   rI  r   )r,   r   r	  r   n_half_r<   s          r2   test_continuingzQMCEngineTests.test_continuingF  s    q844]]Q]''
q844ZA%MMFM##((
677 3$??????r4   r;   c                  @    t           j                            d          S )Nr)  )r*   r9   r:   r|   r4   r2   r}   zQMCEngineTests.<lambda>X  s    BI))*QRR r4   N)marksc                 "   t          |          r
 |            }|                     d||          }|                    d          }|                                 |j        dk    sJ |                    d          }t          ||           d S )Nr   r   r   r;   rH   r  r   )callabler	  r9   r  r  r   )r,   r   r;   r	  r   r<   s         r2   
test_resetzQMCEngineTests.test_resetS  s     C== 	#%%Cq8==]]Q]''
#q((((##
+++++r4   c                 v   |                      d|          }|                    d          }|                      d|          }|                    d           |                    d          }t          ||dd          d           |                                 g }t          d          D ]H}|dz  dk    r(|                    |                                           3|                    d	           It          |d
 t          d          D                      t          j        |          d           d S )Nr   r7  rH   r  rN   r   rT   r   r   c                 $    g | ]}|d z  dk    |S )r   r   r|   )r   r   s     r2   r   z4QMCEngineTests.test_fast_forward.<locals>.<listcomp>~  s!    :::aq1uzzzzzr4   h㈵>)	r	  r9   r  r   r  r   appendr*   concatenate)r,   r   r	  r   r<   
even_drawsr   s          r2   test_fast_forwardz QMCEngineTests.test_fast_forwardi  s=   q844]]Q]''
q844A##
122T:::: 	
q 	' 	'A1uzz!!&--//2222##A&&&&::588:::;N:&&	
 	
 	
 	
 	
 	
r4   c                    d}|                      ||          }|                    d          }t          t          j        |d          t          j        d|          d           t          t          j        |d	d          t          j        d
|          d           t          t          j        |dd          t          j        d|          d           d S )Nr   r7  i   r   r   r   {Gz?rT      r   K   r   )r	  r9   r   r*   meanrepeat
percentile)r,   r   r   r	  r<   s        r2   test_distributionz QMCEngineTests.test_distribution  s    q844t$$GF###RYsA%6%6T	
 	
 	
 	
 	M&"1---ryq/A/A	
 	
 	
 	
 	M&"1---ryq/A/A	
 	
 	
 	
 	
 	
r4   c                     d}t          j        t          |          5  |                     ddd           d d d            d S # 1 swxY w Y   d S )Nz)'toto' is not a valid optimization methodrD   r   Frs   r   r   r   )rI   rJ   rK   r	  r,   messages     r2   test_raises_optimizerz$QMCEngineTests.test_raises_optimizer  s    >]:W555 	B 	BKK!e&KAAA	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	Bs   AAAzoptimization,metric	random-CDlloydc                 "    t          |            S r{   )r   r<   s    r2   r}   zQMCEngineTests.<lambda>  s    hv&6&6%6 r4   c                     |                      dd          }|                    d          } ||          }|                      dd|          }|                    d          } ||          }||k     sJ d S )Nr   Fr7  rh   r  re  )r	  r9   )	r,   r   r   r	  
sample_ref
metric_refoptimal_sample_metric_s	            r2   test_optimizerszQMCEngineTests.test_optimizers  s     q511]]R]((
VJ''
;;U;NN//B/''&//######r4   c                 *   t           j                            d          }g }t          d          D ]B}|                     dd|          }|                    |                    d                     Ct          j        t          d          5  t          |d	         |d
                    d d d            n# 1 swxY w Y   t          j        t          d          5  t          |d	         |d                    d d d            d S # 1 swxY w Y   d S )Nl	   B"V6DGlUN r'   r   TrR  rN   zArrays are not equalrD   r   r   )
r*   r9   r:   r   r	  rX  rI   rJ   AssertionErrorr   )r,   r;   r<   r   r	  s        r2   test_consume_prng_statez&QMCEngineTests.test_consume_prng_state  s   i##$FGGq 	, 	,A[[1t[==FMM&--**++++]>1GHHH 	/ 	/F1I...	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/]>1GHHH 	/ 	/F1I...	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/s$   B88B<?B<DDD)r)  )$r   r   r   __doc__NotImplementedr.  r-  r3  r2  r   r5  boolr   r	  r*   ndarrayr4  rI   r   parametrizer;  r?  rB  rF  rJ  rN  paramr   rT  r[  rc  rh  r   rj   rs  rv  r|   r4   r2   r&  r&    s       ((D!L"M Ke}H
&C 45 55 
	5 5 5 5 D$ D2: D D D D [Zs;;5 5 <;5
 [Zs;;5 5 <;5
 [Zs;;& & <;&
 [Zs;;# # <;# [Zs;;7 7 <;7 [Zs;;
@ 
@ <;
@ [Zs;;[3RRFLV[%>???	
 , ,  <;, [Zs;;
 
 <;
2 [Z$00
 
 10
B B B
 [#/*667	9 	$ 	$ 	$
/ 
/ 
/ 
/ 
/r4   r&  c                       e Zd Zej        ZdZ ej        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j        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! 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ؖ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                    |                      d          }|                     dd          }|                    t          |          d          }t	          ||d           |                                 |                    d	          }|                                 |                    d	d
          }t          ||           d S )NTrH  r   r7  rH   )r   rw   gMbP?rT   r8   r~   )r4  r	  r9   rI  r   r  r   r   )r,   r   r	  r<   s       r2   test_workerszTestHalton.test_workers  s    ^^T^22
q400Z!<<
6666 	__R((
Q//VZ(((((r4   N)r   r   r   r   Haltonr.  r-  r*   r+   r3  r2  r  r|   r4   r2   r~  r~    s        :DLBHq!fuen$enuen$enuen$enuen> ? ?M
 "(Z4'4'4'4'4'4'4'46 7 7K) ) ) ) )r4   r~  c                      e Zd Zej        ZdZd Zd Zd Z	e
j                            dddg          e
j                            dd	dg          e
j                            d
ddg          d                                     Zd Zd ZdS )TestLHSTc                 .    t          j        d           d S NzNot applicable: not a sequence.rI   r/  r,   argss     r2   rN  zTestLHS.test_continuing      566666r4   c                 .    t          j        d           d S r  r  r  s     r2   r[  zTestLHS.test_fast_forward  r  r4   c                 .    t          j        d           d S NzJNot applicable: the value of reference sample is implementation dependent.r  r  s     r2   rJ  zTestLHS.test_sample  %     1 	2 	2 	2 	2 	2r4   strengthr   r   r   Fr   Nri  c                    t           j                            d          }d}|dz  }d}t          j        |||||          }|                    |          }	|	j        ||fk    sJ |j        |k    sJ t          j        |          dz   |z  }
t          j        |
||f          j	        }t          j
        |	|k              sJ t          j        |	d	          }|rd|z  nd}t          |||
           t          j
        |	|z
  |k              sJ |dk    r|t          j        |          }t          t          ||                    }t          t!          |j                  d          D ]P\  }}|	d d ||gf         }||z                      t&                    }d |D             }t)          ||           Md S d S d S )Nl	   pIrtS"Md@B r"   r   r   )r   r   r  r   r;   r  r   r   r   rT   c                 ,    h | ]}t          |          S r|   )tuple)r   rows     r2   	<setcomp>z1TestLHS.test_sample_stratified.<locals>.<setcomp>	  s    555#5::555r4   )r*   r9   r:   r   r   r   r  arangebroadcast_toTanysortr   setr   r   r   r   r  intr   )r,   r   r   r  r;   pr   r   r	  r<   
expected1dexpectedsorted_sampletolunique_elementsdesiredr   r   
samples_2dresres_sets                        r2   test_sample_stratifiedzTestLHS.test_sample_stratified  s    i##$JKKqD#a(-51=(+- - - ##|1v%%%%#q((((
 illS(A-
?:1v668vf()))))Q///!(cAggqxc::::vfx'#-.....q==\1 illO'/?CCDDG$U68__a88 / /1#AAA1vI.
!A~--c2255555Wg.... =11/ /r4   c                     |                      dd          }|                    d          }|                      ddd          }|                    d          }t          ||           d S )Nr   Fr7  rh   r  ri  re  )r	  r9   r   )r,   r	  rn  rp  rq  s        r2   test_optimizer_1dzTestLHS.test_optimizer_1d  sj    q511]]R]((
;;U;MM//B/'':w/////r4   c                    d}t          j        t          |          5  t          j        dd           d d d            n# 1 swxY w Y   d}t          j        t          |          5  t          j        dd          }|                    d	           d d d            n# 1 swxY w Y   d}t          j        t          |          5  t          j        dd          }|                    d
           d d d            n# 1 swxY w Y   d}t          j        t          |          5  t          j        d
d          }|                    d           d d d            d S # 1 swxY w Y   d S )Nznot a valid strengthrD   r   r'   )r  z%n is not the square of a prime numberr   )r   r  rf   r"   zn is too small for d	   )rI   rJ   rK   r   r   r9   )r,   rg  r	  s      r2   r  zTestLHS.test_raises  s^   )]:W555 	. 	.q1----	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. ;]:W555 	 	'!a888FMM"	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ;]:W555 	 	'!a888FMM!	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 *]:W555 	 	'!a888FMM!	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	sG   AAA),B!!B%(B%	,DDD),E""E&)E&)r   r   r   r   r   r.  r-  rN  r[  rJ  rI   r   r{  r  r  r  r|   r4   r2   r  r    s        DL7 7 77 7 72 2 2 [Z!Q00[Z%77[^dK-@AA#/ #/ BA 87 10#/J0 0 0    r4   r  c                   *   e Zd Zej        ZdZ ej        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j        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 Zd Zd Zd Zej                            ddd g          d!             Z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                     t          j        t          d          5  t          j        d          }|                    d           d d d            d S # 1 swxY w Y   d S )N'The balance properties of Sobol' pointsrD   r   r8   )rI   r   r   r   Sobolr9   r,   r	  s     r2   test_warningzTestSobol.test_warningB  s    \+ .> ? ? ? 	 	Yq\\FMM"	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   *AAAc                    t          j        dd          }|                    d          }t          | j        d d         |           |                    d          }t          | j        dd         |           t          j        t          d          5  |                    d           d d d            d S # 1 swxY w Y   d S )Nr   FrH  rN   rH   r  rD   )r   r  random_base2r   r3  rI   rJ   rK   r,   r	  r<   s      r2   test_random_base2zTestSobol.test_random_base2H  s   1u---$$Q''4-bqb16::: $$Q''4-ac2F;;; ]: .> ? ? ? 	# 	#"""	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s   B99B= B=c                 L   t          j        t          d          5  t          j        t          j        j        dz              d d d            n# 1 swxY w Y   t          j        t          d          5  t          j        dd           d d d            d S # 1 swxY w Y   d S )Nz Maximum supported dimensionalityrD   r   zMaximum supported 'bits' is 64A   )bits)rI   rJ   rK   r   r  MAXDIMr   s    r2   
test_raisezTestSobol.test_raiseV  s+   ]: .? @ @ @ 	, 	,Ici&*+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, ]: .= > > > 	" 	"Iab!!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s#   'AAA5BB Bc                    t          j        dd          }t          |                                                                                                          }t          |                                                                                                          }t          |t          ddi                     t          |t          ddi                     d S )NiW  FrH  r   r   )r   r  r   r9   flattentolistr   )r,   r	  count1count2s       r2   test_high_dimzTestSobol.test_high_dim_  s    4%000002299;;<<002299;;<<VWc4[11222VWc4[1122222r4   r  r   r'   c                 2   t          j        dd|          }d|z  }|                    |          }t          | j        d |         |           t          j        t          d          5  |                                 d d d            d S # 1 swxY w Y   d S )Nr   Fr   r  zincreasing `bits`rD   )r   r  r9   r   r3  rI   rJ   rK   )r,   r  r	  nsr<   s        r2   	test_bitszTestSobol.test_bitsf  s    1u4888Wr""4-crc2F;;;]:-@AAA 	 	MMOOO	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   *BBBc                     t          j        ddd          }|                    d          }t          | j        |           d S )Nr   Frh   r  rH   )r   r  r9   r   r3  r  s      r2   test_64bitszTestSobol.test_64bitsp  sB    1u2666q!!4-v66666r4   N)r   r   r   r   r  r.  r-  r*   r+   r3  r2  r  r  r  r  rI   r   r{  r  r  r|   r4   r2   r  r  +  sE       9DLBHr2h"Cj#Tl#Tl$en$en$en$en. / /M "(Z4&	2'4'4'4'4'4'46 7 7K  # # #" " "3 3 3 [VaV,,  -,7 7 7 7 7r4   r  c                       e Zd Zd ZdS )TestLow0Bitc                 X    g d}|D ]"\  }}t          t          |          |           #d S )N)	r   r   rA  )r   r   r"   r   )r   rN   )l    !   )l        r   )l    "   )l    r  )r   r   )r,   test_vectorin_r.   s       r2   test_exampleszTestLow0Bit.test_examplesw  sM    
 
 
 $ 	4 	4HC--s3333	4 	4r4   N)r   r   r   r  r|   r4   r2   r  r  v  s#        4 4 4 4 4r4   r  c                      e Zd Zej        ZdZd Zd Zd Z	d Z
d Zd Zej                            dg d	g d
g          d             Zej                            dg d	g d
g          d             Zd Zej                            dg d	ddgg          ej                            dddgg          d                         Zd ZdS )TestPoissonFc                 .    t          j        d           d S )NzToo costly in memory.r  r  s     r2   rF  zTestPoisson.test_bounds  s    +,,,,,r4   c                 .    t          j        d           d S )Nz"Not applicable: recursive process.r  r  s     r2   r[  zTestPoisson.test_fast_forward  s    899999r4   c                 .    t          j        d           d S r  r  r  s     r2   rJ  zTestPoisson.test_sample  r  r4   c                    d}d}|                      d|d          }|                    |          }t          |          |k    sJ t          |          |k    sJ |                    |          }t          |          |k    sJ t          |          |k    sJ t	          j        ||gd          }t          |          |dz  k    sJ t          |          |k    sJ d S )	N皙?r   r   F)r   radiusr   r  r   r   )r	  r9   rI  l2_normr*   rY  )r,   r  r  r  r	  sample_initsample_continuedr<   s           r2   rN  zTestPoisson.test_continuing  s    q%@@mmbm));2%%%%{##v----!==2=..#$$****'((F2222.> ?aHHH6{{b1f$$$$v&((((((r4   c                    t           j                            d          }d}d\  }}||z
  |                    d          z  |z   }g d}ddg}t          |||          }|D ]^\  }	}
}|                     |	|
||          }|                    |          }t          |          |k    sJ t          |          |
k    sJ _d S )	Nl	   x_4vZ.c r   )g{Gz?皙?r"   )r   r'   rN   volumesurface)r   r  hyperspherer;   )r*   r9   r:   r   r.  rI  r  )r,   r;   r  r  r  radii
dimensionshypersphere_methodsgenr   r  r  r	  r<   s                 r2   test_mindistzTestPoisson.test_mindist  s    i##$KLL	Tszz!}},s2YY
'3j%)<==&) 	- 	-"Av{YYF   F ]]2&&Fv;;"$$$$6??f,,,,,	- 	-r4   c                     d}|                      d|          }|                                }t          |          |k    sJ d S )Nr  r   )r   r  )r.  
fill_spacer  )r,   r  r	  r<   s       r2   test_fill_spacezTestPoisson.test_fill_space  sJ    Qv..""$$v&((((((r4   r    rx   r   rx   )r   r   r   c                     d}g d}|                      d|||          }|                    d          }|D ]"}t          ||           t          ||           #d S )Nr  )r'   r'   r   r'   r   r  r    r!   r7   r.  r9   r	   )r,   r    r  r!   r	  r<   points          r2   test_sample_inside_lower_boundsz+TestPoisson.test_sample_inside_lower_bounds  s    H  
 
 r"" 	/ 	/EeX...h....	/ 	/r4   r!   c                     d}g d}|                      d|||          }|                    d          }|D ]"}t          ||           t          ||           #d S )Nr  )r  r   r'   r  r7   r  )r,   r!   r  r    r	  r<   r  s          r2   test_sample_inside_upper_boundsz+TestPoisson.test_sample_inside_upper_bounds  s    H  
 
 r"" 	/ 	/EeX...h....	/ 	/r4   c                     d}g d}g d}t          j        t          d          5  |                     d|||           d d d            d S # 1 swxY w Y   d S )Nr  )r'   r   r   r  z1Bounds are not consistent 'l_bounds' < 'u_bounds'rD   r'   r  rI   rJ   rK   r.  )r,   r  r    r!   s       r2   test_inconsistent_bound_valuez)TestPoisson.test_inconsistent_bound_value  s    ]EG G G 	P 	P II&8hIOOO	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	Ps   AAArx   r   r'   r   c                     d}t          j        t          d          5  |                     d|||           d d d            d S # 1 swxY w Y   d S )Nr  zP'l_bounds' and 'u_bounds' must be broadcastable and respect the sample dimensionrD   r'   r  r  )r,   r!   r    r  s       r2   test_inconsistent_boundsz$TestPoisson.test_inconsistent_bounds  s     ]$% % % 	 	 IIF!H    		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   AA	A	c                     d}t          j        t          |          5  t          j        dd           d d d            d S # 1 swxY w Y   d S )Nz*'toto' is not a valid hypersphere samplingrD   r   rs   )r  )rI   rJ   rK   r   PoissonDiskrf  s     r2   r  zTestPoisson.test_raises  s    ?]:W555 	3 	3OA62222	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3s   AA	AN)r   r   r   r   r  r.  r-  rF  r[  rJ  rN  r  r  rI   r   r{  r  r  r  r  r  r|   r4   r2   r  r    sr       ?DL- - -: : :2 2 2) ) )&- - -*) ) ) [Z,,,			)BCC
/ 
/ DC
/ [Z,,,			)BCC
/ 
/ DC
/P P P [Z,,,R)ABB[Z1a&22	 	 32 CB	3 3 3 3 3r4   r  c                       e Zd Zd Zej                            d          d             Zd Zd Z	ej                            d          d             Z
dS )TestMultinomialQMCc                 B   t          j        g d          }t          j        t          d          5  t          j        |d           d d d            n# 1 swxY w Y   t          j        g d          }d}t          j        t          |          5  t          j        |d           d d d            n# 1 swxY w Y   t          j        g d          }d	}t          j        t          |          5  t          j        |dt          j        d
                     d d d            n# 1 swxY w Y   d}t          j        t          |          5  t          j        |dt           j        	                                           d d d            d S # 1 swxY w Y   d S )N)Q?p=
ף?gffffff?)\(?z'Elements of pvals must be non-negative.rD   r8   )n_trials)r  r  r   r  r  z Elements of pvals must sum to 1.r  r  r  r  r  z Dimension of `engine` must be 1.r   r   )r  r	  "`engine` must be an instance of...)
r*   r+   rI   rJ   rK   r   MultinomialQMCr  r9   r:   )r,   r  rg  s      r2   test_validationsz#TestMultinomialQMC.test_validations  s   H44455]: .A B B B 	/ 	/q2....	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/
 H222335]:W555 	/ 	/q2....	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ H333445]:W555 	F 	Fq2ci!nnnEEEE	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 8]:W555 	O 	Oq2bi6K6K6M6MNNNN	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	OsG   AAAB66B:=B:4+D++D/2D/4FFFzignore::UserWarningc                 J   t           j                            d          }t          j        g d          }d}t          j        ||z                                t                    }t          j        |||          }t          |                    d          |d           d S )Nl	   (u@gP{- r   r   )r  r,  r   rT   )
r*   r9   r:   r+   
atleast_2dr  r  r   r  r   )r,   r;   r  r  r  r	  s         r2   test_MultinomialBasicDrawz,TestMultinomialQMC.test_MultinomialBasicDraw  s    i##$IJJH33344=A..55c::#AsCCCa(((;;;;;;r4   c                 :   t           j                            d          }t          j        g d          }t	          j        |d|          }|                    d          }t          |t          j        |          z  t          j        |          d           d S )Nl	   8X7:ct]+C: r   i    )r  r;   r   rS   rT   )	r*   r9   r:   r+   r   r  r   r   r  )r,   r;   r  r	  drawss        r2   test_MultinomialDistributionz/TestMultinomialQMC.test_MultinomialDistribution  s    i##$JKKH33344#A#>>>a  u-r}Q/?/?dKKKKKKr4   c                    t          j        g d          }t          |          }t          t	          ||d          d           t          t	          ||d          d           t          t	          ||d          d           t          t	          ||d          d           t          t	          ||d	          |d
z
             d S )N)r   皙?g?g333333?r   ?gGz?rP   r   r   r  r   gaۢ?g7?r'   rP   r   )r*   r+   rI  r   r   )r,   p_cumulativer#  s      r2   test_FindIndexz!TestMultinomialQMC.test_FindIndex&  s    x K K KLL<  %lD#>>BBB%lD#>>BBB%lD'BBAFFF%lD'BBAFFF%lD#>>qIIIIIr4   c                 z   t           j                            d          }t          j        g d          }d}t          j        ||z                                t                    }t          j        dd|          }t          j	        ||||          }t          |                    d          |d           d S )	Nl	   aFkq|'x< r   r   r   Tr   )r  r	  r;   rT   )r*   r9   r:   r+   r  r  r  r   r  r  r   )r,   r;   r  r  r  base_enginer	  s          r2   test_other_enginez$TestMultinomialQMC.test_other_engine/  s     i##$KLLH33344=A..55c::iDc:::#A(+- - -a(((;;;;;;r4   N)r   r   r   r  rI   r   filterwarningsr  r
  r  r  r|   r4   r2   r  r    s        O O O. [ 566< < 76<L L LJ J J [ 566	< 	< 76	< 	< 	<r4   r  c                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	TestNormalQMCc                    t          j        t          j        d                    }|                                }t          |j        d           |                    d          }t          |j        d           t          j        t          j        d                    }|                                }t          |j        d           |                    d          }t          |j        d	           d S )
Nr   )r`  r   r   r"   r  r"   r   r   rA  r  r   MultivariateNormalQMCr*   zerosr9   r   r   r,   r	  sampless      r2   test_NormalQMCzTestNormalQMC.test_NormalQMC=  s    *<<<--//W]F+++--!-$$W]F+++*<<<--//W]F+++--!-$$W]F+++++r4   c                    t          j        t          j        d          d          }|                                }t          |j        d           |                    d          }t          |j        d           t          j        t          j        d          d          }|                                }t          |j        d	           |                    d          }t          |j        d
           d S )Nr   T)r`  inv_transformr  r"   r  r  r   rA  r  r  r  s      r2   test_NormalQMCInvTransformz(TestNormalQMC.test_NormalQMCInvTransformK  s    *!D2 2 2--//W]F+++--!-$$W]F+++*!D2 2 2--//W]F+++--!-$$W]F+++++r4   c                 r   t           j                            d          }t          j        t          j        d          d|          }|                    d          }t          j        ddgdd	gg          }t          ||d
           t           j                            d          }t          j        t          j        d          d|          }|                    d          }t          j        g dg dg          }t          ||d
           t           j                            d          }t          j        dd|          }t          j        t          j        d          d||          }|                    d          }t          j        g dg dg          }t          ||d
           d S )Nl	   q)*syRM@
K r   F)r`  r   r,  r  LpɻgUygxDg?rS   rT   r'   r`  r   r;   )r#  r$  gZ?)g#ڎrgΌ~42?gԻx?nrN   Tr   )r`  r   r	  r;   )	r*   r9   r:   r   r  r  r+   r   r  )r,   r;   r	  r  samples_expectedr  s         r2   test_NormalQMCSeededz"TestNormalQMC.test_NormalQMCSeeded[  s   i##$KLL*!E= = =--!-$$8i%;&/%:%< = =!1==== i##$KLL*!Es< < <--!-$$8%E%E%E%E%E%E%G H H!1==== i##$KLLiDc:::*!EC
 
 
 --!-$$8%E%E%E%E%E%E%G H H!1======r4   c                 .   t           j                            d          }t          j        t          j        d          |d          }|                    d          }t          j        ddgdd	gg          }t          ||d
           t           j                            d          }t          j        t          j        d          |d          }|                    d          }t          j        g dg dg          }t          ||d
           d S )Nl	   9e)-%5Z%_6 r   T)r`  r;   r   r  <9\Mg+`?g]@"i?rS   rT   r'   )r)  r*  g,D?)g˚X`?g7@gaTR')r*   r9   r:   r   r  r  r+   r   )r,   r;   r	  r  r&  s        r2    test_NormalQMCSeededInvTransformz.TestNormalQMC.test_NormalQMCSeededInvTransform{  s&   i##$KLL*!#T; ; ;--!-$$8i%;&.%9%; < <!1==== i##$KLL*!#T; ; ;--!-$$8%E%E%E%B%B%B%D E E!1======r4   c                     dD ]l}t          j        |d          }t          j        t          j        |          |d          }|                                }t          |j        d|f           md S )Nr   r   r   Fr7  T)r`  r	  r   r   )r   r  r  r*   r  r9   r   r   )r,   r   r  r	  r  s        r2   r  zTestNormalQMC.test_other_engine  s     	0 	0A)a%888K.BHQKK6A=AC C CF mmooGA////	0 	0r4   c                    t           j                            d          }t          j        t          j        d          |          }|                    d          }t          t          j        |                    d                    dk               sJ t          t          j        |	                    d          d	z
            dk               sJ d
D ]&}t          |d d |f                   \  }}|dk    sJ 't          j        |                                          }t          j        |d
                   dk     sJ d S )Ni3  r   )r`  r;      r  r   r   r]  r   r  r  r*   r9   r:   r   r  r  rE  r   r`  stdr   cov	transposer,   r;   r	  r  r   rM  pvalr2  s           r2   test_NormalQMCShapiroz#TestNormalQMC.test_NormalQMCShapiro  s)   i##E***EEE--#-&&26',,A,..//$67777726'++1+--122T9::::: 	 	Agaaadm,,GAt#:::::fW&&(())vc$i  4''''''r4   c                    t           j                            d          }t          j        t          j        d          d|          }|                    d          }t          t          j        |                    d                    d	k               sJ t          t          j        |	                    d          d
z
            d	k               sJ dD ]&}t          |d d |f                   \  }}|dk    sJ 't          j        |                                          }t          j        |d                   d	k     sJ d S )Nir   Tr%  r/  r  r   r   r]  r   r  r  r0  r4  s           r2   !test_NormalQMCShapiroInvTransformz/TestNormalQMC.test_NormalQMCShapiroInvTransform  s2   i##H--*!Dc; ; ;--#-&&26',,A,..//$67777726'++1+--122T9::::: 	 	Agaaadm,,GAt#:::::fW&&(())vc$i  4''''''r4   N)
r   r   r   r  r!  r'  r+  r  r6  r8  r|   r4   r2   r  r  <  s~        , , ,, , , > > >@> > >&0 0 0( ( (( ( ( ( (r4   r  c                   D    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )TestMultivariateNormalQMCc                 B   d}t          j        t          |          5  t          j        dgt          j        d                     d d d            n# 1 swxY w Y   d}t          j        t          |          5  t          j        g dt          j        d                     d d d            n# 1 swxY w Y   d	}t          j        t          |          5  t          j        ddgt          j                                                   d d d            n# 1 swxY w Y   d
}t          j        t          |          5  t          j        ddgddgddgg           d d d            n# 1 swxY w Y   d}t          j        t          |          5  t          j        ddgddgddgg           d d d            n# 1 swxY w Y   d}t          j        t          |          5  t          j        dgddgddgg           d d d            d S # 1 swxY w Y   d S )Nz(Dimension of `engine` must be consistentrD   r   r   r  )r	  r&   rN   r  zCovariance matrix not PSD.r   z#Covariance matrix is not symmetric.z/Dimension mismatch between mean and covariance.)	rI   rJ   rK   r   r  r  r*   r9   r:   rf  s     r2   r  z*TestMultivariateNormalQMC.test_validations  s   =]:W555 	B 	B%qc#)a...AAAA	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B >]:W555 	H 	H%iii	AGGGG	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 8]:W555 	N 	N%q!fRY5J5J5L5LMMMM	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 0]:W555 	@ 	@%q!f1v1v.>???	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 9]:W555 	@ 	@%q!f1v1v.>???	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ E]:W555 	= 	=%qcQFQF+;<<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=sk   +AAA=,B55B9<B95DD"%D"E00E47E4GG	G*HHHc                 X    t          j        g dg dg dg dg          }|j        J d S )Nr&   )r   r   r   )r   r   r   )r   r   r   )r   r  _corr_matrixr  s     r2   test_MultivariateNormalQMCNonPDz9TestMultivariateNormalQMC.test_MultivariateNormalQMCNonPD  sG    *II			999iii8
 
 ".....r4   c                    t          j        dd          }|                                }t          |j        d           |                    d          }t          |j        d           t          j        ddgddgddgg          }|                                }t          |j        d           |                    d          }t          |j        d	           t          j        g d
          }t          j        g dg dg dg          }t          j        ||          }|                                }t          |j        d           |                    d          }t          |j        d           d S )Nr   r"   )r`  r2  r  r  r  r   rA  r  r-  r   r   r   r   r   r   r   r   r   r   r'   r"   r'   r   r  r9   r   r   r*   r+   r,   r	  r  r`  r2  s        r2   test_MultivariateNormalQMCz4TestMultivariateNormalQMC.test_MultivariateNormalQMC  sZ   *q999--//W]F+++--!-$$W]F+++ *AaVaV<LMMM--//W]F+++--!-$$W]F+++ x			""h			999iii899*455--//W]F+++--!-$$W]F+++++r4   c                    t          j        ddd          }|                                }t          |j        d           |                    d          }t          |j        d           t          j        ddgddgddggd          }|                                }t          |j        d	           |                    d          }t          |j        d
           t          j        g d          }t          j        g dg dg dg          }t          j        ||d          }|                                }t          |j        d           |                    d          }t          |j        d           d S )Nr   r"   T)r`  r2  r   r  r  r  r   rA  r  r-  r@  rA  rB  )r   rC  rD  rE  rF  s        r2   &test_MultivariateNormalQMCInvTransformz@TestMultivariateNormalQMC.test_MultivariateNormalQMCInvTransform  sl   *qMMM--//W]F+++--!-$$W]F+++ *Qq!fq!f-T
 
 
 --//W]F+++--!-$$W]F+++ x			""h			999iii899*4DIII--//W]F+++--!-$$W]F+++++r4   c                    t           j                            d          }|                    d          }||                                z  t          j        |                    d                    z   }t          j        t          j        ddg          |d|          }|                    d          }t          j        dd	gd
dgg          }t          ||d           t           j                            d          }|                    d          }||                                z  t          j        |                    d                    z   }t          j        t          j        g d          |d|          }|                    d          }t          j        g dg dg          }t          ||d           d S )Nl	   b{1/YK $`F r   r   r   r   F)r   r;   r  g X4g0<gΧU?gK\ @rS   rT   r'   r'   r'   r&   )gZh44gA->gZC)g~T~O?g*ʥo@gc}E?
r*   r9   r:   standard_normalr3  diagr   r  r+   r   r,   r;   r=   Ar	  r  r&  s          r2    test_MultivariateNormalQMCSeededz:TestMultivariateNormalQMC.test_MultivariateNormalQMCSeeded
  s   i##$KLL''

1 6 66*28QF+;+;Q9>CI I I--!-$$8h	%:&.%9%; < <!1==== i##$KLL''

1 6 66*28III+>+>9>CI I I--!-$$8%F%F%F%C%C%C%E F F!1======r4   c                    t           j                            d          }|                    d          }||                                z  t          j        |                    d                    z   }t          j        t          j        ddg          ||d          }|                    d          }t          j        dd	gd
dgg          }t          ||d           t           j                            d          }|                    d          }||                                z  t          j        |                    d                    z   }t          j        t          j        g d          ||d          }|                    d          }t          j        g dg dg          }t          ||d           d S )Nl	   A^}KT0zubN rK  r   r   T)r;   r   r  gFX?ggR4gO=`?rS   rT   rL  r'   r&   )go.2?gikD0NgPN)g4YgҫJC?g-v2 @rM  rP  s          r2   ,test_MultivariateNormalQMCSeededInvTransformzFTestMultivariateNormalQMC.test_MultivariateNormalQMCSeededInvTransform!  s   i##$KLL''

1 6 66*HaVaS
 
 
 --!-$$8h	%:&/%:%< = =!1==== i##$KLL''

1 6 66*HYYY4
 
 
 --!-$$8%E%E%E%D%D%D%F G G!1======r4   c                    t           j                            d          }t          j        ddgddgddgg|          }|                    d          }t          t          j        |                    d                    dk               sJ t          t          j        |                    d          dz
            dk               sJ d	D ]&}t          |d d |f                   \  }}|d
k    sJ 't          j
        |                                          }t          j        |d	                   dk     sJ t          j        ddgddgddgg|          }|                    d          }t          t          j        |                    d          ddgz
            dk               sJ t          t          j        |                    d          t          j        d          z
            dk               sJ d	D ]&}t          |d d |f                   \  }}|d
k    sJ 't          j
        |                                          }t          j        |d	         dz
            dk     sJ d S )Nl   V^Am%2r   r   r`  r2  r;   r/  r  r   r]  r  r  rP   rO   r(   r   r   r*   r9   r:   r   r  rE  r   r`  r1  r   r2  r3  rk   r4  s           r2   !test_MultivariateNormalQMCShapiroz;TestMultivariateNormalQMC.test_MultivariateNormalQMCShapiro:  su   i##$HII*Qq!fq!f-3
 
 
 --#-&&26',,A,..//$67777726'++1+--122T9::::: 	 	Agaaadm,,GAt#:::::fW&&(())vc$i  4'''' *s3*sCj!9s
 
 
 --#-&&26',,A,..!Q7884?@@@@@26'++1+--<==DEEEEE 	 	Agaaadm,,GAt#:::::fW&&(())vc$i#o&&------r4   c                    t           j                            d          }t          j        ddgddgddgg|d          }|                    d          }t          t          j        |                    d                    d	k               sJ t          t          j        |                    d          dz
            d	k               sJ d
D ]&}t          |d d |f                   \  }}|dk    sJ 't          j
        |                                          }t          j        |d
                   d	k     sJ t          j        ddgddgddgg|d          }|                    d          }t          t          j        |                    d          ddgz
            d	k               sJ t          t          j        |                    d          t          j        d          z
            d	k               sJ d
D ]&}t          |d d |f                   \  }}|dk    sJ 't          j
        |                                          }t          j        |d
         dz
            d	k     sJ d S )Nl	   A"l7D#maxbwcuC r   r   T)r`  r2  r;   r   r/  r  r   r]  r  r  rP   rO   r(   r   r   rW  r4  s           r2   -test_MultivariateNormalQMCShapiroInvTransformzGTestMultivariateNormalQMC.test_MultivariateNormalQMCShapiroInvTransformZ  s|   i##$KLL*Qq!fq!f-3d
 
 
 --#-&&26',,A,..//$67777726'++1+--122T9::::: 	 	Agaaadm,,GAt#:::::fW&&(())vc$i  4'''' *ssc3Z(	
 
 
 --#-&&26',,A,..!Q7884?@@@@@26'++1+--<==DEEEEE 	 	Agaaadm,,GAt#:::::fW&&(())vc$i#o&&------r4   c                 ^   t           j                            d          }t          j        g dg dg dg dg|          }|                    d          }t          t          j        |                    d	
                    dk               sJ t          j        t          j        |d d d	f                   dz
            dk     sJ t          j        t          j        |d d df                   dz
            dk     sJ t          j        t          j        |d d df                   t          j	        d          z
            dk     sJ dD ]&}t          |d d |f                   \  }}|dk    sJ 't          j        |                                          }t          j        |d                   dk     sJ t          j        |d         dz
            dk     sJ t          t          j        |d d d	f         |d d df         z   |d d df         z
            dk               sJ d S )Nl	   @jSm-\1:c# )r   r   r   )rP   r   rP   )r   rP   rP   )rP   rP   rO   rV  rD  r  r   r   r]  r   r   r-  g?r  r>  rW  )r*   r9   r:   r   r  rE  r   r`  r1  rk   r   r2  r3  r4  s           r2   $test_MultivariateNormalQMCDegeneratez>TestMultivariateNormalQMC.test_MultivariateNormalQMCDegenerate}  s?   i##$JKK*  ///???C
 
 

 --#-&&26',,A,..//$677777vbfWQQQT]++a/0047777vbfWQQQT]++a/0047777vbfWQQQT]++bgajj899D@@@@ 	 	Agaaadm,,GAt#:::::fW&&(())vc$i  4''''vc$i!m$$t++++26'!!!Q$-'!!!Q$-7'!!!Q$-GHH   	 	 	 	 	r4   N)r   r   r   r  r>  rG  rI  rR  rT  rX  rZ  r\  r|   r4   r2   r:  r:    s        = = =4/ / /, , ,0, , ,4> > >.> > >2. . .@!. !. !.F    r4   r:  c                        e Zd Zd Zd Zd ZdS )	TestLloydc                 ^   t           j                            d          }|                    ddd          }t	          |          }t          |          }t          d          D ]G}t          |d          }t	          |          }t          |          }||k     sJ ||k     sJ |}|}|}Hd S )Ni r   r   )   r   )r#  rN   )maxiter)r*   r9   RandomStateuniformr   r  r   r   )	r,   r;   r<   base_l1base_l2rM  sample_lloydcurr_l1curr_l2s	            r2   
test_lloydzTestLloyd.test_lloyd  s    i##G,,Q116""&//q 	" 	"AAA  L |,,Gl++G W$$$$W$$$$GG!FF	" 	"r4   c                     t          j        ddgddgddgddgg          }|                                }t          |          }t	          ||           t          j        ||          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   r  rl  N)r*   r+   copyr   r   may_share_memory)r,   sample_origsample_copy
new_samples       r2   test_lloyd_non_mutatingz!TestLloyd.test_lloyd_non_mutating  s    
 hc
!$c
!$c
!$c
 , - - "&&((;
 
 

 	[111&{J???????r4   c                    t          j        t          d          5  g d}t          |           d d d            n# 1 swxY w Y   d}t          j        t          |          5  dgdgdgg}t          |           d d d            n# 1 swxY w Y   d}t          j        t          |          5  d	dgd
dgddgg}t          |           d d d            d S # 1 swxY w Y   d S )Nz`sample` is not a 2D arrayrD   rF   z`sample` dimension is not >= 2r   r  r   z!`sample` is not in unit hypercubegr   r   )rI   rJ   rK   r   )r,   r<   r  s      r2   test_lloyd_errorszTestLloyd.test_lloyd_errors  s   ]:-JKKK 	; 	; [[F26:::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 0]:S111 	; 	;cC51#&F26:::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 3]:S111 	; 	;Qi#saV4F26:::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	;s3   <A A $BBB0CCCN)r   r   r   ri  rp  rr  r|   r4   r2   r^  r^    sD        " " ".@ @ @ ; ; ; ; ;r4   r^  c                 N    t          j        |                                           S r{   )r
   pdistr  rl  s    r2   r  r    s    >&!!%%'''r4   r	  c                 J   d}t           j                            |          } | d|                              d          }t           j                            |          } | d|                              d          }t          ||           t           j                            |          } | d|                              d          } | d|                              d          }t          ||           t           j                            |          } | d|                              d          }t          ||           t          ||           d}t          j        t          |          5   | d||           d d d            d S # 1 swxY w Y   d S )	Nl   7P r   )r   r,  rN   r   z3got multiple values for argument now known as `rng`rD   )r   r;   r,  )r*   r9   rb  r   r:   rI   rJ   	TypeError)r	  seed_numberr;   res1res2res3rg  s          r2   test_deterministicr{    s    K
)


,
,C6AC   ''**D
)


,
,C6AC   ''**Dt
)


,
,C6AC   ''**D6A;'''..q11Dt
)


,
,C6A3&&q))DttCG	y	0	0	0 7 7+66667 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7s   <FFF)8r   collectionsr   	itertoolsr   r   rI   numpyr*   numpy.testingr   r   r   r	   scipy.spatialr
   scipy.statsr   scipy.stats._sobolr   r   r   scipy.stats._qmcr   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|   r4   r2   <module>r     s8   				       + + + + + + + +                 # " " " " "       @ @ @ @ @ @ @ @                         i% i% i% i% i% i% i% i%X#' #' #' #' #' #' #' #'L    3=   & & &.2 2 2< < <D+ + + k/ k/ k/ k/ k/ k/ k/ k/\) ) ) ) ) ) ) )BR R R R Rn R R RjH7 H7 H7 H7 H7 H7 H7 H7V4 4 4 4 4 4 4 4&q3 q3 q3 q3 q3. q3 q3 q3h<< << << << << << << <<~v( v( v( v( v( v( v( v(r] ] ] ] ] ] ] ]@5; 5; 5; 5; 5; 5; 5; 5;r( ( ( CJ	$'$6$I J J7 7J J7 7 7r4   