U
    Ovf8                     @   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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de/deefdfg
Z0ej1j2de0d d! d"ej12d#ee fe"e#fe$e%fgd$d% Z3ej12d&eej12d'e'e(fe)e*fgd(d) Z4ej1j2de0d*d! d"ej12d+ee"e$gd,d- Z5ej1j2de0d.d! d"d/d0 Z6ej12d&eej12d1e'e)gd2d3 Z7ej12d4d5d6gej1j2de0d7d! d"ej12d+ee"gd8d9 Z8ej12d&eej12d1e'e)gd:d; Z9ej12d#ee fe"e#fe$e%fgd<d= Z:d>d? Z;d@dA Z<dBdC Z=ej12dDe>dEdFdGge?dHfe>dEdFej@ge?dIfeAdEdFdEgeBdJfe>dKdLdMge?dNfe>g e?dOfgdPdQ ZCdRdS ZDej12dTe0ej12dUejEej&fdVdW ZFdXdY ZGdZd[ ZHdS )\    N)cdist)DistanceMetric)BOOL_METRICSDistanceMetric32DistanceMetric64)check_random_state)assert_allclosecreate_memmap_backed_data)parse_version
sp_versionc                 C   s   t | | | d|  S )Ng      ?)npsum)x1x2p r   K/tmp/pip-unpacked-wheel-qu3nn_q2/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
braycurtis)r   r   r   r   r   wmetric_param_gridc                 C   s   | d S Nr   r   paramsr   r   r   <lambda>=       r,   )idszX, Yc                 C   sZ  | \}}|  }t|t| }}tj|  D ]}tt||}	i }
|dkrh|jt	j
krhddi}
|dkr|	d }ttdk r|dk rtd t|||f|	}tj||jf|	}|||}|jjstt||f|
 |||}|jjstt||f|
 |||}|jjstt||f|
 |||}|jjsFtt||f|
 q4d S 	Nr#   rtolư>r   r   z1.7.0r   z9scipy does not support 0<p<1 for minkowski metric < 1.7.0keyssp
csr_matrix	itertoolsproductvaluesdictzipdtyper   r   r   r
   pytestskipr   r   
get_metricpairwiseflagsc_contiguousAssertionErrorr   )r(   XYmetric
param_gridr3   X_csrY_csrvalskwargs	rtol_dictr   D_scipy_cdistdm	D_sklearnr   r   r   
test_cdist<   s4    
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st	t|| |||}|jjst	t|| d S N)
r   r   r>   r?   r   r4   r5   r@   rA   rB   )rE   X_boolY_boolrL   rM   rN   
X_bool_csrZ
Y_bool_csrr   r   r   test_cdist_bool_metricm   s"    




rT   c                 C   s   | d S r)   r   r*   r   r   r   r,      r-   rC   c                 C   s   | \}}|  }t|}tj|  D ]}tt||}i }|dkrZ|jt	j
krZddi}|dkr|d }	ttdk r|	dk rtd t|||f|}
tj||jf|}||}|jjstt||
f| ||}|jjstt||
f| |||}|jjstt||
f| q(d S r/   r2   )r(   rC   rE   rF   r3   rG   rI   rJ   rK   r   D_scipy_pdistrM   rN   ZD_sklearn_csrr   r   r   
test_pdist   s.    



rV   c                 C   s   | d S r)   r   r*   r   r   r   r,      r-   c                 C   s   | \}}|  }d}tj|  D ]}tt||}tj|tj	f|}tj|tj
f|}|t}	|t}
|	j|
j  krtj	ksn tt|	|
|d |tt}	|tt}
t|	|
|d q"d S )Ngh㈵>r0   )r3   r6   r7   r8   r9   r:   r   r>   r   float64r   r?   X64X32r;   rB   r   Y64Y32)r(   rE   rF   r3   r0   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   r4   r5   )rE   rQ   rU   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   |\}}|  }tj|  D ]}tdd |D r`t|}|D ]}t|tj	rB|j
| d qBtt||}tj||jf|}	|	|}
tt|	}||}t|
| qd 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)r3   r6   r7   r8   anycopydeepcopyr`   r   ra   setflagsr9   r:   r   r>   r;   r?   pickleloadsdumpsr   )r_   r(   rC   rE   rF   r3   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   sX  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< qqttd| j	}
|

| |}t|
|t d| d dd t|| |

||}|jjstt|| |

||}|jjs&tt|| |

| |}|jjsJt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   )r   Zarcsinsqrtsincos)r   r   r   r   r   haversine_slow  s    8z-test_haversine_metric.<locals>.haversine_slowr   	haversiner   r1   rW   )r   Zasarrayr4   r5   zerosshape	enumerater   r>   r;   r?   r   Zdist_to_rdistrt   r@   rA   rB   )rC   rD   rG   rH   rv   ZD_referenceixijZyjrw   rN   r   r   r   test_haversine_metric  s2      


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   )	rC   r   r   Zeuclidean_pklZ
pyfunc_pklrn   rp   ZD1_pklZD2_pklr   r   r   test_pyfunc_metric5  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   )ry   rB   r   r   )xyr   r   r   custom_metricM  s    z+test_input_data_size.<locals>.custom_metricr   r   r   r   )r   r   r   )r   randr   r>   r   r?   )r   rngrC   r   Zeuclr   r   r   test_input_data_sizeJ  s    
r   c                  C   sV   t d} | d}| dd}|jdd |jdd tjd|d tjd|d	 d S )
Nr   d   r   Fre   r    r!   r#   r$   )r   r   rj   r   r>   )r   weightsr%   r   r   r   test_readonly_kwargsY  s    
r   zw, err_type, err_msgr   r   iz!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_valuesi  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   ry   r<   r   
ValueErrorr?   r[   )Zw2rM   msgr   r   r   +test_minkowski_metric_validate_weights_size|  s    r   zmetric, metric_kwargsr;   c                 C   s\   t jtt jti| }dd | D }ttj| |f|}t|j| f|}||ksXt	d S )Nc                 S   s   i | ]\}}||d  qS )r   r   )rb   kvr   r   r   
<dictcomp>  s      z)test_get_metric_dtype.<locals>.<dictcomp>)
r   r   r   rX   r   itemstyper   r>   rB   )rE   Zmetric_kwargsr;   Zspecialized_clsZgeneric_typeZspecialized_typer   r   r   test_get_metric_dtype  s      r   c               	   C   s4   t j} d}tjt|d td|  W 5 Q R X d S )Nz8Unexpected dtype .* provided. Please select a dtype fromr   Z	manhattan)r   Zint32r<   r   r   r   r>   )r;   r   r   r   r   test_get_metric_bad_dtype  s    r   c               	   C   s0   d} t jt| d tjddd W 5 Q R X d S )Nzp must be greater than 0r   r   r   r   )r<   r   r   r   r>   )r   r   r   r   .test_minkowski_metric_validate_bad_p_parameter  s    r   )Irh   r6   rk   Znumpyr   r<   Zscipy.sparsesparser4   Zscipy.spatial.distancer   Zsklearn.metricsr   Zsklearn.metrics._dist_metricsr   r   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_mmaprX   rQ   rR   ZX_bool_mmapZY_bool_mmapr"   dotTr%   r9   ZMETRICS_DEFAULT_PARAMSmarkZparametrizerO   rT   rV   r]   r^   rq   rr   r~   r   r   r   arrayr   nanr5   	TypeErrorr   r   r   r   r   r   r   r   r   r   <module>   s   

  -   %  
"  
,
