U
    ½mœdb×  ã                   @   s|
  d dl Z d dlmZ d dlZd dlmZ d dlmZmZm	Z	 d dl
mZmZmZ d dl
mZmZmZ zd dl
mZ W n  ek
r”   d dl
mZ Y nX d d	lmZmZ d dlZd d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm Z  d dlm!Z! d dlm"Z" d dlm#Z# d dlm$Z$m%Z% d dlm&Z& d dlm'Z' d dlm(Z( d dlm)Z) d dlm*Z* d dlm+Z+ d dlm,Z, d dlm-Z- d dlm.Z. d dlm/Z/ d dlm0Z0 d d lm1Z1 d d!lm2Z2 d d"lm3Z3 d d#lm4Z4 d d$lm5Z5 d d%lm6Z6 d d&lm7Z7 d d'lm8Z8 d d(lm9Z9 d d)lm:Z: d d*l;m<Z< d d+l=m>Z> d,d-„ Z?ej@ Ad.d/d0g¡d1d2„ ƒZBej@ Ad3e3¡d4d5„ ƒZCd6d7„ ZDej@ Ad8e,e0g¡d9d:„ ƒZEd;d<„ ZFe Gd=d>¡jHd?d0d@�d=dAœZIe Gd=d>¡jHd?d0d@�d=dAœZJdBdC„ ZKej@ LdD¡ej@ AdEe,dFi fe Me,eeI¡e Me,dGeI¡ejMe,eeJej@jNeedHƒkdIdJ�dK�ejMe,dLeJej@jNeedHƒkdIdJ�dK�e0dMdNd=ife0eKdOdPifg¡ej@ AdQejOejPeQg¡dRdS„ ƒƒƒZRdTdU„ ZSej@ Ad3dVdWdXdMdYdZd[g¡d\d]„ ƒZTd^d_„ ZUd`da„ ZVej@ Adbe4 W¡ ¡dcdd„ ƒZXdedf„ ZYdgdh„ ZZdidj„ Z[dkdl„ Z\dmdn„ Z]ej@ Adodpdq„ drdq„ dsdq„ dtdq„ dudq„ g¡dvdw„ ƒZ^ej@ Adxdydq„ e_dzfd{dq„ e_d|fd}dq„ e_d~fddq„ e`d€fd�dq„ e`d‚fdƒdq„ e`d„fg¡d…d†„ ƒZa�dd‡dˆ„Zbej@ Ad3d‰¡dŠd‹„ ƒZcej@ Ad3d‰¡dŒd�„ ƒZdedŽd�„ ƒZeej@jAd�ejfegd‘d’gd“�ej@jAd”ejfegd‘d’gd“�d•d–„ ƒƒZgej@jAd”ejfegd‘d’gd“�d—d˜„ ƒZhd™dš„ Ziej@jAd�ejfegd‘d’gd“�ej@jAd”ejfegd‘d’gd“�d›dœ„ ƒƒZjej@jAd�ejfegd‘d’gd“�d�dž„ ƒZkej@ AdŸdd>d d¡g¡ej@jAd�ejfegd‘d’gd“�ej@jAd”ejfegd‘d’gd“�d¢d£„ ƒƒƒZlej@ AdŸdd>d d¡g¡ej@jAd�ejfegd‘d’gd“�d¤d¥„ ƒƒZmej@ Ad¦ejPd§d¨fejMejOd©dªej@jnd«dJ�dK�g¡ej@ Ad¬d=d­g¡d®d¯„ ƒƒZoej@ Ad°d/d0g¡d±d²„ ƒZpej@ Ad³e fejqd gg¡e fd ejq gg¡g¡ej@ Ad´e fejqd gg¡e fd ejq gg¡dg¡dµd¶„ ƒƒZrej@ Ad·e fd d=gd=d gg¡e sd¸¡ejtfe fd d=gd=ejtgg¡e sd¸¡ejtfe fejtd=gd=ejtgg¡ejtejtfe fejtd=gejtd gg¡e sd¸¡ejtfe fd ejtgd=ejtgg¡e sd¸¡ejtfe fd d=gd=d gg¡e sd¸¡d¹fe fd d=gd=d¹gg¡e sd¸¡d¹fe fd¹d=gd=d¹gg¡ejtd¹fe fd¹d=gd¹d gg¡e sd¸¡d¹fe fd d¹gd=d¹gg¡e sd¸¡d¹fg
¡dºd»„ ƒZuej@ Ad¼ejtd¹g¡d½d¾„ ƒZvej@ Ad¼ejtd¹g¡d¿dÀ„ ƒZwej@ Ad¼ejtd¹g¡dÁdÂ„ ƒZxdÃdÄ„ ZydÅdÆ„ ZzdÇdÈ„ Z{dÉdÊ„ Z|dËdÌ„ Z}ej@ AdÍe#e&e'e(e)e*f¡dÎdÏ„ ƒZ~ej@ AdÍe#e&e'e(e)e*f¡dÐdÑ„ ƒZdÒdÓ„ Z€dÔdÕ„ Z�dÖd×„ Z‚ej@ AdØdYe#fdÙe*fg¡dÚdÛ„ ƒZƒdÜdÝ„ Z„dÞdß„ Z…dàdá„ Z†dâdã„ Z‡dädå„ Zˆdædç„ Z‰dèdé„ ZŠdêdë„ Z‹dìdí„ ZŒej@ Adîd=d¸g¡ej@ Ad3dïdðg¡ej@ Adñe,e-g¡dòdó„ ƒƒƒZ�ej@ Ad3dïdðg¡dôdõ„ ƒZŽej@ Ad3död÷dødùdúdðdGdïdûdüdÙdFg¡ej@jAdýd/d0gdþdÿgd“��d �d„ ƒƒZ�dS (  é    N)ÚGeneratorType)Úlinalg)Ú
dok_matrixÚ
csr_matrixÚissparse)ÚcosineÚ	cityblockÚ	minkowski)ÚcdistÚpdistÚ
squareform)Ú
wminkowski)r	   )Ú
sp_versionÚparse_version)Úconfig_context)Úassert_allclose)Úassert_almost_equal)Úassert_array_equal)Úignore_warnings)Úeuclidean_distances)Únan_euclidean_distances)Úmanhattan_distances)Úhaversine_distances)Úlinear_kernel)Úchi2_kernelÚadditive_chi2_kernel)Úpolynomial_kernel)Ú
rbf_kernel)Úlaplacian_kernel)Úsigmoid_kernel)Úcosine_similarity)Úcosine_distances)Úpairwise_distances)Úpairwise_distances_chunked)Úpairwise_distances_argmin_min)Úpairwise_distances_argmin)Úpairwise_kernels)ÚPAIRWISE_KERNEL_FUNCTIONS)ÚPAIRWISE_DISTANCE_FUNCTIONS)ÚPAIRWISE_BOOLEAN_FUNCTIONS)ÚPAIRED_DISTANCES)Úcheck_pairwise_arrays)Úcheck_paired_arrays)Úpaired_distances)Úpaired_euclidean_distances)Úpaired_manhattan_distances)Ú_euclidean_distances_upcast)Ú	normalize)ÚDataConversionWarningc              	   C   s@  t j d¡}| d¡j| dd�}t|dd�}t|ƒ}t||ƒ |j|j  krV| ks\n t	‚| d¡j| dd�}t||dd�}t||ƒ}t||ƒ |j|j  krª| ks°n t	‚| d¡j| dd�}| d¡j| dd�}t j
|d< t j
|d< t||d	d�}t||ƒ}	t||	ƒ |j|	j  k�r*| k�s0n t	‚td
d„ |D ƒƒ}
tdd„ |D ƒƒ}t|
|dd�}t||ƒ |j|j  k�rˆ| k�sŽn t	‚| d¡j| dd�}|d d …df d d t j d |d d …df< |d d …df d d t j |d d …df< t|dd�}t|ƒ}t||ƒ | d¡j| dd�}|d d …df d d t j d |d d …df< |d d …df d d t j |d d …df< t||dd�}t||ƒ}t||ƒ t|dd�}t|td�}|jd |jd k�sØt	‚|jd |jd k�sòt	‚t||ƒ t||dd�}t||td�}|jd |jd k�s2t	‚|jd |jd k�sLt	‚t||ƒ t||dd�}t||td�}|jd |jd k�sŒt	‚|jd |jd k�s¦t	‚t||ƒ t|ƒ}t|ƒ}t||dd�}t||ƒ}t||ƒ |j|j  k�rþ| k�sn t	‚t||dd�}t||ƒ}t||ƒ |j|j  k�rB| k�sHn t	‚t|| ¡ dd�}t| ¡ | ¡ ƒ}t||ƒ | t jk�r¦|j|j  k�rž| k�sÞn t	‚n8t t	¡�( |j|j  k�rÎ| k�sÔn t	‚W 5 Q R X t||ƒ}t||ƒ | t jk�r"|j|j  k�r| k�sZn t	‚n8t t	¡�( |j|j  k�rJ| k�sPn t	‚W 5 Q R X ddi}t||fddi|—Ž}t||fdti|—Ž}t||ƒ ddi}t|fddi|—Ž}t|fdti|—Ž}t||ƒ t t¡� t|dd� W 5 Q R X t t¡� t||dd� W 5 Q R X t t¡� t||dd� W 5 Q R X d S )Nr   ©é   é   F©ÚcopyÚ	euclidean©Úmetric©é   r5   ©r   r   Znan_euclideanc                 S   s   g | ]}t d d„ |D ƒƒ‘qS )c                 S   s   g | ]}|‘qS © r>   ©Ú.0Úvr>   r>   ú\/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/sklearn/metrics/tests/test_pairwise.pyÚ
<listcomp>Y   s     ú6test_pairwise_distances.<locals>.<listcomp>.<listcomp>©Útuple©r@   Úrowr>   r>   rB   rC   Y   s     z+test_pairwise_distances.<locals>.<listcomp>c                 S   s   g | ]}t d d„ |D ƒƒ‘qS )c                 S   s   g | ]}|‘qS r>   r>   r?   r>   r>   rB   rC   Z   s     rD   rE   rG   r>   r>   rB   rC   Z   s     ©r4   r<   g      à?r<   é   Z	haversine)r<   r<   r   Ú	manhattanr   Úpç       @r:   r	   Úblah)ÚnpÚrandomÚRandomStateÚrandom_sampleÚastyper"   r   r   ÚdtypeÚAssertionErrorÚnanr   rF   Úpir   r   Úshaper   r   r!   Ztocscr   ZtobsrZtocooÚfloat64ÚpytestÚraisesr	   Ú	TypeErrorÚ
ValueError)Úglobal_dtypeÚrngÚXÚSÚS2ÚYZX_maskedZY_maskedZS_maskedZ	S2_maskedÚX_tuplesÚY_tuplesÚX_sparseÚY_sparseÚkwdsr>   r>   rB   Útest_pairwise_distances<   s°    






"
".*
.*






"

"
$,

$,

ri   Úsum_over_featuresTFc              	   C   sL   ddgddgg}ddgddgg}t jtdd�� t||| d� W 5 Q R X d S )	NrJ   r<   é   r5   r   zT`sum_over_features` is deprecated in version 1.2 and will be removed in version 1.4.©Úmatch)rj   )rZ   ÚwarnsÚFutureWarningr   )rj   r`   rc   r>   r>   rB   Ú5test_manhattan_distances_deprecated_sum_over_featuresÈ   s    ýrp   r:   c              	   C   s  t j d¡}| dd¡}| ¡ }d|d  |d< ttd��F |d fD ]6}t||| d�}d|t  |¡< t  	|dk¡dksDt
‚qDW 5 Q R X d|  }tjt|d	�� t|| d� W 5 Q R X tjt|d	�� t| t¡|| d
� W 5 Q R X t ¡ �$ t dt¡ t| t¡| d� W 5 Q R X d S )Nr   r4   r5   rJ   r=   )Úcategoryr9   z+Data was converted to boolean for metric %srl   ©rc   r:   Úerror)rO   rP   rQ   Úrandnr7   r   r2   r"   ÚisnanÚsumrU   rZ   rn   rS   ÚboolÚwarningsÚcatch_warningsÚsimplefilter)r:   r_   r`   rc   ÚZÚresÚmsgr>   r>   rB   Útest_pairwise_boolean_distanceØ   s"    "
r~   c               	   C   sH   t j d¡} |  dd¡}t ¡ � t dt¡ t|dd� W 5 Q R X d S )Nr   r4   r5   rs   r	   r9   )	rO   rP   rQ   rt   rx   ry   rz   r2   r"   )r_   r`   r>   r>   rB   Útest_no_data_conversion_warning÷   s
    
r   Úfuncc              	   C   s2  t jtdd�� | t d¡dd� W 5 Q R X t jtdd��  | t d¡t d¡dd� W 5 Q R X t jtdd��  | t d¡t d¡dd� W 5 Q R X t d¡}| |dd�}||ks¶t‚t d¡}| |t d	¡dd�}||ksàt‚| tjd
ggdd�dd�}d|jjk�st‚| dggdd�}t	|tj
ƒ�s.t‚d S )Nz.* shape .*rl   )r4   rk   Úprecomputedr9   )r5   r5   )r5   rk   ©r4   r4   )rk   rk   rJ   Úint©rT   Úfç      ð?)rZ   r[   r]   rO   ZzerosrU   ÚarrayrT   ÚkindÚ
isinstanceÚndarray)r€   ra   rb   r>   r>   rB   Útest_pairwise_precomputed   s     $$

r‹   c                	   C   s2   t jtdd�� tt dd¡dd� W 5 Q R X d S )Nz.* non-negative values.*rl   r‚   éÿÿÿÿr�   r9   )rZ   r[   r]   r"   rO   Úfullr>   r>   r>   rB   Ú&test_pairwise_precomputed_non_negative  s    rŽ   rJ   r4   Údoubler6   )ÚwrL   c                 K   s   t t | ¡t |¡f|Ž}|S ©N)r   rO   Z
atleast_2d)ÚxÚyrh   ÚKr>   r>   rB   Úcallable_rbf_kernel(  s    r•   z/ignore:WMinkowskiDistance:FutureWarning:sklearnzfunc, metric, kwdsr8   r	   z1.6.0z;wminkowski is now minkowski and it has been already tested.)Úreason)Zmarksr   Z
polynomialZdegreeÚgammaçš™™™™™¹?rT   c           	      C   s°   t j d¡}t jd| d¡ |d�}t jd| d¡ |d�}| |f|ddœ|—Ž}| |f|ddœ|—Ž}t||ƒ | ||f|ddœ|—Ž}| ||f|ddœ|—Ž}t||ƒ d S )	Nr   r4   r3   r„   ©rk   r5   rJ   ©r:   Ún_jobsr<   )rO   rP   rQ   r‡   rR   r   )	r€   r:   rh   rT   r_   r`   rc   ra   rb   r>   r>   rB   Útest_pairwise_parallel/  s    '
rœ   c                   C   s$   t dggdd„ d�d dks t‚d S )Nr†   c                 S   s   dS )Nr4   r>   ©r’   r“   r>   r>   rB   Ú<lambda>g  ó    z9test_pairwise_callable_nonstrict_metric.<locals>.<lambda>r9   r=   r4   )r"   rU   r>   r>   r>   rB   Ú'test_pairwise_callable_nonstrict_metricc  s    r    ÚrbfZ	laplacianZsigmoidÚlinearÚchi2Úadditive_chi2c              	   C   s  t j d¡}| d¡}| d¡}t|  }t|| d�}||ƒ}t||ƒ t||| d�}|||d�}t||ƒ tdd„ |D ƒƒ}td	d„ |D ƒƒ}t||| d�}t||ƒ t|ƒ}	t|ƒ}
| d
kræt	 
t¡� t|	|
| d� W 5 Q R X d S t|	|
| d�}t||ƒ d S )Nr   r3   r;   r9   rr   ©rc   c                 S   s   g | ]}t d d„ |D ƒƒ‘qS )c                 S   s   g | ]}|‘qS r>   r>   r?   r>   r>   rB   rC     s     ú4test_pairwise_kernels.<locals>.<listcomp>.<listcomp>rE   rG   r>   r>   rB   rC     s     z)test_pairwise_kernels.<locals>.<listcomp>c                 S   s   g | ]}t d d„ |D ƒƒ‘qS )c                 S   s   g | ]}|‘qS r>   r>   r?   r>   r>   rB   rC   €  s     r¦   rE   rG   r>   r>   rB   rC   €  s     )r£   r¤   )rO   rP   rQ   rR   r'   r&   r   rF   r   rZ   r[   r]   )r:   r_   r`   rc   ÚfunctionÚK1ÚK2rd   re   rf   rg   r>   r>   rB   Útest_pairwise_kernelsk  s,    




rª   c                  C   s˜   t j d¡} |  d¡}|  d¡}t}ddi}t|f||dœ|—Ž}t|fd|i|—Ž}t||ƒ t|f||dœ|—Ž}t|fd|i|—Ž}t||ƒ d S )Nr   r3   r;   r—   r˜   rr   rc   )rO   rP   rQ   rR   r•   r&   r   r   )r_   r`   rc   r:   rh   r¨   r©   r>   r>   rB   Útest_pairwise_kernels_callable�  s    


r«   c               	   C   sŠ   t j d¡} |  d¡}|  d¡}t||dd�}dddœ}t||fdd	d
œ|—Ž}t||ƒ t t	¡� t||fddi|—Ž W 5 Q R X d S )Nr   r3   r;   r˜   ©r—   z:))r—   Zblablar¡   T)r:   Zfilter_paramsr:   )
rO   rP   rQ   rR   r   r&   r   rZ   r[   r\   )r_   r`   rc   r”   Úparamsr©   r>   r>   rB   Ú"test_pairwise_kernels_filter_param£  s    



r®   zmetric, funcc           	      C   sŒ   t j d¡}| d¡}| d¡}t||| d�}|||ƒ}t||ƒ |t|ƒt|ƒƒ}t||ƒ | tkrˆt|  ||ƒ}t  |¡}t||ƒ d S )Nr   r3   r9   )	rO   rP   rQ   rR   r-   r   r   r(   Údiag)	r:   r€   r_   r`   rc   ra   rb   ZS3Ú	distancesr>   r>   rB   Útest_paired_distances°  s    





r±   c              	   C   sŒ   t j d¡}| d¡j| dd�}| d¡j| dd�}t||dd�}t||dd„ d�}t||ƒ | d	¡}t t	¡� t||ƒ W 5 Q R X d S )
Nr   r3   Fr6   rK   r9   c                 S   s   t  | | ¡jdd�S )Nr   ©Úaxis)rO   Úabsrv   r�   r>   r>   rB   rž   Ð  rŸ   z0test_paired_distances_callable.<locals>.<lambda>r™   )
rO   rP   rQ   rR   rS   r-   r   rZ   r[   r]   )r^   r_   r`   rc   ra   rb   r>   r>   rB   Útest_paired_distances_callableÆ  s    

rµ   c                 C   sÀ  t jdgdgg| d�}t jdgdgg| d�}t|ƒ}t|| d�}ddg}ddg}ddg}t||dd	�\}}	t||dd	�}
t||ƒ t|
|ƒ t|	|ƒ t||dd	�\}}t||dd	�}t||ƒ t||ƒ t||ƒ t|ƒt jksæt	‚t|ƒt jksøt	‚t||d
d	�\}}	t||dddid�\}
}t||d
d	�}t||dddid�}t|	|ƒ t||ƒ t||ƒ t|
|ƒ t||ƒ t||ƒ t||dd	�\}}	t||dd	�}
t||ƒ t|
|ƒ t|	|ƒ t||dd	�\}}t||dd	�}t||ƒ t||ƒ t||ƒ t||t
ddid�\}}	t||ƒ t|	|ƒ t||dddid�\}}	t||ƒ t|	|ƒ t j d¡}| dd¡}| dd¡}t||dd	�}|jdd�}||tt|ƒƒf }t||ddd�\}}t||dd� t||dd� t||dd�\}}t||dd�\}}t||ƒ t||ƒ t||dd�\}}t||dd�\}}t||ƒ t||ƒ t||dd�}t||dd�}t||ƒ t||dd�}t||dd�}t||ƒ t||ƒ}tt  |¡t  |¡ƒ}t||ƒ d S )Nr   rJ   r„   éþÿÿÿrk   r<   r5   r8   r9   ÚsqeuclideanÚsquaredT)r:   Zmetric_kwargsrK   rL   r	   éa   é•   éo   r²   )r³   r:   çH¯¼šò×z>©Úrtol)rO   Zasarrayr   r   r$   r%   r   ÚtyperŠ   rU   r	   rP   rQ   rt   r"   ZargminÚrangeÚlenr   Zasfortranarray)r^   r`   rc   ZXspZYspZexpected_idxZexpected_valsZexpected_vals_sqÚidxÚvalsZidx2ZidxspZvalsspZidxsp2Zvals2Zidx3Zidx4r_   ÚdistZdist_orig_indZdist_orig_valZdist_chunked_indZdist_chunked_valZargmin_0Zdist_0Zargmin_1Zdist_1Zargmin_C_contiguousZargmin_F_contiguousr>   r>   rB   Ú"test_pairwise_distances_argmin_minÚ  sÆ    





   ÿ
   ÿ











   ÿ


   ÿ


   ÿ







 ÿrÅ   c                 C   s   | d d …d d…f S )Néd   r>   ©rÄ   Ústartr>   r>   rB   Ú_reduce_funcS  s    rÉ   c                 C   sš   t j d¡}| d¡j| dd�}t|ƒd d …d d…f }t|d tdd�}t|t	ƒsVt
‚t|ƒ}t|ƒdksnt
‚|d j|jks‚t
‚tt  |¡|d	d
� d S )Nr   )i�  r5   Fr6   rÆ   ç      ð>©Zreduce_funcÚworking_memoryrJ   r¼   ©Zatol)rO   rP   rQ   rR   rS   r"   r#   rÉ   r‰   r   rU   ÚlistrÁ   rT   r   Úvstack)r^   r_   r`   ra   ÚS_chunksr>   r>   rB   Ú&test_pairwise_distances_chunked_reduceW  s       ÿrÑ   c                 C   st   t j d¡}| d¡j| dd�}t|d dd„ dd�}t|tƒsBt‚t	|ƒ}t
|ƒd	ksZt‚td
d„ |D ƒƒspt‚d S )Nr   ©é
   r5   Fr6   c                 S   s   d S r‘   r>   rÇ   r>   r>   rB   rž   m  rŸ   z=test_pairwise_distances_chunked_reduce_none.<locals>.<lambda>rÊ   rË   rJ   c                 s   s   | ]}|d kV  qd S r‘   r>   )r@   Úchunkr>   r>   rB   Ú	<genexpr>r  s     z>test_pairwise_distances_chunked_reduce_none.<locals>.<genexpr>)rO   rP   rQ   rR   rS   r#   r‰   r   rU   rÎ   rÁ   Úall)r^   r_   r`   rÐ   r>   r>   rB   Ú+test_pairwise_distances_chunked_reduce_noneh  s       ÿr×   Úgood_reducec                 C   s   t | ƒS r‘   ©rÎ   ©ÚDrÈ   r>   r>   rB   rž   x  rŸ   rž   c                 C   s
   t  | ¡S r‘   )rO   r‡   rÚ   r>   r>   rB   rž   y  rŸ   c                 C   s   t | ƒS r‘   )r   rÚ   r>   r>   rB   rž   z  rŸ   c                 C   s   t | ƒt | ƒfS r‘   rÙ   rÚ   r>   r>   rB   rž   {  rŸ   c                 C   s   t | ƒt | ¡t| ƒfS r‘   )r   rO   r‡   rÎ   rÚ   r>   r>   rB   rž   |  rŸ   c                 C   s.   t  d¡ dd¡}t|d | dd�}t|ƒ d S )NrÓ   rŒ   rJ   é@   rË   )rO   ÚarangeÚreshaper#   Únext)rØ   r`   rÐ   r>   r>   rB   Ú,test_pairwise_distances_chunked_reduce_validu  s       ÿrà   )Ú
bad_reduceÚerr_typeÚmessagec                 C   s   t  | | dd … g¡S ©NrŒ   ©rO   Zconcatenate©rÛ   Úsr>   r>   rB   rž   ‹  rŸ   zlength 11\..* input: 10\.c                 C   s   | t  | | dd … g¡fS rä   rå   ræ   r>   r>   rB   rž   �  rŸ   z!length \(10, 11\)\..* input: 10\.c                 C   s   | d d… | fS )Né	   r>   ræ   r>   r>   rB   rž   ”  rŸ   z length \(9, 10\)\..* input: 10\.c                 C   s   dS )Né   r>   ræ   r>   r>   rB   rž   –  rŸ   z2returned 7\. Expected sequence\(s\) of length 10\.c                 C   s   dS )N)ré   é   r>   ræ   r>   r>   rB   rž   ›  rŸ   z9returned \(7, 8\)\. Expected sequence\(s\) of length 10\.c                 C   s   t  d¡dfS )NrÓ   rè   )rO   rÝ   ræ   r>   r>   rB   rž      rŸ   z-, 9\)\. Expected sequence\(s\) of length 10\.c              	   C   sR   t  d¡ dd¡j| dd�}t|d |dd�}tj||d�� t|ƒ W 5 Q R X d S )	NrÓ   rŒ   rJ   Fr6   rÜ   rË   rl   )rO   rÝ   rÞ   rS   r#   rZ   r[   rß   )r^   rá   râ   rã   r`   rÐ   r>   r>   rB   Ú.test_pairwise_distances_chunked_reduce_invalid‡  s    "   ÿrë   c           
      C   s–   t | |||d�}t|tƒst‚t|ƒ}|d kr2| n|}t|ƒd d }|D ] }|j}|t||ƒd ksJt‚qJt 	|¡}t
| ||d�}	t||	dd� d S )N©rÌ   r:   rê   g      °>i   r9   r¼   rÍ   )r#   r‰   r   rU   rÎ   rÁ   ÚnbytesÚmaxrO   rÏ   r"   r   )
r`   rc   rÌ   r:   ÚgenZblockwise_distancesZmin_block_mibÚblockZmemory_usedra   r>   r>   rB   Ú check_pairwise_distances_chunked±  s    
rñ   )r8   Úl2r·   c                 C   sd   t j d¡}|jddd�j|dd�}tt|d| d�ƒ}t|ƒdksFt‚t	t  
t  |¡¡dd	d
� d S )Nr   ©éè  rÓ   ç    _ B©ÚsizeÚscaleFr6   rJ   rì   ç»½×Ùß|Û=r½   )rO   rP   rQ   ÚnormalrS   rÎ   r#   rÁ   rU   r   r¯   rÏ   )r:   r^   r_   r`   Úchunksr>   r>   rB   Ú(test_pairwise_distances_chunked_diagonalÁ  s
    rü   c                 C   sJ   t j d¡}|jddd�j|dd�}t|| dd�}tt  |¡dd	d
� d S )Nr   ró   rõ   rö   Fr6   r<   rš   rù   rÍ   )rO   rP   rQ   rú   rS   r"   r   r¯   )r:   r^   r_   r`   r°   r>   r>   rB   Ú)test_parallel_pairwise_distances_diagonalÊ  s    rý   c              	   C   sF  t j d¡}| d¡j| dd�}t|d ddd� tddƒD ]}t|d d	| dd� q:t| ¡ d ddd� | d
¡j| dd�}t||ddd� t| ¡ | ¡ ddd� t||ddd� t||ddd� t 	t
¡� tt||dd�ƒ W 5 Q R X t|ƒ}t|ddd�}t|tƒ�st‚t|ƒ|k�s$t‚t 	t¡� t|ƒ W 5 Q R X d S )Nr   )éÈ   r5   Fr6   rJ   r8   rì   iðÿÿÿr<   )rÆ   r5   i'  r   rN   r9   rÊ   r�   )rO   rP   rQ   rR   rS   rñ   rÀ   ÚtolistrZ   r[   r]   rß   r#   r"   r‰   r   rU   ÚStopIteration)r^   r_   r`   Úpowerrc   rÛ   rï   r>   r>   rB   Útest_pairwise_distances_chunkedÒ  sD       ÿ   ÿ   ÿr  Úx_array_constrZdenseÚsparse)ZidsÚy_array_constrc                 C   s:   | dggƒ}|dgdggƒ}t ||ƒ}t|ddggƒ d S ©Nr   rJ   r<   r†   rM   )r   r   )r  r  r`   rc   rÛ   r>   r>   rB   Ú%test_euclidean_distances_known_resultú  s    
r  c              	   C   s  t j d¡}| d¡j| dd�}| d¡j| dd�}| t j¡d jdd� dd	¡}| t j¡d jdd� dd	¡}||ƒ}t||ƒ}t|||d
�}t|||d�}	t||||d�}
t	||ƒ t	|	|ƒ t	|
|ƒ t||t  
|¡t  
|¡d�}t t¡� t	||ƒ W 5 Q R X d S )Nr   ©rÓ   rÓ   Fr6   ©é   rÓ   r<   rJ   r²   rŒ   ©ÚX_norm_squared©ÚY_norm_squared©r  r  )rO   rP   rQ   rR   rS   rY   rv   rÞ   r   r   Z
zeros_likerZ   r[   rU   )r^   r  r_   r`   rc   Z	X_norm_sqZ	Y_norm_sqÚD1ÚD2ÚD3ÚD4Zwrong_Dr>   r>   rB   Ú#test_euclidean_distances_with_norms  s*      



ür  c               	   C   s  t j d¡} |  d¡}|  d¡}|d jdd�}|d jdd�}t||||d�}t||| dd¡| dd¡d�}t||| dd¡| dd¡d�}t||ƒ t||ƒ tj	t
d	d
�� t|||d d… d� W 5 Q R X tj	t
dd
�� t|||d d… d� W 5 Q R X d S )Nr   r  r	  r<   rJ   r²   r  rŒ   zIncompatible dimensions for Xrl   r4   r  zIncompatible dimensions for Yr  )rO   rP   rQ   rR   rv   r   rÞ   r   rZ   r[   r]   )r_   r`   rc   r  r  r  r  r  r>   r>   rB   Ú$test_euclidean_distances_norm_shapes+  s:    

   ÿ

ü

ü

 r  c                 C   s�   t j d¡}| d¡j| dd�}d||dk < | d¡j| dd�}d||dk < t||ƒ}||ƒ}||ƒ}t||ƒ}t||dd� |j| ksŒt	‚d S )	Nr   ©rÆ   rÓ   Fr6   çš™™™™™é?r  ç�íµ ÷Æ°>r½   )
rO   rP   rQ   rR   rS   r
   r   r   rT   rU   )r^   r  r  r_   r`   rc   Úexpectedr°   r>   r>   rB   Útest_euclidean_distancesM  s    	

r  c                 C   sh   t j d¡}| d¡j| dd�}d||dk < tt|ƒƒ}||ƒ}t|ƒ}t||dd� |j	| ksdt
‚d S )Nr   r  Fr6   r  r  r½   )rO   rP   rQ   rR   rS   r   r   r   r   rT   rU   )r^   r  r_   r`   r  r°   r>   r>   rB   Útest_euclidean_distances_symh  s    r  Ú
batch_sizeré   ée   c                 C   s”   t j d¡}| d¡ t j¡}d||dk < | d¡ t j¡}d||dk < t||ƒ}||ƒ}||ƒ}t||| d�}t  t  	|d¡¡}t
||dd� d S )Nr   r  r  r  ©rc   r  r  r½   )rO   rP   rQ   rR   rS   Úfloat32r
   r0   ÚsqrtÚmaximumr   )r  r  r  r_   r`   rc   r  r°   r>   r>   rB   Útest_euclidean_distances_upcast}  s    	
r"  c                 C   sp   t j d¡}| d¡ t j¡}d||dk < tt|ƒƒ}||ƒ}t||| d�}t  	t  
|d¡¡}t||dd� d S )Nr   r  r  r  r  r½   )rO   rP   rQ   rR   rS   r  r   r   r0   r   r!  r   )r  r  r_   r`   r  r°   r>   r>   rB   Ú#test_euclidean_distances_upcast_sym˜  s    r#  zdtype, eps, rtolg-Cëâ6?çñhãˆµøä>g:Œ0âŽyE>g®Gáz®ï?z failing due to lack of precisionÚdimi@B c                 C   sV   t jdg| g| d�}t jd| g| g| d�}t||ƒ}t||ƒ}t||dd� d S )Nr†   r„   r$  r½   )rO   r‡   r   r
   r   )rT   Zepsr¾   r%  r`   rc   r°   r  r>   r>   rB   Ú'test_euclidean_distances_extreme_values­  s
    

r&  r¸   c                 C   sN   t j d¡}| dd¡}| dd¡}t||| d�}t||| d�}t||ƒ d S )Né9  rk   r5   )rc   r¸   )rO   rP   rQ   rt   r   r   r   )r¸   r_   r`   rc   Znormal_distanceZnan_distancer>   r>   rB   Ú8test_nan_euclidean_distances_equal_to_euclidean_distanceÆ  s    r(  r`   rc   c              	   C   s<   t  t¡�}t| |d� W 5 Q R X d}|t|jƒks8t‚d S )Nr¥   zBInput contains infinity or a value too large for dtype('float64').)rZ   r[   r]   r   ÚstrÚvaluerU   )r`   rc   ÚexcinfoZexp_msgr>   r>   rB   Ú,test_nan_euclidean_distances_infinite_valuesÒ  s    r,  zX, X_diag, missing_valuer<   rŒ   c                 C   s€   t  d|g|dgg¡}t| |d�}t||ƒ t| d|d�}t|d |ƒ t| | |d�}t||ƒ t| |  ¡ |d�}t||ƒ d S )Nç        r   ©Úmissing_valuesT©r¸   r/  r<   )rO   r‡   r   r   r7   )r`   ZX_diagÚmissing_valueÚexp_distrÄ   Zdist_sqZdist_twoZdist_two_copyr>   r>   rB   Ú test_nan_euclidean_distances_2x2Ý  s    

r3  r1  c                 C   sh   t  | | gddgg¡}t  t jt jgt jdgg¡}t|| d�}t||ƒ t|| ¡ | d�}t||ƒ d S )Nr   rJ   r.  )rO   r‡   rV   r   r   r7   )r1  r`   r2  rÄ   r>   r>   rB   Ú)test_nan_euclidean_distances_complete_naný  s    
r4  c           
   	   C   sH  t  d| dddg| ddd| gd| | | dgg¡}t  | dd| dg| | dddg| | | ddgg¡}t||| d�}t||| d�}t||jƒ tt|d d	… |d d	… d
| d�dggƒ tt|d	d… |d	d… d| d�t  d¡ggƒ t|| d�}t||| d�}t|| ¡ | d�}t||ƒ t||ƒ t||d
d�}t||dd�}	t||	ƒ d S )Nr†   g      @g      @rM   g      @g      @g      @r.  rJ   Tr0  g      D@r<   Fg      9@r6   )rO   r‡   r   r   ÚTr   r   r7   )
r1  r`   rc   r  r  r  r  ZD5ZD6ZD7r>   r>   rB   Ú'test_nan_euclidean_distances_not_trival
  sR    ýÿýÿ	
 
  ÿü
 
  ÿü

r6  c                 C   sZ   t  dd| dgd| d| gg¡}t|| dd�}t  |dk¡s>t‚t|| dd�}t|d	ƒ d S )
Ngáz®G‘^Àg     @„@gÍÌÌÌÌìB@gÿ–|Ã¯Æ@T)r/  r¸   r   Fr-  )rO   r‡   r   rÖ   rU   r   )r1  r`   Zdist_squaredrÄ   r>   r>   rB   Ú7test_nan_euclidean_distances_one_feature_match_positive?  s    

þÿ  ÿr7  c                  C   s@  t j d¡} t  |  d¡¡}t  ||g¡}t|ƒ}t|ddgddggdd� t  |dk¡s^t	‚t  |dk¡spt	‚t|t  
|¡ ddgƒ t  || g¡}t|ƒ}t  |dk¡s²t	‚t  |dk¡sÄt	‚t|ddgddggƒ t  |  dd¡¡}t|ƒ}t|t  
|¡ dg|jd	  ƒ t  |dk¡�s(t	‚t  |dk¡�s<t	‚d S )
Nr'  iŽ  r-  rù   rÍ   rM   rô   iˆ  r   )rO   rP   rQ   r´   ZrandrÏ   r!   r   rÖ   rU   Zdiag_indices_fromrX   )r_   r’   ÚXArÛ   ÚXBr  r`   r>   r>   rB   Útest_cosine_distancesT  s$     r:  c               	      sŠ   dd„ ‰t j d¡} |  d¡}|  d¡‰ t  ‡ ‡fdd„|D ƒ¡}t|ˆ ƒ}t||ƒ |  d¡}d	}tjt	|d
�� t|ƒ W 5 Q R X d S )Nc                 S   sx   |d | d  }|d | d  }t  |d ¡d t  | d ¡t  |d ¡ t  |d ¡d   }dt  t  |¡¡ }|S )Nr   rJ   r<   )rO   ÚsinÚcosZarcsinr   )r’   r“   Zdiff_latZdiff_lonÚaÚcr>   r>   rB   Úslow_haversine_distancest  s    ,ÿz:test_haversine_distances.<locals>.slow_haversine_distancesr   rI   )rÓ   r<   c                    s    g | ]‰ ‡‡ fd d„ˆD ƒ‘qS )c                    s   g | ]}ˆ ˆ|ƒ‘qS r>   r>   )r@   r“   )r?  r’   r>   rB   rC   €  s     z7test_haversine_distances.<locals>.<listcomp>.<listcomp>r>   )r@   ©rc   r?  )r’   rB   rC   €  s     z,test_haversine_distances.<locals>.<listcomp>)rÓ   rk   z-Haversine distance only valid in 2 dimensionsrl   )
rO   rP   rQ   rR   r‡   r   r   rZ   r[   r]   )r_   r`   r  r  Úerr_msgr>   r@  rB   Útest_haversine_distancesr  s    	




rB  c                  C   s4   dgdgg} dgdgg}t | |ƒ}t|ddgƒ d S r  )r.   r   ©r`   rc   rÛ   r>   r>   rB   Útest_paired_euclidean_distances�  s    
rD  c                  C   s4   dgdgg} dgdgg}t | |ƒ}t|ddgƒ d S r  )r/   r   rC  r>   r>   rB   Útest_paired_manhattan_distances•  s    
rE  c               	   C   sÞ  t j d¡} |  d¡}|  d¡}t||ƒ}d}t|||d�}|jtksJt‚t	|ƒD ]h\}}t	|ƒD ]V\}}	t  
||	 d ||	  ¡ }
t  ||
 ¡}t|||f |
ƒ t|||f |ƒ qbqRt|ƒ}tt  |¡dƒ t  |dk¡sæt‚t  |t  t  |¡¡ dk ¡�s
t‚|  d¡ t j¡}|  d¡ t j¡}t||ƒ}|jt jk�sJt‚|  d¡ t j¡}t||ƒ}t  |¡ ¡ �szt‚|jtk�sŠt‚dd	gd
dgg}ddgddgg}t||ƒ}|d |d k�sÊt‚|d |d k�sàt‚t t¡� tddggƒ W 5 Q R X t t¡� tddggddggƒ W 5 Q R X t t¡� tddggddggƒ W 5 Q R X t t¡� tddggdddggƒ W 5 Q R X t t¡� tt|ƒt|ƒƒ W 5 Q R X t t¡� tt|ƒt|ƒƒ W 5 Q R X d S )Nr   r3   rÒ   r˜   r¬   r<   rJ   g333333Ó?gffffffæ?r†   gÍÌÌÌÌÌì?r=   )r   rJ   )rJ   rJ   )rJ   r   rŒ   gš™™™™™É?g333333ã?)rO   rP   rQ   rR   r   r   rT   ÚfloatrU   Ú	enumeraterv   Úexpr   r   r¯   rÖ   rS   r  Zint32ÚisfiniterZ   r[   r]   r   )r_   r`   rc   ZK_addr—   r”   Úir’   Újr“   r£   Zchi2_expr>   r>   rB   Útest_chi_square_kernel�  sT    


$


  "rL  Úkernelc                 C   s2   t j d¡}| d¡}| ||ƒ}t||jdƒ d S )Nr   r3   é   )rO   rP   rQ   rR   r   r5  )rM  r_   r`   r”   r>   r>   rB   Útest_kernel_symmetryÙ  s    

rO  c                 C   s@   t j d¡}| d¡}t|ƒ}| ||ƒ}| ||ƒ}t||ƒ d S ©Nr   r3   )rO   rP   rQ   rR   r   r   )rM  r_   r`   rf   r”   r©   r>   r>   rB   Útest_kernel_sparseì  s    


rQ  c                  C   sD   t j d¡} |  d¡}t||ƒ}t|jd d d… dd„ |D ƒƒ d S )Nr   r3   é   c                 S   s   g | ]}t  |¡d  ‘qS )r<   )r   Znorm)r@   r’   r>   r>   rB   rC     s     z&test_linear_kernel.<locals>.<listcomp>)rO   rP   rQ   rR   r   r   Úflat©r_   r`   r”   r>   r>   rB   Útest_linear_kernel   s    

rU  c                  C   s@   t j d¡} |  d¡}t||ƒ}t|jd d d… t  d¡ƒ d S )Nr   r3   rR  r4   )rO   rP   rQ   rR   r   r   rS  ÚonesrT  r>   r>   rB   Útest_rbf_kernel  s    

rW  c                  C   sn   t j d¡} |  d¡}t||ƒ}tt  |¡t  d¡ƒ t  |dk¡sHt	‚t  |t  t  |¡¡ dk ¡sjt	‚d S )Nr   r3   r4   rJ   )
rO   rP   rQ   rR   r   r   r¯   rV  rÖ   rU   rT  r>   r>   rB   Útest_laplacian_kernel  s    

rX  zmetric, pairwise_funcr   c           
      C   s’   t j d¡}| d¡}| d¡}t|ƒ}t|ƒ}|||dd�}t|ƒsJt‚|||dd�}t|ƒrdt‚t| ¡ |ƒ t	||| d�}	t| ¡ |	ƒ d S )Nr   r3   r™   F)Zdense_outputTrr   )
rO   rP   rQ   rR   r   r   rU   r   Ztoarrayr&   )
r:   Zpairwise_funcr_   r`   rc   ÚXcsrÚYcsrr¨   r©   ZK3r>   r>   rB   Ú&test_pairwise_similarity_sparse_output  s    

r[  c            	      C   s˜   t j d¡} |  d¡}|  d¡}t|ƒ}t|ƒ}|d f||f|d f||ffD ]F\}}t||dd�}t|ƒ}|d k	rzt|ƒ}t||dd�}t||ƒ qLd S )Nr   r3   r™   r   rr   r¢   )rO   rP   rQ   rR   r   r&   r1   r   )	r_   r`   rc   rY  rZ  ZX_ZY_r¨   r©   r>   r>   rB   Útest_cosine_similarity4  s    

$r\  c                  C   s:   t  t  d¡d¡} t| d ƒ\}}||ks,t‚t| |ƒ d S ©Né(   ©r4   rê   )rO   ÚresizerÝ   r+   rU   r   )r8  Ú
XA_checkedÚ
XB_checkedr>   r>   rB   Útest_check_dense_matricesH  s    rc  c                  C   s~   t  t  d¡d¡} t  t  d¡d¡}t| |ƒ\}}t| |ƒ t||ƒ t  t  d¡d¡}t| |ƒ\}}t| |ƒ t||ƒ d S )Nr^  r_  é    ©r5   rê   )rO   r`  rÝ   r+   r   r,   ©r8  r9  ra  rb  r>   r>   rB   Útest_check_XB_returnedQ  s    


rg  c               	   C   sz   t  t  d¡d¡} t  t  d¡d¡}t t¡� t| |ƒ W 5 Q R X t  t  d¡d¡}t t¡� t| |ƒ W 5 Q R X d S )Né-   )r4   rè   rd  re  é$   )r5   rè   )rO   r`  rÝ   rZ   r[   r]   r+   r,   ©r8  r9  r>   r>   rB   Útest_check_different_dimensionsa  s    rk  c               	   C   sŒ   t  d¡ dd¡} t  d¡ dd¡}t t¡� t| |ƒ W 5 Q R X t  d¡ dd¡} t  d¡ dd¡}t t¡� t| |ƒ W 5 Q R X d S )Nrh  rè   r4   rd  r5   rê   )rO   rÝ   rÞ   rZ   r[   r]   r+   rj  r>   r>   rB   Útest_check_invalid_dimensionsm  s    rl  c                  C   sà   t j d¡} |  d¡}t|ƒ}|  d¡}t|ƒ}t||ƒ\}}t|ƒsJt‚t|| ƒ 	¡ dksbt‚t|ƒsnt‚t|| ƒ 	¡ dks†t‚t||ƒ\}}t|ƒs t‚t|| ƒ 	¡ dks¸t‚t|ƒsÄt‚t|| ƒ 	¡ dksÜt‚d S rP  )
rO   rP   rQ   rR   r   r+   r   rU   r´   rv   )r_   r8  Z	XA_sparser9  Z	XB_sparsera  rb  ZXA_2_checkedr>   r>   rB   Útest_check_sparse_arrays{  s    

rm  c                 C   s:   | j }t|ƒdkr$tdd„ | D ƒƒS tdd„ | D ƒƒS d S )NrJ   c                 s   s   | ]}t |ƒV  qd S r‘   )ÚtuplifyrG   r>   r>   rB   rÕ   –  s     ztuplify.<locals>.<genexpr>c                 s   s   | ]
}|V  qd S r‘   r>   )r@   Úrr>   r>   rB   rÕ   ™  s     )rX   rÁ   rF   )r`   rç   r>   r>   rB   rn  ‘  s    rn  c                  C   sV   t j d¡} |  d¡}t|ƒ}|  d¡}t|ƒ}t||ƒ\}}t||ƒ t||ƒ d S rP  )rO   rP   rQ   rR   rn  r+   r   )r_   r8  Z	XA_tuplesr9  Z	XB_tuplesra  rb  r>   r>   rB   Útest_check_tuple_inputœ  s    


rp  c                  C   sä   t  t  d¡d¡ t j¡} t  t  d¡d¡ t j¡}t| d ƒ\}}|jt jksRt‚t| |ƒ\}}|jt jkspt‚|jt jks€t‚t|  t¡|ƒ\}}|jtks¢t‚|jtks°t‚t| | t¡ƒ\}}|jtksÒt‚|jtksàt‚d S r]  )	rO   r`  rÝ   rS   r  r+   rT   rU   rF  rf  r>   r>   rB   Útest_check_preserve_type¨  s    rq  r›   Ú
seuclideanÚmahalanobisÚdist_functionc              	   C   sb   t dd��N tj d¡}| d¡}tt||d�ƒ}t t|||| d�ƒ¡}t	||ƒ W 5 Q R X d S )Nr˜   )rÌ   r   r  r9   rš   )
r   rO   rP   rQ   rR   r   r   rÏ   rF   r   )r›   r:   rt  r_   r`   Úexpected_distrÄ   r>   r>   rB   Ú+test_pairwise_distances_data_derived_paramsÀ  s    
rv  c              	   C   sT   t j d¡}| d¡}| d¡}tjtd| › d�d�� t||| d� W 5 Q R X d S )Nr   r  z+The '(V|VI)' parameter is required for the z metricrl   r9   )rO   rP   rQ   rR   rZ   r[   r]   r"   )r:   r_   r`   rc   r>   r>   rB   Ú1test_pairwise_distances_data_derived_params_errorÒ  s    


þrw  Z
braycurtisZcanberraZ	chebyshevZcorrelationZhammingr·   r   Úy_is_xzY is Xz
Y is not Xc           	   	   C   sÜ   t j d¡}| d¡j|dd�}i }|r>|}tt|| d�ƒ}nz| d¡j|dd�}t||| d�}| dkrŒdt jt  	||g¡ddt j
d	�i}n,| d
kr¸dt j t  t  	||g¡j¡¡ji}t||fd| i|—Ž}t||ƒ d S )Nr   r3   Fr6   r9   rr  ÚVrJ   )r³   ZddofrT   rs  ZVIr:   )rO   rP   rQ   rR   rS   r   r   r
   ÚvarrÏ   rY   r   ÚinvZcovr5  r"   r   )	r:   r^   rx  r_   r`   r­   rc   ru  rÄ   r>   r>   rB   Ú)test_numeric_pairwise_distances_datatypesá  s    $$r|  )r8   )�rx   Útypesr   ÚnumpyrO   r   Zscipy.sparser   r   r   Zscipy.spatial.distancer   r   r	   r
   r   r   r   ÚImportErrorZsklearn.utils.fixesr   r   rZ   Zsklearnr   Zsklearn.utils._testingr   r   r   r   Zsklearn.metrics.pairwiser   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/   r0   Zsklearn.preprocessingr1   Zsklearn.exceptionsr2   ri   ÚmarkZparametrizerp   r~   r   r‹   rŽ   rÝ   rS   Z_minkowski_kwdsZ_wminkowski_kwdsr•   ÚfilterwarningsÚparamZskipifrY   r  rƒ   rœ   r    rª   r«   r®   Úitemsr±   rµ   rÅ   rÉ   rÑ   r×   rà   r]   r\   rë   rñ   rü   rý   r  r‡   r  r  r  r  r  r"  r#  Zxfailr&  r(  Úinfr,  r   rV   r3  r4  r6  r7  r:  rB  rD  rE  rL  rO  rQ  rU  rW  rX  r[  r\  rc  rg  rk  rl  rm  rn  rp  rq  rv  rw  r|  r>   r>   r>   rB   Ú<module>   s~   

	

ýý
þü	
þü	áþ$þ
!
yûþ

ýýýýýêþ



'  ÿ  ÿ  ÿ
 "  ÿ  ÿ  ÿ
  ÿ  ÿ  ÿ
üþþ
.0	"$"&&    öþ


4
<úþ
úþ
	 ÿ
	 ÿ
ôþ