
    /ii                     2   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
l4m5Z5m6Z6m7Z7m8Z8m9Z9 d dl:m;Z;m<Z<m=Z=m>Z>m?Z? d dl@mAZAmBZBmCZCmDZDmEZE d dlFmGZGmHZH d ZIejJ        K                    d e9            e6          ejJ        K                    dg d          d                         ZLejJ        K                    deB          ejJ        K                    deC          ejJ        K                    deA          ejJ        K                    deD          d                                                 ZM e?eN          ejJ        K                    de          d                         ZOd ZPejJ        K                    de*e.g          d             ZQd ZR ejS        dd           T                    d!d"#          dd$ZUd% ZVejJ        K                    d&e*d'i fe*eeUfe*d(eUfe.d)d*dife.eVd+d,ifg          ejJ        K                    d-ejW        ejX        eYg          d.                         ZZejJ        K                    d e9            e6          ejJ        K                    d&e*d'i fe*d/i fe.d)d*dife.eVd+d,ife.d0d+d,ifg          d1                         Z[d2 Z\ejJ        K                    dg d3          ejJ        K                    deD          d4                         Z]ejJ        K                    d e9            e6          ejJ        K                    dg d5          d6                         Z^d7 Z_d8 Z`ejJ        K                    d9 eja                              ejJ        K                    deD          d:                         Zbd; ZcejJ        jd        ejJ        K                    d<eE          ejJ        K                    deD          d=                                     Zed> Zfd? Zgd@ ZhejJ        K                    dAdB dC dD gdE eDD             z   dF eED             z             dG             ZiejJ        K                    dHdI ejdJfdK ejdLfdM ejdNfdO ekdPfdQ ekdRfdS ekdTfg          dU             ZlddVZmejJ        K                    ddW          dX             ZnejJ        K                    ddW          dY             ZoejJ        p                    dZ          d[             ZqejJ        K                    d\ejr        geDz   d]gd^ eDD             z             ejJ        K                    d_ejr        geDz   d]gd` eDD             z             da                         ZsejJ        K                    d_ejr        geDz   d]gdb eDD             z             dc             ZtejJ        K                    ddded"g          df             Zudg ZvejJ        K                    d\ejr        geDz   d]gdh eDD             z             ejJ        K                    d_ejr        geDz   d]gdi eDD             z             dj                         ZwejJ        K                    d\ejr        geDz   d]gdk eDD             z             dl             ZxejJ        K                    dmg dn          ejJ        K                    d\ejr        geDz   d]gdo eDD             z             ejJ        K                    d_ejr        geDz   d]gdp eDD             z             dq                                     ZyejJ        K                    dmg dn          ejJ        K                    d\ejr        geDz   d]gdr eDD             z             ds                         ZzejJ        K                    dtejX        dudvf ej{        ejW        dwdxejJ        |                    dyz          {          g          ejJ        K                    d|dd}g          d~                         Z}ejJ        K                    dded"g          d             Z~ejJ        K                    d ejr        ej        d gg           ejr        d ej         gg          g          ejJ        K                    d ejr        ej        d gg           ejr        d ej         gg          dg          d                         ZejJ        K                    d ejr        d dgdd gg           ej        d          ej        f ejr        d dgdej        gg           ej        d          ej        f ejr        ej        dgdej        gg          ej        ej        f ejr        ej        dgej        d gg           ej        d          ej        f ejr        d ej        gdej        gg           ej        d          ej        f ejr        d dgdd gg           ej        d          df ejr        d dgddgg           ej        d          df ejr        ddgddgg          ej        df ejr        ddgdd gg           ej        d          df ejr        d dgddgg           ej        d          dfg
          d             ZejJ        K                    dej        dg          d             ZejJ        K                    dej        dg          d             ZejJ        K                    dej        dg          d             Zd Zd Zd Zd Zd Zd ZejJ        K                    de#e/e0e"e1ef          d             ZejJ        K                    de#e/e0e"e1ef          ejJ        K                    deD          d                         Zd Zd Zd ZejJ        K                    dde#fdefg          ejJ        K                    deD          d                         ZejJ        K                    deD          d             Zd Zd Zd Zd ZejJ        K                    deD          d             Zd Zd Zd ZejJ        K                    dddg          ejJ        K                    dddg          ejJ        K                    de*e-g          d                                     ZejJ        K                    dddg          d             ZejJ        K                    dg d          ejJ        K                    dded"gddg          d                         ZejJ        K                    de*e+e,g          d             Zd ZejJ        K                    dg ddg dg dg dgfg dddgddgddgddggfg          d             Zd ZejJ        jd        ejJ        K                    deD          d                         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)_convert_to_numpy_get_namespace_device_dtype_idsget_namespacexpx)yield_namespace_device_dtype_combinations)_array_api_for_testsassert_allcloseassert_almost_equalassert_array_equalignore_warnings)BSR_CONTAINERSCOO_CONTAINERSCSC_CONTAINERSCSR_CONTAINERSDOK_CONTAINERS)Paralleldelayedc                 	   t           j                            d          }|                    d                              | d          }t          |d          }t          |          }t          ||           |j        |j        cxk    r| k    sn J |                    d                              | d          }t          ||d          }t          ||          }t          ||           |j        |j        cxk    r| k    sn J |                    d                              | d          }|                    d                              | d          }t           j	        |d<   t           j	        |d<   t          ||d	          }t          ||          }	t          ||	           |j        |	j        cxk    r| k    sn J t          d
 |D                       }
t          d |D                       }t          |
|d          }t          ||           |j        |j        cxk    r| k    sn J |                    d                              | d          }|d d df         dz
  dz  t           j        z  dz  |d d df<   |d d df         dz
  dz  t           j        z  |d d df<   t          |d          }t          |          }t          ||           |                    d                              | d          }|d d df         dz
  dz  t           j        z  dz  |d d df<   |d d df         dz
  dz  t           j        z  |d d df<   t          ||d          }t          ||          }t          ||           t          |d          }t          |t                    }|j        d         |j        d         k    sJ |j        d         |j        d         k    sJ t          ||           t          ||d          }t          ||t                    }|j        d         |j        d         k    sJ |j        d         |j        d         k    sJ t          ||           t          ||d          }t          ||t                     }|j        d         |j        d         k    sJ |j        d         |j        d         k    sJ t          ||           d S )Nr         Fcopy	euclideanmetric   r@   r   r   nan_euclideanc                 @    g | ]}t          d  |D                       S )c                     g | ]}|S  rL   .0vs     i/var/www/html/bet.cuttalo.com/ml/venv/lib/python3.11/site-packages/sklearn/metrics/tests/test_pairwise.py
<listcomp>zEtest_pairwise_distances_for_dense_data.<locals>.<listcomp>.<listcomp>h       ,,,1Q,,,    tuplerN   rows     rP   rQ   z:test_pairwise_distances_for_dense_data.<locals>.<listcomp>h   /    ;;;#e,,,,,--;;;rS   c                 @    g | ]}t          d  |D                       S )c                     g | ]}|S rL   rL   rM   s     rP   rQ   zEtest_pairwise_distances_for_dense_data.<locals>.<listcomp>.<listcomp>i   rR   rS   rT   rV   s     rP   rQ   z:test_pairwise_distances_for_dense_data.<locals>.<listcomp>i   rX   rS   r?   rG         ?rG      	haversine)rG   rG   r   	manhattanr   )nprandomRandomStaterandom_sampleastyper#   r   r2   dtypenanr   rU   pir   r   shaper   )global_dtyperngXSS2YX_maskedY_maskedS_masked	S2_maskedX_tuplesY_tupless               rP   &test_pairwise_distances_for_dense_dataru   K   s0   
)


"
"C 	&!!((E(BBA1[111A	Q		BAr7bh....,...... 	&!!((E(BBA1a444A	Q	"	"BAr7bh....,......   ((//5/IIH  ((//5/IIHVHTNVHTN!(H_MMMH'(;;IHi(((>Y_<<<<<<<<<< ;;;;;<<H;;;;;<<H	Hh{	C	C	CBAr7bh....,......
 	&!!((E(BBAAw}!BE)A-AaaadGAw}!BE)AaaadG1[111A	Q		BAr 	&!!((E(BBAAw}!BE)A-AaaadGAw}!BE)AaaadG1a444A	Q	"	"BAr
 	1[111A	Ai	0	0	0B71:####71:####Ar 	1a444A	Aq	3	3	3B71:####71:####Ar
 	1a111A	Aq	0	0	0B71:####71:####ArrS   z#array_namespace, device, dtype_name)idsrE   )r   rC   r_   c                    t          | |          }t          j                            d          }|                    d                              |d          }|                    d                              |d          }|                    ||          }|                    ||          }	t          d          5  t          ||          }
t          |
|	          }t          |
          d         j        |j        k    sJ |
j        |j        k    sJ |
j        |j        k    sJ t          ||          }t          ||           t          ||	|
          }
t          |
|	          }t          |
          d         j        |j        k    sJ |
j        |j        k    sJ |
j        |j        k    sJ t          |||
          }t          ||           d d d            d S # 1 swxY w Y   d S )Nr   r>   FrA   deviceTarray_api_dispatchrD   xprn   rE   )r1   r`   ra   rb   rc   rd   asarrayr   r#   r,   r.   __name__ry   re   r2   )array_namespacery   
dtype_namerE   r}   rj   X_npY_npX_xpY_xpD_xpD_xp_npD_nps                rP   !test_pairwise_distances_array_apir      s?    
ov	6	6B
)


"
"CV$$++JU+CCDV$$++JU+CCD::d6:**D::d6:**D	4	0	0	0 ' '!$v666#DR000T""1%."+===={dk))))zTZ''''!$v666&&& "$$v>>>#DR000T""1%."+===={dk))))zTZ''''!$$v>>>&&&'' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 's   DG**G.1G.coo_containercsc_containerbsr_containercsr_containerc                    t           j                            d          }|                    d                              |d          }|                    d                              |d          } ||          } ||          }	t          ||	d          }
t          ||	          }t          |
|           |
j        |j        cxk    r|k    sn J t          ||	d          }
t          ||	          }t          |
|           |
j        |j        cxk    r|k    sn J t          | ||          d	          }
t           ||           | |                    }t          |
|           |t           j        k    r|
j        |j        cxk    r|k    sn J nMt          j        t                    5  |
j        |j        cxk    r|k    sn J 	 d d d            n# 1 swxY w Y   t          ||          }t          |
|           |t           j        k    r|
j        |j        cxk    r|k    sn J nMt          j        t                    5  |
j        |j        cxk    r|k    sn J 	 d d d            n# 1 swxY w 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          j        t                     5  t          |d           d d d            n# 1 swxY w Y   t          j        t                     5  t          ||	d           d d d            d S # 1 swxY w Y   d S )Nr   r>   FrA   rF   rC   rD   r   r_   p       @rE   r	   )r`   ra   rb   rc   rd   r#   r   r2   re   r   r   float64pytestraisesAssertionErrorr	   	TypeError)r   r   r   r   ri   rj   rk   rn   X_sparseY_sparserl   rm   kwdss                rP   'test_pairwise_distances_for_sparse_datar      s    )


"
"C&!!((E(BBA&!!((E(BBA }QH}QH8XkBBBA	Xx	0	0BAr7bh....,......8Xh???A	(H	-	-BAr7bh....,......8]]1%5%5kJJJA	]]1--}}Q/?/?	@	@BArrz!!w"(2222l2222222
 ]>** 	7 	77bh6666,6666666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 
Q	"	"BArrz!!w"(2222l2222222
 ]>** 	7 	77bh6666,6666666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 :D1a<<<t<<A	Aq	;	;	;d	;	;BAr :D199[9D99A	A	8	8i	84	8	8BAr 
y	!	! 9 98K88889 9 9 9 9 9 9 9 9 9 9 9 9 9 9	y	!	! < <1h{;;;;< < < < < < < < < < < < < < < < < <sH   6GG#&G#I88I<?I<L**L.1L.M..M25M2categoryc                    t           j                            d          }|                    dd          }|                                }d|d         z
  |d<   t          t                    5  |d fD ]H}t          |||           }t          j	        |d           t          j
        |dk              dk    sJ I	 d d d            n# 1 swxY w Y   d	| z  }t          j        t          |
          5  t          ||            d d d            n# 1 swxY w Y   t          j        t          |
          5  t          |                    t                    ||            d d d            n# 1 swxY w Y   t          j                    5  t          j        dt                     t          |                    t                    |            d d d            d S # 1 swxY w Y   d S )Nr   r?   r@   r]   rH   r   rD   )
fill_valuez+Data was converted to boolean for metric %smatchr~   error)r`   ra   rb   randnrB   r5   r   r#   r/   
nan_to_numsumr   warnsrd   boolwarningscatch_warningssimplefilter)rE   rj   rk   rn   Zresmsgs          rP   test_pairwise_boolean_distancer     s    )


"
"C		!QA	A!D'kAdG 
"7	8	8	8 ) )T 	) 	)A$Q&999CN31----6#(##q(((((	)) ) ) ) ) ) ) ) ) ) ) ) ) ) ) 8&
@C	+3	7	7	7 - -1V,,,,- - - - - - - - - - - - - - - 
+3	7	7	7 ? ?188D>>Qv>>>>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
	 	"	" : :g'<===188D>>&9999: : : : : : : : : : : : : : : : : :sJ   -ACCC3DDD7+E..E25E2AGG!$G!c                     t           j                            d          } |                     dd          }t	          j                    5  t	          j        dt                     t          |d           d d d            d S # 1 swxY w Y   d S )Nr   r?   r@   r   r	   rD   )	r`   ra   rb   r   r   r   r   r   r#   )rj   rk   s     rP   test_no_data_conversion_warningr   (  s    
)


"
"C		!QA		 	"	" 2 2g'<===1[11112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2s   	,BB	Bfuncc                    t          j        t          d          5   | t          j        d          d           d d d            n# 1 swxY w Y   t          j        t          d          5   | t          j        d          t          j        d          d           d d d            n# 1 swxY w Y   t          j        t          d          5   | t          j        d          t          j        d          d           d d d            n# 1 swxY w Y   t          j        d          } | |d          }||u sJ t          j        d          } | |t          j        d	          d          }||u sJ  | t          j        d
ggd          d          }d|j        j        k    sJ  | dggd          }t          |t          j	                  sJ d S )Nz.* shape .*r   )r?      precomputedrD   )r@   r@   )r@   r   r?   r?   )r   r   r]   intre   f      ?)
r   r   
ValueErrorr`   zerosarrayre   kind
isinstancendarray)r   rl   rm   s      rP   test_pairwise_precomputedr   1  s    
z	7	7	7 5 5RXfm44445 5 5 5 5 5 5 5 5 5 5 5 5 5 5 
z	7	7	7 G GRXfrx//FFFFG G G G G G G G G G G G G G G 
z	7	7	7 G GRXfrx//FFFFG G G G G G G G G G G G G G G 	A	a	&	&	&B7777
A	a&!!-	8	8	8B7777 	RXse5)))-@@@A!', 	seW]+++Aa$$$$$$$s5    AAA.3B--B14B13DDDc                      t          j        t          d          5  t          t	          j        dd          d           d d d            d S # 1 swxY w Y   d S )Nz.* non-negative values.*r   r   r   rD   )r   r   r   r#   r`   fullrL   rS   rP   &test_pairwise_precomputed_non_negativer   O  s    	z)C	D	D	D F F2762..}EEEEF F F F F F F F F F F F F F F F F Fs   %AAAr]   r?   doubleFrA   )wr   c                 8   t          | |          \  }}t          t          j        | d|          t          j        |d|          fi |}|j        dk    r6|                    |d          }|j        dk    rt          |d                   S t          d          )NrG   )ndimr}   r   )r   )r]   z6can only convert an array of size 1 to a Python scalar)	r.   r)   r/   
atleast_ndr   reshaperh   floatr   )xyr   r}   _KK_flats          rP   callable_rbf_kernelr   X  s    !QEBqqR(((#.r*J*J*J	 	NR	 	A
 	vzzAu%%<4###
M
N
NNrS   zfunc, metric, kwdsrC   r	   
polynomialdegreegamma皙?re   c                    t           j                            d          }t          j        d|                    d          z  |          }t          j        d|                    d          z  |          } | |f|dd|} | |f|dd|}t          ||            | ||f|dd|} | ||f|dd|}t          ||           d S )	Nr   r?   r>   r   r   r@   r]   rE   n_jobsrG   )r`   ra   rb   r   rc   r2   )	r   rE   r   re   rj   rk   rn   rl   rm   s	            rP   test_pairwise_parallelr   g  s	   ( )


"
"C
S&&v...e<<<A
S&&v...e<<<AQ0va00400A	a	1q	1	1D	1	1BArQ3&33d33A	a	46!	4	4t	4	4BArrS   r_   	laplacianc                    t          ||          }t          j                            d          }t          j        d|                    d          z  |          }t          j        d|                    d          z  |          }	|                    ||          }
|                    |	|          }t          d          5  d	D ]	}|d n|}|d n|	}	 | |
|f|d
d|}t          ||          }t          |          d         j
        |j
        k    sJ |j        |
j        k    sJ |j        |
j        k    sJ  | |
|f|dd|}t          ||          }t          |          d         j
        |j
        k    sJ |j        |
j        k    sJ |j        |
j        k    sJ  | |f|dd|}t          ||           t          ||           	 d d d            d S # 1 swxY w Y   d S )Nr   r?   r>   r   r   rx   Trz   )Nznot noner]   r   r|   rG   )r1   r`   ra   rb   r   rc   r   r   r,   r.   r   ry   re   r2   )r   rE   r   r   ry   r   r}   rj   r   r   r   r   y_val	n_job1_xpn_job1_xp_np	n_job2_xpn_job2_xp_np	n_job2_nps                     rP    test_pairwise_parallel_array_apir     s   $ 
ov	6	6B
)


"
"C8A))&111DDDD8A))&111DDDD::d6:**D::d6:**D	4	0	0	0 5 5' 	5 	5E =44dD =44dDT4IqIIDIII,Y2>>>L ++A.72;FFFF#t{2222?dj0000T4IqIIDIII,Y2>>>L ++A.72;FFFF#t{2222?dj0000TC&CCdCCIL,777L)4444'	55 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5s   DG""G&)G&c                  F    t          dggd           d         dk    sJ d S )Nr   c                     dS )Nr?   rL   r   r   s     rP   <lambda>z9test_pairwise_callable_nonstrict_metric.<locals>.<lambda>  s    1 rS   rD   rH   r?   )r#   rL   rS   rP   'test_pairwise_callable_nonstrict_metricr     s3     ugnn===dCqHHHHHHrS   )rbfr   sigmoidr   linearchi2additive_chi2c                    t           j                            d          }|                    d          }|                    d          }t          |          }t          ||           } ||          }t          ||           t          |||           } |||          }t          ||           t          d |D                       }t          d |D                       }	t          ||	|           }t          ||            ||          }
 ||          }| d	v rd S t          |
||           }t          ||           d S )
Nr   r>   rF   rD   r~   rn   c                 @    g | ]}t          d  |D                       S )c                     g | ]}|S rL   rL   rM   s     rP   rQ   z4test_pairwise_kernels.<locals>.<listcomp>.<listcomp>  rR   rS   rT   rV   s     rP   rQ   z)test_pairwise_kernels.<locals>.<listcomp>  rX   rS   c                 @    g | ]}t          d  |D                       S )c                     g | ]}|S rL   rL   rM   s     rP   rQ   z4test_pairwise_kernels.<locals>.<listcomp>.<listcomp>  rR   rS   rT   rV   s     rP   rQ   z)test_pairwise_kernels.<locals>.<listcomp>  rX   rS   )r   r   )r`   ra   rb   rc   r   r'   r2   rU   )rE   r   rj   rk   rn   functionK1K2rs   rt   r   r   s               rP   test_pairwise_kernelsr     sg    )


"
"C&!!A&!!A(0H	!F	+	+	+B	!BB	!q	0	0	0B	!q			BB;;;;;<<H;;;;;<<H	(HV	<	<	<BB }QH}QH***	(hv	>	>	>BBrS   )r   r   r   r   r   r   r   c                    t          ||          }t          j                            d          }d|                    d          z  }|                    |d          }d|                    d          z  }|                    |d          }|                    ||          }|                    ||          }	t          d	          5  t          || 
          }
t          |
|          }t          |
          d         j        |j        k    sJ |
j        |j        k    sJ |
j        |j        k    sJ t          || 
          }t          ||           t          ||	|           }
t          |
|          }t          |
          d         j        |j        k    sJ |
j        |j        k    sJ |
j        |j        k    sJ t          |||           }t          ||           d d d            d S # 1 swxY w Y   d S )Nr   
   r>   FrA   rF   rx   Trz   rD   r|   r~   )r1   r`   ra   rb   rc   rd   r   r   r'   r,   r.   r   ry   re   r2   )rE   r   ry   r   r}   rj   r   r   r   r   K_xpK_xp_npK_nps                rP   test_pairwise_kernels_array_apir     sM    
ov	6	6B
)


"
"C!!&)))D;;z;..D!!&)))D;;z;..D::d6:**D::d6:**D	4	0	0	0 ' 'V444#DR000T""1%."+===={dk))))zTZ''''V444&&&  V<<<#DR000T""1%."+===={dk))))zTZ''''V<<<&&&'' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 's   DG44G8;G8c                  j   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   r>   rF   r   r   r~   rn   )r`   ra   rb   rc   r   r'   r)   r2   )rj   rk   rn   rE   r   r   r   s          rP   test_pairwise_kernels_callabler     s     )


"
"C&!!A&!!A FS>D	!	8q	8	84	8	8B	A	#	#	#d	#	#BB 
!	8q	8	84	8	8B	A	#	#	#d	#	#BBrS   c                     t           j                            d          } |                     d          }|                     d          }t	          ||d          }ddd}t          ||fdd	d
|}t          ||           t          j        t                    5  t          ||fddi| d d d            d S # 1 swxY w Y   d S )Nr   r>   rF   r   r   z:))r   blablar   T)rE   filter_paramsrE   )
r`   ra   rb   rc   r)   r'   r2   r   r   r   )rj   rk   rn   r   paramsr   s         rP   "test_pairwise_kernels_filter_paramr  "  s   
)


"
"C&!!A&!!A1as###Ad++F	!Q	KuD	K	KF	K	KBAr	y	!	! 7 7A66e6v6667 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7s   B99B= B=zmetric, funcc                    t           j                            d          }|                    d          }|                    d          }t	          |||           } |||          }t          ||            | ||           ||                    }t          ||           | t          v r<t          |          ||          }	t          j        |	          }	t          |	|           d S d S )Nr   r>   rD   )r`   ra   rb   rc   r    r2   r   diag)
rE   r   r   rj   rk   rn   rl   rm   S3	distancess
             rP   test_paired_distancesr	  /  s     )


"
"C&!!A&!!AAf---A	aBAr	mmAa 0 0	1	1BAr,,, 071==	GI&&		1%%%%% -,rS   c                    t           j                            d          }|                    d                              | d          }|                    d                              | d          }t          ||d          }t          ||d           }t          ||           |                    d          }t          j        t                    5  t          ||           d d d            d S # 1 swxY w Y   d S )	Nr   r>   FrA   r_   rD   c                 X    t          j        | |z
                                d          S )Nr   axis)r`   absr   r   s     rP   r   z0test_paired_distances_callable.<locals>.<lambda>P  s#    BF1q5MM4E4E14E4M4M rS   r   )
r`   ra   rb   rc   rd   r    r2   r   r   r   )ri   rj   rk   rn   rl   rm   s         rP   test_paired_distances_callabler  F  s:    )


"
"C&!!((E(BBA&!!((E(BBAAk222A	!Q'M'M	N	N	NBAr 	&!!A	z	"	"  A                 s   C55C9<C9dok_containerc                 ~
   t          j        dgdgg|          }t          j        dgdgg|          } | |          } |||          }ddg}ddg}ddg}	t          ||d	          \  }
}t          ||d	          }t	          |
|           t	          ||           t	          ||           t          ||d	          \  }}t          ||d	          }t	          ||           t	          ||           t	          ||           t          |          t           j        k    sJ t          |          t           j        k    sJ t          ||d
	          \  }
}t          ||dddi          \  }}t          ||d
	          }t          ||dddi          }t	          ||	           t	          ||	           t	          |
|           t	          ||           t	          ||           t	          ||           t          ||d	          \  }
}t          ||d	          }t	          |
|           t	          ||           t	          ||           t          ||d	          \  }}t          ||d	          }t	          ||           t	          ||           t	          ||           t          ||t          ddi          \  }
}t	          |
|           t	          ||           t          ||dddi          \  }
}t	          |
|           t	          ||           t           j        	                    d          }|
                    dd          }|
                    dd          }t          ||d	          }|                    d          }||t          t          |                    f         }t          ||dd          \  }}t	          ||d           t	          ||d           t          ||d          \  }}t          ||d          \  }}t	          ||           t          ||           t          ||d          \  }}t          ||d          \  }}t	          ||           t          ||           t          ||d          }t          ||d          }t          ||           t          ||d          }t          ||d          }t          ||           t          ||          }t          t          j        |          t          j        |                    }t          ||           d S )Nr   r]   r   r   rG   r@   rC   rD   sqeuclideansquaredT)rE   metric_kwargsr_   r   r	   a      o   r  )r  rE   Hz>rtol)r`   r   r%   r$   r2   typer   r	   ra   rb   r   r#   argminrangelenr4   asfortranarray)r  r   ri   rk   rn   XspYspexpected_idxexpected_valsexpected_vals_sqidxvalsidx2idxspvalsspidxsp2vals2idx3idx4rj   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_contiguouss                                  rP   "test_pairwise_distances_argmin_minr:  \  s   
 	
QC!:\222A

RD1#;l333A
-

C
-
.
.
.Cq6LFM1v .a;GGGIC$Q+>>>DC&&&D,'''D-(((1#s;OOOME6&sCDDDFE<(((FL)))FM***;;"*$$$$<<2:%%%% .a=IIIIC/	1[D0A  KD% %Q-@@@D$	1[D0A  D D*+++E+,,,C&&&D,'''D,'''D,''' .a;GGGIC$Q+>>>DC&&&D,'''D-(((1#s;OOOME6&sCDDDFE<(((FL)))FM*** .	1YsAh  IC C&&&D-((( .	1[a  IC C&&&D-((( )


"
"C		"cA		#sAa;777DKKQK''Mc-.@.@(A(AABM)F	11[* * *&& M#3$????M#3$???? 5QBBBHf4QBBBHfFF###x***4QBBBHf4QBBBHfFF###x*** )AA666H(AA666Hx***(AA666H(AA666Hx*** 4Aq993
!b/22  *,?@@@@@rS   c                     | d d d df         S )Nd   rL   r/  starts     rP   _reduce_funcr?    s    4C4=rS   c                    t           j                            d          }|                    d                              | d          }t          |          d d d df         }t          |d t          d          }t          |t                    sJ t          |          }t          |          dk    sJ |d         j        |j        k    sJ t          t          j        |          |d	
           d S )Nr   )i  r@   FrA   r<        >reduce_funcworking_memoryr]   r  atol)r`   ra   rb   rc   rd   r#   r&   r?  r   r   listr  re   r2   vstack)ri   rj   rk   rl   S_chunkss        rP   &test_pairwise_distances_chunked_reducerJ    s    
)


"
"C(##**<e*DDA1aaa#g&A)	4\&  H h.....H~~Hx==1A;'''' BIh''666666rS   c                 l   t           j                            d          }|                    d                              | d          }t          |d d d          }t          |t                    sJ t          |          }t          |          dk    sJ t          d	 |D                       sJ d S )
Nr   r   r@   FrA   c                     d S NrL   r=  s     rP   r   z=test_pairwise_distances_chunked_reduce_none.<locals>.<lambda>  s     rS   rA  rB  r]   c              3      K   | ]}|d u V  	d S rN  rL   )rN   chunks     rP   	<genexpr>z>test_pairwise_distances_chunked_reduce_none.<locals>.<genexpr>  s&      33u}333333rS   )r`   ra   rb   rc   rd   r&   r   r   rG  r  all)ri   rj   rk   rI  s       rP   +test_pairwise_distances_chunked_reduce_nonerS    s    
)


"
"C'"")),U)CCA)	455f  H h.....H~~Hx==133(3333333333rS   good_reducec                      t          |           S rN  rG  Dr>  s     rP   r   r     s    a rS   c                 *    t          j        |           S rN  )r`   r   rW  s     rP   r   r     s    ! rS   c                 >    t          |           t          |           fS rN  rV  rW  s     rP   r   r     s    $q''477+ rS   c                     g | ]}|fd S )c                      ||           S rN  rL   )rX  r>  scipy_csr_types      rP   r   z<listcomp>.<lambda>  s    q8I8I rS   rL   )rN   r]  s     rP   rQ   rQ     s1        )7III  rS   c                     g | ]}|fd S )c                 \     ||           t          j        |           t          |           fS rN  )r`   r   rG  )rX  r>  scipy_dok_types      rP   r   z<listcomp>.<lambda>  s*    N1HQKKGG9
 rS   rL   )rN   r`  s     rP   rQ   rQ     s9         )7 	
 	
 	
  rS   c                     t          j        d                              dd          }t          |d | d          }t	          |           d S )Nr   r   r]   @   rB  )r`   aranger   r&   next)rT  rk   rI  s      rP   ,test_pairwise_distances_chunked_reduce_validre    sO    * 		"b!$$A)	4[  H 	NNNNNrS   )
bad_reduceerr_typemessagec                 >    t          j        | | dd          g          S Nr   r`   concatenaterX  ss     rP   r   r     s    AbccF44 rS   zlength 11\..* input: 10\.c                 B    | t          j        | | dd          g          fS rj  rk  rm  s     rP   r   r     s!    !R^Q"##K889 rS   z!length \(10, 11\)\..* input: 10\.c                     | d d         | fS )N	   rL   rm  s     rP   r   r   #  s    q!uaj rS   z length \(9, 10\)\..* input: 10\.c                     dS )N   rL   rm  s     rP   r   r   %  s     rS   z2returned 7\. Expected sequence\(s\) of length 10\.c                     dS )N)rs     rL   rm  s     rP   r   r   *  s     rS   z9returned \(7, 8\)\. Expected sequence\(s\) of length 10\.c                 .    t          j        d          dfS )Nr   rq  )r`   rc  rm  s     rP   r   r   /  s    ")B--+ rS   z-, 9\)\. Expected sequence\(s\) of length 10\.c                 "   t          j        d                              dd                              | d          }t	          |d |d          }t          j        ||          5  t          |           d d d            d S # 1 swxY w Y   d S )	Nr   r   r]   FrA   rb  rB  r   )r`   rc  r   rd   r&   r   r   rd  )ri   rf  rg  rh  rk   rI  s         rP   .test_pairwise_distances_chunked_reduce_invalidrx    s    D 		"b!$$++Lu+EEA)	4Z  H 
xw	/	/	/  X                 s   'BBBc                 h   t          | |||          }t          |t                    sJ t          |          }|| n|}t	          |          dz  dz  }|D ]"}|j        }|t          ||          dz  k    sJ #t          j        |          }t          | ||          }	t          ||	d           d S )NrD  rE   ru  g      >i   rD   r  rE  )r&   r   r   rG  r  nbytesmaxr`   rH  r#   r2   )
rk   rn   rD  rE   genblockwise_distancesmin_block_mibblockmemory_usedrl   s
             rP    check_pairwise_distances_chunkedr  @  s    
$Q.QW
X
X
XCc=)))))s))YAAFFQJ'M$ I Ilc.-@@5HHHHHH)$7881a///A'666666rS   )rC   l2r  c                 p   t           j                            d          }|                    dd                              |d          }t          t          |d|                     }t          |          dk    sJ t          t          j	        t          j
        |                    dd	
           d S )Nr     r       _BsizescaleFrA   r]   rz  绽|=r  )r`   ra   rb   normalrd   rG  r&   r  r2   r  rH  )rE   ri   rj   rk   chunkss        rP   (test_pairwise_distances_chunked_diagonalr  P  s    
)


"
"C


$
//66|%6PPA,QqPPPQQFv;;????BGBIf--..>>>>>>rS   c                    t           j                            d          }|                    dd                              |d          }t          || d          }t          t          j        |          dd	
           d S )Nr   r  r  r  FrA   rG   r   r  rE  )r`   ra   rb   r  rd   r#   r2   r  )rE   ri   rj   rk   r  s        rP   )test_parallel_pairwise_distances_diagonalr  Y  sx    
)


"
"C


$
//66|%6PPA"1VA>>>IBGI&&666666rS   z0ignore:Could not adhere to working_memory configc                    t           j                            d          }|                    d                              | d          }t          |d dd           t          dd          D ]}t          |d d	|z  d           t          |                                d dd           |                    d
                              | d          }t          ||dd           t          |                                |                                dd           t          ||dd           t          ||dd           t          |          }t          |dd          }t          |t                    sJ t          |          |u sJ t          j        t                    5  t          |           d d d            d S # 1 swxY w Y   d S )Nr   )   r@   FrA   r]   rC   rz  irG   )r<  r@   i'  r   rA  r   )r`   ra   rb   rc   rd   r  r  tolistr#   r&   r   r   rd  r   r   StopIteration)ri   rj   rk   powerrn   rX  r}  s          rP   test_pairwise_distances_chunkedr  a  s,    )


"
"C(##**<e*DDA$QQ{SSSSsA 
 
(tAuH[	
 	
 	
 	
 	
 %	

D;    	(##**<e*DDA$Q!KPPPP$	

AHHJJq    %Q%TTTT %Q!KPPPP 	1A
$Qvm
T
T
TCc=)))))99>>>>	}	%	%  S			                 s   )GG
G
x_array_constrdensec                     g | ]	}|j         
S rL   r   rN   	containers     rP   rQ   rQ         HHHIY'HHHrS   y_array_constrc                     g | ]	}|j         
S rL   r  r  s     rP   rQ   rQ     r  rS   c                      | dgg          } |dgdgg          }t          ||          }t          |ddgg           d S Nr   r]   rG   r   r   )r   r2   )r  r  rk   rn   rX  s        rP   %test_euclidean_distances_known_resultr    sY     	uAaSz""AAq!!AAc
|$$$$$rS   c                     g | ]	}|j         
S rL   r  r  s     rP   rQ   rQ     r  rS   c                 
   t           j                            d          }|                    d                              | d          }|                    d                              | d          }|                    t           j                  dz                      d                              dd	          }|                    t           j                  dz                      d                              dd	          } ||          }t          ||          }t          |||
          }t          |||          }	t          ||||          }
t          ||           t          |	|           t          |
|           t          ||t          j
        |          t          j
        |                    }t          j        t                    5  t          ||           d d d            d S # 1 swxY w Y   d S )Nr   r   r   FrA      r   rG   r]   r  r   X_norm_squaredY_norm_squaredr  r  )r`   ra   rb   rc   rd   r   r   r   r   r2   
zeros_liker   r   r   )ri   r  rj   rk   rn   	X_norm_sq	Y_norm_sqD1D2D3D4wrong_Ds               rP   #test_euclidean_distances_with_normsr    s!    )


"
"C(##**<e*DDA(##**<e*DDA "*%%*//Q/77??2FFI"*%%*//Q/77??2FFIqA	Q	"	"B	Q)	<	<	<B	Q)	<	<	<B	Q)I	V	V	VBBBB "		}Y//}Y//	  G 
~	&	& % %$$$% % % % % % % % % % % % % % % % % %s   G88G<?G<	symmetricTc                    t           j                            |           }|                    d          }|r|n|                    d          }|                    t           j                  dz                      d                              dd          }|                    t           j                  dz                      d                              dd          }t          ||          }t          |||          }t          |||          }	t          ||||	          }
t          ||           t          |	|           t          |
|           d S )
Nr  r  rG   r]   r  r   r  r  r  )
r`   ra   rb   rc   rd   float32r   r   r   r2   )global_random_seedr  rj   rk   rn   r  r  r  r  r  r  s              rP   &test_euclidean_distances_float32_normsr    s>    )

 2
3
3C(##A7C--h77A"*%%*//Q/77??2FFI"*%%*//Q/77??2FFI	Q	"	"B	Q)	<	<	<B	Q)	<	<	<B	Q)I	V	V	VBBBBrS   c            	         t           j                            d          } |                     d          }|                     d          }|dz                      d          }|dz                      d          }t          ||||          }t          |||                    dd          |                    dd                    }t          |||                    dd          |                    dd                    }t          ||           t          ||           t          j	        t          d	
          5  t          |||d d                    d d d            n# 1 swxY w Y   t          j	        t          d
          5  t          |||d d                    d d d            d S # 1 swxY w Y   d S )Nr   r  r  rG   r]   r  r  r   zIncompatible dimensions for Xr   r?   r  zIncompatible dimensions for Yr  )r`   ra   rb   rc   r   r   r   r2   r   r   r   )rj   rk   rn   r  r  r  r  r  s           rP   $test_euclidean_distances_norm_shapesr    st   
)


"
"C(##A(##AdZZQZ''NdZZQZ''N		1^N
 
 
B 
		%--b!44%--b!44	
 
 
B 
		%--a44%--a44	
 
 
B BB	z)H	I	I	I E EAq1CDDDDE E E E E E E E E E E E E E E	z)H	I	I	I E EAq1CDDDDE E E E E E E E E E E E E E E E E Es$    E''E+.E+F55F9<F9c                     g | ]	}|j         
S rL   r  r  s     rP   rQ   rQ     r  rS   c                     g | ]	}|j         
S rL   r  r  s     rP   rQ   rQ     r  rS   c                    t           j                            d          }|                    d                              | d          }d||dk     <   |                    d                              | d          }d||dk     <   t          ||          } ||          } ||          }t          ||          }t          ||d           |j        | k    sJ d S )	Nr   r<  r   FrA   皙?r  ư>r  )	r`   ra   rb   rc   rd   r   r   r2   re   )ri   r  r  rj   rk   rn   expectedr  s           rP   test_euclidean_distancesr    s     )


"
"C)$$++Lu+EEAAa#gJ(##**<e*DDAAa#gJQ{{HqAqA#Aq))I Ixd3333?l******rS   c                     g | ]	}|j         
S rL   r  r  s     rP   rQ   rQ     r  rS   c                 T   t           j                            d          }|                    d                              | d          }d||dk     <   t          t          |                    } ||          }t          |          }t          ||d           |j	        | k    sJ d S )Nr   r  FrA   r  r  r  )
r`   ra   rb   rc   rd   r   r
   r   r2   re   )ri   r  rj   rk   r  r  s         rP   test_euclidean_distances_symr    s     )


"
"C)$$++Lu+EEAAa#gJ%((##HqA#A&&I Ixd3333?l******rS   
batch_size)Nr?   rs  e   c                     g | ]	}|j         
S rL   r  r  s     rP   rQ   rQ   *  r  rS   c                     g | ]	}|j         
S rL   r  r  s     rP   rQ   rQ   /  r  rS   c                    t           j                            d          }|                    d                              t           j                  }d||dk     <   |                    d                              t           j                  }d||dk     <   t          ||          } ||          } ||          }t          |||           }t          j        t          j	        |d                    }t          ||d           d S )Nr   r  r  r  rn   r  r  r  )r`   ra   rb   rc   rd   r  r   r   sqrtmaximumr2   )r  r  r  rj   rk   rn   r  r  s           rP   test_euclidean_distances_upcastr  &  s     )


"
"C)$$++BJ77AAa#gJ(##**2:66AAa#gJQ{{HqAqA+AzJJJI
9a0011I Ixd333333rS   c                     g | ]	}|j         
S rL   r  r  s     rP   rQ   rQ   I  r  rS   c                    t           j                            d          }|                    d                              t           j                  }d||dk     <   t          t          |                    } ||          }t          |||           }t          j	        t          j
        |d                    }t          ||d           d S )Nr   r  r  r  r  r  )r`   ra   rb   rc   rd   r  r   r
   r   r  r  r2   )r  r  rj   rk   r  r  s         rP   #test_euclidean_distances_upcast_symr  E  s     )


"
"C)$$++BJ77AAa#gJ%((##HqA+AzJJJI
9a0011I Ixd333333rS   zdtype, eps, rtolg-C6?h㈵>g:0yE>gGz?z failing due to lack of precision)reason)marksdimi@B c                     t          j        dg|z  g|           }t          j        d|z   g|z  g|           }t          ||          }t          ||          }t	          ||d           d S )Nr   r   r  r  )r`   r   r   r   r2   )re   epsr  r  rk   rn   r  r  s           rP   'test_euclidean_distances_extreme_valuesr  \  sy      	3%#+e,,,A
39+#$E222A#Aq))IQ{{HIxd333333rS   r  c                    t           j                            d          }|                    dd          }|                    dd          }t	          |||           }t          |||           }t          ||           d S )N9  r   r@   )rn   r  )r`   ra   rb   r   r   r   r2   )r  rj   rk   rn   normal_distancenan_distances         rP   8test_nan_euclidean_distances_equal_to_euclidean_distancer  u  sy     )


%
%C		!QA		!QA)!q'BBBO*17CCCLO\22222rS   rk   rn   c                     t          j        t                    5 }t          | |           d d d            n# 1 swxY w Y   d}|t	          |j                  k    sJ d S )Nr   zBInput contains infinity or a value too large for dtype('float64').)r   r   r   r   strvalue)rk   rn   excinfoexp_msgs       rP   ,test_nan_euclidean_distances_infinite_valuesr    s     
z	"	" (gQ''''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( SGc'-((((((((s   8<<zX, X_diag, missing_valuerG   r   c                 r   t          j        d|g|dgg          }t          | |          }t          ||           t          | d|          }t          |dz  |           t          | | |          }t          ||           t          | |                                 |          }t          ||           d S )N        r   missing_valuesTr  r  rG   )r`   r   r   r2   rB   )rk   X_diagmissing_valueexp_distr/  dist_sqdist_twodist_two_copys           rP    test_nan_euclidean_distances_2x2r    s      x#v455H"1]CCCDHd###%amTTTGHaK)))&q!MJJJHHh'''+AqvvxxVVVMHm,,,,,rS   r  c                 T   t          j        | | gddgg          }t          j        t           j        t           j        gt           j        dgg          }t          ||           }t	          ||           t          ||                                |           }t	          ||           d S )Nr   r]   r  )r`   r   rf   r   r2   rB   )r  rk   r  r/  s       rP   )test_nan_euclidean_distances_complete_nanr    s    
=-01a&9::Ax"&"&)BFA;788H"1]CCCDHd###"1affhh}MMMDHd#####rS   c           	      6   t          j        d| dddg| ddd| gd| | | dgg          }t          j        | dd| dg| | dddg| | | ddgg          }t          |||           }t          |||           }t          ||j                   t          t          |d d	         |d d	         d
|           dgg           t          t          |d	d         |d	d         d|           t          j        d          gg           t          ||           }t          |||           }t          ||                                |           }t          ||           t          ||           t          ||d
          }t          ||d          }	t          ||	           d S )Nr   g      @g      @r   g      @g      @g      @r  r]   Tr  g      D@rG   Fg      9@rA   )r`   r   r   r3   Tr2   r  rB   )
r  rk   rn   r  r  r  r  D5D6D7s
             rP   'test_nan_euclidean_distances_not_trivalr    s   
-c3/Cc=9-sC	
	 	A 	CmS9M3S9M=#sC	
	 	A 
!Am	D	D	DB	 Am	D	D	DBBD!!! bqbE1RaR5$}	
 	
 	
 4	45	   acFAacFE-	
 	
 	
 ';
<
<	=>	   
!=	A	A	AB	 Am	D	D	DB	 AFFHH]	K	K	KBBB 
!AD	1	1	1B	 AE	2	2	2BBrS   c                     t          j        dd| dgd| d| gg          }t          || d          }t          j        |dk              sJ t          || d          }t	          |d	           d S )
NgzG^g     @@gB@g|ï@T)r  r  r   Fr  )r`   r   r   rR  r2   )r  rk   dist_squaredr/  s       rP   7test_nan_euclidean_distances_one_feature_match_positiver    s    
 	e]E2mZ?	
	 	A +	-  L 6,!#$$$$$"1]ERRRDD#rS   c                     t           j                            d          } t          j        |                     d                    }t          j        ||g          }t          |          }t          |ddgddggd           t          j        |dk              sJ t          j        |dk              sJ t          |t          j	        |                   ddg           t          j        || g          }t          |          }t          j        |dk              sJ t          j        |dk              sJ t          |ddgddgg           t          j        |                     dd                    }t          |          }t          |t          j	        |                   dg|j
        d	         z             t          j        |dk              sJ t          j        |dk              sJ d S )
Nr  i  r  r  rE  r   r  i  r   )r`   ra   rb   r  randrH  r   r2   rR  diag_indices_fromrh   )rj   r   XArX  XBr  rk   s          rP   test_cosine_distancesr    s   
)


%
%C
sxx}}A	Aq6		BAAc
S#J/e<<<<6!s(6!s(Ab*1--.c
;;;	Ar7		B	"		B6")6")B#sc3Z0111 	sxxd##$$AAAb*1--.
0BCCC6!s(6!s(rS   c                     d t           j                            d          } |                     d          }|                     d          t          j        fd|D                       }t          |          }t          ||           |                     d          }d}t          j        t          |          5  t          |           d d d            d S # 1 swxY w Y   d S )	Nc                 r   |d         | d         z
  }|d         | d         z
  }t          j        |dz            dz  t          j        | d                   t          j        |d                   z  t          j        |dz            dz  z  z   }dt          j        t          j        |                    z  }|S )Nr   r]   rG   )r`   sincosarcsinr  )r   r   diff_latdiff_lonacs         rP   slow_haversine_distancesz:test_haversine_distances.<locals>.slow_haversine_distances!  s    Q4!A$;Q4!A$;F8a<  A%F1Q4LL26!A$<<'"&A*>*>!*CC
 	"'!**%%%rS   r   r[   )r   rG   c                 0    g | ]fd D             S )c                 (    g | ]} |          S rL   rL   )rN   r   r  r   s     rP   rQ   z7test_haversine_distances.<locals>.<listcomp>.<listcomp>-  s'    >>>q,,Q22>>>rS   rL   )rN   r   rn   r  s    @rP   rQ   z,test_haversine_distances.<locals>.<listcomp>-  s2    JJJ1>>>>>A>>>JJJrS   )r   r   z-Haversine distance only valid in 2 dimensionsr   )
r`   ra   rb   rc   r   r   r2   r   r   r   )rj   rk   r  r  err_msgrn   r  s        @@rP   test_haversine_distancesr    s5      )


"
"C&!!A'""A	JJJJJJJJ	K	KB	Q	"	"BB'""A=G	z	1	1	1  A                 s   CC#&C#c                  b    dgdgg} dgdgg}t          | |          }t          |ddg           d S r  )r!   r2   rk   rn   rX  s      rP   test_paired_euclidean_distancesr  :  E    
qc
A
qc
A"1a((AASz"""""rS   c                  b    dgdgg} dgdgg}t          | |          }t          |ddg           d S r  )r"   r2   r  s      rP   test_paired_manhattan_distancesr  B  r  rS   c                  b    dgdgg} dgdgg}t          | |          }t          |ddg           d S )Nr   r]   rG   r\   )r   r2   r  s      rP   test_paired_cosine_distancesr  J  sE    
qc
A
qc
A1%%AASz"""""rS   c                     t           j                            d          } |                     d          }|                     d          }t	          ||          }d}t          |||          }|j        t          k    sJ t          |          D ]\  }}t          |          D ]m\  }}	t          j	        ||	z
  dz  ||	z   z             }
t          j
        ||
z            }t          |||f         |
           t          |||f         |           nt          |          }t          t          j        |          d           t          j        |dk              sJ t          j        |t          j        t          j        |                    z
  dk               sJ |                     d                              t           j                  }|                     d                              t           j                  }t          ||          }|j        t           j        k    sJ |                     d                              t           j                  }t          ||          }t          j        |                                          sJ |j        t          k    sJ dd	gd
dgg}ddgddgg}t          ||          }|d         |d         k    sJ |d         |d         k    sJ t'          j        t*                    5  t          ddgg           d d d            n# 1 swxY w Y   t'          j        t*                    5  t          ddggddgg           d d d            n# 1 swxY w Y   t'          j        t*                    5  t          ddggddgg           d d d            n# 1 swxY w Y   t'          j        t*                    5  t          ddggg dg           d d d            d S # 1 swxY w Y   d S )Nr   r>   rL  r   r   rG   r]   g333333?gffffff?r   g?rH   )r   r]   )r]   r]   )r]   r   r   )皙?r  g333333?)r`   ra   rb   rc   r   r   re   r   	enumerater   expr3   r4   r  rR  rd   r  int32isfiniter   r   r   )rj   rk   rn   K_addr   r   ir   jr   r   chi2_exps               rP   test_chi_square_kernelr#  R  s   
)


"
"C&!!A'""A A&&EEAq&&&A7e! 3 31aLL 	3 	3DAqFAEa<1q51222Dvedl++HadT222!Q$2222		3 	AArwqzz1%%%6!a%==6!bgbgajj)))A-.....&!!((44A'""))"*55AAqA7bj     	'""))"(33AAqA;q>>7e sc1XA
Q#sAAqAT7QtWT7QtW 
z	"	"  aWI              	z	"	" + +aWIRz***+ + + + + + + + + + + + + + +	z	"	" * *aVHBxj)))* * * * * * * * * * * * * * * 
z	"	" 1 1aVH/0001 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1sH   L%%L),L)	M,,M03M0N33N7:N7O;;O?O?kernelc                     t           j                            d          }|                    d          } | ||          }t	          ||j        d           d S )Nr   r>      )r`   ra   rb   rc   r2   r  )r$  rj   rk   r   s       rP   test_kernel_symmetryr'    sU     )


"
"C&!!Aq!AAqsBrS   c                     t           j                            d          }|                    d          } ||          } | ||          } | ||          }t	          ||           d S Nr   r>   )r`   ra   rb   rc   r2   )r$  r   rj   rk   r   r   r   s          rP   test_kernel_sparser*    sq     )


"
"C&!!A}QHq!A	(	#	#BArrS   c                      t           j                            d          } |                     d          }t	          ||          }t          |j        d d d         d |D                        d S )Nr   r>      c                 <    g | ]}t          j        |          d z  S )rG   )r   norm)rN   r   s     rP   rQ   z&test_linear_kernel.<locals>.<listcomp>  s%    !A!A!A!&+a..A"5!A!A!ArS   )r`   ra   rb   rc   r   r2   flatrj   rk   r   s      rP   test_linear_kernelr1    sj    
)


"
"C&!!AaAAF33Q3K!A!Aq!A!A!ABBBBBrS   c                      t           j                            d          } |                     d          }t	          ||          }t          |j        d d d         t          j        d                     d S )Nr   r>   r,  r?   )r`   ra   rb   rc   r)   r2   r/  onesr0  s      rP   test_rbf_kernelr4    sc    
)


"
"C&!!A1aAAF33Q3K,,,,,rS   c                     t           j                            d          } |                     d          }t	          ||          }t          t          j        |          t          j        d                     t          j        |dk              sJ t          j        |t          j        t          j        |                    z
  dk               sJ d S )Nr   r>   r?   r]   )	r`   ra   rb   rc   r   r2   r  r3  rR  r0  s      rP   test_laplacian_kernelr6    s    
)


"
"C&!!AAABGAJJ

+++ 6!a%==6!bgbgajj)))A-.......rS   zmetric, pairwise_funcr   r   c                    t           j                            d          }|                    d          }|                    d          } ||          } ||          } |||d          }t	          |          sJ  |||d          }	t	          |	          rJ t          |                                |	           t          |||           }
t          |                                |
           d S )Nr   r>   r   F)dense_outputTr~   )r`   ra   rb   rc   r   r2   toarrayr'   )rE   pairwise_funcr   rj   rk   rn   XcsrYcsrr   r   K3s              rP   &test_pairwise_similarity_sparse_outputr>    s     )


"
"C&!!A&!!A=D=D 
tT	6	6	6BB<< 
q!$	/	/	/B||BJJLL"%%% 
!q	0	0	0BBJJLL"%%%%%rS   c                    t           j                            d          }|                    d          }|                    d          } | |          } | |          }|d f||f|d f||ffD ]Y\  }}t	          ||d          }t          |          }|t          |          }t	          ||d          }	t          ||	           Zd S )Nr   r>   r   r   r~   r   )r`   ra   rb   rc   r'   r+   r2   )
r   rj   rk   rn   r;  r<  X_Y_r   r   s
             rP   test_cosine_similarityrB    s     )


"
"C&!!A&!!A=D=Dt9q!ftTlT4LA    B bBx888r]]>2BbBx888B   rS   c                      t          j        t          j        d          d          } t          | d           \  }}||u sJ t	          | |           d S N(   r?   ru  )r`   resizerc  r   r4   )r   
XA_checked
XB_checkeds      rP   test_check_dense_matricesrJ    sX     
29R==&	)	)B22t<<J
####r:&&&&&rS   c                     t          j        t          j        d          d          } t          j        t          j        d          d          }t          | |          \  }}t	          | |           t	          ||           t          j        t          j        d          d          }t          | |          \  }}t	          | |           t	          ||           d S )NrE  rF      r@   ru  )r`   rG  rc  r   r4   r   r   r  rH  rI  s       rP   test_check_XB_returnedrO    s     
29R==&	)	)B	29R==&	)	)B22r::J
r:&&&r:&&&	29R==&	)	)B0R88J
r:&&&r:&&&&&rS   c                     t          j        t          j        d          d          } t          j        t          j        d          d          }t          j        t
                    5  t          | |           d d d            n# 1 swxY w Y   t          j        t          j        d          d          }t          j        t
                    5  t          | |           d d d            d S # 1 swxY w Y   d S )N-   )r?   rq  rL  rM  $   )r@   rq  )r`   rG  rc  r   r   r   r   r   r   r  s     rP   test_check_different_dimensionsrT    sJ   	29R==&	)	)B	29R==&	)	)B	z	"	" & &b"%%%& & & & & & & & & & & & & & & 
29U##V	,	,B	z	"	" $ $B###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s$   (BB	B	C..C25C2c                  L   t          j        d                              dd          } t          j        d                              dd          }t          j        t
                    5  t          | |           d d d            n# 1 swxY w Y   t          j        d                              dd          } t          j        d                              dd          }t          j        t
                    5  t          | |           d d d            d S # 1 swxY w Y   d S )NrQ  rq  r?   rL  r@   ru  )r`   rc  r   r   r   r   r   rS  s     rP   test_check_invalid_dimensionsrV     sq    
2		q!	$	$B	2		q!	$	$B	z	"	" & &b"%%%& & & & & & & & & & & & & & &	2		q!	$	$B	2		q!	$	$B	z	"	" & &b"%%%& & & & & & & & & & & & & & & & & &s$   *BBB;DD Dc                    t           j                            d          }|                    d          } | |          }|                    d          } | |          }t	          ||          \  }}t          |          sJ t          ||z
                                            dk    sJ t          |          sJ t          ||z
                                            dk    sJ t	          ||          \  }}t          |          sJ t          ||z
                                            dk    sJ t          |          sJ t          ||z
                                            dk    sJ d S r)  )r`   ra   rb   rc   r   r   r  r   )	r   rj   r   	XA_sparser  	XB_sparserH  rI  XA_2_checkeds	            rP   test_check_sparse_arraysr[  .  s    )


"
"C			6	"	"Bb!!I			6	"	"Bb!!I29iHHJ
 Jy:%&&**,,1111Jy:%&&**,,11114Y	JJJJy:%&&**,,1111L!!!!!|j())--//1444444rS   c                     | j         }t          |          dk    rt          d | D                       S t          d | D                       S )Nr]   c              3   4   K   | ]}t          |          V  d S rN  )tuplifyrV   s     rP   rQ  ztuplify.<locals>.<genexpr>J  s(      //cWS\\//////rS   c              3      K   | ]}|V  d S rN  rL   )rN   rs     rP   rQ  ztuplify.<locals>.<genexpr>M  s      NN1QNNNNNNrS   )rh   r  rU   )rk   rn  s     rP   r^  r^  E  sO    	A
1vvzz//Q////// NNNNN"""rS   c                  :   t           j                            d          } |                     d          }t	          |          }|                     d          }t	          |          }t          ||          \  }}t          ||           t          ||           d S r)  )r`   ra   rb   rc   r^  r   r4   )rj   r   	XA_tuplesr  	XB_tuplesrH  rI  s          rP   test_check_tuple_inputrd  P  s    
)


"
"C			6	"	"BI			6	"	"BI29iHHJ
y*---y*-----rS   c                  (   t          j        t          j        d          d                              t           j                  } t          j        t          j        d          d                              t           j                  }t          | d           \  }}|j        t           j        k    sJ t          | |          \  }}|j        t           j        k    sJ |j        t           j        k    sJ t          |                     t                    |          \  }}|j        t          k    sJ |j        t          k    sJ t          | |                    t                              \  }}|j        t          k    sJ |j        t          k    sJ d S rD  )r`   rG  rc  rd   r  r   re   r   rN  s       rP   test_check_preserve_typerf  \  sZ   	29R==&	)	)	0	0	<	<B	29R==&	)	)	0	0	<	<B22t<<J
rz)))) 32r::J
rz))))rz)))) 3299U3C3CRHHJ
u$$$$u$$$$ 32ryy7G7GHHJ
u$$$$u$$$$$$rS   r   
seuclideanmahalanobisdist_functionc           
      v   t          d          5  t          j                            d          }|                    d          }t          t          ||                    }t          j        t           ||||                               }t          ||           d d d            d S # 1 swxY w Y   d S )Nr   )rD  r   r  rD   r   )
r   r`   ra   rb   rc   r   r
   rH  rU   r2   )r   rE   ri  rj   rk   expected_distr/  s          rP   +test_pairwise_distances_data_derived_paramsrl  t  s     
s	+	+	+ - -i##A&&i(("56#:#:#:;;y}}QvfMMMNNOOm,,,- - - - - - - - - - - - - - - - - -s   BB..B25B2c                 ,   t           j                            d          }|                    d          }|                    d          }t	          j        t          d|  d          5  t          |||            d d d            d S # 1 swxY w Y   d S )Nr   r  z+The '(V|VI)' parameter is required for the z metricr   rD   )r`   ra   rb   rc   r   r   r   r#   )rE   rj   rk   rn   s       rP   1test_pairwise_distances_data_derived_params_errorrn    s     )


"
"C)$$A)$$A	LVLLL
 
 
 0 0 	1a////	0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0s   )B		BB)
braycurtiscanberra	chebyshevcorrelationhammingrh  r	   rg  r  r   r   rC   y_is_xzY is Xz
Y is not Xc           	         t           j                            d          }|                    d                              |d          }i }|r!|}t          t          ||                     }n|                    d                              |d          }t          |||           }| dk    r9dt          j        t          j	        ||g          ddt           j
        	          i}nW| d
k    rQdt           j                            t          j        t          j	        ||g          j                            j        i}t          ||fd| i|}t!          ||           d S )Nr   r>   FrA   rD   rg  Vr]   )r  ddofre   rh  VIrE   )r`   ra   rb   rc   rd   r   r
   r   varrH  r   r   invcovr  r#   r2   )	rE   ri   rt  rj   rk   r  rn   rk  r/  s	            rP   )test_numeric_pairwise_distances_datatypesr|    sU   6 )


"
"C&!!((E(BBAF 
J"56#:#:#:;;f%%,,\,FFa6222\!!26")QF"3"3!!2:VVVWFF}$$BIMM"&Aq61B1B1D*E*EFFHIFa<<6<V<<DD-(((((rS   pairwise_distances_funcc                     ddgdt           j        gddgddgg} | ||d          }t          j        |                                          rJ dS )	z8Check that `nan_euclidean` is lenient with `nan` values.r   r]   rG   r   r?   rI   rD   N)r`   rf   isnanany)r}  rk   outputs      rP   test_nan_euclidean_supportr    sc     Q!RVq!fq!f-A$$Q/BBBFx##%%%%%%%rS   c                     t           j        t           j        gt           j        t           j        gt           j        t           j        gg} t          | | d          }ddgddgddgg}t          ||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.
    rI   rD   r   N)r`   rf   r$   r2   )X_nan
argmin_nanX_constargmin_consts       rP   (test_nan_euclidean_constant_input_argminr    s    
 fbf/"&"&1ABE*5%PPPJ1v1v1v&G,WgoVVVLJ-----rS   zX,Y,expected_distance)r
  ababc)r  r   r   )r   r  r   )r   r   r  r
  r  r  r   r   c                 P    d }t          | ||          }t          ||           dS )z8Check pairwise_distances with lists of strings as input.c                 d    t          j        t          |           t          |          z
            S rN  )r`   r  r  r   s     rP   dummy_string_similarityzLtest_pairwise_dist_custom_metric_for_string.<locals>.dummy_string_similarity  s"    vc!ffs1vvo&&&rS   )rk   rn   rE   N)r#   r2   )rk   rn   expected_distancer  actual_distances        rP   +test_pairwise_dist_custom_metric_for_stringr    s?    $' ' ' )1:QRRROO%677777rS   c                      d } t          j        g dg dg dgt                    }t          j        g dg dg dg          }t          || 	          }t	          ||           d
S )zjCheck that pairwise_distances does not convert boolean input to float
    when using a custom metric.
    c                 f    d| |z                                   | |z                                   z  z
  S )Nr]   )r   )v1v2s     rP   dummy_bool_distzBtest_pairwise_dist_custom_metric_for_bool.<locals>.dummy_bool_dist  s*    BG==??b2g]]__444rS   )r]   r   r   r   )r]   r   r]   r   )r]   r]   r]   r]   r   )r  r\         ?)r\   r  r\   )r  r\   r  )rk   rE   N)r`   r   r   r#   r2   )r  rk   r  r  s       rP   )test_pairwise_dist_custom_metric_for_boolr    s    
5 5 5 	,,,lll;4HHHAOO	
  )1_EEEOO%677777rS   c                      | t          j        d                    g} | t          j        d                    g} t          dd          d t          ||          D                        d S )Nr   rG   r   )r   
max_nbytesc              3   X   K   | ]%\  }} t          t                    ||          V  &d S rN  )r<   r   )rN   m1m2s      rP   rQ  z9test_sparse_manhattan_readonly_dataset.<locals>.<genexpr>  sM       % %17R$#$$R,,% % % % % %rS   )r`   r3  r;   zip)r   	matrices1	matrices2s      rP   &test_sparse_manhattan_readonly_datasetr    s     rwv//0Irwv//0I %HA!$$$ % %;>y);T;T% % %     rS   )rC   )r   typesr   numpyr`   r   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._array_apir,   r-   r.   r/   r0   sklearn.utils._testingr1   r2   r3   r4   r5   sklearn.utils.fixesr6   r7   r8   r9   r:   sklearn.utils.parallelr;   r<   ru   markparametrizer   r   DeprecationWarningr   r   r   r   rc  rd   _minkowski_kwdsr   r   r  r   r   r   r   r   r   r   r  itemsr	  r  thread_unsafer:  r?  rJ  rS  re  r   r   rx  r  r  r  filterwarningsr  r   r  r  r  r  r  r  r  r  paramxfailr  r  infr  r  rf   r  r  r  r  r  r  r  r  r  r#  r'  r*  r1  r4  r6  r>  rB  rJ  rO  rT  rV  r[  r^  rd  rf  rl  rn  r|  r  r  r  r  r  rL   rS   rP   <module>r     s                     ! ! ! ! ! !                # " " " " " 4 4 4 4 4 4                                                             > , + + + + +                                        5 4 4 4 4 4 4 4L L L^ )--//'   
 #G#G#GHH' ' IH 'B .99.99.99.99>< >< :9 :9 :9 :9><F ,---#=>>: : ?> .-:<2 2 2 "46F!GHH% % IH%:F F F "	!Q..xe.DD1MMO O O 	["-	
 	

 
<(A7	.#? $ 2:rz3"?@@  A@% & )--//'   
 	["-	["-	<(A7	.#?	;#7	 	5 5	 	 5BI I I TTT  .99  :9	 
> )--//'   
 TTT ' '	  'D  &
7 
7 
7 )?)9)?)A)ABB.99& & :9 CB&*  , .99.99vA vA :9 :9 vAr  7 7 7"
4 
4 
4   $$++
 ,    -   ( ) ( ) 54(	
 :90	

 
!	 *.QRNA	
  H	
 ,+<	
- > ? >7 7 7 7  #EFF? ? GF? #EFF7 7 GF7 NOO! ! PO!H XJ		HHHHHH   
 XJ		HHHHHH   
% %  % XJ		HHHHHH   
% % 
%@ tUm44  54 E E ED XJ		HHHHHH   
 XJ		HHHHHH   
+ +  +* XJ		HHHHHH   
+ + 
+$ '8'8'899XJ		HHHHHH   
 XJ		HHHHHH   
4 4   :94( '8'8'899XJ		HHHHHH   
4 4  :94" 	T4 J+##+M#NN		
 	
 	
  G--	4 	4 .- 	4 T5M223 3 323 xrx"&!661rvg,8P8PQRRxrx"&!661rvg,8P8PRVWXX) ) YX SR) 	Aq6Aq6"	#	#WRWQZZ8	Aq6Arv;'	(	('"'!**bf=	BFA;BF,	-	-rvrv>	BFA;,	-	-wrwqzz26B	Arv;BF,	-	-wrwqzz26B	Aq6Aq6"	#	#WRWQZZ4	Aq6Ar7#	$	$gbgajj"5	B7QG$	%	%rvr2	B7RG$	%	%wrwqzz26	Ar7QG$	%	%wrwqzz26 - - -  262,77	$ 	$ 87	$ 262,771 1 871h 262,77  87(  <  6# # ## # ## # #31 31 31l 
 
   
 
  
 
 .99  :9
 
C C C- - -	/ 	/ 	/ +< =>  .99& & :9	 
&* .99    :9 (' ' '' ' ' 	$ 	$ 	$& & & .995 5 :95,# # #	. 	. 	.% % %0 Aq6**L-#@AA(*DE 
- 
-  BA +*

- L-#@AA0 0 BA0    " D%=x6NOO) ) PO# $)> 24QR & &	 &. . .  __ooo?	
 $K3Z#sc3Z0	
 8 8 88 8 82 .99  :9   rS   