
    _ndD              
          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
 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 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 dlm Z  d dl!m"Z" d dl!m#Z# d dl$m%Z% 	 d dl&m'Z' dZ(n# e)$ r dZ(Y nw xY wej*        +                    e( d          Z, ej-        g dg dg dg          Z.dZ/e.j0        \  Z1Z2 ee/e.dd          \  Z3Z4dCd!Z5d" Z6ej*        7                    d#d$d% ej8        d&e,'          g          ej*        7                    d(ej9        ej:        g          dDd)                        Z;ej*        7                    d*e3 ej<        e3          gd+d,g-          ej*        7                    d#d$d% ej8        d&e,'          g          ej*        7                    d(ej9        ej:        f          dEd/                                    Z=d0 Z>ej*        7                    d*e3 ej<        e3          gd+d,g-          dEd1            Z?ej*        @                    d2          ej*        @                    d3          ej*        @                    d4          ej*        +                    e( d          ej*        7                    d(ej9        ej:        f          dEd5                                                            ZAej*        @                    d2          ej*        @                    d3          ej*        @                    d4          ej*        +                    e( d          ej*        7                    d(ej9        ej:        f          dEd6                                                            ZBej*        @                    d7          dEd8            ZCdEd9ZDd: ZEd; ZFd< ZGej*        7                    d#d$d% ej8        d&e,'          g          ej*        7                    d(ej9        ej:        g          d=                         ZHej*        +                    e(d>          d?             ZIej*        7                    d@g dA          dB             ZJdS )F    )MockN)sparse)csgraph)eigh)eigsh)SpectralEmbedding_spectral_embedding)_graph_is_connected)_graph_connected_component)spectral_embedding
rbf_kernel)normalized_mutual_info_scorepairwise_distances)NearestNeighbors)KMeans)
make_blobs)_deterministic_vector_sign_flip)assert_array_almost_equal)assert_array_equal)lobpcg)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_stater   c                     |dz  }t          | j        |j                  D ]C\  }}t          j        ||z
  dz            |k    s t          j        ||z   dz            |k    sJ DdS )zMCheck array A and B are equal with possible sign flipping on
    each columns   N)zipTnpmax)ABtoltol_squaredA_colB_cols         Nlib/python3.11/site-packages/sklearn/manifold/tests/test_spectral_embedding.py _assert_equal_with_sign_flippingr0   2   sy     q&KAC 
 
uFEEMa'((K77vuu}*++{::::
 
    c                     t           j                            d          } d}dddd|g}|                     |          }g }t	          |d d         |dd                    D ]\  }}|||         }t          t          |          dz
            D ](}|                    ||         ||dz            f           )dt          |          dz
  }
}	d}|                     |	|
|	          }|                     |	|
|	          }|	                    t	          ||         ||                              t          t          j        |          j                  \  }}|                     d
dt          |          	          }t          j        |||ff          }d||j        z   z  }t	          |d d         |dd                    D ]}\  }}t!          |||                   }||z
  }|                                |k    sJ t!          |||dz
                     }|                                |k    sJ t%          ||           ~d S )Nr   i,  r   y         r   )size皙?      ?)r'   randomRandomStatepermutationr%   rangelenappendrandintextendtuplearrayr&   uniformr   
coo_matrixr   sumr   )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                        r/   %test_sparse_graph_connected_componentr[   =   s[   
)


#
#CIRc9-J	""AK:crc?JqrrN;; > >t%* s5zzA~&& 	9 	9Aa%A,78888 c%jj1n#Wg4HIIWg4HII3uV}eFm<<====   5 5 788GZ;;sBS%5%5;66D $*(=!>??Hh+,H:crc?JqrrN;; 	5 	5t01U8DD  N2222 11TAX;GG  N2222;4444	5 	5r1   eigen_solverarpackr   amg)marksdtypec                    t           j                            |          }d}t          j        |dz  |dz  g          }t          j        |                    ||                    dz   |d|d|f<   t          j        |                    ||                    dz   ||d |d f<   t          |d          }|d |                                         sJ ||d                                          rJ t          |d          }|d |                                         rJ ||d                                          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                            |          | 	          }|                    |                    |                    }	t          j        |	                                dk     t           j        
          }
t#          ||
          t%          j        d          k    sJ d S )Nd   r$   shaper   r5   r6   r9   precomputedn_componentsrW   r"   r\   )r`   r   )r'   r:   r;   zerosabsrandnr   allanyflatr&   r   fit_transformastyperC   ravelint64r   pytestapprox)r\   r`   seedr"   n_samplerW   	component
true_label
se_precompembedded_coordinatelabel_s              r/   &test_spectral_embedding_two_componentsr{   h   su    9((..LHxx!|X\:;;;H 	|!!(H5566: QxZ8#$
 	|!!(H5566: XZZ#$
 +8Q77IYhY##%%%%%#'')))))*8R88I(#'')))))XYY##%%%%% !"HQ1_ !HX\1_)*HM%%Q\A%%&h+,HH---JJqz"Y**400!	  J %228??53I3IJJX)//11A5RXFFFF'
F;;v}S?Q?QQQQQQQr1   Xdenser   )ids$   c                    d}t          ddt          j                            |          |          }t          dd|t          j                            |          |          }|                    t          |                     |          |                    }|                    |                     |                    }t          |j        |j                   t          ||d           d S )	Nr   r$   re   rf   rbf)rg   rW   gammar"   r\   r   皙?)
r   r'   r:   r;   rn   r   ro   r   affinity_matrix_r0   )	r|   r\   r`   rt   r   rx   se_rbfembed_precomp	embed_rbfs	            r/   ,test_spectral_embedding_precomputed_affinityr      s     E"Y**400!	  J Y**400!  F ,,Zu-U-U-UVVM$$QXXe__55Ij96;RSSS$]ItDDDDDr1   c                  ^   d} g }dD ]}t          | |z                                 t                    }|                    t          d          }t	          ddd|                               |          j        }|                    |           t          |d         |d	                    d S )
Nr$   )r   
   )n_neighborsconnectivity)moder   precomputed_nearest_neighbors)r"   rg   rW   r   r6   )r   fitSkneighbors_graphr   
embedding_r?   r   )r   resultsadditional_neighborsnngraph	embeddings         r/   ,test_precomputed_nearest_neighbors_filteringr      s    KG ' " "+8L*LMMMQQRSTT##AN#;;8'	   SZZ 	 	y!!!!wqz71:.....r1   c                    dt          t                    }t          dfdt          j                            |                    }t          ddt          j                            |                    }|                    |           }|                    |           }t          |j        |j                   t          ||j                   t          ||d           d S )Ng?r   r$   c                 &    t          |           S )Nr   r   )xr   s    r/   <lambda>z;test_spectral_embedding_callable_affinity.<locals>.<lambda>   s    Jq666 r1   )rg   rW   r   r"   r   r   )
r   r   r   r'   r:   r;   rn   r   r   r0   )r|   rt   kernse_callabler   r   embed_callabler   s          @r/   )test_spectral_embedding_callable_affinityr      s     Eau%%%D#6666Y**400	  K Y**400	  F $$Q''I ..q11Nk:F<STTTdF$;<<<$YEEEEEr1   z:ignore:scipy.rand is deprecated:DeprecationWarning:pyamg.*zBignore:`np.float` is a deprecated alias:DeprecationWarning:pyamg.*zBignore:scipy.linalg.pinv2 is deprecated:DeprecationWarning:pyamg.*c           	          t          ddddt          j                            |                    }t          ddddt          j                            |                    }|                    t
                              |                     }|                    t
                              |                     }t          ||d           g d}g d	}g d
}t          j	        ||z   ||z   ||z   ffd          
                                }	d|_        d|_        |                    |	                    |                     }|                    |	                    |                     }t          ||d           d S )Nr$   nearest_neighborsr^      )rg   rW   r\   r   r"   r]   gh㈵>)r   r   r6   r$      r      )r6   r$   r$   r   r   r   r   )rb   rb   rb   r6   rb   rb   rb   )   r   rc   re   )r   r'   r:   r;   rn   r   ro   r0   r   rE   toarrayrW   )
r`   rt   se_amg	se_arpack	embed_amgembed_arpackrowcolvalrW   s
             r/   "test_spectral_embedding_amg_solverr      s     $Y**400  F "$Y**400  I $$QXXe__55I**188E??;;L$YdCCC
  

C


C
+
+
+C 	sS3Yc	*+6  gii  $FO&I$$X__U%;%;<<I**8??5+A+ABBL$YdCCCCCr1   c                    d}t          j        ||d|          }|                    |           }t          j        |          t          j        |                                          z
  }||j        z   }t          |ddd          }t          d          D ]*}t          |dd|d	z             }t          ||d
           +d S )Nrb   r8   )densityr"   r   r^   r   )rg   r\   r"   r   r6   r   )r+   )
r   randro   triudiagsdiagonalr&   r   r=   r0   )	r`   rt   	num_nodesr|   upper
sym_matrixr   rN   new_embeddings	            r/   *test_spectral_embedding_amg_solver_failurer   #  s    " IIy#DIIIA	AKNNV\!**,,777EJ"%a  I
 1XX M M*Re!a%
 
 
 	)MtLLLLL	M Mr1   z6ignore:the behavior of nmi will change in version 0.22c                    t           j                            |           }t          t          d|          }t          t          dd|          }||fD ]o}t          t          |d          }|                    |                    t                               t          t          |j        t                    dd	           pd S )
Nr   )rg   rW   r"   r   r   )rg   rW   r   r"   auto)
n_clustersr"   n_initr   r$   )r'   r:   r;   r   r   r   r   rn   r   r   r   labels_true_labels)rt   r"   r   se_knnsekms         r/   !test_pipeline_spectral_clusteringr   E  s     9((..L%l  F $!	  F v 
 
zVTTT
r""###!([AA3	
 	
 	
 	

 
r1   c                    t          j        g dg dg dg dg dg          }t          |          rJ t          t          j        |                    rJ t          t          j        |                    rJ t          j        g dg dg dg dg dg          }t          |          sJ t          t          j        |                    sJ t          t          j        |                    sJ d S )N)r6   r   r   r   r   )r   r6   r6   r   r   )r   r6   r6   r6   r   )r   r   r6   r6   r6   )r   r   r   r6   r6   )r6   r6   r   r   r   )r6   r6   r6   r   r   )r'   rC   r
   r   
csr_matrix
csc_matrix)rt   r   s     r/   test_connectivityr   Z  s"   HOOOOOOOOOO	
 E #5)))))"6#4U#;#;<<<<<"6#4U#;#;<<<<<HOOOOOOOOOO	
 E u%%%%%v07788888v0778888888r1   c                      t           j                            d          } |                     dd          }t	          |          }t          |          }t          |          }t          ||           d S )Nr   r      )r'   r:   r;   rj   r   r   r   )r"   rV   simsembedding_1embedding_2s        r/   %test_spectral_embedding_deterministicr   v  si    9((,,Lb"%%DdD$T**K$T**Kk;77777r1   c                  v   t           j                            d          } |                     dd          }t	          |          }d}t          |d|d          }t          j        |dd          \  }}t          |          \  }}|j	        d |         }	t          |	          j	        }	t          ||	           d S )	Nr   r   r      F)norm_laplacianrg   
drop_firstT)normedreturn_diag)r'   r:   r;   rj   r   r   r   	laplacianr   r&   r   r   )
r"   rV   r   rg   r   r   dd_diffusion_mapr   s
             r/   $test_spectral_embedding_unnormalizedr     s     9((,,Lb"%%DdDL$U%  K
 %d5dKKKMIrIA}/-<-0K1+>>@Kk;77777r1   c                     t           j                            d          } |                     dd          }t	          |          }d}t          d          D ]p}t          |d|d|          }t          j        |d d df                   t          j	        d          k    sJ t          j        |d d df                   d	k    sJ qd S )
Nr   r   r   r$   F)r   rg   r   r"   r   r6   gMbP?)
r'   r:   r;   rj   r   r=   r   stdrr   rs   )r"   rV   r   rg   rt   r   s         r/   *test_spectral_embedding_first_eigen_vectorr     s     9((,,Lb"%%DdDLb		 
. 
.& %
 
 
	 vi1o&&&-*:*:::::vi1o&&-----
. 
.r1   c                     t                               |          }t          dd| d          }|                    |          }|j        |k    sJ |j        j        |k    sJ |j        j        |k    sJ dS )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   )rg   rW   r\   r"   N)r   ro   r   rn   r`   r   r   )r\   r`   r|   r   X_transs        r/   'test_spectral_embedding_preserves_dtyper     s    $ 	
A	\PQ
 
 
B q!!G=E!!!!=%''''$------r1   z7PyAMG is installed and we should not test for an error.c                      t          ddd          } d}t          j        t          |          5  |                     t
                     d d d            d S # 1 swxY w Y   d S )Nr$   r   r^   )rg   rW   r\   z>The eigen_solver was set to 'amg', but pyamg is not available.)match)r   rr   raises
ValueErrorrn   r   )rx   err_msgs     r/   test_error_pyamg_not_availabler     s    
 #  J
 OG	z	1	1	1 $ $  ###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s   AAAsolver)r]   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          |          }|                     t          |j        |           t          |d|d           |                                 |j        \  }}	|	d         |k    sJ d
S )z2Test that `eigen_tol="auto"` is resolved correctlyr^   zPyAMG is not available.r4   r   r6   r5   g{Gz?)r   r"   r    r!   r]   N)side_effectr   r   )r"   r\   	eigen_tolr+   )pyamg_availablerr   skipr   r   r'   r(   r   r   r   r   r   setattrr	   __qualname__r   assert_called	call_args)
monkeypatchr   r|   r   Dr   solver_funcdefault_valuemocked_solverkwargss
             r/   test_spectral_eigen_tol_autor     s+    -...AAR/At  DAq 	1A
q		AA!X--%%6K8++AAMa  [111M+[-E}UUUqr&QQQQ!!!'IAv%=M))))))r1   )r   )r   )r   )Kunittest.mockr   rr   numpyr'   scipyr   scipy.sparser   scipy.linalgr   scipy.sparse.linalgr   sklearn.manifoldr   r	   $sklearn.manifold._spectral_embeddingr
   r   r   sklearn.metrics.pairwiser   sklearn.metricsr   r   sklearn.neighborsr   sklearn.clusterr   sklearn.datasetsr   sklearn.utils.extmathr   sklearn.utils._testingr   r   sklearn.utils.fixesr   pyamgr   r   ImportErrormarkskipifskip_if_no_pyamgrC   r    r   rd   r   
n_featuresr   r   r0   r[   parametrizeparamfloat32float64r{   r   r   r   r   filterwarningsr   r   r   r   r   r   r   r   r   r    r1   r/   <module>r     s*                                      % % % % % % C C C C C C C C D D D D D D K K K K K K / / / / / / / / / / / / L L L L L L L L . . . . . . " " " " " " ' ' ' ' ' ' A A A A A A < < < < < < 5 5 5 5 5 5 & & & & & &111111OO   OOO;%% S &   
 "(!!!!!!!!!  	  
Jc  ;

 
 
 
$5 $5 $5V U"2333  2:rz":;;)R )R )R <; )RX q"3&"3A"6"67gx=PQQU"2333  2:rz":;;E E E <;  RQE,/ / /, q"3&"3A"6"67gx=PQQF F F RQF2 @  H  H   S    2:rz":;;!D !D !D <;  	 	 !DN @  H  H   S    2:rz":;;M M M <;  	 	 M& TUU
 
 
 VU
(9 9 9 988 8 88 8 8(. . .* U"2333  2:rz":;;. . <; .( D   $ $	 $ #>#>#>??* * @?* * *s   :B BB