U
    »mœds¬  ã                T   @   sh  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dd	„ Zefd
d„Zej d¡ dddd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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gQ¡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ä�qÜG d-d.„ d.ƒZ,G d/d0„ d0ƒZ-G d1d2„ d2ƒZ.G d3d4„ d4ƒZ/d5d6„ Z0G d7d8„ d8ƒZ1G d9d:„ d:ƒZ2G d;d<„ d<ƒZ3dS )=é    N)Úassert_equalÚassert_almost_equalÚassert_Úassert_allcloseÚassert_array_equal)Úraises)ÚcKDTree)ÚVoronoic                 C   s   t t| ƒƒS ©N©ÚtupleÚsorted©Úx© r   úW/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scipy/spatial/tests/test_qhull.pyÚsorted_tuple   s    r   c                 C   s   t t | ¡ƒS r
   )r   ÚnpÚuniquer   r   r   r   Úsorted_unique_tuple   s    r   c                 C   sb   t | tjƒr|  ¡ } t |tjƒr(| ¡ }tt|| ƒƒ} |  ¡  tt||ƒƒ}| ¡  t| |ƒ d S r
   )Ú
isinstancer   Z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r8d}|d|… g}t|t|ƒ|ƒD ]}| |||| … ¡ qVd| |f }|tksŠt‚||ft|< dS )	z<
    Generate incremental datasets from basic data sets
    r"   Nr*   r3   zQJ Ppr4   é   z%s-chunk-%d)ÚDATASETSÚshapeÚrangeÚlenÚappendÚINCREMENTAL_DATASETSÚAssertionError)	ÚnameÚ	chunksizeÚpointsÚndimÚoptsZnminÚchunksÚjÚnew_namer   r   r   Ú_add_inc_dataa   s    
rF   )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.   )ÚqhullZ_Qhullr   ÚarrayÚcopyÚdeepcopyZget_voronoi_diagramÚcloseÚassert_raisesÚRuntimeErrorr   r   r   r   )Úselfr   ZxdÚyZydZxd2Z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   rN   r	   )rT   r@   r   r   r   Útest_issue_8051§   s    @zTest_Qhull.test_issue_8051N)Ú__name__Ú
__module__Ú__qualname__rV   rW   r   r   r   r   rH   €   s   &rH   c                   @   sb   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
dd„ Zejjdd„ ƒZdS )ÚTestUtilitiesz-
    Check that utility functions work.

    c                 C   s”   t jddddgt jd�}t |¡}t|jdddgddd	ggƒ d
D ]L}| |d d… ¡}t||d d|f d� t ||d d… ¡}t||ƒ qBd S )Nr    r!   r$   r#   ©Zdtyper"   r-   r*   r   ))r+   r+   r"   )ç      è?r]   r   )ç333333Ó?çš™™™™™É?r"   z%r©Úerr_msg)	r   rN   ÚdoublerM   ÚDelaunayr   Ú	simplicesÚfind_simplexZtsearch)rT   r@   ÚtriÚpÚirD   r   r   r   Útest_find_simplex²   s    
zTestUtilities.test_find_simplexc                 C   sî   t jdddddgt jd�}t jddgt jd�}t |¡}| |¡}| |¡}| |¡}t|jƒD ]ˆ\}}||d	  }	||d
  }
||d  }t  	|	| |
| ¡}|t  
t  ||¡¡ }|t  |d ¡ 9 }t  ||| ¡}t|| |ƒ q`d S )Nr    r$   r#   )g]2Ê�½ï?g>mj‡Ø?)g~T›!Òï?g^RÎz¥êÜ?r\   gä†›Býï?gÒÝÄ?r   r"   r*   )r   rN   rb   rM   rc   Zlift_pointsZplane_distanceÚ	enumeraterd   ÚcrossÚsqrtÚdotÚsignr   )rT   r   rg   rf   ÚzZpzÚdistrD   ÚvÚx1Zx2Zx3ÚnÚdr   r   r   Útest_plane_distanceÇ   s&    ÿÿ



z!TestUtilities.test_plane_distancec                 C   sJ   t jddddgt jd�}t |¡}t|jddgddgdd	gdd	ggƒ d S )
Nr    r!   r$   r#   r\   r-   r*   r"   r   )r   rN   rb   rM   rc   r   Úconvex_hull©rT   r@   rf   r   r   r   Útest_convex_hullâ   s    
zTestUtilities.test_convex_hullc              
   C   sL   t  ddddddddg¡}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"   rJ   ç›+¡†›„=zVolume of cube is incorrect©Úrtolra   ç      @zArea of cube is incorrect©r   rN   rM   Ú
ConvexHullr   ÚvolumeÚarea©rT   r@   Úhullr   r   r   Útest_volume_areaï   s       ÿ

ÿ
ÿzTestUtilities.test_volume_areac                 C   sP   t  ddddddddd	d
g
¡}t |¡}t|jdddd� t|jdddd� d S )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 ]ª}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	� qjdS )
zwTest that incremental mode gives the same volume/area as
        non-incremental mode and incremental mode with restarté   r-   Nr"   T©Úincremental©ZrestartrŒ   ©rƒ   )	r   ÚrandomrM   r†   r9   Ú
add_pointsr   r‡   rˆ   )rT   Z	nr_pointsÚdimr@   Zinc_hullZinc_restart_hullrh   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��4 t 
|
¡jdd�t|
| ƒ| dk jdd�B }W 5 Q R X t| ¡ d	|t | ¡f ƒ |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 | ¡f ƒ | |¡}|dkt 
|jd
d
…ddf ¡B }t| ¡ d	|t | ¡f ƒ |�ræ||kjdd�}||d| kjdd�O }|dk|B }t| ¡ d	|t | ¡f ƒ d
S )z@Check that a triangulation has reasonable barycentric transformsr"   rJ   ©Z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   Zeinsum)Útrr   ÚrZTinvr   r   r   Úbarycentric_transform*  s    zJTestUtilities._check_barycentric_transforms.<locals>.barycentric_transformÚignore)Úinvalidgš™™™™™¹?z%s %sNr(   c              	      s*   g | ]"}t j ˆ |d d …d d …f ¡‘qS r
   )r   ÚlinalgZdet)Ú.0Úk©Úqr   r   Ú
<listcomp>9  s   ÿz?TestUtilities._check_barycentric_transforms.<locals>.<listcomp>r   )r@   rd   rA   Úsumr   ÚfinfoÚfloatÚepsÚ	transformZerrstateÚisnanÚallÚabsr   ÚnonzerorN   r9   ZnsimplexÚisfiniterl   re   Úany)rT   rf   ra   Ú	unit_cubeÚunit_cube_tolÚverticesÚscZ	centroidsr›   r§   ÚcÚokr‡   rD   Zat_boundaryr   r¡   r   Ú_check_barycentric_transforms  s.    82ÿ(
"z+TestUtilities._check_barycentric_transformsc                 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__rQ   rM   rc   r©   r¨   r¤   r   rµ   )rT   r¶   r@   rf   Z	bad_countr   r   r   Ú&test_degenerate_barycentric_transformsL  s    ÿ
z4TestUtilities.test_degenerate_barycentric_transformsc           	   
   C   s4  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   é   r/   r-   )r*   r-   r.   r/   r*   r0   r   r"   zndim=%dT)ra   r¯   r   r_   r&   )ra   r¯   r°   )r   r¥   r¦   r§   r9   ZlinspaceÚc_r   r   ÚravelZbroadcast_arraysZix_ÚTrM   rc   rµ   r“   ÚseedÚrandr8   Úr_)	rT   r§   ZnpointsrA   r   Úgridra   rf   Úmr   r   r   Ú test_more_barycentric_transforms]  s.    *
ÿ:
þþz.TestUtilities.test_more_barycentric_transformsN)r—   Fr   )rX   rY   rZ   Ú__doc__ri   ru   rx   r‹   r�   r–   rµ   r¾   ÚpytestÚmarkZslowrÉ   r   r   r   r   r[   ¬   s      þ
-r[   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestVertexNeighborVerticesc                    s”   dd„ t |jjd ƒD ƒ}|jD ].}|D ]$}|D ]}||kr0||  |¡ q0q(q |j\‰‰ ‡ ‡fdd„t |jjd ƒD ƒ}t||d||f d� d S )Nc                 S   s   g | ]
}t ƒ ‘qS r   )Úset©rŸ   rD   r   r   r   r£   „  s     z5TestVertexNeighborVertices._check.<locals>.<listcomp>r   c              
      s.   g | ]&}t ttˆ ˆ| ˆ|d   … ƒƒ‘qS ©r"   )rÎ   r   ÚintrÏ   ©ÚindicesZindptrr   r   r£   �  s   ÿz%r != %rr`   )r9   r@   r8   rd   ÚaddZvertex_neighbor_verticesr   )rT   rf   ÚexpectedÚsr   r   Úgotr   rÒ   r   Ú_checkƒ  s    

ÿz!TestVertexNeighborVertices._checkc                 C   s.   t jdddgt jd�}t |¡}|  |¡ d S )Nr    r!   r#   r\   ©r   rN   rb   rM   rc   rØ   rw   r   r   r   Útest_triangle’  s    
z(TestVertexNeighborVertices.test_trianglec                 C   s0   t jddddgt jd�}t |¡}|  |¡ d S )Nr    r!   r$   r#   r\   rÙ   rw   r   r   r   Útest_rectangle—  s    
z)TestVertexNeighborVertices.test_rectanglec                 C   s4   t jddddddgt jd�}t |¡}|  |¡ d S )Nr    r!   r$   r#   r%   )gÍÌÌÌÌÌì?r&   r\   rÙ   rw   r   r   r   Útest_complicatedœ  s     ÿÿ
z+TestVertexNeighborVertices.test_complicatedN)rX   rY   rZ   rØ   rÚ   rÛ   rÜ   r   r   r   r   rÍ   ‚  s   rÍ   c                   @   sz   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d„ ZdS )ÚTestDelaunayz*
    Check that triangulation works.

    c                 C   s   t j d¡}tttj|ƒ d S ©Nr"   )r   ÚmaÚ
masked_allrR   Ú
ValueErrorrM   rc   ©rT   Zmasked_arrayr   r   r   Útest_masked_array_fails¨  s    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"   r\   )r   rN   Únanrb   rR   rá   rM   rc   ©rT   Zpoints_with_nanr   r   r   Útest_array_with_nans_fails¬  s    z'TestDelaunay.test_array_with_nans_failsc                 C   s´   t ddƒD ]¤}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*   r2   r"   rJ   r(   r\   )r9   r   ÚzerosrM   rc   rd   r   r   ÚarangerÑ   Ú	neighbors)rT   Úndr@   rD   rf   r   r   r   Útest_nd_simplex°  s    

&zTestDelaunay.test_nd_simplexc                 C   s^   t jddddgt jd�}t |¡}t|jdddgddd	ggƒ t|jd
d
dgd
d
d	ggƒ d S )Nr    r!   r$   r#   r\   r"   r-   r*   r   r(   )r   rN   rb   rM   rc   r   rd   ré   rw   r   r   r   Útest_2d_square¿  s    
zTestDelaunay.test_2d_squarec                 C   sx   t jddddgt jd�}t jddddgt jd�}t j||f }t j||f }t t j||f ¡ t t j||f ¡ d S )Nr   r"   r\   )r   rN   Úfloat64rÆ   rM   rc   rÁ   )rT   r   rU   ZxpZ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 )Nr4   r5   )r7   rM   rc   r   r@   rd   ÚmaxÚminrw   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Æ   rM   rc   r   r   rd   rÂ   rè   r:   rw   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Æ   rM   rc   r   r:   r   rd   rÂ   Zcoplanarrª   Zvertex_to_simplexrw   r   r   r   Útest_coplanaré  s    
$,zTestDelaunay.test_coplanarc                 C   s:   dddddg}t j|dd�}t dd	g¡}t|j|ƒ d S )
Nr    r!   r#   r%   ©çš™™™™™ñ?r÷   T©Úfurthest_site)r"   r.   r   )r.   r*   r   )rM   rc   r   rN   r   rd   )rT   r@   rf   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r”|jtj|dd … dd�dd� | d¡rät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‘   ZpathologicalrL   )r<   r   ÚconcatenaterM   rc   r”   r:   Ú
startswithr   r   rd   rÂ   rè   r8   r   r   )	rT   r>   rC   rB   r@   ÚobjÚchunkÚobj2Úobj3r   r   r   Útest_incrementalþ  s8    ÿ
ÿÿ
ÿÿ
ÿ
ÿzTestDelaunay.test_incrementalc              	   C   s8   t  dddg¡}d}tjt|d�� |j W 5 Q R X d S )Nr    r!   r#   ziDelaunay attribute 'vertices' is deprecated in favour of 'simplices' and will be removed in Scipy 1.11.0.)Úmatch)rM   rc   rË   ZwarnsÚDeprecationWarningr±   )rT   rf   Úmsgr   r   r   Útest_vertices_deprecation"  s    z&TestDelaunay.test_vertices_deprecationN)rX   rY   rZ   rÊ   rã   ræ   rë   rì   rî   rñ   rô   rõ   rú   rË   rÌ   Úparametrizer   r<   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 �]4\}}|D �]\}}| | | |  }|tj 	|¡ }t 
|d  |d g¡}	t |	| | | |  ¡}
t |	| | | |  ¡}t t |
|	¡d¡sàqXt t ||	¡d¡söqXt || | | |  ¡}
t || | | |  ¡}t || | | |  ¡}|
| k sX|
|| k�rXqX|| k sX||| k�rrqX qJqXtdƒ‚qJd S t||ƒ d S )Nr"   r*   iè  r   zcomparison fails)rÎ   r   r   r8   r   r¥   r¦   r§   rž   ZnormrN   rm   Úallcloser=   r   )r@   Zfacets_1Zfacets_2r§   r   r   ZapÚbpÚtrs   Úc1Úc2Úc3r   r   r   Úassert_hulls_equal*  s4    
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dddddged�fe ddgg¡ejdddddged�fe ddgg¡ejdddddged�fe ddgddgg¡ejdddddged�fe ddgg¡ejdddddg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   s   t j d¡}tttj|ƒ d S rÞ   )r   rß   rà   rR   rá   rM   r†   râ   r   r   r   rã   b  s    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*   r\   )r   rN   rä   rb   rR   rá   rM   r†   rå   r   r   r   ræ   f  s    z)TestConvexHull.test_array_with_nans_failsr>   c                 C   sn   t | }t |¡}t |¡}t||j|jƒ |jd dkrVtt	 
|j¡t	 |j¡ƒ ntt	 
|j¡|jƒ d S )Nr"   r*   )r7   rM   rc   r†   r  rv   rd   r8   r   r   r   r   r±   )rT   r>   r@   rf   rŠ   r   r   r   Útest_hull_consistency_trij  s    

z(TestConvexHull.test_hull_consistency_tric           	      C   s´   t | \}}tj|dd�}tj|d dd�}|dd … D ]}| |¡ q8t |¡}tj|d dd�}t|ƒdkr�|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ü   rM   r†   r”   r:   r  rd   )	rT   r>   rC   Ú_r@   rþ   rÿ   r   r  r   r   r   r  {  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Å   rM   r†   r   r   rd   r   r±   r@   rÃ   Zarctan2Úmeanr   rª   ÚdiffÚunwrap)rT   r@   rŠ   r   rU   Zangler   r   r   Útest_vertices_2d�  s    
zTestConvexHull.test_vertices_2dc              
   C   sH   t  ddddddddg¡}t |¡}t|jd	d
d� t|jdd
d� d S )Nry   rz   r{   r|   r}   r~   r   r€   rJ   r�   r’   r„   r…   rw   r   r   r   r‹   �  s       ÿ
zTestConvexHull.test_volume_arear�   FTc                 C   sb   t  ddgddgddgddgddgg¡}tj||dd�}t jddddgtd	�}|j}t||ƒ d S )
Nr_   çš™™™™™Ù?r^   ç333333ã?ÚQG4©r@   r�   ró   FTr\   ©r   rN   rM   r†   ÚboolÚgoodr   ©rT   r�   r@   rŠ   rÕ   Úactualr   r   r   Útest_good2d¦  s    
üþzTestConvexHull.test_good2dÚ
visibilityr  zQG-4znew_gen, expectedr^   gffffffæ?r\   gffffffæ¿g=
×£p=Ú?r&   r  g433333ã?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|krZt  |¡}t||ƒ d S )Nr_   r  r^   r  Tr  ú-)r   rN   rM   r†   r”   r  Úinvertr   )rT   Znew_genrÕ   r   r@   rŠ   r  r   r   r   Útest_good2d_incremental_changesµ  s    '
üþ

z.TestConvexHull.test_good2d_incremental_changesc                 C   sr   t  ddgddgddgddgddgg¡}tj||d�}|j}|d ksHt‚|rn| t  d¡¡ |j}|d ksnt‚d S )Nr_   r  r^   r  )r@   r�   ©r"   r*   )r   rN   rM   r†   r  r=   r”   rç   )rT   r�   r@   rŠ   r  r   r   r   Útest_good2d_no_optionê  s    
üÿz$TestConvexHull.test_good2d_no_optionc                 C   sb   t  ddgddgddgddgddgg¡}tj||dd�}t jddddgtd�}|j}t||ƒ d S )Nr_   r  r^   r  r  Fr\   r  r  r   r   r   Útest_good2d_insideý  s    
üþz!TestConvexHull.test_good2d_insidec              	   C   sh   t  dddgdddgdddgdd	d
gdddgg¡}tj||dd�}t jddddgtd�}t|j|ƒ d S )Nr'   gŠNžË7Ïì?g+ï²xÙ¿g¸gÈ>é@È?gFE÷%'ß?gW¯¦Û§=ç¿g¤úÎ/Jß?g›˜ä6Ðrâ?gtÄ­Ä4úé¿g¤¾��Å·¿g¶w6y¶å?g’«QÂæ¿gÿ€b¿‚�Ç?ZQG0r  TFr\   )r   rN   rM   r†   r  r   r  )rT   r�   r@   rŠ   rÕ   r   r   r   Útest_good3d  s    üþzTestConvexHull.test_good3dN)rX   rY   rZ   rã   ræ   rË   rÌ   r  r   r7   r  r<   r  r  r‹   r  r   rN   r  r#  r%  r&  r'  r   r   r   r   r  a  sL   

	
þÿÿÿÿÿä

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
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sDt‚|jt|j	ƒ| ks\t‚t|j	ƒ|| ksrt‚|j
jd |ks†t‚|r¾dd„ |j	D ƒ}	|	 d¡dks¬t‚|	 d¡|ks¾t‚d S )Nin  rò   r"   r   c                 S   s   g | ]}t |ƒ‘qS r   ©r:   ©rŸ   r   r   r   r   r£   ;  s     z;TestVoronoi.test_point_region_structure.<locals>.<listcomp>)r   r“   Zdefault_rngr	   Úpoint_regionrï   r=   Úsizer:   Úregionsr@   r8   ÚcountÚindex)
rT   Z
qhull_optsr)  Z	extra_ptsrA   Úrngr@   ÚvorZ	pt_regionZsublensr   r   r   Útest_point_region_structure  s    z'TestVoronoi.test_point_region_structurec                 C   s   t j d¡}tttj|ƒ d S rÞ   )r   rß   rà   rR   rá   rM   r	   râ   r   r   r   rã   A  s    z#TestVoronoi.test_masked_array_failsc              	   C   s*   ddddddddd	g	}d
}|   ||¡ d S )Nr    r!   )r   r*   r#   r$   r$  )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©rT   r@   Úoutputr   r   r   Útest_simpleE  s        þ zTestVoronoi.test_simplec                 K   sZ  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|Ž}
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£   r  s     z1TestVoronoi._compare_qvoronoi.<locals>.<listcomp>r"   r   r-   r*   c                 S   s"   g | ]}d d„ |dd… D ƒ‘qS )c                 S   s   g | ]}t |ƒd  ‘qS rÐ   ©rÑ   ©rŸ   rU   r   r   r   r£   v  s     ú<TestVoronoi._compare_qvoronoi.<locals>.<listcomp>.<listcomp>r"   Nr   r-  r   r   r   r£   v  s   ÿc                 S   s"   g | ]}d d„ |dd… D ƒ‘qS )c                 S   s   g | ]}t |ƒ‘qS r   r<  r=  r   r   r   r£   x  s     r>  r"   r-   r   r-  r   r   r   r£   x  s   ÿNc                 S   s"   g | ]}d d„ |dd… D ƒ‘qS )c                 S   s   g | ]}t |ƒd  ‘qS rÐ   r<  r=  r   r   r   r£   z  s     r>  r-   Nr   r-  r   r   r   r£   z  s   ÿc                 S   s   t t| ƒƒS r
   r   r   r   r   r   Ú	sorttuple€  s    z0TestVoronoi._compare_qvoronoi.<locals>.sorttuple)ÚstripÚ
splitlinesrÑ   r   r   r   rM   r	   r   r±   r   rÎ   r0  ÚzipÚridge_pointsr   Úridge_verticesr   )rT   r@   r9  ÚkwZnvertexr±   Znregionr0  rC  rD  r4  r?  Úp1Úp2r   r   r   r7  n  s4    ÿÿÿÿ"ÿzTestVoronoi._compare_qvoronoir>   c                 C   s¶   t | }t|ƒ}t |¡}|j ¡ D ]Œ\}}t t |¡dk¡sBq$|j	| j
dd�}d||d  |  }|j|| dd�\}	}
t|
|d ƒ |j|| dd�\}	}
t|
|d ƒ q$d S )Nr   r˜   g�íµ ÷Æ°>r"   )r    )r7   ÚKDTreerM   r	   Z
ridge_dictÚitemsr   rª   Úasarrayr±   r  Úqueryr   )rT   r>   r@   Útreer4  rg   rq   Zridge_midpointrt   rp   r    r   r   r   Útest_ridges�  s    
zTestVoronoi.test_ridgesc                 C   s&   dddddg}d}| j ||dd� d S )	Nr    r!   r#   r%   rö   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ø   r6  r8  r   r   r   rú   ¨  s    zTestVoronoi.test_furthest_sitec                 C   s>   dddddg}t |ƒ}t|jdƒ t |dd�}t|jdƒ d S )	Nr    r!   r#   r%   rö   FTrø   )r	   r   rù   )rT   r@   r4  r   r   r   Útest_furthest_site_flagÀ  s
    z#TestVoronoi.test_furthest_site_flagc                    s„  t | d d jd dkrd S t | \}}tj|dd�}tj|d d|d�}|dd … D ]}| |¡ qXt |¡}tj|d d|d�}t|ƒdkr²|jtj|dd … dd�dd� tt|j	ƒt|j	ƒƒ tt|j	ƒt|j	ƒƒ ||fD ]˜‰ ddi‰t
ˆ jƒD ]4\}	}
t
|jƒD ] \}}t |
|¡�r|ˆ|	< �qqü‡ ‡‡fd	d
„‰dd„ }t|ˆˆ jƒƒ||jƒƒ t|ˆˆ jƒƒ||jƒƒ qæd S )Nr   r"   r-   r˜   Trû   r‘   r(   c              
      sl   t | dƒr$tt‡fdd„| D ƒƒƒS z
ˆ|  W S  tk
rf } ztdˆ j|  f ƒ|‚W 5 d }~X Y nX d S )NÚ__len__c                    s   g | ]}ˆ |ƒ‘qS r   r   r=  )Úremapr   r   r£   ï  s     z?TestVoronoi.test_incremental.<locals>.remap.<locals>.<listcomp>z,incremental result has spurious vertex at %r)Úhasattrr   rÎ   ÚKeyErrorr=   r±   )r   Úe©ZobjxrP  Z
vertex_mapr   r   rP  í  s    


ÿÿz+TestVoronoi.test_incremental.<locals>.remapc                 S   s:   t tt| ƒƒ}d|k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   rI  r   r   r   Ú
simplifiedö  s    
z0TestVoronoi.test_incremental.<locals>.simplified)r<   r8   r   rü   rM   r	   r”   r:   r   r.  rj   r±   r  r0  rD  )rT   r>   rC   rB   r@   rþ   rÿ   r   r  rh   rq   rD   Zv2rV  r   rT  r   r  È  sF    ÿ
ÿÿ	þþzTestVoronoi.test_incrementalN)rX   rY   rZ   rË   rÌ   r  r5  rã   r:  r7  r   r7   rM  rú   rN  r<   r  r   r   r   r   r(    s    ü)!
r(  c                   @   sR   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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   r\   r"   r˜   rÐ   TN)	r   r8   r   rç   r  r¬   r«   rª   r   )rT   Zarr1Zarr2rƒ   ZtruthsÚl1Zindexesr   r   r   Úassert_unordered_allclose  s    "z4Test_HalfspaceIntersection.assert_unordered_allcloseÚdtc                 C   s~   t jdddgdddgdddgdddg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 )Nr(   r   r"   éþÿÿÿr\   r'   rK   )r   rN   rM   ÚHalfspaceIntersectionr   Úintersections)rT   rZ  Ú
halfspacesÚfeasible_pointr@   rŠ   r   r   r   Ú test_cube_halfspace_intersection  s    ýý"z;Test_HalfspaceIntersection.test_cube_halfspace_intersectionc           
      C   sD  t j t j t¡dd¡}t |¡}t |d d …dd …f |d d …d d…f f¡ }t ddddg¡}t	 
||¡}t|jjdƒ t|jdƒ tt|jƒdƒ |jD ]}tt|ƒdƒ q |d d …d	f |d d …d d	…f  |¡ }|  |d d …d d	…f j| j|j¡ t ddd
dg¡}|D ]$}	tt |j|	kjdd�¡dƒ �qd S )Nr¶   zselfdual-4d-polytope.txtr"   r'   )é   r.   g      @@ra  r0   r(   r&   ç      à¿r˜   )r¹   rº   r»   r¼   r½   r   Z
genfromtxtÚhstackrN   rM   r\  r   r]  r8   r   Zdual_volumer:   Údual_facetsrm   rY  rÃ   Údual_pointsÚ	itertoolsÚpermutationsr¤   rª   )
rT   ÚfnameZineqsr^  Ú
feas_pointÚhsZfacetÚdistsr@   Úpointr   r   r   Ú$test_self_dual_polytope_intersection$  s"    ÿ
0
*&z?Test_HalfspaceIntersection.test_self_dual_polytope_intersectionc                 C   s°   t  dddgdddgdddgdddgg¡}t  dddg¡}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'   rJ   r&   rb  )r   rN   rR   rá   rM   r\  Z
QhullError)rT   r^  r_  r   r   r   Útest_wrong_feasible_point;  s    ýz4Test_HalfspaceIntersection.test_wrong_feasible_pointc                 C   s†  t  ddddgddddgddddgddddgddddgddddgg¡}t  dddgdddgdddgdddgg¡}t  dggd ¡}t  t  || f¡|f¡}t  dddg¡}tj||dd�}tj||dd�}t|ƒD ]¤\}}	| |	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¡ qÔ| ¡  d S )
Nr'   rn  rb  rJ   r"   r2   Tr�   r‘   )r   rN   rc  ZvstackrM   r\  rj   Zadd_halfspacesZnewaxisr   r^  r]  rY  rQ   )rT   r^  Zextra_normalsÚoffsetsZextra_halfspacesri  Zinc_hsZ
inc_res_hsrh   ZehsÚtotalrj  r   r   r   r  N  s:    




ûýÿ"z+Test_HalfspaceIntersection.test_incrementalc                 C   s4  t  ddddgddddgddddgddddgddddgddddgg¡}t  dddg¡}t ||¡}t  dddgdddgdddgdddgdddgdddgg¡}dddgddd	gd
ddgdd
d	gddd	gdddgd
dd	gdd
dgg}t|ƒt|jƒksöt‚t||jƒD ] \}}t|ƒt|ƒk�st‚�qt	|j
|ƒ d S )Nrn  r'   rJ   r&   r[  r   r*   r.   r"   r/   r-   )r   rN   rM   r\  r:   rd  r=   rB  rÎ   r   re  )rT   r^  rl  rj  Zqhalf_pointsZqhalf_facetsr   r   r   r   r   Ú	test_cubex  s<    




ûúø
z$Test_HalfspaceIntersection.test_cubeN)rŒ   )rX   rY   rZ   rY  rË   rÌ   r  r   rí   rÑ   r`  rm  ro  r  rr  r   r   r   r   rW  
  s   

*rW  )4r¹   rO   Únumpyr   Znumpy.testingr   r   r   r   r   rË   r   rR   Zscipy.spatial._qhullZspatialZ_qhullrM   Zscipy.spatialr   rH  r	   rf  r   r   r   r   r“   rÄ   r@   rN   Zpathological_data_1r¥   Zfloat_r§   Zpathological_data_2rÅ   Zbug_2850_chunksZbug_2850_chunks_2rJ  r7   r<   rF   r>   r?   rH   r[   rÍ   rÝ   r  r  r(  rW  r   r   r   r   Ú<module>   s$                                                               ì      ý ÿ$ÿÿöþ, W! 7 = n