o
    ?Hh                     @   s
  d dl Z d dlmZ d dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZ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mZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d d	l2m3Z3 d d
l4m5Z5m6Z6m7Z7m8Z8 d dl9m:Z:m;Z;m<Z<m=Z=m>Z> d dl?m@Z@mAZA dd ZBejCDde;ejCDde<ejCDde:ejCDde=dd ZEe8eFdejCDdedd ZGdd ZHejCDde*e.gdd ZIdd ZJeKd d!jLd"d#d$d d%ZMd&d' ZNejCDd(e*d)i fe*eeMfe*d*eMfe.d+d,d ife.eNd-d.ifgejCDd/ejOejPeQgd0d1 ZRd2d3 ZSejCDdg d4ejCDde=d5d6 ZTd7d8 ZUd9d: ZVejCDd;eW ejCDde=d<d= ZXd>d? ZYejCDd@e>ejCDde=dAdB ZZdCdD Z[dEdF Z\dGdH Z]ejCDdIdJdK dLdK dMdK gdNdO e=D  dPdO e>D  dQdR Z^ejCDdSdTdK e_dUfdVdK e_dWfdXdK e_dYfdZdK e`d[fd\dK e`d]fd^dK e`d_fgd`da ZaddbdcZbejCDddddedf ZcejCDddddgdh ZdejCedidjdk ZfejCjDdlejgge= dmgdndO e=D  doejCjDdpejgge= dmgdqdO e=D  dodrds ZhejCjDdpejgge= dmgdtdO e=D  dodudv ZiejCDdwdxd#gdydz Zjd{d| ZkejCjDdlejgge= dmgd}dO e=D  doejCjDdpejgge= dmgd~dO e=D  dodd ZlejCjDdlejgge= dmgddO e=D  dodd ZmejCDdg dejCjDdlejgge= dmgddO e=D  doejCjDdpejgge= dmgddO e=D  dodd ZnejCDdg dejCjDdlejgge= dmgddO e=D  dodd ZoejCDdejPddfejpejOddejCjqdddgejCDdd dgdd ZrejCDddxd#gdd ZsejCDdegejtd ggegd ejt gggejCDdegejtd ggegd ejt ggdgdd ZuejCDdegd d gd d ggevdejwfegd d gd ejwggevdejwfegejwd gd ejwggejwejwfegejwd gejwd ggevdejwfegd ejwgd ejwggevdejwfegd d gd d ggevddfegd d gd dggevddfegdd gd dggejwdfegdd gdd ggevddfegd dgd dggevddfg
dd ZxejCDdejwdgdd ZyejCDdejwdgdd ZzejCDdejwdgdd Z{dd Z|dd Z}dd Z~dd Zdd Zdd ZejCDde#e/e0e"e1efdd ZejCDde#e/e0e"e1efejCDde=dd Zdd Zdd Zdd ZejCDdde#fdefgejCDde=ddǄ ZejCDde=ddɄ Zdd˄ Zdd̈́ Zddτ Zddф ZejCDde=ddӄ ZddՄ Zddׄ Zddل ZejCDdd dgejCDdddgejCDde*e-gdd߄ ZejCDdddgdd ZejCDdg dejCjDddxd#gddgdodd ZejCDde*e+e,gdd Zdd ZejCDdg ddg dg dg dgfg dddgddgddgddggfgdd Zdd ZejCDde=dd Zdd ZdS (       N)GeneratorType)linalg)issparse)cdist	cityblockcosine	minkowskipdist
squareform)config_context)DataConversionWarning)PAIRED_DISTANCESPAIRWISE_BOOLEAN_FUNCTIONSPAIRWISE_DISTANCE_FUNCTIONSPAIRWISE_KERNEL_FUNCTIONS_euclidean_distances_upcastadditive_chi2_kernelcheck_paired_arrayscheck_pairwise_arrayschi2_kernelcosine_distancescosine_similarityeuclidean_distanceshaversine_distanceslaplacian_kernellinear_kernelmanhattan_distancesnan_euclidean_distancespaired_cosine_distancespaired_distancespaired_euclidean_distancespaired_manhattan_distancespairwise_distancespairwise_distances_argminpairwise_distances_argmin_minpairwise_distances_chunkedpairwise_kernelspolynomial_kernel
rbf_kernelsigmoid_kernel)	normalize)assert_allcloseassert_almost_equalassert_array_equalignore_warnings)BSR_CONTAINERSCOO_CONTAINERSCSC_CONTAINERSCSR_CONTAINERSDOK_CONTAINERS)Paralleldelayedc                 C   s  t jd}|dj| dd}t|dd}t|}t|| |j|j  kr,| ks/J  J |dj| dd}t||dd}t||}t|| |j|j  krW| ksZJ  J |dj| dd}|dj| dd}t j	|d< t j	|d< t||d	d}t
||}	t||	 |j|	j  kr| ksJ  J td
d |D }
tdd |D }t|
|dd}t|| |j|j  kr| ksJ  J |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slJ |jd |jd ksyJ t|| t||dd}t||td}|jd |jd ksJ |jd |jd ksJ t|| t||dd}t||td}|jd |jd ksJ |jd |jd ksJ t|| d S )Nr         Fcopy	euclideanmetric   r8   r   r   nan_euclideanc                 S      g | ]}t d d |D qS )c                 S      g | ]}|qS  rD   .0vrD   rD   c/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/sklearn/metrics/tests/test_pairwise.py
<listcomp>`       Etest_pairwise_distances_for_dense_data.<locals>.<listcomp>.<listcomp>tuplerF   rowrD   rD   rH   rI   `       z:test_pairwise_distances_for_dense_data.<locals>.<listcomp>c                 S   rB   )c                 S   rC   rD   rD   rE   rD   rD   rH   rI   a   rJ   rK   rL   rN   rD   rD   rH   rI   a   rP   r7   r?         ?r?      	haversine)r?   r?   r   	manhattanr   )nprandomRandomStaterandom_sampleastyper"   r   r+   dtypenanr   rM   pir   r   shaper   )global_dtyperngXSS2YX_maskedY_maskedS_masked	S2_maskedX_tuplesY_tuplesrD   rD   rH   &test_pairwise_distances_for_dense_dataC   sf   
 

 



 
 .*
.*



rk   coo_containercsc_containerbsr_containercsr_containerc                 C   s  t jd}|dj|dd}|dj|dd}||}||}	t||	dd}
t||	}t|
| |
j|j  kr@|ksCJ  J t||	dd}
t	||	}t|
| |
j|j  kra|ksdJ  J t|||d	d}
t
||| |}t|
| |t jkr|
j|j  kr|ksJ  J n%tt |
j|j  kr|ksJ  J W d    n1 sw   Y  t
||}t|
| |t jkr|
j|j  kr|ksJ  J n%tt |
j|j  kr|ksJ  J W d    n1 sw   Y  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 d    n	1 sNw   Y  tt t||	dd W d    d S 1 slw   Y  d S )Nr   r6   Fr9   r>   r;   r<   r   rU   p       @r=   r   )rV   rW   rX   rY   rZ   r"   r   r+   r[   r   r   float64pytestraisesAssertionErrorr   	TypeError)rl   rm   rn   ro   r_   r`   ra   rd   X_sparseY_sparserb   rc   kwdsrD   rD   rH   'test_pairwise_distances_for_sparse_data   sT   

 

 

""


""

$rz   categoryr=   c              	   C   sp  t jd}|dd}| }d|d  |d< ttd+ |d fD ]}t||| d}t j|ddddd	 t 	|dkdks@J q"W d    n1 sKw   Y  d
|  }t
jt|d t|| d W d    n1 slw   Y  t
jt|d t|t|| d W d    n1 sw   Y  t  tdt t|t| d W d    d S 1 sw   Y  d S )Nr   r7   r8   rS   r@   r{   r<   F)r\   posinfneginfr:   z+Data was converted to boolean for metric %smatchrd   r=   error)rV   rW   rX   randnr:   r.   r   r"   
nan_to_numsumrs   warnsrZ   boolwarningscatch_warningssimplefilter)r=   r`   ra   rd   ZresmsgrD   rD   rH   test_pairwise_boolean_distance   s,   
"r   c                  C   s^   t jd} | dd}t  tdt t|dd W d    d S 1 s(w   Y  d S )Nr   r7   r8   r   r   r<   )	rV   rW   rX   r   r   r   r   r   r"   )r`   ra   rD   rD   rH   test_no_data_conversion_warning   s   
"r   funcc                 C   sj  t jtdd | tddd W d    n1 sw   Y  t jtdd | tdtddd W d    n1 s?w   Y  t jtdd | tdtddd W d    n1 scw   Y  td}| |dd}||u syJ td}| |td	dd}||u sJ | tjd
ggdddd}d|jjksJ | dggdd}t|tj	sJ d S )Nz.* shape .*r   )r7      precomputedr<   )r8   r8   )r8   r   r7   r7   )r   r   rS   intr[   f      ?)
rs   rt   
ValueErrorrV   zerosarrayr[   kind
isinstancendarray)r   rb   rc   rD   rD   rH   test_pairwise_precomputed  s&   

r   c                   C   sH   t jtdd ttdddd W d    d S 1 sw   Y  d S )Nz.* non-negative values.*r   r   r   r<   )rs   rt   r   r"   rV   fullrD   rD   rD   rH   &test_pairwise_precomputed_non_negative   s   "r   rS   r7   doubleFr9   )wrp   c                 K   s&   t t| t|fi |}| S N)r(   rV   
atleast_2ditem)xyry   KrD   rD   rH   callable_rbf_kernel)  s   r   zfunc, metric, kwdsr;   r   
polynomialdegreegamma皙?r[   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   r7   r6   r   r   r8   rS   r=   n_jobsr?   )rV   rW   rX   r   rY   r+   )	r   r=   ry   r[   r`   ra   rd   rb   rc   rD   rD   rH   test_pairwise_parallel0  s   
r   c                   C   s$   t dggdd dd dksJ d S )Nr   c                 S      dS )Nr7   rD   r   r   rD   rD   rH   <lambda>U      z9test_pairwise_callable_nonstrict_metric.<locals>.<lambda>r<   r@   r7   )r"   rD   rD   rD   rH   'test_pairwise_callable_nonstrict_metricQ  s   $r   )rbf	laplaciansigmoidr   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|| ||}
||}| d
v rad S t|
|| d}t|| d S )Nr   r6   r>   r<   r   rd   c                 S   rB   )c                 S   rC   rD   rD   rE   rD   rD   rH   rI   n  rJ   4test_pairwise_kernels.<locals>.<listcomp>.<listcomp>rL   rN   rD   rD   rH   rI   n  rP   z)test_pairwise_kernels.<locals>.<listcomp>c                 S   rB   )c                 S   rC   rD   rD   rE   rD   rD   rH   rI   o  rJ   r   rL   rN   rD   rD   rH   rI   o  rP   )r   r   )rV   rW   rX   rY   r   r&   r+   rM   )r=   ro   r`   ra   rd   functionK1K2ri   rj   rw   rx   rD   rD   rH   test_pairwise_kernelsY  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   r6   r>   r   r   r   rd   )rV   rW   rX   rY   r   r&   r(   r+   )r`   ra   rd   r=   ry   r   r   rD   rD   rH   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 d    d S 1 sIw   Y  d S )Nr   r6   r>   r   r   z:))r   blablar   T)r=   filter_paramsr=   )
rV   rW   rX   rY   r(   r&   r+   rs   rt   rv   )r`   ra   rd   r   paramsr   rD   rD   rH   "test_pairwise_kernels_filter_param  s   



"r   zmetric, funcc           
      C   s   t jd}|d}|d}t||| d}|||}t|| |||||}t|| | tv rFt|  ||}	t |	}	t|	| d S d S )Nr   r6   r<   )rV   rW   rX   rY   r   r+   r   diag)
r=   r   ro   r`   ra   rd   rb   rc   S3	distancesrD   rD   rH   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 d    d S 1 sJw   Y  d S )
Nr   r6   Fr9   rU   r<   c                 S   s   t | | jddS )Nr   axis)rV   absr   r   rD   rD   rH   r         z0test_paired_distances_callable.<locals>.<lambda>r   )
rV   rW   rX   rY   rZ   r   r+   rs   rt   r   )r_   r`   ra   rd   rb   rc   rD   rD   rH   test_paired_distances_callable  s   

"r   dok_containerc                 C   s  t jdgdgg|d}t jdgdgg|d}| |}|||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ssJ t|t jks|J 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   rS   r   r   r?   r8   r;   r<   sqeuclideansquaredT)r=   metric_kwargsrU   rp   r   a      o   r   )r   r=   Hz>rtol)rV   asarrayr$   r#   r+   typer   r   rW   rX   r   r"   argminrangelenr-   asfortranarray)r   ro   r_   ra   rd   XspYspexpected_idxexpected_valsexpected_vals_sqidxvalsidx2idxspvalsspidxsp2vals2idx3idx4r`   distdist_orig_inddist_orig_valdist_chunked_inddist_chunked_valargmin_0dist_0argmin_1dist_1argmin_C_contiguousargmin_F_contiguousrD   rD   rH   "test_pairwise_distances_argmin_min  s   
































r   c                 C   s   | d d d df S )Nd   rD   r   startrD   rD   rH   _reduce_funcC  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	s+J t
|}t|dks7J |d j|jksAJ tt ||d	d
 d S )Nr   )i  r8   Fr9   r         >reduce_funcworking_memoryrS   r   atol)rV   rW   rX   rY   rZ   r"   r%   r  r   r   listr   r[   r+   vstack)r_   r`   ra   rb   S_chunksrD   rD   rH   &test_pairwise_distances_chunked_reduceG  s   r  c                 C   st   t jd}|dj| dd}t|d dd dd}t|ts!J t|}t	|d	ks-J t
d
d |D s8J d S )Nr   
   r8   Fr9   c                 S   s   d S r   rD   r   rD   rD   rH   r   ]  r   z=test_pairwise_distances_chunked_reduce_none.<locals>.<lambda>r  r  rS   c                 s   s    | ]}|d u V  qd S r   rD   )rF   chunkrD   rD   rH   	<genexpr>b      z>test_pairwise_distances_chunked_reduce_none.<locals>.<genexpr>)rV   rW   rX   rY   rZ   r%   r   r   r  r   all)r_   r`   ra   r
  rD   rD   rH   +test_pairwise_distances_chunked_reduce_noneX  s   r  good_reducec                 C   s   t | S r   r  Dr   rD   rD   rH   r   h      r   c                 C   s
   t | S r   )rV   r   r  rD   rD   rH   r   i  s   
 c                 C   s   t | t | fS r   r  r  rD   rD   rH   r   j  rJ   c                 C      g | ]}|fd dqS )c                 S   s   || S r   rD   )r  r   scipy_csr_typerD   rD   rH   r   m  r  <listcomp>.<lambda>rD   )rF   r  rD   rD   rH   rI   l  s    
rI   c                 C   r  )c                 S   s   || t | t| fS r   )rV   r   r  )r  r   scipy_dok_typerD   rD   rH   r   q  s   r  rD   )rF   r  rD   rD   rH   rI   p  s    
c                 C   s.   t ddd}t|d | dd}t| d S )Nr  r   rS   @   r  )rV   arangereshaper%   next)r  ra   r
  rD   rD   rH   ,test_pairwise_distances_chunked_reduce_valide  s
   r   )
bad_reduceerr_typemessagec                 C   s   t | | dd  gS Nr   rV   concatenater  srD   rD   rH   r     r   zlength 11\..* input: 10\.c                 C   s   | t | | dd  gfS r$  r%  r'  rD   rD   rH   r         z!length \(10, 11\)\..* input: 10\.c                 C   s   | d d | fS )N	   rD   r'  rD   rD   rH   r     rJ   z length \(9, 10\)\..* input: 10\.c                 C   r   )N   rD   r'  rD   rD   rH   r     r   z2returned 7\. Expected sequence\(s\) of length 10\.c                 C   r   )N)r+     rD   r'  rD   rD   rH   r     r   z9returned \(7, 8\)\. Expected sequence\(s\) of length 10\.c                 C   s   t ddfS )Nr  r*  )rV   r  r'  rD   rD   rH   r     s    z-, 9\)\. Expected sequence\(s\) of length 10\.c                 C   sh   t dddj| dd}t|d |dd}tj||d t| W d    d S 1 s-w   Y  d S )	Nr  r   rS   Fr9   r  r  r   )rV   r  r  rZ   r%   rs   rt   r  )r_   r!  r"  r#  ra   r
  rD   rD   rH   .test_pairwise_distances_chunked_reduce_invalid  s   "
"r-  c           
      C   s   t | |||d}t|tsJ t|}|d u r| n|}t|d d }|D ]}|j}|t||d ks5J q%t|}t	| ||d}	t
||	dd d S )Nr  r=   r,  g      >i   r<   r   r  )r%   r   r   r  r   nbytesmaxrV   r	  r"   r+   )
ra   rd   r  r=   genblockwise_distancesmin_block_mibblockmemory_usedrb   rD   rD   rH    check_pairwise_distances_chunked  s   
r6  )r;   l2r   c                 C   sd   t jd}|jdddj|dd}tt|d| d}t|dks#J tt 	t 
|dd	d
 d S )Nr     r      _BsizescaleFr9   rS   r.  绽|=r   )rV   rW   rX   normalrZ   r  r%   r   r+   r   r	  )r=   r_   r`   ra   chunksrD   rD   rH   (test_pairwise_distances_chunked_diagonal  s
   rA  c                 C   sJ   t jd}|jdddj|dd}t|| dd}tt |dd	d
 d S )Nr   r8  r:  r;  Fr9   r?   r   r>  r  )rV   rW   rX   r?  rZ   r"   r+   r   )r=   r_   r`   ra   r   rD   rD   rH   )test_parallel_pairwise_distances_diagonal  s   rB  z0ignore:Could not adhere to working_memory configc                 C   s0  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	|ddd}t
|tstJ t||u s|J tt t| W d    d S 1 sw   Y  d S )Nr   )   r8   Fr9   rS   r;   r.  ir?   )r   r8   i'  r   r  r   )rV   rW   rX   rY   rZ   r6  r   tolistr"   r%   r   r   r  rs   rt   StopIteration)r_   r`   ra   powerrd   r  r1  rD   rD   rH   test_pairwise_distances_chunked  s0   
"rG  x_array_constrdensec                 C      g | ]}|j qS rD   __name__rF   	containerrD   rD   rH   rI         )idsy_array_constrc                 C   rJ  rD   rK  rM  rD   rD   rH   rI     rO  c                 C   s:   | dgg}|dgdgg}t ||}t|ddgg d S Nr   rS   r?   r   rq   )r   r+   )rH  rQ  ra   rd   r  rD   rD   rH   %test_euclidean_distances_known_result  s   
rS  c                 C   rJ  rD   rK  rM  rD   rD   rH   rI     rO  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 d    d S 1 sw   Y  d S )Nr   r  r  Fr9      r  r?   rS   r   r   X_norm_squaredY_norm_squaredrX  rZ  )rV   rW   rX   rY   rZ   rr   r   r  r   r+   
zeros_likers   rt   ru   )r_   rQ  r`   ra   rd   	X_norm_sq	Y_norm_sqD1D2D3D4wrong_DrD   rD   rH   #test_euclidean_distances_with_norms  s,     



"rd  	symmetricTc                 C   s   t j| }|d}|r|n|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	|
| d S )
NrT  rU  r?   rS   r   r   rW  rY  r[  )
rV   rW   rX   rY   rZ   float32r   r  r   r+   )global_random_seedre  r`   ra   rd   r]  r^  r_  r`  ra  rb  rD   rD   rH   &test_euclidean_distances_float32_norms(  s   
  


rh  c                  C   s2  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 d    n1 sow   Y  tj	t
dd
 t|||d d d W d    d S 1 sw   Y  d S )Nr   rT  rU  r?   rS   r   r[  r   zIncompatible dimensions for Xr   r7   rW  zIncompatible dimensions for YrY  )rV   rW   rX   rY   r   r   r  r+   rs   rt   r   )r`   ra   rd   rX  rZ  r_  r`  ra  rD   rD   rH   $test_euclidean_distances_norm_shapes9  s8   







"ri  c                 C   rJ  rD   rK  rM  rD   rD   rH   rI   ^  rO  c                 C   rJ  rD   rK  rM  rD   rD   rH   rI   c  rO  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sFJ d S )	Nr   r   r  Fr9   皙?rT  ư>r   )	rV   rW   rX   rY   rZ   r   r   r+   r[   )r_   rH  rQ  r`   ra   rd   expectedr   rD   rD   rH   test_euclidean_distances[  s   

rn  c                 C   rJ  rD   rK  rM  rD   rD   rH   rI   }  rO  c                 C   sh   t jd}|dj| dd}d||dk < tt|}||}t|}t||dd |j	| ks2J d S )Nr   rj  Fr9   rk  rl  r   )
rV   rW   rX   rY   rZ   r
   r	   r   r+   r[   )r_   rH  r`   ra   rm  r   rD   rD   rH   test_euclidean_distances_symz  s   ro  
batch_size)Nr7   r+  e   c                 C   rJ  rD   rK  rM  rD   rD   rH   rI     rO  c                 C   rJ  rD   rK  rM  rD   rD   rH   rI     rO  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   rj  rk  rT  rd   rp  rl  r   )rV   rW   rX   rY   rZ   rf  r   r   sqrtmaximumr+   )rp  rH  rQ  r`   ra   rd   rm  r   rD   rD   rH   test_euclidean_distances_upcast  s   
ru  c                 C   rJ  rD   rK  rM  rD   rD   rH   rI     rO  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   rj  rk  rr  rl  r   )rV   rW   rX   rY   rZ   rf  r
   r	   r   rs  rt  r+   )rp  rH  r`   ra   rm  r   rD   rD   rH   #test_euclidean_distances_upcast_sym  s   rv  zdtype, eps, rtolg-C6?h㈵>g:0yE>gGz?z failing due to lack of precision)reason)marks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   rw  r   )rV   r   r   r   r+   )r[   epsr   rz  ra   rd   r   rm  rD   rD   rH   '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  r   r8   )rd   r   )rV   rW   rX   r   r   r   r+   )r   r`   ra   rd   normal_distancenan_distancerD   rD   rH   8test_nan_euclidean_distances_equal_to_euclidean_distance  s   r  ra   rd   c                 C   sP   t t}t| |d W d    n1 sw   Y  d}|t|jks&J d S )Nr   zBInput contains infinity or a value too large for dtype('float64').)rs   rt   r   r   strvalue)ra   rd   excinfoexp_msgrD   rD   rH   ,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?   )rV   r   r   r+   r:   )ra   X_diagmissing_valueexp_distr   dist_sqdist_twodist_two_copyrD   rD   rH    test_nan_euclidean_distances_2x2  s   

r  r  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   rS   r  )rV   r   r\   r   r+   r:   )r  ra   r  r   rD   rD   rH   )test_nan_euclidean_distances_complete_nan  s   
r  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      @rq   g      @g      @g      @r  rS   Tr  g      D@r?   Fg      9@r9   )rV   r   r   r,   Tr+   rs  r:   )
r  ra   rd   r_  r`  ra  rb  D5D6D7rD   rD   rH   'test_nan_euclidean_distances_not_trival"  sF   	

r  c                 C   sZ   t dd| dgd| d| gg}t|| dd}t |dksJ t|| dd}t|d	 d S )
NgzG^g     @@gB@g|ï@T)r  r   r   Fr  )rV   r   r   r  r+   )r  ra   dist_squaredr   rD   rD   rH   7test_nan_euclidean_distances_one_feature_match_positiveW  s   

r  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/J t |dks8J t|t 	| ddg t || g}t|}t |dksYJ t |dksbJ t|ddgddgg t | dd}t|}t|t 	| dg|j
d	   t |dksJ t |dksJ d S )
Nr}  i  r  r>  r  rq   r9  i  r   )rV   rW   rX   r   randr	  r   r+   r  diag_indices_fromr^   )r`   r   XAr  XBr`  ra   rD   rD   rH   test_cosine_distancesl  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 d    d S 1 sIw   Y  d S )Nc                 S   sx   |d | d  }|d | d  }t |d d t | d t |d  t |d d   }dt t | }|S )Nr   rS   r?   )rV   sincosarcsinrs  )r   r   diff_latdiff_lonacrD   rD   rH   slow_haversine_distances  s   ,z:test_haversine_distances.<locals>.slow_haversine_distancesr   rQ   )r  r?   c                    s    g | ]  fd dD qS )c                    s   g | ]} |qS rD   rD   )rF   r   )r  r   rD   rH   rI     r   z7test_haversine_distances.<locals>.<listcomp>.<listcomp>rD   )rF   rd   r  )r   rH   rI     s     z,test_haversine_distances.<locals>.<listcomp>)r  r   z-Haversine distance only valid in 2 dimensionsr   )
rV   rW   rX   rY   r   r   r+   rs   rt   r   )r`   ra   r_  r`  err_msgrD   r  rH   test_haversine_distances  s   	





"r  c                  C   4   dgdgg} dgdgg}t | |}t|ddg d S rR  )r    r+   ra   rd   r  rD   rD   rH   test_paired_euclidean_distances     
r  c                  C   r  rR  )r!   r+   r  rD   rD   rH   test_paired_manhattan_distances  r  r  c                  C   s4   dgdgg} dgdgg}t | |}t|ddg d S )Nr   rS   r?   rR   )r   r+   r  rD   rD   rH   test_paired_cosine_distances  r  r  c                  C   s  t jd} | d}| d}t||}d}t|||d}|jtks%J t|D ]4\}}t|D ]+\}}	t 	||	 d ||	   }
t 
||
 }t|||f |
 t|||f | q1q)t|}tt |d t |dkssJ t |t t | dk sJ | dt j}| dt j}t||}|jt jksJ | dt j}t||}t | sJ |jtksJ dd	gd
dgg}ddgddgg}t||}|d |d ksJ |d |d ksJ tt tddgg W d    n	1 sw   Y  tt tddggddgg W d    n	1 s#w   Y  tt tddggddgg W d    n	1 sDw   Y  tt tddggg dg W d    d S 1 sfw   Y  d S )Nr   r6   r  r   r   r?   rS   g333333?gffffff?r   g?r@   )r   rS   )rS   rS   )rS   r   r   )皙?r  g333333?)rV   rW   rX   rY   r   r   r[   float	enumerater   expr,   r-   r   r  rZ   rf  int32isfiniters   rt   r   )r`   ra   rd   K_addr   r   ir   jr   r   chi2_exprD   rD   rH   test_chi_square_kernel  sV   


"


$r  kernelc                 C   s2   t jd}|d}| ||}t||jd d S )Nr   r6      )rV   rW   rX   rY   r+   r  )r  r`   ra   r   rD   rD   rH   test_kernel_symmetry  s   

r  c                 C   s@   t jd}|d}||}| ||}| ||}t|| d S Nr   r6   )rV   rW   rX   rY   r+   )r  ro   r`   ra   rw   r   r   rD   rD   rH   test_kernel_sparse  s   


r  c                  C   sD   t jd} | d}t||}t|jd d d dd |D  d S )Nr   r6      c                 S   s   g | ]	}t |d  qS )r?   )r   norm)rF   r   rD   rD   rH   rI      r)  z&test_linear_kernel.<locals>.<listcomp>)rV   rW   rX   rY   r   r+   flatr`   ra   r   rD   rD   rH   test_linear_kernel  s   

$r  c                  C   s@   t jd} | d}t||}t|jd d d t d d S )Nr   r6   r  r7   )rV   rW   rX   rY   r(   r+   r  onesr  rD   rD   rH   test_rbf_kernel#  s   

 r  c                  C   sn   t jd} | d}t||}tt |t d t |dks$J t |t t | dk s5J d S )Nr   r6   r7   rS   )	rV   rW   rX   rY   r   r+   r   r  r  r  rD   rD   rH   test_laplacian_kernel+  s   

&r  zmetric, pairwise_funcr   r   c                 C   s   t jd}|d}|d}||}||}|||dd}t|s%J |||dd}	t|	r2J t| |	 t||| d}
t| |
 d S )Nr   r6   r   F)dense_outputTr   )rV   rW   rX   rY   r   r+   toarrayr&   )r=   pairwise_funcro   r`   ra   rd   XcsrYcsrr   r   K3rD   rD   rH   &test_pairwise_similarity_sparse_output7  s   

r  c           
      C   s   t jd}|d}|d}| |}| |}|d f||f|d f||ffD ]#\}}t||dd}t|}|d ur=t|}t||dd}	t||	 q&d S )Nr   r6   r   r   r   r   )rV   rW   rX   rY   r&   r*   r+   )
ro   r`   ra   rd   r  r  X_Y_r   r   rD   rD   rH   test_cosine_similarityQ  s   

$r  c                  C   s:   t t dd} t| d \}}||u sJ t| | d S N(   r7   r,  )rV   resizer  r   r-   )r  
XA_checked
XB_checkedrD   rD   rH   test_check_dense_matricesf  s   r  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      r8   r,  )rV   r  r  r   r-   r   r  r  r  r  rD   rD   rH   test_check_XB_returnedo  s   


r  c                  C   s   t t dd} t t dd}tt t| | W d    n1 s'w   Y  t t dd}tt t| | W d    d S 1 sKw   Y  d S )N-   )r7   r*  r  r  $   )r8   r*  )rV   r  r  rs   rt   r   r   r   r  r  rD   rD   rH   test_check_different_dimensions  s   "r  c                  C   s   t ddd} t ddd}tt t| | W d    n1 s'w   Y  t ddd} t ddd}tt t| | W d    d S 1 sTw   Y  d S )Nr  r*  r7   r  r8   r,  )rV   r  r  rs   rt   r   r   r  rD   rD   rH   test_check_invalid_dimensions  s   "r  c           	      C   s   t jd}|d}| |}|d}| |}t||\}}t|s%J t||  dks1J t|s7J t||  dksCJ t||\}}t|sPJ t||  dks\J t|sbJ t||  dksnJ d S r  )rV   rW   rX   rY   r   r   r   r   )	ro   r`   r  	XA_sparser  	XB_sparser  r  XA_2_checkedrD   rD   rH   test_check_sparse_arrays  s   

r  c                 C   s6   | j }t|dkrtdd | D S tdd | D S )NrS   c                 s   s    | ]}t |V  qd S r   )tuplifyrN   rD   rD   rH   r    r  ztuplify.<locals>.<genexpr>c                 s   s    | ]}|V  qd S r   rD   )rF   rrD   rD   rH   r    s    )r^   r   rM   )ra   r(  rD   rD   rH   r    s   r  c                  C   sV   t jd} | d}t|}| d}t|}t||\}}t|| t|| d S r  )rV   rW   rX   rY   r  r   r-   )r`   r  	XA_tuplesr  	XB_tuplesr  r  rD   rD   rH   test_check_tuple_input  s   


r  c                  C   s   t t ddt j} t t ddt j}t| d \}}|jt jks)J t| |\}}|jt jks8J |jt jks@J t| t|\}}|jtksQJ |jtksXJ t| |t\}}|jtksiJ |jtkspJ d S r  )rV   r  r  rZ   rf  r   r[   r  r  rD   rD   rH   test_check_preserve_type  s   r  r   
seuclideanmahalanobisdist_functionc              	   C   sx   t dd- tjd}|d}tt||d}tt|||| d}t	|| W d    d S 1 s5w   Y  d S )Nr   )r  r   rj  r<   r   )
r   rV   rW   rX   rY   r
   r	   r	  rM   r+   )r   r=   r  r`   ra   expected_distr   rD   rD   rH   +test_pairwise_distances_data_derived_params  s   
"r  c                 C   sj   t jd}|d}|d}tjtd|  dd t||| d W d    d S 1 s.w   Y  d S )Nr   rj  z+The '(V|VI)' parameter is required for the z metricr   r<   )rV   rW   rX   rY   rs   rt   r   r"   )r=   r`   ra   rd   rD   rD   rH   1test_pairwise_distances_data_derived_params_error  s   


"r  )
braycurtiscanberra	chebyshevcorrelationhammingr  r   r  r   r   r   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}n=|dj|dd}t||| d}| dkrFd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   r6   Fr9   r<   r  VrS   )r   ddofr[   r  VIr=   )rV   rW   rX   rY   rZ   r
   r	   r   varr	  rr   r   invcovr  r"   r+   )	r=   r_   r  r`   ra   r   rd   r  r   rD   rD   rH   )test_numeric_pairwise_distances_datatypes   s   $$r  pairwise_distances_funcc                 C   sB   ddgdt jgddgddgg}| ||dd}t | rJ dS )	z8Check that `nan_euclidean` is lenient with `nan` values.r   rS   r?   r   r7   rA   r<   N)rV   r\   isnanany)r  ra   outputrD   rD   rH   test_nan_euclidean_support1  s   r  c                  C   sb   t jt jgt jt jgt jt jgg} t| | dd}ddgddgddgg}t||dd}t|| dS )zyCheck that the behavior of constant input is the same in the case of
    full of nan vector and full of zero vector.
    rA   r<   r   N)rV   r\   r#   r+   )X_nan
argmin_nanX_constargmin_constrD   rD   rH   (test_nan_euclidean_constant_input_argmin>  s
   "r  zX,Y,expected_distance)r  ababc)r  r   rq   )r   r  r   )rq   r   r  r  r  r  r   rq   c                 C   s$   dd }t | ||d}t|| dS )z8Check pairwise_distances with lists of strings as input.c                 S   s   t t| t| S r   )rV   r   r   r   rD   rD   rH   dummy_string_similarity^  s   zLtest_pairwise_dist_custom_metric_for_string.<locals>.dummy_string_similarity)ra   rd   r=   N)r"   r+   )ra   rd   expected_distancer
  actual_distancerD   rD   rH   +test_pairwise_dist_custom_metric_for_stringL  s   r  c                  C   s^   dd } t jg dg dg dgtd}t g dg dg d	g}t|| d
}t|| dS )zjCheck that pairwise_distances does not convert boolean input to float
    when using a custom metric.
    c                 S   s   d| |@   | |B     S )NrS   )r   )v1v2rD   rD   rH   dummy_bool_distj  s   zBtest_pairwise_dist_custom_metric_for_bool.<locals>.dummy_bool_dist)rS   r   r   r   )rS   r   rS   r   )rS   rS   rS   rS   r   )r  rR         ?)rR   r  rR   )r  rR   r  )ra   r=   N)rV   r   r   r"   r+   )r  ra   r  r  rD   rD   rH   )test_pairwise_dist_custom_metric_for_boole  s    r  c                 C   sD   | t dg}| t dg}tddddd t||D  d S )Nr   r?   r   )r   
max_nbytesc                 s   s"    | ]\}}t t||V  qd S r   )r5   r   )rF   m1m2rD   rD   rH   r    s    
z9test_sparse_manhattan_readonly_dataset.<locals>.<genexpr>)rV   r  r4   zip)ro   	matrices1	matrices2rD   rD   rH   &test_sparse_manhattan_readonly_dataset|  s
   r  c                  C   s   t jjdd} t jjdd}d}tjt|d t| |dd W d    n1 s)w   Y  tjt|d t| |dd W d    d S 1 sHw   Y  d S )NrT  )r<  z5'force_all_finite' was renamed to 'ensure_all_finite'r   T)force_all_finite)rV   rW   uniformrs   r   FutureWarningr   r"   )ra   rd   r   rD   rD   rH   $test_force_all_finite_rename_warning  s   "r  )r;   )r   typesr   numpyrV   rs   r   scipy.sparser   scipy.spatial.distancer   r   r   r   r	   r
   sklearnr   sklearn.exceptionsr   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'   r(   r)   sklearn.preprocessingr*   sklearn.utils._testingr+   r,   r-   r.   sklearn.utils.fixesr/   r0   r1   r2   r3   sklearn.utils.parallelr4   r5   rk   markparametrizerz   DeprecationWarningr   r   r   r   r  rZ   _minkowski_kwdsr   rr   rf  r   r   r   r   r   r   itemsr   r   r   r  r  r  r   r   rv   r-  r6  rA  rB  filterwarningsrG  r   rS  rd  rh  ri  rn  ro  ru  rv  paramxfailr|  r  infr  rs  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  rD   rD   rD   rH   <module>   sN    	|OC	
y	






$



 
"








.0"$"&&    


4
6
	
	


	


