U
    ?h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 dddgdddgdddgdddggS )N   nparray r   r   \/var/www/html/venv/lib/python3.8/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 dddgdddgdddgdddgdddgdddggS )Nr   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   s     z)_generate_icosahedron.<locals>.<listcomp>r   )r   r   r   r   ranger   r   r%   r   _generate_icosahedron1   s    


r)   c              
   C   s   ddddddddd	d
g
}dddddg}| |kr>| |kr>t d| |kr|| 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   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   s6    
    r?   c                 C   s*   dt j| d   t| d  || d   S )Nr1   r   )r   r5   r   )dimradiusr   r   r   _hypersphere_areaS   s    rB   c                 C   s4   t jj|d}|| |}|t jj|ddd }|S )Nseedr   Tr2   )r   randomZRandomStateZrandnr:   r;   )r=   r@   rD   rngpointsr   r   r   _sample_sphereX   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ejdeddejddd gd!d" Zejd#d$dd%g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d0d1d$dgejddd gejd2dd gd3d4 Zejd5d6d7d8d9d:d;d<gd=d> Zd?d@ Zejd0d$dAgejdBdCdDdEgdFdG ZdHdI ZdCS )JTestSphericalVoronoic                 C   sP   t dddgdddgddd	gd
ddgdddgdddgdddgdddgg| _d S )Ng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_methodb   s    z!TestSphericalVoronoi.setup_methodc                 C   s  t dddg}d}t| j}t| j| |}t| j| |d}t| j| | ||}t|jt dddg t|jd t|jt dddg t|jd t|j| t|jd t|j| t|j| tt| j}t|jt dddg t|jd d S )Nr   r1   r   centerr   )	r   r   r   rG   r   rN   r   rA   
memoryview)rK   rN   rA   s1s2Zs3Zs4Zs5r   r   r   test_constructorn   s"    
z%TestSphericalVoronoi.test_constructorc                 C   sP   t | j}tdddg}t | j| |d}t|j|j t|j| |j d S )Nr   rM   )r   rG   r   r   r   regionsr   vertices)rK   Z	sv_originrN   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 )Nr1   )r   rG   r   rS   r   rT   )rK   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 5 Q R X d S )Nz`radius` is `None`. *matchrA   )pytestr   r3   r   rG   rJ   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   rG   rS   sort_vertices_of_regionsr   sorted)rK   svZunsorted_regionsr   r   r   test_sort_vertices_of_regions   s    
z2TestSphericalVoronoi.test_sort_vertices_of_regionsc                 C   s   t dddddgdddddd	gddd
dgd
dd	ddgdddgdd	dgdd
dddgdddddgg}ttjt | }t| j}|  ttjt |j }t|| d S )Nr         r1   r   
               r   	   )	r^   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 ddddgddddgddddgddddgddddgg}tjtdd t|}|  W 5 Q R X d S )Nr   r         ?zthree-dimensionalrW   )r   r   rZ   r   	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   r1   rg   )r   rG   shaperT   r   )rK   r_   rj   rk   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   rf   r1   )
r   rG   rT   r   cdistr   r   r^   r   str)rK   r_   ZvertexZ	distancesZclosestr   r   r   test_voronoi_circles   s    

z)TestSphericalVoronoi.test_voronoi_circlesc              	   C   s6   t | j| jf| _tt t| j W 5 Q R X d S r\   )r   r   rG   Z
degenerateassert_raisesr3   r   rJ   r   r   r   test_duplicate_point_handling   s    
z2TestSphericalVoronoi.test_duplicate_point_handlingc              	   C   s&   t t t| jdd W 5 Q R X d S )Ng\(\?rY   ru   r3   r   rG   rJ   r   r   r   test_incorrect_radius_handling   s    
z3TestSphericalVoronoi.test_incorrect_radius_handlingc              	   C   s,   t t t| jdddgd W 5 Q R X d S )Ng?r   rM   rw   rJ   r   r   r   test_incorrect_center_handling   s    
z3TestSphericalVoronoi.test_incorrect_center_handlingr@   r1   ra   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std S )	Nrc   r   rC   r   rM   zij,ij->ir   r1   )rH   r   absaranger   ZeinsumrT   rG   
_simplicesZarccosZclipmaxr5   AssertionError)	rK   r@   rz   r=   rG   rN   r_   dotsZcircumradiir   r   r   test_single_hemisphere_handling   s    "z4TestSphericalVoronoi.test_single_hemisphere_handlingr=   r   rc   c              	   C   sj   t |d | }t||d dd}t |t |dfg}tjtdd t|| |d W 5 Q R X d S )Nr   r   rC   zRank of input pointsrW   rM   )	r   r|   rH   ZhstackZzerosrZ   r   r3   r   )rK   r=   r@   rz   rN   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.tt|j|ks@t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std S )	Nd   r   rC   r   r!   r   c                 S   s   g | ]\}}d | | qS )r   r   )r#   r$   er   r   r   r'     s     z?TestSphericalVoronoi.test_higher_dimensions.<locals>.<listcomp>)rH   r   rT   rp   r   lenrS   r   sortr}   r(   r   combinationsappendr   uniquer   sum	enumerate)rK   r@   r=   rG   r_   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@tt tt	j
ddg d}|t jt   }t|j|}t|}||  tk std S )Nc                    s    g | ]}t |d  d  kqS )r1   r   )r   )r#   r   r@   r   r   r'     s     zDTestSphericalVoronoi.test_cross_polytope_regions.<locals>.<listcomp>r   r   r   )r   r   eyer   allrS   r   r6   r   r   r   astypefloat64sqrtr   rr   rT   r	   r   TOLrK   r@   rG   r_   rj   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 std S )Nr   r   r   )r   r6   r   r   r   r   r   r   r   r   r   r   rr   rT   r	   r   r   r   r   r   r   r   test_hypercube_regions  s    z+TestSphericalVoronoi.test_hypercube_regionsi  r   rA   rm   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   rC   r   rA   rN   )	rH   r   r{   r|   r   calculate_areasr   r   rB   )
rK   r=   r@   rA   rz   r   rG   rN   r_   areasr   r   r   test_area_reconstitution*  s    "z-TestSphericalVoronoi.test_area_reconstitutionpolyr*   r+   r,   r-   r.   r/   r0   c                 C   s:   t |}|j\}}t|}| }t|t|d|  d S )Nr   )r?   rp   r   r   r   rB   )rK   r   rG   r=   r@   r_   r   r   r   r   test_equal_area_reconstitution>  s
    
z3TestSphericalVoronoi.test_equal_area_reconstitutionc              	   C   sN   d}t t | t |f}t|}tjtdd |  W 5 Q R X d S )Nrg   zOnly supportedrW   )r   r   r   r   rZ   r   rn   r   )rK   r@   rG   r_   r   r   r   test_area_unsupported_dimensionH  s
    z4TestSphericalVoronoi.test_area_unsupported_dimensionr   rN   N)r   r1   r   )r   g       @g      @c                 C   sl   || j  }|d k	r||7 }t|||d}|j jttjks@t|jjttjksXtt|jt	shtd S )Nr   )
rG   r   dtyper   r   r   rN   
isinstancerA   float)rK   rA   rN   rG   r_   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>t|  t|jd d |ks`td S )Nr   )r   rG   typerS   r]   r   )rK   r_   r   r   r   r   test_region_types[  s    
z&TestSphericalVoronoi.test_region_types)__name__
__module____qualname__rL   rR   rU   rV   r[   r`   rl   ro   rq   rt   rv   rx   ry   rZ   markZparametrizer(   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rI   `   sZ   




   

rI   )N)numpyr   r   Znumpy.testingr   r   r   r   rZ   r   ru   Zscipy.spatialr   r   Zscipy.optimizer	   Zscipy.constantsr
   r   Zscipy.specialr   r   r   r   r   r    r)   r?   rB   rH   rI   r   r   r   r   <module>   s$   
