
    {Kg                        d dl Z d dlZd dlZd dlZd dl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 d dlmZ d dlmZmZ d dlmZmZmZ d d	lmZ d d
lmZmZ d dl m!Z!m"Z" d dl#m$Z$m%Z%  ej                         Z&g dZ'd\  Z(Z) e*e(e)      Z+dxdZ,ejZ                  j]                  de'      ejZ                  j]                  d e/de&j`                  jb                  d               d               Z2ejZ                  j]                  dg d      ejZ                  j]                  dg d      ejZ                  j]                  de%e$z         ejZ                  j]                  dddg      ejZ                  j]                  dg d      d                                    Z3ejZ                  j]                  de%e$z         d        Z4ejZ                  j]                  dddg      ejZ                  j]                  de%e$z         d                Z5ejZ                  j]                  de%e$z         d!        Z6d" Z7ejZ                  j]                  d#d$d%g      ejZ                  j]                  d&e'      d'               Z8ejZ                  j]                  d( e9 e: e;e'      dd)hz
                    ejZ                  j]                  d*d+d,g      ejZ                  j]                  d-d%d$g      ejZ                  j]                  d.d%d$g      d/                             Z<ejZ                  j]                  d0ejz                  j}                  d       j                  d1d2       ej                   d1d2d3d 4      d    ejz                  j}                  d       j                  d5d1      gg d67      ejZ                  j]                  de'      d8               Z@ejZ                  j]                  dddg      d9        ZAejZ                  j]                  de'      d:        ZBejZ                  j]                  de'      d;        ZCejZ                  j]                  de'      d<        ZDejZ                  j]                  dg d=      ejZ                  j]                  d.d%d$g      d>               ZEejZ                  j]                  d? ej                  g d@g dAg       ej                  g d@g dAg      j                  g      ejZ                  j]                  dBg dC      dD               ZHejZ                  j]                  dEd e*e&j`                  jb                        fd e*e&j`                  jb                        dz
  fd e*e&j`                  jb                        fg      ejZ                  j]                  d?e&j`                  e&j`                  j                  g      dF               ZIejZ                  j]                  dd)dg      dG        ZJejZ                  j]                  dddg      dH        ZKdI ZLdJ ZMdK ZNdL ZOejZ                  j]                  dMe&j`                  dNdOfe&j`                  dPdfejz                  j}                  d       j                  dQdR      dSdOfg      dT        ZQejZ                  j]                  de'      dU        ZRdV ZSejZ                  j]                  de'      dW        ZTejZ                  j]                  dddg      dX        ZUejZ                  j]                  dddg      dY        ZVejZ                  j]                  dZg d[      d\        ZWejZ                  j]                  de'      d]        ZXejZ                  j]                  de'      d^        ZYd_ ZZd` Z[da Z\db Z]dc Z^dd Z_de Z`df Zadg Zbdh Zcdi ZdejZ                  j]                  d#d$d%g      dj        Zedk ZfejZ                  j]                  dl e             ejZ                  j]                  dme"efge!7      ejZ                  j]                  dn edOdo       edOdd$p       edqdd$p       edOdo       edOdd$p       edOddrd s      ge!7      dt                      ZgejZ                  j]                  dl e             ejZ                  j]                  dmefge!7      ejZ                  j]                  dn edudo      ge!7      dv                      Zhdw Ziy)y    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)yield_namespace_device_dtype_combinationsdevice)_array_api_for_testsassert_allclose)_get_check_estimator_ids check_array_api_input_and_values)CSC_CONTAINERSCSR_CONTAINERS)fullcovariance_eigharpack
randomizedauto)  i,  c                    t        | j                  |j                  ||       t        | j                  |j                  ||       t        | j                  |j                  ||       t        | j                  |j                  ||       t        | j
                  |j
                  ||       | j                  |j                  k(  sJ | j                  |j                  k(  sJ | j                  |j                  k(  sJ y )Nrtolatol)	r   components_explained_variance_singular_values_mean_noise_variance_n_components_
n_samples_n_features_in_)pca1pca2r    r!   s       h/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/sklearn/decomposition/tests/test_pca.py_check_fitted_pca_closer-   %   s    D$$d&6&6TM  $":":D D))4+@+@tRVWDJJ

DAD(($*>*>TPTU!3!3333??doo---$"5"5555    
svd_solvern_components   c                    t         j                  }t        ||       }|j                  |      j	                  |      }|j
                  d   |k(  sJ |j                  |      }t        ||       |j	                  |      }t        ||       |j                         }|j                         }t        t        j                  ||      t        j                  |j
                  d         d       y )Nr0   r/   r1   -q=r!   )irisdatar
   fit	transformshapefit_transformr   get_covarianceget_precisionnpdoteye)r/   r0   XpcaX_rX_r2cov	precisions           r,   test_pcarG   3   s     			A
<J
?C ''!*

q
!C99Q<<''' QDC
--
CC 


C!!#IBFF3	*BFF1771:,>UKr.   density){Gz?皙?g333333?)r1      
   sparse_containerr   r   scale)r1   rL   d   c                    d}d}t         j                  j                  |       } |t        j                  j                  t
        t        ||            }	|j                  |	j                  d         |z  }
|	j                  |
      }	t        |||       }|j                  |	       |	j                         }t        |||       }|j                  |       t        |||        |t        j                  j                  t
        t        ||            }|j                         }t        |j                  |      |j                  |      |       t        |j                  |      |j                  |      |       y)z?Check that the results are the same for sparse and dense input.r4   绽|=random_staterH   r1   r0   r/   rS   r5   N)r>   randomdefault_rngspsparseSPARSE_MSPARSE_Nr:   multiplyr
   r8   toarrayr-   r   r9   )global_random_seedr/   rM   r0   rH   rN   r!   transform_atolrS   rA   scale_vectorrB   XdpcadX2X2ds                   r,   test_pca_sparserd   I   sN    DN99(();<L
		%	 	 	
	A  &&qwwqz2U:L	

< A
!'C
 GGAJ	
B!'D
 	HHRL CD1 

		%	 	 	

B **,CCMM"%s}}S'9OCMM"%t~~c':Pr.   c                 Z   t         j                  j                  |       } |t        j                  j                  t
        t        |d            } |t        j                  j                  t
        t        |d            }t        dd|       }t        dd|       }|j                  |       |j                  |      }t        ||       t        ||j                  |             t        ||j                  |             t        |j                  |      |j                  |             y )NrI   rR   rL   r   rT   )r>   rU   rV   rW   rX   rY   rZ   r
   r8   r;   r-   r   r9   )r]   rM   rS   rA   rb   pca_fitpca_fit_transformtransformed_Xs           r,   test_pca_sparse_fit_transformri      s   99(();<L
		%	 	 	
	A 

		%	 	 	

B rhEWXGH;M KKN%33A6MG%67M#4#>#>q#ABM7#4#4Q#78G%%b)+<+F+Fr+JKr.   r   r   c                 J   t         j                  j                  |       } |t        j                  j                  t
        t        |            }t        d|      }d| d}t        j                  t        |      5  |j                  |       d d d        y # 1 sw Y   y xY w)NrS      r3   zWPCA only support sparse inputs with the "arpack" and "covariance_eigh" solvers, while "z" was passedmatch)r>   rU   RandomStaterW   rX   rY   rZ   r
   pytestraises	TypeErrorr8   )r]   r/   rM   rS   rA   rB   error_msg_patterns          r,   test_sparse_pca_solver_errorrt      s     99(();<L
		% 	 	
	A 2*
5C	&<|	5  
y(9	:
 
;	:	:s   >BB"c                 V   t         j                  j                  |       } |t        j                  j                  t
        t        |            }t        dd      j                  |      }t        dd      j                  |      }t        |j                  |j                  d       y)	zHCheck that "auto" and "arpack" solvers are equivalent for sparse inputs.rk   rL   r   r3   r   {Gzt?r    N)r>   rU   ro   rW   rX   rY   rZ   r
   r8   r   r$   )r]   rM   rS   rA   
pca_arpackpca_autos         r,   7test_sparse_pca_auto_arpack_singluar_values_consistencyrz      s    
 99(();<L
		% 	 	
	A ":>>qAJv6::1=HJ//1J1JQUVr.   c                     d} | dz   }t         j                  j                  dd| |f      }t        |       }t	        j
                         5  t	        j                  dt               |j                  |       d d d        y # 1 sw Y   y xY w)NrL   rK   r1   sizer0   error)	r>   rU   uniformr
   warningscatch_warningssimplefilterRuntimeWarningr8   )r0   
n_featuresrA   rB   s       r,   test_no_empty_slice_warningr      sn    L!J
		"a|Z&@AA
<
(C		 	 	"g~6
 
#	"	"s   ,BB
copyTFsolverc                    t         j                  j                  d      }d}d}d}d}t        j                  |j	                  ||      t        j                  t        j
                  t        j                  dd|            |j	                  ||                  }|d d d dfxx   dz  cc<   |j                  ||fk(  sJ |j                  d	      j                         d
kD  sJ |j                         }t        |d|| dd      }	|	j                  |j                               }
|
j                  ||fk(  sJ |	j                  |      }t        |
|d       t        |
j                  dd      t        j                  |             t        |
j                  d	      t        j                   |      d       |j                         }t        |d||       j#                  |j                               }	|	j                  |      }|j                  ||fk(  sJ |j                  d	      j                         t%        j&                  dd      k(  sJ y )Nr   rO   P   rl   2   g      $@      ?   axisgfffffE@T   )r0   whitenr   r/   rS   iterated_powergMb@?rw   r1   ddofr   r4   r5   F)r0   r   r   r/   gfffffR@rJ   )rel)r>   rU   ro   r?   randndiaglinspacer:   stdr   r
   r;   r9   r   onesmeanzerosr8   rp   approx)r   r   rng	n_samplesr   r0   rankrA   X_rB   
X_whitenedX_whitened2X_unwhiteneds                r,   test_whiteningr      s	    ))


"CIJLD 			)T"
rwwr{{4d34ciij6Q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
!%dv	c"'')n  ==$L)\!:::: #'')V]]4T-JJJJr.   other_svd_solverr   
data_shapetallwiderank_deficientr   c                 	   |dk(  rd\  }}nd\  }}d}|r[t         j                  j                  |      }	t        ||      dz  }
|	j	                  ||z   |
f      |	j	                  |
|f      z  }nt        ||z   |d|      }t        ||      }
|j                  |d	
      }|d | ||d  }}|t         j                  k(  rt        dd      }d}nt        dd      }d}i }| dk(  rd}ddi}n!| dk(  rt        j                  ||      dz
  }nd }t        |d|      }t        d|| ||d|}|j                  |      }t        j                  |      j                         sJ |j                  |k(  sJ |j                  |      }t        j                  |      j                         sJ |j                  |k(  sJ |j                  dk\  j                         sJ t!        |j                  |j                  fi | t!        |j"                  |j"                  fi | |j$                  }t        j                  |      j                         sJ |j$                  }t        j                  |      j                         sJ |j                  |kD  }|j'                         dkD  sJ t!        ||   ||   fi | t!        |d d |f   |d d |f   fi | |j)                  |      }t        j                  |      j                         sJ |j                  |k(  sJ |j)                  |      }t        j                  |      j                         sJ |j                  |k(  sJ t!        |d d |f   |d d |f   fi | |j+                  |      }t        j                  |      j                         sJ |j                  |k(  sJ |j+                  |      }t        j                  |      j                         sJ |j                  |k(  sJ |j$                  j,                  d   |j$                  j,                  d   k(  rt!        ||fi | t!        ||fi | y |j$                  j,                  d   |
k  r-|j                  j                         |kD  sJ t!        ||fi | y t!        |j)                  |      d d |f   |j)                  |      d d |f   fi | y )Nr   )rO   rl   )rl   rO   rL   rK   r}         ?)r   r   tail_strengthrS   Fr   gQ?h㈵>)r!   r    rQ   r4   r   r   r   r   r1   r   r0   r/   r   )r0   r/   r   rS   r    )r>   rU   rV   minstandard_normalr	   astypefloat32dictminimumr
   r;   isfinitealldtyper#   r   explained_variance_ratio_r"   sumr9   inverse_transformr:   )r   r   r   r   r]   global_dtyper   r   n_samples_testr   r   rA   X_trainX_testtolsvariance_thresholdextra_other_kwargsr0   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     s-    V '	: '	:Nii##$679j)Q.n,d3   
dJ%789 !.0!+	
 9j)	E*A
mQyz]VGrzz!D)!U+"<' .3	X	% zz)Z81< OH !#'	
 I "//8;;)*..000##|333#11':;;*+//111$$444((A-22444H00)2O2OXSWX**++ 
 $//;;+,00222 ,,;;'(,,... )),>>F::<!(02B62JSdS AvI&(:1f9(EIM !**62;;()--///""l222",,V4;;)*..000##|333&q&y13DQY3OXSWX "334EF;;)*..000##|333#556HI;;*+//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.   rA   rO   r   N   )n_informativerS   rL   )zrandom-tallzcorrelated-tallzrandom-wide)idsc                 X   t        d|d      }|j                  |       }t        |j                  t	        j
                  |dd             t        j                  j                  t	        j                  | d            d   }t        |d	      d d }t        |j                  |d
       y )NrK   r   rT   r1   r   F)rowvarT)reverserv   rw   )
r
   r;   r   r#   r>   varlinalgeigrE   sorted)rA   r/   rB   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                 0   t         j                  j                  d      }d\  }}|j                  ||      }t	        dd|      }t	        d| |      }|j                  |       |j                  |       t        |j                  |j                  d       y )Nr   rO   r   rK   r   rT   rv   rw   )r>   rU   ro   r   r
   r8   r   r$   )r/   r   r   r   rA   r   r   s          r,   $test_pca_singular_values_consistencyr     s|    
))


"C#Iz		)Z(Af3GHzLILLOMM!H--y/I/IPTUr.   c           	      l   t         j                  j                  d      }d\  }}|j                  ||      }t	        d| |      }|j                  |      }t        t        j                  |j                  dz        t         j                  j                  |d      dz         t        |j                  t        j                  t        j                  |dz  d                   d\  }}|j                  ||      }t	        d| |      }|j                  |      }|t        j                  t        j                  |dz  d            z  }|d d dfxx   d	z  cc<   |d d d
fxx   dz  cc<   t        j                  ||j                        }|j                  |       t        |j                  g d       y )Nr   r   rK   rT   fror   )rO   n   r   A`"	@r1   X9v@)r   r   r   )r>   rU   ro   r   r
   r;   r   r   r$   r   normsqrtr?   r"   r8   )r/   r   r   r   rA   rB   X_transX_hats           r,   test_pca_singular_valuesr     s_   
))


"C#Iz		)Z(A
1#
FC"G 
s##Q&')G1)L C(("''"&&!!2L*MN %Iz		)Z(A
1#
FC"Grwwrvvgqjq122GAqDMUMAqDMUMFF7COO,EGGENC((*=>r.   c                    t         j                  j                  d      }d\  }}|j                  ||      dz  }|d dxxx t        j                  g d      z  ccc d|j                  d|      z  t        j                  g d      z   }t        d|       j                  |      j                  |      }|t        j                  |dz  j                               z  }t        t        j                  |d   d         d	d
       y )Nr   rO   r   rJ   rL   r         r1   rK   r3   r   rv   rw   )r>   rU   ro   r   arrayr
   r8   r9   r   r   r   abs)r/   r   nprA   XtYts          r,   test_pca_check_projectionr     s     ))


"CDAq		!Q#AcrFbhhy!!F	syyA	)!4	4B	!
	3	7	7	:	D	DR	HB"''2q5++-
  BBFF2a58$c5r.   c                     ddgddgg}t        d| d      }|j                  |      }|j                  sJ d       t        |j	                         dd       t        |j                         d	d
       y )Nr   g        r1   r   rT   )rK   r1   r4   r5   gQ?rv   rw   )r
   r;   r:   r   r   r   )r/   rA   rB   r   s       r,   test_pca_check_projection_listr     si     sc3Z A
1!
DC"G== & =GLLNDu5GKKM4d3r.   )r   r   r   c                 :   t         j                  j                  d      }d\  }}|j                  ||      }|d d dfxx   dz  cc<   |g dz  }t	        d| |      j                  |      }|j                  |      }|j                  |      }t        ||d	       y )
Nr   )r   r   r1   r   )r   r   r   rK   r   h㈵>rw   )	r>   rU   ro   r   r
   r8   r9   r   r   )	r/   r   r   r   r   rA   rB   Y	Y_inverses	            r,   test_pca_inverser     s     ))


"CDAq		!QAadGwGNA 1F
C
G
G
JCaA%%a(IAyt,r.   r7   )r   r1   r   )r1   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   rK   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                 p   d}t        ||       }t        j                  t        |      5  |j	                  |       d d d        | dk(  rU|}dj                  ||      }t        j                  t        |      5  t        ||       j	                  |       d d d        y y # 1 sw Y   dxY w# 1 sw Y   y xY w)NrK   r/   rm   r   zgn_components={}L? must be strictly less than min\(n_samples, n_features\)={}L? with svd_solver='arpack')r
   rp   rq   
ValueErrorr8   format)r/   r7   r0   err_msg
smallest_d
pca_fitteds         r,   test_pca_validationr  	  s    , J\j9J	z	1t 
2 X!""(&z"B 	
 ]]:W5488> 65 	 
2	1 65s   B 9B, B),B5zsolver, n_components_c                 `    t        |      }|j                  |        |j                  |k(  sJ y )Nr  )r
   r8   r'   )r7   r   r'   rB   s       r,   test_n_components_noner	  2  s-     
 CGGDM---r.   c                     t         j                  j                  d      }d\  }}|j                  ||      }t	        d|       }|j                  |       |j                  dk(  sJ y )Nr   iX  rL   mler3   r1   )r>   rU   ro   r   r
   r8   r'   )r/   r   r   r   rA   rB   s         r,   test_n_components_mler  A  s]     ))


"C#Iz		)Z(A
5Z
8CGGAJ!!!r.   c                 .   t         j                  j                  d      }d\  }}|j                  ||      }t	        d|       }dj                  |       }t        j                  t        |      5  |j                  |       d d d        y # 1 sw Y   y xY w)Nr   r  r  r3   z:n_components='mle' cannot be a string with svd_solver='{}'rm   )
r>   rU   ro   r   r
   r  rp   rq   r  r8   )r/   r   r   r   rA   rB   r  s          r,   test_n_components_mle_errorr  L  sx     ))


"C#Iz		)Z(A
5Z
8CJQQG 
z	1
 
2	1	1s   0BBc                  8   t         j                  j                  d      } d\  }}| j                  ||      dz  }|d dxxx t        j                  g d      z  ccc t        dd      j                  |      }|j                  dk(  sJ |j                  d	k(  sJ y )
Nr   rO   r   rJ   rL   r   r   r   r1   rK   r  r   r3   r1   )	r>   rU   ro   r   r   r
   r8   r0   r'   )r   r   r   rA   rB   s        r,   test_pca_dimr  [  s    
))


"CDAq		!Q#AcrFbhh''F
5V
4
8
8
;Cu$$$!!!r.   c            
         d\  } }t         j                  j                  d      }|j                  | |      dz  |j                  | d      t        j                  g d      z  z   t        j                  g d      z   }t        |d      }|j                  |       |j                  }t        j                  t        d|      D cg c]  }t        |||        c}      }|d   |j                         d	| z  z
  kD  sJ y c c}w )
Nr   r   r   rJ   r1   r  )r1   r   r   r      r   r3   rI   )r>   rU   ro   r   r   r
   r8   r#   ranger   max)r   r   r   rA   rB   spectklls           r,   test_infer_dim_1r  f  s     DAq
))


"C		!Q#
))Aq/BHH_5
5	6
((?
#	$ 
 1
0CGGAJ##E	5A;G;a$UAq1;G	HBa52668dQh&&&& Hs   C>c                  x   d\  } }t         j                  j                  d      }|j                  | |      dz  }|d dxxx t        j                  g d      z  ccc |ddxxx t        j                  g d      z  ccc t        |d	      }|j                  |       |j                  }t        ||       d
kD  sJ y )Nr  r   rJ   rL   r     r  r   r   rK   r|   r   r3   r1   	r>   rU   ro   r   r   r
   r8   r#   r   r   r   r   rA   rB   r  s         r,   test_infer_dim_2r"  w  s     DAq
))


"C		!Q#AcrFbhh''FbH)**H
1
0CGGAJ##EE1%)))r.   c            	         d\  } }t         j                  j                  d      }|j                  | |      dz  }|d dxxx t        j                  g d      z  ccc |ddxxx t        j                  g d      z  ccc |dd	xxx d
t        j                  g d      z  z  ccc t        |d      }|j                  |       |j                  }t        ||       d
kD  sJ y )Nr  r   rJ   rL   r  r  r  rl   (   rK   )r|   r1   r|   r1   r|   r   r3   r   r!  s         r,   test_infer_dim_3r%    s    DAq
))


"C		!Q#AcrFbhh''FbH)**HbHBHH/000H
1
0CGGAJ##EE1%)))r.   z'X, n_components, n_components_validatedgffffff?rK   rI   r   r  r   c                     t        |d      }|j                  |        |j                  t        j                  |      k(  sJ |j
                  |k(  sJ y )Nr   r3   )r
   r8   r0   rp   r   r'   )rA   r0   n_components_validatedrB   s       r,   $test_infer_dim_by_explained_variancer(    sM     <F
;CGGAJv}}\:::: 6666r.   c                    d\  }}t         j                  j                  d      }|j                  ||      dz  t        j                  g d      z   }t        d|       }|j                  |       |j                  |      }dt        j                  dt         j                  z  t        j                  d      z  d	z        z  |z  }t        ||z  dd
       |j                  |j                  ||      dz  t        j                  g d      z         }||kD  sJ t        dd|       }|j                  |       |j                  |      }||kD  sJ y )N)r   r   r   rJ   r   rK   r3   g      r1   g|Gz?g?rw   g?T)r0   r   r/   )r>   rU   ro   r   r   r
   r8   scorelogpiexpr   )	r/   r   r   r   rA   rB   ll1hll2s	            r,   test_pca_scorer1    s    DAq
))


"C		!Q# 33A
1
4CGGAJ
))A,Crvva"%%i"&&)+f4559AC!GQT*
))CIIaOc)BHHY,??
@C99
1Tj
ACGGAJ
))A,C99r.   c                  x   d\  } }t         j                  j                  d      }|j                  | |      |j                  | d      t        j                  g d      z  z   t        j                  g d      z   }|j                  | |      |j                  | d      t        j                  g d      z  z   t        j                  g d      z   }t        j
                  |      }t        |      D ]4  }t        |d      }|j                  |       |j                  |      ||<   6 |j                         dk(  sJ y )N)   r   r   r1   r   )r1   r   r   r   r3   )r>   rU   ro   r   r   r   r  r
   r8   r*  argmax)r   r   r   Xlr   r  r  rB   s           r,   test_pca_score3r6    s    DAq
))


"C	1a399Q?RXXi-@@	@288ICV	VB	1a399Q?RXXi-@@	@288ICV	VB	!B1XqV4		"1 
 99;!r.   c                     t        j                  d      \  }}t        d| d      }|j                  |       t	        j
                  |j                  |j                  z
  dk\        sJ y )NT
return_X_yrl   r   rT   )r   load_digitsr
   r8   r>   r   r#   r&   )r/   rA   _rB   s       r,   test_pca_sanity_noise_variancer<    sY     40DAq
2*1
ECGGAJ663**S-@-@@QFGGGr.   c                 
   t        j                  d      \  }}t        ddd      }t        d| d      }|j                  |       |j                  |       t	        |j                  |      |j                  |      d       y )	NTr8  rl   r   r   rT   r   rw   )r   r:  r
   r8   r   r*  )r/   rA   r;  r   r   s        r,   "test_pca_score_consistency_solversr>    si     40DAqvAFH
KILLOMM!HNN1%yq'9Er.   c                    d\  }}t         j                  j                  d      }|j                  ||      dz  t        j                  g d      z   }t        ||       }|j                  |       |j                  dk(  sJ |j                  |       |j                  |j                         |j                  dk(  sJ |j                  |j                         y )Nr   r   rJ   r   r3   )
r>   rU   ro   r   r   r
   r8   r&   r*  T)r/   r   r   r   rA   rB   s         r,   'test_pca_zero_noise_variance_edge_casesrA    s     DAq
))


"C		!Q# 33A
1
4CGGAJ!### IIaLGGACCL!### IIaccNr.   z4n_samples, n_features, n_components, expected_solver))rL   r   r   r   )r   r   r   r   )r     i  r   )r   rB  rL   r   )r   rB  r   r   c                 B   t         j                  j                  d      j                  | |f      }t	        |d      }t	        ||d      }|j                  |       |j                  |k(  sJ |j                  |       t        |j                  |j                         y )Nr   r}   )r0   rS   rT   )	r>   rU   ro   r   r
   r8   _fit_svd_solverr   r"   )r   r   r0   expected_solverr7   ry   pca_tests          r,   test_pca_svd_solver_autorG    s      99  #++)Z1H+ID1=H!oAH LL##666LLH(((*>*>?r.   c           	      p   t         j                  j                  d      }|j                  dd      }t        j                  d      }t        d      D ]+  }t        d| |      }|j                  |      d   ||d d f<   - t        |t        j                  |dd d f   d      j                  dd             y )Nr   rL   )r  rK   r  rK   rT   )r>   rU   ro   randr   r  r
   r;   r   tilereshape)r/   r   rA   rh   irB   s         r,   test_pca_deterministic_outputrM    s    
))


"CRAHHW%M2YqZcJ!//215ad  M277=A+>#C#K#KBPQ#RSr.   c                 2    t        | |       t        |        y )N)"check_pca_float_dtype_preservation$check_pca_int_dtype_upcast_to_double)r/   r]   s     r,   test_pca_dtype_preservationrQ    s    &z3EF(4r.   c                    t         j                  j                  |      j                  dd      }|j	                  t         j
                  d      }|j	                  t         j                        }t        d| |      j                  |      }t        d| |      j                  |      }|j                  j                  t         j
                  k(  sJ |j                  j                  t         j                  k(  sJ |j                  |      j                  t         j
                  k(  sJ |j                  |      j                  t         j                  k(  sJ t        |j                  |j                  dd       y )	Nr   r   Fr   r   rT   gMbP?r   )r>   rU   ro   rI  r   float64r   r
   r8   r"   r   r9   r   )r/   seedrA   	X_float64	X_float32pca_64pca_32s          r,   rO  rO  !  s%   
		d#((q1A%0I$IaJTJNNF aJTJNNF ##rzz111##rzz111I&,,

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

:::
 F&&(:(:DQr.   c                    t         j                  j                  d      j                  ddd      }|j	                  t         j
                  d      }|j	                  t         j                  d      }t        d| d      j                  |      }t        d| d      j                  |      }|j                  j                  t         j                  k(  sJ |j                  j                  t         j                  k(  sJ |j                  |      j                  t         j                  k(  sJ |j                  |      j                  t         j                  k(  sJ t        |j                  |j                  d	       y )
Nr   r   )r   r   Fr   r   rT   g-C6?rw   )r>   rU   ro   randintr   int64int32r
   r8   r"   r   rS  r9   r   )r/   X_i64X_i32rW  rX  s        r,   rP  rP  9  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                     t        d      \  } }t               j                  | |      }|j                  j	                         d   }t        |      j                  | |      }|j
                  | j                  d   k(  sJ y )NTr8  r   r1   )r   r
   r8   r   cumsumr'   r:   )rA   yr*   r0   r+   s        r,   5test_pca_n_components_mostly_explained_variance_ratiorc  J  so     %DAq599Q?D1188:2>LL)--a3D+++r.   c                      t        j                  g d      } d}dD ]3  }t        j                  t        d      5  t        | ||       d d d        5 y # 1 sw Y   @xY w)Nr1   KH9rf  rf  rL   )r   r   z"should be in \[1, n_features - 1\]rm   )r>   r   rp   rq   r  r   )spectrumr   r   s      r,   test_assess_dimension_bad_rankrh  V  sK    xx01HI]]:-RShi8 TS SSs   AA	c                      t        j                  g d      } t        | dd      t         j                   kD  sJ dD ]#  }t        | |d      t         j                   k(  r#J  t	        | d      dk(  sJ y )Nre  r1   rL   r   r   )rK   r   )r>   r   r   infr   )rg  r   s     r,   test_small_eigenvalues_mlerl  _  sn     xx01HXA<wFFF 44???  Hb)Q...r.   c                      t        j                  dddddd      \  } }t        d      j                  |       }|j                  dk(  sJ y )Nr  r1      *   )r   r   
n_repeatedn_redundantn_clusters_per_classrS   r  r   )r   r   r
   r8   r'   rA   r;  rB   s      r,   test_mle_redundant_datart  l  sU     ''DAq 5
!
%
%a
(C!!!r.   c                      t        j                  ddd      \  } }t        dd      }t        j                  t
        d	      5  |j                  |        d d d        y # 1 sw Y   y xY w)
Nr     ro  )r   r   rS   r  r   r3   z?n_components='mle' is only supported if n_samples >= n_featuresrm   )r   r   r
   rp   rq   r  r8   rs  s      r,   test_fit_mle_too_few_samplesrw  {  sX     ''"RTUDAq
5V
4C	O
 	
	
 
 
s   AA(c                     d\  } }t         j                  j                  d      j                  | |      }t        j                  |d d d df   d      |d d df<   t        dd      }|j                  |       |j                  |dz
  k(  sJ y )	N)r   rL   r   r|   r   r  r   r  r1   )r>   rU   ro   r   r   r
   r8   r'   )r   n_dimrA   pca_skls       r,   test_mle_simple_caser{    s      Iu
		a &&y%8AwwqCRCyr*AaeH%F+GKKN  EAI---r.   c                  ~   d\  } }t        j                  | |f      }t         j                  j                  |d      \  }}}t	        |dd  t        j
                  |dz
        d       t        j                  t        |d|             sJ t        d|      D ]#  }t        |||       t         j                   k(  r#J  y )	N)	   r  T)full_matricesr1   r4   r5   rj  rK   )
r>   r   r   svdr   r   r   r   r  rk  )r   r   rA   r;  sr   s         r,   test_assess_dimesion_rank_oner    s     Iz
J'(AiimmATm2GAq!AabE288JN3%@;;(iHIIIa$ D)4??? %r.   c                  0   t         j                  j                  d      } d}| j                  d|      }t	        dd|d      j                  |      }t	        dd      j                  |      }t	        dd	d
      j                  |      }t        t        j                  |j                        t        j                  |j                               t        t        j                  |j                        t        j                  |j                               y)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   rO   r   r1   r   )r0   r/   n_oversamplesrS   r   r3   r   rT   N)	r>   rU   ro   r   r
   r8   r   r   r"   )r   r   rA   pca_randomizedr   rx   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                      t        d      j                  t        j                        } | j	                         }t        t        d      D cg c]  }d| 	 c}|       yc c}w )z Check feature names out for PCA.rK   r   rB   N)r
   r8   r6   r7   get_feature_names_outr   r  )rB   namesrL  s      r,   test_feature_names_outr    sO    
1

!
!$))
,C%%'E5848a#aS	84e<4s   A!c                 V   t         j                  j                  d      }|j                  dd      }t	               j                  |      }|j                  |j                  z  }t        j                  |dd      j                         }t         j                  j                  ||       y)z9Check the accuracy of PCA's internal variance calculationr   r   r3  r1   r   N)r>   rU   ro   r   r
   r8   r#   r   r   r   testingr   )r   r   rA   rB   pca_vartrue_vars         r,   test_variance_correctnessr    s|     ))


"C		$A
%))A,C%%(E(EEGvvaaa(,,.HJJw1r.   c           	         t        ||      }t        j                  j                  |      }|j	                  ||      }|j                  |       |j                         }|j                         }	|j                  dk(  rdnd}
t        d      5  t        |      j                  |      }|j                         }|j                  dk(  sJ |j                  |j                  k(  sJ t        t        ||      ||
t        |      	       |j                         }|j                  dk(  sJ |j                  |j                  k(  sJ t        t        ||      |	|
t        |      	       d d d        y # 1 sw Y   y xY w)
Nr   r   g-C6*?gH׊>Tarray_api_dispatch)r   r   xpr   )r   r6   r7   r   asarrayr8   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    sM   	ov	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lr2
+		
 %335""f,,,""gmm333m3
+		
! 
1	0	0s   CE11E:z#array_namespace, device, dtype_namecheckr  r3   r   rJ   QR)r0   r/   power_iteration_normalizerrS   c                 J    | j                   j                  } ||| |||       y )Nr   r  )	__class____name__)r  r  r  r   r  r  s         r,   test_pca_array_api_compliancer    s%    8 ''D	$	?6jQr.   r  c                    | j                   j                  } ||| |||       t        ||      }t        d      \  }}|j	                  |d      }t        |j                        }	t        |       }
|j                  ||      }|j                  ||      }|
j                  ||       |
j                  }|
j                  }t        |
      }t        d      5  |j                  ||       |j                  }t        |      t        |      k(  sJ t        ||	      }|j                  }t        |      t        |      k(  sJ t        ||	      }d d d        j                  |j                  k(  sJ |j                  d
   |j                  d
   k(  sJ j                  |j                  k(  sJ t!        |j                  d   |j                  d         }t#        |d | |d | |	       |j                  d   |j                  d   k7  r\|d   }||d  }||d  }t%        t'        j(                  ||z
        |	k        sJ t%        t'        j(                  ||z
        |	k        sJ y y # 1 sw Y   xY w)Nr  ro  rk   Fr   r   Tr  r  r1   r   r5   r|   )r  r  r   r   r   r   r   r   r  r8   r"   r#   r   array_devicer   r:   r   r   r   r>   r   )r  r  r  r   r  r  r  rA   rb  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    sp   . ''D	$	?6jQ 
ov	6BB/DAq	%(A!''"D
	
C::a:'D::a:'DGGAqM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266.1CCDtKLLL ;3 
1	0s   A7I%%I/c                     t        j                  d       t        j                  d      } | j                  t        j                        }t        ddd      }t        j                  d      }t        j                  t        |      5  t        d	
      5  |j                  |       d d d        d d d        |j                  dd       t        j                  d      }t        j                  t        |      5  t        d	
      5  |j                  |       d d d        d d d        |j                  dd       t        j                  d      }t        j                  t        |      5  t        d	
      5  |j                  |       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   BxY w# 1 sw Y   y xY w)Narray_api_compatarray_api_strictrK   r   r   rT   zCPCA with svd_solver='arpack' is not supported for Array API inputs.rm   Tr  r   LU)r/   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.)rp   importorskipr  r6   r7   r
   reescaperq   r  r   r8   
set_paramswarnsUserWarning)r  r  rB   expected_msgs       r,   7test_array_api_error_and_warnings_on_unsupported_paramsr  ]  sa   
*+			/	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   F(F'F(:G F4G ,G9GGF%	!F((F14F=	9G  G	G	GG!)gHz>r4   )jr  r   numpyr>   rp   scipyrW   numpy.testingr   sklearnr   r   sklearn.baser   sklearn.datasetsr   r   r	   sklearn.decompositionr
   sklearn.decomposition._pcar   r   sklearn.utils._array_apir   r   r   r   r  sklearn.utils._testingr   r   sklearn.utils.estimator_checksr   r   sklearn.utils.fixesr   r   r6   PCA_SOLVERSrY   rZ   r   SPARSE_MAX_COMPONENTSr-   markparametrizer  r7   r:   rG   rd   ri   rt   rz   r   r   r   listsetr   rU   ro   r   r   r   r   r   r   r   r   r@  r  r	  r  r  r  r  r"  r%  rI  r(  r1  r6  r<  r>  rA  rG  rM  rQ  rO  rP  rc  rh  rl  rt  rw  r{  r  r  r  r  r  r  r  r  r   r.   r,   <module>r     s]	   	     , ,  Q Q % J 
 < H ?x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-  
XRXXy),-xrxx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 )+T+V %'DE   
 v.vd;='89'8F#'+		
 	!  "R#2R )+T+V "#   
  	62 	!  7M(7Mtr.   