a
    .'a8                     @   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   Ilib/python3.9/site-packages/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)Zx1Zx2Zx3Z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   Zroll).0ixr   r   
<listcomp>8       z)_generate_icosahedron.<locals>.<listcomp>r   )r   r   r    r!   ranger   r   r'   r   _generate_icosahedron3   s    


r,   c                 C   s   g d}g d}| |vr(| |vr(t d| |v rt|| d }tjddtj |dd}tt|t|gj}nN| d	krt	 }n>| d
krt
 }n.| dkrt }n| dkrt }n| dkrt }|tjj|ddd S )N)
triangleZsquareZpentagonZhexagonZheptagonZoctagonZnonagonZdecagonZ	undecagon	dodecagon)tetrahedroncube
octahedrondodecahedronicosahedronzunrecognized polytoper   r      F)Zendpointr/   r0   r1   r2   r3   r   Tr$   Zkeepdims)
ValueErrorindexr   ZlinspacepivstackZcosZsinTr   r   r   r"   r,   linalgnorm)nameZpolygonsZ	polyhedranZthetaspr   r   r   _generate_polytope;   s&    r@   c                 C   s*   dt j| d   t| d  || d   S )Nr4   r   )r   r8   r   )dimradiusr   r   r   _hypersphere_areaU   s    rC   c                 C   s4   t jj|d}|| |}|t jj|ddd }|S )Nseedr   Tr5   )r   ZrandomZRandomStateZrandnr;   r<   )r>   rA   rE   rngpointsr   r   r   _sample_sphereZ   s    rH   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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/d0gejddd1gejd2g d3ejd d!d"gejd4d!d"gd5d6 Zejd7g d8d9d: Zd;d< Zejd2d=d>gejd?g d@dAdB ZdCdD ZdES )F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   rG   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| d S )Nr   r4   r   r4   center)r   r   r   r   )r   r   r	   rG   r   rO   r   rB   )rK   rO   rB   s1s2Zs3Zs4r   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   rN   )r	   rG   r   r   r   regionsr   vertices)rK   Z	sv_originrO   Z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 )Nr4   )r	   rG   r   rS   r   rT   )rK   sv_unitZ	sv_scaledr   r   r   (test_vertices_regions_scaling_invariance   s    

z=TestSphericalVoronoi.test_vertices_regions_scaling_invariancec                 C   s^   t | jdd}t 6}|td t | jd }t|j|j W d    n1 sP0    Y  d S )Nr   rB   z`radius` is `None`)r	   rG   r   filterDeprecationWarningr   rT   )rK   rV   Zsupsvr   r   r   test_old_radius_api   s
    z(TestSphericalVoronoi.test_old_radius_apic                 C   s8   t t t| jd  W d    n1 s*0    Y  d S N)assert_warnsrZ   r	   rG   rJ   r   r   r   test_old_radius_api_warning   s    
z0TestSphericalVoronoi.test_old_radius_api_warningc                 C   s0   t | j}|j}|  tt|jt| d S r]   )r	   rG   rS   sort_vertices_of_regionsr   sorted)rK   r[   Z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         r4   r   )r4   r   
            )r   rc      r   )ri   rg   rh   rd   rc   )	   rf   re   )r4   rh   rd   )r   ri   rg   rf   rj   )r   r   re   rj   r   )	ra   r   r   chainr	   rG   r`   rS   r   )rK   expectedr[   actualr   r   r   'test_sort_vertices_of_regions_flattened   s    
z<TestSphericalVoronoi.test_sort_vertices_of_regions_flattenedc                 C   sj   t g dg dg dg dg dg}tjtdd  t|}|  W d    n1 s\0    Y  d S )N)r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   )      ?ro   ro   ro   zthree-dimensionalmatch)r   r   pytestr   	TypeErrorr	   r`   )rK   rG   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   r4   ri   )r	   rG   shaperT   r   )rK   r[   rl   rm   r   r   r   test_num_vertices   s    
z&TestSphericalVoronoi.test_num_verticesc                 C   sz   t | j}|jD ]d}t|jt|g}tt|dd }t|d |d dt	| t|d |d dt	| qd S )Nr   r   r   rh   r4   )
r	   rG   rT   r
   cdistr   r   ra   r   str)rK   r[   ZvertexZ	distancesZclosestr   r   r   test_voronoi_circles   s    

z)TestSphericalVoronoi.test_voronoi_circlesc                 C   sJ   t | j| jf| _tt t| j W d    n1 s<0    Y  d S r]   )r   r!   rG   Z
degenerateassert_raisesr6   r	   rJ   r   r   r   test_duplicate_point_handling   s    
z2TestSphericalVoronoi.test_duplicate_point_handlingc                 C   s:   t t t| jdd W d    n1 s,0    Y  d S )Ng\(\?rX   rz   r6   r	   rG   rJ   r   r   r   test_incorrect_radius_handling   s    
z3TestSphericalVoronoi.test_incorrect_radius_handlingc                 C   s>   t t" t| jg dd W d    n1 s00    Y  d S )N)g?r   r   rN   r|   rJ   r   r   r   test_incorrect_center_handling   s    
z3TestSphericalVoronoi.test_incorrect_center_handlingrA   r4   rc   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sJ d S )	Nre   r   rD   r   rN   zij,ij->ir   r4   )rH   r   absaranger	   ZeinsumrT   rG   
_simplicesZarccosZclipmaxr8   )	rK   rA   r   r>   rG   rO   r[   ZdotsZcircumradiir   r   r   test_single_hemisphere_handling   s    "z4TestSphericalVoronoi.test_single_hemisphere_handlingr>   )r   r4   re   c                 C   s~   t |d | }t||d dd}t |t |dfg}tjtdd  t|| |d W d    n1 sp0    Y  d S )Nr   r   rD   zRank of input pointsrp   rN   )	r   r   rH   ZhstackZzerosrr   r   r6   r	   )rK   r>   rA   r   rO   rG   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 ]Z}g }t
t	||D ]}	||d d t|	f  qvtjt|dd}|t| q^dd|d   }
tdd t|D }|
|ksJ d S )	Nd   r   rD   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>)rH   r	   rT   ru   lenrS   r   sortr   r+   r   combinationsappendr   uniquer!   sum	enumerate)rK   rA   r>   rG   r[   Zcell_countsZ	simplicesr&   ZcellsindicesZexpected_eulerZ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 sJ d S )Nc                    s    g | ]}t |d  d  kqS )r4   r   )r   )r%   r   rA   r   r   r)     r*   zDTestSphericalVoronoi.test_cross_polytope_regions.<locals>.<listcomp>r   r   r   )r   r!   eyer	   allrS   r9   r   r   r   astypefloat64sqrtr
   rw   rT   r   r   TOLrK   rA   rG   r[   rl   Z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 sJ d S )Nr   r   r   )r   r9   r   r   r   r   r   r   r	   r!   r   r
   rw   rT   r   r   r   r   r   r   r   test_hypercube_regions  s    z+TestSphericalVoronoi.test_hypercube_regionsre   i  r   rB   )ro   r   r4   single_hemispherec           
      C   s   t ||dd}|r4t|d d df |d d df< t|d | }|| | }t|||d}| }	t|	 t|| d S )Nr   rD   r   rB   rO   )	rH   r   r   r   r	   calculate_areasr   r   rC   )
rK   r>   rA   rB   r   r   rG   rO   r[   areasr   r   r   test_area_reconstitution.  s    "z-TestSphericalVoronoi.test_area_reconstitutionpoly)r-   r.   r/   r0   r1   r2   r3   c                 C   s:   t |}|j\}}t|}| }t|t|d|  d S )Nr   )r@   ru   r	   r   r   rC   )rK   r   rG   r>   rA   r[   r   r   r   r   test_equal_area_reconstitutionB  s
    
z3TestSphericalVoronoi.test_equal_area_reconstitutionc                 C   sb   d}t t | t |f}t|}tjtdd |  W d    n1 sT0    Y  d S )Nri   zOnly supportedrp   )r   r!   r   r	   rr   r   rs   r   )rK   rA   rG   r[   r   r   r   test_area_unsupported_dimensionL  s
    z4TestSphericalVoronoi.test_area_unsupported_dimensionr   r   rO   )NrM   )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 sXJ t|jtshJ d S )Nr   )	rG   r	   dtyper   r   rO   
isinstancerB   float)rK   rB   rO   rG   r[   r   r   r   test_attribute_typesS  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s`J d S )Nr   )r	   rG   typerS   r`   )rK   r[   r   r   r   r   test_region_types_  s    
z&TestSphericalVoronoi.test_region_typesN)__name__
__module____qualname__rL   rR   rU   rW   r\   r_   rb   rn   rt   rv   ry   r{   r}   r~   rr   ZmarkZparametrizer+   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rI   b   sP   






rI   )N)"Znumpyr   r   Znumpy.testingr   r   r   r   r   rr   r   rz   r   r^   Zscipy.spatialr	   r
   Zscipy.optimizer   Zscipy.constantsr   r    Zscipy.specialr   r   r   r   r   r"   r,   r@   rC   rH   rI   r   r   r   r   <module>   s&   
