a
    h                     @   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rV| ks\n J |dj| dd}t||dd}t||}t|| |j|j  kr| ksn 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s0n J td
d |D }
tdd |D }t|
|dd}t|| |j|j  kr| ksn 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sJ |jd |jd ksJ t|| t||dd}t||td}|jd |jd ks2J |jd |jd ksLJ 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   s   g | ]}t d d |D qS )c                 S   s   g | ]}|qS  rB   .0vrB   rB   _/var/www/html/assistant/venv/lib/python3.9/site-packages/sklearn/metrics/tests/test_pairwise.py
<listcomp>`       Etest_pairwise_distances_for_dense_data.<locals>.<listcomp>.<listcomp>tuplerD   rowrB   rB   rF   rG   `   rH   z:test_pairwise_distances_for_dense_data.<locals>.<listcomp>c                 S   s   g | ]}t d d |D qS )c                 S   s   g | ]}|qS rB   rB   rC   rB   rB   rF   rG   a   rH   rI   rJ   rL   rB   rB   rF   rG   a   rH   r7   r?         ?r?      Z	haversine)r?   r?   r   	manhattanr   )nprandomRandomStaterandom_sampleastyper"   r   r+   dtypenanr   rK   pir   r   shaper   )global_dtyperngXSS2YZX_maskedZY_maskedZS_maskedZ	S2_maskedX_tuplesY_tuplesrB   rB   rF   &test_pairwise_distances_for_dense_dataC   sf    






"
".*
.*



rc   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sn J t||	dd}
t	||	}t|
| |
j|j  kr|ksn J t|||d	d}
t
||| |}t|
| |t jkr"|
j|j  kr|kspn J nNtt2 |
j|j  krJ|ksPn J W d    n1 sf0    Y  t
||}t|
| |t jkr|
j|j  kr|ksn J nNtt2 |
j|j  kr|ksn J W d    n1 s0    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 s0    Y  tt t||	dd W d    n1 s0    Y  d S )Nr   r6   Fr9   r>   r;   r<   r   rQ   p       @r=   r   )rR   rS   rT   rU   rV   r"   r   r+   rW   r   r   float64pytestraisesAssertionErrorr   	TypeError)rd   re   rf   rg   r[   r\   r]   r`   X_sparseY_sparser^   r_   kwdsrB   rB   rF   'test_pairwise_distances_for_sparse_data   sL    




$B

$B

,rr   categoryr=   c              	   C   sr  t jd}|dd}| }d|d  |d< ttdV |d fD ]<}t||| d}t j|ddddd	 t 	|dkdksDJ qDW d    n1 s0    Y  d
|  }t
jt|d t|| d W d    n1 s0    Y  t
jt|d$ t|t|| d W d    n1 s0    Y  t . tdt t|t| d W d    n1 sd0    Y  d S )Nr   r7   r8   rP   r@   rs   r<   F)rX   ZposinfZneginfr:   z+Data was converted to boolean for metric %smatchr`   r=   error)rR   rS   rT   randnr:   r.   r   r"   Z
nan_to_numsumrk   warnsrV   boolwarningscatch_warningssimplefilter)r=   r\   r]   r`   ZresmsgrB   rB   rF   test_pairwise_boolean_distance   s"    6*4
r   c                  C   s\   t jd} | dd}t ( tdt t|dd W d    n1 sN0    Y  d S )Nr   r7   r8   rx   r   r<   )	rR   rS   rT   ry   r}   r~   r   r   r"   )r\   r]   rB   rB   rF   test_no_data_conversion_warning   s
    
r   funcc                 C   sp  t jtdd" | tddd W d    n1 s60    Y  t jtdd* | tdtddd W d    n1 s~0    Y  t jtdd* | tdtddd W d    n1 s0    Y  td}| |dd}||u sJ td}| |td	dd}||u sJ | tjd
ggdddd}d|jjksJJ | dggdd}t|tj	slJ d S )Nz.* shape .*ru   )r7      precomputedr<   )r8   r8   )r8   r   r7   r7   )r   r   rP   intrW   f      ?)
rk   rl   
ValueErrorrR   ZzerosarrayrW   kind
isinstancendarray)r   r^   r_   rB   rB   rF   test_pairwise_precomputed  s     088

r   c                   C   sF   t jtdd$ ttdddd W d    n1 s80    Y  d S )Nz.* non-negative values.*ru   r   r   r<   )rk   rl   r   r"   rR   fullrB   rB   rB   rF   &test_pairwise_precomputed_non_negative   s    r   rP   r7   doubleFr9   )wrh   c                 K   s&   t t| t|fi |}| S N)r(   rR   Z
atleast_2ditem)xyrq   KrB   rB   rF   callable_rbf_kernel)  s    r   zfunc, metric, kwdsr;   r   
polynomialZdegreegamma皙?rW   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   rP   r=   n_jobsr?   )rR   rS   rT   r   rU   r+   )	r   r=   rq   rW   r\   r]   r`   r^   r_   rB   rB   rF   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   s   dS )Nr7   rB   r   r   rB   rB   rF   <lambda>U  rH   z9test_pairwise_callable_nonstrict_metric.<locals>.<lambda>r<   r@   r7   )r"   rB   rB   rB   rF   'test_pairwise_callable_nonstrict_metricQ  s    r   )rbfZ	laplacianZ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 rd S t|
|| d}t|| d S )Nr   r6   r>   r<   rw   r`   c                 S   s   g | ]}t d d |D qS )c                 S   s   g | ]}|qS rB   rB   rC   rB   rB   rF   rG   n  rH   4test_pairwise_kernels.<locals>.<listcomp>.<listcomp>rJ   rL   rB   rB   rF   rG   n  rH   z)test_pairwise_kernels.<locals>.<listcomp>c                 S   s   g | ]}t d d |D qS )c                 S   s   g | ]}|qS rB   rB   rC   rB   rB   rF   rG   o  rH   r   rJ   rL   rB   rB   rF   rG   o  rH   )r   r   )rR   rS   rT   rU   r   r&   r+   rK   )r=   rg   r\   r]   r`   functionK1K2ra   rb   ro   rp   rB   rB   rF   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   rw   r`   )rR   rS   rT   rU   r   r&   r(   r+   )r\   r]   r`   r=   rq   r   r   rB   rB   rF   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    n1 s0    Y  d S )Nr   r6   r>   r   r   z:))r   Zblablar   T)r=   Zfilter_paramsr=   )
rR   rS   rT   rU   r(   r&   r+   rk   rl   rn   )r\   r]   r`   r   paramsr   rB   rB   rF   "test_pairwise_kernels_filter_param  s    



r   zmetric, funcc           
      C   s   t jd}|d}|d}t||| d}|||}t|| |||||}t|| | tv rt|  ||}	t |	}	t|	| d S )Nr   r6   r<   )rR   rS   rT   rU   r   r+   r   diag)
r=   r   rg   r\   r]   r`   r^   r_   ZS3	distancesrB   rB   rF   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    n1 s0    Y  d S )
Nr   r6   Fr9   rQ   r<   c                 S   s   t | | jddS )Nr   axis)rR   absrz   r   rB   rB   rF   r     rH   z0test_paired_distances_callable.<locals>.<lambda>r   )
rR   rS   rT   rU   rV   r   r+   rk   rl   r   )r[   r\   r]   r`   r^   r_   rB   rB   rF   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sJ t|t jksJ 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   rP   r   r   r?   r8   r;   r<   sqeuclideansquaredT)r=   Zmetric_kwargsrQ   rh   r   a      o   r   )r   r=   Hz>rtol)rR   Zasarrayr$   r#   r+   typer   r   rS   rT   ry   r"   Zargminrangelenr-   Zasfortranarray)r   rg   r[   r]   r`   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_contiguousrB   rB   rF   "test_pairwise_distances_argmin_min  s    
































r   c                 C   s   | d d d df S )Nd   rB   r   startrB   rB   rF   _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	sVJ t
|}t|dksnJ |d j|jksJ tt ||d	d
 d S )Nr   )i  r8   Fr9   r         >Zreduce_funcworking_memoryrP   r   Zatol)rR   rS   rT   rU   rV   r"   r%   r   r   r   listr   rW   r+   vstack)r[   r\   r]   r^   S_chunksrB   rB   rF   &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sBJ t|}t	|d	ksZJ t
d
d |D spJ d S )Nr   
   r8   Fr9   c                 S   s   d S r   rB   r   rB   rB   rF   r   ]  rH   z=test_pairwise_distances_chunked_reduce_none.<locals>.<lambda>r   r   rP   c                 s   s   | ]}|d u V  qd S r   rB   )rD   chunkrB   rB   rF   	<genexpr>b  rH   z>test_pairwise_distances_chunked_reduce_none.<locals>.<genexpr>)rR   rS   rT   rU   rV   r%   r   r   r   r   all)r[   r\   r]   r   rB   rB   rF   +test_pairwise_distances_chunked_reduce_noneX  s    r   good_reducec                 C   s   t | S r   r   Dr   rB   rB   rF   r   h  rH   r   c                 C   s
   t | S r   )rR   r   r   rB   rB   rF   r   i  rH   c                 C   s   t | t | fS r   r   r   rB   rB   rF   r   j  rH   c                 C   s   g | ]}|fd dqS )c                 S   s   || S r   rB   )r   r   scipy_csr_typerB   rB   rF   r   m  rH   <listcomp>.<lambda>rB   )rD   r   rB   rB   rF   rG   l  s   rG   c                 C   s   g | ]}|fd dqS )c                 S   s   || t | t| fS r   )rR   r   r   )r   r   scipy_dok_typerB   rB   rF   r   q  s    r   rB   )rD   r   rB   rB   rF   rG   p  s   c                 C   s.   t ddd}t|d | dd}t| d S )Nr   r   rP   @   r   )rR   arangereshaper%   next)r   r]   r   rB   rB   rF   ,test_pairwise_distances_chunked_reduce_valide  s
    r   )
bad_reduceerr_typemessagec                 C   s   t | | dd  gS Nr   rR   Zconcatenater   srB   rB   rF   r     rH   zlength 11\..* input: 10\.c                 C   s   | t | | dd  gfS r   r   r   rB   rB   rF   r     rH   z!length \(10, 11\)\..* input: 10\.c                 C   s   | d d | fS )N	   rB   r   rB   rB   rF   r     rH   z length \(9, 10\)\..* input: 10\.c                 C   s   dS )N   rB   r   rB   rB   rF   r     rH   z2returned 7\. Expected sequence\(s\) of length 10\.c                 C   s   dS )N)r      rB   r   rB   rB   rF   r     rH   z9returned \(7, 8\)\. Expected sequence\(s\) of length 10\.c                 C   s   t ddfS )Nr   r   )rR   r   r   rB   rB   rF   r     rH   z-, 9\)\. Expected sequence\(s\) of length 10\.c                 C   sf   t dddj| dd}t|d |dd}tj||d t| W d    n1 sX0    Y  d S )	Nr   r   rP   Fr9   r   r   ru   )rR   r   r   rV   r%   rk   rl   r   )r[   r   r   r   r]   r   rB   rB   rF   .test_pairwise_distances_chunked_reduce_invalid  s    "r   c           
      C   s   t | |||d}t|tsJ t|}|d u r2| n|}t|d d }|D ] }|j}|t||d ksJJ qJt|}t	| ||d}	t
||	dd d S )Nr   r=   r   g      >i   r<   r   r   )r%   r   r   r   r   nbytesmaxrR   r   r"   r+   )
r]   r`   r   r=   genZblockwise_distancesZmin_block_mibblockZmemory_usedr^   rB   rB   rF    check_pairwise_distances_chunked  s    
r   )r;   l2r   c                 C   sd   t jd}|jdddj|dd}tt|d| d}t|dksFJ tt 	t 
|dd	d
 d S )Nr     r       _BsizescaleFr9   rP   r   绽|=r   )rR   rS   rT   normalrV   r   r%   r   r+   r   r   )r=   r[   r\   r]   chunksrB   rB   rF   (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  Fr9   r?   r   r  r   )rR   rS   rT   r  rV   r"   r+   r   )r=   r[   r\   r]   r   rB   rB   rF   )test_parallel_pairwise_distances_diagonal  s    r  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sJ t||u sJ tt t| W d    n1 s"0    Y  d S )Nr   )   r8   Fr9   rP   r;   r   ir?   )r   r8   i'  r   r   r   )rR   rS   rT   rU   rV   r   r   tolistr"   r%   r   r   r   rk   rl   StopIteration)r[   r\   r]   powerr`   r   r   rB   rB   rF   test_pairwise_distances_chunked  s.    r  x_array_constrZdensec                 C   s   g | ]
}|j qS rB   __name__rD   	containerrB   rB   rF   rG     rH   )Zidsy_array_constrc                 C   s   g | ]
}|j qS rB   r  r  rB   rB   rF   rG     rH   c                 C   s:   | dgg}|dgdgg}t ||}t|ddgg d S Nr   rP   r?   r   ri   )r   r+   )r  r  r]   r`   r   rB   rB   rF   %test_euclidean_distances_known_result  s    
r  c                 C   s   g | ]
}|j qS rB   r  r  rB   rB   rF   rG     rH   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    n1 s0    Y  d S )Nr   r   r   Fr9      r   r?   rP   r   r   X_norm_squaredY_norm_squaredr  r  )rR   rS   rT   rU   rV   rj   rz   r   r   r+   Z
zeros_likerk   rl   rm   )r[   r  r\   r]   r`   	X_norm_sq	Y_norm_sqD1D2D3D4Zwrong_DrB   rB   rF   #test_euclidean_distances_with_norms  s*      



r$  	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 )
Nr  r  r?   rP   r   r   r  r  r  )
rR   rS   rT   rU   rV   float32rz   r   r   r+   )Zglobal_random_seedr%  r\   r]   r`   r  r  r   r!  r"  r#  rB   rB   rF   &test_euclidean_distances_float32_norms(  s    
  


r'  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 s0    Y  tj	t
dd
& t|||d d d W d    n1 s$0    Y  d S )Nr   r  r  r?   rP   r   r  r   zIncompatible dimensions for Xru   r7   r  zIncompatible dimensions for Yr  )rR   rS   rT   rU   rz   r   r   r+   rk   rl   r   )r\   r]   r`   r  r  r   r!  r"  rB   rB   rF   $test_euclidean_distances_norm_shapes9  s4    







4r(  c                 C   s   g | ]
}|j qS rB   r  r  rB   rB   rF   rG   ^  rH   c                 C   s   g | ]
}|j qS rB   r  r  rB   rB   rF   rG   c  rH   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sJ d S )	Nr   r   r   Fr9   皙?r  ư>r   )	rR   rS   rT   rU   rV   r   r   r+   rW   )r[   r  r  r\   r]   r`   expectedr   rB   rB   rF   test_euclidean_distances[  s    

r-  c                 C   s   g | ]
}|j qS rB   r  r  rB   rB   rF   rG   }  rH   c                 C   sh   t jd}|dj| dd}d||dk < tt|}||}t|}t||dd |j	| ksdJ d S )Nr   r)  Fr9   r*  r+  r   )
rR   rS   rT   rU   rV   r
   r	   r   r+   rW   )r[   r  r\   r]   r,  r   rB   rB   rF   test_euclidean_distances_symz  s    r.  
batch_size)Nr7   r   e   c                 C   s   g | ]
}|j qS rB   r  r  rB   rB   rF   rG     rH   c                 C   s   g | ]
}|j qS rB   r  r  rB   rB   rF   rG     rH   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  r`   r/  r+  r   )rR   rS   rT   rU   rV   r&  r   r   sqrtmaximumr+   )r/  r  r  r\   r]   r`   r,  r   rB   rB   rF   test_euclidean_distances_upcast  s    
r4  c                 C   s   g | ]
}|j qS rB   r  r  rB   rB   rF   rG     rH   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*  r1  r+  r   )rR   rS   rT   rU   rV   r&  r
   r	   r   r2  r3  r+   )r/  r  r\   r]   r,  r   rB   rB   rF   #test_euclidean_distances_upcast_sym  s    r5  zdtype, eps, rtolg-C6?h㈵>g:0yE>gGz?z failing due to lack of precision)reason)Z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   r6  r   )rR   r   r   r   r+   )rW   epsr   r8  r]   r`   r   r,  rB   rB   rF   '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   )r`   r   )rR   rS   rT   ry   r   r   r+   )r   r\   r]   r`   Znormal_distanceZnan_distancerB   rB   rF   8test_nan_euclidean_distances_equal_to_euclidean_distance  s    r<  r]   r`   c                 C   sP   t t}t| |d W d    n1 s,0    Y  d}|t|jksLJ d S )Nr   zBInput contains infinity or a value too large for dtype('float64').)rk   rl   r   r   strvalue)r]   r`   excinfoZexp_msgrB   rB   rF   ,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   rC  r?   )rR   r   r   r+   r:   )r]   ZX_diagmissing_valueexp_distr   Zdist_sqZdist_twoZdist_two_copyrB   rB   rF    test_nan_euclidean_distances_2x2  s    

rG  rE  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   rP   rB  )rR   r   rX   r   r+   r:   )rE  r]   rF  r   rB   rB   rF   )test_nan_euclidean_distances_complete_nan  s    
rH  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      @ri   g      @g      @g      @rB  rP   TrD  g      D@r?   Fg      9@r9   )rR   r   r   r,   Tr+   r2  r:   )
rE  r]   r`   r   r!  r"  r#  ZD5ZD6ZD7rB   rB   rF   'test_nan_euclidean_distances_not_trival"  sF    	

rJ  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)rC  r   r   FrA  )rR   r   r   r   r+   )rE  r]   Zdist_squaredr   rB   rB   rF   7test_nan_euclidean_distances_one_feature_match_positiveW  s    

rK  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spJ t|t 	| ddg t || g}t|}t |dksJ t |dksJ t|ddgddgg t | dd}t|}t|t 	| dg|j
d	   t |dks(J t |dks<J d S )
Nr;  i  rA  r  r   ri   r   i  r   )rR   rS   rT   r   Zrandr   r   r+   r   Zdiag_indices_fromrZ   )r\   r   XAr   XBr!  r]   rB   rB   rF   test_cosine_distancesl  s$     rN  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    n1 s0    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   rP   r?   )rR   sincosZarcsinr2  )r   r   Zdiff_latZdiff_lonacrB   rB   rF   slow_haversine_distances  s    ,z:test_haversine_distances.<locals>.slow_haversine_distancesr   rN   )r   r?   c                    s    g | ]  fd dD qS )c                    s   g | ]} |qS rB   rB   )rD   r   )rS  r   rB   rF   rG     rH   z7test_haversine_distances.<locals>.<listcomp>.<listcomp>rB   )rD   r`   rS  )r   rF   rG     rH   z,test_haversine_distances.<locals>.<listcomp>)r   r   z-Haversine distance only valid in 2 dimensionsru   )
rR   rS   rT   rU   r   r   r+   rk   rl   r   )r\   r]   r   r!  err_msgrB   rT  rF   test_haversine_distances  s    	




rV  c                  C   s4   dgdgg} dgdgg}t | |}t|ddg d S r  )r    r+   r]   r`   r   rB   rB   rF   test_paired_euclidean_distances  s    
rX  c                  C   s4   dgdgg} dgdgg}t | |}t|ddg d S r  )r!   r+   rW  rB   rB   rF   test_paired_manhattan_distances  s    
rY  c                  C   s4   dgdgg} dgdgg}t | |}t|ddg d S )Nr   rP   r?   rO   )r   r+   rW  rB   rB   rF   test_paired_cosine_distances  s    
rZ  c                  C   s  t jd} | d}| d}t||}d}t|||d}|jtksJJ t|D ]h\}}t|D ]V\}}	t 	||	 d ||	   }
t 
||
 }t|||f |
 t|||f | qbqRt|}tt |d t |dksJ t |t t | dk s
J | dt j}| dt j}t||}|jt jksJJ | dt j}t||}t | szJ |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0    Y  tt& tddggddgg W d    n1 sR0    Y  tt& tddggddgg W d    n1 s0    Y  tt& tddggg dg W d    n1 s0    Y  d S )Nr   r6   r   r   r   r?   rP   g333333?gffffff?r   g?r@   )r   rP   )rP   rP   )rP   r   r   )皙?r[  g333333?)rR   rS   rT   rU   r   r   rW   float	enumeraterz   expr,   r-   r   r   rV   r&  Zint32isfiniterk   rl   r   )r\   r]   r`   ZK_addr   r   ir   jr   r   Zchi2_exprB   rB   rF   test_chi_square_kernel  sL    


$


.66rb  kernelc                 C   s2   t jd}|d}| ||}t||jd d S )Nr   r6      )rR   rS   rT   rU   r+   rI  )rc  r\   r]   r   rB   rB   rF   test_kernel_symmetry  s    

re  c                 C   s@   t jd}|d}||}| ||}| ||}t|| d S Nr   r6   )rR   rS   rT   rU   r+   )rc  rg   r\   r]   ro   r   r   rB   rB   rF   test_kernel_sparse  s    


rg  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   Znorm)rD   r   rB   rB   rF   rG      rH   z&test_linear_kernel.<locals>.<listcomp>)rR   rS   rT   rU   r   r+   flatr\   r]   r   rB   rB   rF   test_linear_kernel  s    

rk  c                  C   s@   t jd} | d}t||}t|jd d d t d d S )Nr   r6   rh  r7   )rR   rS   rT   rU   r(   r+   ri  onesrj  rB   rB   rF   test_rbf_kernel#  s    

rm  c                  C   sn   t jd} | d}t||}tt |t d t |dksHJ t |t t | dk sjJ d S )Nr   r6   r7   rP   )	rR   rS   rT   rU   r   r+   r   rl  r   rj  rB   rB   rF   test_laplacian_kernel+  s    

rn  zmetric, pairwise_funcr   r   c                 C   s   t jd}|d}|d}||}||}|||dd}t|sJJ |||dd}	t|	rdJ t| |	 t||| d}
t| |
 d S )Nr   r6   r   F)Zdense_outputTrw   )rR   rS   rT   rU   r   r+   Ztoarrayr&   )r=   Zpairwise_funcrg   r\   r]   r`   XcsrYcsrr   r   ZK3rB   rB   rF   &test_pairwise_similarity_sparse_output7  s    

rq  c           
      C   s   t jd}|d}|d}| |}| |}|d f||f|d f||ffD ]F\}}t||dd}t|}|d urzt|}t||dd}	t||	 qLd S )Nr   r6   r   r   rw   r   )rR   rS   rT   rU   r&   r*   r+   )
rg   r\   r]   r`   ro  rp  ZX_ZY_r   r   rB   rB   rF   test_cosine_similarityQ  s    

$rr  c                  C   s:   t t dd} t| d \}}||u s,J t| | d S N(   r7   r   )rR   resizer   r   r-   )rL  
XA_checked
XB_checkedrB   rB   rF   test_check_dense_matricesf  s    ry  c                  C   s~   t t dd} t t dd}t| |\}}t| | t|| t t dd}t| |\}}t| | t|| d S )Nrt  ru      r8   r   )rR   rv  r   r   r-   r   rL  rM  rw  rx  rB   rB   rF   test_check_XB_returnedo  s    


r}  c                  C   s   t t dd} t t dd}tt t| | W d    n1 sN0    Y  t t dd}tt t| | W d    n1 s0    Y  d S )N-   )r7   r   rz  r{  $   )r8   r   )rR   rv  r   rk   rl   r   r   r   rL  rM  rB   rB   rF   test_check_different_dimensions  s    (r  c                  C   s   t ddd} t ddd}tt t| | W d    n1 sN0    Y  t ddd} t ddd}tt t| | W d    n1 s0    Y  d S )Nr~  r   r7   rz  r8   r   )rR   r   r   rk   rl   r   r   r  rB   rB   rF   test_check_invalid_dimensions  s    (r  c           	      C   s   t jd}|d}| |}|d}| |}t||\}}t|sJJ t||  dksbJ t|snJ t||  dksJ t||\}}t|sJ t||  dksJ t|sJ t||  dksJ d S rf  )rR   rS   rT   rU   r   r   r   rz   )	rg   r\   rL  Z	XA_sparserM  Z	XB_sparserw  rx  ZXA_2_checkedrB   rB   rF   test_check_sparse_arrays  s    

r  c                 C   s:   | j }t|dkr$tdd | D S tdd | D S d S )NrP   c                 s   s   | ]}t |V  qd S r   )tuplifyrL   rB   rB   rF   r     rH   ztuplify.<locals>.<genexpr>c                 s   s   | ]
}|V  qd S r   rB   )rD   rrB   rB   rF   r     rH   )rZ   r   rK   )r]   r   rB   rB   rF   r    s    r  c                  C   sV   t jd} | d}t|}| d}t|}t||\}}t|| t|| d S rf  )rR   rS   rT   rU   r  r   r-   )r\   rL  Z	XA_tuplesrM  Z	XB_tuplesrw  rx  rB   rB   rF   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sRJ t| |\}}|jt jkspJ |jt jksJ t| t|\}}|jtksJ |jtksJ t| |t\}}|jtksJ |jtksJ d S rs  )rR   rv  r   rV   r&  r   rW   r\  r|  rB   rB   rF   test_check_preserve_type  s    r  r   
seuclideanmahalanobisdist_functionc              	   C   sv   t ddX tjd}|d}tt||d}tt|||| d}t	|| W d    n1 sh0    Y  d S )Nr   )r   r   r)  r<   r   )
r   rR   rS   rT   rU   r
   r	   r   rK   r+   )r   r=   r  r\   r]   expected_distr   rB   rB   rF   +test_pairwise_distances_data_derived_params  s    
r  c                 C   sh   t jd}|d}|d}tjtd|  dd t||| d W d    n1 sZ0    Y  d S )Nr   r)  z+The '(V|VI)' parameter is required for the z metricru   r<   )rR   rS   rT   rU   rk   rl   r   r"   )r=   r\   r]   r`   rB   rB   rF   1test_pairwise_distances_data_derived_params_error  s    


r  )Z
braycurtisZcanberraZ	chebyshevZcorrelationZ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}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   r6   Fr9   r<   r  VrP   )r   ZddofrW   r  ZVIr=   )rR   rS   rT   rU   rV   r
   r	   r   varr   rj   r   invZcovrI  r"   r+   )	r=   r[   r  r\   r]   r   r`   r  r   rB   rB   rF   )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   rP   r?   r   r7   rA   r<   N)rR   rX   isnanany)r  r]   outputrB   rB   rF   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)rR   rX   r#   r+   )ZX_nanZ
argmin_nanZX_constZargmin_constrB   rB   rF   (test_nan_euclidean_constant_input_argmin>  s
    "r  zX,Y,expected_distance)rQ  ababc)rA  r   ri   )r   rA  r   )ri   r   rA  rQ  r  rA  r   ri   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   )rR   r   r   r   rB   rB   rF   dummy_string_similarity^  s    zLtest_pairwise_dist_custom_metric_for_string.<locals>.dummy_string_similarity)r]   r`   r=   N)r"   r+   )r]   r`   expected_distancer  actual_distancerB   rB   rF   +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 )NrP   )rz   )Zv1Zv2rB   rB   rF   dummy_bool_distj  s    zBtest_pairwise_dist_custom_metric_for_bool.<locals>.dummy_bool_dist)rP   r   r   r   )rP   r   rP   r   )rP   rP   rP   rP   r   )rA  rO         ?)rO   rA  rO   )r  rO   rA  )r]   r=   N)rR   r   r|   r"   r+   )r  r]   r  r  rB   rB   rF   )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   Z
max_nbytesc                 s   s    | ]\}}t t||V  qd S r   )r5   r   )rD   m1m2rB   rB   rF   r     s   z9test_sparse_manhattan_readonly_dataset.<locals>.<genexpr>)rR   rl  r4   zip)rg   Z	matrices1Z	matrices2rB   rB   rF   &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 sR0    Y  tjt|d t| |dd W d    n1 s0    Y  d S )Nr  )r  z5'force_all_finite' was renamed to 'ensure_all_finite'ru   T)Zforce_all_finite)rR   rS   uniformrk   r{   FutureWarningr   r"   )r]   r`   r   rB   rB   rF   $test_force_all_finite_rename_warning  s    ,r  )r;   )r}   typesr   numpyrR   rk   r   Zscipy.sparser   Zscipy.spatial.distancer   r   r   r   r	   r
   Zsklearnr   Zsklearn.exceptionsr   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'   r(   r)   Zsklearn.preprocessingr*   Zsklearn.utils._testingr+   r,   r-   r.   Zsklearn.utils.fixesr/   r0   r1   r2   r3   Zsklearn.utils.parallelr4   r5   rc   markZparametrizerr   DeprecationWarningr   r   r   r   r   rV   Z_minkowski_kwdsr   rj   r&  r   r   r   r   r   r   itemsr   r   r   r   r   r   r   r   rn   r   r   r  r  filterwarningsr  r   r  r$  r'  r(  r-  r.  r4  r5  paramZxfailr:  r<  infr@  r2  rX   rG  rH  rJ  rK  rN  rV  rX  rY  rZ  rb  re  rg  rk  rm  rn  rq  rr  ry  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rB   rB   rB   rF   <module>   sL   	|OC	
y	






$



 
"








.0"$"&&    


4
6
	
	


	


