a
    ˆù»jˆ±  ã                T   @   st  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 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(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„ ƒZ6dS )9é    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   úDE:\soccer\ml_env\Lib\site-packages\scipy/spatial/tests/test_qhull.pyÚsorted_tuple   s    r   c                 C   sb   t | tjƒr|  ¡ } t |tjƒr(| ¡ }tt|| ƒƒ} |  ¡  tt||ƒƒ}| ¡  t| |ƒ d S r
   )Ú
isinstanceÚnpZ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vsŠJ ‚||ft|< dS )	z<
    Generate incremental datasets from basic data sets
    r    Nr(   r1   zQJ Ppr2   é   z%s-chunk-%d)ÚDATASETSÚshapeÚrangeÚlenÚappendÚINCREMENTAL_DATASETS)	ÚnameÚ	chunksizeÚpointsÚndimÚoptsZnminÚchunksÚjÚnew_namer   r   r   Ú_add_inc_data]   s    
rC   )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   rK   r	   )rQ   r=   r   r   r   Útest_issue_8051£   s    8ÿzTest_Qhull.test_issue_8051N)Ú__name__Ú
__module__Ú__qualname__rS   rT   r   r   r   r   rE   |   s   &rE   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g d¢t jd�}t |¡}t|jg d¢g d¢gƒ dD ]H}| |d d… ¡}t||d |›d� t ||d d… ¡}t||ƒ q:d S )N©r   r   r"   r!   ©Zdtype©r    r+   r(   ©r+   r    r   ))r)   r)   r    )ç      è?r]   r   )ç333333Ó?çš™™™™™É?r    r(   ©Úerr_msg)	r   rK   Úfloat64rJ   ÚDelaunayr   Ú	simplicesÚfind_simplexZtsearch)rQ   r=   ÚtriÚpÚirA   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  }t  	|	| |
| ¡}|t  
t  ||¡¡ }|t  |d ¡ 9 }t  ||| ¡}t|| |ƒ qZd S )N)r   r"   r!   )g]2Ê�½ï?g>mj‡Ø?)g~T›!Òï?g^RÎz¥êÜ?rZ   gä†›Býï?gÒÝÄ?r   r    r(   )r   rK   rb   rJ   rc   Zlift_pointsZplane_distanceÚ	enumeraterd   ÚcrossÚsqrtÚdotÚsignr   )rQ   r   rg   rf   ÚzZpzÚdistrA   ÚvÚx1Zx2Z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 )NrY   rZ   r+   r(   r    r   )r   rK   rb   rJ   rc   r   Úconvex_hull©rQ   r=   rf   r   r   r   Útest_convex_hullà   s    
zTestUtilities.test_convex_hullc                 C   s@   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    rG   ç›+¡†›„=zVolume of cube is incorrect©Úrtolra   ç      @zArea of cube is incorrect©r   rK   rJ   Ú
ConvexHullr   ÚvolumeÚarea©rQ   r=   Úhullr   r   r   Útest_volume_areaí   s    

ÿ
ÿzTestUtilities.test_volume_areac                 C   s@   t  g d¢¡}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   ÚrandomrJ   r   r7   Ú
add_pointsr   r€   r�   )rQ   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��> t 
|
¡jdd�t|
| ƒ| dk jdd�B }W d	  ƒ n1 sš0    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 )z@Check that a triangulation has reasonable barycentric transformsr    rG   ©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š™™™™™¹?Nú r&   c              	      s*   g | ]"}t j ˆ |d d …d d …f ¡‘qS r
   )r   ÚlinalgZdet)Ú.0Úk©Úqr   r   Ú
<listcomp>7  s   ÿz?TestUtilities._check_barycentric_transforms.<locals>.<listcomp>r   )r=   rd   r>   Úsumr   ÚfinfoÚfloatÚepsÚ	transformZerrstateÚisnanÚallÚabsr   ÚnonzerorK   r7   ZnsimplexÚisfiniterl   re   Úany)rQ   rf   ra   Ú	unit_cubeÚunit_cube_tolÚverticesÚscZ	centroidsr”   r¡   ÚcÚokr€   rA   Zat_boundaryr   r›   r   Ú_check_barycentric_transforms  s.    L 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__rN   rJ   rc   r£   r¢   rž   r   r¯   )rQ   r°   r=   rf   Z	bad_countr   r   r   Ú&test_degenerate_barycentric_transformsJ  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(   r.   r   r    zndim=%dT)ra   r©   r   r_   r$   )ra   r©   rª   )r   rŸ   r    r¡   r7   ZlinspaceÚc_r   r   ÚravelZbroadcast_arraysZix_ÚTrJ   rc   r¯   rŒ   ÚseedÚrandr6   Úr_)	rQ   r¡   Znpointsr>   r   Úgridra   rf   Úmr   r   r   Ú test_more_barycentric_transforms[  s2     ÿ
ÿ:
þþz.TestUtilities.test_more_barycentric_transformsN)r�   Fr   )rU   rV   rW   Ú__doc__ri   ru   rx   r„   r†   r�   r¯   r¸   ÚpytestÚmarkZslowrÃ   r   r   r   r   rX   ª   s      þ
-rX   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|›�d� d S )Nc                 S   s   g | ]
}t ƒ ‘qS r   )Úset©r™   rA   r   r   r   r�   „  ó    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`   )r7   r=   r6   rd   ÚaddZvertex_neighbor_verticesr   )rQ   rf   ÚexpectedÚsr   r   Úgotr   rÍ   r   Ú_checkƒ  s    

ÿz!TestVertexNeighborVertices._checkc                 C   s,   t jg d¢t jd�}t |¡}|  |¡ d S )N)r   r   r!   rZ   ©r   rK   rb   rJ   rc   rÓ   rw   r   r   r   Útest_triangle’  s    
z(TestVertexNeighborVertices.test_trianglec                 C   s,   t jg d¢t jd�}t |¡}|  |¡ d S )NrY   rZ   rÔ   rw   r   r   r   Útest_rectangle—  s    
z)TestVertexNeighborVertices.test_rectanglec                 C   s,   t jg d¢t jd�}t |¡}|  |¡ d S )N)r   r   r"   r!   r#   )gÍÌÌÌÌÌì?r$   rZ   rÔ   rw   r   r   r   Útest_complicatedœ  s
    
ÿ
z+TestVertexNeighborVertices.test_complicatedN)rU   rV   rW   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   s   t j d¡}tttj|ƒ d S ©Nr    )r   ÚmaÚ
masked_allrO   Ú
ValueErrorrJ   rc   ©rQ   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    rZ   )r   rK   Únanrb   rO   rÜ   rJ   rc   ©rQ   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(   r0   r    rG   r&   rZ   )r7   r   ÚzerosrJ   rc   rd   r   r   ÚarangerÌ   Ú	neighbors)rQ   Úndr=   rA   rf   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 )NrY   rZ   r[   r\   )r&   r&   r    )r&   r&   r   )r   rK   rb   rJ   rc   r   rd   rä   rw   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    rZ   )r   r   r    r    )r   rK   rb   rÀ   rJ   rc   r»   )rQ   r   rR   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 )Nr2   r3   )r5   rJ   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À   rJ   rc   r   Úuniquerd   r¼   rã   r8   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À   rJ   rc   r   r8   rî   rd   r¼   Zcoplanarr¤   Zvertex_to_simplexrw   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   )rJ   rc   r   rK   r   rd   )rQ   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pathologicalrI   )r:   r   ÚconcatenaterJ   rc   r�   r8   Ú
startswithr   rî   rd   r¼   rã   r6   r   r   )	rQ   r;   r@   r?   r=   ÚobjÚchunkÚobj2Úobj3r   r   r   Útest_incrementalþ  s8    ÿ
ÿÿ
ÿÿ
ÿ
ÿzTestDelaunay.test_incrementalN)rU   rV   rW   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 �]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   r6   r   rŸ   r    r¡   r˜   ZnormrK   rm   ÚallcloseÚAssertionErrorr   )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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   s   t j d¡}tttj|ƒ d S rÙ   )r   rÚ   rÛ   rO   rÜ   rJ   r   rÝ   r   r   r   rÞ   [  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(   rZ   )r   rK   rß   rb   rO   rÜ   rJ   r   rà   r   r   r   rá   _  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(   )r5   rJ   rc   r   r  rv   rd   r6   r   r   rî   r   r«   )rQ   r;   r=   rf   rƒ   r   r   r   Útest_hull_consistency_tric  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÷   rJ   r   r�   r8   r  rd   )	rQ   r;   r@   Ú_r=   rù   rú   rû   rü   r   r   r   rý   t  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¿   rJ   r   r   rî   rd   r   r«   r=   r½   Zarctan2Úmeanr   r¤   ÚdiffÚunwrap)rQ   r=   rƒ   r   rR   Z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 )Nry   rG   rz   r‹   r}   r~   rw   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 )	Nr_   çš™™™™™Ù?r^   ç333333ã?ÚQG4©r=   r‰   rí   )FTFFrZ   ©r   rK   rJ   r   ÚboolÚgoodr   ©rQ   r‰   r=   rƒ   rÐ   Úactualr   r   r   Útest_good2dŸ  s    
üþzTestConvexHull.test_good2dÚ
visibilityr  zQG-4znew_gen, expectedr^   gffffffæ?)FFFFFrZ   gffffffæ¿)FTFFFg=
×£p=Ú?)FFFTTr$   r  )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 rZt  |¡}t||ƒ d S )Nr_   r  r^   r  Tr  ú-)r   rK   rJ   r   r�   r  Úinvertr   )rQ   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 u sHJ ‚|rn| t  d¡¡ |j}|d u snJ ‚d S )Nr_   r  r^   r  )r=   r‰   ©r    r(   )r   rK   rJ   r   r  r�   râ   )rQ   r‰   r=   rƒ   r  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 )Nr_   r  r^   r  r  )FFFFrZ   r  r  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¿‚�Ç?ZQG0r  )TFFFrZ   )r   rK   rJ   r   r  r   r  )rQ   r‰   r=   rƒ   rÐ   r   r   r   Útest_good3d  s    
üþzTestConvexHull.test_good3dN)rU   rV   rW   rÞ   rá   rÅ   rÆ   rþ   r   r5   r  r:   rý   r  r„   r  r   rK   r  r  r  r  r   r   r   r   r   r  Z  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   r>   r(   r+   c           
      C   sÂ   t j d¡}| ||f¡}t||d�}|j}| ¡ |d | ksDJ ‚|jt|jƒ| ks\J ‚t|jƒ|| ksrJ ‚|j	j
d |ks†J ‚|r¾dd„ |jD ƒ}	|	 d¡dks¬J ‚|	 d¡|vs¾J ‚d S )Nin  rì   r    r   c                 S   s   g | ]}t |ƒ‘qS r   ©r8   ©r™   r   r   r   r   r�   4  rÊ   z;TestVoronoi.test_point_region_structure.<locals>.<listcomp>)r   rŒ   Údefault_rngr	   Úpoint_regionré   Úsizer8   Úregionsr=   r6   ÚcountÚindex)
rQ   Z
qhull_optsr"  Z	extra_ptsr>   Ú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Û   rO   rÜ   rJ   r	   rÝ   r   r   r   rÞ   :  s    z#TestVoronoi.test_masked_array_failsc                 C   s   g d¢}d}|   ||¡ d S )N)	r   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©rQ   r=   Úoutputr   r   r   Útest_simple>  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�   k  rÊ   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™   rR   r   r   r   r�   o  rÊ   ú<TestVoronoi._compare_qvoronoi.<locals>.<listcomp>.<listcomp>r    Nr   r&  r   r   r   r�   o  s   ÿc                 S   s"   g | ]}d d„ |dd… D ƒ‘qS )c                 S   s   g | ]}t |ƒ‘qS r   r6  r7  r   r   r   r�   q  rÊ   r8  r    r+   r   r&  r   r   r   r�   q  s   ÿNc                 S   s"   g | ]}d d„ |dd… D ƒ‘qS )c                 S   s   g | ]}t |ƒd  ‘qS rË   r6  r7  r   r   r   r�   s  rÊ   r8  r+   Nr   r&  r   r   r   r�   s  s   ÿc                 S   s   t t| ƒƒS r
   r   r   r   r   r   Ú	sorttupley  s    z0TestVoronoi._compare_qvoronoi.<locals>.sorttuple)ÚstripÚ
splitlinesrÌ   r   r   r   rJ   r	   r   r«   r   rÈ   r*  ÚzipÚridge_pointsr   Úridge_verticesr   )rQ   r=   r3  ÚkwZnvertexr«   Znregionr*  r=  r>  r.  r9  Úp1Zp2r   r   r   r1  g  s8    ÿÿÿÿÿÿ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š   )r5   ÚKDTreerJ   r	   Z
ridge_dictÚitemsr   r¤   Úasarrayr«   r
  Úqueryr   )rQ   r;   r=   Útreer.  rg   rq   Zridge_midpointrt   rp   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ó   r0  r2  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ô   )rQ   r=   r.  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              
      sn   t | dƒr t‡fdd„| D ƒƒS z
ˆ|  W S  tyh } z&dˆ j|  ›�}t|ƒ|‚W Y d }~n
d }~0 0 d S )NÚ__len__c                    s   h | ]}ˆ |ƒ’qS r   r   r7  )Úremapr   r   Ú	<setcomp>é  rÊ   z>TestVoronoi.test_incremental.<locals>.remap.<locals>.<setcomp>z*incremental result has spurious vertex at )Úhasattrr   ÚKeyErrorr«   r   )r   ÚeÚmessage©ZobjxrI  Z
vertex_mapr   r   rI  ç  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�   õ  rÊ   zDTestVoronoi.test_incremental.<locals>.simplified.<locals>.<listcomp>)rÈ   r   r   Úremover   )r   rB  r   r   r   Ú
simplifiedñ  s    
z0TestVoronoi.test_incremental.<locals>.simplified)r:   r6   r   r÷   rJ   r	   r�   r8   r   r(  rj   r«   rÿ   r*  r>  )rQ   r;   r@   r?   r=   rù   rú   rû   rü   rh   rq   rA   Zv2rQ  r   rO  r   rý   Â  sF    ÿ
ÿÿ
þþzTestVoronoi.test_incrementalN)rU   rV   rW   rÅ   rÆ   rþ   r/  rÞ   r4  r1  r   r5   rF  rõ   rG  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   rZ   r    r‘   rË   TN)	r   r6   r   râ   r  r¦   r¥   r¤   r   )rQ   Zarr1Zarr2r|   ZtruthsÚl1Z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    rV  rZ   r    r%   rH   )r   rK   rJ   ÚHalfspaceIntersectionr   Úintersections)rQ   rU  Ú
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ƒ qœ|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\  r.   r&   )r%   r%   r$   ç      à¿r‘   )r³   r´   rµ   r¶   r·   r   Z
genfromtxtÚhstackrK   rJ   rW  r   rX  r6   r   Zdual_volumer8   Údual_facetsrm   rT  r½   Údual_pointsÚ	itertoolsÚpermutationsrž   r¤   )
rQ   ÚfnameZineqsrY  Ú
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  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%   ri  r%   )rG   r%   ri  )r%   rG   ri  ©r$   r$   r$   r$   r]  )r   rK   rO   rÜ   rJ   rW  Z
QhullError)rQ   rY  rZ  r   r   r   Útest_wrong_feasible_point6  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 ]¤\}}	| |	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 )N)r%   r%   ri  r]  )r%   ri  r%   r]  )ri  r%   r%   r]  )rG   r%   r%   r]  )r%   rG   r%   r]  )r%   r%   rG   r]  )rG   rG   rG   )rG   rG   ri  )rG   ri  rG   )r    ri  ri  ri  r0   r  Trˆ   rŠ   r    )r   rK   r^  ZvstackrJ   rW  rj   Zadd_halfspacesZnewaxisr   rY  rX  rT  rN   )rQ   rY  Zextra_normalsÚoffsetsZextra_halfspacesrd  Zinc_hsZ
inc_res_hsrh   ZehsÚtotalre  r   r   r   rý   M  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sÌJ ‚qÌt|j	|ƒ d S )N)ri  r%   r%   r%   )rG   r%   r%   ri  )r%   ri  r%   r%   )r%   rG   r%   ri  )r%   r%   ri  r%   )r%   r%   rG   ri  rj  )rV  r   r   )r(   r   r   )r   rV  r   )r   r(   r   )r   r   rV  )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   rK   rJ   rW  r8   r_  r<  rÈ   r   r`  )rQ   rY  rg  re  Zqhalf_pointsZqhalf_facetsr   r   r   r   r   Ú	test_cubex  s<    
ûúø
z$Test_HalfspaceIntersection.test_cubeN)r…   )rU   rV   rW   rT  rÅ   rÆ   rþ   r   rb   rÌ   r[  rh  rk  rý   rn  r   r   r   r   rR    s   

+rR  Údiagram_typec                 C   sP   t j d¡}| d¡}tjtdd�� | |ƒ W d   ƒ n1 sB0    Y  d S )Né{   )r,   r'   r+   Ú
dimensions)Úmatch)r   rŒ   r'  rÅ   r   rÜ   )ro  r-  Zinvalid_datar   r   r   Útest_gh_20623�  s    
rs  )7r³   rL   Únumpyr   Znumpy.testingr   r   r   r   r   rÅ   r   rO   Zscipy.spatial._qhullZspatialZ_qhullrJ   Zscipy.spatialr   rA  r	   ra  r   r   r   rŒ   r¾   r=   rK   Zpathological_data_1rŸ   rb   r¡   Zpathological_data_2r¿   Zbug_2850_chunksZbug_2850_chunks_2rC  r5   r:   rC   r;   r<   rE   rX   rÇ   rØ   r  r  r!  rR  rÆ   rþ   rc   rs  r   r   r   r   Ú<module>   s¢   ì ý ÿ$ÿÿöþ. Y! 7 = p 