a
    Re8                     @   s   d dl Zd dlZd dlmZmZmZmZ d dl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)raises)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   ^/var/www/sunrise/env/lib/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)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>6       z)_generate_icosahedron.<locals>.<listcomp>r   )r   r   r   r   ranger   r   r&   r   _generate_icosahedron1   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.   r/   r0   r1   r2   r   Tr#   Zkeepdims)
ValueErrorindexr   ZlinspacepivstackcossinTr   r   r   r!   r+   linalgnorm)nameZpolygonsZ	polyhedranZthetaspr   r   r   _generate_polytope9   s&    rA   c                 C   s*   dt j| d   t| d  || d   S )Nr3   r   )r   r7   r   )dimradiusr   r   r   _hypersphere_areaS   s    rD   c                 C   s4   t jj|d}|| |}|t jj|ddd }|S )Nseedr   Tr4   )r   randomZRandomStateZrandnr<   r=   )r?   rB   rF   rngpointsr   r   r   _sample_sphereX   s    rJ   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   rI   selfr   r   r   setup_methodb   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   r3   r   r3   center)r   r   r   r   )	r   r   r   rI   r   rQ   r   rC   
memoryview)rM   rQ   rC   s1s2Zs3Zs4Zs5r   r   r   test_constructorn   s"    
z%TestSphericalVoronoi.test_constructorc                 C   sN   t | j}tg d}t | j| |d}t|j|j t|j| |j d S )Nr   rP   )r   rI   r   r   r   regionsr   vertices)rM   Z	sv_originrQ   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 )Nr3   )r   rI   r   rV   r   rW   )rM   Zsv_unitZ	sv_scaledr   r   r   (test_vertices_regions_scaling_invariance   s    

z=TestSphericalVoronoi.test_vertices_regions_scaling_invariancec                 C   s@   t jtdd t| jd d W d    n1 s20    Y  d S )Nz`radius` is `None`. *matchrC   )pytestr   r5   r   rI   rL   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   rI   rV   sort_vertices_of_regionsr   sorted)rM   svZ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         r3   r   )r3   r   
            )r   rd      r   )rj   rh   ri   re   rd   )	   rg   rf   )r3   ri   re   )r   rj   rh   rg   rk   )r   r   rf   rk   r   )	ra   r   r   chainr   rI   r`   rV   r   )rM   expectedrb   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   )      ?rp   rp   rp   zthree-dimensionalrZ   )r   r   r]   r   	TypeErrorr   r`   )rM   rI   rb   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   r3   rj   )r   rI   shaperW   r   )rM   rb   rm   rn   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   ri   r3   )
r   rI   rW   r   cdistr   r   ra   r   str)rM   rb   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   rI   Z
degenerateassert_raisesr5   r   rL   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\(\?r\   rx   r5   r   rI   rL   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   rP   rz   rL   r   r   r   test_incorrect_center_handling   s    
z3TestSphericalVoronoi.test_incorrect_center_handlingrB   r3   rd   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 )	Nrf   r   rE   r   rP   zij,ij->ir   r3   )rJ   r   absaranger   ZeinsumrW   rI   
_simplicesZarccosZclipmaxr7   )	rM   rB   r}   r?   rI   rQ   rb   dotsZcircumradiir   r   r   test_single_hemisphere_handling   s    "z4TestSphericalVoronoi.test_single_hemisphere_handlingr?   )r   r3   rf   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   rE   zRank of input pointsrZ   rP   )	r   r   rJ   Zhstackzerosr]   r   r5   r   )rM   r?   rB   r}   rQ   rI   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   rE   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>)rJ   r   rW   rs   lenrV   r   sortr   r*   r   combinationsappendr   uniquer   sum	enumerate)rM   rB   r?   rI   rb   Zcell_countsZ	simplicesr%   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 )r3   r   )r   )r$   r   rB   r   r   r(     r)   zDTestSphericalVoronoi.test_cross_polytope_regions.<locals>.<listcomp>r   r   r   )r   r   eyer   allrV   r8   r   r   r   astypefloat64sqrtr   ru   rW   r	   r   TOLrM   rB   rI   rb   rm   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   r8   r   r   r   r   r   r   r   r   r   r   ru   rW   r	   r   r   r   r   r   r   test_hypercube_regions  s    z+TestSphericalVoronoi.test_hypercube_regionsrf   i  r   rC   )rp   r   r3   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   rE   r   rC   rQ   )	rJ   r   r~   r   r   calculate_areasr   r   rD   )
rM   r?   rB   rC   r}   r   rI   rQ   rb   areasr   r   r   test_area_reconstitution*  s    "z-TestSphericalVoronoi.test_area_reconstitutionpoly)r,   r-   r.   r/   r0   r1   r2   c                 C   s:   t |}|j\}}t|}| }t|t|d|  d S )Nr   )rA   rs   r   r   r   rD   )rM   r   rI   r?   rB   rb   r   r   r   r   test_equal_area_reconstitution>  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 )Nrj   zOnly supportedrZ   )r   r   r   r   r]   r   rq   r   )rM   rB   rI   rb   r   r   r   test_area_unsupported_dimensionH  s
    z4TestSphericalVoronoi.test_area_unsupported_dimensionr   r   rQ   )NrO   )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   )	rI   r   dtyper   r   rQ   
isinstancerC   float)rM   rC   rQ   rI   rb   r   r   r   test_attribute_typesO  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   rI   typerV   r`   )rM   rb   r   r   r   r   test_region_types[  s    
z&TestSphericalVoronoi.test_region_typesN)__name__
__module____qualname__rN   rU   rX   rY   r^   rc   ro   rr   rt   rw   ry   r{   r|   r]   markZparametrizer*   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rK   `   sN   






rK   )N)numpyr   r   Znumpy.testingr   r   r   r   r]   r   rx   Zscipy.spatialr   r   Zscipy.optimizer	   Zscipy.constantsr
   r   Zscipy.specialr   r   r   r   r   r!   r+   rA   rD   rJ   rK   r   r   r   r   <module>   s$   
