
    sg8                         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	 Zd
 Zd Zd Zd Zd Zd ZddZ G d d      Zy)    N)assert_equalassert_almost_equalassert_array_equalassert_array_almost_equal)raises)SphericalVoronoidistance)linear_sum_assignment)golden)gammag|=c                  D    t        j                  g dg dg dg dg      S )N   r   r   )r   r   )r   r   r   )r   r   r   nparray     ]/var/www/html/venv/lib/python3.12/site-packages/scipy/spatial/tests/test_spherical_voronoi.py_generate_tetrahedronr      s    88Y[+FGGr   c                  l    t        j                  t        t        j                  ddgd                  S )Nr         ?   repeat)r   r   list	itertoolsproductr   r   r   _generate_cuber       s'    88D**B8A>?@@r   c            	      P    t        j                  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   _generate_octahedronr"      s%    88ZZZ9 : :r   c            	      F   t               } t        j                  dt         dt        z  gdt         dt        z  gdt        dt        z  gdt        dt        z  gg      }t        j                  dt        z  dt         gdt        z  dt         gdt        z  dt        gdt        z  dt        gg      }t        j                  t         dt        z  dgt         dt        z  dgt        dt        z  dgt        dt        z  dgg      }t        j                  | |||f      S )Nr   r   r   )r    r   r   phiconcatenate)x1x2x3x4s       r   _generate_dodecahedronr*      s   		B	AtR#X&tR#X&tR#X&tR#X&( 
)B 
BHa#&Ha#&Ha#&Ha#&( 
)B 
SD"s(A&D"s(A&D"s(A&D"s(A&( 
)B >>2r2r*++r   c            
         t        j                  ddt         gddt        gddt         gddt        gg      } t        j                  t	        d      D cg c]  }t        j
                  | |d       c}      S c c}w )Nr   r   r   r   axis)r   r   r$   r%   rangeroll)xis     r   _generate_icosahedronr2   1   sp    
1b3$-b3$-b3$-b3$-! 	"A >>%(CQ2771aa0CDDCs   A<c                 4   g d}g d}| |vr| |vrt        d      | |v r|j                  |       dz   }t        j                  ddt        j                  z  |d      }t        j
                  t        j                  |      t        j                  |      g      j                  }nO| d	k(  rt               }n?| d
k(  rt               }n/| dk(  rt               }n| dk(  rt               }n| dk(  r
t               }t        j                  j                  |dd      z  S )N)
trianglesquarepentagonhexagonheptagonoctagonnonagondecagon	undecagon	dodecagon)tetrahedroncube
octahedrondodecahedronicosahedronzunrecognized polytoper   r      F)endpointr>   r?   r@   rA   rB   r   Tr-   keepdims)
ValueErrorindexr   linspacepivstackcossinTr   r    r"   r*   r2   linalgnorm)namepolygons	polyhedranthetasps         r   _generate_polytoperW   9   s    KH I8I 5011xNN4 1$QBEE	1u=IIrvvf~rvvf~6799		!#			 "		"$		!#ryy~~aa$~777r   c                 d    dt         j                  | dz  z  z  t        | dz        z  || dz
  z  z  S )NrC   r   )r   rJ   r   )dimradiuss     r   _hypersphere_arear[   S   s5    ruusQw%a.06C!G3DDDr   c                     t         j                  j                  |      }|j                  | |      }|t         j                  j                  |dd      z  }|S )Nseedr   TrE   )r   randomRandomStaterandnrO   rP   )rT   rY   r^   rngpointss        r   _sample_sphererd   X   sK    
))

T

*CYYq#F
biinnV!dn;;FMr   c            	          e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zej"                  j%                  d edd            ej"                  j%                  dddg      d               Zej"                  j%                  dg d      ej"                  j%                  d edd            ej"                  j%                  dddg      d                      Zej"                  j%                  d edd            d        Zej"                  j%                  d edd            d        Zej"                  j%                  d edd            d        Zej"                  j%                  dddg      ej"                  j%                  dddg      ej"                  j%                  dg d      ej"                  j%                  dddg      ej"                  j%                  d ddg      d!                                    Zej"                  j%                  d"g d#      d$        Zd% Zej"                  j%                  dd&d'g      ej"                  j%                  d(g d)      d*               Zd+ Zy,)-TestSphericalVoronoic                 h    t        j                  g dg dg dg dg dg dg dg dg      | _        y )	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   rc   selfs    r   setup_methodz!TestSphericalVoronoi.setup_methodb   s/    hh21230210 2 	
r   c                 r   t        j                  g d      }d}t        | j                        }t        | j                  |z  |      }t        | j                  |z   |      }t        | j                  |z  |z   ||      }t	        |j
                  t        j                  g d             t        |j                  d       t	        |j
                  t        j                  g d             t        |j                  d       t	        |j
                  |       t        |j                  d       t	        |j
                  |       t        |j                  |       t        t        | j                              }t	        |j
                  t        j                  g d             t        |j                  d       y )Nr   rC   r   rC   center)r   r   r   r   )	r   r   r   rc   r   rn   r   rZ   
memoryview)ri   rn   rZ   s1s2s3s4s5s           r   test_constructorz%TestSphericalVoronoi.test_constructorn   s'   )$dkk* dkkF2F;dkkF26BdkkF2V;VVL299bhhy&9:RYY"299bhhy&9:RYY"299f-RYY"299f-RYY' j56299bhhy&9:RYY"r   c                    t        | j                        }t        j                  g d      }t        | j                  |z   |      }t	        |j
                  |j
                         t        |j                  |z   |j                         y )Nr   rm   )r   rc   r   r   r   regionsr   vertices)ri   	sv_originrn   sv_translateds       r   ,test_vertices_regions_translation_invariancezATestSphericalVoronoi.test_vertices_regions_translation_invariance   sg    $T[[1	)$(v)=fMY&&(=(=>!)"4"4v"="/"8"8	:r   c                     t        | j                        }t        | j                  dz  d      }t        |j                  |j                         t	        |j
                  dz  |j
                         y )NrC   )r   rc   r   rw   r   rx   )ri   sv_unit	sv_scaleds      r   (test_vertices_regions_scaling_invariancez=TestSphericalVoronoi.test_vertices_regions_scaling_invariance   sV    "4;;/$T[[1_a8	W__i&7&78!'"2"2Q"6"+"4"4	6r   c                     t        j                  t        d      5  t        | j                  d        d d d        y # 1 sw Y   y xY w)Nz`radius` is `None`. *matchrZ   )pytestr   rG   r   rc   rh   s    r   test_old_radius_api_errorz.TestSphericalVoronoi.test_old_radius_api_error   s4    ]]:-DE 	7T[[6	7 	7 	7s	   =Ac                     t        | j                        }|j                  }|j                          t	        t        |j                        t        |             y N)r   rc   rw   sort_vertices_of_regionsr   sorted)ri   svunsorted_regionss      r   test_sort_vertices_of_regionsz2TestSphericalVoronoi.test_sort_vertices_of_regions   s?    dkk*::
##%VBJJ'0@)ABr   c                 P   t        g dg dg dg dg dg dg dg dg      }t        t        j                  t        |             }t	        | j
                        }|j                          t        t        j                  t        |j                               }t        ||       y )	N)r         rC   r   )rC   r   
            )r   r      r   )r   r   r   r   r   )	   r   r   )rC   r   r   )r   r   r   r   r   )r   r   r   r   r   )	r   r   r   chainr   rc   r   rw   r   )ri   expectedr   actuals       r   'test_sort_vertices_of_regions_flattenedz<TestSphericalVoronoi.test_sort_vertices_of_regions_flattened   s    ?,@,*K+-=? @ 	)9:;dkk*
##%ioovbjj'9:;68,r   c                     t        j                  g dg dg dg dg dg      }t        j                  t        d      5  t        |      }|j                          d d d        y # 1 sw Y   y xY w)N)r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   )      ?r   r   r   zthree-dimensionalr   )r   r   r   r   	TypeErrorr   r   )ri   rc   r   s      r   ,test_sort_vertices_of_regions_dimensionalityzATestSphericalVoronoi.test_sort_vertices_of_regions_dimensionality   s_    <'''/	1 2
 ]]9,?@ 	*!&)B'')	* 	* 	*s    A%%A.c                     t        | j                        }| j                  j                  d   dz  dz
  }|j                  j                  d   }t	        ||       y )Nr   rC   r   )r   rc   shaperx   r   )ri   r   r   r   s       r   test_num_verticesz&TestSphericalVoronoi.test_num_vertices   sN     dkk*;;$$Q'!+a/""1%VX&r   c           	      n   t        | j                        }|j                  D ]  }t        j                  |j                  t        j                  |g            }t        j                  t        |      dd       }t        |d   |d   dt        |             t        |d   |d   dt        |              y )Nr   r   r   r   rC   )
r   rc   rx   r	   cdistr   r   r   r   str)ri   r   vertex	distancesclosests        r   test_voronoi_circlesz)TestSphericalVoronoi.test_voronoi_circles   s    dkk*kk 	HF ryy"((F82DEIhhvi0156G
GAJ3v;G
GAJ3v;G		Hr   c                     t        j                  | j                  | j                  f      | _        t	        t
              5  t        | j                         d d d        y # 1 sw Y   y xY wr   )r   r%   rc   
degenerateassert_raisesrG   r   rh   s    r   test_duplicate_point_handlingz2TestSphericalVoronoi.test_duplicate_point_handling   sJ     ..$++t{{)CD:& 	.T__-	. 	. 	.s    AA(c                 z    t        t              5  t        | j                  d       d d d        y # 1 sw Y   y xY w)Ng\(\?r   r   rG   r   rc   rh   s    r   test_incorrect_radius_handlingz3TestSphericalVoronoi.test_incorrect_radius_handling   s/     :& 	7T[[6	7 	7 	7s   1:c                 ~    t        t              5  t        | j                  g d       d d d        y # 1 sw Y   y xY w)N)g?r   r   rm   r   rh   s    r   test_incorrect_center_handlingz3TestSphericalVoronoi.test_incorrect_center_handling   s/     :& 	>T[[=	> 	> 	>s   3<rY   rC   r   shiftFTc                    d}t        ||d      }t        j                  |d d df         |d d df<   t        j                  |      dz   |z  }t	        ||z   |      }t        j
                  d|j                  |z
  |j                  |j                  d d df      |z
        }t        j                  t        j                  |dd            }t        j                  |      t        j                  dz  kD  sJ y )	Nr   r   r]   r   rm   zij,ij->ir   rC   )rd   r   absaranger   einsumrx   rc   
_simplicesarccosclipmaxrJ   )	ri   rY   r   rT   rc   rn   r   dotscircumradiis	            r   test_single_hemisphere_handlingz4TestSphericalVoronoi.test_single_hemisphere_handling   s     3Q/vvfQTl+q!t))C.1$-fvof=yyR[[6%9%'YYr}}QT/B%Cf%LNiib! 45vvk"RUUQY...r   rT   )r   rC   r   c                 4   t        j                  |      dz   |z  }t        ||dz
  d      }t        j                  |t        j                  |df      g      }t        j                  t        d      5  t        ||z   |       d d d        y # 1 sw Y   y xY w)Nr   r   r]   zRank of input pointsr   rm   )	r   r   rd   hstackzerosr   r   rG   r   )ri   rT   rY   r   rn   rc   s         r   test_rank_deficientz(TestSphericalVoronoi.test_rank_deficient   s     ))C.1$-373FBHHaV$456]]:-CD 	=Vf_V<	= 	= 	=s   4BBc           	         d}t        ||d      }t        |      }|j                  j                  d   |k(  sJ t	        |j
                        |k(  sJ g }t        j                  |j                        }t        d|dz         D ]  }g }t        j                  t        |      |      D ]#  }	|j                  |d d t        |	      f          % t        j                  t        j                  |      d      }|j                  t	        |              dd|dz
  z  z   }
t!        t#        |      D cg c]  \  }}d|z  |z   c}}      }|
|k(  sJ y c c}}w )Nd   r   r]   r   r,   r   )rd   r   rx   r   lenrw   r   sortr   r.   r   combinationsappendr   uniquer%   sum	enumerate)ri   rY   rT   rc   r   cell_counts	simplicesr1   cellsindicesexpected_eulereactual_eulers                r   test_higher_dimensionsz+TestSphericalVoronoi.test_higher_dimensions   s=   3Q/f%{{  #s***2::!### GGBMM*	q#'" 	+AE$11%*a@ :Yq$w-'789:IIbnnU3!<Es5z*	+ bCE]*Ik4JKDAqR!GaKKL--- Ls   2E
c           	      p   t        j                  t        j                  |       t        j                  |      f      }t        |      }t	        |j
                  D cg c]  }t        |      d|dz
  z  k(   c}      sJ t        j                  t        t        j                  ddg|                  }|j                  t         j                        t        j                  |      z  }t        j                  |j                   |      }t#        |      }||   j%                         t&        k  sJ y c c}w )NrC   r   r   r   )r   r%   eyer   allrw   r   rK   r   r   r   astypefloat64sqrtr	   r   rx   r
   r   TOL)ri   rY   rc   r   r   r   distress           r   test_cross_polytope_regionsz0TestSphericalVoronoi.test_cross_polytope_regions  s     "&&+rvvc{ ;<f%BJJ?qCFa#'l*?@@@ 99T)"3"3RGC"HIJ??2::.= ~~bkk84#D)Cy}}$$$ @s   D3c                    t        j                  t        t        j                  ddg|                  }|j                  t         j                        t        j                  |      z  }t        |      }t        j                  t        j                  |       t        j                  |      f      }t        j                  |j                  |      }t        |      }||   j                         t         k  sJ y )Nr   r   r   )r   rK   r   r   r   r   r   r   r   r%   r   r	   r   rx   r
   r   r   )ri   rY   rc   r   r   r   r   s          r   test_hypercube_regionsz+TestSphericalVoronoi.test_hypercube_regions  s     4	 1 12q'# FGHrzz*RWWS\9f% >>BFF3K<"=> ~~bkk84#D)Cy}}$$$r   r   i  r   rZ   )r   r   rC   single_hemispherec                 4   t        ||d      }|r#t        j                  |d d df         |d d df<   t        j                  |      dz   |z  }||z  |z   }t	        |||      }|j                         }	t        |	j                         t        ||             y )Nr   r]   r   rZ   rn   )	rd   r   r   r   r   calculate_areasr   r   r[   )
ri   rT   rY   rZ   r   r   rc   rn   r   areass
             r   test_area_reconstitutionz-TestSphericalVoronoi.test_area_reconstitution*  s      3Q/ 66&A,/F1a4L))C.1$-&6)fVFC""$EIIK):3)GHr   poly)r4   r=   r>   r?   r@   rA   rB   c                     t        |      }|j                  \  }}t        |      }|j                         }t	        |t        |d      |z         y )Nr   )rW   r   r   r   r   r[   )ri   r   rc   rT   rY   r   r   s          r   test_equal_area_reconstitutionz3TestSphericalVoronoi.test_equal_area_reconstitution>  sJ     $D)3f%""$E#4S!#<q#@Ar   c                    d}t        j                  t        j                  |       t        j                  |      f      }t        |      }t	        j
                  t        d      5  |j                          d d d        y # 1 sw Y   y xY w)Nr   zOnly supportedr   )r   r%   r   r   r   r   r   r   )ri   rY   rc   r   s       r   test_area_unsupported_dimensionz4TestSphericalVoronoi.test_area_unsupported_dimensionH  sf    "&&+rvvc{ ;<f%]]9,<= 	! 	! 	! 	!s   'BB
r   r   rn   )Nrl   )r   g       @g      @c                 p   || j                   z  }|||z  }t        |||      }|j                   j                  t        j                  t        j                        u sJ |j
                  j                  t        j                  t        j                        u sJ t        |j                  t              sJ y )Nr   )	rc   r   dtyper   r   rn   
isinstancerZ   float)ri   rZ   rn   rc   r   s        r   test_attribute_typesz)TestSphericalVoronoi.test_attribute_typesO  s     $++%fFfVFCyy"((2::"6666yy"((2::"6666"))U+++r   c                 j   t        | j                        }t        |j                  d   d         }|j                  D ]  }t	        |t
              rJ  |j                          t        |j                  d   d         |k(  sJ |j                          t        |j                  d   d         |k(  sJ y )Nr   )r   rc   typerw   r   r   r   )ri   r   r   regions       r   test_region_typesz&TestSphericalVoronoi.test_region_types[  s     dkk*RZZ]1%&jj 	,Ffd+++	,
##%BJJqM!$%...
##%BJJqM!$%...r   N)__name__
__module____qualname__rj   ru   r{   r   r   r   r   r   r   r   r   r   r   r   markparametrizer.   r   r   r   r   r   r   r   r   r   r   r   r   r   rf   rf   `   s   

#0:67C-*	'H.7> [[UE!QK0[[Wudm4	/ 5 1	/ [[S*-[[UE!QK0[[Wudm4= 5 1 .= [[UE!QK0. 1.( [[UE!QK0% 1%$ [[UE!QK0% 1%" [[S2s),[[UQF+[[X{3[[Wudm4[[05$-@I A 5 4 , -
I [[V &E FBFB! [[X2w/[[X'FG, H 0,/r   rf   r   )numpyr   r   numpy.testingr   r   r   r   r   r   r   scipy.spatialr   r	   scipy.optimizer
   scipy.constantsr   r$   scipy.specialr   r   r   r    r"   r*   r2   rW   r[   rd   rf   r   r   r   <module>r      sh     6 6  * 4 0 )  HA:
,$E84E
F/ F/r   