o
    Eb                     @   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   A/usr/lib/python3/dist-packages/scipy/spatial/tests/test_kdtree.pykdtree_type   s   r   c                 C   sp   | j ds
tdttfD ]'}| j dd d |j  }|t v r't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      t |||S r   r   selfr    r!   r"   r   r   r   distance3      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*   r0   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/   )r0   mr1   r2   r3   amaxZargmaxr   r4   r5   r   r7   )r*   r0   r;   ddiir%   r8   r9   r   r   r   test_m_nearest=   s   
"BzConsistencyTests.test_m_nearestc           	      C   s   | j }| j}| jj|| jj|d\}}d}d}t||D ],\}}|tjkr&q|d7 }t|d t	|| j
|  d  t||| k d||f  qtt	| | j
|d|d | k | d S )Nkdistance_upper_boundr.   r   r   r-    near_d=%g should be less than %g)r0   r%   r1   r2   nzipr3   infr   r4   r5   r   r   r+   	r*   r0   r%   r=   r>   r9   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 ](\}}|tjkr'q|d7 }t|| 	|| j
| d t||| k d||f  qtt| 	| j
|d|| k | d S )Nr   rA   r"   rB   r.   r   rC   )r0   r%   r1   r2   rD   rE   r3   rF   r   r+   r5   r   r   r4   rG   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 ])\}}|tjkr(q|d7 }t|| 	|| j
| tj t||| k d||f  qtt| 	| j
|tj|| k | d S )NrJ   r.   r   r   rC   )r0   r%   r1   r2   rD   r3   rF   rE   r   r+   r5   r   r   r4   rG   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皙?)r9   r   )r0   rA   r1   r2   r   r3   r6   )r*   r0   rA   r9   Zd_realZi_realr%   r8   r   r   r   test_approxq   s   zConsistencyTests.test_approxN)
r   
__module____qualname__r+   r:   r?   rI   rK   rL   rN   r   r   r   r   r'   2   s    
r'   c                   @      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皙?
   )rD   r;   r3   randomseedrandnr5   r   r1   r0   r%   rA   r*   r   r   r   setup_method|   s   
z_Test_random.setup_methodNr   rO   rP   r^   r   r   r   r   rR   z       rR   c                          e Zd Z fddZ  ZS )_Test_random_farc                    s"   t    tj| jd | _d S )NrY   )superr^   r3   rZ   r\   r;   r0   r]   	__class__r   r   r^      s   
z_Test_random_far.setup_methodr   rO   rP   r^   __classcell__r   r   rd   r   rb          rb   c                   @   $   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   rU      r   rT   )r3   arrayr5   r   r1   rD   r;   rZ   r[   r\   r0   r%   rA   r]   r   r   r   r^      s    



z_Test_small.setup_methodc                 C   s   t | jddd d S )Nr   r   rM   r   )rM   r   r   r1   r2   r]   r   r   r   r:      s   z_Test_small.test_nearestc                 C   s$   t | jddddgddgf d S )Nru   r-   rM   g?r   r   rv   r]   r   r   r   test_nearest_two   s   z_Test_small.test_nearest_twoN)r   rO   rP   r^   r:   rw   r   r   r   r   rj      s    rj   c                       ra   )_Test_small_nonleafc                    s    t    | j| jdd| _d S )Nr   rV   )rc   r^   r   r5   r1   r]   rd   r   r   r^      s   
z _Test_small_nonleaf.setup_methodrf   r   r   rd   r   rx      rh   rx   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   L   t g dg dg dg dg dg dg dg dg| _t| j| _d S 	Nrk   rl   rm   rn   ro   rp   rq   rr   )r3   rt   r5   r
   r1   r]   r   r   r   r^         
z&Test_vectorization_KDTree.setup_methodc                 C   s>   | j tg d\}}tt|t tt|tj d S Nrk   )	r1   r2   r3   rt   r   
isinstancefloatZ
issubdtypeZsignedintegerr*   r%   r8   r   r   r   test_single_query   s   z+Test_vectorization_KDTree.test_single_queryc                 C   :   | j td\}}tt|d tt|d d S Nr-   rT   rs   r-   rT   r1   r2   r3   zerosr   shaper   r   r   r   test_vectorized_query      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   rk   rA   )
r1   rD   r2   r3   rt   r   r   r   r6   isfiniter*   sZkkr%   r8   r   r   r   $test_single_query_multiple_neighbors   s    $z>Test_vectorization_KDTree.test_single_query_multiple_neighborsc              
   C      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   r   r   r-   rT   
r1   rD   r2   r3   r   r   r   r   r6   r   r   r   r   r   (test_vectorized_query_multiple_neighbors      .2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 s+w   Y  t
|ts7J t
|ts>J tt ||kd tdd t||dd  D sZJ t|t|| jj|d d f  t|| jj}tt|||k d	  d S )
NrU   k=Nonematchr@   Tc                 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   )r3   rZ   r[   randr1   r;   pytestwarnsDeprecationWarningr2   r~   listr   rt   r6   rE   r   r   r5   sortednonzero)r*   r   Zpointr%   r8   distr   r   r   test_single_query_all_neighbors   s   $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 s4w   Y  t
t || t
t || t |D ]C}|| || }}t|ts`J t|tsgJ tt ||kd tdd	 t||d
d  D sJ t|t|| | jj|  qNd S )Nr   r   rU   r   r   r@   Tc                 s   r   r   r   r   r   r   r   r      r   zPTest_vectorization_KDTree.test_vectorized_query_all_neighbors.<locals>.<genexpr>r   )r3   rZ   r[   r   r1   r;   r   r   r   r2   r   r   Zndindexr~   r   r   rt   r6   rE   r   r   r5   )	r*   Zquery_shaper   pointsr%   r8   idxr   indr   r   r   #test_vectorized_query_all_neighbors   s*   $z=Test_vectorization_KDTree.test_vectorized_query_all_neighborsN)r   rO   rP   r^   r   r   r   r   r   markparametrizer   r   r   r   r   r   ry      s    		
ry   c                   @   <   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   rz   r{   )r3   rt   r5   r   r1   r]   r   r   r   r^     r|   z'Test_vectorization_cKDTree.setup_methodc                 C   s4   | j g d\}}tt|t tt|t d S r}   )r1   r2   r   r~   r   intr   r   r   r   r     s   z,Test_vectorization_cKDTree.test_single_queryc                 C   r   r   r   r   r   r   r   r     r   z0Test_vectorization_cKDTree.test_vectorized_queryc                 C   s^   t jd t jddj}| j|\}}t|||D ]\}}}t| j|||f qd S )NrU   rs     )	r3   rZ   r[   r\   Tr1   r2   rE   r   )r*   ZqsdsZi_sqr%   r8   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   )	r1   rD   r2   r   r3   r   r   r6   r   r   r   r   r   r   "  s    $z?Test_vectorization_cKDTree.test_single_query_multiple_neighborsc              
   C   r   r   r   r   r   r   r   r   +  r   zCTest_vectorization_cKDTree.test_vectorized_query_multiple_neighborsN)	r   rO   rP   r^   r   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 ]:\}}| | j| || | j|| d| j	   }| | j| || | j|| d| j	   }t|| j| k d q#d S )Nr"   r9   r   T)r3   
atleast_2dr0   broadcast_tor%   r   r   query_ball_pointr"   r9   	enumerater+   r5   r   tol)r*   r0   r%   lr8   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 ]H\}}t j| jjtd}d||< | | j| || | j|| d| j	   }| | j| || | j|| d| j	   }t|| j | kd q#d S )Nr   r   dtypeFr   T)r3   r   r0   r   r%   r   r   r   r"   r9   r   onesrD   boolr+   r5   r   r   )	r*   r0   r%   r   r8   r   cr   r   r   r   r   test_found_allC  s   ,,zball_consistency.test_found_allN)r   rO   rP   r   r+   r   r   r   r   r   r   r   4  s
    	r   c                   @   rQ   )_Test_random_ballc                 C   sZ   d}d}t jd t j||| _| j| jdd| _t j|| _d| _d| _	d| _
d S )	NrS   rT   rU   r-   rV          @r   rX   )r3   rZ   r[   r\   r5   r   r   r0   r"   r9   r%   r*   rD   r;   r   r   r   r^   P  s   
z_Test_random_ball.setup_methodNr_   r   r   r   r   r   N  r`   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      t |||dS r   r&   r)   r   r   r   r+   ^     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'  rT   rU   sizer-   r   rW   r#   rM   r   r   rX   )r3   rZ   r[   uniformr5   r   r   Zfullr0   r"   r9   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 ]}t| | j| | j| j| jd| j  k q| j j| jd | j| j| jd}|D ]}t| | j| | j| j| jd| j  k q=d S )Nr   r   )	r   r   r0   r%   r"   r9   r   r+   r5   )r*   r   r8   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)r3   r   r   rD   r   r   r0   r%   r"   r9   r   r6   r+   r5   )r*   r   r   r   r   r   test_found_all_outsidet  s    2 6z1_Test_random_ball_periodic.test_found_all_outsideN)r   rO   rP   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-   {   rS   r   r   rY   )r3   rZ   r[   randintr5   r   r   r0   r"   r9   r%   r   r   r   r   r^     s   
z/_Test_random_ball_largep_issue9890.setup_methodN)r   rO   rP   r   r^   r   r   r   r   r     s    r   c                       ra   )_Test_random_ball_approxc                       t    d| _d S NrM   rc   r^   r9   r]   rd   r   r   r^        

z%_Test_random_ball_approx.setup_methodrf   r   r   rd   r   r         r   c                       ra   )!_Test_random_ball_approx_periodicc                    r   r   r   r]   rd   r   r   r^     r   z._Test_random_ball_approx_periodic.setup_methodrf   r   r   rd   r   r     r   r   c                       ra   )_Test_random_ball_farc                    r   Nr   rc   r^   r%   r]   rd   r   r   r^     r   z"_Test_random_ball_far.setup_methodrf   r   r   rd   r   r     r   r   c                       ra   )_Test_random_ball_far_periodicc                    r   r   r   r]   rd   r   r   r^     r   z+_Test_random_ball_far_periodic.setup_methodrf   r   r   rd   r   r     r   r   c                       ra   )_Test_random_ball_l1c                    r   )Nr   )rc   r^   r"   r]   rd   r   r   r^     r   z!_Test_random_ball_l1.setup_methodrf   r   r   rd   r   r     r   r   c                       ra   )_Test_random_ball_linfc                       t    tj| _d S r   rc   r^   r3   rF   r"   r]   rd   r   r   r^        
z#_Test_random_ball_linf.setup_methodrf   r   r   rd   r   r     r   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      rU   r-   rs   r   r-   rs   r   r   )
r3   rZ   r[   r\   r   r   r   r   r~   r   )r   rD   r;   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 ]}|| s;|| rDt|| ||  q1t|D ]}|| sS|| r\t|| ||  qId S )	Nr     r-   ~jth?r   workers@   r   )r3   rZ   r[   r\   r   ranger   )	r   rD   rA   r   r   l1l2l3r8   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 s$w   Y  tjdd |j| ddd W d    n1 sBw   Y  tjt	dd |j| dddd	 W d    n1 sbw   Y  tjt	dd |j| dddd	 W d    d S 1 sw   Y  d S )
N2   r-   z n_jobs argument has been renamedr   r   r   )n_jobszUnexpected keyword argument)r   r   )
r3   rZ   r\   r   r   Zdeprecated_callr   r2   r   	TypeError)r   r   r   r   r   test_n_jobs  s   "r   c                   @   ri   )two_trees_consistencyc                 C   r(   r   r   r)   r   r   r   r+     r,   ztwo_trees_consistency.distancec                 C   sl   | j j| j| j| j| jd}t|D ]!\}}|D ]}t| | j	| | j
| | j| jd| j  k qqd S )Nr   r   )T1query_ball_treeT2r%   r"   r9   r   r   r+   data1data2)r*   r   r8   r   jr   r   r   test_all_in_ball  s   2z&two_trees_consistency.test_all_in_ballc              	   C   s   | j j| j| j| j| jd}t|D ],\}}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"   r9   r   r3   r   rD   r   r   r6   r+   r  r  )r*   r   r8   r   r   r   r   r   r     s   8z$two_trees_consistency.test_found_allN)r   rO   rP   r+   r  r   r   r   r   r   r     s    r   c                   @   rQ   )_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   rT   rU   r-   rV   r   r   rX   )r3   rZ   r[   r\   r  r   r   r  r  r"   r9   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   r   r   r   r)   r   r   r   r+     r   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   rT   rU   r   r-   r   r   r   r   rX   )r3   rZ   r[   r   r  r   r   r  r  r"   r9   r%   r   r   r   r   r^     s   
z,_Test_two_random_trees_periodic.setup_methodN)r   rO   rP   r+   r^   r   r   r   r   r    s    r  c                       ra   )_Test_two_random_trees_farc                    r   Nr-   r   r]   rd   r   r   r^   '  r   z'_Test_two_random_trees_far.setup_methodrf   r   r   rd   r   r	  $  r   r	  c                       ra   )#_Test_two_random_trees_far_periodicc                    r   r
  r   r]   rd   r   r   r^   /  r   z0_Test_two_random_trees_far_periodic.setup_methodrf   r   r   rd   r   r  ,  r   r  c                       ra   )_Test_two_random_trees_linfc                    r   r   r   r]   rd   r   r   r^   7  r   z(_Test_two_random_trees_linf.setup_methodrf   r   r   rd   r   r  4  r   r  c                       ra   )$_Test_two_random_trees_linf_periodicc                    r   r   r   r]   rd   r   r   r^   ?  r   z1_Test_two_random_trees_linf_periodic.setup_methodrf   r   r   rd   r   r  <  r   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   rectr]   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_pointr]   r   r   r   test_min_insideI     zTest_rectangle.test_min_insidec                 C   s   t | jddgd d S Nr   g      ?r  r]   r   r   r   test_min_one_sideL  r  z Test_rectangle.test_min_one_sidec                 C   s    t | jddgtd d S r
  )r   r  r  r3   sqrtr]   r   r   r   test_min_two_sidesO      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_pointr3   r  r]   r   r   r   test_max_insideR     $zTest_rectangle.test_max_insidec                 C   s"   t | jddgtdd d S r  )r   r  r  r3   Zhypotr]   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  r]   r   r   r   test_max_two_sidesX  r  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   rM   r   )r  splitr   maxesmins)r*   lessgreaterr   r   r   
test_split[  s
   zTest_rectangle.test_splitN)r   rO   rP   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   r3   r  r   r   r   r   test_distance_l2c  r  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   r3   rF   r   r   r   r   test_distance_linfk  r  r)  c                  C   sB   t jd t jddd} t jddd}tt| |jd d S )NrU   rY   r   rs      )rY   r*  )r3   rZ   r[   r\   r   r   r   )r0   yr   r   r   test_distance_vectorizationo  s   r,  c                   @   ri   )count_neighbors_consistencyc              	   C   :   d}t | j| j|tdd | j| j|D  d S )NrX   c                 S      g | ]}t |qS r   lenr   r   r   r   r   
<listcomp>z      z?count_neighbors_consistency.test_one_radius.<locals>.<listcomp>r   r   count_neighborsr  r3   r4   r  r*   r   r   r   r   test_one_radiusw     z+count_neighbors_consistency.test_one_radiusc              	   C   r.  )Nr   c                 S   r/  r   r0  r2  r   r   r   r3    r4  zAcount_neighbors_consistency.test_large_radius.<locals>.<listcomp>r5  r7  r   r   r   test_large_radius|  r9  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|| q)d S )N{Gz?rY   rs   r   )r3   Zexplinspacelogr   r6  r  r   r6   r$   rE   r   )r*   Zrsresultsr   resultr   r   r   test_multiple_radius  s    z0count_neighbors_consistency.test_multiple_radiusN)r   rO   rP   r8  r:  r@  r   r   r   r   r-  v  s    r-  c                   @   rQ   )_Test_count_neighborsc                 C   sL   d}d}t jd | jt j||dd| _| jt j||dd| _d S )Nr   r-   rU   rV   )r3   rZ   r[   r   r\   r   r  r   r   r   r   r^     s
   z"_Test_count_neighbors.setup_methodNr_   r   r   r   r   rA    r`   rA  c                   @   r   )"sparse_distance_matrix_consistencyc                 C   r(   r   r   r)   r   r   r   r+     r,   z+sparse_distance_matrix_consistency.distancec              	   C   s   | j | j| j}| j | j| j}t|D ]"\}}|D ]}t|||f | | j j| | jj| | j	dd qq|
 D ]\\}}}t||| v  q=d S )N   Zdecimal)r   sparse_distance_matrixr  r   r  r   r   r+   r5   r"   itemsr   )r*   Mr   r8   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   rE  r   r]   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   rC  rD  )r   rE  r  r   r   r5   r   toarray)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_nodesrs   rC  rD  )r3   rZ   r[   rt   r\   r   r   rE  rJ  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 ]&}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< qYt||dd t | j| jf}| j	j
| j| jdd}t|jd D ]}|d | }|d	 | }|d
 | }||||f< qt||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_typerC  rD  ndarrayr   r8   r  v
dok_matrix
coo_matrix)r3   r   rD   r   r  r  dotr  r   r   rE  r  keysr   r   rJ  )r*   refr8   r  rT  r   r   rA   r   r   r   test_ckdtree_return_types  s>   $
z<sparse_distance_matrix_consistency.test_ckdtree_return_typesN)	r   rO   rP   r+   rH  rI  rK  rP  rZ  r   r   r   r   rB    s    	rB  c                   @   rQ   )_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   rT   rU   r-   rV   r   )r3   rZ   r[   r\   r   r   r  r   r"   r  r  rD   r;   )r*   rD   r;   r  r  r   r   r   r^     s   
z)_Test_sparse_distance_matrix.setup_methodNr_   r   r   r   r   r[    r`   r[  c                  C   s   d} d}d}t jd t j| |}t j||}t||}t|j| |f t| D ]}t|D ]}tt	|| || |||f  q1q+d S )NrY      rT   rU   )
r3   rZ   r[   r\   r   r   r   r   r   r   )r;   rD   rA   xsysr   r8   r  r   r   r   test_distance_matrix  s   
"r_  c                  C   sZ   d} d}d}t jd t j| |}t j||}t||}t||dd}t|| d S )NrY   r\  rT   rU   r   )Z	threshold)r3   rZ   r[   r\   r   r   )r;   rD   rA   r]  r^  r   Zdslr   r   r   test_distance_matrix_looping  s   
r`  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   r8   r   r  r   r   r   check_onetree_query  s   rd  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   rT   rM   rs   gMbP?r-   gh㈵>gư>)r3   rZ   r[   r\   rd  )r   rD   rA   r   r   r   r   r   test_onetree_query  s   



re  c                 C   s$   | ddgg}t |dt  d S )Nr   r   r   )r   rc  ra  )r   r   r   r   r   test_query_pairs_single_node!     rf  c                 C   sD  t jd d}d}d}|d }t j||}| |}t }t|D ]+}t|d |D ]!}	||d d f ||	d d f  }
t |
|
|krL|||	f q+q"t|}|	|}t|}t
|| |j	|dd}t|}t
|| t }|j	|dd}t|jd D ]}|t||df t||df f qt|}t
|| d S )	Nr   r   r-   rM   r   ra  rR  rS  )r3   rZ   r[   r\   ra  r   rW  rb  r   rc  r   r   r   )r   rD   rA   r   Zr2r   r   Zbruter8   r  rT  Zl0r   r   Zarrr   r   r   r   test_kdtree_query_pairs&  s8    


(rh  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   rT   )rT      	      )r-   r   r   r   )
r3   mgridr   rE   ravelr   r   r   Zasarrayr   )r   r0   r+  r   r   r   r   r   test_ball_point_intsG  s   rn  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   r3  V  r4  z+test_kdtree_comparisons.<locals>.<listcomp>rs   r   )r   r   r   )nodesr   r   r   test_kdtree_comparisonsT  s    rp  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   rT   r   r   r   F)rO  )rN  )rO  rN  )r3   rZ   r[   r\   r2   r   )r   rD   rA   r   r   r  T3ZT4r   r   r   test_kdtree_build_modesZ  s"   

rr  c                 C   s   zdd l }W n ty   dd l}Y nw tjd d}d}tj||}| |}||}||}|j	|ddd }|j	|ddd }t
|| d S )Nr   r   rT   r   r   r   )cPickleImportErrorpickler3   rZ   r[   r\   dumpsloadsr2   r   r   ru  rD   rA   r   r   tmpr  r   r   r   test_kdtree_picklei  s   

rz  c                 C   s   zdd l }W n ty   dd l}Y nw 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   rT   r   r   )r#   r   r   r   )rs  rt  ru  r3   rZ   r[   r   rv  rw  r2   r   rx  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   rT   T)Z	copy_datar   r   r   .)r3   rZ   r[   r\   copyr2   r   )r   rD   rA   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    d S 1 s`w   Y  d S )Nr   r   rT   r   r   )rA   r   r   r   	cpu_countc                   S   s   d S r   r   r   r   r   r   <lambda>  s    z'test_ckdtree_parallel.<locals>.<lambda>zCannot determine ther   r   r   )r3   rZ   r[   r\   r2   r   setattrosr   r   NotImplementedError)	r   ZmonkeypatchrD   rA   r   r   r   r  rq  r   r   r   test_ckdtree_parallel  s   

"r  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   rS   rT   c                    s   t t| t | jdkr't | jd u  t | jd u  t | jjd  jk d S | j | j | jj	d d | jf }| jj	d d | jf }t |
 | k  d S )Nr   r   )r   r~   r   	split_dimlesserr$  indicesr   rW   data_pointsmaxmin)rD   r0   r+  r1   recurse_treer   r   r    s   


z'test_ckdtree_view.<locals>.recurse_tree)r3   rZ   r[   r\   r   r   r   sortr  r   r5   r  )rD   rA   r   r   r  r   test_ckdtree_view  s   
 r  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-   rs   rs   rU   r   r   rV   .)
r3   rZ   r[   r   r2   r   rt   r1  r   rm  )r   rD   r;   ZklistZkintr5   r1   r=   r>   dd1ii1r   r   r   test_kdtree_list_k  s.   

r  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 ]M}|j|||d\}}	|j|d ||d\}
}t||
 t|	| |j|d ||d\}
}t||
 t|	| t|||d|d\}}t|| t|	| q)d S )N  rs   rU   r   r   r   r   rV   r-   g      @r"   )r#   r"   )	r3   rZ   r[   r   rF   r2   r   r   simulate_periodic_box)r   rD   r;   rA   r5   r1   kdtree2r"   r=   r>   r  r  dd2ii2r   r   r   test_kdtree_box  s&   




r  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|	| q(d S )Nr  r-   rs   rU   r   r   r   r   rV   r  )r3   rZ   r[   r   rF   r2   r   r   )r   rD   r;   rA   r5   r1   r  r"   r=   r>   r  r  r   r   r   test_kdtree_box_0boxsize  s   
r  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.w   Y  tt | |ddd W d    n1 sJw   Y  | |dd	d d S )
Nr   r-   rY   r   r   r   r   )r   r   )r   r   )r3   r<  reshaper   r   
ValueErrorr   r5   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   rY   r   r   )r3   r<  assert_raisesr  r  r   r   r   test_kdtree_box_lower_bounds(  rg  r  c                 C   s8  g }g }t d|jd  }t t |dg|jd  j}|d }|D ]*}	||	d |  }
| j|
||d\}}|d|}|d|}|| || q$t 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 )Nrs   r   r   r  r   r/   )r>   Zi8)r=   Zf8r   r>   r=   )Zorder)r3   aranger   rt   Zunravel_indexr   r2   r  appendZconcatenateemptyr1  r  )r1   r5   rA   r#   r"   r=   r>   r0   nnrD   Zimager  r  r?  r   r   r   r  ,  s,    
0r  ZPyPyz Fails on PyPy CI runs. See #9507)reasonc                  C   sz  zdd l } W n
 ty   Y d S w 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|	}qd}tdD ]&}| | jj}t|	}|j|
d	d
d\}}| | jj}||kr|d7 }qt|dk  d S )Nr   )皙?r  r   r   rY   g     X@r   rS   rT   r-   )rA   r"   )resourcert  r3   rl  sliceZsinZcosZ
empty_likerZ   r   r   ZflatZvstackr   r   Z	getrusageZRUSAGE_SELFZ	ru_maxrssr   r   r2   r   )r  ZdxZdyr+  r0   zZz_copyZFILLVALmaskZigoodZibadZmem_user8   r   Z	num_leaksr   ZiqueryZnew_mem_user   r   r   test_ckdtree_memuseE  s<   
*


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 ]V}|
|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||	 q5t	t|D ]B}| }
d|
|< ||
dk }| |}|j
|t dd	d|
|
fd
}|
|t dd	d}t|| tt|j
|t dd	d|
d
 qd S )Nr   r   rT   r   rV   Zf4r   )rT   r-   r   r   r-   r   r   rY   )weightsrS   )r3   r<  r  r   r1  Z_build_weightsr   r  r  r   r6  r|  )r   r5   Ztree1r  Znwr8   Zc1Zc2Zc3Zc4Zw1r  Ztree2r   r   r   test_kdtree_weightsp  sJ   



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|	  qDd S )
Nr  r-   rU   r   r   rV   )r   r;  r;  g{Gz?r  F
cumulative)r3   rZ   r[   normalr  r1  r6  r   ZcumsumrE   	itertoolspermutationsr   r   )r   rD   r;   r5   r1   Zr0Zi0Zn0Znncr8   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 )NrU   rY   r-   r   r   r   rM   )rY   )r   r   r   rU  rR  )rY   rY   TrV  rQ  rS  r8   r  rT  )Zalign)r   r   ra  )r   r-   )r3   rZ   r[   r   r2   r   r   r  r  objectfillr  r6  r   rE  r   r   Zintpfloat64r   rc  ra  )r   XYr   r%   r8   r  Zmindr+  otherZ_dtypeZ	res_dtyper   r   r   test_len0_arrays  sH   




r  c              	   C   s   d}t ddD ]W}t||f}d||d d < tjdddD ]>\}}| |||dd}|jdks2J | tu r9|jn|jj}t	t
|jjtd	|d  t	t
|jjt|d | qqd S )
Ni   r   ri  r-   FT)repeat)rN  rO  rW   rs   r   )r   r3   r   r  productr   r   r   _noder   r  r  r  r  r$  )r   rD   r;   r5   Zbalancedcompactr1   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   rV   rM   Fr  )r  r  r6  )r   r1   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   rT   rX   r@   r   r;  )r3   rt   r2   r   rF   )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	| q:d S )NrU   rS   rs   r   r   333333?c                    s   g | ]
\}}  ||qS r   r   )r   qiZdir   r   r   r3  !      z2test_query_ball_point_vector_r.<locals>.<listcomp>)
r3   rZ   r[   r  r   r1  r   rE   r   r   )r   r5   r2   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 )NrU   r  r   r  TZreturn_lengthc                 S   r/  r   r0  )r   r   r   r   r   r3  .  r4  z0test_query_ball_point_length.<locals>.<listcomp>Fc                    s   g | ]
}t | qS r   )r1  r   r   r  r%   r   r   r   r3  /  r  c                    s   g | ]
}j | d dqS )Tr  r  r  r  r   r   r3  0  r  )r3   rZ   r[   r  r   r   )r   r5   r2   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sBJ |jd |jd ksNJ | |}|j||dd}|j||dd}t	|| |
|d	\}	}
|
|d	\}}t	|	| t	|
| d S )
NrU   r  r   rS   g{Gz?r   Tr  r   )r3   rZ   r[   r  r  Zascontiguousarrayr   stridesr   r   r2   )r   r5   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s-J ||d\}}	|	jdks<J |jdksCJ t |	 sLJ |
|d
dg}
t|
d
d
g ||d}|jdkshJ d S )NrU   )r   rs   )r   )r   rs   r   rM  r  Tr  r   r-   )r-   r-   r   r   )r3   rZ   r[   r  r   r   r2   r   Zisinfr6   r6  r   rE  )r   rN  rO  Zempty_v3Zquery_v3Zquery_v2r   r  r=   r>   NrG  r   r   r   test_kdtree_empty_inputQ  s"   r  c                   @   ri   )_Test_sorted_query_ball_pointc                 C   s.   t jd t jdd| _| | j| _d S )NrU   rS   r   )r3   rZ   r[   r\   r0   r   r  r]   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| qd S )Nr   TZreturn_sorted)r  r   r0   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|| q-d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  r]   r   r   r3    s    zI_Test_sorted_query_ball_point.test_return_sorted_None.<locals>.<listcomp>Fr  N)r  r   r0   r   r   rE   )r*   r  r  Zidxs_list_singleZidxs_list_FalseZidxs0Zidxs1r   r]   r   test_return_sorted_None}  s   z5_Test_sorted_query_ball_point.test_return_sorted_NoneN)r   rO   rP   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 w   Y  t| j	}tjtdd |
|  W d    n1 sAw   Y  tjtdd |j| dd W d    d S 1 s`w   Y  d S )NrY   r-   zcomplex datar   r   )r   )r3   rZ   r   viewcomplexr   r   r   r
   realr2   r   r   tr   r   r   test_kdtree_complex_data  s   

"r  c                  C   sD  t jd t jdd} t| }|j}t|tjsJ |j| j	d ks&J |g}|r|
d}t|tjrSt|jts>J |jt|jksHJ t| |j |jj nIt|tjs[J t|jtscJ d|j  krp|jk ssJ  J t|jts{J t|jtsJ |j|jj|jj ksJ ||j ||j |s+d S d S )NrU   rS   rT   r   r   )r3   rZ   r[   r   r
   r   r~   Z	innernodechildrenr   popZleafnoder   r1  r   r   r  r  r  r;   r   r   r#  r$  r  )r   r  rootro  rD   r   r   r   test_kdtree_tree_access  s,   
 r  c                  C   s   t jd t jdd} t| }t|jtsJ |j| j	d ks#J t|jts+J |j| j	d ks5J t|j
ts=J |j
dksDJ t|jt j| dd t|jt j| dd |j| u saJ d S )NrU   rS   rT   r   r   rY   r/   )r3   rZ   r[   r   r
   r~   r;   r   rD   r   rW   r   r!  r<   r"  Zaminr5   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 )NrU   r  r      )r*  rs   -   )   rs   r*  r  F)r  r  r   r/   c                    s*   g | ]\}}t | k  |k@  qS r   )r3   r4   )r   Zprev_radiusZradiusr   r  r   r   r3    s    z8test_kdtree_count_neighbors_weighted.<locals>.<listcomp>r   )r3   rZ   r[   r  r  r6  Zlinalgr   rE   r  chainr   )
r  r   ABZwAZwBZkdAZkdBZnABZexpectr   r  r   $test_kdtree_count_neighbors_weighted  s    8r  )gr  Znumpy.testingr   r   r   r   r   r   r   r   r  platformr	   Znumpyr3   Zscipy.spatialr
   r   r   r   Zscipy.spatial._ckdtreer   r   r  Zfixturer   r   r&   r'   rR   rb   rj   rx   ry   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  r[  r_  r`  rd  re  rf  rh  rn  rp  rr  rz  r{  r}  r  r  r  r  r  r  r  r  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
!""

)..

