
    tKg                        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c mZ d dlmZ d dlmZ d dlZd ZefdZej2                  j5                  d       g d	Z ej8                  g d
d
gd
dgd
dgd
dgd
dgd
dgd
dgd
dgd
dgdd
gddgddgddgddgddgddgddgddgddgddgddgddgddgdd
gddgddgddgddgddgdd
gddgddgddgddgddgddgdd
gddgddgddgddgddgddgddgddgdd
gddgddgddgddgddgddgddgddgdd
gddgddgddgddgddgddgddgddgdd
gddgddgddgddgddgddgddgddgdd
g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j8                  ddgdd gddgd dgd d gd dgdd ej<                  ej>                        j@                  z
  gdd gddgg	      Z!ej2                  jE                  dd       ej8                  d d gd dgdd gddgg      gZ#e#ej2                  jE                  dd      d ej8                  d d gd dgdd gddgg      z   gz   Z$ ejJ                  e      ej2                  jE                  dd      ej2                  jE                  dd      ej2                  jE                  dd      ej2                  jE                  dd      ej2                  jE                  dd      ej2                  jE                  dd      ej2                  jE                  dd      ee!d
Z&e#dfe$dfd Z'd! Z(e&D ]  Z)d"D ]  Z* e(e)e*          G d# d$      Z+ G d% d&      Z, G d' d(      Z- G d) d*      Z.d+ Z/ G d, d-      Z0 G d. d/      Z1 G d0 d1      Z2e
jf                  ji                  d2eejj                  g      d3        Z6y)4    N)assert_equalassert_almost_equalassert_assert_allcloseassert_array_equal)raises)cKDTree)Voronoic                 *    t        t        |             S Ntuplesortedxs    b/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/scipy/spatial/tests/test_qhull.pysorted_tupler      s        c                 X   t        | t        j                        r| j                         } t        |t        j                        r|j                         }t	        t        ||             } | j                          t	        t        ||            }|j                          t        | |       y r   )
isinstancenpndarraytolistlistmapsortr   )abtpls      r   !assert_unordered_tuple_list_equalr       sp    !RZZ HHJ!RZZ HHJSa[AFFHSa[AFFHA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                    t         |    }|j                  d   }d}|dz   }| dk(  rd}n| dk(  rd}|d| g}t        |t        |      |      D ]  }|j	                  ||||z            d| |fz  }|t
        vsJ ||ft
        |<   y)	z<
    Generate incremental datasets from basic data sets
    r$   Nr,   r5   zQJ Ppr6      z%s-chunk-%d)DATASETSshaperangelenappendINCREMENTAL_DATASETS)	name	chunksizepointsndimoptsnminchunksjnew_names	            r   _add_inc_datarI   ]   s     d^F<<?DD!8D}	!	!Udm_F4Vi0fQq{+, 1 i00H////&,d^"r   )r$   r0      c                       e Zd Zd Zd Zy)
Test_Qhullc                    t        j                  dt        j                  ddgddgddgddgddgg      d      }t	        j
                  |j                               }t        j                  dt        j                  ddgddgddgddgg      d      }t	        j
                  |j                               }t	        j
                  |j                               }|j                          t	        j
                  |j                               }|j                          t        t        |j                         t        t        |j                         t        |d   |d          t        |d   |d   t               t        |d	   |d	   t               t        |d
   |d
   t               t        |d   |d          t        |d   |d          t        |d   |d   t               t        |d	   |d	   t               t        |d
   |d
   t               t        |d   |d          |j                          t        t        |j                         |j                          t        t        |j                         y )N   vr   r$         ?r(   s   Qz       @r   r,   r/   r0   )qhull_Qhullr   arraycopydeepcopyget_voronoi_diagramcloseassert_raisesRuntimeErrorr   r    r   r   )selfr   xdyydxd2yd2s          r   test_swappingzTest_Qhull.test_swapping}   s    LLAa5!A!uaVSI"FG  ]]10023LLAa5!A!uaV"<=  ]]10023mmA1134		mmA1134		lA$9$9:lA$9$9:1s1v&)"Q%Q\J)"Q%Q\J)"Q%Q\J2a5#a&)1s1v&)"Q%Q\J)"Q%Q\J)"Q%Q\J2a5#a&)		lA$9$9:		lA$9$9:r   c                 z    t        j                  ddg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        |       y )Nr   r$   r,   )r   rT   r
   )r[   rB   s     r   test_issue_8051zTest_Qhull.test_issue_8051   sT    VaVaVaVaVaVQFQFQPQFS
 	r   N)__name__
__module____qualname__ra   rc    r   r   rL   rL   |   s    $;Lr   rL   c                       e Zd ZdZd Zd Zd Zd Zd Zd Z		 	 	 ddZ
ej                  j                  d	      d
        Zej                  j                  ej                  j                  d      d               Zy)TestUtilitiesz-
    Check that utility functions work.

    c                 X   t        j                  g dt         j                        }t        j                  |      }t        |j                  g dg dg       dD ]M  }|j                  |d d       }t        ||d   |       t        j                  ||d d       }t        ||       O y )Nr"   r#   r&   r%   dtyper$   r/   r,   r/   r$   r   ))r-   r-   r$   )      ?rp   r   )333333?皙?r$   r,   err_msg)	r   rT   float64rR   Delaunayr   	simplicesfind_simplextsearch)r[   rB   tripirG   s         r   test_find_simplexzTestUtilities.test_find_simplex   s    6bjjInnV$ 	S]]Y	$:;!A   2A'AAaDQE3c1Ra5)AA!r   c                    t        j                  g dt         j                        }t        j                  ddgt         j                        }t        j                  |      }|j                  |      }|j                  |      }|j                  |      }t        |j                        D ]  \  }}||d      }	||d      }
||d      }t        j                  |	|z
  |
|z
        }|t        j                  t        j                  ||            z  }|t        j                  |d          z  }t        j                  |||z
        }t        ||   |        y )N)r"   r&   r%   )g]2ʐ?g>mj?)g~T!?g^Rz?rl   gB?g?r   r$   r,   )r   rT   ru   rR   rv   lift_pointsplane_distance	enumeraterw   crosssqrtdotsignr   )r[   r   r{   rz   zpzdistrG   vx1x2x3nds                 r   test_plane_distancez!TestUtilities.test_plane_distance   s    HH 079zzCHHj*-RZZ@nnQOOA__Q!!!$cmm,DAq1Q4B1Q4B1Q4Bb"r'*A1&&A"''!A$-Aq"r'"AQ+ -r   c                     t        j                  g dt         j                        }t        j                  |      }t        |j                  ddgddgddgddgg       y )Nrk   rl   r/   r,   r$   r   )r   rT   ru   rR   rv   r   convex_hullr[   rB   rz   s      r   test_convex_hullzTestUtilities.test_convex_hull   sN    6bjjInnV$ 	S__1v1v1v1v&FGr   c                     t        j                  g d      }t        j                  |      }t	        |j
                  ddd       t	        |j                  ddd       y )N)r   r   r   )r   r$   r   )r$   r   r   )r$   r$   r   )r   r   r$   )r   r$   r$   )r$   r   r$   )r$   r$   r$   rO   +=zVolume of cube is incorrectrtolrt         @zArea of cube is incorrectr   rT   rR   
ConvexHullr   volumearear[   rB   hulls      r   test_volume_areazTestUtilities.test_volume_area   sQ     G H'Re =	?		2E ;	=r   c                     t        j                  g d      }t        j                  |      }t	        |j
                  ddd       t	        |j                  ddd       y )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   s      r   test_random_volume_areaz%TestUtilities.test_random_volume_area   sW      	M 	N 'Ze J	L		95 H	Jr   c                    d}d}t         j                  j                  ||f      }t        j                  |d|dz   ddf   d      }t        j                  |d|dz   ddf   d      }t	        |dz   |      D ]  }t        j                  |d|dz   ddf         }|j                  |||dz   ddf          |j                  |||dz   ddf   d       t        |j                  |j                  d	       t        |j                  |j                  d	       t        |j                  |j                  d	       t        |j                  |j                  d	        y)
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   randomrR   r   r<   
add_pointsr   r   r   )r[   	nr_pointsdimrB   inc_hullinc_restart_hullr|   r   s           r   )test_incremental_volume_area_random_inputz7TestUtilities.test_incremental_volume_area_random_input  s<    	!!9c"23##F6CE619$54H ++F6CE619,=4Ps1ui(A##F4AaC47O4Dq1uax 01''q1uax(8$'GDKKtDDKK)9)@)@tLDIIx}}4@DII'7'<'<4H )r   c                    |j                   |j                     }d|j                  dz   z  }|j                  d      |z  }d }t	        j
                  t              j                  }	 ||j                  |      }
t	        j                  d      5  t	        j                  |
      j                  d      t        |
|z
        |z  dk  j                  d      z  }ddd       t        j                         | d	t	        j                  |               |dddd
ddf   |ddd
dddf   z
  }t	        j                  t!        |j"                        D cg c]+  }t        j$                  j'                  ||ddddf         - c}      }t	        j(                  |j                  ddddf         |t	        j*                  |	      k  z  }t        |j                         | d	t	        j                  |               |j-                  |      }|d
k7  t	        j                  |j                  ddddf         z  }t        |j                         | d	t	        j                  |               |rl||k  j/                  d      }||d|z
  k\  j/                  d      z  }|d
k7  |z  }t        |j                         | d	t	        j                  |               yy# 1 sw Y   	xY wc c}w )z@Check that a triangulation has reasonable barycentric transformsr$   rO   axisc                 j    | d d dd d f   }| d d d dd d f   }t        j                  d|||z
        S )Nr*   z
ijk,ik->ij)r   einsum)trr   rTinvs       r   barycentric_transformzJTestUtilities._check_barycentric_transforms.<locals>.barycentric_transform(  s;    1R6
AaAg;D99\4Q77r   ignore)invalidg?N r*   r   )rB   rw   rC   sumr   finfofloateps	transformerrstateisnanallabsr   nonzerorT   r<   nsimplexlinalgdetisfiniter   rx   any)r[   rz   rt   	unit_cubeunit_cube_tolverticessc	centroidsr   r   cokqkr   rG   at_boundarys                    r   _check_barycentric_transformsz+TestUtilities._check_barycentric_transforms  s    ::cmm,3LLaL(2-	
	8
 hhuo!!!#--;[[*!a(CBKNS,@+E+E1+E+MMB + 	WIQrzz2#&789 Qss1W2d1 55$)#,,$79$7q 99==1Qq52$79 :[[q1u-.&2773<2GHWIQrzz2#&789 Y'2g#--!A"677WIQrzz2#&789$5:::BKI])::??Q?GGKr'[(BBFFH	2::rc?*;<= % +*9s   AK"0K/"K,r1   c                    t        j                  t        j                  j	                  t        j                  j                  t              dd            }|d   }|j                          t        j                  |      }t        j                  |j                  d d ddf         j                         }t        |dk  |       | j                  |       y )Ndatazdegenerate_pointset.npzr   r      )r   loadospathjoindirname__file__rX   rR   rv   r   r   r   r   r   )r[   r   rB   rz   	bad_counts        r   &test_degenerate_barycentric_transformsz4TestUtilities.test_degenerate_barycentric_transformsJ  s     wwrww||BGGOOH$=v$=? @c

nnV$ HHS]]1Qq512668		B	* 	**3/r   r+   c                    t        j                  t              j                  }ddddd}t	        dd      D ]  }t        j
                  dd	||         }t         j                  t        t        t         j                  t        j                  t        j                  |g|z                   j                  }d
|z  }t        j                  |      }| j                  ||d       t         j                   j#                  d       t         j                   j%                  |j&                  d         dk  }||d d fxx   d|z  t        j                   j$                  ||d d f   j&                   dz
  z  z  cc<   t        j                  |      }| j                  ||dd|z         t        j                  t         j(                  ||f         }| j                  ||dd|z          y )NF      r1   r/   )r,   r/   r0   r1   r,   r2   r   r$   zndim=%dT)rt   r   r!   rr   r(   )rt   r   r   )r   r   r   r   r<   linspacec_r   r   ravelbroadcast_arraysix_TrR   rv   r   r   seedrandr;   r_)	r[   r   npointsrC   r   gridrt   rz   ms	            r    test_more_barycentric_transformsz.TestUtilities.test_more_barycentric_transforms\  s    hhuo!!RA!,!QKDAq'$-0A55S2#6#6!T8K#LMNa   $&G ..&C..sG9= / ? IINN4 

1.4A1I3		QqS	 @3 FGGI..&C..sG9==>sU / D
 ..tTz!23C..sG9==>sU / D5  r   N) Fr   )rd   re   rf   __doc__r}   r   r   r   r   r   r   pytestmark	fail_slowr   slowr   rg   r   r   ri   ri      s    
*,6H	=J(I" :<0545+>Z [[10 0" [[[[2#D  #Dr   ri   c                   $    e Zd Zd Zd Zd Zd Zy)TestVertexNeighborVerticesc                    t        |j                  j                  d         D cg c]  }t                }}|j                  D ]*  }|D ]#  }|D ]  }||k7  s	||   j                  |        % , |j                  \  }}t        |j                  j                  d         D cg c]'  }t        t        t        |||   ||dz                   ) }	}t        |	||	d|       y c c}w c c}w )Nr   r$   z != rs   )
r<   rB   r;   setrw   addvertex_neighbor_verticesr   intr   )
r[   rz   rG   expectedsr   r   indptrindicesgots
             r   _checkz!TestVertexNeighborVertices._check  s    #()9)9!)<#=>#=aCE#=>AAAv *    66 cjj..q12421 3sGF1IfQqSk:;<2 	 4 	S(sgT(,FG ?4s   C&$,C+c                     t        j                  g dt         j                        }t        j                  |      }| j                  |       y )N)r"   r#   r%   rl   r   rT   ru   rR   rv   r  r   s      r   test_trianglez(TestVertexNeighborVertices.test_triangle  s1    /rzzBnnV$Cr   c                     t        j                  g dt         j                        }t        j                  |      }| j                  |       y )Nrk   rl   r  r   s      r   test_rectanglez)TestVertexNeighborVertices.test_rectangle  s1    6bjjInnV$Cr   c                     t        j                  g dt         j                        }t        j                  |      }| j                  |       y )N)r"   r#   r&   r%   r'   )g?r(   rl   r  r   s      r   test_complicatedz+TestVertexNeighborVertices.test_complicated  s7     3:<**FnnV$Cr   N)rd   re   rf   r  r  r
  r  rg   r   r   r   r     s    H

r   r   c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zej                  j                  d ee            d        Zy)TestDelaunayz*
    Check that triangulation works.

    c                     t         j                  j                  d      }t        t        t
        j                  |       y Nr$   )r   ma
masked_allrY   
ValueErrorrR   rv   r[   masked_arrays     r   test_masked_array_failsz$TestDelaunay.test_masked_array_fails  s&    uu''*j%..,?r   c                     t        j                  ddddt         j                  fgt         j                        }t	        t
        t        j                  |       y )Nr"   r#   r&   r$   rl   )r   rT   nanru   rY   r  rR   rv   r[   points_with_nans     r   test_array_with_nans_failsz'TestDelaunay.test_array_with_nans_fails  s7    ((E5%!BFF#DBJJWj%../Br   c           	         t        dd      D ]  }t        j                  |dz   |f      }t        |      D ]	  }d|||f<    d|dd d f<   t        j                  |      }|j
                  j                          t        |j
                  t        j                  |dz   t              d d d f          t        |j                  dt        j                  |dz   t              d d d f   z           y )Nr,   r4   r$   rO   r*   rl   )r<   r   zerosrR   rv   rw   r   r   aranger   	neighbors)r[   ndrB   rG   rz   s        r   test_nd_simplexzTestDelaunay.test_nd_simplex  s    1+BXXr!tRj)F2Y!qs F2a4L..(CMM 		"Q$c(B47(KLRXXr!tC-Ha-P(PQ r   c                     t        j                  g dt         j                        }t        j                  |      }t        |j                  g dg dg       t        |j                  g dg dg       y )Nrk   rl   rn   ro   )r*   r*   r$   )r*   r*   r   )r   rT   ru   rR   rv   r   rw   r  r   s      r   test_2d_squarezTestDelaunay.test_2d_square  sK    6bjjInnV$S]]Y	$:;S]][+$>?r   c                    t        j                  g dt         j                        }t        j                  g dt         j                        }t         j                  ||f   }t         j                  ||f   }t	        j
                  t         j                  ||f          t	        j
                  t         j                  ||f          y )N)r   r$   r   r$   rl   )r   r   r$   r$   )r   rT   ru   r   rR   rv   r   )r[   r   r]   xpyps        r   test_duplicate_pointsz"TestDelaunay.test_duplicate_points  s~    HH\4HH\4UU1a4[UU1a4[ 	ruuQT{#ruuRV}%r   c                 t   t         d   }t        j                  |      }t        |j                  |j
                     j                         |j                                t        |j                  |j
                     j                         |j                                t         d   }t        j                  |      }t        |j                  |j
                     j                         |j                                t        |j                  |j
                     j                         |j                                y )Nr6   r7   )r:   rR   rv   r   rB   rw   maxminr   s      r   test_pathologicalzTestDelaunay.test_pathological  s    *+nnV$SZZ.224fjjlCSZZ.224fjjlC*+nnV$SZZ.224fjjlCSZZ.224fjjlCr   c                 B   t         j                  j                  dd      }t         j                  ||f   }t	        j
                  |d      }t        t        j                  |j                  j                               t        j                  t        |                   y )Nr+   r,   z	QJ Qbb Ppqhull_options)r   r   r   r   rR   rv   r   uniquerw   r   r  r=   r   s      r   test_jogglezTestDelaunay.test_joggle  sj     A&vv~&nnV;?299S]]%8%8%:;99S[1	3r   c           	      r   t         j                  j                  dd      }t         j                  ||f   }t	        j
                  |      }t        t        t        j                  |j                  j                                     t        |      dz  k(         t        t        |j                        t        |      dz  k(         t        t        t        j                  |j                  d d df               t        |      dz  k(         t        t        j                  |j                  dk\               y )Nr+   r,   r   )r   r   r   r   rR   rv   r   r=   r/  rw   r   coplanarr   vertex_to_simplexr   s      r   test_coplanarzTestDelaunay.test_coplanar  s    A&vv~&nnV$BIIcmm11345VaGHCLL!S[!^34BIIcll1Q3/01S[!^CDs,,123r   c                     g d}t        j                  |d      }t        j                  ddg      }t	        |j
                  |       y )Nr"   r#   r%   r'   )皙?r7  Tfurthest_site)r$   r0   r   )r0   r,   r   )rR   rv   r   rT   r   rw   )r[   rB   rz   r   s       r   test_furthest_sitezTestDelaunay.test_furthest_site  s8    AnnV4888Y	233==(3r   r@   c                    t         |   \  }}t        j                  |d      }t        j                  |d   d|      }|dd  D ]  }|j                  |        t        j                  |      }t        j                  |d   d|      }t        |      dkD  r+|j                  t        j                  |dd  d      d       |j                  d      rt        t        j                  |j                  j                               t        j                  |j                  d                t        t        j                  |j                  j                               t        j                  |j                  d                n&t        |j                  |j                  t               t        |j                  |j                  t               y )	Nr   r   Tr   r.  r$   r   pathologicalrQ   )r?   r   concatenaterR   rv   r   r=   
startswithr   r/  rw   r   r  r;   r    r   )	r[   r@   rF   rD   rB   objchunkobj2obj3s	            r   test_incrementalzTestDelaunay.test_incremental  s]    ,D1Q/nnVAYD+/1ABZENN5!   ~~f%~~fQiT,02v;?OOBNN6!":A>$(  * ??>* ryy)<)<)>?!yya9;ryy)=)=)?@!yya9; .cmmT^^2>@ 	*$..$...:	<r   N)rd   re   rf   r   r  r  r!  r#  r'  r+  r0  r4  r:  r   r   parametrizer   r?   rD  rg   r   r   r  r    se    @CR@	&
D	344 [[VV,@%AB!< C!<r   r  c                    t        t        t        |            }t        t        t        |            }||k7  r| j                  d   dk(  rdt	        j
                  t              j                  z  }|D ]x  \  }}|D ]c  \  }}| |   | |   z
  }|t        j                  j                  |      z  }t	        j                  |d    |d   g      }	t	        j                  |	| |   | |   z
        }
t	        j                  |	| |   | |   z
        }t	        j                  t	        j                  |
|	      d      st	        j                  t	        j                  ||	      d      st	        j                  || |   | |   z
        }
t	        j                  || |   | |   z
        }t	        j                  || |   | |   z
        }|
| k  s|
||z   kD  rS|| k  s|||z   kD  rc o t        d       y t        ||       y )Nr$   r,   i  r   zcomparison fails)r   r   r   r;   r   r   r   r   r   normrT   r   allcloseAssertionErrorr   )rB   facets_1facets_2r   r   r   apbptr   c1c2c3s                r   assert_hulls_equalrR  &  s    3|X./H3|X./H8Q1 4 RXXe_(((DAq"B2J+RYY^^A&&HHqteQqT]+ VVAvay6":56VVAvay6":56{{266"a=!4{{266"a=!4 VVAvay6":56VVAvay6":56VVAvbzF2J679R#X9R#X 1 #4 %%7887 < 	8$r   c                      e Zd Zd Zd Zej                  j                  d ee	            d        Z
ej                  j                  d ee            d        Zd Zd Zej                  j                  dd	d
g      d        Zej                  j                  dddg      ej                  j                  d ej"                  ddgg       ej"                  g de      f ej"                  ddgg       ej"                  g de      f ej"                  ddgg       ej"                  g de      f ej"                  ddgddgg       ej"                  g de      f ej"                  ddgg       ej"                  g de      fg      d               Zej                  j                  dd	d
g      d        Zej                  j                  dd	d
g      d        Zej                  j                  dd	d
g      d        Zy )!TestConvexHullc                     t         j                  j                  d      }t        t        t
        j                  |       y r  )r   r  r  rY   r  rR   r   r  s     r   r  z&TestConvexHull.test_masked_array_fails^  s(    uu''*j%"2"2LAr   c                     t        j                  dddt         j                  fgt         j                        }t	        t
        t        j                  |       y )Nr"   r&   r,   rl   )r   rT   r  ru   rY   r  rR   r   r  s     r   r  z)TestConvexHull.test_array_with_nans_failsb  s7    ((E51RVV*#=RZZPj%"2"2ODr   r@   c                    t         |   }t        j                  |      }t        j                  |      }t	        ||j
                  |j                         |j                  d   dk(  rGt        t        j                  |j                        t        j                  |j                               y t        t        j                  |j                        |j                         y )Nr$   r,   )r:   rR   rv   r   rR  r   rw   r;   r   r   r/  r   r   )r[   r@   rB   rz   r   s        r   test_hull_consistency_triz(TestConvexHull.test_hull_consistency_trif  s     $nnV$'63??DNNC <<?a4>>2BGGDMM4JK4>>2DMMBr   c                    t         |   \  }}t        j                  |d      }t        j                  |d   d      }|dd  D ]  }|j                  |        t        j                  |      }t        j                  |d   d      }t        |      dkD  r+|j                  t        j                  |dd  d      d       t        ||j                  |j                         t        ||j                  |j                         y )Nr   r   Tr   r$   r   )	r?   r   r>  rR   r   r   r=   rR  rw   )	r[   r@   rF   _rB   r@  rA  rB  rC  s	            r   rD  zTestConvexHull.test_incrementalw  s     ).	Q/vayd;ABZENN5!   'q	t<v;?OOBNN6!":A>$(  * 	63==$..A63==$..Ar   c           	         t         j                  j                  d       t         j                  j                  dd      }t	        j
                  |      }t        t        j                  |j                        t        j                  |j                               |j                  |j                     j                  \  }}t        j                  ||j                         z
  ||j                         z
        }t        t        j                   t        j"                  t        j$                  |            dkD               y )Nr!   r.   r,   r   )r   r   r   r   rR   r   r   r/  rw   r   r   rB   r   arctan2meanr   r   diffunwrap)r[   rB   r   r   r]   angles         r   test_vertices_2dzTestConvexHull.test_vertices_2d  s    
		tA&'RYYt~~.0FG {{4==)++1

1qvvx<QVVX6rwwryy/01456r   c                     t        j                  g d      }t        j                  |      }t	        |j
                  dd       t	        |j                  dd       y )Nr   rO   r   r   r   r   r   s      r   r   zTestConvexHull.test_volume_area  sG     G Hv&

BU3"51r   r   FTc                     t        j                  ddgddgddgddgddgg      }t        j                  ||d      }t        j                  g dt              }|j
                  }t        ||       y )	Nrr   皙?rq   333333?QG4rB   r   r.  )FTFFrl   r   rT   rR   r   boolgoodr   r[   r   rB   r   r   actuals         r   test_good2dzTestConvexHull.test_good2d  sy     C:::::	' (
 v,7.35 887tDVX&r   
visibilityrf  zQG-4znew_gen, expectedrq   gffffff?)FFFFFrl   gffffff)FTFFFg=
ףp=?)FFFTTr(   re  )FFTFFg433333?c                     t        j                  ddgddgddgddgddgg      }t        j                  |d|      }|j	                  |       |j
                  }d|v rt        j                  |      }t        ||       y )Nrr   rd  rq   re  Trg  -)r   rT   rR   r   r   rj  invertr   )r[   new_genr   rn  rB   r   rl  s          r   test_good2d_incremental_changesz.TestConvexHull.test_good2d_incremental_changes  s    N C:::::	' (
 v,0.8: 	 *yy*HVX&r   c                    t        j                  ddgddgddgddgddgg      }t        j                  ||      }|j                  }|J |r5|j                  t        j                  d             |j                  }|J y y )Nrr   rd  rq   re  )rB   r   r$   r,   )r   rT   rR   r   rj  r   r  )r[   r   rB   r   rl  s        r   test_good2d_no_optionz$TestConvexHull.test_good2d_no_option  s     C:::::	' (
 v,79~~OOBHHV,-YYF>!> r   c                     t        j                  ddgddgddgddgddgg      }t        j                  ||d      }t        j                  g dt              }|j
                  }t        ||       y )Nrr   rd  rq   rf  rg  )FFFFrl   rh  rk  s         r   test_good2d_insidez!TestConvexHull.test_good2d_inside  sy    
 C:::::	' (
 v,7.35 888EVX&r   c                     t        j                  g dg dg dg dg dg      }t        j                  ||d      }t        j                  g dt        	      }t        |j                  |       y )
Nr)   r)   r)   )gN7?g+xٿgg>@?)gFE%'?gWۧ=g/J?)g6r?gtĭ4gŷ)gw6y?gQgb?QG0rg  )TFFFrl   )r   rT   rR   r   ri  r   rj  )r[   r   rB   r   r   s        r   test_good3dzTestConvexHull.test_good3d
  sb     ?@@A@	B C
 v,7.35 887tDTYY)r   N)rd   re   rf   r  r  r   r   rE  r   r:   rX  r?   rD  ra  r   rm  r   rT   ri  rs  rv  rx  r|  rg   r   r   rT  rT  ]  sR   BE [[VVH%56C 7C  [[VV,@%ABB CB(72 [[]UDM:' ;' [[\#$,  ! [[0 
C:,		5T	B	D
 
C;-	 	4D	A	C
 
C;-	 	34	@	B 
C:Sz*	+	4D	A	C 
C%&	'	5T	B	D93
 >'?	!F'$ [[]UDM:" ;"$ [[]UDM:' ;'  [[]UDM:* ;*r   rT  c                      e Zd Zej                  j                  dddg      ej                  j                  dddg      ej                  j                  ddd	g      d
                      Zd Zd Zd Z	ej                  j                  d e
e            d        Zd Zd Zej                  j                  d      ej                  j                  d e
e            d               Zy)TestVoronoizqhull_opts, extra_pts)z	Qbb Qc Qzr$   )zQbb Qcr   n_pts2   d   rC   r,   r/   c                 >   t         j                  j                  d      }|j                  ||f      }t        ||      }|j                  }|j                         |dz
  |z   k(  sJ |j                  t        |j                        |z
  k(  sJ t        |j                        ||z   k(  sJ |j                  j                  d   |k(  sJ |rN|j                  D 	cg c]  }	t        |	       }
}	|
j                  d      dk(  sJ |
j                  d      |vsJ y y c c}	w )Nin  r-  r$   r   )r   r   default_rngr
   point_regionr)  sizer=   regionsrB   r;   countindex)r[   
qhull_optsr  	extra_ptsrC   rngrB   vor	pt_regionr   sublenss              r   test_point_region_structurez'TestVoronoi.test_point_region_structure  s    ii##D)UDM*fJ7$$	}}%!)i"7777~~S[[!1I!====3;;59#4444zz"e+++ '*{{3{!s1v{G3 ==#q(((==#9444 3s   Dc                     t         j                  j                  d      }t        t        t
        j                  |       y r  )r   r  r  rY   r  rR   r
   r  s     r   r  z#TestVoronoi.test_masked_array_fails=  s&    uu''*j%-->r   c                 4    g d}d}| j                  ||       y )N)	r"   r#   )r   r,   r%   r&   ru  )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r[   rB   outputs      r   test_simplezTestVoronoi.test_simpleA  s#    *
@ 	vv.r   c                 *   |j                         j                         D cg c])  }t        t        t        |j                                     + }}t        |d   d         }t        t        t        |dd|z                }t        |d   d         }|d|z   d|z   |z    D cg c]!  }|dd D cg c]  }t        |      dz
   c}# }	}}|d|z   |z   d D cg c]  }|dd D cg c]  }t        |       c}  }
}}|d|z   |z   d D cg c]!  }|dd D cg c]  }t        |      dz
   c}# }}}t        j                  |fi |}d }t        |j                  |       t        t        t        t        |j                              t        t        t        |	                   t        t        t        t        ||
            t        t        ||                        }t        t        t        t        ||j                   j#                                     t        t        ||j$                                          }|j'                          |j'                          t        ||       yc c}w c c}w c c}}w c c}w c c}}w c c}w c c}}w )z:Compare to output from 'qvoronoi o Fv < data' to Voronoi()r$   r   r/   r,   Nc                 *    t        t        |             S r   r   r   s    r   	sorttuplez0TestVoronoi._compare_qvoronoi.<locals>.sorttuple|  s    ##r   )strip
splitlinesr   r   r   splitr   r   rR   r
   r   r   r   r   r  zipridge_pointsr   ridge_verticesr   )r[   rB   r  kwr   nvertexr   nregionr]   r  r  r  r  r  p1p2s                   r   r  zTestVoronoi._compare_qvoronoij  so    8>||~7P7P7RS7R!$s5!''),-7RSfQil#E6!AgI#678fQil#"1W9QwYw->?A?q '(e,eCF1He,? 	 A "('	'(9(:!;=!;A *+1Q0AQ0!; 	 = $*!G)G*;*<#=?#=a ./qrU3U3q6!8U3#= 	 ? mmF)b)	$ 	h/SUCKK01UG,-	/ #d3y,783y.9:< =#d3y#*:*:*A*A*CDE3y#*<*<=>@ A
	
	R9 T - A0 =3 ?sM   .I/#I9/I4I9J&I?8JJJ
/J4I9?J
Jr@   c                    t         |   }t        |      }t        j                  |      }|j                  j                         D ]  \  }}t        j                  t        j                  |      dk\        s2|j                  |   j                  d      }d||d      |z
  z  }|j                  ||z   d      \  }	}
t        |
|d          |j                  ||z
  d      \  }	}
t        |
|d           y )Nr   r   gư>r$   )r   )r:   KDTreerR   r
   
ridge_dictitemsr   r   asarrayr   r]  queryr   )r[   r@   rB   treer  r{   r   ridge_midpointr   r   r   s              r   test_ridgeszTestVoronoi.test_ridges  s     $f~mmF#NN((*DAq66"**Q-1,- \\!_11q19Nqt~56Ajj!!3qj9GD!AaD!jj!!3qj9GD!AaD! +r   c                 8    g d}d}| j                  ||d       y )Nr6  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
        Tr8  r  r  s      r   r:  zTestVoronoi.test_furthest_site  s%    A$ 	vvTBr   c                     g d}t        |      }t        |j                  d       t        |d      }t        |j                  d       y )Nr6  FTr8  )r
   r   r9  )r[   rB   r  s      r   test_furthest_site_flagz#TestVoronoi.test_furthest_site_flag  s<    AfoS&&u-f40S&&t,r   r1   c                 8   t         |   d   d   j                  d   dkD  ry t         |   \  }}t        j                  |d      }t	        j
                  |d   d|      }|dd  D ]  }|j                  |        t	        j
                  |      }t	        j
                  |d   d|      }t        |      dkD  r+|j                  t        j                  |dd  d      d       t        t        |j                        t        |j                               t        t        |j                        t        |j                               ||fD ]  ddit        j                        D ]>  \  }	}
t        |j                        D ]!  \  }}t        j                  |
|      s||	<   # @ fd	d
 }t         | j                               ||j                               t         | j                               ||j                                y )Nr   r$   r/   r   Tr<  r   r*   c                     t        | d      rt        | D ch c]
  } |       c}      S 	 |    S c c}w # t        $ r#}dj                  |    }t	        |      |d }~ww xY w)N__len__z*incremental result has spurious vertex at )hasattrr   KeyErrorr   rI  )r   r]   emessageobjxremap
vertex_maps       r   r  z+TestVoronoi.test_incremental.<locals>.remap  sy    1i( A!6Aq%(A!6779%a=( "7   9"%%)]]1%5$8 :G(1q89s   38 	A$AA$c                     t        t        t        |             }d|v r|j                  d       |D  cg c]  } t	        |       dkD  s|  }} |j                          |S c c} w )Nrg   r$   )r   r   r   remover=   r   )r   r  s     r   
simplifiedz0TestVoronoi.test_incremental.<locals>.simplified  sW    Ca01;LL$$)8EqSVaZE8

 9s   AA)r?   r;   r   r>  rR   r
   r   r=   r   r  r   r   rH  r  r  )r[   r@   rF   rD   rB   r@  rA  rB  rC  r|   r   rG   v2r  r  r  r  s                 @@@r   rD  zTestVoronoi.test_incremental  s   
  %a(+11!4q8+D1Q/mmF1I4+/1ABZENN5!   }}V$}}VAYD+/1v;?OOBNN6!":A>$(  * 	S))*C0A0A,BCS))*C0A0A,BC IDbJ!$--01&t}}5EAr{{1b)()
1 6 1
9 5./4<<( 5!4!4564../; r   N)rd   re   rf   r   r   rE  r  r  r  r  r   r:   r  r:  r  r   r?   rD  rg   r   r   r~  r~    s    [[4 		7  [[Wr3i0[[VaV,5 - 154?'/R D [[VVH%56" 7"0C0- [[1[[VV,@%AB= C =r   r~  c                       e Zd Zd	dZej
                  j                  dej                  e	g      d        Z
d Zd Zd Zd Zy)
Test_HalfspaceIntersectionc                    t        |j                  |j                         t        j                  |j                  d   ft              }|D ]W  }t        j
                  t        ||z
        |k  j                  d            d   }t        |j                  d       d||d   <   Y t        |j                                y)z2Check that every line in arr1 is only once in arr2r   rl   r$   r   )r$   TN)	r   r;   r   r  ri  r   r   r   r   )r[   arr1arr2r   truthsl1indexess          r   assert_unordered_allclosez4Test_HalfspaceIntersection.assert_unordered_allclose
  s    TZZ,4::a=*$7Bjj#dRi.4"7!<!<!!<!DEaHG-!%F71:  	

r   dtc                    t        j                  g dg dg dg dg|      }t        j                  ddg|      }t        j                  ddgddgddgddgg      }t        j                  ||      }t	        |j
                  |       y )	N)r*   r   r   )r   r*   r   )r$   r   )r   r$   r  rl   r$   r)   rP   )r   rT   rR   HalfspaceIntersectionr   intersections)r[   r  
halfspacesfeasible_pointrB   r   s         r    test_cube_halfspace_intersectionz;Test_HalfspaceIntersection.test_cube_halfspace_intersection  s    XXz)))+ 356
 1a&3C:SzC:SzJK**:~F**F3r   c                    t         j                  j                  t         j                  j                  t              dd      }t        j                  |      }t        j                  |d d dd f   |d d d df   f       }t        j                  g d      }t        j                  ||      }t        |j                  j                  d       t        |j                  d       t        t!        |j"                        d       |j"                  D ]  }t        t!        |      d        |d d d	f   |d d d d	f   j%                  |      z   }| j'                  |d d d d	f   j(                  |z  j(                  |j*                         t-        j.                  g d
      }|D ]>  }	t        t        j0                  |j                  |	k(  j3                  d            d       @ y )Nr   zselfdual-4d-polytope.txtr$   )r)   r)   r)   r)   )   r0   g      @@r  r2   r*   )r)   r)   r(         r   )r   r   r   r   r   r   
genfromtxthstackrT   rR   r  r   r  r;   r   dual_volumer=   dual_facetsr   r  r   dual_points	itertoolspermutationsr   r   )
r[   fnameineqsr  
feas_pointhsfacetdistsrB   points
             r   $test_self_dual_polytope_intersectionz?Test_HalfspaceIntersection.test_self_dual_polytope_intersection#  s|   RWW__X679e$iiq!"uuQU| <==
XX./
((Z@R%%++W5BNND1S("-^^EUQ' $ 1b5!Jq#2#v$6$:$::$FF&&
1crc6(:(<(<U(B'E'Er~~V''(;<E!1!1U!: ? ?Q ? GH!L r   c                    t        j                  g dg dg dg dg      }t        j                  g d      }t        t        t        j
                  ||       t        j                  dgdgg      }t        t        t        j
                  ||       t        j                  ddgg      }t        t        t        j
                  ||       t        j                  ddg      }t        t        j                  t        j
                  ||       y )N)      r)   r)   )r)   r  r)   )rO   r)   r  )r)   rO   r  r(   r(   r(   r(   r  )r   rT   rY   r  rR   r  
QhullError)r[   r  r  s      r   test_wrong_feasible_pointz4Test_HalfspaceIntersection.test_wrong_feasible_point:  s    XX////1 2
 /2j11:~	OC53%.1j11:~	OC:,/j11:~	O 4,/e&&11:~	Or   c           	         t        j                  g dg dg dg dg dg dg      }t        j                  g dg dg d	g d
g      }t        j                  dggdz        }t        j                  t        j                  || f      |f      }t        j                  g d      }t	        j
                  ||d      }t	        j
                  ||d      }t        |      D ]  \  }}	|j                  |	t         j                  d d f          |j                  |	t         j                  d d f   d       t        j                  ||d |dz   d d f   f      }
t	        j
                  |
|      }t        |j                  |j                         t        |j                  |j                         t        |j                  |j                         | j                  |j                  |j                          |j                          y )N)r)   r)   r  r  )r)   r  r)   r  )r  r)   r)   r  )rO   r)   r)   r  )r)   rO   r)   r  )r)   r)   rO   r  )rO   rO   rO   )rO   rO   r  )rO   r  rO   )r$   r  r  r  r4   rz  Tr   r   r$   )r   rT   r  vstackrR   r  r   add_halfspacesnewaxisr   r  r  r  rX   )r[   r  extra_normalsoffsetsextra_halfspacesr  inc_hs
inc_res_hsr|   ehstotalr  s               r   rD  z+Test_HalfspaceIntersection.test_incrementalQ  s   XX2221113 4
 ,"/"/"/"1 2 ((SE719%99bii0O&P&-&/ 0 XXl+
,,ZQUV00Z=AC
   01FAs!!#bjj!m"45%%c"**a-&8$%GIIz+;DQqSD!G+DEFE,,UJ?BF--z/D/DEF--r}}= B,,j.F.FG**6+?+?AQAQR 2" 	r   c           	         t        j                  g dg dg dg dg dg dg      }t        j                  g d      }t        j                  ||      }t        j                  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(  rJ  t        |j                  |       y )N)r  r)   r)   r)   )rO   r)   r)   r  )r)   r  r)   r)   )r)   rO   r)   r  )r)   r)   r  r)   )r)   r)   rO   r  r  )r  r   r   )r,   r   r   )r   r  r   )r   r,   r   )r   r   r  )r   r   r,   )r,   r0   r   )r0   r,   r$   )r1   r,   r   )r,   r1   r$   )r/   r0   r$   )r0   r/   r   )r1   r/   r$   )r/   r1   r   )
r   rT   rR   r  r=   r  r  r   r   r  )r[   r  r  r  qhalf_pointsqhalf_facetsr   r   s           r   	test_cubez$Test_HalfspaceIntersection.test_cube|  s    XX0000002 3
 )((U; xx!   < C$7777bnn5DAqq6SV### 6 	5r   N)r   )rd   re   rf   r  r   r   rE  r   ru   r   r  r  r  rD  r  rg   r   r   r  r  	  sL    	 [[TBJJ#454 64M.O.)V"6r   r  diagram_typec                     t         j                  j                  d      }|j                  d      }t        j                  t
        d      5   | |       d d d        y # 1 sw Y   y xY w)N{   )r0   r+   r/   
dimensions)match)r   r   r  r   r   r  )r  r  invalid_datas      r   test_gh_20623r    sF    
))


$C::j)L	z	6\" 
7	6	6s   	AA')7r   rU   numpyr   numpy.testingr   r   r   r   r   r   r   rY   scipy.spatial._qhullspatial_qhullrR   scipy.spatialr	   r  r
   r  r   r   r    r   r   rB   rT   pathological_data_1r   ru   r   pathological_data_2r   bug_2850_chunksbug_2850_chunks_2r  r:   r?   rI   r@   rA   rL   ri   r   r  rR  rT  r~  r  r   rE  rv   r  rg   r   r   <module>r     s1   	  I I  * $ $ + !  16 	 		t 	=bhh  
5M %= #(- 27 
3K   %d| .3D\  4L  -  #(  27u  5M	  #;	  "'t	  05Tl	 
 4L 
 , 
 "'u 
 16d|  5M  #;  "'t  05Um  5M  $<  #(  16e}  4L  -  #(  27u  3K    !&d|  /4D\  	K  e   #5k  -0;  :=S	  	J  T
  !J  *-T
  6:%L  
%L  ,  "&c
  .2$K  
$K  t   $El  .2$K  
%L  ,  "&d  /34[  
%L  *   $Dk  -1<   
$K!   u!   !%U|!   /35\! " 
%L# " *# "  $Dk# " -1;# $ 
$K% $ t% $  $El% $ .2%L% & 
%L' & ,' & "&c
' & .2$K' ( 
$K) ( t) (  $Dk)   . bhhHr1gAwGaVaVXRXXbjj!%%%&AA    99>>"a(288aUQqEAa51Q%89
 %iinnR+XRXX!uqeaUQqE&BCCEE 
 2::f%A&A&A&A&A&A&A&)) !$'$d+ 44 D	dI&  
+ +\XD XDv B}< }<@4%nz* z*xk k`U6 U6p '5>>)BC# D#r   