o
    ?Hh                     @   s  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.G d5d6 d6Z/eG d7d8 d8e/Z0eG d9d: d:e/Z1eG d;d< d<e0Z2eG d=d> d>e1Z3eG d?d@ d@e0Z4eG dAdB dBe1Z5G dCdD dDZ6dEdF Z7dGdH Z8dIdJ Z9dKdL Z:G dMdN dNZ;eG dOdP dPe;Z<G dQdR dRZ=eG dSdT dTe=Z>dUdV Z?dWdX Z@dYdZ ZAd[d\ ZBd]d^ ZCd_d` ZDdadb ZEdcdd ZFdedf ZGdgdh ZHdidj ZIdkdl ZJdmdn ZKdodp ZLdqdr ZMdsdt ZNejOPdudvdw ZQdxdy ZRdzd{ ZSd|d} ZTd~d ZUejOjVe dkdddd ZWdd ZXejOPdudd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`ejOadg ddd ZbeG dd dZcdd Zddd Zedd ZfejOadeegdd Zgdd Zhdd ZiejOadeegdd Zjd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)param)request r   _/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-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.
    _Testz)Expected a class name starting with _Test   N_zDuplicated test name: r   )__name__
startswithRuntimeErrorr
   r   globalstype)klstree	test_name	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>axis)
xkdtreequeryr   npsumdatar   allnewaxis)r0   r7   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 )Nr3   r4   r   r5   )r7   mr8   r9   r:   amaxargmaxr   r;   r<   r   r>   )r0   r7   rB   ddiir+   r?   r@   r   r   r   test_m_nearest=   s   
"6zConsistencyTests.test_m_nearestc           	      C   s   | j }| j}| jj|| jj|d\}}d}d}t||D ]0\}}|tjkr&q|d7 }t|d t	|| j
|  d  t||| k d|dd|d qtt	| | j
|d|d | k | d S )	Nkdistance_upper_boundr4   r   r   r3   near_d=g should be less than )r7   r+   r8   r9   nzipr:   infr   r;   r<   r   r   r1   	r0   r7   r+   rE   rF   r@   hitsnear_dnear_ir   r   r   test_points_nearJ   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|dd|d qtt| 	| j
|d|| k | d S )Nr   rI   r(   rJ   r4   r   rK   rL   rM   )r7   r+   r8   r9   rN   rO   r:   rP   r   r1   r<   r   r   r;   rQ   r   r   r   test_points_near_l1X   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|dd|d qtt| 	| j
|tj|| k | d S )NrV   r4   r   r   rK   rL   rM   )r7   r+   r8   r9   rN   r:   rP   rO   r   r1   r<   r   r   r;   rQ   r   r   r   test_points_near_linff   s   
$*z&ConsistencyTests.test_points_near_linfc                 C   sV   | j }| j}d}| j||\}}| jj|||d\}}tt||d|  k d S )N皙?)r@   r   )r7   rI   r8   r9   r   r:   r=   )r0   r7   rI   r@   d_reali_realr+   r?   r   r   r   test_approxt   s   zConsistencyTests.test_approxN)
r   
__module____qualname__r1   rA   rG   rU   rW   rX   r\   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        r3   leafsize皙?
   )rN   rB   r:   randomseedrandnr<   r   r8   r7   r+   rI   r0   r   r   r   setup_method   s   
z_Test_random.setup_methodNr   r]   r^   rl   r   r   r   r   r`   }       r`   c                          e Zd Z fddZ  ZS )_Test_random_farc                    s"   t    tj| jd | _d S )Nrg   )superrl   r:   rh   rj   rB   r7   rk   	__class__r   r   rl      s   
z_Test_random_far.setup_methodr   r]   r^   rl   __classcell__r   r   rr   r   rp          rp   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   rc      r%   rb   )r:   arrayr<   r   r8   rN   rB   rh   ri   rj   r7   r+   rI   rk   r   r   r   rl      s    



z_Test_small.setup_methodc                 C   s   t | jddd d S )Nr   r   rY   r   )rY   r   r   r8   r9   rk   r   r   r   rA      s   z_Test_small.test_nearestc                 C   s$   t | jddddgddgf d S )Nr   r3   rY   g?r   r   r   rk   r   r   r   test_nearest_two   s   z_Test_small.test_nearest_twoN)r   r]   r^   rl   rA   r   r   r   r   r   rx      s    rx   c                       ro   )_Test_small_nonleafc                    s    t    | j| jdd| _d S )Nr   rd   )rq   rl   r   r<   r8   rk   rr   r   r   rl      s   
z _Test_small_nonleaf.setup_methodrt   r   r   rr   r   r      rv   r   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_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 	Nry   rz   r{   r|   r}   r~   r   r   )r:   r   r<   r
   r8   rk   r   r   r   rl         
z&Test_vectorization_KDTree.setup_methodc                 C   s>   | j tg d\}}tt|t tt|tj d S Nry   )	r8   r9   r:   r   r   
isinstancefloat
issubdtypesignedintegerr0   r+   r?   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r3   rb   r   )r3   rb   r8   r9   r:   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   ry   rI   )
r8   rN   r9   r:   r   r   r   r   r=   isfiniter0   skkr+   r?   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   r3   rb   
r8   rN   r9   r:   r   r   r   r   r=   r   r   r   r   r   (test_vectorized_query_multiple_neighbors      .2zBTest_vectorization_KDTree.test_vectorized_query_multiple_neighborsc                 C   sH   d}t jtdd | jj|d d W d    d S 1 sw   Y  d S )N      ?zk must be an integer or*matchr   )pytestr   
ValueErrorr8   r9   )r0   r7   r   r   r   test_query_raises_for_k_none   s   "z6Test_vectorization_KDTree.test_query_raises_for_k_noneN)	r   r]   r^   rl   r   r   r   r   r   r   r   r   r   r      s    		r   c                   @   r   )Test_vectorization_cKDTreec                 C   r   r   )r:   r   r<   r   r8   rk   r   r   r   rl      r   z'Test_vectorization_cKDTree.setup_methodc                 C   s4   | j g d\}}tt|t tt|t d S r   )r8   r9   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 )Nrc   r     )	r:   rh   ri   rj   Tr8   r9   rO   r   )r0   qsdsi_sqr+   r?   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   )	r8   rN   r9   r   r:   r   r   r=   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   r]   r^   rl   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 Nr   r   r/   r   r   r   r1     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(   r@   r   T)r:   
atleast_2dr7   broadcast_tor+   r   r   query_ball_pointr(   r@   	enumerater1   r<   r   tol)r0   r7   r+   lr?   inddist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)r:   r   r7   r   r+   r   r   r   r(   r@   r   onesrN   boolr1   r<   r   r   )	r0   r7   r+   r   r?   r   cr   r   r   r   r   test_found_all!  s   ,,zball_consistency.test_found_allN)r   r]   r^   r   r1   r   r   r   r   r   r   r     s
    	r   c                   @   r_   )_Test_random_ballc                 C   sZ   d}d}t jd t j||| _| j| jdd| _t j|| _d| _d| _	d| _
d S )	Nra   rb   rc   r3   rd          @r   rf   )r:   rh   ri   rj   r<   r   r   r7   r(   r@   r+   r0   rN   rB   r   r   r   rl   .  s   
z_Test_random_ball.setup_methodNrm   r   r   r   r   r   ,  rn   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   r1   <     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'  rb   rc   sizer3   r   re   r)   rY   r   r   rf   )r:   rh   ri   uniformr<   r   r   fullr7   r(   r@   r+   r   r   r   r   rl   ?  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   r7   r+   r(   r@   r   r1   r<   )r0   r   r?   r   r   r   test_in_ball_outsideJ  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 
| | j| | j| j| jd| j	  ks6J | jj| jd | j| j| j	d}d||< t 
| | j| | j| j| jd| j	  kscJ d S )Nr   r   r   F)r:   r   r   rN   r   r   r7   r+   r(   r@   r=   r1   r<   )r0   r   r   r   r   r   test_found_all_outsideR  s    & &z1_Test_random_ball_periodic.test_found_all_outsideN)r   r]   r^   r1   rl   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   r3   {   ra   r   r   rg   )r:   rh   ri   randintr<   r   r   r7   r(   r@   r+   r   r   r   r   rl   g  s   
z/_Test_random_ball_largep_issue9890.setup_methodN)r   r]   r^   r   rl   r   r   r   r   r   a  s    r   c                       ro   )_Test_random_ball_approxc                       t    d| _d S NrY   rq   rl   r@   rk   rr   r   r   rl   v     

z%_Test_random_ball_approx.setup_methodrt   r   r   rr   r   r   s      r   c                       ro   )!_Test_random_ball_approx_periodicc                    r   r   r   rk   rr   r   r   rl   ~  r   z._Test_random_ball_approx_periodic.setup_methodrt   r   r   rr   r   r   {  r   r   c                       ro   )_Test_random_ball_farc                    r   Nr   rq   rl   r+   rk   rr   r   r   rl     r   z"_Test_random_ball_far.setup_methodrt   r   r   rr   r   r     r   r   c                       ro   )_Test_random_ball_far_periodicc                    r   r   r   rk   rr   r   r   rl     r   z+_Test_random_ball_far_periodic.setup_methodrt   r   r   rr   r   r     r   r   c                       ro   )_Test_random_ball_l1c                    r   )Nr   )rq   rl   r(   rk   rr   r   r   rl     r   z!_Test_random_ball_l1.setup_methodrt   r   r   rr   r   r     r   r   c                       ro   )_Test_random_ball_linfc                       t    tj| _d S r   rq   rl   r:   rP   r(   rk   rr   r   r   rl        
z#_Test_random_ball_linf.setup_methodrt   r   r   rr   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      rc   r3   r   r   r3   r   r   r   )
r:   rh   ri   rj   r   r   r   r   r   list)r   rN   rB   r   rr   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     r3   g~jth?r   workers@   r   )r:   rh   ri   rj   r   ranger   )	r   rN   rI   pointsr   l1l2l3r?   r   r   r   $test_query_ball_point_multithreading  s"   r   c                   @   rw   )two_trees_consistencyc                 C   r.   r   r   r/   r   r   r   r1     r2   ztwo_trees_consistency.distancec                 C   sl   | j j| j| j| j| jd}t|D ]!\}}|D ]}| | j| | j	| | j| jd| j  ks2J qqd S )Nr   r   )
T1query_ball_treeT2r+   r(   r@   r   r1   data1data2)r0   r   r?   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 ],\}}tj| jj	t
d}d||< t| | j| | j| | j| jd| j  ks>J qd S )Nr   r   Fr   )r   r   r  r+   r(   r@   r   r:   r   rN   r   r=   r1   r  r  )r0   r   r?   r   r   r   r   r   r     s   z$two_trees_consistency.test_found_allN)r   r]   r^   r1   r  r   r   r   r   r   r     s    r   c                   @   r_   )_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 )	N2   rb   rc   r3   rd   r   r   rf   )r:   rh   ri   rj   r  r   r   r  r  r(   r@   r+   r   r   r   r   rl     s   
z#_Test_two_random_trees.setup_methodNrm   r   r   r   r   r    s    r  c                   @      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   r1     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  rb   rc   r   r3   r   r   r   r   rf   )r:   rh   ri   r   r  r   r   r  r  r(   r@   r+   r   r   r   r   rl     s   
z,_Test_two_random_trees_periodic.setup_methodN)r   r]   r^   r1   rl   r   r   r   r   r	    s    r	  c                       ro   )_Test_two_random_trees_farc                    r   Nr3   r   rk   rr   r   r   rl     r   z'_Test_two_random_trees_far.setup_methodrt   r   r   rr   r   r
    r   r
  c                       ro   )#_Test_two_random_trees_far_periodicc                    r   r  r   rk   rr   r   r   rl     r   z0_Test_two_random_trees_far_periodic.setup_methodrt   r   r   rr   r   r    r   r  c                       ro   )_Test_two_random_trees_linfc                    r   r   r   rk   rr   r   r   rl   
  r   z(_Test_two_random_trees_linf.setup_methodrt   r   r   rr   r   r    r   r  c                       ro   )$_Test_two_random_trees_linf_periodicc                    r   r   r   rk   rr   r   r   rl     r   z1_Test_two_random_trees_linf_periodic.setup_methodrt   r   r   rr   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   rectrk   r   r   r   rl     s   zTest_rectangle.setup_methodc                 C   s   t | jddgd d S )Nr%   r   r   r  min_distance_pointrk   r   r   r   test_min_inside     zTest_rectangle.test_min_insidec                 C   s   t | jddgd d S Nr%   g      ?r  rk   r   r   r   test_min_one_side  r  z Test_rectangle.test_min_one_sidec                 C   s    t | jddgtd d S r  )r   r  r  r:   sqrtrk   r   r   r   test_min_two_sides"      z!Test_rectangle.test_min_two_sidesc                 C   s$   t | jddgdtd  d S )Nr%   r   r3   r   r  max_distance_pointr:   r  rk   r   r   r   test_max_inside%     $zTest_rectangle.test_max_insidec                 C   s"   t | jddgtdd d S r  )r   r  r  r:   hypotrk   r   r   r   test_max_one_side(  s   
z Test_rectangle.test_max_one_sidec                 C   s$   t | jddgdtd  d S r  r  rk   r   r   r   test_max_two_sides,  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   rY   r   )r  splitr   maxesmins)r0   lessgreaterr   r   r   
test_split/  s
   zTest_rectangle.test_splitN)r   r]   r^   rl   r  r  r  r  r   r!  r'  r   r   r   r   r    s    r  c                   C   s$   t tddgddgdtd d S Nr   r   r3   )r   r   r:   r  r   r   r   r   test_distance_l27  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_l1;  s   r*  c                   C   s    t tddgddgtjd d S r  )r   r   r:   rP   r   r   r   r   test_distance_linf?  r  r+  c                  C   sB   t jd t jddd} t jddd}tt| |jd d S )Nrc   rg   r   r      )rg   r,  )r:   rh   ri   rj   r   r   r   )r7   yr   r   r   test_distance_vectorizationC  s   r.  c                   @   rw   )count_neighbors_consistencyc              	   C   :   d}t | j| j|tdd | j| j|D  d S )Nrf   c                 S      g | ]}t |qS r   len.0r   r   r   r   
<listcomp>N      z?count_neighbors_consistency.test_one_radius.<locals>.<listcomp>r   r   count_neighborsr  r:   r;   r   r0   r   r   r   r   test_one_radiusK     z+count_neighbors_consistency.test_one_radiusc              	   C   r0  )Nr   c                 S   r1  r   r2  r4  r   r   r   r6  S  r7  zAcount_neighbors_consistency.test_large_radius.<locals>.<listcomp>r8  r:  r   r   r   test_large_radiusP  r<  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?rg   r   r   )r:   explinspacelogr   r9  r  r   r=   r*   rO   r   )r0   rsresultsr   resultr   r   r   test_multiple_radiusU  s    z0count_neighbors_consistency.test_multiple_radiusN)r   r]   r^   r;  r=  rE  r   r   r   r   r/  J  s    r/  c                   @   r_   )_Test_count_neighborsc                 C   sL   d}d}t jd | jt j||dd| _| jt j||dd| _d S )Nr  r3   rc   rd   )r:   rh   ri   r   rj   r   r  r   r   r   r   rl   ^  s
   z"_Test_count_neighbors.setup_methodNrm   r   r   r   r   rF  \  rn   rF  c                   @   r   )"sparse_distance_matrix_consistencyc                 C   r.   r   r   r/   r   r   r   r1   h  r2   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   decimal)r   sparse_distance_matrixr  r   r   r   r   r1   r<   r(   itemsr   )r0   Mr   r?   r   r  r+   r   r   r   test_consistency_with_neighborsk  s   
zBsparse_distance_matrix_consistency.test_consistency_with_neighborsc                 C   s   | j | j | j d S r   )r   rK  r   rk   r   r   r   test_zero_distancex  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   rH  rI  )r   rK  r  r   r   r<   r   toarray)r0   M1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      r3   r   Fbalanced_treecompact_nodesr   rH  rI  )r:   rh   ri   r   rj   r   r   rK  rP  r   r   )r0   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output_typerH  rI  ndarrayr   r?   r  v
dok_matrix
coo_matrix)r:   r   rN   r   r  r  dotr  r   r   rK  r  keysr   r   rP  )r0   refr?   r  r^  r   r   rI   r   r   r   test_ckdtree_return_types  s>   $
z<sparse_distance_matrix_consistency.test_ckdtree_return_typesN)	r   r]   r^   r1   rN  rO  rS  rY  rd  r   r   r   r   rG  f  s    	rG  c                   @   r_   )_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  rb   rc   r3   rd   r%   )r:   rh   ri   rj   r   r   r  r   r(   r  r  rN   rB   )r0   rN   rB   r  r  r   r   r   rl     s   
z)_Test_sparse_distance_matrix.setup_methodNrm   r   r   r   r   re    rn   re  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 )Nrg      rb   rc   )
r:   rh   ri   rj   r   r   r   r   r   r   )rB   rN   rI   xsysr   r?   r  r   r   r   test_distance_matrix  s   
"ri  c                  C   sZ   d} d}d}t jd t j| |}t j||}t||}t||dd}t|| d S )Nrg   rf  rb   rc   r   )	threshold)r:   rh   ri   rj   r   r   )rB   rN   rI   rg  rh  r   dslr   r   r   test_distance_matrix_looping  s   
rl  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   r?   r   r  r   r   r   check_onetree_query  s   rp  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  rb   rY   r   gMbP?r3   gh㈵>gư>)r:   rh   ri   rj   rp  )r   rN   rI   r   r   r   r   r   test_onetree_query  s   



rq  c                 C   s$   | ddgg}t |dt  d S )Nr   r   r%   )r   ro  rm  )r   r!   r   r   r   test_query_pairs_single_node     rr  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  r3   rY   r   rm  r[  r]  )r:   rh   ri   rj   rm  r   ra  rn  sortedro  r   r   r   )r   rN   rI   r   r2r   r   bruter?   r  r^  l0r   r   arrr   r   r   r   test_kdtree_query_pairs  s8    


(ry  c                    st   t d}t dd| d}t dd| d  fdd|D }| |}|j|dd}|j|d	 d
}t|| d S )Nr3   r   r   rb   c                    s   g | ]} D ]}||fqqS r   r   )r5  xiyiy_ranger   r   r6  "  s    z(test_query_pairs_eps.<locals>.<listcomp>rY   )r   r@   )\(?r   )r:   r  r@  ro  r   )r   spacingx_rangexy_arrayr!   	pairs_epspairsr   r|  r   test_query_pairs_eps  s   
r  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   rb   )rb      	      )r3   r   r   r   )
r:   mgridr   rO   ravelr   rt  r   asarrayr   )r   r7   r-  r   r!   r   r   r   test_ball_point_ints+  s   r  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
   noder5  r   r   r   r   r6  :  r7  z+test_kdtree_comparisons.<locals>.<listcomp>r   r   )r   r   rt  )nodesr   r   r   test_kdtree_comparisons8  s    r  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   rb   r   r   r   F)rW  )rV  )rW  rV  )r:   rh   ri   rj   r9   r   )r   rN   rI   r   r   r  T3T4r   r   r   test_kdtree_build_modes>  s"   

r  c                 C   sx   dd l }tjd d}d}tj||}| |}||}||}|j|ddd }|j|ddd }t|| d S )Nr   r  rb   r   r   r   )	pickler:   rh   ri   rj   dumpsloadsr9   r   r   r  rN   rI   r   r   tmpr  r   r   r   test_kdtree_pickleM  s   

r  c                 C   s   dd l }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  rb   r   r   )r)   r   r   r   )	r  r:   rh   ri   r   r  r  r9   r   r  r   r   r   test_kdtree_pickle_boxsize[  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   rb   T)	copy_datar   r   r   .)r:   rh   ri   rj   copyr9   r   )r   rN   rI   r   r   r   r   r  r   r   r   test_kdtree_copy_datai  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   rb   r   r   )rI   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   )r:   rh   ri   rj   r9   r   setattrosr   r   NotImplementedError)	r   monkeypatchrN   rI   r   r   r   r  r  r   r   r   test_ckdtree_parallelx  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   ra   rb   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   re   data_pointsmaxmin)rN   r7   r-  r8   recurse_treer   r   r    s   


z'test_ckdtree_view.<locals>.recurse_tree)r:   rh   ri   rj   r   r!   r   sortr  r   r<   r  )rN   rI   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   r3   )r   r3   r   r   rc   r   r   rd   .)
r:   rh   ri   r   r9   r   r   r3  r   r  )r   rN   rB   klistkintr<   r8   rE   rF   dd1ii1r   r   r   test_kdtree_list_k  s.   

r  rg   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  r   rc   r   r   r   r   rd   r3   g      @r(   )r)   r(   )	r:   rh   ri   r   rP   r9   r   r   simulate_periodic_box)r   rN   rB   rI   r<   r8   kdtree2r(   rE   rF   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  r3   r   rc   r   r   r   r   rd   r  )r:   rh   ri   r   rP   r9   r   r   )r   rN   rB   rI   r<   r8   r  r(   rE   rF   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   r3   rg   r   r   r   r   )r   r   )r   r   )r:   r@  reshaper   r   r   r   r<   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   rg   r   r   )r:   r@  assert_raisesr   r  r   r   r   test_kdtree_box_lower_bounds  rs  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 )Nr   r   r   r  r   r5   )rF   i8)rE   f8r   rF   rE   )order)r:   aranger   r   unravel_indexr   r9   r  appendconcatenateemptyr3  r  )r8   r<   rI   r)   r(   rE   rF   r7   nnrN   imager  r  rD  r   r   r   r    s,    
0r  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   rg   g     X@r  ra   rb   r3   )rI   r(   )resourceImportErrorr:   r  slicesincos
empty_likerh   r   r   flatvstacknonzeror   	getrusageRUSAGE_SELF	ru_maxrssr   r   r9   r   )r  dxdyr-  r7   zz_copyFILLVALmaskigoodibadmem_user?   r!   	num_leaksr   iquerynew_mem_user   r   r   test_ckdtree_memuse$  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   rb   r   rd   f4r   )rb   r3   r   r   r3   r   r   rg   )weightsra   )r:   r@  r  r   r3  _build_weightsr   r  r   r   r9  r  )r   r<   tree1r  nwr?   c1c2c3c4w1r  tree2r   r   r   test_kdtree_weightsO  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  r3   rc   r   r   rd   )r   r>  r>  g{Gz?r  F
cumulative)r:   rh   ri   normalr  r3  r9  r   cumsumrO   	itertoolspermutationsr   r   )r   rN   rB   r<   r8   r0i0n0nncr?   r   r   r   r   &test_kdtree_count_neighbous_multiple_r}  s    
r  c                 C   s(  t jd}|dd}|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 )Nrc   rg   r3   r%   r   r   rY   )rg   )r   r   r   r_  r[  )rg   rg   Tr`  rZ  r]  r?   r  r^  )align)r   r   rm  )r   r3   )r:   rh   RandomStaterandr9   r   r   r  r  objectfillr   r9  r   rK  r   r   intpfloat64r   ro  rm  )r   rngXYr!   r+   r?   r  mindr-  other_dtype	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   r  r3   FT)repeat)rV  rW  re   r   r   )r   r:   r   r  productr   r   r!   _noder   r  r  r  r  r&  )r   rN   rB   r<   balancedcompactr8   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   rd   rY   Fr  )r  r   r9  )r   r8   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  r   rb   rf   rH   r   r>  )r:   r   r9   r   rP   )r   xyzckdtdeq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 )Nrc   ra   r   r   r   333333?c                    s   g | ]
\}}  ||qS r   r   )r5  qidir!   r   r   r6        z2test_query_ball_point_vector_r.<locals>.<listcomp>)
r:   rh   ri   r  r   r3  r   rO   r   rt  )r   r<   r9   r+   rvector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 )Nrc   r  r   r  Treturn_lengthc                 S   r1  r   r2  )r5  r   r   r   r   r6    r7  z0test_query_ball_point_length.<locals>.<listcomp>Fc                    s   g | ]
}t | qS r   )r3  r   r5  r  r+   r!   r   r   r6    r!  c                    s   g | ]
}j | d dqS )Tr%  r  r'  r(  r   r   r6    r!  )r:   rh   ri   r  r   r   )r   r<   r9   lengthlength2length3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 )
Nrc   r  r   ra   g{Gz?r   Tr%  r   )r:   rh   ri   r  r  ascontiguousarrayr   stridesr   r   r9   )r   r<   d_contiguousd_discontiguousquery_contiguousquery_discontiguousr!   length1r*  d1i1d2i2r   r   r   test_discontiguous  s0   

r9  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 )Nrc   )r   r   )r   )r   r   r   rU  r  Tr%  r   r3   )r3   r3   r   r   )r:   rh   ri   r  r   r   r9   r   isinfr=   r9  r   rK  )r   rV  rW  empty_v3query_v3query_v2r!   r)  rE   rF   NrM  r   r   r   test_kdtree_empty_input1  s"   r?  c                   @   rw   )_Test_sorted_query_ball_pointc                 C   s.   t jd t jdd| _| | j| _d S )Nrc   ra   r   )r:   rh   ri   rj   r7   r   r  rk   r   r   r   rl   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return_sorted)r  r   r7   r   rt  )r0   	idxs_listidxsrz  r   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   )r5  rz  rk   r   r   r6  e  s    zI_Test_sorted_query_ball_point.test_return_sorted_None.<locals>.<listcomp>FrA  N)r  r   r7   r   rt  rO   )r0   rC  rD  idxs_list_singleidxs_list_Falseidxs0idxs1r   rk   r   test_return_sorted_None]  s   z5_Test_sorted_query_ball_point.test_return_sorted_NoneN)r   r]   r^   rl   rE  rJ  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 )Nrg   r3   zcomplex datar   r   r  )r:   rh   r  viewcomplexr   r   	TypeErrorr
   realr9   r   r   tr   r   r   test_kdtree_complex_datak  s   

"rQ  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 )Nrc   ra   rb   r   r   )r:   rh   ri   r  r
   r!   r   	innernodechildrenr   popleafnoder   r3  idxr   r  r  r  rB   r"  r   r%  r&  r  )r   rP  rootr  rN   r   r   r   test_kdtree_tree_access{  s,   
 rX  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 )Nrc   ra   rb   r   r   rg   r5   )r:   rh   ri   r  r
   r   rB   r   rN   r   re   r   r#  rC   r$  aminr<   rO  r   r   r   test_kdtree_attributes  s   rZ  kdtree_classc                    s  t jd}t ddd}|dd}|dd}|d}|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 )Nrc   r  r      )r,  r   -   )   r   r,  r^  F)r  r  r   r5   c                    s*   g | ]\}}t | k  |k@  qS r   )r:   r;   )r5  prev_radiusradiusr   r  r   r   r6    s    z8test_kdtree_count_neighbors_weighted.<locals>.<listcomp>r   )r:   rh   r   r  r  r9  linalgr   rO   r  chainr   )r[  r  r   ABwAwBkdAkdBnABexpectr   ra  r   $test_kdtree_count_neighbors_weighted  s   

 8rl  c                  C   sp   g d} t | }t| t|tjgd d d f }tjtdd t| W d    d S 1 s1w   Y  d S )N)
r   r   ir,  ii   r   imust be finiter   )	r3  r:   r  r   nanr   r   r   r
   )valsrN   r<   r   r   r   test_kdtree_nan  s   $
"rr  c                  C   s  t jd} | jdddd}t|ddd}dd	 td
D }tjtdd |	| W d    n1 s5w   Y  tjtdd |
|d W d    n1 sRw   Y  t j|dd d f< tjtdd t|ddd W d    n1 syw   Y  tjtdd t|ddd W d    n1 sw   Y  tjtdd t|ddd W d    n1 sw   Y  tjtdd t|ddd W d    d S 1 sw   Y  d S )Ni90  r  r   rY   )r   lowhighFrU  c                 S   s   g | ]}t jqS r   )r:   rp  r  r   r   r   r6    s    z2test_nonfinite_inputs_gh_18223.<locals>.<listcomp>r   ro  r   r   r   T)r:   rh   default_rngr   r
   r   r   r   r   r9   r   rp  )r  coordsrP  	bad_coordr   r   r   test_nonfinite_inputs_gh_18223  s.   "rx  incantationc                 C   s`   G dd dt j}ddgddgddgg}t |}||}| |d	}||d
 ||d d S )Nc                   @   r  )ztest_gh_18800.<locals>.ArrLikec                 S   s   t || }d |_|S r   )r:   r  rK  r=   )clsinput_arrayobjr   r   r   __new__  s   z&test_gh_18800.<locals>.ArrLike.__new__c                 S   s   |d u rd S t |dd | _d S )Nr=   )getattrr=   )r0   r|  r   r   r   __array_finalize__  s   z1test_gh_18800.<locals>.ArrLike.__array_finalize__N)r   r]   r^   r}  r  r   r   r   r   ArrLike  s    r  gGzP@gQE@@gQ6@gp=
c6@g(\?@g=
ףpMT@rg   r   r  )r:   r]  r   r9   r   )ry  r  r   rx  arr_liker!   r   r   r   test_gh_18800  s   

r  )kr  numpy.testingr   r   r   r   r   r   r   r   r  platformr	   numpyr:   scipy.spatialr
   r   r   r   scipy.spatial._ckdtreer   r   r  fixturer   r$   r,   r-   r`   rp   rx   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/  rF  rG  re  ri  rl  rp  rq  rr  ry  r  r  r  r  r  r  r  r  r  r  mark	fail_slowr  r  r  r  r  skipifr  r  r  r  r  r  r  r$  r-  r9  parametrizer?  r@  rQ  rX  rZ  rl  rr  rx  r  r   r   r   r   <module>   s    
K-/& 	I
!"
"


)
.
.


