a
    .'a                     @   sd  d dl Z d dlmZmZmZmZmZmZ d dlm	Z
 d dlZd dlmZ d dlZd dlmZmZmZmZ d dlmZ d dlmZ d dlZejeegdd	d
 Zdd Zdd ZG dd dZeG dd deZeG dd deZeG dd deZeG dd deZ G dd dZ!G dd dZ"G dd dZ#eG dd  d e#Z$eG d!d" d"e#Z%eG d#d$ d$e#Z&eG d%d& d&e$Z'eG d'd( d(e$Z(eG d)d* d*e$Z)eG d+d, d,e%Z*eG d-d. d.e$Z+eG d/d0 d0e$Z,d1d2 Z-d3d4 Z.d5d6 Z/G d7d8 d8Z0eG d9d: d:e0Z1eG d;d< d<e0Z2eG d=d> d>e1Z3eG d?d@ d@e2Z4eG dAdB dBe1Z5eG dCdD dDe2Z6G dEdF dFZ7dGdH Z8dIdJ Z9dKdL Z:dMdN Z;G dOdP dPZ<eG dQdR dRe<Z=G dSdT dTZ>eG dUdV dVe>Z?dWdX Z@dYdZ ZAd[d\ ZBd]d^ ZCd_d` ZDdadb ZEdcdd ZFdedf ZGdgdh ZHdidj ZIdkdl ZJdmdn ZKdodp ZLdqdr ZMdsdt ZNdudv ZOdwdx ZPdydz ZQd{d| ZRd}d~ ZSejTjUe dkdddd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_ejT`dg ddd ZaeG dd dZbdd Zcdd Zddd ZeejT`deegdd ZfdS )    N)assert_equalassert_array_equalassert_assert_almost_equalassert_array_almost_equalassert_allclose)raises)python_implementation)KDTree	Rectangledistance_matrixcKDTree)cKDTreeNodeminkowski_distance)paramsc                 C   s   | j S N)Zparam)Zrequest r   >lib/python3.9/site-packages/scipy/spatial/tests/test_kdtree.pykdtree_type   s    r   c                 C   sp   | j dstdttfD ]N}| j dd d |j  }|t v rNtd| t|| fd|i}|t |< q| S )zClass decorator to create test cases for KDTree and cKDTree

    Tests use the class variable ``kdtree_type`` as the tree constructor.
    Z_Testz)Expected a class name starting with _Test   N_zDuplicated test name: r   )__name__
startswithRuntimeErrorr
   r   globalstype)ZklstreeZ	test_nameZ	test_caser   r   r   
KDTreeTest   s    
r   c                 C   sH   | | }||d| k  |8  < ||d| k   |7  < t |d|}|S )N      ?g      r   r   )abpboxsizediffdr   r   r   distance_box+   s
    r&   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )ConsistencyTestsc                 C   s   t |||S r   r   selfr    r!   r"   r   r   r   distance3   s    zConsistencyTests.distancec              	   C   s~   | j }| j|d\}}t|d t|| j|  d  d}tttj| j|tj	d d f  d dd|d | k d S )Nr      :0yE>Zaxis)
xkdtreequeryr   npsumdatar   allnewaxis)r)   r.   r%   iepsr   r   r   test_nearest6   s
    "zConsistencyTests.test_nearestc              	   C   s   | j }| j}| j||\}}t|}|t| }t|d t|| j	|  d  d}t
ttj| j	|tjd d f  d dd|d | k | d S )Nr+   r,   r   r-   )r.   mr/   r0   r1   amaxZargmaxr   r2   r3   r   r5   )r)   r.   r9   ddiir%   r6   r7   r   r   r   test_m_nearest=   s    
"zConsistencyTests.test_m_nearestc           	      C   s   | j }| j}| jj|| jj|d\}}d}d}t||D ]X\}}|tjkrLq8|d7 }t|d t	|| j
|  d  t||| k d||f  q8tt	| | j
|d|d | k | d S )Nkdistance_upper_boundr,   r   r   r+    near_d=%g should be less than %g)r.   r%   r/   r0   nzipr1   infr   r2   r3   r   r   r*   	r)   r.   r%   r;   r<   r7   hitsZnear_dZnear_ir   r   r   test_points_nearG   s    
"z!ConsistencyTests.test_points_nearc           	      C   s   | j }| j}| jj|| jjd|d\}}d}d}t||D ]P\}}|tjkrNq:|d7 }t|| 	|| j
| d t||| k d||f  q:tt| 	| j
|d|| k | d S )Nr   r?   r"   r@   r,   r   rA   )r.   r%   r/   r0   rB   rC   r1   rD   r   r*   r3   r   r   r2   rE   r   r   r   test_points_near_l1U   s    
z$ConsistencyTests.test_points_near_l1c           	      C   s   | j }| j}| jj|| jjtj|d\}}d}d}t||D ]R\}}|tjkrPq<|d7 }t|| 	|| j
| tj t||| k d||f  q<tt| 	| j
|tj|| k | d S )NrH   r,   r   r   rA   )r.   r%   r/   r0   rB   r1   rD   rC   r   r*   r3   r   r   r2   rE   r   r   r   test_points_near_linfc   s    
z&ConsistencyTests.test_points_near_linfc                 C   sV   | j }| j}d}| j||\}}| jj|||d\}}tt||d|  k d S )N皙?)r7   r   )r.   r?   r/   r0   r   r1   r4   )r)   r.   r?   r7   Zd_realZi_realr%   r6   r   r   r   test_approxq   s    zConsistencyTests.test_approxN)
r   
__module____qualname__r*   r8   r=   rG   rI   rJ   rL   r   r   r   r   r'   2   s   
r'   c                   @   s   e Zd Zdd ZdS )_Test_randomc                 C   s^   d| _ d| _tjd tj| j | j| _| j| jdd| _tj| j| _	d| _
d| _d S )Nd        r+   leafsize皙?
   )rB   r9   r1   randomseedrandnr3   r   r/   r.   r%   r?   r)   r   r   r   setup_method|   s    z_Test_random.setup_methodNr   rM   rN   r[   r   r   r   r   rO   z   s   rO   c                       s   e Zd Z fddZ  ZS )_Test_random_farc                    s"   t    tj| jd | _d S )NrV   )superr[   r1   rW   rY   r9   r.   rZ   	__class__r   r   r[      s    
z_Test_random_far.setup_methodr   rM   rN   r[   __classcell__r   r   r_   r   r]      s   r]   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )_Test_smallc                 C   s   t g dg dg dg dg dg dg dg dg| _| | j| _| jj| _| jj| _t jd	 t j	d
| _
d| _d| _d S )Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rR      r   rQ   )r1   arrayr3   r   r/   rB   r9   rW   rX   rY   r.   r%   r?   rZ   r   r   r   r[      s     


z_Test_small.setup_methodc                 C   s   t | jddd d S )Nr   r   rK   r   )rK   r   r   r/   r0   rZ   r   r   r   r8      s    z_Test_small.test_nearestc                 C   s$   t | jddddgddgf d S )Nrn   r+   rK   g?r   r   ro   rZ   r   r   r   test_nearest_two   s    z_Test_small.test_nearest_twoN)r   rM   rN   r[   r8   rp   r   r   r   r   rc      s   rc   c                       s   e Zd Z fddZ  ZS )_Test_small_nonleafc                    s    t    | j| jdd| _d S )Nr   rS   )r^   r[   r   r3   r/   rZ   r_   r   r   r[      s    
z _Test_small_nonleaf.setup_methodra   r   r   r_   r   rq      s   rq   c                   @   sV   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zej	
dddgdd Zdd ZdS )Test_vectorization_KDTreec                 C   sL   t g dg dg dg dg dg dg dg dg| _t| j| _d S 	Nrd   re   rf   rg   rh   ri   rj   rk   )r1   rm   r3   r
   r/   rZ   r   r   r   r[      s    
z&Test_vectorization_KDTree.setup_methodc                 C   s>   | j tg d\}}tt|t tt|tj d S Nrd   )	r/   r0   r1   rm   r   
isinstancefloatZ
issubdtypeZsignedintegerr)   r%   r6   r   r   r   test_single_query   s    z+Test_vectorization_KDTree.test_single_queryc                 C   s:   | j td\}}tt|d tt|d d S Nr+   rQ   rl   r+   rQ   r/   r0   r1   zerosr   shaperw   r   r   r   test_vectorized_query   s    z/Test_vectorization_KDTree.test_vectorized_queryc                 C   s   d}| j j| }| j jtg d|d\}}tt||f tt||f ttt	|| d    tt|| d  | j jk d S N   rd   r?   )
r/   rB   r0   r1   rm   r   r~   r   r4   isfiniter)   sZkkr%   r6   r   r   r   $test_single_query_multiple_neighbors   s     z>Test_vectorization_KDTree.test_single_query_multiple_neighborsc              
   C   s   d}| j j| }| j jtd|d\}}tt|dd|f tt|dd|f ttt	|d d d d | d f   tt|d d d d | d f | j jk d S Nr   rz   r   r+   rQ   
r/   rB   r0   r1   r}   r   r~   r   r4   r   r   r   r   r   (test_vectorized_query_multiple_neighbors   s    .zBTest_vectorization_KDTree.test_vectorized_query_multiple_neighborsrg?皙?c                 C   s   t jd t j| jj}tjtdd& | jj	|d |d\}}W d    n1 sV0    Y  t
|tsnJ t
|ts|J tt ||kd tdd t||dd  D sJ t|t|| jj|d d f  t|| jj}tt|||k d	  d S )
NrR   k=Nonematchr>   Tc                 s   s   | ]\}}||kV  qd S r   r   .0r    r!   r   r   r   	<genexpr>       zLTest_vectorization_KDTree.test_single_query_all_neighbors.<locals>.<genexpr>r   r   )r1   rW   rX   randr/   r9   pytestwarnsDeprecationWarningr0   ru   listr   rm   r4   rC   r   r   r3   sortednonzero)r)   r   Zpointr%   r6   distr   r   r   test_single_query_all_neighbors   s    4$z9Test_vectorization_KDTree.test_single_query_all_neighborsc           	      C   s*  d}d}t jd t jjg || jjR  }tjtdd& | jj	|d |d\}}W d    n1 sh0    Y  t
t || t
t || t |D ]}|| ||  }}t|tsJ t|tsJ tt ||kd tdd	 t||d
d  D sJ t|t|| | jj|  qd S )Nr{   r   rR   r   r   r>   Tc                 s   s   | ]\}}||kV  qd S r   r   r   r   r   r   r      r   zPTest_vectorization_KDTree.test_vectorized_query_all_neighbors.<locals>.<genexpr>r   )r1   rW   rX   r   r/   r9   r   r   r   r0   r   r~   Zndindexru   r   r   rm   r4   rC   r   r   r3   )	r)   Zquery_shaper   pointsr%   r6   idxr   indr   r   r   #test_vectorized_query_all_neighbors   s&    4&z=Test_vectorization_KDTree.test_vectorized_query_all_neighborsN)r   rM   rN   r[   rx   r   r   r   r   markparametrizer   r   r   r   r   r   rr      s   		
rr   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )Test_vectorization_cKDTreec                 C   sL   t g dg dg dg dg dg dg dg dg| _t| j| _d S rs   )r1   rm   r3   r   r/   rZ   r   r   r   r[     s    
z'Test_vectorization_cKDTree.setup_methodc                 C   s4   | j g d\}}tt|t tt|t d S rt   )r/   r0   r   ru   rv   intrw   r   r   r   rx     s    z,Test_vectorization_cKDTree.test_single_queryc                 C   s:   | j td\}}tt|d tt|d d S ry   r|   rw   r   r   r   r     s    z0Test_vectorization_cKDTree.test_vectorized_queryc                 C   s^   t jd t jddj}| j|\}}t|||D ] \}}}t| j|||f q8d S )NrR   rl     )	r1   rW   rX   rY   Tr/   r0   rC   r   )r)   ZqsdsZi_sqr%   r6   r   r   r   *test_vectorized_query_noncontiguous_values  s
    zETest_vectorization_cKDTree.test_vectorized_query_noncontiguous_valuesc                 C   s   d}| j j| }| j jg d|d\}}tt||f tt||f ttt|| d    tt|| d  | j jk d S r   )	r/   rB   r0   r   r1   r~   r   r4   r   r   r   r   r   r   "  s     z?Test_vectorization_cKDTree.test_single_query_multiple_neighborsc              
   C   s   d}| j j| }| j jtd|d\}}tt|dd|f tt|dd|f ttt	|d d d d | d f   tt|d d d d | d f | j jk d S r   r   r   r   r   r   r   +  s    .zCTest_vectorization_cKDTree.test_vectorized_query_multiple_neighborsN)	r   rM   rN   r[   rx   r   r   r   r   r   r   r   r   r     s   	r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	ball_consistency        c                 C   s   t |d |d |S N      ?r   r(   r   r   r   r*   7  s    zball_consistency.distancec                 C   s   t | j}t | j|jd d }| jj|| j| j| j	d}t
|D ]t\}}| | j| || | j|| d| j	   }| | j| || | j|| d| j	   }t|| j| k d qFd S )Nr"   r7   r   T)r1   
atleast_2dr.   broadcast_tor%   r~   r   query_ball_pointr"   r7   	enumerater*   r3   r   tol)r)   r.   r%   lr6   r   r   normr   r   r   test_in_ball:  s    ,,zball_consistency.test_in_ballc           	      C   s   t | j}t | j|jd d }| jj|| j| j| j	d}t
|D ]\}}t j| jjtd}d||< | | j| || | j|| d| j	   }| | j| || | j|| d| j	   }t|| j | kd qFd S )Nr   r   dtypeFr   T)r1   r   r.   r   r%   r~   r   r   r"   r7   r   onesrB   boolr*   r3   r   r   )	r)   r.   r%   r   r6   r   cr   r   r   r   r   test_found_allC  s    ,,zball_consistency.test_found_allN)r   rM   rN   r   r*   r   r   r   r   r   r   r   4  s   	r   c                   @   s   e Zd Zdd ZdS )_Test_random_ballc                 C   sZ   d}d}t jd t j||| _| j| jdd| _t j|| _d| _d| _	d| _
d S )	NrP   rQ   rR   r+   rS          @r   rU   )r1   rW   rX   rY   r3   r   r   r.   r"   r7   r%   r)   rB   r9   r   r   r   r[   P  s    z_Test_random_ball.setup_methodNr\   r   r   r   r   r   N  s   r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
_Test_random_ball_periodicc                 C   s   t |||dS r   r&   r(   r   r   r   r*   ^  s    z#_Test_random_ball_periodic.distancec                 C   s`   d}d}t jd t jj||fd| _| j| jddd| _t |d| _d	| _	d
| _
d| _d S )Ni'  rQ   rR   sizer+   r   rT   r#   rK   r   r   rU   )r1   rW   rX   uniformr3   r   r   Zfullr.   r"   r7   r%   r   r   r   r   r[   a  s    z'_Test_random_ball_periodic.setup_methodc                 C   s   | j j| jd | j| j| jd}|D ]0}t| | j| | j| j| jd| j  k q$| j j| jd | j| j| jd}|D ]0}t| | j| | j| j| jd| j  k qzd S )Nr   r   )	r   r   r.   r%   r"   r7   r   r*   r3   )r)   r   r6   r   r   r   test_in_ball_outsidel  s     . z/_Test_random_ball_periodic.test_in_ball_outsidec                 C   s   t j| jjtd}| jj| jd | j| j| j	d}d||< t
t | | j| | j| j| jd| j	  k | jj| jd | j| j| j	d}d||< t
t | | j| | j| j| jd| j	  k d S )Nr   r   r   F)r1   r   r   rB   r   r   r.   r%   r"   r7   r   r4   r*   r3   )r)   r   r   r   r   r   test_found_all_outsidet  s     2 z1_Test_random_ball_periodic.test_found_all_outsideN)r   rM   rN   r*   r[   r   r   r   r   r   r   r   \  s   r   c                   @   s   e Zd ZdZdd ZdS )"_Test_random_ball_largep_issue9890gvIh%<=c                 C   sX   d}d}t jd t jjdd||fd| _| | j| _| j| _d| _d| _	d| _
d S )Nr   r+   {   rP   r   r   rV   )r1   rW   rX   randintr3   r   r   r.   r"   r7   r%   r   r   r   r   r[     s    z/_Test_random_ball_largep_issue9890.setup_methodN)r   rM   rN   r   r[   r   r   r   r   r     s   r   c                       s   e Zd Z fddZ  ZS )_Test_random_ball_approxc                    s   t    d| _d S NrK   r^   r[   r7   rZ   r_   r   r   r[     s    
z%_Test_random_ball_approx.setup_methodra   r   r   r_   r   r     s   r   c                       s   e Zd Z fddZ  ZS )!_Test_random_ball_approx_periodicc                    s   t    d| _d S r   r   rZ   r_   r   r   r[     s    
z._Test_random_ball_approx_periodic.setup_methodra   r   r   r_   r   r     s   r   c                       s   e Zd Z fddZ  ZS )_Test_random_ball_farc                    s   t    d| _d S Nr   r^   r[   r%   rZ   r_   r   r   r[     s    
z"_Test_random_ball_far.setup_methodra   r   r   r_   r   r     s   r   c                       s   e Zd Z fddZ  ZS )_Test_random_ball_far_periodicc                    s   t    d| _d S r   r   rZ   r_   r   r   r[     s    
z+_Test_random_ball_far_periodic.setup_methodra   r   r   r_   r   r     s   r   c                       s   e Zd Z fddZ  ZS )_Test_random_ball_l1c                    s   t    d| _d S )Nr   )r^   r[   r"   rZ   r_   r   r   r[     s    
z!_Test_random_ball_l1.setup_methodra   r   r   r_   r   r     s   r   c                       s   e Zd Z fddZ  ZS )_Test_random_ball_linfc                    s   t    tj| _d S r   r^   r[   r1   rD   r"   rZ   r_   r   r   r[     s    
z#_Test_random_ball_linf.setup_methodra   r   r   r_   r   r     s   r   c                 C   s`   d}d}t jd | t j||}|t jdd|d}t|jd tt|d t	 d S )	N      rR   r+   rl   r   r+   rl   r   r   )
r1   rW   rX   rY   r   r   r~   r   ru   r   )r   rB   r9   r   r   r   r   r   test_random_ball_vectorized  s    r   c           	      C   s   t jd d}d}t j||}| |}|j|ddd}|j|ddd}|j|ddd}t|D ]&}|| sv|| rbt|| ||  qbt|D ]&}|| s|| rt|| ||  qd S )	Nr     r+   ~jth?r   workers@   r   )r1   rW   rX   rY   r   ranger   )	r   rB   r?   r   r   l1l2l3r6   r   r   r   $test_query_ball_point_multithreading  s    r   c                  C   s  t jdd} t| }tjdd  |j| ddd W d    n1 sH0    Y  tjdd  |j| ddd W d    n1 s0    Y  tjt	dd" |j| dddd	 W d    n1 s0    Y  tjt	dd" |j| dddd	 W d    n1 s0    Y  d S )
N2   r+   z n_jobs argument has been renamedr   r   r   )n_jobszUnexpected keyword argument)r   r   )
r1   rW   rY   r   r   Zdeprecated_callr   r0   r   	TypeError)r   r   r   r   r   test_n_jobs  s    ..0r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )two_trees_consistencyc                 C   s   t |||S r   r   r(   r   r   r   r*     s    ztwo_trees_consistency.distancec                 C   sl   | j j| j| j| j| jd}t|D ]B\}}|D ]4}t| | j	| | j
| | j| jd| j  k q0q$d S )Nr   r   )T1query_ball_treeT2r%   r"   r7   r   r   r*   data1data2)r)   r   r6   r   jr   r   r   test_all_in_ball  s    z&two_trees_consistency.test_all_in_ballc              	   C   s   | j j| j| j| j| jd}t|D ]X\}}tj| jj	t
d}d||< tt| | j| | j| | j| jd| j  k q$d S )Nr   r   Fr   )r   r   r   r%   r"   r7   r   r1   r   rB   r   r   r4   r*   r   r   )r)   r   r6   r   r   r   r   r   r     s
    z$two_trees_consistency.test_found_allN)r   rM   rN   r*   r   r   r   r   r   r   r     s   r   c                   @   s   e Zd Zdd ZdS )_Test_two_random_treesc                 C   sn   d}d}t jd t j||| _| j| jdd| _t j||| _| j| jdd| _d| _	d| _
d| _d S )	Nr   rQ   rR   r+   rS   r   r   rU   )r1   rW   rX   rY   r   r   r   r   r   r"   r7   r%   r   r   r   r   r[     s    z#_Test_two_random_trees.setup_methodNr\   r   r   r   r   r     s   r   c                   @   s   e Zd Zdd Zdd ZdS )_Test_two_random_trees_periodicc                 C   s   t |||dS r   r   r(   r   r   r   r*     s    z(_Test_two_random_trees_periodic.distancec                 C   sz   d}d}t jd t jj||fd| _| j| jddd| _t jj||fd| _| j| jddd| _d| _	d	| _
d
| _d S )Nr   rQ   rR   r   r+   r   r   r   r   rU   )r1   rW   rX   r   r   r   r   r   r   r"   r7   r%   r   r   r   r   r[     s    z,_Test_two_random_trees_periodic.setup_methodN)r   rM   rN   r*   r[   r   r   r   r   r     s   r   c                       s   e Zd Z fddZ  ZS )_Test_two_random_trees_farc                    s   t    d| _d S Nr+   r   rZ   r_   r   r   r[   '  s    
z'_Test_two_random_trees_far.setup_methodra   r   r   r_   r   r   $  s   r   c                       s   e Zd Z fddZ  ZS )#_Test_two_random_trees_far_periodicc                    s   t    d| _d S r   r   rZ   r_   r   r   r[   /  s    
z0_Test_two_random_trees_far_periodic.setup_methodra   r   r   r_   r   r   ,  s   r   c                       s   e Zd Z fddZ  ZS )_Test_two_random_trees_linfc                    s   t    tj| _d S r   r   rZ   r_   r   r   r[   7  s    
z(_Test_two_random_trees_linf.setup_methodra   r   r   r_   r   r   4  s   r   c                       s   e Zd Z fddZ  ZS )$_Test_two_random_trees_linf_periodicc                    s   t    tj| _d S r   r   rZ   r_   r   r   r[   ?  s    
z1_Test_two_random_trees_linf_periodic.setup_methodra   r   r   r_   r   r   <  s   r   c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )Test_rectanglec                 C   s   t ddgddg| _d S Nr   r   )r   rectrZ   r   r   r   r[   F  s    zTest_rectangle.setup_methodc                 C   s   t | jddgd d S )Nr   r   r   r   min_distance_pointrZ   r   r   r   test_min_insideI  s    zTest_rectangle.test_min_insidec                 C   s   t | jddgd d S Nr   g      ?r   rZ   r   r   r   test_min_one_sideL  s    z Test_rectangle.test_min_one_sidec                 C   s    t | jddgtd d S r   )r   r   r   r1   sqrtrZ   r   r   r   test_min_two_sidesO  s    z!Test_rectangle.test_min_two_sidesc                 C   s$   t | jddgdtd  d S )Nr   r   r+   r   r   max_distance_pointr1   r   rZ   r   r   r   test_max_insideR  s    zTest_rectangle.test_max_insidec                 C   s"   t | jddgtdd d S r   )r   r   r  r1   ZhypotrZ   r   r   r   test_max_one_sideU  s    z Test_rectangle.test_max_one_sidec                 C   s$   t | jddgdtd  d S r   r  rZ   r   r   r   test_max_two_sidesX  s    z!Test_rectangle.test_max_two_sidesc                 C   sV   | j dd\}}t|jddg t|jddg t|jddg t|jddg d S )Nr   rK   r   )r   splitr   maxesmins)r)   lessgreaterr   r   r   
test_split[  s
    zTest_rectangle.test_splitN)r   rM   rN   r[   r   r   r  r  r  r  r  r   r   r   r   r   D  s   r   c                   C   s$   t tddgddgdtd d S Nr   r   r+   )r   r   r1   r   r   r   r   r   test_distance_l2c  s    r  c                   C   s   t tddgddgdd d S r  )r   r   r   r   r   r   test_distance_l1g  s    r  c                   C   s    t tddgddgtjd d S r   )r   r   r1   rD   r   r   r   r   test_distance_linfk  s    r  c                  C   sB   t jd t jddd} t jddd}tt| |jd d S )NrR   rV   r   rl      )rV   r  )r1   rW   rX   rY   r   r   r~   )r.   yr   r   r   test_distance_vectorizationo  s    r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )count_neighbors_consistencyc              	   C   s:   d}t | j| j|tdd | j| j|D  d S )NrU   c                 S   s   g | ]}t |qS r   lenr   r   r   r   r   
<listcomp>z  r   z?count_neighbors_consistency.test_one_radius.<locals>.<listcomp>r   r   count_neighborsr   r1   r2   r   r)   r   r   r   r   test_one_radiusw  s    z+count_neighbors_consistency.test_one_radiusc              	   C   s:   d}t | j| j|tdd | j| j|D  d S )Nr   c                 S   s   g | ]}t |qS r   r  r  r   r   r   r    r   zAcount_neighbors_consistency.test_large_radius.<locals>.<listcomp>r  r  r   r   r   test_large_radius|  s    z-count_neighbors_consistency.test_large_radiusc                 C   sv   t t t dt dd}| j| j|}tt t 	|dk t
||D ]\}}t| j| j|| qRd S )N{Gz?rV   rl   r   )r1   Zexplinspacelogr   r  r   r   r4   r$   rC   r   )r)   ZrsZresultsr   resultr   r   r   test_multiple_radius  s
     z0count_neighbors_consistency.test_multiple_radiusN)r   rM   rN   r  r  r"  r   r   r   r   r  v  s   r  c                   @   s   e Zd Zdd ZdS )_Test_count_neighborsc                 C   sL   d}d}t jd | jt j||dd| _| jt j||dd| _d S )Nr   r+   rR   rS   )r1   rW   rX   r   rY   r   r   r   r   r   r   r[     s
    z"_Test_count_neighbors.setup_methodNr\   r   r   r   r   r#    s   r#  c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )"sparse_distance_matrix_consistencyc                 C   s   t |||S r   r   r(   r   r   r   r*     s    z+sparse_distance_matrix_consistency.distancec              	   C   s   | j | j| j}| j | j| j}t|D ]D\}}|D ]6}t|||f | | j j| | jj| | j	dd q8q,|
 D ]\\}}}t||| v  qzd S )N   Zdecimal)r   sparse_distance_matrixr   r   r   r   r   r*   r3   r"   itemsr   )r)   Mr   r6   r   r   r%   r   r   r   test_consistency_with_neighbors  s    
zBsparse_distance_matrix_consistency.test_consistency_with_neighborsc                 C   s   | j | j | j d S r   )r   r'  r   rZ   r   r   r   test_zero_distance  s    z5sparse_distance_matrix_consistency.test_zero_distancec                 C   sH   | j | j| j}t| j j| jj}d||| jk< t| |dd d S )Nr   r%  r&  )r   r'  r   r   r   r3   r   todense)r)   ZM1Zexpectedr   r   r   test_consistency  s    z3sparse_distance_matrix_consistency.test_consistencyc                 C   sX   t jd t jt jddtd}| j|ddd}||d }t	||j
dd	 d S )
Nr      r+   r   Fbalanced_treecompact_nodesrl   r%  r&  )r1   rW   rX   rm   rY   r   r   r'  r,  r   r   )r)   Ztoo_manyr   r%   r   r   r   #test_against_logic_error_regression  s    zFsparse_distance_matrix_consistency.test_against_logic_error_regressionc                 C   s  t | j| jf}t| jD ]L}t| jD ]<}| j|d d f | j|d d f  }t |||||f< q*qt |}d||| jk< t | j| jf}| j	j
| j| jdd}| D ]\}}|||f |||f< qt||dd t | j| jf}| j	j
| j| jdd}t|jd D ]6}|d | }|d	 | }|d
 | }||||f< qt||dd | j	j
| j| jdd}t|| dd | j	j
| j| jdd}t|| dd d S )Nr   dictZoutput_typer%  r&  ndarrayr   r6   r   v
dok_matrix
coo_matrix)r1   r}   rB   r   r   r   dotr   r   r   r'  r   keysr   r~   r,  )r)   refr6   r   r6  r   r   r?   r   r   r   test_ckdtree_return_types  s<    $
z<sparse_distance_matrix_consistency.test_ckdtree_return_typesN)	r   rM   rN   r*   r*  r+  r-  r2  r<  r   r   r   r   r$    s   	r$  c                   @   s   e Zd Zdd ZdS )_Test_sparse_distance_matrixc                 C   sx   d}d}t jd t j||}t j||}| j|dd| _| j|dd| _d| _d| _|| _	|| _
|| _|| _d S )Nr   rQ   rR   r+   rS   r   )r1   rW   rX   rY   r   r   r   r   r"   r   r   rB   r9   )r)   rB   r9   r   r   r   r   r   r[     s    z)_Test_sparse_distance_matrix.setup_methodNr\   r   r   r   r   r=    s   r=  c                  C   s   d} d}d}t jd t j| |}t j||}t||}t|j| |f t| D ]2}t|D ]$}tt	|| || |||f  qbqVd S )NrV      rQ   rR   )
r1   rW   rX   rY   r   r   r~   r   r   r   )r9   rB   r?   xsysr   r6   r   r   r   r   test_distance_matrix  s    
rA  c                  C   sZ   d} d}d}t jd t j| |}t j||}t||}t||dd}t|| d S )NrV   r>  rQ   rR   r   )Z	threshold)r1   rW   rX   rY   r   r   )r9   rB   r?   r?  r@  r   Zdslr   r   r   test_distance_matrix_looping  s    
rB  c                 C   sZ   |  | |}t }t|D ](\}}|D ]}||k r&|||f q&qt|| |k d S r   )r   setr   addr   query_pairs)r   r%   r   r   r6   r   r   r   r   r   check_onetree_query  s    rF  c                 C   s   t jd d}d}t j||}| |}t|d t jd| |}|d |  d9  < ||d|   d7  < | |}t|d t|d t|d t|d	 d S )
Nr   r   rQ   rK   rl   gMbP?r+   gh㈵>gư>)r1   rW   rX   rY   rF  )r   rB   r?   r   r   r   r   r   test_onetree_query  s    



rG  c                 C   s$   | ddgg}t |dt  d S )Nr   r   r   )r   rE  rC  )r   r   r   r   r   test_query_pairs_single_node!  s    rH  c                 C   sF  t jd d}d}d}|d }t j||}| |}t }t|D ]V}t|d |D ]B}	||d d f ||	d d f  }
t |
|
|krV|||	f qVqDt|}|	|}t|}t
|| |j	|dd}t|}t
|| t }|j	|dd}t|jd D ],}|t||df t||df f qt|}t
|| d S )	Nr   r   r+   rK   r   rC  r4  r5  )r1   rW   rX   rY   rC  r   r9  rD  r   rE  r   r~   r   )r   rB   r?   r   Zr2r   r   Zbruter6   r   r6  Zl0r   r   Zarrr   r   r   r   test_kdtree_query_pairs&  s4     


*rI  c                 C   s   t jddddf \}}tt| | }| |}ttg dt|dd t j|t	d}| |}ttg dt|dd d S )Nr   rQ   )rQ      	      )r+   r   r   r   )
r1   mgridr   rC   ravelr   r   r   Zasarrayrv   )r   r.   r  r   r   r   r   r   test_ball_point_intsG  s    rO  c                  C   s2   dd t dD } tt| t| d d d  d S )Nc                 S   s   g | ]}t  qS r   )r
   Znode)r   r   r   r   r   r  V  r   z+test_kdtree_comparisons.<locals>.<listcomp>rl   r   )r   r   r   )nodesr   r   r   test_kdtree_comparisonsT  s    rQ  c                 C   s   t jd d}d}t j||}| |j|ddd }| |ddj|ddd }| |dd	j|ddd }| |ddd
j|ddd }t|| t|| t|| d S )Nr   r   rQ   r   r   r   F)r1  )r0  )r1  r0  )r1   rW   rX   rY   r0   r   )r   rB   r?   r   r   r   T3ZT4r   r   r   test_kdtree_build_modesZ  s"    

rS  c                 C   s   zdd l }W n ty&   dd l}Y n0 tjd d}d}tj||}| |}||}||}|j	|ddd }|j	|ddd }t
|| d S )Nr   r   rQ   r   r   r   )cPickleImportErrorpickler1   rW   rX   rY   dumpsloadsr0   r   r   rV  rB   r?   r   r   tmpr   r   r   r   test_kdtree_picklei  s    

r[  c                 C   s   zdd l }W n ty&   dd l}Y n0 tjd d}d}tjj||fd}| |dd}||}||}|j	|ddd	 }|j	|ddd	 }t
|| d S )
Nr   r   rQ   r   r   )r#   r   r   r   )rT  rU  rV  r1   rW   rX   r   rW  rX  r0   r   rY  r   r   r   test_kdtree_pickle_boxsizez  s    

r\  c                 C   sz   t jd d}d}t j||}| |dd}| }|j|ddd }t j|||d	< |j|ddd }t|| d S )
Nr   r   rQ   T)Z	copy_datar   r   r   .)r1   rW   rX   rY   copyr0   r   )r   rB   r?   r   r   r   r   r   r   r   r   test_kdtree_copy_data  s    r^  c           	      C   s   t jd d}d}t j||}| |}|j|dddd }|j|dddd }|j|ddd }t|| t|| |td	d
d  tj	t
dd  |j|ddd W d    n1 s0    Y  d S )Nr   r   rQ   r   r   )r?   r   r   r   	cpu_countc                   S   s   d S r   r   r   r   r   r   <lambda>  r   z'test_ckdtree_parallel.<locals>.<lambda>zCannot determine ther   r   r   )r1   rW   rX   rY   r0   r   setattrosr   r   NotImplementedError)	r   ZmonkeypatchrB   r?   r   r   r   r   rR  r   r   r   test_ckdtree_parallel  s    

rd  c                     s~   t jd d} d}t j| |}t|  fdd j  j} tt | jt	d t j
| jd d f | j d S )Nr   rP   rQ   c                    s   t t| t | jdkrLt | jd u  t | jd u  t | jjd  jk nT| j | j | jj	d d | jf }| jj	d d | jf }t |
 | k  d S )Nr   r   )r   ru   r   	split_dimlesserr  indicesr~   rT   data_pointsmaxmin)rB   r.   r  r/   recurse_treer   r   rl    s    


z'test_ckdtree_view.<locals>.recurse_tree)r1   rW   rX   rY   r   r   r   sortrg  r   r3   rh  )rB   r?   r   r   rk  r   test_ckdtree_view  s    
rn  c                 C   s6  d}d}g d}d}t jd t jj||fd}| |dd}|||\}}|||\}	}
t||	 t||
 t ddg}d}|||\}}|||\}	}
t|	|d	|d f  t|
|d	|d f  ||d\}}||dg\}	}
tt|jd tt|	jd t|t 	|	 t|t 	|
 d S )
N   r+   )r   r+   rl   rl   rR   r   r   rS   .)
r1   rW   rX   r   r0   r   rm   r  r~   rN  )r   rB   r9   ZklistZkintr3   r/   r;   r<   dd1ii1r   r   r   test_kdtree_list_k  s.    

rr  c                 C   s   d}d}d}t jd t jj||fd}| |ddd}| |dd}dd	d
t jfD ]}|j|||d\}}	|j|d ||d\}
}t||
 t|	| |j|d ||d\}
}t||
 t|	| t|||d|d\}}t|| t|	| qRd S )N  rl   rR   r   r   r   r   rS   r+   g      @r"   )r#   r"   )	r1   rW   rX   r   rD   r0   r   r   simulate_periodic_box)r   rB   r9   r?   r3   r/   kdtree2r"   r;   r<   rp  rq  dd2ii2r   r   r   test_kdtree_box  s$    




ry  c                 C   s   d}d}d}t jd t jj||fd}| |ddd}| |dd	}ddt jfD ]@}|j|||d
\}}	|j|||d
\}
}t||
 t|	| qPd S )Nrs  r+   rl   rR   r   r   r   r   rS   rt  )r1   rW   rX   r   rD   r0   r   r   )r   rB   r9   r?   r3   r/   rv  r"   r;   r<   rp  rq  r   r   r   test_kdtree_box_0boxsize  s    
rz  c                 C   s   t ddddd}|d d df  d7  < tt | |ddd W d    n1 s\0    Y  tt | |ddd W d    n1 s0    Y  | |dd	d d S )
Nr   r+   rV   r   r   r   r   )r   r   )r   r   )r1   r  reshaper   r   
ValueErrorr   r3   r   r   r   test_kdtree_box_upper_bounds  s    ,,r~  c                 C   s$   t ddd}tt| |ddd d S )Nr   r   rV   r   r   )r1   r  assert_raisesr|  r}  r   r   r   test_kdtree_box_lower_bounds(  s    r  c                 C   s8  g }g }t d|jd  }t t |dg|jd  j}|d }|D ]T}	||	d |  }
| j|
||d\}}|d|}|d|}|| || qHt j	|dd}t j	|dd}t j
t|t|| gddgd	}||d
 d d < ||d d d < |jdd |d d d d |f |d
 d d d |f fS )Nrl   r   r   rt  r   r-   )r<   Zi8)r;   Zf8r   r<   r;   )order)r1   aranger~   rm   Zunravel_indexr   r0   r{  appendZconcatenateemptyr  rm  )r/   r3   r?   r#   r"   r;   r<   r.   ZnnrB   Zimagerw  rx  r!  r   r   r   ru  ,  s,     
ru  ZPyPyz Fails on PyPy CI runs. See #9507)reasonc                  C   s  zdd l } W n ty    Y d S 0 d\}}tjtdd| |tdd| |f \}}t|d td||  t|  }t|}||d d < d}tj	d|j
tj	dd }||j|< tt||kj}	tt||kj}
| | jj}tdD ]}t|	}qd}tdD ]P}| | jj}t|	}|j|
d	d
d\}}| | jj}||kr|d7 }qt|dk  d S )Nr   )皙?r  r   r   rV   g     X@r   rP   rQ   r+   )r?   r"   )resourcerU  r1   rM  sliceZsinZcosZ
empty_likerW   r   r   ZflatZvstackr   r   Z	getrusageZRUSAGE_SELFZ	ru_maxrssr   r   r0   r   )r  ZdxZdyr  r.   zZz_copyZFILLVALmaskZigoodZibadZmem_user6   r   Z	num_leaksr   ZiqueryZnew_mem_user   r   r   test_ckdtree_memuseE  s8    
*


r  c              
   C   s  t ddddd}| |dd}t jt|dd}||}t|g d tt|j|d d  t	d	D ]}|
|t dd	|}|j
|t dd	|||fd
}|j
|t dd	||d fd
}|j
|t dd	|d |fd
}	|j
|t dd	||d
 t|| t|| t||	 qjt	t|D ]}| }
d|
|< ||
dk }| |}|j
|t dd	d|
|
fd
}|
|t dd	d}t|| tt|j
|t dd	d|
d
 q$d S )Nr   r   rQ   r   rS   Zf4r   )rQ   r+   r   r   r+   r   r   rV   )weightsrP   )r1   r  r{  r   r  Z_build_weightsr   r  r|  r   r  r]  )r   r3   Ztree1r  Znwr6   Zc1Zc2Zc3Zc4Zw1r   Ztree2r   r   r   test_kdtree_weightsp  sH    



r  c                 C   s   d}d}t jd t jj||fd}| |dd}g d}t t|}|||}|j||dd	}t||  t	t
|t
|D ]&\}	}
|||
}t||t|	  qd S )
Nrs  r+   rR   r   r   rS   )r   r  r  g{Gz?r  F
cumulative)r1   rW   rX   normalr  r  r  r   ZcumsumrC   	itertoolspermutationsr   r   )r   rB   r9   r3   r/   Zr0Zi0Zn0Znncr6   r   r   r   r   &test_kdtree_count_neighbous_multiple_r  s    
r  c                 C   s,  t jd t jdd}t jdd}| |}|jddgdd\}}|ddgd| }t|g  |j|dd\}}| }||d| }t jdt	d	}|
g  t|| | |}	||	d| }tdg g | ||	d| }t|d
k |j|	d| dd}t|t dkd |j|	d| dd}t|t dkd |j|	d| dd}t|i  |j|	d| dd}dt jfdt jfdt jfg}
t j|
dd}t jd|d	}t|| |j|dd\}}|d d df  }|jd| dd}t|t  |jd| dd}t jdt jd	}t|| d S )NrR   rV   r+   r   r   r   rK   )rV   )r~   r   r   r7  r4  )rV   rV   Tr8  r3  r5  r6   r   r6  )Zalign)r   r   rC  )r   r+   )r1   rW   rX   r   r0   r   r   rj  r  objectZfillr   r  r   r'  r}   r   Zintpfloat64r   rE  rC  )r   XYr   r%   r6   r  Zmindr  otherZ_dtypeZ	res_dtyper   r   r   test_len0_arrays  sH    




r  c              	   C   s   d}t ddD ]}t||f}d||d d < tjdddD ]|\}}| |||dd}|jdksdJ | tu rr|jn|jj}t	t
|jjtd	|d  t	t
|jjt|d | q>qd S )
Ni   r   rJ  r+   FT)repeat)r0  r1  rT   rl   r   )r   r1   r   r  productr   r   r   _noder   rm  rf  rg  r  r  )r   rB   r9   r3   ZbalancedZcompactr/   r   r   r   r   test_kdtree_duplicated_inputs  s(    r  c                 C   s,   | dggdd}t t|j|ddgdd d S )Nr   r   rS   rK   Fr  )r  r|  r  )r   r/   r   r   r   'test_kdtree_noncumulative_nondecreasing  s    
r  c                 C   s   t jg dg dg dg dg dg dgdd}| |}|j|d	d
d\}}t|dt jt jt jgddt jt jgddt jt jgddt jt jgddt jt jgdt jt jt jgg d S )N)r   r   r   ))\(?r   r   )r   r   r   )r   r  r   )r   r   r   )r   r   r   r  r   rQ   rU   r>   r   r  )r1   rm   r0   r   rD   )r   ZxyzckdtZdeqZieqr   r   r   test_short_knn  s*    	r  c                    s   t jd t jjdd}t jjdd}| | t jjddt|d} ||} fddt||D }t||D ]\}}tt	|t	| qtd S )NrR   rP   rl   r   r   333333?c                    s   g | ]\}}  ||qS r   r   )r   qiZdir   r   r   r  !  r   z2test_query_ball_point_vector_r.<locals>.<listcomp>)
r1   rW   rX   r  r   r  r   rC   r   r   )r   r3   r0   r%   ZrvectorZrscalarr    r!   r   r  r   test_query_ball_point_vector_r  s    r  c                    s   t jd t jjdd}t jjdd}| |d j| dd}dd j| d	dD } fd
d|D } fdd|D }t|| t|| t|| d S )NrR   r  r   r  TZreturn_lengthc                 S   s   g | ]}t |qS r   r  )r   r   r   r   r   r  .  r   z0test_query_ball_point_length.<locals>.<listcomp>Fc                    s   g | ]}t | qS r   )r  r   r   r  r%   r   r   r   r  /  r   c                    s   g | ]}j | d dqS )Tr  r  r  r  r   r   r  0  r   )r1   rW   rX   r  r   r   )r   r3   r0   lengthlength2Zlength3Zlength4r   r  r   test_query_ball_point_length%  s    

r  c                 C   s  t jd t jjdd}t dd }t t dd d d d d d d }t jjdd}t |jj}|jd |jd ksJ |jd |jd ksJ | |}|j||dd}|j||dd}t	|| |
|d	\}	}
|
|d	\}}t	|	| t	|
| d S )
NrR   r  r   rP   g{Gz?r   Tr  r   )r1   rW   rX   r  r  Zascontiguousarrayr   stridesr   r   r0   )r   r3   Zd_contiguousZd_discontiguousZquery_contiguousZquery_discontiguousr   Zlength1r  Zd1Zi1Zd2Zi2r   r   r   test_discontiguous5  s0    

r  zbalanced_tree, compact_nodes))TF)TT)FFr  c                 C   s   t jd t jdd}t jdd}t jdd}| |||d}|j|ddd	}|d
ksZJ ||d\}}	|	jdksxJ |jdksJ t |	 sJ |
|d
dg}
t|
d
d
g ||d}|jdksJ d S )NrR   )r   rl   )r~   )r   rl   r   r/  r  Tr  r   r+   )r+   r+   r   r   )r1   rW   rX   r  r   r   r0   r~   Zisinfr4   r  r   r'  )r   r0  r1  Zempty_v3Zquery_v3Zquery_v2r   r  r;   r<   Nr)  r   r   r   test_kdtree_empty_inputQ  s"    r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )_Test_sorted_query_ball_pointc                 C   s.   t jd t jdd| _| | j| _d S )NrR   rP   r   )r1   rW   rX   rY   r.   r   r  rZ   r   r   r   r[   o  s    z*_Test_sorted_query_ball_point.setup_methodc                 C   s\   | j j| jddd}|D ]}t|t| q| jD ]$}| j j|ddd}t|t| q2d S )Nr   TZreturn_sorted)r  r   r.   r   r   )r)   	idxs_listidxsxir   r   r   test_return_sorted_Truet  s    
z5_Test_sorted_query_ball_point.test_return_sorted_Truec                    sr    j  jd}|D ]}t|t| q fdd jD } j j jddd}t||D ]\}}t|| qZdS )zPrevious behavior was to sort the returned indices if there were
        multiple points per query but not sort them if there was a single point
        per query.r   c                    s   g | ]} j |d qS )r   )r  r   )r   r  rZ   r   r   r    r   zI_Test_sorted_query_ball_point.test_return_sorted_None.<locals>.<listcomp>Fr  N)r  r   r.   r   r   rC   )r)   r  r  Zidxs_list_singleZidxs_list_FalseZidxs0Zidxs1r   rZ   r   test_return_sorted_None}  s    z5_Test_sorted_query_ball_point.test_return_sorted_NoneN)r   rM   rN   r[   r  r  r   r   r   r   r  m  s   	r  c                  C   s   t jddt} tjtdd t| }W d    n1 s@0    Y  t| j	}tjtdd |
|  W d    n1 s0    Y  tjtdd |j| dd W d    n1 s0    Y  d S )NrV   r+   zcomplex datar   r   )r   )r1   rW   r   Zviewcomplexr   r   r   r
   realr0   r   r   tr   r   r   test_kdtree_complex_data  s    &
(r  c                  C   sB  t jd t jdd} t| }|j}t|tjs8J |j| j	d ksLJ |g}|r>|
d}t|tjrt|jts~J |jt|jksJ t| |j |jj qRt|tjsJ t|jtsJ d|j  kr|jk sn J t|jtsJ t|jtsJ |j|jj|jj ks$J ||j ||j qRd S )NrR   rP   rQ   r   r   )r1   rW   rX   r   r
   r   ru   Z	innernodeZchildrenr~   popZleafnoder   r  r   r   r  rh  re  r9   r  rv   r
  r  r  )r   r  rootrP  rB   r   r   r   test_kdtree_tree_access  s*    
r  c                  C   s   t jd t jdd} t| }t|jts2J |j| j	d ksFJ t|jtsVJ |j| j	d ksjJ t|j
tszJ |j
dksJ t|jt j| dd t|jt j| dd |j| u sJ d S )NrR   rP   rQ   r   r   rV   r-   )r1   rW   rX   r   r
   ru   r9   r   rB   r~   rT   r   r  r:   r	  Zaminr3   r  r   r   r   test_kdtree_attributes  s    r  kdtree_classc           
         s  t jd t ddd}t jdd}t jdd}t jd}t jd	}| |}| |}|j||d
||fd}|d d d f |d d d f  t jj|d d d d d f |d d d d d f  dd  fddtt	
dg|d d |D }	t||	 d S )NrR   r  r      )r  rl   -   )   rl   r  r  F)r  r  r   r-   c                    s*   g | ]"\}}t | k  |k@  qS r   )r1   r2   )r   Zprev_radiusZradiusr   r  r   r   r    s   z8test_kdtree_count_neighbors_weighted.<locals>.<listcomp>r   )r1   rW   rX   r  r{  r  Zlinalgr   rC   r  chainr   )
r  r   ABZwAZwBZkdAZkdBZnABZexpectr   r  r   $test_kdtree_count_neighbors_weighted  s     8r  )grb  Znumpy.testingr   r   r   r   r   r   r   r   r  platformr	   Znumpyr1   Zscipy.spatialr
   r   r   r   Zscipy.spatial.ckdtreer   r   r  Zfixturer   r   r&   r'   rO   r]   rc   rq   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r#  r$  r=  rA  rB  rF  rG  rH  rI  rO  rQ  rS  r[  r\  r^  rd  rn  rr  ry  rz  r~  r  ru  r   Zskipifr  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r   r   r   r   <module>   s    
HR/"	G
!""

)..

