
    Q3jN              
          d dl Z d dlmZ d dlZd dlZd dlm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mZmZ d d	lmZmZ d d
lmZmZ d dlmZ d dlmZ d dlm Z m!Z! d dl"m#Z# d dl$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ d dl$m,Z- 	 d dl.m/Z/ dZ0ejd                  jg                  e0 d      Z4 ejj                  g dg dg dg      Z6dZ7e6jp                  \  Z9Z: ee7e6dd      \  Z;Z<d;dZ=ejd                  j}                  de%      d        Z?ejd                  jg                  e0 d      d         Z@ejd                  j}                  d!d"d# ej                  d$e4%      g      ejd                  j}                  d&ej                  ej                  g      d<d'              ZDejd                  j}                  d(dge'      ejd                  j}                  d!d"d# ej                  d$e4%      g      ejd                  j}                  d&ej                  ej                  f      	 d=d)                     ZEd* ZFejd                  j}                  d(dge'      d=d+       ZGejd                  j}                  d&ej                  ej                  f      d,        ZHejd                  jg                  e0 d      ejd                  j}                  d&ej                  ej                  f      ejd                  j}                  de%      d=d-                     ZIejd                  jg                  e0 d      ejd                  j}                  d&ej                  ej                  f      d=d.              ZJd=d/ZKd=d0ZLd1 ZMd2 ZNd3 ZOejd                  j}                  d!d"d# ej                  d$e4%      g      ejd                  j}                  d&ej                  ej                  g      d4               ZPejd                  jg                  e0d5      d6        ZQejd                  j}                  d7g d8      ejd                  j}                  d9e'      d:               ZRy# e1$ r dZ0Y w xY w)>    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                     |dz  }t        | j                  |j                        D ]D  \  }}t        j                  ||z
  dz        |k  r%t        j                  ||z   dz        |k  rDJ  y)zLCheck 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         [/DATA/.local/lib/python3.12/site-packages/sklearn/manifold/tests/test_spectral_embedding.py _assert_equal_with_sign_flippingr7   :   sg     q&KACCuFFEEMa'(K7vvuu}*+{:	
; &    coo_containerc                    t         j                  j                  d      }d}dddd|g}|j                  |      }g }t	        j
                  |      D ]  \  }}||| }t        t        |      dz
        D ]  }	|j                  ||	   ||	dz      f         dt        |      dz
  }}
d}|j                  |
||      }|j                  |
||      }|j                  t        ||   ||                 t        t        j                  |      j                        \  }}|j                  d	dt        |            } | |||ff      }d
||j                  z   z  }t	        j
                  |      D ]a  \  }}t!        |||         }||z
  }|j#                         |k(  sJ t!        |||dz
           }|j#                         |k(  sJ t%        ||       c y )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t% s5zA~&Aa%A,78 ' c%j1n#Wg4HIWg4HI3uV}eFm<= 6   5 7 78GZ;;sBS%5;6DdWj$9:;Hh+,H ))*5t01U8D N222 11TAX;G N222;4 6r8   c                  t   t         j                  j                  d      } | j                  dd      }t	        |      }t        j                  t        d      5  t        |dd      }d d d        t        j                  t        d	      5  t        |dd
      }d d d        y # 1 sw Y   <xY w# 1 sw Y   y xY w)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                 "   t         j                  j                  |      }d}t        j                  |dz  |dz  g      }t        j                  |j                  ||            dz   |d|d|f<   t        j                  |j                  ||            dz   ||d |d f<   t        |d      }|d | j                         sJ ||d  j                         rJ t        |d      }|d | j                         rJ ||d  j                         sJ d|d|dz   f<   d||dz   df<   d|j                  d d d|z  dz   <   d||j                  z   z  }t        j                  d|z        }d|d| t        ddt         j                  j                  |      | 	      }|j                  |j                  |            }	t        j                  |	j                         dk  t         j                   
      }
t#        ||
      t%        j&                  d      k(  sJ y )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 	|!!(H56: QxZ8#$
 	|!!(H56: XZ#$
 +8Q7IYh##%%%#'')))*8R8I(#'')))XY##%%% !"HQ1_ !HX\1_)*HMM%Q\A%%&h+,HH-JJq"YY**40!	J %228??53IJXX)//1A5RXXFF'
F;v}}S?QQQQr8   sparse_containerc                    d}| t         n | t               }t        ddt        j                  j	                  |      |      }t        dd|t        j                  j	                  |      |      }|j                  t        |j                  |      |            }|j                  |j                  |            }	t        |j                  |j                         t        ||	d       y )	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$]ItDr8   c                  "   d} g }dD ]t  }t        | |z         j                  t              }|j                  t        d      }t	        ddd| 	      j                  |      j
                  }|j                  |       v t        |d   |d
          y )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 '+8L*LMQQRST##AJ#78'	 SZZ 	 	y! !( wqz71:.r8   c                    dt        t              }| t        n | t              }t        dfdt        j                  j                  |            }t        ddt        j                  j                  |            }|j                  |      }|j                  |      }t        |j                  |j                         t        ||j                         t        ||d       y )Ng?r   r+   c                     t        |       S )Nr   r   )xr   s    r6   <lambda>z;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dF$;$;<$YEr8   c           	      b   t        ddddt        j                  j                  |            }t        ddddt        j                  j                  |            }|j	                  t
        j                  |             }|j	                  t
        j                  |             }t        ||d       y )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           	      F   t        ddddt        j                  j                  |            }t        ddddt        j                  j                  |            }|j	                  t
        j                  |             }|j	                  t
        j                  |             }t        ||d       t        j                  g dt        j                  	      }t        j                  g d
t        j                  	      }t        j                  g dt        j                  	      }	 |t        j                  |	|	g      t        j                  ||g      t        j                  ||g      ffd      }
d|_        d|_        |j	                  |
j                  |             }|j	                  |
j                  |             }t        ||d       |
j                         }
|
j                  j                  t        j                        |
_        |
j                  j                  t        j                        |
_        t         t#        d      k\  }|r|j	                  |
       y d}t%        j&                  t(        |      5  |j	                  |
       d d d        y # 1 sw Y   y xY w)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$YdC
 (((
9C
(((
9C
((4BHH
EC	C:	C:!6		3*8M NOH $FO&I$$X__U%;<I**8??5+ABL$YdC
 ~~Hoo,,RXX6HO''..rxx8H 2<}X?V1V.1X&Q]]:W5  * 655s   <JJ c                 D   d}t        ||fd|      }|j                  |       }t        j                  |      t	        |j                               z
  }||j                  z   }t        |ddd      }t        d      D ]"  }t        |dd|d	z         }t        ||d
       $ y )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%
 	)MtL	 r8   c                 `   t         j                  j                  |       }t        t        dz
  d|      }t        t        dz
  dd|      }||fD ]]  }t        t        |d      }|j                  |j                  t                     t        t        |j                  t              d	d
       _ y )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 vzRP
r"#!([A3	
 r8   c                    t        j                  g dg dg dg dg dg      }t        |      rJ t        D ]  }t         ||            sJ  t        D ]  }t         ||            sJ  t        j                  g dg dg dg dg dg      }t        |      sJ t        D ]  }t         ||            rJ  t        D ]  }t         ||            rJ  y )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 ('"=#7888 (r8   c                      t         j                  j                  d      } | j                  dd      }t	        |      }t        |      }t        |      }t        ||       y )Nre   rf   rg   )r.   rA   rB   rn   r   r   r   )r)   r^   rr   embedding_1embedding_2s        r6   %test_spectral_embedding_deterministicr     sP    99((,Lb"%DdD$T*K$T*Kk;7r8   c                  <   t         j                  j                  d      } | j                  dd      }t	        |      }d}t        |d|d      }t        |dd      \  }}t        |      \  }}|j                  d | }	t        |	      j                  }	t        ||	       y )	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KMIrIA}//-<0K1+>@@Kk;7r8   c                  j   t         j                  j                  d      } | j                  dd      }t	        |      }d}t        d      D ]g  }t        |d|d|      }t        j                  |d d df         t        j                  d      k(  sJ t        j                  |d d df         d	kD  rgJ  y )
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                     t         j                  |      }t        dd| d      }|j                  |      }|j                  |k(  sJ |j
                  j                  |k(  sJ |j                  j                  |k(  sJ y)a\  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                      t        ddd      } d}t        j                  t        |      5  | j	                  t
               d d d        y # 1 sw Y   y xY w)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                    |dk(  rt         st        j                  d       t        ddddgddggd      \  }}t	        |      }t        j                  |      |z
  }|d	k(  rt        nt        }|d	k(  rdnd
}|dk(  r ||      }t        |      }	| j                  t        |j                  |	       t        |d|d       |	j                          |	j                  \  }}
|
d   |k(  sJ y
)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DAq 	1A
q	AA!X-%6K8+AM![1M+[-E-E}Uqr&Q!''IAv%=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)     sm         - " ' 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    Q   Q
Q