
    MpjN                        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)J*r*J+r+  S SK$J,r-   S SK.J/r/  Sr0\Rd                  Rg                  \0(       + SS9r4\Rj                  " / SQ/ SQ/ SQ/5      r6Sr7\6Rp                  u  r9r:\" \7\6SSS9u  r;r<S;S jr=\Rd                  R}                  S\%5      S 5       r?\Rd                  Rg                  \0(       + SS9S  5       r@\Rd                  R}                  S!S"S#\R                  " S$\4S%9/5      \Rd                  R}                  S&\R                  \R                  /5      S<S' j5       5       rD\Rd                  R}                  S(S/\'Q5      \Rd                  R}                  S!S"S#\R                  " S$\4S%9/5      \Rd                  R}                  S&\R                  \R                  45       S=S) j5       5       5       rES* rF\Rd                  R}                  S(S/\'Q5      S=S+ j5       rG\Rd                  R}                  S&\R                  \R                  45      S, 5       rH\Rd                  Rg                  \0(       + SS9\Rd                  R}                  S&\R                  \R                  45      \Rd                  R}                  S\%5      S=S- j5       5       5       rI\Rd                  Rg                  \0(       + SS9\Rd                  R}                  S&\R                  \R                  45      S=S. j5       5       rJS=S/ jrKS=S0 jrLS1 rMS2 rNS3 rO\Rd                  R}                  S!S"S#\R                  " S$\4S%9/5      \Rd                  R}                  S&\R                  \R                  /5      S4 5       5       rP\Rd                  Rg                  \0S5S9S6 5       rQ\Rd                  R}                  S7/ S8Q5      \Rd                  R}                  S9\'5      S: 5       5       rRg! \1 a    Sr0 GNf = 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_sparse_diags_array_sparse_random_array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#   d   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         j/var/www/html/pdf-tiff/venv/lib/python3.13/site-packages/sklearn/manifold/tests/test_spectral_embedding.py _assert_equal_with_sign_flippingr7   :   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         i  )size皙?      ?)r.   randomRandomStatepermutation	itertoolspairwiserangelenappendrandintextendr,   tuplearrayr-   uniformr   sumr   )r9   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                         r6   %test_sparse_graph_connected_componentrc   E   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 6r8   c                  t   [         R                  R                  S5      n U R                  SS5      n[	        U5      n[
        R                  " [        SS9   [        USSS9nS S S 5        [
        R                  " [        S	S9   [        USS
S9nS S S 5        g ! , (       d  f       N<= f! , (       d  f       g = f)N$   
      zdense matricesmatchamgr=   )eigen_solvern_componentszsmall graphs   )	r.   rA   rB   randnr   pytestwarnsRuntimeWarningr   )r)   r^   sims_s       r6   test_fallback_amgrt   m   s     99((,Lb"%DdD 
n,<	=t%aH 
>
 
nN	;t%aH 
<	; 
>	=
 
<	;s   BB)
B&)
B7rk   arpackr   rj   )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 )Nr$   r+   shaper   r=   r@   precomputedrl   r_   r)   rk   rw   r#   )r.   rA   rB   zerosabsrn   r   allanyflatr-   r
   fit_transformastyperL   ravelint64r   ro   approx)rk   rw   seedr)   n_sampler_   	component
true_label
se_precompembedded_coordinatelabel_s              r6   &test_spectral_embedding_two_componentsr      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Qr8   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+   r|   r}   rbf)rl   r_   gammar)   rk   r   皙?)Sr
   r.   rA   rB   r   r   r   r   affinity_matrix_r7   )
r   rk   rw   r   r   Xr   se_rbfembed_precomp	embed_rbfs
             r6   ,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Dr8   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 )Nrf   )r   rf   )n_neighborsdistance)moder   r+   precomputed_nearest_neighbors)r)   rl   r_   r   r=   )r   fitr   kneighbors_graphr
   
embedding_rH   r   )r   resultsadditional_neighborsnngraph	embeddings         r6   ,test_precomputed_nearest_neighbors_filteringr      s    KG '+*LMQQRST##AJ#78'	 SZZ 	 	y! !( wqz71:.r8   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    r6   <lambda>;test_spectral_embedding_callable_affinity.<locals>.<lambda>   s    Jq6r8   )rl   r_   r   r)   r   r   )
r   r   r
   r.   rA   rB   r   r   r   r7   )	r   r   kernr   se_callabler   r   embed_callabler   s	           @r6   )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Er8   c           	      T   [        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[        XES5        g )Nr+   r   r   h㈵>rl   r_   rk   	eigen_tolr)   ru   r   )r
   r.   rA   rB   r   r   r   r7   )rw   global_random_seed	se_lobpcg	se_arpackembed_lobpcgembed_arpacks         r6   %test_spectral_embedding_lobpcg_solverr     s     "YY**+=>I "YY**+=>I **188E?;L**188E?;L$\Fr8   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+   r   rj   r   r   ru   r   )r   r   r=   r+      r      r~   )r=   r+   r+   r   r   rm   rm   )r$   r$   r$   r=   r$   r$   r$   )   r   ry   r|   z1.11.3z=Only sparse matrices with 32-bit integer indices are acceptedrh   )r
   r.   rA   rB   r   r   r   r7   rL   int32r   hstackr_   tocsrindptrindicesr   r   ro   raises
ValueError)rw   r9   r   se_amgr   	embed_amgr   rowcolvalr_   *scipy_graph_traversal_supports_int64_indexerr_msgs                r6   "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                 ,   Sn[        X"4SUS9nUR                  U 5      n[        R                  " U5      [	        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 )Nr$   r?   )densityr)   rf   rj   r   )rl   rk   r)   r   r=   r   )r2   )
r   r   r   triur   diagonalr-   r   rF   r7   )	rw   r   	num_nodesr   upper
sym_matrixr   rV   new_embeddings	            r6   *test_spectral_embedding_amg_solver_failurer   e  s     Ii3StTA	AKKN0>>EJ"%aI
 1X*Re!a%
 	)tL	 r8   c                 P   [         R                  R                  U 5      n[        [        S-
  SUS9n[        [        S-
  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=   r   )rl   r_   r)   nearest_neighborsrm   )rl   r_   r   r)   rf   )
n_clustersr)   n_initr#   r+   )r.   rA   rB   r
   r   r   r   r   r   r   r   labels_true_labels)r   r)   r   se_knnsekms         r6   !test_pipeline_spectral_clusteringr   |  s     99((.L!^e,F !^$!	F zRP
r"#!([A3	
 r8   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.   rL   r   r   r   )r   r   csr_containercsc_containers       r6   test_connectivityr     s    HH	
E #5))))'&}U';<<<< ('&}U';<<<< ( HH	
E u%%%%'"=#78888 ('"=#78888 (r8   c                      [         R                  R                  S5      n U R                  SS5      n[	        U5      n[        U5      n[        U5      n[        X45        g )Nre   rf   rg   )r.   rA   rB   rn   r   r   r   )r)   r^   rr   embedding_1embedding_2s        r6   %test_spectral_embedding_deterministicr     sN    99((,Lb"%DdD$T*K$T*Kk7r8   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 )	Nre   rf   rg      F)norm_laplacianrl   
drop_firstT)normedreturn_diag)r.   rA   rB   rn   r   r   csgraph_laplacianr   r-   r   r   )
r)   r^   rr   rl   r   r   ddrs   diffusion_mapr   s
             r6   $test_spectral_embedding_unnormalizedr     s     99((,Lb"%DdDL$U%K
 &d5dKMIIA//-<0K1+>@@Kk7r8   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 )
Nre   rf   rg   r+   F)r   rl   r   r)   r   r=   gMbP?)
r.   rA   rB   rn   r   rF   r   stdro   r   )r)   r^   rr   rl   r   r   s         r6   *test_spectral_embedding_first_eigen_vectorr     s     99((,Lb"%DdDLb	& %
	 vvi1o&&--*::::vvi1o&--- r8   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   )rl   r_   rk   r)   N)r   r   r
   r   rw   r   r   )rk   rw   r   r   X_transs        r6   'test_spectral_embedding_preserves_dtyper     s{    $ 	
A	\PQ
B q!G==E!!!==%'''$$---r8   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   rj   )rl   r_   rk   z>The eigen_solver was set to 'amg', but pyamg is not available.rh   )r
   ro   r   r   r   r   )r   r   s     r6   test_error_pyamg_not_availabler     sG    
 #J
 OG	z	1  # 
2	1	1s   A
Asolver)ru   rj   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 correctlyrj   zPyAMG is not available.r<   r   r=   r{   g{Gz?)r&   r)   r'   r(   ru   N)side_effectr%   auto)r)   rk   r   r2   )pyamg_availablero   skipr	   r   r.   r/   r   r   r   setattrr   __qualname__r   assert_called	call_args)monkeypatchr   r   r   rs   Dr   solver_funcdefault_valuemocked_solverkwargss              r6   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)))r8   )r!   )r   )re   )SrD   unittest.mockr   numpyr.   ro   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   r   r   pyamgr   r  ImportErrormarkskipifskip_if_no_pyamgrL   r'   r&   rz   r   
n_featuresr   r   r7   parametrizerc   rt   paramfloat32float64r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r8   r6   <module>r*     se         - " ' W W M / . P A   ?1O ;;%% S &  
 ((!!! 	  
Jc;

 .9$5 :$5N  S  II( 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 2::rzz":;G <G0  S   2::rzz":;.97+ : <
7+t  S   2::rzz":;M <M&
09B88(.* U"23 2::rzz":;. <.( D  $	$ #>?.9* : @*c  Os    P= =Q	Q	