o
    `^h                     @   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
j34d6e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   \/home/air/shanriGPT/back/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	gzGgQgHzG        gHzG?gQ?gz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^Rz?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?)gfNz?gjM?g{D흚j?)ga?8\?g?gw5K?)g,lnq?g6=?gU?)gw컝?g`?ga?)g+q?g\hϱ?gLg?)gGe?gE9;?gd:L?)gȊKB?gBYM?g?)g~EHy?gUdk?gmVq"?)gqp?ge?g\*L?gY/?Hz>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 )NF      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rd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rq)|| k s||| krq) 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(   )gN7?g+xٿgg>@?)gFE%'?gWۧ=g/J?)g6r?gtĭ4gŷ)gw6y?gQgb?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_pts2   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||	< qq~ 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                   @   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   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 qd 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_cubeN)r   )r_   r`   ra   r  r   r   r/  r   rm   r   r  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.   
dimensions)match)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 
