
    -ioE                        S SK r S SKJr  S SKrS SKrS SKJr  S SKJ	r	  S SK
JrJr  S SKJr  S SKJr  S SKJrJrJr  S S	KJrJr  S S
KJrJr  S SKJr  S SKJr  S SKJ r J!r!  S SK"J#r#  S SK$J%r%J&r&J'r'J(r(J)r)  S SK$J*r+   S SK,J-r-  Sr.\R`                  Rc                  \.(       + SS9r2\Rf                  " / SQ/ SQ/ SQ/5      r4Sr5\4Rl                  u  r7r8\" \5\4SSS9u  r9r:S9S jr;\R`                  Ry                  S\%5      S 5       r=\R`                  Ry                  S S!S"\R|                  " S#\2S$9/5      \R`                  Ry                  S%\R~                  \R                  /5      S:S& j5       5       rA\R`                  Ry                  S'S/\'Q5      \R`                  Ry                  S S!S"\R|                  " S#\2S$9/5      \R`                  Ry                  S%\R~                  \R                  45       S;S( j5       5       5       rBS) rC\R`                  Ry                  S'S/\'Q5      S;S* j5       rD\R`                  Rc                  \.(       + SS9\R`                  Ry                  S%\R~                  \R                  45      \R`                  Ry                  S\%5      S;S+ j5       5       5       rE\R`                  Rc                  \.(       + SS9\R`                  Ry                  S%\R~                  \R                  45      S;S, j5       5       rFS;S- jrGS;S. jrHS/ rIS0 rJS1 rK\R`                  Ry                  S S!S"\R|                  " S#\2S$9/5      \R`                  Ry                  S%\R~                  \R                  /5      S2 5       5       rL\R`                  Rc                  \.S3S9S4 5       rM\R`                  Ry                  S5/ S6Q5      \R`                  Ry                  S7\'5      S8 5       5       rNg! \/ a    Sr. GNcf = f)<    N)Mock)sparse)eigh)eigshlobpcg)KMeans)
make_blobs)SpectralEmbedding_spectral_embeddingspectral_embedding)_graph_connected_component_graph_is_connected)normalized_mutual_info_scorepairwise_distances
rbf_kernel)NearestNeighbors)assert_array_almost_equalassert_array_equal)_deterministic_vector_sign_flip)COO_CONTAINERSCSC_CONTAINERSCSR_CONTAINERSparse_version
sp_version)	laplacian)smoothed_aggregation_solverTFz1PyAMG is required for the tests in this function.)reason)              @r   r   r   )r   r   g      @r   r   )      ?r   r   r    r!     r!   *   )	n_samplescenterscluster_stdrandom_statec                     US-  n[        U R                  UR                  5       HG  u  pE[        R                  " XE-
  S-  5      U::  a  M&  [        R                  " XE-   S-  5      U::  a  MG   e   g)zHCheck array A and B are equal with possible sign flipping on
each column   N)zipTnpmax)ABtoltol_squaredA_colB_cols         a/var/www/html/venv/lib/python3.13/site-packages/sklearn/manifold/tests/test_spectral_embedding.py _assert_equal_with_sign_flippingr5   8   sa     q&KACCFFEMa'(K7vvu}*+{:	
; &    coo_containerc                    [         R                  R                  S5      nSnSSSSU/nUR                  U5      n/ n[        R
                  " U5       H  u  pgXFU n[        [        U5      S-
  5       H  n	UR                  X   XS-      45        M     S[        U5      S-
  pSnUR                  XUS9nUR                  XUS9nUR                  [        X   X   5      5        M     [        [         R                  " U5      R                  5      u  nnUR                  S	S[        U5      S9nU " UUU445      nS
UUR                  -   -  n[        R
                  " U5       H`  u  pg[!        UXF   5      nXv-
  nUR#                  5       U:X  d   e[!        UXGS-
     5      nUR#                  5       U:X  d   e[%        UU5        Mb     g )Nr#   i,  r   y         r"   )size皙?      ?)r,   randomRandomStatepermutation	itertoolspairwiserangelenappendrandintextendr*   tuplearrayr+   uniformr   sumr   )r7   rngr$   
boundariespconnectionsstartstopgroupimin_idxmax_idxn_random_connectionssourcetargetrow_idx
column_idxdataaffinitycomponent_1component_sizecomponent_2s                         r4   %test_sparse_graph_connected_componentra   C   s   
))


#CIRc9-J	"AK ))*5 s5zA~&A%A,78 ' c%j1n#W4HIW4HI3u}em<= 6   5 7 78GZ;;sBS%5;6DdWj$9:;Hh+,H ))*5018D N222 11AX;G N222;4 6r6   eigen_solverarpackr   amg)marksdtypec                 0   [         R                  R                  U5      nSn[         R                  " US-  US-  /S9n[         R                  " UR                  XD5      5      S-   USU2SU24'   [         R                  " UR                  XD5      5      S-   XTS 2US 24'   [        US5      nUS U R                  5       (       d   eXdS  R                  5       (       a   e[        US5      nUS U R                  5       (       a   eXdS  R                  5       (       d   eSUSUS-   4'   SXTS-   S4'   SUR                  S S SU-  S-   2'   SXUR                  -   -  n[         R                  " SU-  S9nSUSU& [        SS[         R                  R                  U5      U S	9nUR                  UR                  U5      5      n	[         R                  " U	R                  5       S:  [         R                   S
9n
[#        Xz5      [$        R&                  " S5      :X  d   eg )Nd   r)   shaper   r;   r>   precomputedn_componentsr]   r'   rb   rf   r!   )r,   r?   r@   zerosabsrandnr   allanyflatr+   r
   fit_transformastyperJ   ravelint64r   pytestapprox)rb   rf   seedr'   n_sampler]   	component
true_label
se_precompembedded_coordinatelabel_s              r4   &test_spectral_embedding_two_componentsr   o   s    99((.LHxxx!|X\:;H 	|!!(56: QxZ8#$
 	|!!(56: Z#$
 +8Q7IYh##%%%%#''))))*8R8I(#''))))Y##%%%% !"HQ1_ !H\1_)*HMM%Q\A%%&h+,HH-JJq"YY**40!	J %228??53IJXX)//1A5RXXFF'
;v}}S?QQQQr6   sparse_containerc                    SnU c  [         OU " [         5      n[        SS[        R                  R	                  U5      US9n[        SSU[        R                  R	                  U5      US9nUR                  [        UR                  U5      US95      nUR                  UR                  U5      5      n	[        UR                  UR                  5        [        XS5        g )	Nr!   r)   rl   rm   rbf)rn   r]   gammar'   rb   r   皙?)Sr
   r,   r?   r@   rv   r   rw   r   affinity_matrix_r5   )
r   rb   rf   r|   r   Xr   se_rbfembed_precomp	embed_rbfs
             r4   ,test_spectral_embedding_precomputed_affinityr      s     E%+;A+>A"YY**40!	J YY**40!F ,,Zu-UVM$$QXXe_5Ij996;R;RS$]tDr6   c                     Sn / nS Hk  n[        X-   S9R                  [        5      nUR                  [        SS9n[	        SSSU S9R                  U5      R
                  nUR                  U5        Mm     [        US   US	   5        g )
Nr)   )r   
   )n_neighborsconnectivity)moder   precomputed_nearest_neighbors)r'   rn   r]   r   r;   )r   fitr   kneighbors_graphr
   
embedding_rF   r   )r   resultsadditional_neighborsnngraph	embeddings         r4   ,test_precomputed_nearest_neighbors_filteringr      s    KG '+*LMQQRST##AN#;8'	 SZZ 	 	y! !( wqz71:.r6   c                   ^ Sm[        [        TS9nU c  [        OU " [        5      n[        SU4S jT[        R                  R                  U5      S9n[        SST[        R                  R                  U5      S9nUR                  U5      nUR                  U5      n[        UR                  UR                  5        [        X%R                  5        [        XgS5        g )Ng?r   r)   c                    > [        U TS9$ )Nr   r   )xr   s    r4   <lambda>;test_spectral_embedding_callable_affinity.<locals>.<lambda>   s    Jq6r6   )rn   r]   r   r'   r   r   )
r   r   r
   r,   r?   r@   rv   r   r   r5   )	r   r|   kernr   se_callabler   r   embed_callabler   s	           @r4   )test_spectral_embedding_callable_affinityr      s     Eau%D%+;A+>A#6YY**40	K YY**40	F $$Q'I ..q1Nk::F<S<STd$;$;<$YEr6   c           	      4   [        SSSS[        R                  R                  U5      S9n[        SSSS[        R                  R                  U5      S9nUR	                  [
        R                  U 5      5      nUR	                  [
        R                  U 5      5      n[        XVS5        [        R                  " / SQ[        R                  S	9n[        R                  " / S
Q[        R                  S	9n[        R                  " / SQ[        R                  S	9n	U" [        R                  " X/5      [        R                  " Xx/5      [        R                  " X/5      44SS9n
SUl        SUl        UR	                  U
R                  U 5      5      nUR	                  U
R                  U 5      5      n[        XVS5        U
R                  5       n
U
R                  R                  [        R                  5      U
l        U
R                  R                  [        R                  5      U
l        [         [#        S5      :  nU(       a  UR	                  U
5        g Sn[$        R&                  " [(        US9   UR	                  U
5        S S S 5        g ! , (       d  f       g = f)Nr)   nearest_neighborsrd      )rn   r]   rb   r   r'   rc   gh㈵>)r   r   r;   r)      r      ro   )r;   r)   r)   r   r   r   r   )rh   rh   rh   r;   rh   rh   rh   )   r   ri   rl   z1.11.3z=Only sparse matrices with 32-bit integer indices are acceptedmatch)r
   r,   r?   r@   rv   r   rw   r5   rJ   int32ry   hstackr]   tocsrindptrindicesr   r   rz   raises
ValueError)rf   r7   r|   se_amg	se_arpack	embed_amgembed_arpackrowcolvalr]   *scipy_graph_traversal_supports_int64_indexerr_msgs                r4   "test_spectral_embedding_amg_solverr      s    $YY**40F "$YY**40I $$QXXe_5I**188E?;L$YdC
 (((
9C
(((
9C
((4BHH
EC	C:	C:!6		3*8M NOH $FO&I$$X__U%;<I**8??5+ABL$YdC
 ~~Hoo,,RXX6HO''..rxx8H 2<}X?V1V.1X&Q]]:W5  * 655s   .J		
Jc                 V   Sn[         R                  " X"SUS9nUR                  U 5      n[         R                  " U5      [         R                  " UR                  5       5      -
  nXDR                  -   n[        USSSS9n[        S5       H  n[        USSUS	-   S9n[        XhS
S9  M     g )Nrh   r=   )densityr'   r   rd   r   )rn   rb   r'   r   r;   r   )r0   )
r   randrw   triudiagsdiagonalr+   r   rD   r5   )	rf   r|   	num_nodesr   upper
sym_matrixr   rT   new_embeddings	            r4   *test_spectral_embedding_amg_solver_failurer   3  s     II#DIA	AKKNV\\!**,77EJ"%aI
 1X*Re!a%
 	)tL	 r6   c                 D   [         R                  R                  U 5      n[        [        SUS9n[        [        SSUS9nX#4 H[  n[        [        USS9nUR                  UR                  [        5      5        [        [        UR                  [        5      SS	5        M]     g )
Nr   )rn   r]   r'   r   r   )rn   r]   r   r'   r   )
n_clustersr'   n_initr!   r)   )r,   r?   r@   r
   r   r   r   rv   r   r   r   labels_true_labels)r|   r'   r   se_knnsekms         r4   !test_pipeline_spectral_clusteringr   J  s    99((.L%lF $!	F zRP
r"#!([A3	
 r6   c                    [         R                  " / SQ/ SQ/ SQ/ SQ/ SQ/5      n[        U5      (       a   e[         H  n[        U" U5      5      (       d  M   e   [         H  n[        U" U5      5      (       d  M   e   [         R                  " / SQ/ SQ/ SQ/ SQ/ SQ/5      n[        U5      (       d   e[         H  n[        U" U5      5      (       a  M   e   [         H  n[        U" U5      5      (       a  M   e   g )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;   r;   r;   r   r   )r,   rJ   r   r   r   )r|   r   csr_containercsc_containers       r4   test_connectivityr   ^  s    HH	
E #5))))'&}U';<<<< ('&}U';<<<< ( HH	
E u%%%%'"=#78888 ('"=#78888 (r6   c                      [         R                  R                  S5      n U R                  SS5      n[	        U5      n[        U5      n[        U5      n[        X45        g )N$   r      )r,   r?   r@   rr   r   r   r   )r'   r\   simsembedding_1embedding_2s        r4   %test_spectral_embedding_deterministicr     sN    99((,Lb"%DdD$T*K$T*Kk7r6   c                  *   [         R                  R                  S5      n U R                  SS5      n[	        U5      nSn[        USUSS9n[        USSS9u  pV[        U5      u  pxUR                  S U n	[        U	5      R                  n	[        XI5        g )	Nr   r   r      F)norm_laplacianrn   
drop_firstT)normedreturn_diag)r,   r?   r@   rr   r   r   csgraph_laplacianr   r+   r   r   )
r'   r\   r   rn   r   r   dd_diffusion_mapr   s
             r4   $test_spectral_embedding_unnormalizedr     s     99((,Lb"%DdDL$U%K
 &d5dKMIIA//-<0K1+>@@Kk7r6   c            	      r   [         R                  R                  S5      n U R                  SS5      n[	        U5      nSn[        S5       Hj  n[        USUSUS9n[         R                  " US S 2S4   5      [        R                  " S5      :X  d   e[         R                  " US S 2S4   5      S	:  a  Mj   e   g )
Nr   r   r   r)   F)r   rn   r   r'   r   r;   gMbP?)
r,   r?   r@   rr   r   rD   r   stdrz   r{   )r'   r\   r   rn   r|   r   s         r4   *test_spectral_embedding_first_eigen_vectorr     s     99((,Lb"%DdDLb	& %
	 vvi1o&&--*::::vvi1o&--- r6   c                     [         R                  U5      n[        SSU SS9nUR                  U5      nUR                  U:X  d   eUR
                  R                  U:X  d   eUR                  R                  U:X  d   eg)aD  Check that `SpectralEmbedding is preserving the dtype of the fitted
attribute and transformed data.

Ideally, this test should be covered by the common test
`check_transformer_preserve_dtypes`. However, this test only run
with transformers implementing `transform` while `SpectralEmbedding`
implements only `fit_transform`.
r)   r   r   )rn   r]   rb   r'   N)r   rw   r
   rv   rf   r   r   )rb   rf   r   r   X_transs        r4   'test_spectral_embedding_preserves_dtyper     s{    $ 	
A	\PQ
B q!G==E!!!==%'''$$---r6   z7PyAMG is installed and we should not test for an error.c                      [        SSSS9n Sn[        R                  " [        US9   U R	                  [
        5        S S S 5        g ! , (       d  f       g = f)Nr)   r   rd   )rn   r]   rb   z>The eigen_solver was set to 'amg', but pyamg is not available.r   )r
   rz   r   r   rv   r   )r   r   s     r4   test_error_pyamg_not_availabler     sG    
 #J
 OG	z	1  # 
2	1	1s   A
Asolver)rc   rd   r   r   c                    US:X  a!  [         (       d  [        R                  " S5        [        SSSS/SS//SS9u  p4[	        U5      n[
        R                  " U5      U-
  nUS	:X  a  [        O[        nUS	:X  a  SOS
nUS:X  a  U" U5      n[        US9n	U R                  [        UR                  U	5        [        USUSS9  U	R                  5         U	R                  u  pJU
S   U:X  d   eg
)z2Test that `eigen_tol="auto"` is resolved correctlyrd   zPyAMG is not available.r:   r   r;   rk   g{Gz?)r$   r'   r%   r&   rc   N)side_effectr#   auto)r'   rb   	eigen_tolr0   )pyamg_availablerz   skipr	   r   r,   r-   r   r   r   setattrr   __qualname__r   assert_called	call_args)monkeypatchr   r   r   r   Dr   solver_funcdefault_valuemocked_solverkwargss              r4   test_spectral_eigen_tol_autor    s     -.AAR/AtDA 	1A
q	AA!X-%6K8+AM![1M+[-E-E}Uqr&Q!''IA%=M)))r6   )r   )r   )r   )OrB   unittest.mockr   numpyr,   rz   scipyr   scipy.linalgr   scipy.sparse.linalgr   r   sklearn.clusterr   sklearn.datasetsr	   sklearn.manifoldr
   r   r   $sklearn.manifold._spectral_embeddingr   r   sklearn.metricsr   r   sklearn.metrics.pairwiser   sklearn.neighborsr   sklearn.utils._testingr   r   sklearn.utils.extmathr   sklearn.utils.fixesr   r   r   r   r   r   r   pyamgr   r   ImportErrormarkskipifskip_if_no_pyamgrJ   r%   r$   rj   r   
n_featuresr   r   r5   parametrizera   paramfloat32float64r   r   r   r   r   r   r   r   r   r   r   r   r   r   r6   r4   <module>r      s         - " ' W W M / . P A  ?1O ;;%% S &  
 ((!!! 	  
Jc;

 .9$5 :$5V U"23 2::rzz":;)R <)RX +d-D^-DEU"23 2::rzz":;02E < FE4/, +d-D^-DEF FF2  S   2::rzz":;.93+ : <
3+l  S   2::rzz":;M <M&
(9B88(.* U"23 2::rzz":;. <.( D  $	$ #>?.9* : @*{  Os   <O O('O(