
    Ug                        d dl Z d dlm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 n# e$ r	 d dlmZ Y nw xY w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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/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7m8Z8m9Z9m:Z: d dl;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZB d dlCmDZDmEZE d ZFejG        H                    de=          ejG        H                    de>          ejG        H                    de<          ejG        H                    de?          d                                                 ZIejG        H                    de          d             ZJd ZKejG        H                    de,e0g          d             ZLd ZM ejN        dd          O                    dd          dd ZP ejN        dd          O                    dd          dd ZQd! ZRejG        H                    d"e,d#i f ejS        e,eeP           ejS        e,d$eP           ejS        e,eeQejG        T                    eB eAd%          k    d&'          (           ejS        e,d)eQejG        T                    eB eAd%          k    d&'          (          e0d*d+dife0eRd,d-ifg          ejG        H                    d.ejU        ejV        eWg          d/                         ZXd0 ZYejG        H                    dg d1          ejG        H                    de?          d2                         ZZd3 Z[d4 Z\ejG        H                    d5 ej]                              ejG        H                    de?          d6                         Z^d7 Z_ejG        H                    d8e@          ejG        H                    de?          d9                         Z`d: Zad; Zbd< ZcejG        H                    d=d> d? d@ gdA e?D             z   dB e@D             z             dC             ZdejG        H                    dDdE eedFfdG eedHfdI eedJfdK efdLfdM efdNfdO efdPfg          dQ             ZgddRZhejG        H                    ddS          dT             ZiejG        H                    ddS          dU             Zje:dV             ZkejG        H                    dWejl        ge?z   dXgdY e?D             z   Z          ejG        H                    d[ejl        ge?z   dXgd\ e?D             z   Z          d]                         ZmejG        H                    d[ejl        ge?z   dXgd^ e?D             z   Z          d_             ZnejG        H                    d`dadg          db             Zodc ZpejG        H                    dWejl        ge?z   dXgdd e?D             z   Z          ejG        H                    d[ejl        ge?z   dXgde e?D             z   Z          df                         ZqejG        H                    dWejl        ge?z   dXgdg e?D             z   Z          dh             ZrejG        H                    dig dj          ejG        H                    dWejl        ge?z   dXgdk e?D             z   Z          ejG        H                    d[ejl        ge?z   dXgdl e?D             z   Z          dm                                     ZsejG        H                    dig dj          ejG        H                    dWejl        ge?z   dXgdn e?D             z   Z          do                         ZtejG        H                    dpejV        dqdrf ejS        ejU        dsdtejG        u                    du'          (          g          ejG        H                    dvddwg          dx                         ZvejG        H                    dydadg          dz             ZwejG        H                    d{ ejl        ejx        d gg           ejl        d ejx         gg          g          ejG        H                    d| ejl        ejx        d gg           ejl        d ejx         gg          dg          d}                         ZyejG        H                    d~ ejl        d dgdd gg           ejz        d          ej{        f ejl        d dgdej{        gg           ejz        d          ej{        f ejl        ej{        dgdej{        gg          ej{        ej{        f ejl        ej{        dgej{        d gg           ejz        d          ej{        f ejl        d ej{        gdej{        gg           ejz        d          ej{        f ejl        d dgdd gg           ejz        d          df ejl        d dgddgg           ejz        d          df ejl        ddgddgg          ej{        df ejl        ddgdd gg           ejz        d          df ejl        d dgddgg           ejz        d          dfg
          d             Z|ejG        H                    dej{        dg          d             Z}ejG        H                    dej{        dg          d             Z~ejG        H                    dej{        dg          d             Zd Zd Zd Zd Zd Zd ZejG        H                    de%e1e2e$e3e!f          d             ZejG        H                    de%e1e2e$e3e!f          ejG        H                    de?          d                         Zd Zd Zd ZejG        H                    dde%fde!fg          ejG        H                    de?          d                         ZejG        H                    de?          d             Zd Zd Zd Zd ZejG        H                    de?          d             Zd Zd Zd ZejG        H                    dddg          ejG        H                    dddg          ejG        H                    de,e/g          d                                     ZejG        H                    dddg          d             ZejG        H                    dg d          ejG        H                    ddadgddgZ          d                         ZejG        H                    dg ddg dg dg dgfg dddgddgddgddggfg          d             Zd ZejG        H                    de?          d             ZdS )    N)GeneratorType)linalg)issparse)cdist	cityblockcosine	minkowskipdist
squareform)
wminkowski)r	   )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parse_version
sp_version)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  rI   .0vs     b/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/sklearn/metrics/tests/test_pairwise.py
<listcomp>zEtest_pairwise_distances_for_dense_data.<locals>.<listcomp>.<listcomp>j       ,,,1Q,,,    tuplerK   rows     rM   rN   z:test_pairwise_distances_for_dense_data.<locals>.<listcomp>j   /    ;;;#e,,,,,--;;;rP   c                 @    g | ]}t          d  |D                       S )c                     g | ]}|S rI   rI   rJ   s     rM   rN   zEtest_pairwise_distances_for_dense_data.<locals>.<listcomp>.<listcomp>k   rO   rP   rQ   rS   s     rM   rN   z:test_pairwise_distances_for_dense_data.<locals>.<listcomp>k   rU   rP   r<   rD         ?rD      	haversine)rD   rD   r   	manhattanr   )nprandomRandomStaterandom_sampleastyper$   r   r-   dtypenanr   rR   pir   r   shaper   )global_dtyperngXSS2YX_maskedY_maskedS_masked	S2_maskedX_tuplesY_tupless               rM   &test_pairwise_distances_for_dense_datarr   M   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rP   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;   Fr>   rC   r@   rA   r   r\   p       @rB   r	   )r]   r^   r_   r`   ra   r$   r   r-   rb   r   r   float64pytestraisesAssertionErrorr	   	TypeError)rs   rt   ru   rv   rf   rg   rh   rk   X_sparseY_sparseri   rj   kwdss                rM   '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rB   c           	         t           j                            d          }|                    dd          }|                                }d|d         z
  |d<   t          t                    5  |d fD ]K}t          |||           }t          j        |dddd	           t          j	        |dk              dk    sJ L	 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=   rZ   rE   )categoryrA   F)rc   posinfneginfr?   z+Data was converted to boolean for metric %smatchrk   rB   error)r]   r^   r_   randnr?   r0   r   r$   
nan_to_numsumr{   warnsra   boolwarningscatch_warningssimplefilter)rB   rg   rh   rk   Zresmsgs          rM   test_pairwise_boolean_distancer      s    )


"
"C		!QA	A!D'kAdG 
"7	8	8	8 ) )T 	) 	)A$Q&999CM#1QquEEEE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6DDD:+E11E58E5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	   rA   )	r]   r^   r_   r   r   r   r   r   r$   )rg   rh   s     rM   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<      precomputedrA   )r=   r=   )r=   r   r<   r<   )r   r   rZ   intrb   f      ?)
r{   r|   
ValueErrorr]   zerosarrayrb   kind
isinstancendarray)r   ri   rj   s      rM   test_pairwise_precomputedr   	  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   rA   )r{   r|   r   r$   r]   fullrI   rP   rM   &test_pairwise_precomputed_non_negativer   '  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rZ   r<   doubleFr>   )wrx   c                     t          t          j        |           t          j        |          fi |}|                                S N)r*   r]   
atleast_2ditem)xyr   Ks       rM   callable_rbf_kernelr   1  s:    2=##R]1%5%5>>>>A6688OrP   zfunc, metric, kwdsr@   r	   z1.6.0z;wminkowski is now minkowski and it has been already tested.)reason)marksr   
polynomialdegreegamma皙?rb   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=   rZ   rB   n_jobsrD   )r]   r^   r_   r   r`   r-   )	r   rB   r   rb   rg   rh   rk   ri   rj   s	            rM   test_pairwise_parallelr   8  s
   L )


"
"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rP   c                  F    t          dggd           d         dk    sJ d S )Nr   c                     dS )Nr<   rI   r   r   s     rM   <lambda>z9test_pairwise_callable_nonstrict_metric.<locals>.<lambda>o  s    1 rP   rA   rE   r<   )r$   rI   rP   rM   'test_pairwise_callable_nonstrict_metricr   k  s3     ugnn===dCqHHHHHHrP   )rbf	laplacian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;   rC   rA   r   rk   c                 @    g | ]}t          d  |D                       S )c                     g | ]}|S rI   rI   rJ   s     rM   rN   z4test_pairwise_kernels.<locals>.<listcomp>.<listcomp>  rO   rP   rQ   rS   s     rM   rN   z)test_pairwise_kernels.<locals>.<listcomp>  rU   rP   c                 @    g | ]}t          d  |D                       S )c                     g | ]}|S rI   rI   rJ   s     rM   rN   z4test_pairwise_kernels.<locals>.<listcomp>.<listcomp>  rO   rP   rQ   rS   s     rM   rN   z)test_pairwise_kernels.<locals>.<listcomp>  rU   rP   )r   r   )r]   r^   r_   r`   r   r(   r-   rR   )rB   rv   rg   rh   rk   functionK1K2rp   rq   r   r   s               rM   test_pairwise_kernelsr   s  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rP   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;   rC   r   r   r   rk   )r]   r^   r_   r`   r   r(   r*   r-   )rg   rh   rk   rB   r   r   r   s          rM   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rP   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;   rC   r   r   z:))r   blablar   T)rB   filter_paramsrB   )
r]   r^   r_   r`   r*   r(   r-   r{   r|   r~   )rg   rh   rk   r   paramsr   s         rM   "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;   rA   )r]   r^   r_   r`   r!   r-   r   diag)
rB   r   rv   rg   rh   rk   ri   rj   S3	distancess
             rM   test_paired_distancesr     s     )


"
"C&!!A&!!AAf---A	aBAr	mmAa 0 0	1	1BAr,,, 071==	GI&&		1%%%%% -,rP   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;   Fr>   r\   rA   c                 X    t          j        | |z
                                d          S )Nr   axis)r]   absr   r   s     rM   r   z0test_paired_distances_callable.<locals>.<lambda>  s#    BF1q5MM4E4E14E4M4M rP   r   )
r]   r^   r_   r`   ra   r!   r-   r{   r|   r   )rf   rg   rh   rk   ri   rj   s         rM   test_paired_distances_callabler     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   rZ   r   r   rD   r=   r@   rA   sqeuclideansquaredT)rB   metric_kwargsr\   rx   r	   a      o   r   )r   rB   Hz>rtol)r]   asarrayr&   r%   r-   typer   r	   r^   r_   r   r$   argminrangelenr/   asfortranarray)r   rv   rf   rh   rk   XspYspexpected_idxexpected_valsexpected_vals_sqidxvalsidx2idxspvalsspidxsp2vals2idx3idx4rg   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                                  rM   "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  *,?@@@@@rP   c                     | d d d df         S )Nd   rI   r
  starts     rM   _reduce_funcr  ]  s    4C4=rP   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=   Fr>   r        >reduce_funcworking_memoryrZ   r   atol)r]   r^   r_   r`   ra   r$   r'   r  r   r   listr   rb   r-   vstack)rf   rg   rh   ri   S_chunkss        rM   &test_pairwise_distances_chunked_reducer%  a  s    
)


"
"C(##**<e*DDA1aaa#g&A)	4\&  H h.....H~~Hx==1A;'''' BIh''666666rP   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=   Fr>   c                     d S r   rI   r  s     rM   r   z=test_pairwise_distances_chunked_reduce_none.<locals>.<lambda>w  s     rP   r  r  rZ   c              3      K   | ]}|d u V  	d S r   rI   )rK   chunks     rM   	<genexpr>z>test_pairwise_distances_chunked_reduce_none.<locals>.<genexpr>|  s&      33u}333333rP   )r]   r^   r_   r`   ra   r'   r   r   r"  r   all)rf   rg   rh   r$  s       rM   +test_pairwise_distances_chunked_reduce_noner.  r  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3rP   good_reducec                      t          |           S r   r"  Dr  s     rM   r   r     s    a rP   c                 *    t          j        |           S r   )r]   r   r2  s     rM   r   r     s    ! rP   c                 >    t          |           t          |           fS r   r1  r2  s     rM   r   r     s    $q''477+ rP   c                     g | ]}|fd S )c                      ||           S r   rI   )r3  r  scipy_csr_types      rM   r   z<listcomp>.<lambda>  s    q8I8I rP   rI   )rK   r8  s     rM   rN   rN     s1        )7III  rP   c                     g | ]}|fd S )c                 \     ||           t          j        |           t          |           fS r   )r]   r   r"  )r3  r  scipy_dok_types      rM   r   z<listcomp>.<lambda>  s*    N1HQKKGG9
 rP   rI   )rK   r;  s     rM   rN   rN     s9         )7 	
 	
 	
  rP   c                     t          j        d                              dd          }t          |d | d          }t	          |           d S )Nr(  r   rZ   @   r  )r]   arangereshaper'   next)r/  rh   r$  s      rM   ,test_pairwise_distances_chunked_reduce_validrA    sO    * 		"b!$$A)	4[  H 	NNNNNrP   )
bad_reduceerr_typemessagec                 >    t          j        | | dd          g          S Nr   r]   concatenater3  ss     rM   r   r     s    AbccF44 rP   zlength 11\..* input: 10\.c                 B    | t          j        | | dd          g          fS rF  rG  rI  s     rM   r   r     s!    !R^Q"##K889 rP   z!length \(10, 11\)\..* input: 10\.c                     | d d         | fS )N	   rI   rI  s     rM   r   r     s    q!uaj rP   z length \(9, 10\)\..* input: 10\.c                     dS )N   rI   rI  s     rM   r   r     s     rP   z2returned 7\. Expected sequence\(s\) of length 10\.c                     dS )N)rO     rI   rI  s     rM   r   r     s     rP   z9returned \(7, 8\)\. Expected sequence\(s\) of length 10\.c                 .    t          j        d          dfS )Nr(  rM  )r]   r>  rI  s     rM   r   r     s    ")B--+ rP   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   rZ   Fr>   r=  r  r   )r]   r>  r?  ra   r'   r{   r|   r@  )rf   rB  rC  rD  rh   r$  s         rM   .test_pairwise_distances_chunked_reduce_invalidrT    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r  rB   rQ  g      >i   rA   r   r   )r'   r   r   r"  r   nbytesmaxr]   r#  r$   r-   )
rh   rk   r  rB   genblockwise_distancesmin_block_mibblockmemory_usedri   s
             rM    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6rP   )r@   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scaleFr>   rZ   rV  绽|=r   )r]   r^   r_   normalra   r"  r'   r   r-   r   r#  )rB   rf   rg   rh   chunkss        rM   (test_pairwise_distances_chunked_diagonalrj    s    
)


"
"C


$
//66|%6PPA,QqPPPQQFv;;????BGBIf--..>>>>>>rP   c                    t           j                            d          }|                    dd                              |d          }t          || d          }t          t          j        |          dd	
           d S )Nr   ra  rc  rd  Fr>   rD   r   rg  r   )r]   r^   r_   rh  ra   r$   r-   r   )rB   rf   rg   rh   r   s        rM   )test_parallel_pairwise_distances_diagonalrl    sx    
)


"
"C


$
//66|%6PPA"1VA>>>IBGI&&666666rP   c                    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=   Fr>   rZ   r@   rV  irD   )r  r=   i'  r   r  r   )r]   r^   r_   r`   ra   r^  r   tolistr$   r'   r   r   r@  r{   r|   StopIteration)rf   rg   rh   powerrk   r3  rY  s          rM   test_pairwise_distances_chunkedrr    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 rI   __name__rK   	containers     rM   rN   rN         HHHIY'HHHrP   )idsy_array_constrc                     g | ]	}|j         
S rI   rv  rx  s     rM   rN   rN     rz  rP   c                      | dgg          } |dgdgg          }t          ||          }t          |ddgg           d S Nr   rZ   rD   r   ry   )r   r-   )rs  r|  rh   rk   r3  s        rM   %test_euclidean_distances_known_resultr    sY     	uAaSz""AAq!!AAc
|$$$$$rP   c                     g | ]	}|j         
S rI   rv  rx  s     rM   rN   rN      rz  rP   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(  Fr>      r(  rD   rZ   r   r   X_norm_squaredY_norm_squaredr  r  )r]   r^   r_   r`   ra   rz   r   r?  r   r-   
zeros_liker{   r|   r}   )rf   r|  rg   rh   rk   	X_norm_sq	Y_norm_sqD1D2D3D4wrong_Ds               rM   #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  rD   rZ   r   r   r  r  r  )
r]   r^   r_   r`   ra   float32r   r?  r   r-   )global_random_seedr  rg   rh   rk   r  r  r  r  r  r  s              rM   &test_euclidean_distances_float32_normsr  B  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rP   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  rD   rZ   r   r  r   zIncompatible dimensions for Xr   r<   r  zIncompatible dimensions for Yr  )r]   r^   r_   r`   r   r   r?  r-   r{   r|   r   )rg   rh   rk   r  r  r  r  r  s           rM   $test_euclidean_distances_norm_shapesr  S  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 rI   rv  rx  s     rM   rN   rN   x  rz  rP   c                     g | ]	}|j         
S rI   rv  rx  s     rM   rN   rN   }  rz  rP   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(  Fr>   皙?r  ư>r   )	r]   r^   r_   r`   ra   r   r   r-   rb   )rf   rs  r|  rg   rh   rk   expectedr   s           rM   test_euclidean_distancesr  u  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******rP   c                     g | ]	}|j         
S rI   rv  rx  s     rM   rN   rN     rz  rP   c                 T   t           j                            d          }|                    d                              | d          }d||dk     <   t          t          |                    } ||          }t          |          }t          ||d           |j	        | k    sJ d S )Nr   r  Fr>   r  r  r   )
r]   r^   r_   r`   ra   r   r
   r   r-   rb   )rf   rs  rg   rh   r  r   s         rM   test_euclidean_distances_symr    s     )


"
"C)$$++Lu+EEAAa#gJ%((##HqA#A&&I Ixd3333?l******rP   
batch_size)Nr<   rO  e   c                     g | ]	}|j         
S rI   rv  rx  s     rM   rN   rN     rz  rP   c                     g | ]	}|j         
S rI   rv  rx  s     rM   rN   rN     rz  rP   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  rk   r  r  r   )r]   r^   r_   r`   ra   r  r   r   sqrtmaximumr-   )r  rs  r|  rg   rh   rk   r  r   s           rM   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3rP   c                     g | ]	}|j         
S rI   rv  rx  s     rM   rN   rN     rz  rP   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]   r^   r_   r`   ra   r  r   r
   r   r  r  r-   )r  rs  rg   rh   r  r   s         rM   #test_euclidean_distances_upcast_symr    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3rP   zdtype, eps, rtolg-C6?h㈵>g:0yE>gGz?z failing due to lack of precision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   r-   )rb   epsr   r  rh   rk   r   r  s           rM   '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3rP   r   c                    t           j                            d          }|                    dd          }|                    dd          }t	          |||           }t          |||           }t          ||           d S )N9  r   r=   )rk   r   )r]   r^   r_   r   r   r   r-   )r   rg   rh   rk   normal_distancenan_distances         rM   8test_nan_euclidean_distances_equal_to_euclidean_distancer    sy     )


%
%C		!QA		!QA)!q'BBBO*17CCCLO\22222rP   rh   rk   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)rh   rk   excinfoexp_msgs       rM   ,test_nan_euclidean_distances_infinite_valuesr    s     
z	"	" (gQ''''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( SGc'-((((((((s   8<<zX, X_diag, missing_valuerD   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  rD   )r]   r   r   r-   r?   )rh   X_diagmissing_valueexp_distr
  dist_sqdist_twodist_two_copys           rM    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,,,,,rP   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   rZ   r  )r]   r   rc   r   r-   r?   )r  rh   r  r
  s       rM   )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#####rP   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      @ry   g      @g      @g      @r  rZ   Tr  g      D@rD   Fg      9@r>   )r]   r   r   r.   Tr-   r  r?   )
r  rh   rk   r  r  r  r  D5D6D7s
             rM   '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rP   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   r-  r-   )r  rh   dist_squaredr
  s       rM   7test_nan_euclidean_distances_one_feature_match_positiver  q  s    
 	e]E2mZ?	
	 	A +	-  L 6,!#$$$$$"1]ERRRDD#rP   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  rg  r   ry   rb  i  r   )r]   r^   r_   r   randr#  r   r-   r-  diag_indices_fromre   )rg   r   XAr3  XBr  rh   s          rM   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(rP   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   rZ   rD   )r]   sincosarcsinr  )r   r   diff_latdiff_lonacs         rM   slow_haversine_distancesz:test_haversine_distances.<locals>.slow_haversine_distances  s    Q4!A$;Q4!A$;F8a<  A%F1Q4LL26!A$<<'"&A*>*>!*CC
 	"'!**%%%rP   r   rX   )r(  rD   c                 0    g | ]fd D             S )c                 (    g | ]} |          S rI   rI   )rK   r   r  r   s     rM   rN   z7test_haversine_distances.<locals>.<listcomp>.<listcomp>  s'    >>>q,,Q22>>>rP   rI   )rK   r   rk   r  s    @rM   rN   z,test_haversine_distances.<locals>.<listcomp>  s2    JJJ1>>>>>A>>>JJJrP   )r(  r   z-Haversine distance only valid in 2 dimensionsr   )
r]   r^   r_   r`   r   r   r-   r{   r|   r   )rg   rh   r  r  err_msgrk   r  s        @@rM   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"   r-   rh   rk   r3  s      rM   test_paired_euclidean_distancesr    E    
qc
A
qc
A"1a((AASz"""""rP   c                  b    dgdgg} dgdgg}t          | |          }t          |ddg           d S r  )r#   r-   r  s      rM   test_paired_manhattan_distancesr    r  rP   c                  b    dgdgg} dgdgg}t          | |          }t          |ddg           d S )Nr   rZ   rD   rY   )r    r-   r  s      rM   test_paired_cosine_distancesr    sE    
qc
A
qc
A1%%AASz"""""rP   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;   r'  r   r   rD   rZ   g333333?gffffff?r   g?rE   )r   rZ   )rZ   rZ   )rZ   r   r   )皙?r  g333333?)r]   r^   r_   r`   r   r   rb   float	enumerater   expr.   r/   r   r-  ra   r  int32isfiniter{   r|   r   )rg   rh   rk   K_addr   r   ir   jr   r   chi2_exps               rM   test_chi_square_kernelr     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]   r^   r_   r`   r-   r  )r  rg   rh   r   s       rM   test_kernel_symmetryr    sU     )


"
"C&!!Aq!AAqsBrP   c                     t           j                            d          }|                    d          } ||          } | ||          } | ||          }t	          ||           d S Nr   r;   )r]   r^   r_   r`   r-   )r  rv   rg   rh   r   r   r   s          rM   test_kernel_sparser     sq     )


"
"C&!!A}QHq!A	(	#	#BArrP   c                      t           j                            d          } |                     d          }t	          ||          }t          |j        d d d         d |D                        d S )Nr   r;      c                 <    g | ]}t          j        |          d z  S )rD   )r   norm)rK   r   s     rM   rN   z&test_linear_kernel.<locals>.<listcomp>:  s%    !A!A!A!&+a..A"5!A!A!ArP   )r]   r^   r_   r`   r   r-   flatrg   rh   r   s      rM   test_linear_kernelr  5  sj    
)


"
"C&!!AaAAF33Q3K!A!Aq!A!A!ABBBBBrP   c                      t           j                            d          } |                     d          }t	          ||          }t          |j        d d d         t          j        d                     d S )Nr   r;   r	  r<   )r]   r^   r_   r`   r*   r-   r  onesr  s      rM   test_rbf_kernelr  =  sc    
)


"
"C&!!A1aAAF33Q3K,,,,,rP   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<   rZ   )	r]   r^   r_   r`   r   r-   r   r  r-  r  s      rM   test_laplacian_kernelr  E  s    
)


"
"C&!!AAABGAJJ

+++ 6!a%==6!bgbgajj)))A-.......rP   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]   r^   r_   r`   r   r-   toarrayr(   )rB   pairwise_funcrv   rg   rh   rk   XcsrYcsrr   r   K3s              rM   &test_pairwise_similarity_sparse_outputr  Q  s     )


"
"C&!!A&!!A=D=D 
tT	6	6	6BB<< 
q!$	/	/	/B||BJJLL"%%% 
!q	0	0	0BBJJLL"%%%%%rP   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]   r^   r_   r`   r(   r,   r-   )
rv   rg   rh   rk   r  r  X_Y_r   r   s
             rM   test_cosine_similarityr  k  s     )


"
"C&!!A&!!A=D=Dt9q!ftTlT4LA    B bBx888r]]>2BbBx888B   rP   c                      t          j        t          j        d          d          } t          | d           \  }}||u sJ t	          | |           d S N(   r<   rQ  )r]   resizer>  r   r/   )r  
XA_checked
XB_checkeds      rM   test_check_dense_matricesr'    sX     
29R==&	)	)B22t<<J
####r:&&&&&rP   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 )Nr"  r#      r=   rQ  )r]   r$  r>  r   r/   r   r  r  r%  r&  s       rM   test_check_XB_returnedr,    s     
29R==&	)	)B	29R==&	)	)B22r::J
r:&&&r:&&&	29R==&	)	)B0R88J
r:&&&r:&&&&&rP   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<   rM  r)  r*  $   )r=   rM  )r]   r$  r>  r{   r|   r   r   r   r  r  s     rM   test_check_different_dimensionsr1    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 )Nr.  rM  r<   r)  r=   rQ  )r]   r>  r?  r{   r|   r   r   r0  s     rM   test_check_invalid_dimensionsr3    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]   r^   r_   r`   r   r   r   r   )	rv   rg   r  	XA_sparser  	XB_sparser%  r&  XA_2_checkeds	            rM   test_check_sparse_arraysr8    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4rP   c                     | j         }t          |          dk    rt          d | D                       S t          d | D                       S )NrZ   c              3   4   K   | ]}t          |          V  d S r   )tuplifyrS   s     rM   r,  ztuplify.<locals>.<genexpr>  s(      //cWS\\//////rP   c              3      K   | ]}|V  d S r   rI   )rK   rs     rM   r,  ztuplify.<locals>.<genexpr>  s      NN1QNNNNNNrP   )re   r   rR   )rh   rJ  s     rM   r;  r;    sO    	A
1vvzz//Q////// NNNNN"""rP   c                  :   t           j                            d          } |                     d          }t	          |          }|                     d          }t	          |          }t          ||          \  }}t          ||           t          ||           d S r  )r]   r^   r_   r`   r;  r   r/   )rg   r  	XA_tuplesr  	XB_tuplesr%  r&  s          rM   test_check_tuple_inputrA    s    
)


"
"C			6	"	"BI			6	"	"BI29iHHJ
y*---y*-----rP   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 r!  )r]   r$  r>  ra   r  r   rb   r  r+  s       rM   test_check_preserve_typerC    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$$$$$$rP   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   )r  r   r  rA   r   )
r   r]   r^   r_   r`   r   r
   r#  rR   r-   )r   rB   rF  rg   rh   expected_distr
  s          rM   +test_pairwise_distances_data_derived_paramsrI    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   rA   )r]   r^   r_   r`   r{   r|   r   r$   )rB   rg   rh   rk   s       rM   1test_pairwise_distances_data_derived_params_errorrK    s     )


"
"C)$$A)$$A	Q&QQQ
 
 
 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hammingrE  r	   rD  r   r   r   r@   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;   Fr>   rA   rD  VrZ   )r   ddofrb   rE  VIrB   )r]   r^   r_   r`   ra   r   r
   r   varr#  rz   r   invcovr  r$   r-   )	rB   rf   rQ  rg   rh   r   rk   rH  r
  s	            rM   )test_numeric_pairwise_distances_datatypesrY    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-(((((rP   zX,Y,expected_distance)r  ababc)r  r   ry   )r   r  r   )ry   r   r  r  rZ  r  r   ry   c                 P    d }t          | ||          }t          ||           dS )z8Check pairwise_distances with lists of strings as input.c                 d    t          j        t          |           t          |          z
            S r   )r]   r   r   r   s     rM   dummy_string_similarityzLtest_pairwise_dist_custom_metric_for_string.<locals>.dummy_string_similarity]  s"    vc!ffs1vvo&&&rP   )rh   rk   rB   N)r$   r-   )rh   rk   expected_distancer^  actual_distances        rM   +test_pairwise_dist_custom_metric_for_stringra  K  s?    $' ' ' )1:QRRROO%677777rP   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 )NrZ   )r   )v1v2s     rM   dummy_bool_distzBtest_pairwise_dist_custom_metric_for_bool.<locals>.dummy_bool_disti  s*    BG==??b2g]]__444rP   )rZ   r   r   r   )rZ   r   rZ   r   )rZ   rZ   rZ   rZ   r   )r  rY         ?)rY   r  rY   )rg  rY   r  )rh   rB   N)r]   r   r   r$   r-   )rf  rh   r_  r`  s       rM   )test_pairwise_dist_custom_metric_for_boolrh  d  s    
5 5 5 	,,,lll;4HHHAOO	
  )1_EEEOO%677777rP   c                      | t          j        d                    g} | t          j        d                    g} t          dd          d t          ||          D                        d S )Nr   rD   r   )r   
max_nbytesc              3   X   K   | ]%\  }} t          t                    ||          V  &d S r   )r9   r   )rK   m1m2s      rM   r,  z9test_sparse_manhattan_readonly_dataset.<locals>.<genexpr>  sM       % %17R$#$$R,,% % % % % %rP   )r]   r  r8   zip)rv   	matrices1	matrices2s      rM   &test_sparse_manhattan_readonly_datasetrq  {  s     rwv//0Irwv//0I %HA!$$$ % %;>y);T;T% % %     rP   )r@   )r   typesr   numpyr]   r   scipy.sparser   scipy.spatial.distancer   r   r   r	   r
   r   r   ImportErrorr{   sklearnr   sklearn.exceptionsr   sklearn.metrics.pairwiser   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   sklearn.preprocessingr,   sklearn.utils._testingr-   r.   r/   r0   sklearn.utils.fixesr1   r2   r3   r4   r5   r6   r7   sklearn.utils.parallelr8   r9   rr   markparametrizer   r   r   r   r   r>  ra   _minkowski_kwds_wminkowski_kwdsr   paramskipifrz   r  r   r   r   r   r   r   itemsr   r   r  r  r%  r.  rA  r   r~   rT  r^  rj  rl  rr  r   r  r  r  r  r  r  r  r  xfailr  r  infr  r  rc   r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r'  r,  r1  r3  r8  r;  rA  rC  rI  rK  rY  ra  rh  rq  rI   rP   rM   <module>r     s_                    ! ! ! ! ! !               ?1111111 ? ? ? ?>>>>>>>?
  " " " " " " 4 4 4 4 4 4                                                             > , + + + + +                             5 4 4 4 4 4 4 4L L L^ .99.99.99.99>< >< :9 :9 :9 :9><B #=>>: : ?>:<2 2 2 "46F!GHH% % IH%:F F F "	!Q..xe.DD1MM"1a//u/EEANN    	["-	
 	

 		
 	

 	+$$mmG444T %  		
 	
 	
 	+$$mmG444T %  		
 	
 	
 
<(A7	.#?? # #H 2:rz3"?@@  A@I# #JI I I TTT  .99  :9	 
>  &
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 ! ! !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# $)>  __ooo?	
 $K3Z#sc3Z0	
 8 8 88 8 8. .99  :9  s   3 A A