
    -i                        S SK r S SKrS SKrS SKrS SKrS SK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  S SKJr  S SKJrJr  S SKJrJr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(  \R                   " 5       r)/ SQr*Su  r+r,\-" \+\,5      r.S}S jr/\R`                  Rc                  S\*5      \R`                  Rc                  S\2" S\)Rf                  Rh                  S   5      5      S 5       5       r5\R`                  Rc                  S/ SQ5      \R`                  Rc                  S/ SQ5      \R`                  Rc                  S\(\'-   5      \R`                  Rc                  SSS/5      \R`                  Rc                  S/ SQ5      S 5       5       5       5       5       r6\R`                  Rc                  S\(\'-   5      S 5       r7\R`                  Rc                  SSS /5      \R`                  Rc                  S\(\'-   5      S! 5       5       r8\R`                  Rc                  S\(\'-   5      S" 5       r9S# r:\R`                  Rc                  S$S%S&/5      \R`                  Rc                  S'\*5      S( 5       5       r;\R`                  Rc                  S)\<" \=" \>" \*5      S S*1-
  5      5      5      \R`                  Rc                  S+S,S-/5      \R`                  Rc                  S.S&S%/5      \R`                  Rc                  S/S&S%/5      S0 5       5       5       5       r?\R`                  Rc                  S1\R                  R                  S 5      R                  S2S35      \R"                  " S2S3S4S S59S    \R                  R                  S 5      R                  S6S25      // S7QS89\R`                  Rc                  S\*5      S9 5       5       rC\R`                  Rc                  SSS/5      S: 5       rD\R`                  Rc                  S\*5      S; 5       rE\R`                  Rc                  S\*5      S< 5       rF\R`                  Rc                  S\*5      S= 5       rG\R`                  Rc                  S/ S>Q5      \R`                  Rc                  S/S&S%/5      S? 5       5       rH\R`                  Rc                  S@\R                  " / SAQ/ SBQ/5      \R                  " / SAQ/ SBQ/5      R                  /5      \R`                  Rc                  SC/ SDQ5      SE 5       5       rK\R`                  Rc                  SFS \-" \)Rf                  Rh                  5      4S\-" \)Rf                  Rh                  5      S-
  4S\-" \)Rf                  Rh                  5      4/5      \R`                  Rc                  S@\)Rf                  \)Rf                  R                  /5      SG 5       5       rL\R`                  Rc                  SS*S /5      SH 5       rM\R`                  Rc                  SSS/5      SI 5       rNSJ rOSK rPSL rQSM rR\R`                  Rc                  SN\)Rf                  SOSP4\)Rf                  SQS4\R                  R                  S 5      R                  SRSS5      STSP4/5      SU 5       rT\R`                  Rc                  S\*5      SV 5       rUSW rV\R`                  Rc                  S\*5      SX 5       rW\R`                  Rc                  SSS/5      SY 5       rX\R`                  Rc                  SS S/5      SZ 5       rY\R`                  Rc                  S[/ S\Q5      S] 5       rZ\R`                  Rc                  S\*5      S^ 5       r[\R`                  Rc                  S\*5      S_ 5       r\S` r]Sa r^Sb r_Sc r`Sd raSe rbSf rcSg rdSh reSi rfSj rg\R`                  Rc                  S$S%S&/5      Sk 5       rhSl ri\R`                  Rc                  Sm\" 5       \S89\R`                  Rc                  Sn\%\i/\ S89\R`                  Rc                  So\" SPS Sp9\" SPS S%Sq9\" SrS S%Sq9\" SPSSp9\" SPSS%Sq9\" SPSSsS St9/\ S89Su 5       5       5       rj\R`                  Rc                  Sm\" 5       \S89\R`                  Rc                  Sn\i/\ S89\R`                  Rc                  So\" SvS Sp9/\ S89Sw 5       5       5       rk\R`                  R                  \ R                  R                  Sx5      Sy:g  SzS{9S| 5       rog)~    N)assert_array_equal)config_contextdatasets)clone)	load_irismake_classificationmake_low_rank_matrix)PCA)_assess_dimension_infer_dimension)_atol_for_type_convert_to_numpy_get_namespace_device_dtype_ids)yield_namespace_device_dtype_combinationsdevice)_get_check_estimator_ids)_array_api_for_testsassert_allclose) check_array_api_input_and_values)CSC_CONTAINERSCSR_CONTAINERS)fullcovariance_eigharpack
randomizedauto)  i,  c                    [        U R                  UR                  X#S9  [        U R                  UR                  X#S9  [        U R                  UR                  X#S9  [        U R                  UR                  X#S9  [        U R
                  UR
                  X#S9  U R                  UR                  :X  d   eU R                  UR                  :X  d   eU R                  UR                  :X  d   eg )Nrtolatol)	r   components_explained_variance_singular_values_mean_noise_variance_n_components_
n_samples_n_features_in_)pca1pca2r!   r"   s       W/var/www/html/venv/lib/python3.13/site-packages/sklearn/decomposition/tests/test_pca.py_check_fitted_pca_closer.   '   s    D$$d&6&6TM  $":": D))4+@+@tWDJJ

AD(($*>*>TU!3!3333??doo---$"5"5555    
svd_solvern_components   c                    [         R                  n[        XS9nUR                  U5      R	                  U5      nUR
                  S   U:X  d   eUR                  U5      n[        XE5        UR	                  U5      n[        XE5        UR                  5       nUR                  5       n[        [        R                  " Xg5      [        R                  " UR
                  S   5      SS9  g )Nr1   r0   r2   -q=r"   )irisdatar
   fit	transformshapefit_transformr   get_covarianceget_precisionnpdoteye)r0   r1   XpcaX_rX_r2cov	precisions           r-   test_pcarH   5   s     			A
<
?C ''!*

q
!C99Q<<''' QDC
--
CC 


C!!#IBFF3*BFF1771:,>UKr/   density){Gz?皙?g333333?)r2      
   sparse_containerr   r   scale)r2   rM   d   c           	         SnSn[         R                  R                  U 5      nU" [        R                  R                  [
        [        UUS95      n	UR                  U	R                  S   5      U-  n
U	R                  U
5      n	[        UUU S9nUR                  U	5        U	R                  5       n[        UUU S9nUR                  U5        [        XUS9  U" [        R                  R                  [
        [        UUS95      nUR                  5       n[        UR                  U5      UR                  U5      US9  [        UR                  U5      UR                  U5      US9  g)z?Check that the results are the same for sparse and dense input.r5   绽|=random_staterI   r2   r1   r0   rT   r6   N)r?   randomdefault_rngspsparseSPARSE_MSPARSE_Nr;   multiplyr
   r9   toarrayr.   r   r:   )global_random_seedr0   rN   r1   rI   rO   r"   transform_atolrT   rB   scale_vectorrC   XdpcadX2X2ds                   r-   test_pca_sparsere   K   sL    DN99(();<L
		%	 	 	
	A  &&qwwqz2U:L	

< A
!'C
 GGAJ	
B!'D
 	HHRL CD1 

		%	 	 	

B **,CCMM"%s}}S'9OCMM"%t~~c':Pr/   c           	      <   [         R                  R                  U 5      nU" [        R                  R                  [
        [        USS95      nU" [        R                  R                  [
        [        USS95      n[        SSU S9n[        SSU S9nUR                  U5        UR                  U5      n[        XV5        [        XvR                  U5      5        [        XuR                  U5      5        [        UR                  U5      UR                  U5      5        g )NrJ   rS   rM   r   rU   )r?   rV   rW   rX   rY   rZ   r[   r
   r9   r<   r.   r   r:   )r^   rN   rT   rB   rc   pca_fitpca_fit_transformtransformed_Xs           r-   test_pca_sparse_fit_transformrj      s   99(();<L
		%	 	 	
	A 

		%	 	 	

B rhEWXGH;M KKN%33A6MG7M#>#>q#ABM#4#4Q#78G%%b)+<+F+Fr+JKr/   r   r   c                 D   [         R                  R                  U 5      nU" [        R                  R                  [
        [        US95      n[        SUS9nSU S3n[        R                  " [        US9   UR                  U5        S S S 5        g ! , (       d  f       g = f)NrT      r4   zWPCA only support sparse inputs with the "arpack" and "covariance_eigh" solvers, while "z" was passedmatch)r?   rV   RandomStaterX   rY   rZ   r[   r
   pytestraises	TypeErrorr9   )r^   r0   rN   rT   rB   rC   error_msg_patterns          r-   test_sparse_pca_solver_errorru      s     99(();<L
		% 	 	
	A 2*
5C	&<|	5  
y(9	:
 
;	:	:s   6B
Bc                 >   [         R                  R                  U 5      nU" [        R                  R                  [
        [        US95      n[        SSS9R                  U5      n[        SSS9R                  U5      n[        UR                  UR                  SS9  g)	zHCheck that "auto" and "arpack" solvers are equivalent for sparse inputs.rl   rM   r   r4   r   {Gzt?r!   N)r?   rV   rp   rX   rY   rZ   r[   r
   r9   r   r%   )r^   rN   rT   rB   
pca_arpackpca_autos         r-   7test_sparse_pca_auto_arpack_singluar_values_consistencyr{      s    
 99(();<L
		% 	 	
	A ":>>qAJv6::1=HJ//1J1JQUVr/   c                     Sn U S-   n[         R                  R                  SSX4S9n[        U S9n[        R
                  " 5          [        R                  " S[        5        UR                  U5        S S S 5        g ! , (       d  f       g = f)NrM   rL   r2   sizer1   error)	r?   rV   uniformr
   warningscatch_warningssimplefilterRuntimeWarningr9   )r1   
n_featuresrB   rC   s       r-   test_no_empty_slice_warningr      sl    L!J
		"a|&@AA
<
(C		 	 	"g~6
 
#	"	"s   -A<<
B
copyTFsolverc                 z   [         R                  R                  S5      nSnSnSnSn[         R                  " UR	                  X65      [         R                  " [         R
                  " [         R                  " SSU5      5      UR	                  Xd5      5      5      nUS S 2S S24==   S-  ss'   UR                  X44:X  d   eUR                  SS	9R                  5       S
:  d   eUR                  5       n[        USUU SSS9n	U	R                  UR                  5       5      n
U
R                  X54:X  d   eU	R                  U5      n[        XSS9  [        U
R                  SSS9[         R                  " U5      5        [        U
R                  SS	9[         R                   " U5      SS9  UR                  5       n[        USXS9R#                  UR                  5       5      n	U	R                  U5      nUR                  X54:X  d   eUR                  SS	9R                  5       [$        R&                  " SSS9:X  d   eg )Nr   rP   P   rm   2   g      $@      ?   axisgfffffE@T   )r1   whitenr   r0   rT   iterated_powergMb@?rx   r2   ddofr   r5   r6   F)r1   r   r   r0   gfffffR@rK   )rel)r?   rV   rp   r@   randndiaglinspacer;   stdr   r
   r<   r:   r   onesmeanzerosr9   rq   approx)r   r   rng	n_samplesr   r1   rankrB   X_rC   
X_whitenedX_whitened2X_unwhiteneds                r-   test_whiteningr      s    ))


"CIJLD 			)"
rwwr{{4d34cii6QR	A a"fINI77y---- 55a5=%%% 
B
!C ""2779-J	8888--#KJ$7JNNN2BGGL4IJJOOO+RXXl-C%P	
B
!%d	c"'')n  ==$L)!:::: #'')V]]4T-JJJJr/   other_svd_solverr   
data_shapetallwiderank_deficientr   c                 	   US:X  a  Su  pgOSu  pgSnU(       aR  [         R                  R                  U5      n	[        Xg5      S-  n
U	R	                  Xh-   U
4S9U	R	                  X4S9-  nO[        Xh-   USUS9n[        Xg5      n
UR                  US	S
9nUS U XS  pU[         R                  :X  a  [        SSS9nSnO[        SSS9nSn0 nU S:X  a  SnSS0nO"U S:X  a  [         R                  " Xg5      S-
  nOS n[        USUS9n[        SUU UUS.UD6nUR                  U5      n[         R                  " U5      R                  5       (       d   eUR                  U:X  d   eUR                  U5      n[         R                  " U5      R                  5       (       d   eUR                  U:X  d   eUR                  S:  R                  5       (       d   e[!        UR                  UR                  40 UD6  [!        UR"                  UR"                  40 UD6  UR$                  n[         R                  " U5      R                  5       (       d   eUR$                  n[         R                  " U5      R                  5       (       d   eUR                  U:  nUR'                  5       S:  d   e[!        UU   UU   40 UD6  [!        US S 2U4   US S 2U4   40 UD6  UR)                  U5      n[         R                  " U5      R                  5       (       d   eUR                  U:X  d   eUR)                  U5      n[         R                  " U5      R                  5       (       d   eUR                  U:X  d   e[!        US S 2U4   US S 2U4   40 UD6  UR+                  U5      n[         R                  " U5      R                  5       (       d   eUR                  U:X  d   eUR+                  U5      n[         R                  " U5      R                  5       (       d   eUR                  U:X  d   eUR$                  R,                  S   UR$                  R,                  S   :X  a  [!        UU40 UD6  [!        UU40 UD6  g UR$                  R,                  S   U
:  a.  UR                  R                  5       U:  d   e[!        UU40 UD6  g [!        UR)                  U5      S S 2U4   UR)                  U5      S S 2U4   40 UD6  g )Nr   )rP   rm   )rm   rP   rM   rL   r~         ?)r   r   tail_strengthrT   Fr   gQ?h㈵>)r"   r!   rR   r5   r   r   r   r   r2   r   r1   r0   r   )r1   r0   r   rT   r    )r?   rV   rW   minstandard_normalr	   astypefloat32dictminimumr
   r<   isfinitealldtyper$   r   explained_variance_ratio_r#   sumr:   inverse_transformr;   )r   r   r   r   r^   global_dtyper   r   n_samples_testr   r   rB   X_trainX_testtolsvariance_thresholdextra_other_kwargsr1   pca_full	pca_otherX_trans_full_trainX_trans_other_trainreference_componentsother_componentsstableX_trans_full_testX_trans_other_testX_recons_full_testX_recons_other_tests                                r-   test_pca_solver_equivalencer     s6    V '	: '	Nii##$679)Q.,d3   
d%789 !0!+	
 9)	E*A
mQz]Vrzz!D)!U+"<' .3	X	% zz)81< OH !#'	
 I "//8;;)*..0000##|333#11':;;*+//1111$$444((A-224444H00)2O2OXSWX**++ 
 $//;;+,002222 ,,;;'(,,.... )),>>F::<!(02B62JSdS AvI&(:1f9(EIM !**62;;()--////""l222",,V4;;)*..0000##|333&q&y13DQY3OXSWX "334EF;;)*..0000##|333#556HI;;*+//1111$$444!!!$(<(<(B(B1(EE 	*F;d;+V<t<				#	#A	&	- ++//14FFFF*,?H4H 	121f9= 34QY?	
 	
r/   rB   rP   r   N   )n_informativerT   rM   )zrandom-tallzcorrelated-tallzrandom-wide)idsc           	      >   [        SUSS9nUR                  U 5      n[        UR                  [        R
                  " USSS95        [        R                  R                  [        R                  " U SS95      S   n[        USS	9S S n[        UR                  US
S9  g )NrL   r   rU   r2   r   F)rowvarT)reverserw   rx   )
r
   r<   r   r$   r?   varlinalgeigrF   sorted)rB   r0   rC   X_pcaexpected_results        r-   %test_pca_explained_variance_empiricalr     s     1!
DCa EC++RVVE-JKiimmBFF1U$;<Q?O_d;BQ?OC++_4Hr/   c                    [         R                  R                  S5      nSu  p#UR                  X#5      n[	        SSUS9n[	        SXS9nUR                  U5        UR                  U5        [        UR                  UR                  SS9  g )Nr   rP   r   rL   r   rU   rw   rx   )r?   rV   rp   r   r
   r9   r   r%   )r0   r   r   r   rB   r   r   s          r-   $test_pca_singular_values_consistencyr     sv    
))


"C#I		)(Af3GHzLILLOMM!H--y/I/IPTUr/   c           
      R   [         R                  R                  S5      nSu  p#UR                  X#5      n[	        SXS9nUR                  U5      n[        [         R                  " UR                  S-  5      [         R                  R                  US5      S-  5        [        UR                  [         R                  " [         R                  " US-  SS95      5        Su  p#UR                  X#5      n[	        SXS9nUR                  U5      nU[         R                  " [         R                  " US-  SS95      -  nUS S 2S4==   S	-  ss'   US S 2S
4==   S-  ss'   [         R                  " XeR                  5      nUR                  U5        [        UR                  / SQ5        g )Nr   r   rL   rU   fror   )rP   n   r   A`"	@r2   X9v@)r   r   r   )r?   rV   rp   r   r
   r<   r   r   r%   r   normsqrtr@   r#   r9   )r0   r   r   r   rB   rC   X_transX_hats           r-   test_pca_singular_valuesr     sQ   
))


"C#I		)(A
1
FC"G 
s##Q&')G1)L C(("''"&&!!2L*MN %I		)(A
1
FC"Grwwrvvgqjq122GAqDMUMAqDMUMFF7OO,EGGENC((*=>r/   c                    [         R                  R                  S5      nSu  p#UR                  X#5      S-  nUS S=== [         R                  " / SQ5      -  sss& SUR                  SU5      -  [         R                  " / SQ5      -   n[        SU S9R                  U5      R                  U5      nU[         R                  " US-  R                  5       5      -  n[        [         R                  " US   S   5      S	S
S9  g )Nr   rP   r   rK   rM   r         r2   rL   r4   r   rw   rx   )r?   rV   rp   r   arrayr
   r9   r:   r   r   r   abs)r0   r   nprB   XtYts          r-   test_pca_check_projectionr     s     ))


"CDA		!#AcrFbhhy!!F	syyA	)!4	4B	!
	3	7	7	:	D	DR	HB"''2q5++-
  BBFF2a58$c5r/   c                     SS/SS//n[        SU SS9nUR                  U5      nUR                  (       d   S5       e[        UR	                  5       SSS9  [        UR                  5       S	S
S9  g )Nr   g        r2   r   rU   )rL   r2   r5   r6   gQ?rw   rx   )r
   r<   r;   r   r   r   )r0   rB   rC   r   s       r-   test_pca_check_projection_listr     si     sc3Z A
1!
DC"G== & =GLLNDu5GKKM4d3r/   )r   r   r   c                 &   [         R                  R                  S5      nSu  p4UR                  X45      nUS S 2S4==   S-  ss'   U/ SQ-  n[	        SXS9R                  U5      nUR                  U5      nUR                  U5      n[        XXSS	9  g )
Nr   )r   r   r2   r   )r   r   r   rL   r   h㈵>rx   )	r?   rV   rp   r   r
   r9   r:   r   r   )	r0   r   r   r   r   rB   rC   Y	Y_inverses	            r-   test_pca_inverser     s     ))


"CDA		!AadGwGNA 1
C
G
G
JCaA%%a(IAt,r/   r8   )r   r2   r   )r2   r   r   z!svd_solver, n_components, err_msg))r   r   2must be between 1 and min\(n_samples, n_features\))r   r   r   )r   rL   zmust be strictly less than min)r   r   zZn_components=3 must be between 0 and min\(n_samples, n_features\)=2 with svd_solver='full'c                 l   Sn[        X S9n[        R                  " [        US9   UR	                  U5        S S S 5        U S:X  aN  UnSR                  X$5      n[        R                  " [        US9   [        X S9R	                  U5        S S S 5        g g ! , (       d  f       Nc= f! , (       d  f       g = f)NrL   r0   rn   r   zgn_components={}L? must be strictly less than min\(n_samples, n_features\)={}L? with svd_solver='arpack')r
   rq   rr   
ValueErrorr9   format)r0   r8   r1   err_msg
smallest_d
pca_fitteds         r-   test_pca_validationr    s    , J\9J	z	1t 
2 X!""(&"B 	
 ]]:W5488> 65 	 
2	1 65s   B1B%
B"%
B3zsolver, n_components_c                 \    [        US9nUR                  U 5        UR                  U:X  d   eg )Nr  )r
   r9   r(   )r8   r   r(   rC   s       r-   test_n_components_noner
  4  s-     
 CGGDM---r/   c                     [         R                  R                  S5      nSu  p#UR                  X#5      n[	        SU S9nUR                  U5        UR                  S:X  d   eg )Nr   iX  rM   mler4   r2   )r?   rV   rp   r   r
   r9   r(   )r0   r   r   r   rB   rC   s         r-   test_n_components_mler  C  sY     ))


"C#I		)(A
5Z
8CGGAJ!!!r/   c                 *   [         R                  R                  S5      nSu  p#UR                  X#5      n[	        SU S9nSR                  U 5      n[        R                  " [        US9   UR                  U5        S S S 5        g ! , (       d  f       g = f)Nr   r  r  r4   z:n_components='mle' cannot be a string with svd_solver='{}'rn   )
r?   rV   rp   r   r
   r  rq   rr   r  r9   )r0   r   r   r   rB   rC   r  s          r-   test_n_components_mle_errorr  N  st     ))


"C#I		)(A
5Z
8CJQQG 
z	1
 
2	1	1s   )B
Bc                  4   [         R                  R                  S5      n Su  pU R                  X5      S-  nUS S=== [         R                  " / SQ5      -  sss& [        SSS9R                  U5      nUR                  S:X  d   eUR                  S	:X  d   eg )
Nr   rP   r   rK   rM   r   r   r   r2   rL   r  r   r4   r2   )	r?   rV   rp   r   r   r
   r9   r1   r(   )r   r   r   rB   rC   s        r-   test_pca_dimr  ]  s    
))


"CDA		!#AcrFbhh''F
5V
4
8
8
;Cu$$$!!!r/   c            
         Su  p[         R                  R                  S5      nUR                  X5      S-  UR                  U S5      [         R                  " / SQ5      -  -   [         R                  " / SQ5      -   n[        USS9nUR                  U5        UR                  n[         R                  " [        SU5       Vs/ s H  n[        XVU 5      PM     sn5      nUS   UR                  5       S	U -  -
  :  d   eg s  snf )
Nr   r   r   rK   r2   r  )r2   r   r   r      r   r4   rJ   )r?   rV   rp   r   r   r
   r9   r$   ranger   max)r   r   r   rB   rC   spectklls           r-   test_infer_dim_1r  h  s     DA
))


"C		!#
))Aq/BHH_5
5	6
((?
#	$ 
 1
0CGGAJ##E	5A;G;a$Uq1;G	HBa52668dQh&&&& Hs   C?c                  r   Su  p[         R                  R                  S5      nUR                  X5      S-  nUS S=== [         R                  " / SQ5      -  sss& USS=== [         R                  " / SQ5      -  sss& [        USS	9nUR                  U5        UR                  n[        XP5      S
:  d   eg )Nr  r   rK   rM   r     r  r   r   rL   r}   r   r4   r2   	r?   rV   rp   r   r   r
   r9   r$   r   r   r   r   rB   rC   r  s         r-   test_infer_dim_2r#  y  s     DA
))


"C		!#AcrFbhh''FbH)**H
1
0CGGAJ##EE%)))r/   c            	         Su  p[         R                  R                  S5      nUR                  X5      S-  nUS S=== [         R                  " / SQ5      -  sss& USS=== [         R                  " / SQ5      -  sss& USS	=== S
[         R                  " / SQ5      -  -  sss& [        USS9nUR                  U5        UR                  n[        XP5      S
:  d   eg )Nr  r   rK   rM   r  r  r   rm   (   rL   )r}   r2   r}   r2   r}   r   r4   r!  r"  s         r-   test_infer_dim_3r&    s    DA
))


"C		!#AcrFbhh''FbH)**HbHBHH/000H
1
0CGGAJ##EE%)))r/   z'X, n_components, n_components_validatedgffffff?rL   rJ   r   r  r   c                     [        USS9nUR                  U 5        UR                  [        R                  " U5      :X  d   eUR
                  U:X  d   eg )Nr   r4   )r
   r9   r1   rq   r   r(   )rB   r1   n_components_validatedrC   s       r-   $test_infer_dim_by_explained_variancer)    sM     <F
;CGGAJv}}\:::: 6666r/   c                    Su  p[         R                  R                  S5      nUR                  X5      S-  [         R                  " / SQ5      -   n[        SU S9nUR                  U5        UR                  U5      nS[         R                  " S[         R                  -  [         R                  " S5      -  S	-  5      -  U-  n[        Xg-  SS
S9  UR                  UR                  X5      S-  [         R                  " / SQ5      -   5      nXh:  d   e[        SSU S9nUR                  U5        UR                  U5      nXh:  d   eg )N)r   r   r   rK   r   rL   r4   g      r2   g|Gz?g?rx   g?T)r1   r   r0   )r?   rV   rp   r   r   r
   r9   scorelogpiexpr   )	r0   r   r   r   rB   rC   ll1hll2s	            r-   test_pca_scorer2    s    DA
))


"C		!# 33A
1
4CGGAJ
))A,Crvva"%%i"&&)+f4559ACGQT*
))CIIaOc)BHHY,??
@C99
1Tj
ACGGAJ
))A,C99r/   c                  z   Su  p[         R                  R                  S5      nUR                  X5      UR                  U S5      [         R                  " / SQ5      -  -   [         R                  " / SQ5      -   nUR                  X5      UR                  U S5      [         R                  " / SQ5      -  -   [         R                  " / SQ5      -   n[         R
                  " U5      n[        U5       H1  n[        USS9nUR                  U5        UR                  U5      XV'   M3     UR                  5       S:X  d   eg )N)   r   r   r2   r   )r2   r   r   r   r4   )r?   rV   rp   r   r   r   r  r
   r9   r+  argmax)r   r   r   Xlr   r  r  rC   s           r-   test_pca_score3r7    s    DA
))


"C	1399Q?RXXi-@@	@288ICV	VB	1399Q?RXXi-@@	@288ICV	VB	!B1XqV4		" 
 99;!r/   c                     [         R                  " SS9u  p[        SU SS9nUR                  U5        [        R
                  " UR                  UR                  -
  S:  5      (       d   eg )NT
return_X_yrm   r   rU   )r   load_digitsr
   r9   r?   r   r$   r'   )r0   rB   _rC   s       r-   test_pca_sanity_noise_variancer=    sZ     40DA
2*1
ECGGAJ663**S-@-@@QFGGGGr/   c                     [         R                  " SS9u  p[        SSSS9n[        SU SS9nUR                  U5        UR                  U5        [	        UR                  U5      UR                  U5      SS9  g )	NTr9  rm   r   r   rU   r   rx   )r   r;  r
   r9   r   r+  )r0   rB   r<  r   r   s        r-   "test_pca_score_consistency_solversr?    sg     40DAvAFH
KILLOMM!HNN1%yq'9Er/   c                    Su  p[         R                  R                  S5      nUR                  X5      S-  [         R                  " / SQ5      -   n[        X S9nUR                  U5        UR                  S:X  d   eUR                  U5        UR                  UR                  5        UR                  S:X  d   eUR                  UR                  5        g )Nr   r   rK   r   r4   )
r?   rV   rp   r   r   r
   r9   r'   r+  T)r0   r   r   r   rB   rC   s         r-   'test_pca_zero_noise_variance_edge_casesrB    s     DA
))


"C		!# 33A
1
4CGGAJ!### IIaLGGACCL!### IIaccNr/   z4n_samples, n_features, n_components, expected_solver))rM   r   r   r   )r   r   r   r   )r     i  r   )r   rC  rM   r   )r   rC  r   r   c                 .   [         R                  R                  S5      R                  X4S9n[	        USS9n[	        X#SS9nUR                  U5        UR                  U:X  d   eUR                  U5        [        UR                  UR                  5        g )Nr   r~   )r1   rT   rU   )	r?   rV   rp   r   r
   r9   _fit_svd_solverr   r#   )r   r   r1   expected_solverr8   rz   pca_tests          r-   test_pca_svd_solver_autorH    s      99  #++)1H+ID1=H!AH LL##666LLH(((*>*>?r/   c           	      n   [         R                  R                  S5      nUR                  SS5      n[         R                  " S5      n[        S5       H'  n[        SXS9nUR                  U5      S   X4S S 24'   M)     [        U[         R                  " USS S 24   S5      R                  SS5      5        g )Nr   rM   )r  rL   r  rL   rU   )r?   rV   rp   randr   r  r
   r<   r   tilereshape)r0   r   rB   ri   irC   s         r-   test_pca_deterministic_outputrN    s    
))


"CRAHHW%M2YqZJ!//215d  M277=A+>#C#K#KBPQ#RSr/   c                 0    [        X5        [        U 5        g )N)"check_pca_float_dtype_preservation$check_pca_int_dtype_upcast_to_double)r0   r^   s     r-   test_pca_dtype_preservationrR    s    &zF(4r/   c                    [         R                  R                  U5      R                  SS5      nUR	                  [         R
                  SS9nUR	                  [         R                  5      n[        SXS9R                  U5      n[        SXS9R                  U5      nUR                  R                  [         R
                  :X  d   eUR                  R                  [         R                  :X  d   eUR                  U5      R                  [         R
                  :X  d   eUR                  U5      R                  [         R                  :X  d   e[        UR                  UR                  SSS9  g )	Nr   r   Fr   r   rU   gMbP?r    )r?   rV   rp   rJ  r   float64r   r
   r9   r#   r   r:   r   )r0   seedrB   	X_float64	X_float32pca_64pca_32s          r-   rP  rP  #  s!   
		d#((q1A%0I$IaJJNNF aJJNNF ##rzz111##rzz111I&,,

:::I&,,

:::
 F&&(:(:DQr/   c                    [         R                  R                  S5      R                  SSS5      nUR	                  [         R
                  SS9nUR	                  [         R                  SS9n[        SU SS9R                  U5      n[        SU SS9R                  U5      nUR                  R                  [         R                  :X  d   eUR                  R                  [         R                  :X  d   eUR                  U5      R                  [         R                  :X  d   eUR                  U5      R                  [         R                  :X  d   e[        UR                  UR                  SS	9  g )
Nr   r   )r   r   Fr   r   rU   g-C6?rx   )r?   rV   rp   randintr   int64int32r
   r9   r#   r   rT  r:   r   )r0   X_i64X_i32rX  rY  s        r-   rQ  rQ  ;  s   II!!!$,,Qi@ELLL.ELLL.EaJQGKKERFaJQGKKERF##rzz111##rzz111E"((BJJ666E"((BJJ666F&&(:(:Fr/   c                      [        SS9u  p[        5       R                  X5      nUR                  R	                  5       S   n[        US9R                  X5      nUR
                  U R                  S   :X  d   eg )NTr9  r   r2   )r   r
   r9   r   cumsumr(   r;   )rB   yr+   r1   r,   s        r-   5test_pca_n_components_mostly_explained_variance_ratiord  L  si     %DA599Q?D1188:2>LL)--a3D+++r/   c                      [         R                  " / SQ5      n SnS H1  n[        R                  " [        SS9   [        XU5        S S S 5        M3     g ! , (       d  f       ME  = f)Nr2   KH9rg  rg  rM   )r   r   z"should be in \[1, n_features - 1\]rn   )r?   r   rq   rr   r  r   )spectrumr   r   s      r-   test_assess_dimension_bad_rankri  X  sI    xx01HI]]:-RShi8 TS SSs   A
A"	c                      [         R                  " / SQ5      n [        U SSS9[         R                  * :  d   eS H$  n[        XS5      [         R                  * :X  a  M$   e   [	        U S5      S:X  d   eg )Nrf  r2   rM   r   r   )rL   r   )r?   r   r   infr   )rh  r   s     r-   test_small_eigenvalues_mlerm  a  sl     xx01HXA<wFFF 4???  Hb)Q...r/   c            	          [         R                  " SSSSSSS9u  p[        SS9R                  U 5      nUR                  S:X  d   eg )Nr  r2      *   )r   r   
n_repeatedn_redundantn_clusters_per_classrT   r  r   )r   r   r
   r9   r(   rB   r<  rC   s      r-   test_mle_redundant_dataru  n  sS     ''DA 5
!
%
%a
(C!!!r/   c                      [         R                  " SSSS9u  p[        SSS9n[        R                  " [
        SS	9   UR                  U 5        S S S 5        g ! , (       d  f       g = f)
Nr     rp  )r   r   rT   r  r   r4   z?n_components='mle' is only supported if n_samples >= n_featuresrn   )r   r   r
   rq   rr   r  r9   rt  s      r-   test_fit_mle_too_few_samplesrx  }  sV     ''"RTUDA
5V
4C	O
 	
	
 
 
s   A
A%c                     Su  p[         R                  R                  S5      R                  X5      n[         R                  " US S 2S S24   SS9US S 2S4'   [        SSS9nUR                  U5        UR                  US-
  :X  d   eg )	N)r   rM   r   r}   r   r  r   r  r2   )r?   rV   rp   r   r   r
   r9   r(   )r   n_dimrB   pca_skls       r-   test_mle_simple_caser|    s~      I
		a &&y8AwwqCRCyr*AaeH%F+GKKN  EAI---r/   c                  z   Su  p[         R                  " X45      n[         R                  R                  USS9u  p4n[	        USS  [         R
                  " US-
  5      SS9  [         R                  " [        USU S95      (       d   e[        SU5       H$  n[        XEU 5      [         R                  * :X  a  M$   e   g )	N)	   r  T)full_matricesr2   r5   r6   rk  rL   )
r?   r   r   svdr   r   r   r   r  rl  )r   r   rB   r<  sr   s         r-   test_assess_dimesion_rank_oner    s     I
'(AiimmATm2GA!AabE288JN3%@;;(iHIIIIa$ )4??? %r/   c                  &   [         R                  R                  S5      n SnU R                  SU5      n[	        SSUSS9R                  U5      n[	        SSS9R                  U5      n[	        SS	SS
9R                  U5      n[        [         R                  " UR                  5      [         R                  " UR                  5      5        [        [         R                  " UR                  5      [         R                  " UR                  5      5        g)zCheck that exposing and setting `n_oversamples` will provide accurate results
even when `X` as a large number of features.

Non-regression test for:
https://github.com/scikit-learn/scikit-learn/issues/20589
r   rP   r   r2   r   )r1   r0   n_oversamplesrT   r   r4   r   rU   N)	r?   rV   rp   r   r
   r9   r   r   r#   )r   r   rB   pca_randomizedr   ry   s         r-   %test_pca_randomized_svd_n_oversamplesr    s     ))


"CJ		%$A  	
 
c!f  f599!<H!qIMMaPJBFF8//0"&&9O9O2PQBFF>556z?U?U8VWr/   c                      [        SS9R                  [        R                  5      n U R	                  5       n[        [        S5       Vs/ s H  nSU 3PM
     snU5        gs  snf )z Check feature names out for PCA.rL   r   rC   N)r
   r9   r7   r8   get_feature_names_outr   r  )rC   namesrM  s      r-   test_feature_names_outr    sO    
1

!
!$))
,C%%'E5848a#aS	84e<4s   	A!c                 P   [         R                  R                  S5      nUR                  SS5      n[	        5       R                  U5      nUR                  UR                  -  n[         R                  " USSS9R                  5       n[         R                  R                  XE5        g)z9Check the accuracy of PCA's internal variance calculationr   r   r4  r2   r   N)r?   rV   rp   r   r
   r9   r$   r   r   r   testingr   )r   r   rB   rC   pca_vartrue_vars         r-   test_variance_correctnessr    sz     ))


"C		$A
%))A,C%%(E(EEGvvaaa(,,.HJJw1r/   c           	         [        X#5      n[        R                  R                  U5      nUR	                  XcS9nUR                  U5        UR                  5       nUR                  5       n	UR                  S:X  a  SOSn
[        SS9   [        U5      R                  U5      nUR                  5       nUR                  S:X  d   eUR                  UR                  :X  d   e[        [        XS9UU
[        U5      S	9  UR                  5       nUR                  S:X  d   eUR                  UR                  :X  d   e[        [        XS9U	U
[        U5      S	9  S S S 5        g ! , (       d  f       g = f)
Nr   r   g-C6*?gH׊>Tarray_api_dispatch)r   r   xpr    )r   r7   r8   r   asarrayr9   r>   r=   r   r   r   r;   r   r   r   )name	estimatorarray_namespacer   
dtype_namer  iris_npiris_xpprecision_npcovariance_npr!   estimator_xpprecision_xpcovariance_xps                 r-   check_array_api_get_precisionr    sE   	o	6Biiz*Gjjj0GMM'**,L,,.M==I-44D	4	0Y'++G4#113!!V+++!!W]]222l2
+		
 %335""f,,,""gmm333m3
+		
! 
1	0	0s   CE  
E.z#array_namespace, device, dtype_namecheckr  r4   r   rK   QR)r1   r0   power_iteration_normalizerrT   c                 @    U R                   R                  nU" XPX#US9  g )Nr   r  )	__class____name__)r  r  r  r   r  r  s         r-   test_pca_array_api_compliancer    s!    < ''D	$?jQr/   r  c                    U R                   R                  nU" XPX#US9  [        X#5      n[        SS9u  pxUR	                  USS9n[        UR                  5      n	[        U 5      n
UR                  XsS9nUR                  XS9nU
R                  Xx5        U
R                  nU
R                  n[        U
5      n[        SS9   UR                  X5        UR                  n[        U5      [        U5      :X  d   e[        UUS	9nUR                  n[        U5      [        U5      :X  d   e[        UUS	9nS S S 5        WR                  UR                  :X  d   eUR                  S
   UR                  S
   :X  d   eWR                  UR                  :X  d   e[!        UR                  S   UR                  S   5      n[#        US U US U U	S9  UR                  S   UR                  S   :w  ah  US   nUUS  nUUS  n[%        [&        R(                  " UU-
  5      U	:  5      (       d   e[%        [&        R(                  " UU-
  5      U	:  5      (       d   eg g ! , (       d  f       GN)= f)Nr  rp  rl   Fr   r   Tr  r  r2   r   r6   r}   )r  r  r   r   r   r   r   r   r  r9   r#   r$   r   array_devicer   r;   r   r   r   r?   r   )r  r  r  r   r  r  r  rB   rc  r"   estX_xpy_xpcomponents_npexplained_variance_npest_xpcomponents_xpcomponents_xp_npexplained_variance_xpexplained_variance_xp_npmin_componentsreference_varianceextra_variance_npextra_variance_xp_nps                           r-   !test_pca_mle_array_api_compliancer    sf   2 ''D	$?jQ 
o	6BB/DA	%(A!''"D
	
C::a:'D::a:'DGGAMOOM333ZF	4	0

4**M*l4.@@@@,]rB & : :12l46HHHH#45Jr#R  
1 !!]%8%8888!!!$(;(;A(>>>>#))-B-H-HHHH )//2M4G4G4JKN .1o~. a M$7$7$::2261./B7H266+.@@ADHIIII266.1CCDtKLLLL ;3 
1	0s    A2I
I#SCIPY_ARRAY_API1zSCIPY_ARRAY_API not set to 1.)reasonc                     [         R                  " S5      n U R                  [        R                  5      n[        SSSS9n[        R                  " S5      n[         R                  " [        US9   [        SS	9   UR                  U5        S S S 5        S S S 5        UR                  S
SS9  [        R                  " S5      n[         R                  " [        US9   [        SS	9   UR                  U5        S S S 5        S S S 5        UR                  S
SS9  [        R                  " S5      n[         R                  " [        US9   [        SS	9   UR                  U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N[= f! , (       d  f       g = f)Narray_api_strictrL   r   r   rU   zCPCA with svd_solver='arpack' is not supported for Array API inputs.rn   Tr  r   LU)r0   r  z[Array API does not support LU factorization. Set `power_iteration_normalizer='QR'` instead.r   zArray API does not support LU factorization, falling back to QR instead. Set `power_iteration_normalizer='QR'` explicitly to silence this warning.)rq   importorskipr  r7   r8   r
   reescaperr   r  r   r9   
set_paramswarnsUserWarning)r  r  rC   expected_msgs       r-   7test_array_api_error_and_warnings_on_unsupported_paramsr  c  sT    
		/	0Bjj#G
1
BC99ML 
z	6t4GGG 5 
7 NNltNL99	6L 
z	6t4GGG 5 
7 NNlvNN99	QL 
k	6t4GGG 5 
7	6# 54 
7	6 54 
7	6 54 
7	6sl   0
F:E3F
F&%F7F&
GF7"G3
F	=F
F
F#	F&&
F47
G	G
G)gHz>r5   )posr  r   numpyr?   rq   scipyrX   numpy.testingr   sklearnr   r   sklearn.baser   sklearn.datasetsr   r   r	   sklearn.decompositionr
   sklearn.decomposition._pcar   r   sklearn.utils._array_apir   r   r   r   r   r  -sklearn.utils._test_common.instance_generatorr   sklearn.utils._testingr   r   sklearn.utils.estimator_checksr   sklearn.utils.fixesr   r   r7   PCA_SOLVERSrZ   r[   r   SPARSE_MAX_COMPONENTSr.   markparametrizer  r8   r;   rH   re   rj   ru   r{   r   r   r   listsetr   rV   rp   r   r   r   r   r   r   r   r   rA  r  r
  r  r  r  r  r#  r&  rJ  r)  r2  r7  r=  r?  rB  rH  rN  rR  rP  rQ  rd  ri  rm  ru  rx  r|  r  r  r  r  r  r  r  skipifenvirongetr  r   r/   r-   <module>r     s	   	 	     , ,  Q Q % J  < R H ?I
  (Hh/ 6 {3q$))//!2D)EFL G 4L( $564+^n-LM2C'DE,/5Q 0 F N 5 7
5Qp +^n-LML NLB f'=>+^n-LM N ?$ +^n-LMW NW" $/;/1K 0 01Kj tC$47G$GHI '78)E4=9E4=1C
 2 : 9C
L 
		a &&sB/$$S"BQOPQR
		a &&r3/
 	:   {3I 4I ,'?@V AV {3? 4?: {36 46 {34 44 'GHE4=1- 2 I-  
RXXy),-rxxI8N/O/Q/QR ' ?!&?, 	TYY__%&	3tyy'!+,	s499??+, $))TYY[[!9:. ;. '78" 9" ,'?@ A"'"*
* -	D!	D!			q	!	&	&q"	-sA677 {3 4* {3H 4H ,'?@F AF '=> ?* :	@	@ {3T 4T {35 45
R0G"	,9
/"
.
@X4= $/2 02
D )-/'  
 %'DE   
 v.vd;='89'8F#'+		
 	!  "R#6R )-/'  
 "#   
  	62 	!  7M,7Mt JJNN$%,5T  r/   