U
    3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@Adbe4W 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`dfddq e`dfddq e`dfgdd ZadddZbej@Ad3ddd Zcej@Ad3ddd Zdedd Zeej@jAdejfegddgdej@jAdejfegddgddd Zgej@jAdejfegddgddd Zhdd Ziej@jAdejfegddgdej@jAdejfegddgddd Zjej@jAdejfegddgddd Zkej@Addd>ddgej@jAdejfegddgdej@jAdejfegddgddd Zlej@Addd>ddgej@jAdejfegddgddd Zmej@AdejPddfejMejOddej@jnddJdKgej@Add=dgdd Zoej@Add/d0gdd Zpej@Adefejqd ggefd ejq gggej@Adefejqd ggefd ejq ggdgdd Zrej@Ade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dfefd d=gd=dggesddfefdd=gd=dggejtdfefdd=gdd ggesddfefd dgd=dggesddfg
dd Zuej@Adejtdgdd Zvej@Adejtdgdd Zwej@Adejtdgdd ZxddĄ ZyddƄ ZzddȄ Z{ddʄ Z|dd̄ Z}ej@Ade#e&e'e(e)e*fddτ Z~ej@Ade#e&e'e(e)e*fddф Zddӄ ZddՄ Zddׄ Zej@AddYe#fde*fgddۄ Zdd݄ Zdd߄ Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zej@Add=dgej@Ad3ddgej@Ade,e-gdd Zej@Ad3ddgdd Zej@Ad3dddddddGdddddFgej@jAdd/d0gddgdd d Zd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sn 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sn 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st	|jd |jd kst	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st	|jd |jd kst	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sn t	n8tt	( |j|j  kr| ksn 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>   G/tmp/pip-unpacked-wheel-zrfo1fqw/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sttd}| |td	dd}||kst| 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   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rt	
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rt|  ||}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st	t|t jkst	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:   Hz>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 )Nd   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st
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sizeZ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   ir<   )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)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st	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:0yE>gGz?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 )N9  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   r0  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    

r4  r2  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   )r2  r`   r3  r   r>   r>   rB   )test_nan_euclidean_distances_complete_nan  s    
r5  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   Tr1  g      D@r<   Fg      9@r6   )rO   r   r   r   Tr   r!  r7   )
r2  r`   rc   r  r  r  r  ZD5ZD6ZD7r>   r>   rB   'test_nan_euclidean_distances_not_trival
  sR    	
 
  
 
  

r7  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 )
NgzG^g     @@gB@g|ï@T)r0  r   r   Fr.  )rO   r   r   r   rU   r   )r2  r`   Zdist_squaredr   r>   r>   rB   7test_nan_euclidean_distances_one_feature_match_positive?  s    

  r8  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st	t |dkst	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>   rA  rB   test_haversine_distancesr  s    	




rC  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    
rE  c                  C   s4   dgdgg} dgdgg}t | |}t|ddg d S r  )r/   r   rD  r>   r>   rB   test_paired_manhattan_distances  s    
rF  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st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stdd	gd
dgg}ddgddgg}t||}|d |d kst|d |d kst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    


$


  "rM  kernelc                 C   s2   t jd}|d}| ||}t||jd d S )Nr   r3      )rO   rP   rQ   rR   r   r6  )rN  r_   r`   r   r>   r>   rB   test_kernel_symmetry  s    

rP  c                 C   s@   t jd}|d}t|}| ||}| ||}t|| d S Nr   r3   )rO   rP   rQ   rR   r   r   )rN  r_   r`   rf   r   r   r>   r>   rB   test_kernel_sparse  s    


rR  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    

rV  c                  C   s@   t jd} | d}t||}t|jd d d t d d S )Nr   r3   rS  r4   )rO   rP   rQ   rR   r   r   rT  onesrU  r>   r>   rB   test_rbf_kernel  s    

rX  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   rW  r   rU   rU  r>   r>   rB   test_laplacian_kernel  s    

rY  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   rZ  r[  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   )r9  
XA_checked
XB_checkedr>   r>   rB   test_check_dense_matricesH  s    rd  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   ra  r   r+   r   r,   r9  r:  rb  rc  r>   r>   rB   test_check_XB_returnedQ  s    


rh  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   re  rf  $   )r5   r   )rO   ra  r   rZ   r[   r]   r+   r,   r9  r:  r>   r>   rB   test_check_different_dimensionsa  s    rl  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 )Nri  r   r4   re  r5   r   )rO   r   r   rZ   r[   r]   r+   rk  r>   r>   rB   test_check_invalid_dimensionsm  s    rm  c                  C   s   t jd} | d}t|}| d}t|}t||\}}t|sJtt|| 	 dksbtt|sntt|| 	 dkstt||\}}t|stt|| 	 dkstt|stt|| 	 dkstd S rQ  )
rO   rP   rQ   rR   r   r+   r   rU   r   rv   )r_   r9  Z	XA_sparser:  Z	XB_sparserb  rc  ZXA_2_checkedr>   r>   rB   test_check_sparse_arrays{  s    

rn  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   ro    s    ro  c                  C   sV   t jd} | d}t|}| d}t|}t||\}}t|| t|| d S rQ  )rO   rP   rQ   rR   ro  r+   r   )r_   r9  Z	XA_tuplesr:  Z	XB_tuplesrb  rc  r>   r>   rB   test_check_tuple_input  s    


rq  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stt| t|\}}|jtkst|jtkstt| |t\}}|jtkst|jtkstd S r^  )	rO   ra  r   rS   r   r+   rT   rU   rG  rg  r>   r>   rB   test_check_preserve_type  s    rr  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:   ru  r_   r`   expected_distr   r>   r>   rB   +test_pairwise_distances_data_derived_params  s    
rw  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    


rx  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rdt jt 	||gddt j
d	i}n,| d
krdt jt t 	||gjji}t||fd| i|}t|| d S )Nr   r3   Fr6   r9   rs  VrJ   )r   ZddofrT   rt  ZVIr:   )rO   rP   rQ   rR   rS   r   r   r
   varr   rY   r   invZcovr6  r"   r   )	r:   r^   ry  r_   r`   r   rc   rv  r   r>   r>   rB   )test_numeric_pairwise_distances_datatypes  s    $$r}  )r8   )rx   typesr   Z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   r4  r5  r7  r8  r;  rC  rE  rF  rM  rP  rR  rV  rX  rY  r\  r]  rd  rh  rl  rm  rn  ro  rq  rr  rw  rx  r}  r>   r>   r>   rB   <module>   s~   

	


	
	$
!
y





'      
 "      
      

.0	"$"&&    


4
<

	 
	 
