o
    5ήcp8                     @   s   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Z d dlmZmZ d dlmZ d dlmZ d dlm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dZ G dd dZ!dS )    N)assert_equalassert_almost_equalassert_array_equalassert_array_almost_equalsuppress_warnings)raises)warns)SphericalVoronoidistance)linear_sum_assignment)golden)gammag|=c                   C   s"   t g dg dg dg dgS )N   r   r   )r   r   )r   r   r   )r   r   r   nparray r   r   Q/tmp/pip-target-vg8gfxp4/lib/python/scipy/spatial/tests/test_spherical_voronoi.py_generate_tetrahedron   s   "r   c                   C   s   t ttjddgddS )Nr         ?   repeat)r   r   list	itertoolsproductr   r   r   r   _generate_cube   s   r   c                	   C   s.   t g dg dg dg dg dg dg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   _generate_octahedron   s   r   c               	   C   s   t  } tdt dt gdt dt gdt
 dt gdt
 dt gg}tdt dt gdt dt gdt dt
 gdt dt
 gg}tt dt dgt dt dgt
 dt dgt
 dt dgg}t| |||fS )Nr   r   r   )r   r   r   phiconcatenate)x1x2x3x4r   r   r   _generate_dodecahedron!   s"   r&   c                      sN   t ddt gddt
 gddt gddt
 gg t  fddtdD S )Nr   r   r   c                    s   g | ]
}t j |d dqS )r   axis)r   roll).0ixr   r   
<listcomp>8       z)_generate_icosahedron.<locals>.<listcomp>r   )r   r   r    r!   ranger   r   r,   r   _generate_icosahedron3   s   


r1   c                 C   s   g d}g d}| |vr| |vrt d| |v r:|| d }tjddtj |dd}tt|t|gj}n'| d	krBt	 }n| d
krJt
 }n| dkrRt }n| dkrZt }n| dkrat }|tjj|ddd S )N)
trianglesquarepentagonhexagonheptagonoctagonnonagondecagon	undecagon	dodecagon)tetrahedroncube
octahedrondodecahedronicosahedronzunrecognized polytoper   r      F)endpointr<   r=   r>   r?   r@   r   Tr(   keepdims)
ValueErrorindexr   linspacepivstackcossinTr   r   r   r&   r1   linalgnorm)namepolygons	polyhedranthetaspr   r   r   _generate_polytope;   s&   rU   c                 C   s*   dt j| d   t| d  || d   S )NrA   r   )r   rH   r   )dimradiusr   r   r   _hypersphere_areaU   s   *rX   c                 C   s4   t jj|d}|| |}|t jj|ddd }|S )Nseedr   TrC   )r   randomRandomStaterandnrM   rN   )rR   rV   rZ   rngpointsr   r   r   _sample_sphereZ   s   r`   c                	   @   s  e 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dd Zdd Zdd Zdd Zejdeddejddd gd!d" Zejd#g d$ejdeddejddd gd%d& Zejdeddd'd( Zejdeddd)d* Zejdeddd+d, Zejd#d-d.gejddd/gejd0g d1ejddd gejd2dd gd3d4 Zejd5g d6d7d8 Zd9d: Zejd0d;d<gejd=g d>d?d@ ZdAdB ZdCS )DTestSphericalVoronoic                 C   s@   t g dg dg dg dg dg dg dg dg| _d S )	N)g7Ag4QĿgM%?)gavcgtu?gc?)gX&p?g|gZ
Bɿ)g-NgQtag;[/ۿ)g|-S?gl̲?gp?)gwg4g?g݆Xf¿)gCk?gl
=r1̿gt8A@)g9K?g͡w4u?g?)r   r   r_   selfr   r   r   setup_methodd   s   z!TestSphericalVoronoi.setup_methodc                 C   s   t g d}d}t| j}t| j| |}t| j| |d}t| j| | ||}t|jt g d t|jd t|jt g d t|jd t|j| t|jd t|j| t|j| tt| j}t|jt g d t|jd d S )Nr   rA   r   rA   center)r   r   r   r   )	r   r   r	   r_   r   rg   r   rW   
memoryview)rc   rg   rW   s1s2s3s4s5r   r   r   test_constructorp   s"   
z%TestSphericalVoronoi.test_constructorc                 C   sN   t | j}tg d}t | j| |d}t|j|j t|j| |j d S )Nr   rf   )r	   r_   r   r   r   regionsr   vertices)rc   	sv_originrg   sv_translatedr   r   r   ,test_vertices_regions_translation_invariance   s   

zATestSphericalVoronoi.test_vertices_regions_translation_invariancec                 C   s>   t | j}t | jd d}t|j|j t|jd |j d S )NrA   )r	   r_   r   ro   r   rp   )rc   sv_unit	sv_scaledr   r   r   (test_vertices_regions_scaling_invariance   s   

z=TestSphericalVoronoi.test_vertices_regions_scaling_invariancec                 C   sB   t jtdd t| jd d W d    d S 1 sw   Y  d S )Nz`radius` is `None`. *matchrW   )pytestr   rE   r	   r_   rb   r   r   r   test_old_radius_api_error   s   "z.TestSphericalVoronoi.test_old_radius_api_errorc                 C   s0   t | j}|j}|  tt|jt| d S N)r	   r_   ro   sort_vertices_of_regionsr   sorted)rc   svunsorted_regionsr   r   r   test_sort_vertices_of_regions   s   
z2TestSphericalVoronoi.test_sort_vertices_of_regionsc              
   C   s~   t g dg dg dg dg dg dg dg dg}ttjt | }t| j}|  ttjt |j }t|| d S )	N)r         rA   r   )rA   r   
            )r   r      r   )r   r   r   r   r   )	   r   r   )rA   r   r   )r   r   r   r   r   )r   r   r   r   r   )	r~   r   r   chainr	   r_   r}   ro   r   )rc   expectedr   actualr   r   r   'test_sort_vertices_of_regions_flattened   s   
z<TestSphericalVoronoi.test_sort_vertices_of_regions_flattenedc                 C   sl   t g dg dg dg dg dg}tjtdd t|}|  W d    d S 1 s/w   Y  d S )N)r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   )      ?r   r   r   zthree-dimensionalrw   )r   r   rz   r   	TypeErrorr	   r}   )rc   r_   r   r   r   r   ,test_sort_vertices_of_regions_dimensionality   s   

"zATestSphericalVoronoi.test_sort_vertices_of_regions_dimensionalityc                 C   s8   t | j}| jjd d d }|jjd }t|| d S )Nr   rA   r   )r	   r_   shaperp   r   )rc   r   r   r   r   r   r   test_num_vertices   s   
z&TestSphericalVoronoi.test_num_verticesc                 C   sz   t | j}|jD ]2}t|jt|g}tt|dd }t|d |d dt	| t|d |d dt	| qd S )Nr   r   r   r   rA   )
r	   r_   rp   r
   cdistr   r   r~   r   str)rc   r   vertex	distancesclosestr   r   r   test_voronoi_circles   s   

z)TestSphericalVoronoi.test_voronoi_circlesc                 C   sL   t | j| jf| _tt t| j W d    d S 1 sw   Y  d S r|   )r   r!   r_   
degenerateassert_raisesrE   r	   rb   r   r   r   test_duplicate_point_handling   s   
"z2TestSphericalVoronoi.test_duplicate_point_handlingc                 C   s<   t t t| jdd W d    d S 1 sw   Y  d S )Ng\(\?ry   r   rE   r	   r_   rb   r   r   r   test_incorrect_radius_handling   s   
"z3TestSphericalVoronoi.test_incorrect_radius_handlingc                 C   s@   t t t| jg dd W d    d S 1 sw   Y  d S )N)g?r   r   rf   r   rb   r   r   r   test_incorrect_center_handling   s   
"z3TestSphericalVoronoi.test_incorrect_center_handlingrV   rA   r   shiftFTc           	      C   s   d}t ||dd}t|d d df |d d df< t|d | }t|| |d}td|j| |j|jd d df  | }t	t
|dd}t|tjd ksWJ d S )	Nr   r   rY   r   rf   zij,ij->ir   rA   )r`   r   absaranger	   einsumrp   r_   
_simplicesarccosclipmaxrH   )	rc   rV   r   rR   r_   rg   r   dotscircumradiir   r   r   test_single_hemisphere_handling   s   "z4TestSphericalVoronoi.test_single_hemisphere_handlingrR   )r   rA   r   c                 C   s   t |d | }t||d dd}t |t |dfg}tjtdd t|| |d W d    d S 1 s9w   Y  d S )Nr   r   rY   zRank of input pointsrw   rf   )	r   r   r`   hstackzerosrz   r   rE   r	   )rc   rR   rV   r   rg   r_   r   r   r   test_rank_deficient   s   "z(TestSphericalVoronoi.test_rank_deficientc                 C   s   d}t ||dd}t|}|jjd |ksJ t|j|ks J g }t|j}t	d|d D ]-}g }t
t	||D ]}	||d d t|	f  q;tjt|dd}|t| q/dd|d   }
tdd t|D }|
|ksvJ d S )	Nd   r   rY   r   r'   r   c                 S   s   g | ]
\}}d | | qS )r   r   )r*   r+   er   r   r   r.     r/   z?TestSphericalVoronoi.test_higher_dimensions.<locals>.<listcomp>)r`   r	   rp   r   lenro   r   sortr   r0   r   combinationsappendr   uniquer!   sum	enumerate)rc   rV   rR   r_   r   cell_counts	simplicesr+   cellsindicesexpected_euleractual_eulerr   r   r   test_higher_dimensions   s    z+TestSphericalVoronoi.test_higher_dimensionsc                    s   t t   t  f}t|}t fdd|jD s J t ttj	ddg d}|
t jt   }t|j|}t|}||  tk sNJ d S )Nc                    s    g | ]}t |d  d  kqS )rA   r   )r   )r*   r   rV   r   r   r.     s     zDTestSphericalVoronoi.test_cross_polytope_regions.<locals>.<listcomp>r   r   r   )r   r!   eyer	   allro   rI   r   r   r   astypefloat64sqrtr
   r   rp   r   r   TOLrc   rV   r_   r   r   distresr   r   r   test_cross_polytope_regions  s   z0TestSphericalVoronoi.test_cross_polytope_regionsc                 C   s   t ttjddg|d}|t jt | }t|}t 	t 
| t 
|f}t|j|}t|}||  tk s@J d S )Nr   r   r   )r   rI   r   r   r   r   r   r   r	   r!   r   r
   r   rp   r   r   r   r   r   r   r   test_hypercube_regions  s   z+TestSphericalVoronoi.test_hypercube_regionsr   i  r   rW   )r   r   rA   single_hemispherec           
      C   s   t ||dd}|rt|d d df |d d df< t|d | }|| | }t|||d}| }	t|	 t|| d S )Nr   rY   r   rW   rg   )	r`   r   r   r   r	   calculate_areasr   r   rX   )
rc   rR   rV   rW   r   r   r_   rg   r   areasr   r   r   test_area_reconstitution,  s   "z-TestSphericalVoronoi.test_area_reconstitutionpoly)r2   r;   r<   r=   r>   r?   r@   c                 C   s:   t |}|j\}}t|}| }t|t|d|  d S )Nr   )rU   r   r	   r   r   rX   )rc   r   r_   rR   rV   r   r   r   r   r   test_equal_area_reconstitution@  s
   
z3TestSphericalVoronoi.test_equal_area_reconstitutionc                 C   sd   d}t t | t |f}t|}tjtdd |  W d    d S 1 s+w   Y  d S )Nr   zOnly supportedrw   )r   r!   r   r	   rz   r   r   r   )rc   rV   r_   r   r   r   r   test_area_unsupported_dimensionJ  s   
"z4TestSphericalVoronoi.test_area_unsupported_dimensionr   r   rg   )Nre   )r   g       @g      @c                 C   sl   || j  }|d ur||7 }t|||d}|j jttju s J |jjttju s,J t|jts4J d S )Nr   )	r_   r	   dtyper   r   rg   
isinstancerW   float)rc   rW   rg   r_   r   r   r   r   test_attribute_typesQ  s   
z)TestSphericalVoronoi.test_attribute_typesc                 C   sd   t | j}t|jd d }|  t|jd d |ksJ |  t|jd d |ks0J d S )Nr   )r	   r_   typero   r}   )rc   r   r   r   r   r   test_region_types]  s   
z&TestSphericalVoronoi.test_region_typesN)__name__
__module____qualname__rd   rn   rs   rv   r{   r   r   r   r   r   r   r   r   rz   markparametrizer0   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ra   b   sP    






ra   r|   )"numpyr   r   numpy.testingr   r   r   r   r   rz   r   r   r   assert_warnsscipy.spatialr	   r
   scipy.optimizer   scipy.constantsr   r    scipy.specialr   r   r   r   r   r&   r1   rU   rX   r`   ra   r   r   r   r   <module>   s(    
