o
    Ö­j"Ã  ã                   @   s&  d dl Z d dlZd dlZd dlmZmZmZmZm	Z	 d dl
Z
d dl
mZ d dlm  mZ d dlmZ d dlmZ d dlZdd„ Zefdd	„Zej d
¡ g d¢Ze g ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘ddg‘¡Ze ddgdd gddgd dgd d gd dgdde ej¡j  gdd gddgg	¡Z!ej "dd¡e d d gd dgdd gddgg¡gZ#e#ej "dd¡de d d gd dgdd gddgg¡ g Z$e %e¡ej "dd¡ej "dd¡ej "dd¡ej "dd¡ej "dd¡ej "dd¡ej "dd ¡ee!d!œ
Z&e#dfe$dfd"œZ'd#d$„ Z(e&D ]Z)d%D ]Z*e(e)e*ƒ �q;�q7G d&d'„ d'ƒZ+G d(d)„ d)ƒZ,G d*d+„ d+ƒZ-G d,d-„ d-ƒZ.d.d/„ Z/G d0d1„ d1ƒZ0G d2d3„ d3ƒZ1G d4d5„ d5ƒZ2e
j3 4d6eej5g¡d7d8„ ƒZ6d9d:„ Z7d;d<„ Z8dS )=é    N)Úassert_equalÚassert_almost_equalÚassert_Úassert_allcloseÚassert_array_equal)Úraises)ÚcKDTree)ÚVoronoic                 C   ó   t t| ƒƒS ©N©ÚtupleÚsorted©Úx© r   ú[/var/www/html/CropPilot/venv/lib/python3.10/site-packages/scipy/spatial/tests/test_qhull.pyÚsorted_tuple   ó   r   c                 C   sb   t | tjƒr
|  ¡ } t |tjƒr| ¡ }tt|| ƒƒ} |  ¡  tt||ƒƒ}| ¡  t| |ƒ d S r   )Ú
isinstanceÚnpÚndarrayÚtolistÚlistÚmapÚsortr   )ÚaÚbÚtplr   r   r   Ú!assert_unordered_tuple_list_equal   s   r   éÒ  )©r   r   ©r   é   ©r#   r   ©r#   r#   ©ç      à?r'   )r'   g      ø?g…ëQ¸	Àgáz®GáÀg…ëQ¸ù¿gHáz®Gé¿ç        gHáz®Gé?g…ëQ¸ù?gáz®Gá@g…ëQ¸	@éÿÿÿÿr#   é
   é   ç      Ð?é   é   é   é   é   é   é   )
úsome-pointsz	random-2dz	random-3dz	random-4dz	random-5dz	random-6dz	random-7dz	random-8dúpathological-1úpathological-2)zbug-2850z
bug-2850-2c           	      C   sš   t |  }|jd }d}|d }| dkrd}n| dkrd}|d|… g}t|t|ƒ|ƒD ]}| |||| … ¡ q+d| |f }|tvsEJ ‚||ft|< dS )	z<
    Generate incremental datasets from basic data sets
    r#   Nr+   r4   zQJ Ppr5   é   z%s-chunk-%d)ÚDATASETSÚshapeÚrangeÚlenÚappendÚINCREMENTAL_DATASETS)	ÚnameÚ	chunksizeÚpointsÚndimÚoptsÚnminÚchunksÚjÚnew_namer   r   r   Ú_add_inc_data]   s   
rG   )r#   r/   é   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú
Test_Qhullc                 C   s¶  t  dt ddgddgddgddgddgg¡d¡}t | ¡ ¡}t  dt ddgddgddgddgg¡d¡}t | ¡ ¡}t | ¡ ¡}| ¡  t | ¡ ¡}| ¡  tt	|jƒ tt	|jƒ t
|d |d ƒ t|d |d td� t|d	 |d	 td� t|d
 |d
 td� t|d |d ƒ t
|d |d ƒ t|d |d td� t|d	 |d	 td� t|d
 |d
 td� t|d |d ƒ | ¡  tt	|jƒ | ¡  tt	|jƒ d S )Nó   vr   r#   ç      ð?r'   s   Qzç       @©r   r+   r.   r/   )ÚqhullÚ_Qhullr   ÚarrayÚcopyÚdeepcopyÚget_voronoi_diagramÚcloseÚassert_raisesÚRuntimeErrorr   r   r   r   )Úselfr   ÚxdÚyÚydÚxd2Úyd2r   r   r   Útest_swapping}   s<   &þ þzTest_Qhull.test_swappingc                 C   sL   t  ddgddgddgddgddgddgddgddgddgg	¡}t|ƒ d S )Nr   r#   r+   )r   rP   r	   )rW   r@   r   r   r   Útest_issue_8051£   s   8ÿzTest_Qhull.test_issue_8051N)Ú__name__Ú
__module__Ú__qualname__r]   r^   r   r   r   r   rI   |   s    &rI   c                   @   s€   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z				ddd„Z
ej d¡dd„ ƒZejjej d¡dd„ ƒƒZdS )ÚTestUtilitiesz-
    Check that utility functions work.

    c                 C   sˆ   t jg d¢t jd�}t |¡}t|jg d¢g d¢gƒ dD ]$}| |d d… ¡}t||d |›d� t ||d d… ¡}t||ƒ qd S )N©r!   r"   r%   r$   ©Údtype©r#   r.   r+   ©r.   r#   r   ))r,   r,   r#   )ç      è?rh   r   )ç333333Ó?çš™™™™™É?r#   r+   ©Úerr_msg)	r   rP   Úfloat64rN   ÚDelaunayr   Ú	simplicesÚfind_simplexÚtsearch)rW   r@   ÚtriÚpÚirE   r   r   r   Útest_find_simplex°   s   
úzTestUtilities.test_find_simplexc                 C   sè   t jg d¢t jd�}t jddgt jd�}t |¡}| |¡}| |¡}| |¡}t|jƒD ]D\}}||d  }	||d  }
||d  }t  	|	| |
| ¡}|t  
t  ||¡¡ }|t  |d ¡ 9 }t  ||| ¡}t|| |ƒ q-d S )N)r!   r%   r$   )g]2Ê�½ï?g>mj‡Ø?)g~T›!Òï?g^RÎz¥êÜ?rd   gä†›Býï?gÒÝÄ?r   r#   r+   )r   rP   rm   rN   rn   Úlift_pointsÚplane_distanceÚ	enumeratero   ÚcrossÚsqrtÚdotÚsignr   )rW   r   rs   rr   ÚzÚpzÚdistrE   ÚvÚx1Úx2Úx3ÚnÚdr   r   r   Útest_plane_distanceÅ   s$   
ÿ



õz!TestUtilities.test_plane_distancec                 C   sF   t jg d¢t jd�}t |¡}t|jddgddgddgddggƒ d S )Nrc   rd   r.   r+   r#   r   )r   rP   rm   rN   rn   r   Úconvex_hull©rW   r@   rr   r   r   r   Útest_convex_hullà   s   
(zTestUtilities.test_convex_hullc                 C   ó@   t  g d¢¡}t |¡}t|jdddd� t|jd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#   rK   ç›+¡†›„=zVolume of cube is incorrect©Úrtolrl   ç      @zArea of cube is incorrect©r   rP   rN   Ú
ConvexHullr   ÚvolumeÚarea©rW   r@   Úhullr   r   r   Útest_volume_areaí   s   

ÿ

ÿzTestUtilities.test_volume_areac                 C   rŠ   )N)
)g¿„ñQ4×?gŽÎœRë@Þ?gX&ÜlL5Ö?)gfÙÇN»zç?gjýž©Mä?g{Dí�šjî?)ga?8å\à?g®µ‚–ì?g�w5­KÁÚ?)g,lnq›³?g6½„î=àà?gŒ UáÔä?)gwì»�æÆÂ?g�ã°`ã?gaè‚³¢ì?)gâ+´qà?g\h½¿Ï±?gLƒg¼ýà?)g¾GéÕeà?gEˆ9²;å?gd:ëL£?)gÈŠK×BÞ?gB²Y’M”Ý?g�ßñÈÿÁ?)g~EHàyËÎ?gUƒdkÈêè?gmÖVq"ç?)gæÉÌqÑpî?g•¹e«ñî?g\û*L€ì?gY þ/®£Â?çH¯¼šò×z>z(Volume of random polyhedron is incorrectr�   g\¬¨Á4¬ú?z&Area of random polyhedron is incorrectr�   r”   r   r   r   Útest_random_volume_areaø   s   

ÿ

ÿz%TestUtilities.test_random_volume_areac                 C   s  d}d}t j ||f¡}tj|d|d …dd…f dd�}tj|d|d …dd…f dd�}t|d |ƒD ]U}t |d|d …dd…f ¡}| |||d …dd…f ¡ |j|||d …dd…f dd� t|j|jdd	� t|j|jdd	� t|j|jdd	� t|j|jdd	� q5dS )
zwTest that incremental mode gives the same volume/area as
        non-incremental mode and incremental mode with restarté   r.   Nr#   T©Úincremental©Úrestartr—   ©rŽ   )	r   ÚrandomrN   r‘   r:   Ú
add_pointsr   r’   r“   )rW   Ú	nr_pointsÚdimr@   Úinc_hullÚinc_restart_hullrt   r•   r   r   r   Ú)test_incremental_volume_area_random_input  s   """ùz7TestUtilities.test_incremental_volume_area_random_inputÚ Fr   c                    s
  |j |j }d|jd  }|jdd�| }dd„ }t t¡j}	||j|ƒ}
tj	dd�� t 
|
¡jdd�t|
| ƒ| dk jdd�B }W d	  ƒ n1 sMw   Y  t| ¡ |› d
t | ¡› �ƒ |d	d	…d	d…d	d	…f |d	d	…dd	d	d	…f  ‰ t ‡ fdd„t|jƒD ƒ¡}t |jd	d	…ddf ¡|t |	¡k B }t| ¡ |› d
t | ¡› �ƒ | |¡}|dkt 
|jd	d	…ddf ¡B }t| ¡ |› d
t | ¡› �ƒ |�r||kjdd�}||d| kjdd�O }|dk|B }t| ¡ |› d
t | ¡› �ƒ d	S d	S )z@Check that a triangulation has reasonable barycentric transformsr#   rK   ©Úaxisc                 S   sB   | d d …dd d …f }| d d …d d…d d …f }t  d||| ¡S )Nr)   z
ijk,ik->ij)r   Úeinsum)Útrr   ÚrÚTinvr   r   r   Úbarycentric_transform(  s   zJTestUtilities._check_barycentric_transforms.<locals>.barycentric_transformÚignore)Úinvalidgš™™™™™¹?Nú r)   c              	      s*   g | ]}t j ˆ |d d …d d …f ¡‘qS r   )r   ÚlinalgÚdet)Ú.0Úk©Úqr   r   Ú
<listcomp>7  s    "ÿz?TestUtilities._check_barycentric_transforms.<locals>.<listcomp>r   )r@   ro   rA   Úsumr   ÚfinfoÚfloatÚepsÚ	transformÚerrstateÚisnanÚallÚabsr   ÚnonzerorP   r:   ÚnsimplexÚisfiniterz   rp   Úany)rW   rr   rl   Ú	unit_cubeÚunit_cube_tolÚverticesÚscÚ	centroidsr­   r»   ÚcÚokr’   rE   Úat_boundaryr   rµ   r   Ú_check_barycentric_transforms  s2   0ÿ 2ÿ( 
" $úz+TestUtilities._check_barycentric_transformsr*   c                 C   sr   t  tj tj t¡dd¡¡}|d }| ¡  t 	|¡}t  
|jd d …ddf ¡ ¡ }t|dk |ƒ |  |¡ d S )NÚdatazdegenerate_pointset.npzrÊ   r   é   )r   ÚloadÚosÚpathÚjoinÚdirnameÚ__file__rT   rN   rn   r¾   r¼   r¸   r   rÍ   )rW   rÎ   r@   rr   Ú	bad_countr   r   r   Ú&test_degenerate_barycentric_transformsJ  s   ÿ
z4TestUtilities.test_degenerate_barycentric_transformsr™   c           	   
   C   s2  t  t¡j}dddddœ}tddƒD ]„}t  dd	|| ¡}t jttt j	t j
t j|g| Ž Ž ƒƒ j}d
| }t |¡}| j||dd� t j d¡ t j |jd ¡dk }||d d …f  d| t jj||d d …f jŽ d  7  < t |¡}| j||dd| d� t t j||f ¡}| j||dd| d� qd S )NéF   é   r0   r.   )r+   r.   r/   r0   r+   r1   r   r#   zndim=%dT)rl   rÅ   r    rj   r'   )rl   rÅ   rÆ   )r   r¹   rº   r»   r:   ÚlinspaceÚc_r   r   ÚravelÚbroadcast_arraysÚix_ÚTrN   rn   rÍ   rŸ   ÚseedÚrandr9   Úr_)	rW   r»   ÚnpointsrA   r   Úgridrl   rr   Úmr   r   r   Ú test_more_barycentric_transforms\  s8    ÿþ
ÿ:
þþæz.TestUtilities.test_more_barycentric_transformsN)r¦   Fr   )r_   r`   ra   Ú__doc__ru   r†   r‰   r–   r˜   r¥   rÍ   ÚpytestÚmarkÚ	fail_slowr×   Úslowræ   r   r   r   r   rb   ª   s"    
þ
-

rb   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestVertexNeighborVerticesc                    s–   dd„ t |jjd ƒD ƒ}|jD ]}|D ]}|D ]}||kr%||  |¡ qqq|j\‰‰ ‡ ‡fdd„t |jjd ƒD ƒ}t|||›d|›�d� d S )Nc                 S   s   g | ]}t ƒ ‘qS r   )Úset©r³   rE   r   r   r   r·   ‡  s    z5TestVertexNeighborVertices._check.<locals>.<listcomp>r   c              
      s.   g | ]}t ttˆ ˆ| ˆ|d   … ƒƒ‘qS ©r#   )rí   r   Úintrî   ©ÚindicesÚindptrr   r   r·   �  s    &ÿz != rk   )r:   r@   r9   ro   ÚaddÚvertex_neighbor_verticesr   )rW   rr   ÚexpectedÚsr   r   Úgotr   rñ   r   Ú_check†  s   
€þÿ
ÿz!TestVertexNeighborVertices._checkc                 C   ó,   t jg d¢t jd�}t |¡}|  |¡ d S )N)r!   r"   r$   rd   ©r   rP   rm   rN   rn   rù   rˆ   r   r   r   Útest_triangle•  ó   
z(TestVertexNeighborVertices.test_trianglec                 C   rú   )Nrc   rd   rû   rˆ   r   r   r   Útest_rectangleš  rý   z)TestVertexNeighborVertices.test_rectanglec                 C   rú   )N)r!   r"   r%   r$   r&   )gÍÌÌÌÌÌì?r'   rd   rû   rˆ   r   r   r   Útest_complicatedŸ  s
   
ÿ
z+TestVertexNeighborVertices.test_complicatedN)r_   r`   ra   rù   rü   rþ   rÿ   r   r   r   r   rì   …  s
    rì   c                   @   sr   e Zd 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d„ Zej deeƒ¡dd„ ƒZdS )ÚTestDelaunayz*
    Check that triangulation works.

    c                 C   ó   t j d¡}tttj|ƒ d S ©Nr#   )r   ÚmaÚ
masked_allrU   Ú
ValueErrorrN   rn   ©rW   Úmasked_arrayr   r   r   Útest_masked_array_fails«  ó   z$TestDelaunay.test_masked_array_failsc                 C   s0   t jddddt jfgt jd�}tttj|ƒ d S )Nr!   r"   r%   r#   rd   )r   rP   Únanrm   rU   r  rN   rn   ©rW   Úpoints_with_nanr   r   r   Útest_array_with_nans_fails¯  s   z'TestDelaunay.test_array_with_nans_failsc                 C   s´   t ddƒD ]R}t |d |f¡}t |ƒD ]}d|||f< qd|dd d …f< t |¡}|j ¡  t|jtj|d t	d�d d d …f ƒ t|j
dtj|d t	d�d d d …f  ƒ qd S )Nr+   r3   r#   rK   r)   rd   )r:   r   ÚzerosrN   rn   ro   r   r   Úarangerð   Ú	neighbors)rW   Úndr@   rE   rr   r   r   r   Útest_nd_simplex³  s   

&,õzTestDelaunay.test_nd_simplexc                 C   sR   t jg d¢t jd�}t |¡}t|jg d¢g d¢gƒ t|jg d¢g d¢gƒ d S )Nrc   rd   rf   rg   )r)   r)   r#   )r)   r)   r   )r   rP   rm   rN   rn   r   ro   r  rˆ   r   r   r   Útest_2d_squareÂ  s   
zTestDelaunay.test_2d_squarec                 C   sp   t jg d¢t jd�}t jg d¢t jd�}t j||f }t j||f }t t j||f ¡ t t j||f ¡ d S )N)r   r#   r   r#   rd   )r   r   r#   r#   )r   rP   rm   râ   rN   rn   rÛ   )rW   r   rY   ÚxpÚypr   r   r   Útest_duplicate_pointsÊ  s   z"TestDelaunay.test_duplicate_pointsc                 C   s�   t d }t |¡}t|j|j  ¡ | ¡ ƒ t|j|j  ¡ | ¡ ƒ t d }t |¡}t|j|j  ¡ | ¡ ƒ t|j|j  ¡ | ¡ ƒ d S )Nr5   r6   )r8   rN   rn   r   r@   ro   ÚmaxÚminrˆ   r   r   r   Útest_pathologicalÕ  s   

zTestDelaunay.test_pathologicalc                 C   sN   t j dd¡}t j||f }tj|dd�}tt  |j 	¡ ¡t  
t|ƒ¡ƒ d S )Nr*   r+   z	QJ Qbb Pp©Úqhull_options)r   rŸ   rá   râ   rN   rn   r   Úuniquero   rÜ   r  r;   rˆ   r   r   r   Útest_joggleá  s   ÿzTestDelaunay.test_jogglec                 C   s¨   t j dd¡}t j||f }t |¡}ttt  |j	 
¡ ¡ƒt|ƒd kƒ tt|jƒt|ƒd kƒ ttt  |jd d …df ¡ƒt|ƒd kƒ tt  |jdk¡ƒ d S )Nr*   r+   r   )r   rŸ   rá   râ   rN   rn   r   r;   r  ro   rÜ   Úcoplanarr¿   Úvertex_to_simplexrˆ   r   r   r   Útest_coplanarì  s   
$,zTestDelaunay.test_coplanarc                 C   s4   g d¢}t j|dd�}t ddg¡}t|j|ƒ d S )N©r!   r"   r$   r&   )çš™™™™™ñ?r"  T©Úfurthest_site)r#   r/   r   )r/   r+   r   )rN   rn   r   rP   r   ro   )rW   r@   rr   rö   r   r   r   Útest_furthest_siteú  s   zTestDelaunay.test_furthest_siter>   c           	      C   s  t | \}}tj|dd�}tj|d d|d�}|dd … D ]}| |¡ qt |¡}tj|d d|d�}t|ƒdkrJ|jtj|dd … dd�dd� | d¡rrtt 	|j
 ¡ ¡t |jd ¡ƒ tt 	|j
 ¡ ¡t |jd ¡ƒ n	t|j
|j
td� t|j
|j
td� d S )	Nr   r§   T©r›   r  r#   rœ   ÚpathologicalrM   )r=   r   ÚconcatenaterN   rn   r    r;   Ú
startswithr   r  ro   rÜ   r  r9   r   r   )	rW   r>   rD   rB   r@   ÚobjÚchunkÚobj2Úobj3r   r   r   Útest_incremental  s8   ÿ
ÿÿ
ÿÿ
ÿ

ÿzTestDelaunay.test_incrementalN)r_   r`   ra   rç   r  r  r  r  r  r  r  r   r%  rè   ré   Úparametrizer   r=   r.  r   r   r   r   r   ¦  s    r   c                 C   s†  t tt|ƒƒ}t tt|ƒƒ}||kr¼| jd dkr¼dt t¡j }|D ]–\}}|D ]‹\}}| | | |  }|tj 	|¡ }t 
|d  |d g¡}	t |	| | | |  ¡}
t |	| | | |  ¡}t t |
|	¡d¡slq)t t ||	¡d¡swq)t || | | |  ¡}
t || | | |  ¡}t || | | |  ¡}|
| k s¦|
|| kr§q)|| k s²||| kr³q) ntdƒ‚q#d S t||ƒ d S )Nr#   r+   iè  r   zcomparison fails)rí   r   r   r9   r   r¹   rº   r»   r±   ÚnormrP   r{   ÚallcloseÚAssertionErrorr   )r@   Úfacets_1Úfacets_2r»   r   r   ÚapÚbpÚtr„   Úc1Úc2Úc3r   r   r   Úassert_hulls_equal&  s6   þr;  c                   @   s–  e Zd Zdd„ Zdd„ Zej dee	ƒ¡dd„ ƒZ
ej deeƒ¡dd	„ ƒZd
d„ Zdd„ Zej dddg¡dd„ ƒZej dddg¡ej de ddgg¡ejg d¢ed�fe ddgg¡ejg d¢ed�fe ddgg¡ejg d¢ed�fe dd gd d gg¡ejg d!¢ed�fe dd"gg¡ejg d¢ed�fg¡d#d$„ ƒƒZej dddg¡d%d&„ ƒZej dddg¡d'd(„ ƒZej dddg¡d)d*„ ƒZd+S ),ÚTestConvexHullc                 C   r  r  )r   r  r  rU   r  rN   r‘   r  r   r   r   r  ^  r	  z&TestConvexHull.test_masked_array_failsc                 C   s.   t jdddt jfgt jd�}tttj|ƒ d S )Nr!   r%   r+   rd   )r   rP   r
  rm   rU   r  rN   r‘   r  r   r   r   r  b  s   z)TestConvexHull.test_array_with_nans_failsr>   c                 C   sp   t | }t |¡}t |¡}t||j|jƒ |jd dkr,tt	 
|j¡t	 |j¡ƒ d S tt	 
|j¡|jƒ d S )Nr#   r+   )r8   rN   rn   r‘   r;  r‡   ro   r9   r   r   r  r   rÇ   )rW   r>   r@   rr   r•   r   r   r   Útest_hull_consistency_trif  s   

z(TestConvexHull.test_hull_consistency_tric           	      C   s´   t | \}}tj|dd�}tj|d dd�}|dd … D ]}| |¡ qt |¡}tj|d dd�}t|ƒdkrH|jtj|dd … dd�dd� t||j|jƒ t||j|jƒ d S )Nr   r§   Trš   r#   rœ   )	r=   r   r(  rN   r‘   r    r;   r;  ro   )	rW   r>   rD   Ú_r@   r*  r+  r,  r-  r   r   r   r.  w  s   
ÿzTestConvexHull.test_incrementalc                 C   sŽ   t j d¡ t j dd¡}t |¡}tt  |j¡t  	|j
¡ƒ |j|j
 j\}}t  || ¡  || ¡  ¡}tt  t  t  |¡¡dk¡ƒ d S )Nr    r-   r+   r   )r   rŸ   rà   rá   rN   r‘   r   r  ro   r   rÇ   r@   rß   Úarctan2Úmeanr   r¿   ÚdiffÚunwrap)rW   r@   r•   r   rY   Úangler   r   r   Útest_vertices_2dŒ  s   
"zTestConvexHull.test_vertices_2dc                 C   s<   t  g d¢¡}t |¡}t|jddd� t|jddd� d S )Nr‹   rK   rŒ   rž   r�   r�   rˆ   r   r   r   r–   ™  s   
zTestConvexHull.test_volume_arear›   FTc                 C   s^   t  ddgddgddgddgddgg¡}tj||dd�}t jg d¢td�}|j}t||ƒ d S )	Nrj   çš™™™™™Ù?ri   ç333333ã?ÚQG4©r@   r›   r  )FTFFrd   ©r   rP   rN   r‘   ÚboolÚgoodr   ©rW   r›   r@   r•   rö   Úactualr   r   r   Útest_good2d¢  s   
üþzTestConvexHull.test_good2dÚ
visibilityrG  zQG-4znew_gen, expectedri   gffffffæ?)FFFFFrd   gffffffæ¿)FTFFFg=
×£p=Ú?)FFFTTr'   rF  )FFTFFg433333ã?c                 C   sh   t  ddgddgddgddgddgg¡}tj|d|d�}| |¡ |j}d|v r-t  |¡}t||ƒ d S )Nrj   rE  ri   rF  TrH  ú-)r   rP   rN   r‘   r    rK  Úinvertr   )rW   Únew_genrö   rO  r@   r•   rM  r   r   r   Útest_good2d_incremental_changes±  s   
'üþ

z.TestConvexHull.test_good2d_incremental_changesc                 C   sv   t  ddgddgddgddgddgg¡}tj||d�}|j}|d u s$J ‚|r7| t  d¡¡ |j}|d u s9J ‚d S d S )Nrj   rE  ri   rF  )r@   r›   ©r#   r+   )r   rP   rN   r‘   rK  r    r  )rW   r›   r@   r•   rM  r   r   r   Útest_good2d_no_optionæ  s"   
üÿýz$TestConvexHull.test_good2d_no_optionc                 C   s^   t  ddgddgddgddgddgg¡}tj||dd�}t jg d¢td�}|j}t||ƒ d S )Nrj   rE  ri   rG  rH  )FFFFrd   rI  rL  r   r   r   Útest_good2d_insideù  s   
üþz!TestConvexHull.test_good2d_insidec                 C   sZ   t  g d¢g d¢g d¢g d¢g d¢g¡}tj||dd�}t jg d¢td	�}t|j|ƒ d S )
N©r(   r(   r(   )gŠNžË7Ïì?g+ï²xÙ¿g¸gÈ>é@È?)gFE÷%'ß?gW¯¦Û§=ç¿g¤úÎ/Jß?)g›˜ä6Ðrâ?gtÄ­Ä4úé¿g¤¾��Å·¿)g¶w6y¶å?g’«QÂæ¿gÿ€b¿‚�Ç?ÚQG0rH  )TFFFrd   )r   rP   rN   r‘   rJ  r   rK  )rW   r›   r@   r•   rö   r   r   r   Útest_good3d
  s   
üþzTestConvexHull.test_good3dN)r_   r`   ra   r  r  rè   ré   r/  r   r8   r=  r=   r.  rD  r–   rN  r   rP   rJ  rS  rU  rV  rY  r   r   r   r   r<  ]  sN    

	
þÿÿÿÿÿä

r<  c                   @   s²   e Zd Zej dddg¡ej dddg¡ej ddd	g¡d
d„ ƒƒƒZdd„ Zdd„ Zdd„ Z	ej de
eƒ¡dd„ ƒZdd„ Zdd„ Zej d¡ej de
eƒ¡dd„ ƒƒZdS )ÚTestVoronoizqhull_opts, extra_pts)z	Qbb Qc Qzr#   )zQbb Qcr   Ún_ptsé2   éd   rA   r+   r.   c           
      C   sÆ   t j d¡}| ||f¡}t||d�}|j}| ¡ |d | ks"J ‚|jt|jƒ| ks.J ‚t|jƒ|| ks9J ‚|j	j
d |ksCJ ‚|r_dd„ |jD ƒ}	|	 d¡dksVJ ‚|	 d¡|vsaJ ‚d S d S )Nin  r  r#   r   c                 S   ó   g | ]}t |ƒ‘qS r   ©r;   ©r³   r   r   r   r   r·   7  ó    z;TestVoronoi.test_point_region_structure.<locals>.<listcomp>)r   rŸ   Údefault_rngr	   Úpoint_regionr  Úsizer;   Úregionsr@   r9   ÚcountÚindex)
rW   Ú
qhull_optsr[  Ú	extra_ptsrA   Úrngr@   ÚvorÚ	pt_regionÚsublensr   r   r   Útest_point_region_structure  s   ûz'TestVoronoi.test_point_region_structurec                 C   r  r  )r   r  r  rU   r  rN   r	   r  r   r   r   r  =  r	  z#TestVoronoi.test_masked_array_failsc                 C   s   g d¢}d}|   ||¡ d S )N)	r!   r"   )r   r+   r$   r%   rT  )r+   r   )r+   r#   )r+   r+   a	  
        2
        5 10 1
        -10.101 -10.101
           0.5    0.5
           0.5    1.5
           1.5    0.5
           1.5    1.5
        2 0 1
        3 2 0 1
        2 0 2
        3 3 0 1
        4 1 2 4 3
        3 4 0 2
        2 0 3
        3 4 0 3
        2 0 4
        0
        12
        4 0 3 0 1
        4 0 1 0 1
        4 1 4 1 2
        4 1 2 0 2
        4 2 5 0 2
        4 3 4 1 3
        4 3 6 0 3
        4 4 5 2 4
        4 4 7 3 4
        4 5 8 0 4
        4 6 7 0 3
        4 7 8 0 4
        ©Ú_compare_qvoronoi©rW   r@   Úoutputr   r   r   Útest_simpleA  s    zTestVoronoi.test_simplec                 K   s^  dd„ |  ¡  ¡ D ƒ}t|d d ƒ}ttt|dd| … ƒƒ}t|d d ƒ}dd„ |d| d| | … D ƒ}dd„ |d| | d	… D ƒ}d
d„ |d| | d	… D ƒ}	tj|fi |¤Ž}
dd„ }t|
j	|ƒ t
ttt|
jƒƒttt|ƒƒƒ tttt||ƒƒtt||	ƒƒƒƒ}tttt||
j ¡ ƒƒtt||
jƒƒƒƒ}| ¡  | ¡  t
||ƒ d	S )z:Compare to output from 'qvoronoi o Fv < data' to Voronoi()c                 S   s   g | ]}t tt| ¡ ƒƒ‘qS r   )r   r   rº   Úsplitr`  r   r   r   r·   n  s    z1TestVoronoi._compare_qvoronoi.<locals>.<listcomp>r#   r   r.   r+   c                 S   ó"   g | ]}d d„ |dd… D ƒ‘qS )c                 S   ó   g | ]}t |ƒd  ‘qS rï   ©rð   ©r³   rY   r   r   r   r·   r  ó    ú<TestVoronoi._compare_qvoronoi.<locals>.<listcomp>.<listcomp>r#   Nr   r`  r   r   r   r·   r  ó    ÿc                 S   ru  )c                 S   r^  r   rw  rx  r   r   r   r·   t  ra  rz  r#   r.   r   r`  r   r   r   r·   t  r{  Nc                 S   ru  )c                 S   rv  rï   rw  rx  r   r   r   r·   v  ry  rz  r.   Nr   r`  r   r   r   r·   v  r{  c                 S   r
   r   r   r   r   r   r   Ú	sorttuple|  r   z0TestVoronoi._compare_qvoronoi.<locals>.sorttuple)ÚstripÚ
splitlinesrð   r   r   r   rN   r	   r   rÇ   r   rí   re  ÚzipÚridge_pointsr   Úridge_verticesr   )rW   r@   rr  ÚkwÚnvertexrÇ   Únregionre  r€  r�  rk  r|  Úp1Úp2r   r   r   rp  j  s8   ÿÿÿÿÿÿzTestVoronoi._compare_qvoronoir>   c                 C   s¶   t | }t|ƒ}t |¡}|j ¡ D ]F\}}t t |¡dk¡s!q|j	| j
dd�}d||d  |  }|j|| dd�\}	}
t|
|d ƒ |j|| dd�\}	}
t|
|d ƒ qd S )Nr   r§   g�íµ ÷Æ°>r#   )r´   )r8   ÚKDTreerN   r	   Ú
ridge_dictÚitemsr   r¿   ÚasarrayrÇ   r@  Úqueryr   )rW   r>   r@   Útreerk  rs   r€   Úridge_midpointr…   r   r´   r   r   r   Útest_ridgesŒ  s   
ôzTestVoronoi.test_ridgesc                 C   s    g d¢}d}| j ||dd� d S )Nr!  a'  
        2
        3 5 1
        -10.101 -10.101
        0.6000000000000001    0.5
           0.5 0.6000000000000001
        3 0 2 1
        2 0 1
        2 0 2
        0
        3 0 2 1
        5
        4 0 2 0 2
        4 0 4 1 2
        4 0 1 0 1
        4 1 4 0 1
        4 2 4 0 2
        Tr#  ro  rq  r   r   r   r%  ¥  s   zTestVoronoi.test_furthest_sitec                 C   s8   g d¢}t |ƒ}t|jdƒ t |dd�}t|jdƒ d S )Nr!  FTr#  )r	   r   r$  )rW   r@   rk  r   r   r   Útest_furthest_site_flag½  s
   z#TestVoronoi.test_furthest_site_flagr*   c                    s€  t | d d jd dkrd S t | \}}tj|dd�}tj|d d|d�}|dd … D ]}| |¡ q,t |¡}tj|d d|d�}t|ƒdkrY|jtj|dd … dd�dd� tt|j	ƒt|j	ƒƒ tt|j	ƒt|j	ƒƒ ||fD ]J‰ ddi‰t
ˆ jƒD ]\}	}
t
|jƒD ]\}}t |
|¡r•|ˆ|	< q‡q~‡ ‡‡fd	d
„‰dd„ }t|ˆˆ jƒƒ||jƒƒ t|ˆˆ jƒƒ||jƒƒ qsd S )Nr   r#   r.   r§   Tr&  rœ   r)   c              
      s^   t | dƒrt‡fdd„| D ƒƒS zˆ|  W S  ty. } zdˆ j|  ›�}t|ƒ|‚d }~ww )NÚ__len__c                    s   h | ]}ˆ |ƒ’qS r   r   rx  )Úremapr   r   Ú	<setcomp>í  ra  z>TestVoronoi.test_incremental.<locals>.remap.<locals>.<setcomp>z*incremental result has spurious vertex at )Úhasattrr   ÚKeyErrorrÇ   r2  )r   ÚeÚmessage©Úobjxr‘  Ú
vertex_mapr   r   r‘  ë  s   

ÿ
€ýz+TestVoronoi.test_incremental.<locals>.remapc                 S   s:   t tt| ƒƒ}d|v r| d¡ dd„ |D ƒ}| ¡  |S )Nr   c                 S   s   g | ]
}t |ƒd kr|‘qS rï   r_  r`  r   r   r   r·   ù  s    zDTestVoronoi.test_incremental.<locals>.simplified.<locals>.<listcomp>)rí   r   r   Úremover   )r   r‰  r   r   r   Ú
simplifiedõ  s   
z0TestVoronoi.test_incremental.<locals>.simplified)r=   r9   r   r(  rN   r	   r    r;   r   rc  rx   rÇ   r1  re  r�  )rW   r>   rD   rB   r@   r*  r+  r,  r-  rt   r€   rE   Úv2r›  r   r—  r   r.  Å  sL   ÿ
ÿÿ€þ
þþãzTestVoronoi.test_incrementalN)r_   r`   ra   rè   ré   r/  rn  r  rs  rp  r   r8   rŽ  r%  r�  rê   r=   r.  r   r   r   r   rZ    s$    ü)"

rZ  c                
   @   sÂ   e Zd Zd!dd„Zej deje	g¡dd„ ƒZ
dd„ Zd	d
„ Zdd„ Zdd„ Zej deddƒ¡dd„ ƒZej de g d¢¡e g d¢g d¢g d¢g¡g¡dd„ ƒZdd„ Zdd„ Zdd„ Zd S )"ÚTest_HalfspaceIntersectionr—   c                 C   sx   t |j|jƒ tj|jd ftd�}|D ]}t t|| ƒ|k jdd�¡d }t |jdƒ d||d < qt| ¡ ƒ dS )z2Check that every line in arr1 is only once in arr2r   rd   r#   r§   rï   TN)	r   r9   r   r  rJ  rÁ   rÀ   r¿   r   )rW   Úarr1Úarr2rŽ   ÚtruthsÚl1Úindexesr   r   r   Úassert_unordered_allclose
  s   "z4Test_HalfspaceIntersection.assert_unordered_allcloseÚdtc                 C   sv   t jg d¢g d¢g d¢g d¢g|d�}t jddg|d�}t  ddgddgddgddgg¡}t ||¡}t|j|ƒ d S )	N)r)   r   r   )r   r)   r   )r#   r   éþÿÿÿ)r   r#   r¥  rd   r#   r(   rL   )r   rP   rN   ÚHalfspaceIntersectionr   Úintersections)rW   r¤  Ú
halfspacesÚfeasible_pointr@   r•   r   r   r   Ú test_cube_halfspace_intersection  s   
ýý"z;Test_HalfspaceIntersection.test_cube_halfspace_intersectionc           
      C   s:  t j t j t¡dd¡}t |¡}t |d d …dd …f |d d …d d…f f¡ }t g d¢¡}t	 
||¡}t|jjdƒ t|jdƒ tt|jƒdƒ |jD ]	}tt|ƒdƒ qN|d d …d	f |d d …d d	…f  |¡ }|  |d d …d d	…f j| j|j¡ t g d
¢¡}|D ]}	tt |j|	kjdd�¡dƒ q‰d S )NrÎ   zselfdual-4d-polytope.txtr#   )r(   r(   r(   r(   )é   r/   g      @@r«  r1   r)   )r(   r(   r'   ç      à¿r§   )rÑ   rÒ   rÓ   rÔ   rÕ   r   Ú
genfromtxtÚhstackrP   rN   r¦  r   r§  r9   r   Údual_volumer;   Údual_facetsr{   r£  rß   Údual_pointsÚ	itertoolsÚpermutationsr¸   r¿   )
rW   ÚfnameÚineqsr¨  Ú
feas_pointÚhsÚfacetÚdistsr@   Úpointr   r   r   Ú$test_self_dual_polytope_intersection#  s$   ÿ
0
*& ÿz?Test_HalfspaceIntersection.test_self_dual_polytope_intersectionc                 C   s¦   t  g d¢g d¢g d¢g d¢g¡}t  g d¢¡}tttj||ƒ t  dgdgg¡}tttj||ƒ t  ddgg¡}tttj||ƒ t  ddg¡}ttjtj||ƒ d S )N)ç      ð¿r(   r(   )r(   r¼  r(   ©rK   r(   r¼  ©r(   rK   r¼  ©r'   r'   r'   r'   r¬  )r   rP   rU   r  rN   r¦  Ú
QhullError)rW   r¨  r©  r   r   r   Útest_wrong_feasible_point:  s*   
ýÿÿÿÿz4Test_HalfspaceIntersection.test_wrong_feasible_pointc              	   C   sd  t  g d¢g d¢g d¢g d¢g d¢g d¢g¡}t  g d¢g d¢g d	¢g d
¢g¡}t  dggd ¡}t  t  || f¡|f¡}t  g d¢¡}tj||dd�}tj||dd�}t|ƒD ]R\}}	| |	t jd d …f ¡ |j|	t jd d …f dd� t  ||d |d …d d …f f¡}
t |
|¡}t	|j
|j
ƒ t	|j
|j
ƒ t	|j|jƒ |  |j|j¡ qY| ¡  d S )N)r(   r(   r¼  r¬  )r(   r¼  r(   r¬  )r¼  r(   r(   r¬  )rK   r(   r(   r¬  )r(   rK   r(   r¬  )r(   r(   rK   r¬  )rK   rK   rK   )rK   rK   r¼  )rK   r¼  rK   )r#   r¼  r¼  r¼  r3   rW  Trš   rœ   r#   )r   rP   r®  ÚvstackrN   r¦  rx   Úadd_halfspacesÚnewaxisr   r¨  r§  r£  rT   )rW   r¨  Úextra_normalsÚoffsetsÚextra_halfspacesr¶  Úinc_hsÚ
inc_res_hsrt   ÚehsÚtotalr·  r   r   r   r.  Q  s>   
û
ýÿÿ"z+Test_HalfspaceIntersection.test_incrementalc              	   C   sú   t  g d¢g d¢g d¢g d¢g d¢g d¢g¡}t  g d¢¡}t ||¡}t  g d¢g d	¢g d
¢g d¢g d¢g d¢g¡}g d¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢g}t|ƒt|jƒks`J ‚t||jƒD ]\}}t|ƒt|ƒkstJ ‚qft|j	|ƒ d S )N)r¼  r(   r(   r(   )rK   r(   r(   r¼  )r(   r¼  r(   r(   )r(   rK   r(   r¼  )r(   r(   r¼  r(   )r(   r(   rK   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#   )r0   r+   r   )r+   r0   r#   )r.   r/   r#   )r/   r.   r   )r0   r.   r#   )r.   r0   r   )
r   rP   rN   r¦  r;   r°  r  rí   r   r±  )rW   r¨  rº  r·  Úqhalf_pointsÚqhalf_facetsr   r   r   r   r   Ú	test_cube|  s<   
ûúø
z$Test_HalfspaceIntersection.test_cuber´   r#   r/   c           	      C   s$  t  g d¢g d¢g d¢g d¢g¡}t  g d¢g d¢g d¢g d¢g¡}tj|t  d	d
g¡dd�}| |d|…d d …f ¡ | ||d…d d …f ¡ | ¡  t  ddgddgddgddgg¡}|j}t  |d d …df |d d …df f¡}t  |d d …df |d d …df f¡}t|| || ƒ d S )N)rK   r(   ç       À)r¼  r(   rÏ  )r(   rK   rÏ  )r(   r¼  rÏ  r½  )r¼  r(   r¼  r¾  )r(   r¼  r¼  gCëâ6Ô?gaÃÓ+eÑ?Trš   r   r/   rK   r¼  r#   )	r   rP   rN   r¦  rÃ  rT   r§  Úlexsortr   )	rW   r´   Ú
big_squareÚsmall_squarer·  Úexpected_intersectionsÚactual_intersectionsÚind1Úind2r   r   r   Útest_halfspace_batch   s4   
ý
ýþ
ý&&z/Test_HalfspaceIntersection.test_halfspace_batchr¨  )gÃÀJp°˜æ¿g¦zøS_-Ý¿g-|†d¥?)gÑ#Â–‰¨æ?gó–'çöÝ¿g1&Ü¯kÝ¿)r(   gŒ:çe|è?g¹Ä‘"ËÖ¿c                 C   sx   t  g d¢g d¢g d¢g d¢g¡}tj|t  d¡dd�}tjtjdd	�� | |¡ W d   ƒ d S 1 s5w   Y  d S )
N©r#   r   r)   ©r   r#   r)   ©r)   r   r)   ©r   r)   r)   r+   Trš   zfeasible.*-0.706.*©Úmatch©	r   rP   rN   r¦  r  rè   r   rÀ  rÃ  )rW   r¨  Úinitial_squareÚincremental_intersectorr   r   r   Útest_gh_19865Ã  s   ÿþ"ÿz(Test_HalfspaceIntersection.test_gh_19865c              	   C   s    t  g d¢g d¢g d¢g¡}t  g d¢g d¢g d¢g d¢g d¢g d	¢g¡}tj|t  d
¡dd�}tjtjdd�� | |¡ W d   ƒ d S 1 sIw   Y  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)   )r   r)   r   r)   )r   r   r#   r)   )r   r   r)   r)   r.   Trš   zfeasible.*[1 0 0 0]rÜ  rÞ  )rW   r¨  Úinitial_cuberà  r   r   r   Útest_gh_19865_3dØ  s$   
þ
ûþ"ÿz+Test_HalfspaceIntersection.test_gh_19865_3dc                 C   s|   t  g d¢g d¢g d¢g d¢g¡}tj|t  d¡dd�}tjtdd	�� | t  	d
¡¡ W d   ƒ d S 1 s7w   Y  d S )NrØ  rÙ  rÚ  rÛ  r+   Trš   z2D arrayrÜ  )r/   r/   r/   )
r   rP   rN   r¦  r  rè   r   r  rÃ  Úones©rW   rß  rà  r   r   r   Útest_2d_add_halfspace_inputë  s   ÿþ"ÿz6Test_HalfspaceIntersection.test_2d_add_halfspace_inputc                 C   st   t  g d¢g d¢g d¢g d¢g¡}tj|t  d¡dd�}t|jt  d¡ƒ | t  g d	¢¡¡ t|jt  d
¡ƒ d S )NrØ  rÙ  rÚ  rÛ  r+   Trš   r/   )r+   r+   r)   r0   )	r   rP   rN   r¦  r  r   Údual_verticesr  rÃ  rå  r   r   r   Útest_1d_add_halfspace_input÷  s   ÿþz6Test_HalfspaceIntersection.test_1d_add_halfspace_inputN)r—   )r_   r`   ra   r£  rè   ré   r/  r   rm   rð   rª  r»  rÁ  r.  rÎ  r:   r×  rP   rá  rã  ræ  rè  r   r   r   r   r�  	  s*    

+$
"
þþ
r�  Údiagram_typec                 C   sR   t j d¡}| d¡}tjtdd�� | |ƒ W d   ƒ d S 1 s"w   Y  d S )Né{   )r/   r*   r.   Ú
dimensionsrÜ  )r   rŸ   rb  rè   r   r  )ré  rj  Úinvalid_datar   r   r   Útest_gh_20623  s
   

"ÿrí  c                  C   sš   t  ddgddgddgddgg¡} t | ¡}t t¡� | d¡ W d   ƒ n1 s+w   Y  t t¡� | |¡ W d   ƒ d S 1 sFw   Y  d S )Nr   r"  r#   )r   rP   rN   rn   rè   r   Ú
IndexErrorrp   ©Ú
generatorsrr   r   r   r   Útest_gh_21286  s   "
ÿ"ýrñ  c                  C   sj   t  ddgddgddgddgg¡} t | ¡}t t¡� | g d¢¡ W d   ƒ d S 1 s.w   Y  d S )Nr   r"  r#   )r+   r+   r+   )r   rP   rN   rn   rè   r   r  rp   rï  r   r   r   Útest_find_simplex_ndim_err  s
   "
"ÿrò  )9rÑ   rQ   Únumpyr   Únumpy.testingr   r   r   r   r   rè   r   rU   Úscipy.spatial._qhullÚspatialÚ_qhullrN   Úscipy.spatialr   r‡  r	   r²  r   r   r   rŸ   rà   r@   rP   Úpathological_data_1r¹   rm   r»   Úpathological_data_2rá   Úbug_2850_chunksÚbug_2850_chunks_2rŠ  r8   r=   rG   r>   r?   rI   rb   rì   r   r;  r<  rZ  r�  ré   r/  rn   rí  rñ  rò  r   r   r   r   Ú<module>   sÄ   ÿÿÿÿþþþþýýýýüüüüûûûûúúúúùùùùøøøø	÷	÷	÷	÷
ö
ö
ö
ö
öõõõõõôôôôóóóóòòòòññññððððïïïïîîîîííííììì ý ÿ$ÿÿöþÿ. \! 7 = q |
