
    >qjL                         d dl Z 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Zd dlmZ d dlmZmZmZmZ d dlmZ d dlmZmZ d dlmZmZ d d	lmZmZmZm Z   e	jB                  eeg
      d        Z"d Z#d Z$ G d d      Z%e# G d de%             Z&e# G d de&             Z'e# G d de%             Z(e# G d de(             Z) G d d      Z* G d d      Z+ G d d      Z,e# G d de,             Z-e# G d  d!e,             Z.e# G d" d#e,             Z/e# G d$ d%e-             Z0e# G d& d'e-             Z1e# G d( d)e-             Z2e# G d* d+e.             Z3e# G d, d-e-             Z4e# G d. d/e-             Z5d0 Z6e	jn                  jq                  d12      e	jn                  js                  d3      d4               Z:e	jn                  jq                  d12      e	jn                  js                  d3      d5               Z; G d6 d7      Z<e# G d8 d9e<             Z=e# G d: d;e<             Z>e# G d< d=e=             Z?e# G d> d?e>             Z@e# G d@ dAe=             ZAe# G dB dCe>             ZB G dD dE      ZCdF ZDdG ZEdH ZFdI ZG G dJ dK      ZHe# G dL dMeH             ZI G dN dO      ZJe# G dP dQeJ             ZKdR ZLdS ZMdT ZNdU ZOdV ZPdW ZQdX ZRdY ZSdZ ZTd[ ZUd\ ZVd] ZWd^ ZXd_ ZYd` ZZda Z[e	jn                  js                  db      dc        Z\dd Z]de Z^df Z_dg Z`e	jn                  j                  dh        Zbdi Zce	jn                  js                  db      dj        Zddk Zedl Zfdm Zgdn Zhdo Zidp Zjdq Zke	jn                  j                  drg ds      dt        Zme# G du dv             Zndw Zodx Zpdy Zqe	jn                  jq                  dz2      d{        Zrd| Zse	jn                  j                  d}eeg      d~        Ztd Zud Zve	jn                  j                  deeg      d        Zwd Zxy)    N)assert_equalassert_array_equalassert_assert_almost_equalassert_array_almost_equalassert_allclose)raises)_run_concurrent_barrier)KDTree	Rectangledistance_matrixcKDTree)cKDTreeNode)minkowski_distanceminkowski_distance_p)cdist	minkowski)	dok_array	coo_array
dok_matrix
coo_matrix)paramsc                     | j                   S N)param)requests    ^/opt/rentech/trading_bot/.venv/lib/python3.12/site-packages/scipy/spatial/tests/test_kdtree.pykdtree_typer      s    ==    c                     | j                   j                  d      st        d      t        t        fD ]X  }| j                   dd dz   |j                   z   }|t               v rt        d|z         t        || fd|i      }|t               |<   Z | 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_cases       r   
KDTreeTestr-      s    
 <<""7+FGG! )LL$s*T]]:		!7)CDD SF]D,AB	(	)) Jr   c                 v    | |z
  }||d|z  kD  xx   |z  cc<   ||d|z  k  xx   |z  cc<   t        |d|      }|S )N      ?g      r   r   )abpboxsizediffds         r   distance_boxr7   .   sP    q5Dg	')w	7*$1AHr   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	ConsistencyTestsc                     t        |||      S r   r0   selfr1   r2   r3   s       r   distancezConsistencyTests.distance6       Aq!!r   c                    | j                   }| j                  j                  |d      \  }}t        |dz  t	        j
                  || j                  |   z
  dz               d}t        t	        j                  t	        j
                  | j                  |t        j                  d d f   z
  dz  d      |dz  |z
  kD               y )Nr"      :0yE>axis)
xkdtreequeryr   npsumdatar   allnewaxis)r<   rD   r6   iepss        r   test_nearestzConsistencyTests.test_nearest9   s    FF{{  A&1AqD"&&!DIIaL.1)<"=>rvvtyy2::q=)99A=AFAcQRSr   c                    | j                   }| j                  }| j                  j                  ||      \  }}t	        j
                  |      }|t	        j                  |         }t        |dz  t	        j                  || j                  |   z
  dz               d}t        t	        j                  t	        j                  | j                  |t        j                  d d f   z
  dz  d      |dz  |z   k        |       y )Nr@   rA   r"   rB   )rD   mrE   rF   rG   amaxargmaxr   rH   rI   r   rK   )r<   rD   rP   ddiir6   rL   rM   s           r   test_m_nearestzConsistencyTests.test_m_nearest@   s    FFFF""1a(BGGBKryy}AqD"&&!DIIaL.1)<"=>FF266499Qrzz1}%559BQT#XMN	
r   c           	      $   | j                   }| j                  }| j                  j                  || j                  j                  |      \  }}d}d}t        ||      D ]m  \  }}|t        j                  k(  r|dz  }t        |dz  t        j                  || j                  |   z
  dz               t        |||z   k  d|dd|d       o t        t        j                  | j                  | j                  |d      |dz  |z   k        |       y )	Nkdistance_upper_boundrA   r   r"   r@   near_d=g should be less than )rD   r6   rE   rF   nziprG   infr   rH   rI   r   r   r=   	r<   rD   r6   rS   rT   rM   hitsnear_dnear_is	            r   test_points_nearz!ConsistencyTests.test_points_nearM   s    FFFF""1A"NB!"bk 	TNFFAID	2661TYYv5F3F2J+KLFQsUNgfQZ7LQqE$RS	T 	RVVDMM$))Q:QT#XEFMr   c           	      
   | j                   }| j                  }| j                  j                  || j                  j                  d|      \  }}d}d}t        ||      D ]b  \  }}|t        j                  k(  r|dz  }t        || j                  || j                  |   d             t        |||z   k  d|dd|d       d t        t        j                  | j                  | j                  |d      ||z   k        |       y )Nr"   rX   r3   rY   rA   r   rZ   r[   r\   )rD   r6   rE   rF   r]   r^   rG   r_   r   r=   rI   r   r   rH   r`   s	            r   test_points_near_l1z$ConsistencyTests.test_points_near_l1[   s    FFFF""1QR"SB!"bk 	TNFFAIDa69JA(NOFQsUNgfQZ7LQqE$RS	T 	RVVDMM$))Q:QsUBCTJr   c           	      ^   | j                   }| j                  }| j                  j                  || j                  j                  t
        j                  |      \  }}d}d}t        ||      D ]p  \  }}|t
        j                  k(  r|dz  }t        || j                  || j                  |   t
        j                               t        |||z   k  d|dd|d       r t        t        j                  | j                  | j                  |t
        j                        ||z   k        |       y )Nrf   rA   r   r"   rZ   r[   r\   )rD   r6   rE   rF   r]   rG   r_   r^   r   r=   rI   r   r   rH   r`   s	            r   test_points_near_linfz&ConsistencyTests.test_points_near_linfi   s    FFFF""1VW"XB!"bk 	TNFFAIDa69JBFF(STFQsUNgfQZ7LQqE$RS	T 	RVVDMM$))Q?!C%GH$Or   c                    | j                   }| j                  }d}| j                  j                  ||      \  }}| j                  j                  |||      \  }}t	        t        j                  ||d|z   z  k               y )N皙?)rM   r"   )rD   rX   rE   rF   r   rG   rJ   )r<   rD   rX   rM   d_reali_realr6   rL   s           r   test_approxzConsistencyTests.test_approxw   sp    FFFF**1a0{{  A3 /1qFAcEN*+,r   N)
r$   
__module____qualname__r=   rN   rU   rd   rg   ri   rn    r   r   r9   r9   5   s)    "T
NKP-r   r9   c                       e Zd Zd Zy)_Test_randomc                    d| _         d| _        t        j                  j	                  d       t        j                  j                  | j                   | j                        | _        | j                  | j                  d      | _        t        j                  j                  | j                        | _	        d| _
        d| _        y )Nd        r@   leafsize皙?
   )r]   rP   rG   randomseedrandnrI   r   rE   rD   r6   rX   r<   s    r   setup_methodz_Test_random.setup_method   s    
		tIIOODFFDFF3	&&tyy1&=(r   Nr$   ro   rp   r   rq   r   r   rs   rs      s    r   rs   c                        e Zd Z fdZ xZS )_Test_random_farc                     t         |           t        j                  j	                  | j
                        dz   | _        y )Nr{   )superr   rG   r|   r~   rP   rD   r<   	__class__s    r   r   z_Test_random_far.setup_method   s+    (+r   r$   ro   rp   r   __classcell__r   s   @r   r   r      s    , ,r   r   c                       e Zd Zd Zd Zd Zy)_Test_smallc                    t        j                  g dg dg dg dg dg dg dg dg      | _        | j                  | j                        | _        | j                  j
                  | _        | j                  j                  | _        t         j                  j                  d	       t         j                  j                  d
      | _
        d| _        d| _        y )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"   rw      r/   rv   )rG   arrayrI   r   rE   r]   rP   r|   r}   r~   rD   r6   rX   r   s    r   r   z_Test_small.setup_method   s    HHi''''''') *	 &&tyy1
		t#r   c                 P    t        | j                  j                  dd      d       y )Nr   r   rk   r"   )rk   r   r   rE   rF   r   s    r   rN   z_Test_small.test_nearest   s!    !!+q1	r   c                 \    t        | j                  j                  dd      ddgddgf       y )Nr   r@   rk   g?r   r"   r   r   s    r   test_nearest_twoz_Test_small.test_nearest_two   s.    !!+q1saV$	&r   N)r$   ro   rp   r   rN   r   rq   r   r   r   r      s    "
&r   r   c                        e Zd Z fdZ xZS )_Test_small_nonleafc                 f    t         |           | j                  | j                  d      | _        y )Nr"   rx   )r   r   r   rI   rE   r   s    r   r   z _Test_small_nonleaf.setup_method   s)    &&tyy1&=r   r   r   s   @r   r   r      s    > >r   r   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)Test_vectorization_KDTreec                     t        j                  g dg dg dg dg dg dg dg dg      | _        t        | j                        | _        y 	Nr   r   r   r   r   r   r   r   )rG   r   rI   r   rE   r   s    r   r   z&Test_vectorization_KDTree.setup_method   s@    HHi''''''') *	 TYY'r   c                     | j                   j                  t        j                  g d            \  }}t	        t        |t                     t	        t        j                  |t        j                               y Nr   )	rE   rF   rG   r   r   
isinstancefloat
issubdtypesignedintegerr<   r6   rL   s      r   test_single_queryz+Test_vectorization_KDTree.test_single_query   sK    {{  )!451
1e$%a!1!123r   c                     | j                   j                  t        j                  d            \  }}t	        t        j
                  |      d       t	        t        j
                  |      d       y Nr@   rv   r   )r@   rv   rE   rF   rG   zerosr   shaper   s      r   test_vectorized_queryz/Test_vectorization_KDTree.test_vectorized_query   G    {{  )!451RXXa[&)RXXa[&)r   c           	         d}| j                   j                  |z   }| j                   j                  t        j                  g d      |      \  }}t        t        j                  |      |f       t        t        j                  |      |f       t        t        j                  t        j                  || d                      t        t        j                  || d  | j                   j                  k(               y N   r   rX   )
rE   r]   rF   rG   r   r   r   r   rJ   isfiniter<   skkr6   rL   s        r   $test_single_query_multiple_neighborsz>Test_vectorization_KDTree.test_single_query_multiple_neighbors   s    [[]]1_{{  )!4 ;1RXXa[2%(RXXa[2%(AqbcF++,-q!v./0r   c                 *   d}| j                   j                  |z   }| j                   j                  t        j                  d      |      \  }}t        t        j                  |      dd|f       t        t        j                  |      dd|f       t        t        j                  t        j                  |d d d d | d f                       t        t        j                  |d d d d | d f   | j                   j                  k(               y Nr   r   r   r@   rv   
rE   r]   rF   rG   r   r   r   r   rJ   r   r   s        r   (test_vectorized_query_multiple_neighborszBTest_vectorization_KDTree.test_vectorized_query_multiple_neighbors       [[]]1_{{  )!4 ;1RXXa[1a*-RXXa[1a*-AaQBCiL1123qArs|t{{}}456r   c                     d}t        j                  t        d      5  | j                  j	                  |d        d d d        y # 1 sw Y   y xY w)N      ?zk must be an integer or*matchr   )pytestr	   
ValueErrorrE   rF   )r<   rD   s     r   test_query_raises_for_k_nonez6Test_vectorization_KDTree.test_query_raises_for_k_none   sB    ]]:-GH 	)KKa4(	) 	) 	)s   AAN)	r$   ro   rp   r   r   r   r   r   r   rq   r   r   r   r      s     	(4
*
17)r   r   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)Test_vectorization_cKDTreec                     t        j                  g dg dg dg dg dg dg dg dg      | _        t        | j                        | _        y r   )rG   r   rI   r   rE   r   s    r   r   z'Test_vectorization_cKDTree.setup_method   s@    HHi''''''') *	 dii(r   c                     | j                   j                  g d      \  }}t        t        |t                     t        t        |t
                     y r   )rE   rF   r   r   r   intr   s      r   r   z,Test_vectorization_cKDTree.test_single_query   s8    {{  +1
1e$%
1c"#r   c                     | j                   j                  t        j                  d            \  }}t	        t        j
                  |      d       t	        t        j
                  |      d       y r   r   r   s      r   r   z0Test_vectorization_cKDTree.test_vectorized_query   r   r   c                 L   t         j                  j                  d       t         j                  j                  dd      j                  }| j
                  j                  |      \  }}t        |||      D ]-  \  }}}t        | j
                  j                  |      ||f       / y )Nrw   r     )	rG   r|   r}   r~   TrE   rF   r^   r   )r<   qsdsi_sqr6   rL   s          r   *test_vectorized_query_noncontiguous_valueszETest_vectorization_cKDTree.test_vectorized_query_noncontiguous_values   s    
		tYY__Q%''++##B'C2r3' 	7GAq!**1-1v6	7r   c           	         d}| j                   j                  |z   }| j                   j                  g d|      \  }}t        t	        j
                  |      |f       t        t	        j
                  |      |f       t        t	        j                  t	        j                  || d                      t        t	        j                  || d  | j                   j                  k(               y r   )	rE   r]   rF   r   rG   r   r   rJ   r   r   s        r   r   z?Test_vectorization_cKDTree.test_single_query_multiple_neighbors  s    [[]]1_{{  b 11RXXa[2%(RXXa[2%(AqbcF++,-q!v./0r   c                 *   d}| j                   j                  |z   }| j                   j                  t        j                  d      |      \  }}t        t        j                  |      dd|f       t        t        j                  |      dd|f       t        t        j                  t        j                  |d d d d | d f                       t        t        j                  |d d d d | d f   | j                   j                  k(               y r   r   r   s        r   r   zCTest_vectorization_cKDTree.test_vectorized_query_multiple_neighbors  r   r   N)	r$   ro   rp   r   r   r   r   r   r   rq   r   r   r   r      s     	)$
*
717r   r   c                   "    e Zd ZdZd Zd Zd Zy)ball_consistency        c                 (    t        |dz  |dz  |      S Nr   r0   r;   s       r   r=   zball_consistency.distance  s    S!c'1--r   c                    t        j                  | j                        }t        j                  | j                  |j
                  d d       }| j                  j                  || j                  | j                  | j                        }t        |      D ]  \  }}| j                  | j                  |   ||   | j                        ||   d| j                  z   z  z
  }| j                  | j                  |   ||   | j                        ||   d| j                  z   z  z   }t        || j                  |z  k  d        y )Nr3   rM   r   T)rG   
atleast_2drD   broadcast_tor6   r   r   query_ball_pointr3   rM   	enumerater=   rI   r   tol)r<   rD   r6   lrL   inddistnorms           r   test_in_ballzball_consistency.test_in_ball  s    MM$&&!OODFFAGGCRL1FF##AtvvTXX#Fl 	=FAs==31tvv>1r$(({ASSD==31tvv>1r$(({ASSDtdhho5t<	=r   c                    t        j                  | j                        }t        j                  | j                  |j
                  d d       }| j                  j                  || j                  | j                  | j                        }t        |      D ]  \  }}t        j                  | j                  j                  t              }d||<   | j                  | j                  |   ||   | j                        ||   d| j                  z   z  z
  }| j                  | j                  |   ||   | j                        ||   d| j                  z   z  z   }t!        || j"                   |z  kD  d        y )Nr   r   dtypeFr   T)rG   r   rD   r   r6   r   r   r   r3   rM   r   onesr]   boolr=   rI   r   r   )	r<   rD   r6   r   rL   r   cr   r   s	            r   test_found_allzball_consistency.test_found_all$  s   MM$&&!OODFFAGGCRL1FF##AtvvTXX#Fl 	>FAs-AAcF==1qtTVV<qtR[?QQD==1qtTVV<qtR[?QQDttxxi$&66=	>r   N)r$   ro   rp   r   r=   r   r   rq   r   r   r   r     s    
C.=	>r   r   c                       e Zd Zd Zy)_Test_random_ballc                 J   d}d}t         j                  j                  d       t         j                  j                  ||      | _        | j                  | j                  d      | _        t         j                  j                  |      | _        d| _        d| _	        d| _
        y )	Nru   rv   rw   r@   rx          @r   rz   )rG   r|   r}   r~   rI   r   r   rD   r3   rM   r6   r<   r]   rP   s      r   r   z_Test_random_ball.setup_method1  sv    
		tIIOOAq)	!!$))a!8#r   Nr   rq   r   r   r   r   /  s    	r   r   c                   $    e Zd Zd Zd Zd Zd Zy)_Test_random_ball_periodicc                     t        |||d      S r   r7   r;   s       r   r=   z#_Test_random_ball_periodic.distance?      Aq!S))r   c                 >   d}d}t         j                  j                  d       t         j                  j                  ||f      | _        | j                  | j                  dd      | _        t        j                  |d      | _        d	| _	        d
| _
        d| _        y )N'  rv   rw   sizer@   r"   ry   r4   rk   r   r   rz   )rG   r|   r}   uniformrI   r   r   fullrD   r3   rM   r6   r   s      r   r   z'_Test_random_ball_periodic.setup_methodB  s|    
		tII%%Aq6%2	!!$))a!CCr   c                    | j                   j                  | j                  dz   | j                  | j                  | j
                        }|D ]\  }t        | j                  | j                  |   | j                  | j                        | j                  d| j
                  z   z  k         ^ | j                   j                  | j                  dz
  | j                  | j                  | j
                        }|D ]\  }t        | j                  | j                  |   | j                  | j                        | j                  d| j
                  z   z  k         ^ y )Nr   r   )	r   r   rD   r6   r3   rM   r   r=   rI   )r<   r   rL   s      r   test_in_ball_outsidez/_Test_random_ball_periodic.test_in_ball_outsideM  s    FF##DFFSL$&&DFF#Q 	YADMM$))A,?4662dhh;CWWX	YFF##DFFSL$&&DFF#Q 	YADMM$))A,?4662dhh;CWWX	Yr   c                 6   t        j                  | j                  j                  t              }| j                  j                  | j                  dz   | j                  | j                  | j                        }d||<   t        j                  | j                  | j                  |   | j                  | j                        | j                  d| j                  z   z  k\        sJ | j                  j                  | j                  dz
  | j                  | j                  | j                        }d||<   t        j                  | j                  | j                  |   | j                  | j                        | j                  d| j                  z   z  k\        sJ y )Nr   r   r   F)rG   r   r   r]   r   r   rD   r6   r3   rM   rJ   r=   rI   )r<   r   r   s      r   test_found_all_outsidez1_Test_random_ball_periodic.test_found_all_outsideU  s(   GGDFFHHD)FF##DFFSL$&&DFF#Q!vvMM$))A,74662dhh;;OO
 	
 
 FF##DFFSL$&&DFF#Q!vvMM$))A,74662dhh;;OO
 	
 
r   N)r$   ro   rp   r=   r   r  r  rq   r   r   r   r   =  s    *	Y
r   r   c                       e Zd ZdZd Zy)"_Test_random_ball_largep_issue9890gvIh%<=c                 (   d}d}t         j                  j                  d       t         j                  j                  dd||f      | _        | j                  | j                        | _        | j                  | _        d| _        d| _	        d| _
        y )Nr   r@   {   ru   r   r   r{   )rG   r|   r}   randintrI   r   r   rD   r3   rM   r6   r   s      r   r   z/_Test_random_ball_largep_issue9890.setup_methodj  ss    
		sII%%c4q!f%=	!!$)),r   N)r$   ro   rp   r   r   rq   r   r   r  r  d  s     C	r   r  c                        e Zd Z fdZ xZS )_Test_random_ball_approxc                 0    t         |           d| _        y Nrk   r   r   rM   r   s    r   r   z%_Test_random_ball_approx.setup_methody      r   r   r   s   @r   r  r  v       r   r  c                        e Zd Z fdZ xZS )!_Test_random_ball_approx_periodicc                 0    t         |           d| _        y r  r  r   s    r   r   z._Test_random_ball_approx_periodic.setup_method  r  r   r   r   s   @r   r  r  ~  r  r   r  c                        e Zd Z fdZ xZS )_Test_random_ball_farc                 0    t         |           d| _        y Nr   r   r   r6   r   s    r   r   z"_Test_random_ball_far.setup_method      r   r   r   s   @r   r  r         r   r  c                        e Zd Z fdZ xZS )_Test_random_ball_far_periodicc                 0    t         |           d| _        y r  r  r   s    r   r   z+_Test_random_ball_far_periodic.setup_method  r  r   r   r   s   @r   r  r    r  r   r  c                        e Zd Z fdZ xZS )_Test_random_ball_l1c                 0    t         |           d| _        y )Nr"   )r   r   r3   r   s    r   r   z!_Test_random_ball_l1.setup_method      r   r   r   s   @r   r!  r!         r   r!  c                        e Zd Z fdZ xZS )_Test_random_ball_linfc                 L    t         |           t        j                  | _        y r   r   r   rG   r_   r3   r   s    r   r   z#_Test_random_ball_linf.setup_method      r   r   r   s   @r   r&  r&         r   r&  c                 \   d}d}t         j                  j                  d        | t         j                  j                  ||            }|j	                  t         j                  j                  dd|      d      }t        |j                  d       t        t        |d   t                     y )	N      rw   r@   r   r"   r@   r   r   r   )
rG   r|   r}   r~   r   r   r   r   r   list)r   r]   rP   r   rs        r   test_random_ball_vectorizedr2    sy    
A	AIINN4BIIOOAq)*A	299??1a3Q7A&!Jqw%&r   zTest spawns worker threads)reasonr-  c                    t         j                  j                  d       d}d}t         j                  j                  ||      } | |      }|j	                  |dd      }|j	                  |dd      }|j	                  |dd      }t        |      D ]  }||   s||   st        ||   ||          ! t        |      D ]  }||   s||   st        ||   ||          ! y )	Nr     r@   g~jth?r"   workers@   r   )rG   r|   r}   r~   r   ranger   )	r   r]   rX   pointsr   l1l2l3rL   s	            r   +test_query_ball_point_multithreaded_workersr>    s     IINN1A	AYY__Q"FFA	
		FE1		5B	
		FE2		6B	
		FE2		6B1X -a5BqEr!ube,- 1X -a5BqEr!ube,-r   c                    t         j                  j                  d      }d}d}|j                  ||      } | |      }d}||z  |z  |k(  sJ |j                  |||z  |      }t        j                  |||f      }dfd}	t        ||	||      }
|j                  |      }t        t        j                  t        j                  |
            t        j                  |             y )Nl   e]IG r   r@   r{   333333?c                 .    |j                  ||          S r   )r   )rL   r*   search_pointsradiuss      r   worker_funczAtest_query_ball_point_multithreaded_explicit.<locals>.worker_func  s    $$]1%5v>>r   )
rG   r|   RandomStater~   reshaper
   r   r   sortconcatenate)r   rngr]   rX   r:  r*   max_workersrB  all_search_pointsrD  resultsserial_resultsrC  s               @r   ,test_query_ball_point_multithreaded_explicitrN    s     ))



+CA	AYYq!_FvDKk>K'1,-,IIk1k>1=M

=1a&9F? &[$7G **+<fEN rwwr~~g679PQr   c                       e Zd Zd Zd Zd Zy)two_trees_consistencyc                     t        |||      S r   r0   r;   s       r   r=   ztwo_trees_consistency.distance  r>   r   c                 r   | j                   j                  | j                  | j                  | j                  | j
                        }t        |      D ]b  \  }}|D ]X  }| j                  | j                  |   | j                  |   | j                        | j                  d| j
                  z   z  k  rXJ  d y )Nr   r   )
T1query_ball_treeT2r6   r3   rM   r   r=   data1data2)r<   r1  rL   r   js        r   test_all_in_ballz&two_trees_consistency.test_all_in_ball  s    GG##DGGTVVtvv488#LaL 	1DAq 1djjmTZZ]DFFK662dhh;/0 1 01	1r   c                    | j                   j                  | j                  | j                  | j                  | j
                        }t        |      D ]  \  }}t        j                  | j                  j                  t              }d||<   t        j                  | j                  | j                  |   | j                  |   | j                        | j                  d| j
                  z   z  k\        rJ  y )Nr   r   Fr   )rS  rT  rU  r6   r3   rM   r   rG   r   r]   r   rJ   r=   rW  rV  )r<   r1  rL   r   r   s        r   r   z$two_trees_consistency.test_found_all  s    GG##DGGTVVtvv488#LaL 	3DAq		.AAaD66$--

1tzz!}dffM!VVR[12 3 3 3	3r   N)r$   ro   rp   r=   rY  r   rq   r   r   rP  rP    s    "13r   rP  c                       e Zd Zd Zy)_Test_two_random_treesc                    d}d}t         j                  j                  d       t         j                  j                  ||      | _        | j                  | j                  d      | _        t         j                  j                  ||      | _        | j                  | j                  d      | _        d| _	        d| _
        d| _        y )	N2   rv   rw   r@   rx   r   r   rz   )rG   r|   r}   r~   rV  r   rS  rW  rU  r3   rM   r6   r   s      r   r   z#_Test_two_random_trees.setup_method  s    
		tYY__Q*
""4::":YY__Q*
""4::":r   Nr   rq   r   r   r\  r\    s    
r   r\  c                       e Zd Zd Zd Zy)_Test_two_random_trees_periodicc                     t        |||d      S r   r   r;   s       r   r=   z(_Test_two_random_trees_periodic.distance  r   r   c                    d}d}t         j                  j                  d       t         j                  j                  ||f      | _        | j                  | j                  dd      | _        t         j                  j                  ||f      | _        | j                  | j                  dd      | _        d| _	        d	| _
        d
| _        y )Nr^  rv   rw   r   r@   r   r   r   r   rz   )rG   r|   r}   r  rV  r   rS  rW  rU  r3   rM   r6   r   s      r   r   z,_Test_two_random_trees_periodic.setup_method
  s    
		tYY&&QF&3
""4::3"GYY&&QF&3
""4::3"Gr   N)r$   ro   rp   r=   r   rq   r   r   r`  r`    s    *
r   r`  c                        e Zd Z fdZ xZS )_Test_two_random_trees_farc                 0    t         |           d| _        y Nr@   r  r   s    r   r   z'_Test_two_random_trees_far.setup_method  r#  r   r   r   s   @r   rd  rd    r$  r   rd  c                        e Zd Z fdZ xZS )#_Test_two_random_trees_far_periodicc                 0    t         |           d| _        y rf  r  r   s    r   r   z0_Test_two_random_trees_far_periodic.setup_method"  r#  r   r   r   s   @r   rh  rh    r$  r   rh  c                        e Zd Z fdZ xZS )_Test_two_random_trees_linfc                 L    t         |           t        j                  | _        y r   r(  r   s    r   r   z(_Test_two_random_trees_linf.setup_method*  r)  r   r   r   s   @r   rk  rk  '  r*  r   rk  c                        e Zd Z fdZ xZS )$_Test_two_random_trees_linf_periodicc                 L    t         |           t        j                  | _        y r   r(  r   s    r   r   z1_Test_two_random_trees_linf_periodic.setup_method2  r)  r   r   r   s   @r   rn  rn  /  r*  r   rn  c                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
Test_rectanglec                 .    t        ddgddg      | _        y )Nr   r"   )r   rectr   s    r   r   zTest_rectangle.setup_method9  s    q!fq!f-	r   c                 R    t        | j                  j                  ddg      d       y )Nr/   r   r   rs  min_distance_pointr   s    r   test_min_insidezTest_rectangle.test_min_inside<  s    DII88#sDaHr   c                 R    t        | j                  j                  ddg      d       y Nr/         ?ru  r   s    r   test_min_one_sidez Test_rectangle.test_min_one_side?  s    DII88#sDcJr   c                 x    t        | j                  j                  ddg      t        j                  d             y rf  )r   rs  rv  rG   sqrtr   s    r   test_min_two_sidesz!Test_rectangle.test_min_two_sidesB  s'    DII88!Q@"''!*Mr   c                 ~    t        | j                  j                  ddg      dt        j                  d      z         y )Nr/   r"   r@   r   rs  max_distance_pointrG   r}  r   s    r   test_max_insidezTest_rectangle.test_max_insideE  s,    DII88#sDaPQ
lSr   c                 z    t        | j                  j                  ddg      t        j                  dd             y ry  )r   rs  r  rG   hypotr   s    r   test_max_one_sidez Test_rectangle.test_max_one_sideH  s-    DII88#sDHHS#.	0r   c                 ~    t        | j                  j                  ddg      dt        j                  d      z         y rf  r  r   s    r   test_max_two_sidesz!Test_rectangle.test_max_two_sidesL  s+    DII88!Q@!BGGAJ,Or   c                    | j                   j                  dd      \  }}t        |j                  ddg       t        |j                  ddg       t        |j                  ddg       t        |j                  ddg       y )Nr   rk   r"   )rs  splitr   maxesmins)r<   lessgreaters      r   
test_splitzTest_rectangle.test_splitO  sb    		3/g4::Qx0499q!f-7==1a&17<<#q2r   N)r$   ro   rp   r   rw  r{  r~  r  r  r  r  rq   r   r   rq  rq  7  s/    .IKNT0P3r   rq  c                  B   t        j                  d      5  t        t        ddgddgd      t	        j
                  d             d d d        t        j                  d      5  t        t        ddgddgd      d       d d d        y # 1 sw Y   DxY w# 1 sw Y   y xY wN1.20.0r   r   r"   r@   )r   deprecated_callr   r   rG   r}  r   rq   r   r   test_distance_l2r  W  s    			h	/ O.1v1vqA2771:NO			h	/ H0!Q!QCQGH HO OH Hs   /B	$B	BBc                      t        j                  d      5  t        t        ddgddgd      d       d d d        y # 1 sw Y   y xY wr  )r   r  r   r   rq   r   r   test_distance_l1r  ^  sE    			h	/ F.1v1vqA1EF F Fs	   <Ac                      t        j                  d      5  t        t        ddgddgt        j
                        d       d d d        y # 1 sw Y   y xY w)Nr  r   r   r"   )r   r  r   r   rG   r_   rq   r   r   test_distance_linfr  c  sI    			h	/ K.1v1vrvvFJK K Ks   *A

Ac                  \   t         j                  j                  d       t         j                  j                  ddd      } t         j                  j                  ddd      }t	        j
                  d      5  t        t        | |      j                  d       d d d        y # 1 sw Y   y xY w)	Nrw   r{   r"   r      r  r   )r{   r  )	rG   r|   r}   r~   r   r  r   r   r   )rD   ys     r   test_distance_vectorizationr  h  sy    IINN4
		Aq!A
		1a A			h	/ >'1-33W=> > >s   8!B""B+c                       e Zd Zd Zd Zd Zy)count_neighbors_consistencyc                    d}t        | j                  j                  | j                  |      t	        j
                  | j                  j                  | j                  |      D cg c]  }t        |       c}             y c c}w )Nrz   r   rS  count_neighborsrU  rG   rH   rT  lenr<   r1  r   s      r   test_one_radiusz+count_neighbors_consistency.test_one_radiusq  sZ    TWW,,TWWa8(?(?(KL1ALM	OL   $Bc                    d}t        | j                  j                  | j                  |      t	        j
                  | j                  j                  | j                  |      D cg c]  }t        |       c}             y c c}w )Nr   r  r  s      r   test_large_radiusz-count_neighbors_consistency.test_large_radiusv  sZ    TWW,,TWWa8(?(?(KL1ALM	OLr  c                    t        j                  t        j                  t        j                  d      t        j                  d      d            }| j                  j                  | j                  |      }t        t        j                  t        j                  |      dk\               t        ||      D ]5  \  }}t        | j                  j                  | j                  |      |       7 y )N{Gz?r{   r   r   )rG   explinspacelogrS  r  rU  r   rJ   r5   r^   r   )r<   rsrL  r1  results        r   test_multiple_radiusz0count_neighbors_consistency.test_multiple_radius{  s    VVBKKtbffRj!<=''))$''26rwww'1,-.R) 	FIAv00!<fE	Fr   N)r$   ro   rp   r  r  r  rq   r   r   r  r  p  s    O
O
Fr   r  c                       e Zd Zd Zy)_Test_count_neighborsc                 "   d}d}t         j                  j                  d       | j                  t         j                  j	                  ||      d      | _        | j                  t         j                  j	                  ||      d      | _        y )Nr^  r@   rw   rx   )rG   r|   r}   r   r~   rS  rU  r   s      r   r   z"_Test_count_neighbors.setup_method  sh    
		t""299??1a#81"E""299??1a#81"Er   Nr   rq   r   r   r  r    s    Fr   r  c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)"sparse_distance_matrix_consistencyc                     t        |||      S r   r0   r;   s       r   r=   z+sparse_distance_matrix_consistency.distance  r>   r   c           
      
   | j                   j                  | j                  | j                  d      }| j                   j	                  | j                  | j                        }t        |      D ]h  \  }}|D ]^  }t        |||f   | j                  | j                   j                  |   | j                  j                  |   | j                        d       ` j |j                         D ]  \  \  }}}t        |||   v         y )Nr   output_type   decimal)rS  sparse_distance_matrixrU  r1  rT  r   r   r=   rI   r3   itemsr   )r<   Mr1  rL   r   rX  r6   s          r   test_consistency_with_neighborszBsparse_distance_matrix_consistency.test_consistency_with_neighbors  s    GG**477DFF*TGG##DGGTVV4aL 	DAq #adGMM$'',,q/477<<?DFFK	 779 	KVaQA1I	r   c                 h    | j                   j                  | j                   | j                  d       y )Nr   r  )rS  r  r1  r   s    r   test_zero_distancez5sparse_distance_matrix_consistency.test_zero_distance  s#    &&twwK&Pr   c                 ,   | j                   j                  | j                  | j                  d      }t	        | j                   j
                  | j                  j
                        }d||| j                  kD  <   t        |j                         |d       y )Nr   r  r   r  r  )rS  r  rU  r1  r   rI   r   toarray)r<   M1expecteds      r   test_consistencyz3sparse_distance_matrix_consistency.test_consistency  sf    WW++DGGTVV+Utww||4&'DFF"#!"**,"Er   c                 P   t         j                  j                  d       t        j                  t         j                  j	                  dd      t
              }| j                  |dd      }|j                  |dd	      j                         }t        ||j                  d
       y )Nr      r@   r   Fbalanced_treecompact_nodesr   r   r  r  r  )rG   r|   r}   r   r~   r   r   r  r  r   r   )r<   too_manyr*   r6   s       r   #test_against_logic_error_regressionzFsparse_distance_matrix_consistency.test_against_logic_error_regression  s~    
		q88BIIOOB2#>E   @''a['IQQS!!QSS"5r   c                    t        j                  | j                  | j                  f      }t        | j                        D ]^  }t        | j                        D ]D  }| j                  |d d f   | j
                  |d d f   z
  }t        j                  ||      |||f<   F ` t        j                  |      }d||| j                  kD  <   t        j                  | j                  | j                  f      }| j                  j                  | j                  | j                  d      }|j                         D ]  \  }}|||f   |||f<    t        ||d       t        j                  | j                  | j                  f      }| j                  j                  | j                  | j                  d      }t        |j                  d         D ]!  }|d   |   }|d	   |   }|d
   |   }||||f<   # t        ||d       | j                  j                  | j                  | j                  d      }t        ||j                         d       t!        |t"              sJ | j                  j                  | j                  | j                  d      }t        ||j                         d       t!        |t$              sJ | j                  j                  | j                  | j                  d      }t        ||j                         d       t!        |t&              sJ | j                  j                  | j                  | j                  d      }t        ||j                         d       t!        |t(              sJ | j                  j                  | j                  | j                        }t!        |t$              sJ y )Nr   dictr  r  r  ndarrayr   rL   rX  vr   r   r   r   )rG   r   r]   r9  rV  rW  dotr}  r1  rS  r  rU  keysr   r   r  r   r   r   r   r   )r<   refrL   rX  r  r   r1  rX   s           r   test_ckdtree_return_typesz<sparse_distance_matrix_consistency.test_ckdtree_return_types  s   hh'(tvv 	)A466] )JJq!t$tzz!Q$'77FF1aLAqD	)	) ggclC$&&Lxx()GG**477DFF*OFFH 	#DAqAq6DAJ	#!#tR8xx()GG**477DFF! + #qwwqz" 	A#q	A#q	A#q	ADAJ		
 	"#tR8GG**477DFF# + %!#qyy{B?!Y'''GG**477DFF$ + &!#qyy{B?!Z(((GG**477DFF# + %!#qyy{B?!Y'''GG**477DFF$ + &!#qyy{B?!Z(((GG**477DFF;!Z(((r   N)	r$   ro   rp   r=   r  r  r  r  r  rq   r   r   r  r    s"    "QF6/)r   r  c                       e Zd Zd Zy)_Test_sparse_distance_matrixc                 ~   d}d}t         j                  j                  d       t         j                  j                  ||      }t         j                  j                  ||      }| j	                  |d      | _        | j	                  |d      | _        d| _        d| _        || _	        || _
        || _        || _        y )Nr^  rv   rw   r@   rx   r/   )rG   r|   r}   r~   r   rS  rU  r1  r3   rV  rW  r]   rP   )r<   r]   rP   rV  rW  s        r   r   z)_Test_sparse_distance_matrix.setup_method  s    
		t		1%		1%""51"5""51"5

r   Nr   rq   r   r   r  r    s    r   r  c            
      D   d} d}d}t         j                  j                  d       t         j                  j                  | |      }t         j                  j                  ||      }t	        j
                  d      5  t        ||      }d d d        t        j                  | |f       t        |       D ]R  }t        |      D ]B  }t	        j
                  d      5  t        t        ||   ||         |||f          d d d        D T y # 1 sw Y   xY w# 1 sw Y   ]xY w)Nr{      rv   rw   r  r   )rG   r|   r}   r~   r   r  r   r   r   r9  r   r   )rP   r]   rX   xsysr   rL   rX  s           r   test_distance_matrixr    s   
A
A	AIINN4	A	B	A	B			h	/ %R$%Aq6"1X Pq 	PA''h7 P#$6r!ube$DbAhOP P	PP% %
P Ps   <D
"D
DDc                     d} d}d}t         j                  j                  d       t         j                  j                  | |      }t         j                  j                  ||      }t	        j
                  d      5  t        ||      }d d d        t	        j
                  d      5  t        ||d      }d d d        t               y # 1 sw Y   CxY w# 1 sw Y   "xY w)	Nr{   r  rv   rw   r  r   r"   )	threshold)rG   r|   r}   r~   r   r  r   r   )rP   r]   rX   r  r  r   dsls          r   test_distance_matrix_loopingr    s    
A
A	AIINN4	A	B	A	B			h	/ %R$%			h	/ 3b"23S	% %3 3s   <C'CCC c                     | j                  | |      }t               }t        |      D ]%  \  }}|D ]  }||k  s	|j                  ||f        ' t	        || j                  |      k(         y r   )rT  setr   addr   query_pairs)r   r6   r1  r   rL   r   rX  s          r   check_onetree_queryr    so    	!QAA! 1 	A1uq!f	
 Aq!!"r   c                    t         j                  j                  d       d}d}t         j                  j                  ||      } | |      }t	        |d       t         j                  j                  d|z  |      }|d |xxx dz  ccc ||d|z  xxx dz  ccc  | |      }t	        |d       t	        |d       t	        |d       t	        |d	       y )
Nr   r^  rv   rk   r   gMbP?r@   gh㈵>gư>)rG   r|   r}   r~   r  )r   r]   rX   r:  r   s        r   test_onetree_queryr    s    IINN1
A	AYY__Q"FFA3YY__QqS!$F
2AJ%J
1QqSMQMFA35!7#4 r   c                 `     | ddgg      }t        |j                  d      t                      y )Nr   r"   r/   )r   r  r  )r   r*   s     r   test_query_pairs_single_noder  0  s)    Ax D!!#&.r   c           	      >   t         j                  j                  d       d}d}d}|dz  }t         j                  j                  ||      } | |      }t	               }t        |      D ]V  }t        |dz   |      D ]B  }	||d d f   ||	d d f   z
  }
t        j                  |
|
      |k  s0|j                  ||	f       D X t        |      }|j                  |      }t        |      }t        ||       |j                  |d      }t        |      }t        ||       t	               }|j                  |d      }t        |j                  d         D ]1  }|j                  t        ||df         t        ||df         f       3 t        |      }t        ||       y )	Nr   r^  r@   rk   r"   r  r  r  )rG   r|   r}   r~   r  r9  r  r  sortedr  r   r   r   )r   r]   rX   r1  r2r:  r   bruterL   rX  r  l0r   r;  arrr<  s                   r   test_kdtree_query_pairsr  5  sy   IINN1
A	AA	
ABYY__Q"FFAEE1X "qsA 	"Aq!tvad|+Avva|r!		1a&!	""
 
B	aA	Br2	aU+A	Br2A
--y-
1C399Q<  0	s3q!t9~s3q!t9~./0	Br2r   c                 N   t        j                  d      }t        j                  dd|z  d      }t        j                  dd|z  d      }|D cg c]  }|D ]  }||f  }}} | |      }|j                  |d      }|j                  |dz        }	t	        |	|       y c c}}w )	Nr@   r   r   rv   rk   )r1  rM   )\(?r1  )rG   r}  r  r  r   )
r   spacingx_rangey_rangexiyixy_arrayr*   	pairs_epspairss
             r   test_query_pairs_epsr  V  s    ggajGkk!Q[!,Gkk!Q[!,G#*=RW=rR==H=x D  7 3Iw~.E	" >s   B!c           	         t         j                  ddddf   \  }}t        t        |j	                         |j	                                     } | |      }t        t        g d      t        |j                  dd                   t        j                  |t              } | |      }t        t        g d      t        |j                  dd                   y )Nr   rv   )rv      	      )r@   r   r"   r   )
rG   mgridr0  r^   ravelr   r  r   asarrayr   )r   rD   r  r:  r*   s        r   test_ball_point_intsr  d  s    88AaC1HDAq#aggi+,FvD&--fa89;ZZe,FvD&--fa89;r   c            	          t        d      D  cg c]  } t        j                          }} t        t	        |      t	        |d d d                y c c} w )Nr   r   )r9  r   noder   r  )r#   nodess     r   test_kdtree_comparisonsr  q  s?    $)!H-qV[[]-E-uTrT{ 34 .s   Ac                    t         j                  j                  d       d}d}t         j                  j                  ||      } | |      j	                  |d      d   } | |d      j	                  |d      d   } | |d	      j	                  |d      d   } | |dd
      j	                  |d      d   }t        ||       t        ||       t        ||       y )Nr   r5  rv   r-  r   r   F)r  )r  )r  r  )rG   r|   r}   r~   rF   r   )r   r]   rX   r:  rS  rU  T3T4s           r   test_kdtree_build_modesr  w  s    IINN1A	AYY__Q"F	V		"	"6Q	"	/	3B	V5	1	7	7!	7	DR	HB	V5	1	7	7!	7	DR	HB	V5#(
**/%!%*<R
ABr2r2r2r   c                 V   dd l }t        j                  j                  d       d}d}t        j                  j	                  ||      } | |      }|j                  |      }|j                  |      }|j                  |d      d   }|j                  |d      d   }t        ||       y )Nr   r^  rv   r-  r   r   )	picklerG   r|   r}   r~   dumpsloadsrF   r   r   r  r]   rX   r:  rS  tmprU  s           r   test_kdtree_pickler    s    IINN1
A	AYY__Q"F	V	B
,,r
C	c	B	&A	r	"B	&A	r	"Br2r   c                 ^   dd l }t        j                  j                  d       d}d}t        j                  j	                  ||f      } | |d      }|j                  |      }|j                  |      }|j                  |d      d	   }|j                  |d      d	   }t        ||       y )
Nr   r^  rv   r   r   r4   r-  r   r   )	r  rG   r|   r}   r  r  r  rF   r   r  s           r   test_kdtree_pickle_boxsizer    s    IINN1
A	AYYQF+F	VS	)B
,,r
C	c	B	&A	r	"B	&A	r	"Br2r   c                 t   t         j                  j                  d       d}d}t         j                  j                  ||      } | |d      }|j	                         }|j                  |d      d   }t         j                  j                  ||      |d	<   |j                  |d      d   }t        ||       y )
Nr   r5  rv   T)	copy_datar-  r   r   .)rG   r|   r}   r~   copyrF   r   )r   r]   rX   r:  r   r   rS  rU  s           r   test_kdtree_copy_datar    s     IINN1A	AYY__Q"FFd+AA	
a	B))//!Q'F3K	
a	Br2r   c                 
   t         j                  j                  d       d}d}t         j                  j                  ||      } | |      }|j	                  |dd      d   }|j	                  |dd      d   }|j	                  |d      d   }t        ||       t        ||       |j                  t        d	d
        t        j                  t        d      5  |j	                  |dd       d d d        y # 1 sw Y   y xY w)Nr   r5  rv   r-  r8  )rX   r7  r   r   	cpu_countc                       y r   rq   rq   r   r   <lambda>z'test_ckdtree_parallel.<locals>.<lambda>  s    r   zCannot determine ther   r"   r6  )rG   r|   r}   r~   rF   r   setattrosr   r	   NotImplementedError)	r   monkeypatchr]   rX   r:  r   rS  rU  r
  s	            r   test_ckdtree_parallelr#    s    IINN1A	AYY__Q"FFA	
1b	)"	-B	
1b	)"	-B	
1	b	!Br2r2K6	*2H	I '	2&' ' 's   C99Dc                     t         j                  j                  d       d} d}t         j                  j                  | |      }t	        |      fd j
                         j
                  } t        t        j                  | j                        t        d             t        j                  | j                  d d f   | j                         y )Nr   ru   rv   c                 J   t        t        | t                     | j                  dk(  r^t        | j                  d u        t        | j
                  d u        t        | j                  j                  d   j                  k         y  | j                          | j
                         | j                  j                  d d | j                  f   }| j
                  j                  d d | j                  f   }t        |j                         |j                         k         y )Nr   r   )r   r   r   	split_dimlesserr  indicesr   ry   data_pointsmaxmin)r]   rD   r  rE   recurse_trees      r   r,  z'test_ckdtree_view.<locals>.recurse_tree  s    
1k*+;;"AHH$%AII%&AIIOOA&&//9:"#$$Q^4A		%%an5AAEEGaeeg%&r   )rG   r|   r}   r~   r   r*   r   rG  r(  r9  rI   r)  )r]   rX   r:  rE   r,  s      @@r   test_ckdtree_viewr-    s     IINN1A	AYY__Q"FV_F' Arwwqyy)5:6v{{199a<0!--@r   c                 V   d}d}g d}d}t         j                  j                  d       t         j                  j                  ||f      } | |d      }|j	                  ||      \  }}|j	                  ||      \  }	}
t        ||	       t        ||
       t        j                  ddg      }d}|j	                  ||      \  }}|j	                  ||      \  }	}
t        |	|d	|dz
  f          t        |
|d	|dz
  f          |j	                  |d      \  }}|j	                  |dg      \  }	}
t        t        |j                        d       t        t        |	j                        d       t        |t        j                  |	             t        |t        j                  |
             y )
N   r@   )r"   r@   r   r   rw   r   r"   rx   .)
rG   r|   r}   r  rF   r   r   r  r   r  )r   r]   rP   klistkintrI   rE   rS   rT   dd1ii1s              r   test_kdtree_list_kr4    sn   A	AEDIINN4991a&)D*F \\$&FB||D$'HCSS HHaVED\\$%FB||D%(HCbeai()beai() \\$"FB||D1#&HCRXX"SYY#RXXc]#RXXc]#r   r{   c                 :   d}d}d}t         j                  j                  d       t         j                  j                  ||f      } | |dd      } | |d      }dd	d
t         j                  fD ]  }|j                  |||      \  }}	|j                  |dz   ||      \  }
}t        ||
       t        |	|       |j                  |dz
  ||      \  }
}t        ||
       t        |	|       t        |||d|      \  }}t        ||       t        |	|        y )N  r   rw   r   r"   r   r   rx   r@   g      @r3   )r4   r3   )	rG   r|   r}   r  r_   rF   r   r   simulate_periodic_box)r   r]   rP   rX   rI   rE   kdtree2r3   rS   rT   r2  r3  dd2ii2s                 r   test_kdtree_boxr<    s    	A	A	AIINN4991a&)D37F $+GC  dA+B<<s
A<3SB$R<<s
A<3SB$R($3!LSB$Rr   c                 x   d}d}d}t         j                  j                  d       t         j                  j                  ||f      } | |dd      } | |d	      }ddt         j                  fD ]H  }|j                  |||
      \  }}	|j                  |||
      \  }
}t        ||
       t        |	|       J y )Nr6  r@   r   rw   r   r"   r   r   rx   r7  )rG   r|   r}   r  r_   rF   r   r   )r   r]   rP   rX   rI   rE   r9  r3   rS   rT   r2  r3  s               r   test_kdtree_box_0boxsizer>  #  s    A	A	AIINN4991a&)D37F $+GBFF^ dA+B==qA=.SB$Rr   c                 n   t        j                  ddd      j                  dd      }|d d dfxx   dz  cc<   t        j                  t
              5   | |dd       d d d        t        j                  t
              5   | |dd       d d d         | |dd	       y # 1 sw Y   BxY w# 1 sw Y   !xY w)
Nr   r@   r{   r   r"   r   r   )r   r   )r   r   )rG   r  rF  r   r	   r   r   rI   s     r   test_kdtree_box_upper_boundsrA  6  s    ;;q!R ((Q/DAJ"J	z	" 3D1c23	z	" :D1j9: q*53 3: :s   B?B+B(+B4c                 Z    t        j                  ddd      }t        t        | |dd       y )Nr   r"   r{   r   r   )rG   r  assert_raisesr   r@  s     r   test_kdtree_box_lower_boundsrD  @  s$    ;;r1b!D*k4!SIr   c                    g }g }t        j                  d|j                  d   z        }t        j                  t        j                  |dg|j                  d   z              j
                  }|dz
  }|D ]j  }	||	dz  |z  z   }
| j                  |
||      \  }}|j                  d|      }|j                  d|      }|j                  |       |j                  |       l t        j                  |d      }t        j                  |d      }t        j                  t        |      t        |      |z  gddg	      }||d
   d d  ||d   d d  |j                  d       |d   d d d |f   |d
   d d d |f   fS )Nr   r"   r   r7  r   rB   )rT   i8)rS   f8r   rT   rS   )order)rG   aranger   r   unravel_indexr   rF   rF  appendrH  emptyr  rG  )rE   rI   rX   r4   r3   rS   rT   rD   nnr]   imager:  r;  r  s                 r   r8  r8  D  su   	B	B
		!tzz!}$%A	"""1qcDJJqM&9:	;	=	=B	cB q3w((<<qA<.Skk"a kk"a 
		#
		# 
	$B		$BXXs4y#b'A+.7 F F4LOF4LO
KKdK$<2A2tQU 333r   c                     	 dd l } d\  }}t        j                  t	        dd|z   |      t	        dd|z   |      f   \  }}t        j
                  |      dz  t        j                  d||z  z         t        j                  |      z  z   }t        j                  |      }||d d  d}t        j                  j                  d|j                  t        j                  j                  d      dz         }||j                  |<   t        j                  t        j                  ||k7              j                  }	t        j                  t        j                  ||k(              j                  }
| j                  | j                         j"                  }t%        d      D ]  }t'        |	      } d}t%        d      D ]y  }| j                  | j                         j"                  }t'        |	      }|j)                  |
d	d
      \  }}| j                  | j                         j"                  }||kD  su|dz  }{ t+        |dk         y # t        $ r Y y w xY w)Nr   )皙?rP  r"   r-  r{   g     X@r^  ru   rv   r@   )rX   r3   )resourceImportErrorrG   r  slicesincos
empty_liker|   r  r   flatvstacknonzeror   	getrusageRUSAGE_SELF	ru_maxrssr9  r   rF   r   )rQ  dxdyr  rD   zz_copyFILLVALmaskigoodibadmem_userL   r*   	num_leaksr   iquerynew_mem_uses                     r   test_ckdtree_memuseri  ]  s   
 FB88E!QVR(!QVR() *DAq
q	2rAaCx(266!944A]]1FF1IG99Q		(9(9"(=(ABDFKKIIbjjg./11E99RZZW-.00D  !5!56@@G2Y u~ I3Z $$X%9%9:DDu~zz$!qz1f(()=)=>HH NI IN?  s   I 	IIc                    t        j                  ddd      j                  dd      } | |d      }t        j                  t	        |      d      }|j                  |      }t        |g d       t        t        |j
                  |d d        t        d	      D ]  }|j                  |t        j                  dd	|            }|j                  |t        j                  dd	|      ||f
      }|j                  |t        j                  dd	|      |d f
      }|j                  |t        j                  dd	|      d |f
      }	|j                  |t        j                  dd	|      |
       t        ||       t        ||       t        ||	        t        t	        |            D ]  }|j                         }
d|
|<   ||
dk7     } | |      }|j                  |t        j                  dd	d      |
|
f
      }|j                  |t        j                  dd	d            }t        ||       t        t        |j                  |t        j                  dd	d      |

        y )Nr   r"   rv   r   rx   f4r   )rv   r@   r"   r"   r@   r"   r"   r{   )weightsru   )rG   r  rF  r   r  _build_weightsr   rC  r   r9  r  r  )r   rI   tree1rl  nwrL   c1c2c3c4w1rW  tree2s                r   test_kdtree_weightsrv    s:   ;;q!Q''A.Dq)Eggc$it,G			g	&Br01*e22GCRLA2Y #""5"++aQ*?@""5"++aQ*? '* # ,""5"++aQ*? $ # )""5"++aQ*?w # )eR[[B%: 	 	! 	2r"2r"2r"#  3t9 8\\^1R1WE"""5"++aS*AR # " ""5"++aS*AB2r" 	j%"7"72;;q"c*B	8!8r   c                 .   d}d}t         j                  j                  d       t         j                  j                  ||f      } | |d      }g d}t        j                  t        |            }|j                  ||      }|j                  ||d	      }t        ||j                                t        t        j                  |      t        j                  |            D ]/  \  }	}
|j                  ||
      }t        ||t        |	                1 y )
Nr6  r@   rw   r   r"   rx   )r   r  r  g{Gz?rP  F
cumulative)rG   r|   r}   normalrI  r  r  r   cumsumr^   	itertoolspermutationsr   r0  )r   r]   rP   rI   rE   r0i0n0nncrL   r1  s              r   &test_kdtree_count_neighbous_multiple_rr    s    A	AIINN499!Q(D*F	$B	3r7	B				+B

 
 
 
>CSZZ\"I**2.**2.0 +1 ""61-1bak*	+r   c                    t         j                  j                  d      }|j                  dd      }|j                  dd      } | |      }|j	                  ddgd      \  }}|j                  ddgd|z        }t        |g        |j	                  |d      \  }}|j                         }|j                  |d|z        }t        j                  dt        	      }	|	j                  g        t        |	|        | |      }
|j                  |
d|z        }	t        dg gz  |	       |j                  |
d|z        }	t        |	d
k(         |j                  |
d|z  d      }	t        |	t        j                  d      k(  d       |j                  |
d|z  d      }	t        |	t        j                  d      k(  d       |j                  |
d|z  d      }	t!        |	i        |j                  |
d|z  d      }	dt         j"                  fdt         j"                  fdt         j$                  fg}t        j&                  |d      }t        j                  d|	      }t        |	|       |j	                  |d      \  }}|d d df   j                         }|j)                  d|z  d      }	t!        |	t+                      |j)                  d|z  d      }	t        j                  dt         j"                  	      }t        |	|       y )Nrw   r{   r@   r/   r"   r   rk   )r{   )r   r   r   r   r  )r{   r{   Tr   r  r  rL   rX  r  )align)r   r   r  )r   r@   )rG   r|   rE  randrF   r   r   r+  rL  objectfillrT  r  r   r  r   r   intpfloat64r   r  r  )r   rI  XYr*   r6   rL   r_  mindr  other_dtype	res_dtypes                r   test_len0_arraysr    s    ))


%CQAQAq>D::r2h!:$DAqr2hA.Aq"::a1:DAq557DaT*A
vV,AFF2Jq!NEUCH-Ar2$w"UCH-AAFO##E3t8#MAqBHHX..5##E3t8#MAqBHHX..5##E3t8#HAB##E3t8#KABGGnsBGGnsBJJ.?@Ft,I
uI.Aq!::a1:DAqQU8<<>DTu5ACETy9A
vRWW-Aq!r   c           
      `   d}t        dd      D ]  }t        j                  ||f      }d||dz  d  t        j                  dd      D ]  \  }} | |||d      }|j
                  dk(  sJ | t        u r|j                  n|j                  j                  }t        t        j                  |j                  j                        t        j                  d	|dz               t        t        j                  |j                  j                        t        j                  |dz  |               y )
Ni   r"   r  r@   FT)repeat)r  r  ry   r   r   )r9  rG   r   r|  productr   r   r*   _noder   rG  r'  r(  rI  r  )r   r]   rP   rI   balancedcompactrE   r*   s           r   test_kdtree_duplicated_inputsr    s   A1a[ &ww1vQTU!*!2!2=!K 	&Hg X/6DF;;!####.'#9FKKKK%%  ++,		!Q!V$& ,,-		!q&!$&	&	&r   c                 \     | dggd      }t        t        |j                  |ddgd       y )Nr   r"   rx   rk   Frx  )rC  r   r  )r   rE   s     r   'test_kdtree_noncumulative_nondecreasingr    s1    
 1#+F*f44aU,r   c                 p   t        j                  g dg dg dg dg dg dgd      } | |      }|j                  |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       y )N)r   r   r   )r  r   r   )r   r   r   )r   r  r   )r   r   r   )r   r   r   r  r   rv   rz   rW   r   r  )rG   r   rF   r   r_   )r   xyzckdtdeqieqs        r   test_short_knnr    s     (( C sDzz#z=HCc"&&"&&"&&)rvvrvv&rvvrvv&rvvrvv&rvvrvv&(*+r   c                    t         j                  j                  d       t         j                  j                  d      }t         j                  j                  d      } | |      }t         j                  j	                  ddt        |            }|j                  ||      }t        ||      D cg c]  \  }}|j                  ||       }}}t        ||      D ]#  \  }	}
t        t        |	      t        |
             % y c c}}w )Nrw   ru   r   r   r   r@  )
rG   r|   r}   rz  r  r  r   r^   r   r  )r   rI   rF   r*   r6   rvectorqidirscalarr1   r2   s              r   test_query_ball_point_vector_rr  1  s    IINN499*DII(+EtD
		!Ss5z2A##E1-G;>ua=IRt$$R,IGIGW% 116!9fQi01 Js   4Dc           	      J   t         j                  j                  d       t         j                  j                  d      }t         j                  j                  d      } | |      }d}|j	                  ||d      }|j	                  ||d      D cg c]  }t        |       }}|D cg c]  }t        |j	                  ||             }	}|D cg c]  }|j	                  ||d       }
}t        ||       t        ||	       t        ||
       y c c}w c c}w c c}w )Nrw   r  r   r@  Treturn_lengthF)rG   r|   r}   rz  r   r  r   )r   rI   rF   r*   r6   lengthr   length2r  length3length4s              r   test_query_ball_point_lengthr  >  s   IINN499*DII(+EtDA""5!4"@F#'#8#8QV#8#WXCs3xXGX;@ARs4((Q/0AGAJOPBt$$R$$?PGPvw'vw'vw' YAPs   D,"DD c                 2   t         j                  j                  d       t         j                  j                  d      }t        j                  d      dz  }t        j
                  t        j                  d      d d d   dz        d d d   }t         j                  j                  d      }t        j
                  |j                        j                  }|j                  d   |j                  d   k7  sJ |j                  d   |j                  d   k7  sJ  | |      }|j                  ||d      }|j                  ||d      }t        ||       |j                  |d	      \  }	}
|j                  |d	      \  }}t        |	|       t        |
|       y )
Nrw   r  r   ru   g{Gz?r   Tr  r"   )rG   r|   r}   rz  rI  ascontiguousarrayr   stridesr   r   rF   )r   rI   d_contiguousd_discontiguousquery_contiguousquery_discontiguousr*   length1r  d1i1d2i2s                r   test_discontiguousr  N  s   IINN499*D99S>D(L**))C.2.577;t=Oyy''X'6../?/A/ABDD&&r*.>.F.Fr.JJJJ""2&,*>*>r*BBBBtD##$4$0 $ FG##$7$34 $ IG w(ZZ(!,FBZZ+Q/FBr2r2r   zbalanced_tree, compact_nodes))TF)TT)FFr  c                 X   t         j                  j                  d       t        j                  d      }t        j                  d      }t        j                  d      } | |||      }|j                  |dd	      }|d
k(  sJ |j                  |d      \  }}	|	j                  dk(  sJ |j                  dk(  sJ t        j                  |      j                         sJ |j                  |d
dg      }
t        |
d
d
g       |j                  |dd      }|j                  dk(  sJ y )Nrw   )r   r   )r   )r"   r   r.  r  r@  Tr  r   r@   )r@   r@   r"   r   r  r/  )rG   r|   r}   rL  r   r   rF   r   isinfrJ   r  r   r  )r   r  r  empty_v3query_v3query_v2r*   r  rS   rT   Nr  s               r   test_kdtree_empty_inputr  j  s    IINN4xxf%HwwV$HwwV$Hx}%24D""8S"EFQ;;ZZ!$FB88v88v88B<TAq6*Aq1a&!##D#;#GA77fr   c                       e Zd Zd Zd Zd Zy)_Test_sorted_query_ball_pointc                     t         j                  j                  d       t         j                  j                  dd      | _        | j                  | j                        | _        y )Nrw   ru   r"   )rG   r|   r}   r~   rD   r   r  r   s    r   r   z*_Test_sorted_query_ball_point.setup_method  s>    
		ta($$TVV,	r   c                    | j                   j                  | j                  dd      }|D ]  }t        |t	        |              | j                  D ]5  }| j                   j                  |dd      }t        |t	        |             7 y )Nr   Treturn_sorted)r  r   rD   r   r  )r<   	idxs_listidxsr  s       r   test_return_sorted_Truez5_Test_sorted_query_ball_point.test_return_sorted_True  s|    II..tvvr.N	 	3DtVD\2	3 && 	3B99--b"D-IDtVD\2	3r   c                    | j                   j                  | j                  d      }|D ]  }t        |t	        |              | j                  D cg c]  }| j                   j                  |d        }}| j                   j                  | j                  dd      }t        ||      D ]  \  }}t        ||        yc c}w )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   Fr  N)r  r   rD   r   r  r^   )r<   r  r  r  idxs_list_singleidxs_list_Falseidxs0idxs1s           r   test_return_sorted_Nonez5_Test_sorted_query_ball_point.test_return_sorted_None  s     II..tvvr:	 	3DtVD\2	3 JNP2DII66r2>PP))44TVVRu4U1AB 	-LE5ue,	- Qs   #B?N)r$   ro   rp   r   r  r  rq   r   r   r  r    s    -
3-r   r  c                     t         j                  j                  dd      j                  t              } t        j                  t        d      5  t        |       }d d d        t        | j                        }t        j                  t        d      5  |j                  |        d d d        t        j                  t        d      5  |j                  | d       d d d        y # 1 sw Y   xY w# 1 sw Y   MxY w# 1 sw Y   y xY w)Nr{   r@   zcomplex datar   r"   r  )rG   r|   r  viewcomplexr   r	   	TypeErrorr   realrF   r   r:  ts     r   test_kdtree_complex_datar    s    YY^^B"''0F	y	7 6N 	v{{A	y	7 	 
y	7 (	6Q'( ( 
 ( (s$   C%C1C=%C.1C:=Dc                    |j                   }t        |t        j                        sJ |j                  |j
                  d   k(  sJ |g}|r|j                  d      }t        |t        j                        rot        |j                  t              sJ |j                  t        |j                        k(  sJ t        ||j                     |j                  j                         nt        |t        j                        sJ t        |j                  t              sJ d|j                  cxk  r|j                  k  sJ  J t        |j                   t"              sJ t        |j                  t              sJ |j                  |j$                  j                  |j&                  j                  z   k(  sJ |j)                  |j&                         |j)                  |j$                         |ry y )Nr   r   )r*   r   r   	innernodechildrenr   popleafnoder   r  idxr   r  r)  r&  rP   r  r   r  r  rK  )rL   r  r:  rootr  r]   s         r   
visit_treer    sm   66DdF,,---==FLLO+++ FE
IIbMa)ajj#...::QUU+++vaee}agg.A.ABa!1!1222akk3///)acc)))))aggu---ajj#...::1993E3E!EEEELL#LL  r   c                      t         j                  j                  d       t         j                  j                  dd      } t	        |       }t        d||        y )Nrw   ru   rv   r   )rG   r|   r}   r  r   r  r  s     r   test_kdtree_tree_accessr    s;    IINN4YY^^C#FvAq!Vr   zSpawns worker threadsc                      t         j                  j                  d      } | j                  dd      }t	        |      }t        dt        ||       y )Nl   ]Qs ru   rv   r{   )rG   r|   rE  r  r   r
   r  )rI  r:  r  s      r   test_multithreaded_tree_accessr    s?     ))



+CXXc1FvAB
Av6r   c                     t         j                  j                  d       t         j                  j                  dd      } t	        |       }t        |j                  t              sJ |j                  | j                  d   k(  sJ t        |j                  t              sJ |j                  | j                  d   k(  sJ t        |j                  t              sJ |j                  dk(  sJ t        |j                  t        j                  | d             t        |j                  t        j                  | d             |j                   j"                  | u sJ y )Nrw   ru   rv   r   r"   r{   rB   )rG   r|   r}   r  r   r   rP   r   r]   r   ry   r   r  rQ   r  aminrI   baser  s     r   test_kdtree_attributesr    s    IINN4YY^^C#FvAacc333&,,q/!!!acc333&,,q/!!!ajj#&&&::qwwQ 78qvvrwwvA6766;;&   r   kdtree_classc           
         t         j                  j                  d      }t        j                  ddd      }|j                  d      j	                  d      }|j                  d      j	                  d      }|j                  d      }|j                  d	      } | |      } | |      }|j                  ||d
||f      }	|d d d f   |d d d f   z  }
t         j                  j                  |d d d d d f   |d d d d d f   z
  d      }t        t        j                  dg|d d       |      D cg c]&  \  }}t        j                  |
||k  ||k  z           ( }}}t        |	|       y c c}}w )Nrw   rP  r"      )r  r   -   )   r   r  r  F)ry  rl  r   rB   r   )rG   r|   rE  rI  rF  r  linalgr   r^   r|  chainrH   r   )r  rI  r1  ABwAwBkdAkdBnABrl  r   prev_radiusrC  expects                  r   $test_kdtree_count_neighbors_weightedr    sV   
))


%C
		$4 A

2u%A

2v&A	AB	BB
q/C
q/C


c1B

HC qkBq$wK'G99>>!D!QJ-!AtQJ-7b>AD),Y__aS!CR&-I1)MO%+v ffWkD0TV^DEF OF OC Os   2+E-c                     g d} t        |       }t        j                  | t        j                  |t        j                        g      d d d f   }t        j                  t        d      5  t        |       d d d        y # 1 sw Y   y xY w)N)
r"   r-  ir  ii   r   imust be finiter   )	r  rG   rH  r  nanr   r	   r   r   )valsr]   rI   s      r   test_kdtree_nanr    sf    1DD	A>>4BFF!345ag>D	z)9	: t  s   +B  B	c                     t         j                  j                  d      } | j                  ddd      }t	        |dd      }t        d      D cg c]  }t         j                   }}t        j                  t        d	
      5  |j                  |       d d d        t        j                  t        d	
      5  |j                  |d       d d d        t         j                  |dd d f<   t        j                  t        d	
      5  t	        |dd       d d d        t        j                  t        d	
      5  t	        |dd       d d d        t        j                  t        d	
      5  t	        |dd       d d d        t        j                  t        d	
      5  t	        |dd       d d d        y c c}w # 1 sw Y   %xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   rxY w# 1 sw Y   y xY w)Ni90  r  r   rk   )r   lowhighFr  r   r  r   r"   r   T)rG   r|   default_rngr  r   r9  r   r   r	   r   rF   r   )rI  coordsr  r#   	bad_coords        r   test_nonfinite_inputs_gh_18223r	    s   
))


&C[[hCc[:FvU%@A!&q*A*I*	z)9	: 			z)9	: )	9a() 66F1a4L	z)9	: @vT?@	z)9	: @vU$?@	z)9	: ?vT>?	z)9	: AvU%@A A + ) )@ @@ @? ?A AsN   F3F88GG7G)G)G58GGGG&)G25G>incantationc                      G d dt         j                        }ddgddgddgg}t        j                  |      } ||      } | |d	      }|j                  |d
       |j	                  |d       y )Nc                       e Zd Zd Zd Zy)test_gh_18800.<locals>.ArrLikec                 \    t        j                  |      j                  |       }d |_        |S r   )rG   r  r  rJ   )clsinput_arrayobjs      r   __new__z&test_gh_18800.<locals>.ArrLike.__new__3  s)    **[)..s3C CGJr   c                 .    |y t        |dd       | _        y )NrJ   )getattrrJ   )r<   r  s     r   __array_finalize__z1test_gh_18800.<locals>.ArrLike.__array_finalize__:  s    {sE40DHr   N)r$   ro   rp   r  r  rq   r   r   ArrLiker  2  s    		1r   r  gGzP@gQE@@gQ6@gp=
c6@g(\?@g=
ףpMT@r{   r"   r/  )rG   r  r   rF   r   )r
  r  r:  r  arr_liker*   s         r   test_gh_18800r  ,  ss    1"** 1 
		
F
 ((6
Cs|Hvr"DJJx(C(r   c                 D   t         j                  j                  d      }d}d}|j                  ||      } | |d      }ddddd d	}|j	                         D ]6  \  }}t        j                  t        d
      5  t        |||       d d d        8 t        j                  ddgt         j                        ddddd}	|	j	                         D ]8  \  }}t        j                  t        d      5  |t        ||      d d  d d d        : y # 1 sw Y   xY w# 1 sw Y   QxY w)Nl   X r   r@   r"   r  r   ru   r   )rP   r]   r   ry   r*   z(is not writable|has no setter)r   r   r   r  rv   rz  )rI   r(  r4   r  r  zdestination is read-only)rG   r|   rE  r  r  r   r	   AttributeErrorr  r   r  r   r  )
r   rI  r]   rX   r:  r   object_attrsattrattr_valarray_attrss
             r   test_immutabler  K  s'   
))



+CA	AXXa^FFA&AL ',,. 'h]]>1RS 	'AtX&	' 	'' !Qrzz2K &++- +h]]:-GH 	+"*GAtQ	+ 	++	' 	'	+ 	+s   9D
/D
D	D	)yr|  r   numpy.testingr   r   r   r   r   r   r   r	   rC  numpyrG   scipy._lib._testutilsr
   scipy.spatialr   r   r   r   scipy.spatial._ckdtreer   r   r   scipy.spatial.distancer   r   scipy.sparser   r   r   r   fixturer   r-   r7   r9   rs   r   r   r   r   r   r   r   r   r  r  r  r  r  r!  r&  r2  markthread_unsafe	fail_slowr>  rN  rP  r\  r`  rd  rh  rk  rn  rq  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r#  r-  r4  r<  r>  rA  rD  r8  	fail_asanri  rv  r  r  r  r  r  r  r  r  parametrizer  r  r  r  r  r  r  r  r  r	  r  r  rq   r   r   <module>r-     s    	, , +   9 E E . B 3 E E () *(H- H-V 	# 	 	 ,| , , &" & &: >+ > >+) +)Z-7 -7^> >4 
( 
 
 #
!1 #
 #
L )9  " 0   (9   -   %?   ,   .  ' ">?q-  @-& ">?qR  @R23 3* 2   &;  " !7   *I   "8   +J  3 3@HF
K
>F F$ F7 F FU) U)p #E  "P #!$/
B#
;5'$AD $D r 6&6J42 ( (T,8\ r+ +$,\&.,+21( 8 7

. - - -:( !8 "9:7 ;7!( &'):;! <!.A, &(9:) ;)<+r   