U
    3‰dP@  ã                   @   s\  d dl Z d dlZd dlZd dl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mZ d dlmZ d dlmZmZ d dlmZmZ dd	„ Zed ƒZd
ZdZdZe eef¡Ze eef¡Ze  d¡Z!e  d¡Z"eeegƒ\Z#Z$edk   ej%¡Z&edk   ej%¡Z'ee&e'gƒ\Z(Z)e eef¡Z*e +e*e*j,¡Z-di fdi fde.ddfdi fde.e e¡fdfde.e-fdfdi fdi fdi fg	Z/eedƒkr´e/ 0de.de e¡fdf¡ ne/ 0d e.de e¡fdf¡ ej1 2d!¡ej1j3d"e/d#d$„ d%ej1 3d&eefe!e"fe#e$fg¡d'd(„ ƒƒƒZ4ej1 3d)e¡ej1 3d*e&e'fe(e)fg¡d+d,„ ƒƒZ5ej1 2d!¡ej1j3d"e/d-d$„ d%ej1 3d.ee!e#g¡d/d0„ ƒƒƒZ6ej1 2d!¡ej1j3d"e/d1d$„ d%d2d3„ ƒƒZ7ej1 3d)e¡ej1 3d4e&e(g¡d5d6„ ƒƒZ8ej1 2d!¡ej1 3d7d8d9g¡ej1j3d"e/d:d$„ d%ej1 3d.ee!g¡d;d<„ ƒƒƒƒZ9ej1 2d!¡ej1 3d)e¡ej1 3d4e&e(g¡d=d>„ ƒƒƒZ:ej1 3d&eefe!e"fe#e$fg¡d?d@„ ƒZ;dAdB„ Z<dCdD„ Z=ej1 2d!¡dEdF„ ƒZ>ej1 3dGe ?dHdIdJg¡e@dKfe ?dHdIejAg¡e@dLfe BdHdIdHg¡eCdMfe ?dNdOdPg¡e@dQfe ?g ¡e@dRfg¡dSdT„ ƒZDdUdV„ ZEdWdX„ ZFej1 2d!¡ej1 3dYdHdIdZg¡d[d\„ ƒƒZGdS )]é    N)Úcdist)ÚDistanceMetric)ÚBOOL_METRICSÚDistanceMetric32)Úcheck_random_state)Úassert_allcloseÚcreate_memmap_backed_data)Ú
sp_versionÚparse_versionc                 C   s   t  | | | ¡d|  S )Ng      ð?)ÚnpÚsum)Úx1Úx2Úp© r   úK/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/metrics/tests/test_dist_metrics.pyÚ	dist_func   s    r   é   é   é   Úfloat32g333333Ó?gffffffæ?Ú	euclideanZ	cityblockÚ	minkowski)é   ç      ø?é   é   )r   Z	chebyshevÚ
seuclidean©ÚVÚmahalanobis©ÚVIZhammingZcanberraZ
braycurtisz
1.8.0.dev0)r   r   r   ©r   ÚwÚ
wminkowskiz/ignore:WMinkowskiDistance:FutureWarning:sklearnÚmetric_param_gridc                 C   s   | d S ©Nr   r   ©Úparamsr   r   r   Ú<lambda>M   ó    r*   )ÚidszX, Yc              
   C   s–  |j |j   krtjkr"n ntnt}| \}}| ¡ }t |¡t |¡ }}tj	| 
¡ Ž D ]4}	tt||	ƒƒ}
i }|dkrŽ|j tjkrŽddi}|dkrÒd }ttdƒkrªt}t |¡ t|||f|
Ž}W 5 Q R X nt|||f|
Ž}|j|f|
Ž}| ||¡}|jjs
t‚t||f|Ž | ||¡}|jjs2t‚t||f|Ž | ||¡}|jjsZt‚t||f|Ž | ||¡}|jjs‚t‚t||f|Ž qZd S )Nr    Úrtolçíµ ÷Æ°>r%   ú1.6.0)Údtyper   Úfloat64r   r   ÚkeysÚspÚ
csr_matrixÚ	itertoolsÚproductÚvaluesÚdictÚzipr   r	   r
   ÚDeprecationWarningÚpytestÚwarnsr   Ú
get_metricÚpairwiseÚflagsÚc_contiguousÚAssertionErrorr   )r&   ÚXÚYÚDistanceMetricInterfaceÚmetricÚ
param_gridr2   ÚX_csrÚY_csrÚvalsÚkwargsÚ	rtol_dictZWarningToExpectÚD_scipy_cdistÚdmÚ	D_sklearnr   r   r   Ú
test_cdistK   s<    $ÿrO   rE   zX_bool, Y_boolc                 C   sÎ   t ||| ƒ}t | ¡}| ||¡}t||ƒ t |¡t |¡ }}| ||¡}|jjsZt	‚t||ƒ | ||¡}|jjs|t	‚t||ƒ | ||¡}|jjsžt	‚t||ƒ | ||¡}|jjsÀt	‚t||ƒ d S ©N)
r   r   r=   r>   r   r3   r4   r?   r@   rA   )rE   ÚX_boolÚY_boolrL   rM   rN   Ú
X_bool_csrZ
Y_bool_csrr   r   r   Útest_cdist_bool_metric   s"    




rT   c                 C   s   | d S r'   r   r(   r   r   r   r*   ¤   r+   rB   c              
   C   s`  |j tjkrtnt}| \}}| ¡ }t |¡}tj	| 
¡ Ž D ]}tt||ƒƒ}i }	|dkrp|j tjkrpddi}	|dkrÊttdƒkrŽt d¡ d }
ttdƒkr¢t}
t |
¡ t|||f|Ž}W 5 Q R X nt|||f|Ž}|j|f|Ž}| |¡}|jjsþt‚t||f|	Ž | |¡}|jjs$t‚t||f|	Ž | ||¡}|jjsLt‚t||f|	Ž q<d S )Nr    r-   r.   r%   z1.8.0z)wminkowski will be removed in SciPy 1.8.0r/   )r0   r   r1   r   r   r2   r3   r4   r5   r6   r7   r8   r9   r   r	   r
   r;   Úskipr:   r<   r   r=   r>   r?   r@   rA   r   )r&   rB   rD   rE   rF   r2   rG   rI   rJ   rK   ZExceptionToAssertÚD_scipy_pdistrM   rN   ZD_sklearn_csrr   r   r   Ú
test_pdist¢   s:    ÿ



rW   c                 C   s   | d S r'   r   r(   r   r   r   r*   ×   r+   c                 C   s¾   | \}}|  ¡ }d}tj| ¡ Ž D ]–}tt||ƒƒ}tj|f|Ž}tj|f|Ž}| 	t
¡}	| 	t¡}
|	j|
j  kr~tjks„n t‚t|	|
|d | 	t
t¡}	| 	tt¡}
t|	|
|d q"d S )Ngñhãˆµøä>©r-   )r2   r5   r6   r7   r8   r9   r   r=   r   r>   ÚX64ÚX32r0   r   r1   rA   r   ÚY64ÚY32)r&   rE   rF   r2   r-   rI   rJ   Zdm64Zdm32ZD64ZD32r   r   r   Ú'test_distance_metrics_dtype_consistencyÕ   s    

 r]   rQ   c                 C   sL   t ||| ƒ}t | ¡}| |¡}t||ƒ t |¡}| |¡}t||ƒ d S rP   )r   r   r=   r>   r   r3   r4   )rE   rQ   rV   rM   rN   rS   r   r   r   Útest_pdist_bool_metricsû   s    




r^   Úwritable_kwargsTFc                 C   s   | d S r'   r   r(   r   r   r   r*     r+   c                 C   sÄ   |j tjkrtnt}|\}}| ¡ }tj| ¡ Ž D ]Œ}t	dd„ |D ƒƒrtt
 |¡}|D ]}t|tjƒrV|j| d qVtt||ƒƒ}	|j|f|	Ž}
|
 |¡}t t |
¡¡}| |¡}t||ƒ q2d S )Nc                 s   s   | ]}t |tjƒV  qd S rP   )Ú
isinstancer   Úndarray)Ú.0Úvalr   r   r   Ú	<genexpr>  s     ztest_pickle.<locals>.<genexpr>©Úwrite)r0   r   r1   r   r   r2   r5   r6   r7   ÚanyÚcopyÚdeepcopyr`   ra   Úsetflagsr8   r9   r=   r>   ÚpickleÚloadsÚdumpsr   )r_   r&   rB   rD   rE   rF   r2   rI   rc   rJ   rM   ÚD1Údm2ÚD2r   r   r   Útest_pickle	  s     ÿ


rq   c                 C   s<   t  | ¡}| |¡}t t |¡¡}| |¡}t||ƒ d S rP   )r   r=   r>   rk   rl   rm   r   )rE   rQ   rM   rn   ro   rp   r   r   r   Útest_pickle_bool_metrics$  s
    


rr   c                 C   sh  | j tjkrtnt}t | d d …d d…f ¡} t |d d …d d…f ¡}t | ¡t |¡ }}dd„ }t |j	d |j	d f¡}t
| ƒD ],\}}t
|ƒD ]\}	}
|||
ƒ|||	f< q˜qˆ| d¡}| | |¡}t| |¡t d| ¡d dd t||ƒ | ||¡}|jjst‚t||ƒ | ||¡}|jjs6t‚t||ƒ | | |¡}|jjsZt‚t||ƒ d S )	Nr   c                 S   sh   dt  t  t  d| d |d   ¡d t  | d ¡t  |d ¡ t  d| d |d   ¡d   ¡¡ S )Nr   ç      à?r   r   )r   ZarcsinÚsqrtÚsinÚcos)r   r   r   r   r   Úhaversine_slow=  s    8ÿÿÿz-test_haversine_metric.<locals>.haversine_slowr   Ú	haversiners   r.   rX   )r0   r   r1   r   r   Zasarrayr3   r4   ÚzerosÚshapeÚ	enumerater=   r>   r   Zdist_to_rdistru   r?   r@   rA   )rB   rC   rD   rG   rH   rw   ZD_referenceÚiÚxiÚjZyjrx   rN   r   r   r   Útest_haversine_metric/  s6    ÿ
  ÿ


r   c            	      C   s†   t j d¡} t d¡}tjdtdd}t t |¡¡}t t |¡¡}| | ¡}| | ¡}| | ¡}| | ¡}t	||ƒ t	||ƒ d S )N)é
   r   r   Úpyfuncr   )Úfuncr   )
r   Úrandomr   r=   r   rk   rl   rm   r>   r   )	rB   r   r   Zeuclidean_pklZ
pyfunc_pklrn   rp   ZD1_pklZD2_pklr   r   r   Útest_pyfunc_metric`  s    





r„   c                  C   sR   dd„ } t dƒ}| dd¡}tjd| d}t d¡}t| |¡| |¡d	 ƒ d S )
Nc                 S   s$   | j d dkst‚t | | d ¡S )Nr   r   r   )rz   rA   r   r   )ÚxÚyr   r   r   Úcustom_metricx  s    z+test_input_data_size.<locals>.custom_metricr   r€   r   r   )r‚   r   r   )r   Úrandr   r=   r   r>   )r‡   ÚrngrB   r   Zeuclr   r   r   Útest_input_data_sizeu  s    
rŠ   c                  C   sf   t dƒ} |  d¡}|  dd¡}|jdd |jdd tjd|d tjdd	|d
 tjd|d d S )Nr   éd   r€   Fre   r   r   r%   r   r#   r    r!   )r   rˆ   rj   r   r=   )r‰   Úweightsr"   r   r   r   Útest_readonly_kwargs…  s    
r   zw, err_type, err_msgr   r   ióÿÿÿz!w cannot contain negative weightszw contains NaNz6A sparse matrix was passed, but dense data is requiredÚaÚbÚcz!could not convert string to floatza minimum of 1 is requiredc              	   C   s.   t j||d tjdd| d W 5 Q R X d S )N©Úmatchr   r   r#   )r;   Úraisesr   r=   )r$   Zerr_typeÚerr_msgr   r   r   Ú-test_minkowski_metric_validate_weights_values—  s    r•   c               	   C   sf   t  td ¡} tjdd| d}dtjd › d| jd › d}tjt	|d	 | 
tt¡ W 5 Q R X d S )
Nr   r   r   r#   zEMinkowskiDistance: the size of w must match the number of features \(z\). Currently len\(w\)=r   Ú.r‘   )r‰   Úrandom_sampleÚdr   r=   rY   rz   r;   r“   Ú
ValueErrorr>   r[   )Zw2rM   Úmsgr   r   r   Ú+test_minkowski_metric_validate_weights_sizeª  s    ÿr›   c               	   C   s<   t  t¡} d}tjt|d tjdd| d W 5 Q R X d S )Nz/WMinkowskiDistance is deprecated in version 1.1r‘   r%   r   r#   )r‰   r—   r˜   r;   r<   ÚFutureWarningr   r=   )r$   rš   r   r   r   Útest_wminkowski_deprecated·  s    
r   r   r   c                 C   sX   t  t¡}tjd| |d|   d}tjd| |d}| tt¡}| tt¡}t||ƒ d S )Nr%   r   r#   r   )	r‰   r—   r˜   r   r=   r>   rY   r[   r   )r   r$   Zdm_wmksZdm_mksZD_wmksZD_mksr   r   r   Ú%test_wminkowski_minkowski_equivalence¿  s    
rž   )Hr5   rk   rh   Znumpyr   r;   Zscipy.sparseÚsparser3   Zscipy.spatial.distancer   Zsklearn.metricsr   Zsklearn.metrics._dist_metricsr   r   Zsklearn.utilsr   Zsklearn.utils._testingr   r   Zsklearn.utils.fixesr	   r
   r   r‰   r˜   Zn1Zn2r—   rY   r[   ZastyperZ   r\   ZX_mmapZY_mmapr1   rQ   rR   ZX_bool_mmapZY_bool_mmapr   ÚdotÚTr"   r8   ZMETRICS_DEFAULT_PARAMSÚappendÚmarkÚfilterwarningsZparametrizerO   rT   rW   r]   r^   rq   rr   r   r„   rŠ   r   Úarrayr™   Únanr4   Ú	TypeErrorr•   r›   r   rž   r   r   r   r   Ú<module>   sà   

÷ÿÿ
  ÿ1 ÿ
  ÿ.
  ÿ"
  ÿ

0

ý÷þ

