o
    h8                     @   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/vscode/kcb/lib/python3.10/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)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>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 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$   r/   linalgnorm)namepolygons	polyhedranthetaspr   r   r   _generate_polytope9   s&   rS   c                 C   s*   dt j| d   t| d  || d   S )Nr?   r   )r   rF   r   )dimradiusr   r   r   _hypersphere_areaS   s   *rV   c                 C   s4   t jj|d}|| |}|t jj|ddd }|S )Nseedr   TrA   )r   randomRandomStaterandnrK   rL   )rP   rT   rX   rngpointsr   r   r   _sample_sphereX   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_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   r?   r   r?   center)r   r   r   r   )	r   r   r   r]   r   re   r   rU   
memoryview)ra   re   rU   s1s2s3s4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   rd   )r   r]   r   r   r   regionsr   vertices)ra   	sv_originre   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 )Nr?   )r   r]   r   rm   r   rn   )ra   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rU   )pytestr   rC   r   r]   r`   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]   rm   sort_vertices_of_regionsr   sorted)ra   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         r?   r   )r?   r   
            )r   r      r   )r   r   r   r   r   )	   r   r   )r?   r   r   )r   r   r   r   r   )r   r   r   r   r   )	r|   r   r   chainr   r]   r{   rm   r   )ra   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-dimensionalru   )r   r   rx   r   	TypeErrorr   r{   )ra   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   r?   r   )r   r]   shapern   r   )ra   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   r?   )
r   r]   rn   r   cdistr   r   r|   r   str)ra   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 rz   )r   r   r]   
degenerateassert_raisesrC   r   r`   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\(\?rw   r   rC   r   r]   r`   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   rd   r   r`   r   r   r   test_incorrect_center_handling   s   
"z3TestSphericalVoronoi.test_incorrect_center_handlingrT   r?   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   rW   r   rd   zij,ij->ir   r?   )r^   r   absaranger   einsumrn   r]   
_simplicesarccosclipmaxrF   )	ra   rT   r   rP   r]   re   r}   dotscircumradiir   r   r   test_single_hemisphere_handling   s   "z4TestSphericalVoronoi.test_single_hemisphere_handlingrP   )r   r?   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   rW   zRank of input pointsru   rd   )	r   r   r^   hstackzerosrx   r   rC   r   )ra   rP   rT   r   re   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   rW   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   rn   r   lenrm   r   sortr   r.   r   combinationsappendr   uniquer   sum	enumerate)ra   rT   rP   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 )r?   r   )r   )r(   r   rT   r   r   r,     s     zDTestSphericalVoronoi.test_cross_polytope_regions.<locals>.<listcomp>r   r   r   )r   r   eyer   allrm   rG   r   r   r   astypefloat64sqrtr   r   rn   r	   r   TOLra   rT   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   rG   r   r   r   r   r   r   r   r   r   r   r   rn   r	   r   r   r   r   r   r   test_hypercube_regions  s   z+TestSphericalVoronoi.test_hypercube_regionsr   i  r   rU   )r   r   r?   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   rW   r   rU   re   )	r^   r   r   r   r   calculate_areasr   r   rV   )
ra   rP   rT   rU   r   r   r]   re   r}   areasr   r   r   test_area_reconstitution*  s   "z-TestSphericalVoronoi.test_area_reconstitutionpoly)r0   r9   r:   r;   r<   r=   r>   c                 C   s:   t |}|j\}}t|}| }t|t|d|  d S )Nr   )rS   r   r   r   r   rV   )ra   r   r]   rP   rT   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 supportedru   )r   r   r   r   rx   r   r   r   )ra   rT   r]   r}   r   r   r   test_area_unsupported_dimensionH  s   
"z4TestSphericalVoronoi.test_area_unsupported_dimensionr   r   re   )Nrc   )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   re   
isinstancerU   float)ra   rU   re   r]   r}   r   r   r   test_attribute_typesO  s   
z)TestSphericalVoronoi.test_attribute_typesc                 C   sz   t | j}t|jd d }|jD ]	}t|tsJ q|  t|jd d |s+J |  t|jd d |s;J d S )Nr   )r   r]   typerm   r   r   r{   )ra   r}   r   regionr   r   r   test_region_types[  s   

z&TestSphericalVoronoi.test_region_typesN)__name__
__module____qualname__rb   rl   rq   rt   ry   r   r   r   r   r   r   r   r   rx   markparametrizer.   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r_   `   sP    






r_   rz   )numpyr   r   numpy.testingr   r   r   r   rx   r   r   scipy.spatialr   r   scipy.optimizer	   scipy.constantsr
   r   scipy.specialr   r   r   r   r   r$   r/   rS   rV   r^   r_   r   r   r   r   <module>   s&    
