
    0Ph                     `   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 d dlm Z m!Z! d dl"m#Z# d dl$m%Z%m&Z&  ej                    Z'g dZ(d\  Z)Z* e+e)e*          Z,d{dZ-ej.        /                    de(          ej.        /                    d e0de'j1        j2        d                             d                         Z3ej.        /                    dg d          ej.        /                    dg d          ej.        /                    de&e%z             ej.        /                    dddg          ej.        /                    dg d          d                                                             Z4ej.        /                    de&e%z             d              Z5ej.        /                    dd!d"g          ej.        /                    de&e%z             d#                         Z6ej.        /                    de&e%z             d$             Z7d% Z8ej.        /                    d&d'd(g          ej.        /                    d)e(          d*                         Z9ej.        /                    d+ e: e; e<e(          d"d,hz
                                ej.        /                    d-d.d/g          ej.        /                    d0d(d'g          ej.        /                    d1d(d'g          d2                                                 Z=ej.        /                    d3ej>        ?                    d           @                    d4d5           ej        d4d5d6d 7          d          ej>        ?                    d           @                    d8d4          gg d9:          ej.        /                    de(          d;                         ZAej.        /                    ddd!g          d<             ZBej.        /                    de(          d=             ZCej.        /                    de(          d>             ZDej.        /                    de(          d?             ZEej.        /                    dg d@          ej.        /                    d1d(d'g          dA                         ZFej.        /                    dB ejG        g dCg dDg           ejG        g dCg dDg          jH        g          ej.        /                    dEg dF          dG                         ZIej.        /                    dHd" e+e'j1        j2                  fd e+e'j1        j2                  dz
  fd! e+e'j1        j2                  fg          ej.        /                    dBe'j1        e'j1        jH        g          dI                         ZJej.        /                    dd,d"g          dJ             ZKej.        /                    ddd!g          dK             ZLdL ZMdM ZNdN ZOdO ZPej.        /                    dPe'j1        dQdRfe'j1        dSdfej>        ?                    d           Q                    dTdU          dVdRfg          dW             ZRej.        /                    de(          dX             ZSdY ZTej.        /                    de(          dZ             ZUej.        /                    ddd!g          d[             ZVej.        /                    dd"d!g          d\             ZWej.        /                    d]g d^          d_             ZXej.        /                    de(          d`             ZYej.        /                    de(          da             ZZdb Z[dc Z\dd Z]de Z^df Z_dg Z`dh Zadi Zbdj Zcdk Zddl Zeej.        /                    d&d'd(g          dm             Zfdn Zgej.        /                    do e                      ej.        /                    dpe#egge:          ej.        /                    dq edRd"r           edRd"d's           edtd"d's           edRdr           edRdd's           edRd!dud v          ge:          dw                                     Zhej.        /                    do e                      ej.        /                    dpegge:          ej.        /                    dq edxd"r          ge:          dy                                     Zidz ZjdS )|    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)_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,  Hz>-q=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 d S )Nrtolatol)	r   components_explained_variance_singular_values_mean_noise_variance_n_components_
n_samples_n_features_in_)pca1pca2r"   r#   s       d/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/sklearn/decomposition/tests/test_pca.py_check_fitted_pca_closer/   %   s    D$d&6TMMMM $":D    D)4+@tRVWWWWDJ
DAAAAD($*>TPTUUUU!33333?do----$"5555555    
svd_solvern_components   c                    t           j        }t          ||           }|                    |                              |          }|j        d         |k    sJ |                    |          }t          ||           |                    |          }t          ||           |                                }|	                                }t          t          j        ||          t          j        |j        d                   d           d S )Nr2   r1   r3   r   r#   )irisdatar
   fit	transformshapefit_transformr   get_covarianceget_precisionnpdoteye)r1   r2   XpcaX_rX_r2cov	precisions           r.   test_pcarH   3   s     		A
<J
?
?
?C ''!**

q
!
!C9Q<<'''' QDC
--

CC 



C!!##IBF3	**BF171:,>,>UKKKKKKr0   density){Gz?皙?g333333?)r3      
   sparse_containerr   r   scale)r3   rM   d   c                    d}d}t           j                            |           } |t          j                            t
          t          ||                    }	|                    |	j        d                   |z  }
|	                    |
          }	t          |||           }|
                    |	           |	                                }t          |||           }|
                    |           t          |||            |t          j                            t
          t          ||                    }|                                }t          |                    |          |                    |          |           t          |                    |          |                    |          |           dS )z?Check that the results are the same for sparse and dense input.r   绽|=random_staterI   r3   r2   r1   rT   r6   N)r?   randomdefault_rngspsparseSPARSE_MSPARSE_Nr;   multiplyr
   r9   toarrayr/   r   r:   )global_random_seedr1   rN   r2   rI   rO   r#   transform_atolrT   rB   scale_vectorrC   XdpcadX2X2ds                   r.   test_pca_sparsere   I   s    DN9(();<<L
	%	 	 	
 	
	 	A  &&qwqz22U:L	

<  A
!'  C
 GGAJJJ	
B!'  D
 	HHRLLL CD1111 
	
	%	 	 	
 	

 
B **,,CCMM"%%s}}S'9'9OOOOCMM"%%t~~c':':PPPPPPr0   c                    t           j                            |           } |t          j                            t
          t          |d                    } |t          j                            t
          t          |d                    }t          dd|           }t          dd|           }|                    |           |	                    |          }t          ||           t          ||                    |                     t          ||                    |                     t          |                    |          |                    |                     d S )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      sc   9(();<<L
	%	 	 	
 	
	 	A 
	
	%	 	 	
 	

 
B rhEWXXXGH;M   KKNNN%33A66MG%6777M#4#>#>q#A#ABBBM7#4#4Q#7#7888G%%b))+<+F+Fr+J+JKKKKKr0   r   r   c                 n   t           j                            |           } |t          j                            t
          t          |                    }t          d|          }d| d}t          j	        t          |          5  |                    |           d d d            d S # 1 swxY w Y   d S )NrT      r5   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^   r1   rN   rT   rB   rC   error_msg_patterns          r.   test_sparse_pca_solver_errorru      s
    9(();<<L
	% 	 	
 	
	 	A 2*
5
5
5C	5&	5 	5 	5  
y(9	:	:	:  


                 s   B**B.1B.c                 v   t           j                            |           } |t          j                            t
          t          |                    }t          dd                              |          }t          dd                              |          }t          |j
        |j
        d           dS )	zHCheck that "auto" and "arpack" solvers are equivalent for sparse inputs.rl   rM   r   r5   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    
 9(();<<L
	% 	 	
 	
	 	A ":::>>qAAJv666::1==HJ/1JQUVVVVVVr0   c                  2   d} | dz   }t           j                            dd| |f          }t          |           }t	          j                    5  t	          j        dt                     |                    |           d d d            d S # 1 swxY w Y   d S )NrM   rL   r3   sizer2   error)	r?   rV   uniformr
   warningscatch_warningssimplefilterRuntimeWarningr9   )r2   
n_featuresrB   rC   s       r.   test_no_empty_slice_warningr      s    L!J
	"a|Z&@AAA
<
(
(
(C		 	"	"  g~666


                 s   0BBBcopyTFsolverc                 4   t           j                            d          }d}d}d}d}t          j        |                    ||          t          j        t          j        t          j        dd|                    |                    ||                              }|d d d dfxx         dz  cc<   |j        ||fk    sJ |                    d	                                          d
k    sJ |	                                }t          |d|| dd          }	|	                    |	                                          }
|
j        ||fk    sJ |	                    |          }t          |
|d           t          |
                    dd          t          j        |                     t          |
                    d	          t          j        |          d           |	                                }t          |d||                               |	                                          }	|	                    |          }|j        ||fk    sJ |                    d	                                          t%          j        dd          k    sJ d S )Nr   rP   P   rm   2   g      $@      ?   axisgfffffE@T   )r2   whitenr   r1   rT   iterated_powergMb@?rx   r3   ddofr   r   r6   F)r2   r   r   r1   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   r2   rankrB   X_rC   
X_whitenedX_whitened2X_unwhiteneds                r.   test_whiteningr      s    )


"
"CIJLD 			)T""
rwr{4d3344ciij6Q6QRR	 	A aaa"fIIINIII7y*----- 55a5==%%%% 
B
!  C ""27799--J	<88888--##KJ$7777JNNN22BGL4I4IJJJJOOO++RXl-C-C%PPPP	
B
!%dv  	c"''))nn  ==$$L)\!::::: ##''))V]4T-J-J-JJJJJJJr0   other_svd_solverr   
data_shapetallwiderank_deficientr   c                 .
   |dk    rd\  }}nd\  }}d}|rgt           j                            |          }	t          ||          dz  }
|	                    ||z   |
f          |	                    |
|f          z  }n&t          ||z   |d|          }t          ||          }
|                    |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|}|                    |          }t          j        |                                          sJ |j        |k    sJ |                    |          }t          j        |                                          sJ |j        |k    sJ |j        dk                                    sJ t!          |j        |j        fi | t!          |j        |j        fi | |j        }t          j        |                                          sJ |j        }t          j        |                                          sJ |j        |k    }|                                dk    sJ t!          ||         ||         fi | t!          |d d |f         |d d |f         fi | |                    |          }t          j        |                                          sJ |j        |k    sJ |                    |          }t          j        |                                          sJ |j        |k    sJ t!          |d d |f         |d d |f         fi | |                    |          }t          j        |                                          sJ |j        |k    sJ |                    |          }t          j        |                                          sJ |j        |k    sJ |j        j        d         |j        j        d         k    rt!          ||fi | t!          ||fi | d S |j        j        d         |
k     r/|j                                        |k    sJ t!          ||fi | d S t!          |                    |          d d |f         |                    |          d d |f         fi | d S )Nr   )rP   rm   )rm   rP   rM   rL   r~         ?)r   r   tail_strengthrT   Fr   gQ?h㈵>)r#   r"   rR   r   r   r   r   r   r3   r   r2   r1   r   )r2   r1   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_kwargsr2   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     sP    V '	:: '	:N *i##$6779j))Q.n,d3   
 
dJ%7889 !.0!+	
 
 
 9j))	E**A

mQyzz]VGrz!!D)))!U+++"<'' .3	X	%	% z)Z881< OOOH !#'	 
  I "//88;)**..00000#|3333#11'::;*++//11111$4444(A-2244444H0)2OXXSWXXX*+    
 $/;+,,0022222 ,;'((,,..... ),>>F::<<!(02B62JSSdSSS AAAvI&(:111f9(E IM   !**622;())--/////"l2222",,V44;)**..00000#|3333&qqq&y13DQQQY3OXXSWXXX "334EFF;)**..00000#|3333#556HII;*++//11111$4444!!$(<(B1(EEE 	*F;;d;;;+V<<t<<<<<			#A	&	-	- +//114FFFFF*,?HH4HHHHH 	122111f9= 344QQQY?	
 	
 	
 	
 	
 	
 	
r0   rB   rP   r   N   )n_informativerT   rM   )zrandom-tallzcorrelated-tallzrandom-wide)idsc                 z   t          d|d          }|                    |           }t          |j        t	          j        |dd                     t          j                            t	          j        | d                    d         }t          |d	          d d         }t          |j        |d
           d S )NrL   r   rU   r3   r   F)rowvarT)reverserw   rx   )
r
   r<   r   r%   r?   varlinalgeigrF   sorted)rB   r1   rC   X_pcaexpected_results        r.   %test_pca_explained_variance_empiricalr     s     1!
D
D
DCa  EC+RVE-J-J-JKKKimmBF1U$;$;$;<<Q?O_d;;;BQB?OC+_4HHHHHHr0   c                 N   t           j                            d          }d\  }}|                    ||          }t	          dd|          }t	          d| |          }|                    |           |                    |           t          |j        |j        d           d S )Nr   rP   r   rL   r   rU   rw   rx   )r?   rV   rp   r   r
   r9   r   r&   )r1   r   r   r   rB   r   r   s          r.   $test_pca_singular_values_consistencyr     s    
)


"
"C#Iz		)Z((Af3GGGHzLLLILLOOOMM!H-y/IPTUUUUUUr0   c           	         t           j                            d          }d\  }}|                    ||          }t	          d| |          }|                    |          }t          t          j        |j        dz            t           j	        
                    |d          dz             t          |j        t          j        t          j        |dz  d                               d\  }}|                    ||          }t	          d| |          }|                    |          }|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                  }|                    |           t          |j        g d           d S )Nr   r   rL   rU   fror   )rP   n   r   A`"	@r3   X9v@)r   r   r   )r?   rV   rp   r   r
   r<   r   r   r&   r   normsqrtr@   r$   r9   )r1   r   r   r   rB   rC   X_transX_hats           r.   test_pca_singular_valuesr     s   
)


"
"C#Iz		)Z((A
1#
F
F
FC""G 
s#Q&'')G)G1)L   C("'"&!!2L2L2L*M*MNNN %Iz		)Z((A
1#
F
F
FC""Grwrvgqjq111222GAAAqDMMMUMMMAAAqDMMMUMMMF7CO,,EGGENNNC(*=*=*=>>>>>r0   c                 R   t           j                            d          }d\  }}|                    ||          dz  }|d dxx         t          j        g d          z  cc<   d|                    d|          z  t          j        g d          z   }t          d|                               |                              |          }|t          j        |dz  	                                          z  }t          t          j        |d         d                   d	d
           d S )Nr   rP   r   rK   rM   r         r3   rL   r5   r   rw   rx   )r?   rV   rp   r   arrayr
   r9   r:   r   r   r   abs)r1   r   nprB   XtYts          r.   test_pca_check_projectionr     s    )


"
"CDAq		!Q#AcrcFFFbhyyy!!!FFF	syyA	)))!4!4	4B	!
	3	3	3	7	7	:	:	D	DR	H	HB"'2q5++--
 
  BBF2a58$$c555555r0   c                    ddgddgg}t          d| d          }|                    |          }|j        s
J d            t          |                                dd           t          |                                d	d
           d S )Nr   g        r3   r   rU   )rL   r3   r   r6   gQ?rw   rx   )r
   r<   r;   r   r   r   )r1   rB   rC   r   s       r.   test_pca_check_projection_listr     s     sc3Z A
1!
D
D
DC""G=  &   GLLNNDu5555GKKMM4d333333r0   )r   r   r   c                 r   t           j                            d          }d\  }}|                    ||          }|d d dfxx         dz  cc<   |g dz  }t	          d| |                              |          }|                    |          }|                    |          }t          ||d	           d S )
Nr   )r   r   r3   r   )r   r   r   rL   r   h㈵>rx   )	r?   rV   rp   r   r
   r9   r:   r   r   )	r1   r   r   r   r   rB   rC   Y	Y_inverses	            r.   test_pca_inverser     s     )


"
"CDAq		!QAaaadGGGwGGGNA 1F
C
C
C
G
G
J
JCaA%%a((IAyt,,,,,,r0   r8   )r   r3   r   )r3   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                    d}t          ||           }t          j        t          |          5  |                    |           d d d            n# 1 swxY w Y   | dk    rr|}d                    ||          }t          j        t          |          5  t          ||                               |           d d d            d S # 1 swxY w Y   d S d S )NrL   r1   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)r1   r8   r2   err_msg
smallest_d
pca_fitteds         r.   test_pca_validationr  	  sf   , J\j999J	z	1	1	1  t               X!""(&z"B"B 	
 ]:W555 	? 	?44488>>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? s#   AAA%CCCzsolver, n_components_c                 j    t          |          }|                    |            |j        |k    sJ d S )Nr  )r
   r9   r)   )r8   r   r)   rC   s       r.   test_n_components_noner
  2  s=     
 
 
 CGGDMMM------r0   c                     t           j                            d          }d\  }}|                    ||          }t	          d|           }|                    |           |j        dk    sJ d S )Nr   iX  rM   mler5   r3   )r?   rV   rp   r   r
   r9   r)   )r1   r   r   r   rB   rC   s         r.   test_n_components_mler  A  sq     )


"
"C#Iz		)Z((A
5Z
8
8
8CGGAJJJ!!!!!!r0   c                 X   t           j                            d          }d\  }}|                    ||          }t	          d|           }d                    |           }t          j        t          |          5  |	                    |           d d d            d S # 1 swxY w Y   d S )Nr   r  r  r5   z:n_components='mle' cannot be a string with svd_solver='{}'rn   )
r?   rV   rp   r   r
   r  rq   rr   r  r9   )r1   r   r   r   rB   rC   r  s          r.   test_n_components_mle_errorr  L  s     )


"
"C#Iz		)Z((A
5Z
8
8
8CJQQ G 
z	1	1	1  


                 s   <BB#&B#c                  H   t           j                            d          } d\  }}|                     ||          dz  }|d dxx         t          j        g d          z  cc<   t          dd                              |          }|j        dk    sJ |j        d	k    sJ d S )
Nr   rP   r   rK   rM   r   r   r   r3   rL   r  r   r5   r3   )	r?   rV   rp   r   r   r
   r9   r2   r)   )r   r   r   rB   rC   s        r.   test_pca_dimr  [  s    
)


"
"CDAq		!Q#AcrcFFFbh'''FFF
5V
4
4
4
8
8
;
;Cu$$$$!!!!!!r0   c                     d\  } t           j                            d          }|                    |           dz  |                    d          t          j        g d          z  z   t          j        g d          z   }t          | d          }|                    |           |j        t          j        fd	t          d|           D                       }|d         |	                                d
z  z
  k    sJ d S )Nr   r   r   rK   r3   r  )r3   r   r   r      r   r5   c                 2    g | ]}t          |          S r   )r   ).0kr   spects     r.   
<listcomp>z$test_infer_dim_1.<locals>.<listcomp>s  s&    GGGa$UAq11GGGr0   rJ   )
r?   rV   rp   r   r   r
   r9   r%   rangemax)r   r   rB   rC   llr   r  s        @@r.   test_infer_dim_1r   f  s     DAq
)


"
"C		!Q#
))Aq//BH___55
5	6
(???
#
#	$ 
 1
0
0
0CGGAJJJ#E	GGGGG5A;;GGG	H	HBa526688dQh&&&&&&&r0   c                     d\  } }t           j                            d          }|                    | |          dz  }|d dxx         t          j        g d          z  cc<   |ddxx         t          j        g d          z  cc<   t          |d	          }|                    |           |j        }t          ||           d
k    sJ d S )Nr  r   rK   rM   r     r  r   r   rL   r}   r   r5   r3   	r?   rV   rp   r   r   r
   r9   r%   r   r   r   r   rB   rC   r  s         r.   test_infer_dim_2r&  w  s     DAq
)


"
"C		!Q#AcrcFFFbh'''FFFbeHHH)))***HHH
1
0
0
0CGGAJJJ#EE1%%))))))r0   c                     d\  } }t           j                            d          }|                    | |          dz  }|d dxx         t          j        g d          z  cc<   |ddxx         t          j        g d          z  cc<   |dd	xx         d
t          j        g d          z  z  cc<   t          |d          }|                    |           |j        }t          ||           d
k    sJ d S )Nr  r   rK   rM   r  r"  r#  rm   (   rL   )r}   r3   r}   r3   r}   r   r5   r$  r%  s         r.   test_infer_dim_3r)    s   DAq
)


"
"C		!Q#AcrcFFFbh'''FFFbeHHH)))***HHHbeHHHBH///0000HHH
1
0
0
0CGGAJJJ#EE1%%))))))r0   z'X, n_components, n_components_validatedgffffff?rL   rJ   r   r"  r   c                     t          |d          }|                    |            |j        t          j        |          k    sJ |j        |k    sJ d S )Nr   r5   )r
   r9   r2   rq   r   r)   )rB   r2   n_components_validatedrC   s       r.   $test_infer_dim_by_explained_variancer,    s^     <F
;
;
;CGGAJJJv}\:::::: 6666666r0   c                    d\  }}t           j                            d          }|                    ||          dz  t          j        g d          z   }t          d|           }|                    |           |                    |          }dt          j        dt           j	        z  t          j
        d          z  d	z            z  |z  }t          ||z  dd
           |                    |                    ||          dz  t          j        g d          z             }||k    sJ t          dd|           }|                    |           |                    |          }||k    sJ d S )N)r   r   r   rK   r   rL   r5   g      r3   g|Gz?g?rx   g?T)r2   r   r1   )r?   rV   rp   r   r   r
   r9   scorelogpiexpr   )	r1   r   r   r   rB   rC   ll1hll2s	            r.   test_pca_scorer5    sJ    DAq
)


"
"C		!Q# 3 33A
1
4
4
4CGGAJJJ
))A,,Crva"%i"&))+f45559AC!GQT****
))CIIaOOc)BHYYY,?,??
@
@C9999
1Tj
A
A
ACGGAJJJ
))A,,C999999r0   c                     d\  } }t           j                            d          }|                    | |          |                    | d          t          j        g d          z  z   t          j        g d          z   }|                    | |          |                    | d          t          j        g d          z  z   t          j        g d          z   }t          j        |          }t          |          D ]@}t          |d          }|                    |           |	                    |          ||<   A|
                                dk    sJ d S )N)   r   r   r3   r   )r3   r   r   r   r5   )r?   rV   rp   r   r   r   r  r
   r9   r.  argmax)r   r   r   Xlr   r  r  rC   s           r.   test_pca_score3r:    s'   DAq
)


"
"C	1a399Q??RXiii-@-@@	@28IIICVCV	VB	1a399Q??RXiii-@-@@	@28IIICVCV	VB	!B1XX  qV444		"199;;!r0   c                     t          j        d          \  }}t          d| d          }|                    |           t	          j        |j        |j        z
  dk              sJ d S )NT
return_X_yrm   r   rU   )r   load_digitsr
   r9   r?   r   r%   r(   )r1   rB   _rC   s       r.   test_pca_sanity_noise_variancer@    sj     4000DAq
2*1
E
E
ECGGAJJJ63*S-@@QFGGGGGGGr0   c                 B   t          j        d          \  }}t          ddd          }t          d| d          }|                    |           |                    |           t	          |                    |          |                    |          d           d S )	NTr<  rm   r   r   rU   r   rx   )r   r>  r
   r9   r   r.  )r1   rB   r?  r   r   s        r.   "test_pca_score_consistency_solversrB    s     4000DAqvAFFFH
KKKILLOOOMM!HNN1%%yq'9'9EEEEEEr0   c                    d\  }}t           j                            d          }|                    ||          dz  t          j        g d          z   }t          ||           }|                    |           |j        dk    sJ |                    |           |                    |j	                   |j        dk    sJ |                    |j	                   d S )Nr   r   rK   r   r5   )
r?   rV   rp   r   r   r
   r9   r(   r.  T)r1   r   r   r   rB   rC   s         r.   'test_pca_zero_noise_variance_edge_casesrE    s     DAq
)


"
"C		!Q# 3 33A
1
4
4
4CGGAJJJ!#### IIaLLLGGACLLL!#### IIacNNNNNr0   z4n_samples, n_features, n_components, expected_solver))rM   r   r   r   )r   r   r   r   )r     i  r   )r   rF  rM   r   )r   rF  r   r   c                 X   t           j                            d                              | |f          }t	          |d          }t	          ||d          }|                    |           |j        |k    sJ |                    |           t          |j        |j                   d S )Nr   r~   )r2   rT   rU   )	r?   rV   rp   r   r
   r9   _fit_svd_solverr   r$   )r   r   r2   expected_solverr8   rz   pca_tests          r.   test_pca_svd_solver_autorK    s      9  ##++)Z1H+IID1===H!oA  H LL#6666LLH((*>?????r0   c           	         t           j                            d          }|                    dd          }t          j        d          }t          d          D ]6}t          d| |          }|                    |          d         ||d d f<   7t          |t          j	        |dd d f         d          
                    dd                     d S )Nr   rM   )r"  rL   r"  rL   rU   )r?   rV   rp   randr   r  r
   r<   r   tilereshape)r1   r   rB   ri   irC   s         r.   test_pca_deterministic_outputrQ    s    
)


"
"CRAHW%%M2YY 6 6qZcJJJ!//2215adM27=AAA+>#C#C#K#KBPQ#R#RSSSSSr0   c                 D    t          | |           t          |            d S )N)"check_pca_float_dtype_preservation$check_pca_int_dtype_upcast_to_double)r1   r^   s     r.   test_pca_dtype_preservationrU    s'    &z3EFFF(44444r0   c                    t           j                            |                              dd          }|                    t           j        d          }|                    t           j                  }t          d| |                              |          }t          d| |                              |          }|j	        j
        t           j        k    sJ |j	        j
        t           j        k    sJ |                    |          j
        t           j        k    sJ |                    |          j
        t           j        k    sJ t          |j	        |j	        dd           d S )	Nr   r   Fr   r   rU   gMbP?r!   )r?   rV   rp   rM  r   float64r   r
   r9   r$   r   r:   r   )r1   seedrB   	X_float64	X_float32pca_64pca_32s          r.   rS  rS  !  sB   
	d##((q11A%00I$$IaJTJJJNN F aJTJJJNN F #rz1111#rz1111I&&,
::::I&&,
::::
 F&(:DQQQQQQr0   c                    t           j                            d                              ddd          }|                    t           j        d          }|                    t           j        d          }t          d| d                              |          }t          d| d                              |          }|j	        j
        t           j        k    sJ |j	        j
        t           j        k    sJ |                    |          j
        t           j        k    sJ |                    |          j
        t           j        k    sJ t          |j	        |j	        d	           d S )
Nr   r   )r   r   Fr   r   rU   g-C6?rx   )r?   rV   rp   randintr   int64int32r
   r9   r$   r   rW  r:   r   )r1   X_i64X_i32r[  r\  s        r.   rT  rT  9  s6   I!!!$$,,Qi@@ELLL..ELLL..EaJQGGGKKERRFaJQGGGKKERRF#rz1111#rz1111E""(BJ6666E""(BJ6666F&(:FFFFFFr0   c                  &   t          d          \  } }t                                          | |          }|j                                        d         }t          |                              | |          }|j        | j        d         k    sJ d S )NTr<  r   r3   )r   r
   r9   r   cumsumr)   r;   )rB   yr,   r2   r-   s        r.   5test_pca_n_components_mostly_explained_variance_ratiorg  J  s     %%%DAq5599Q??D188::2>LL)))--a33D++++++r0   c                      t          j        g d          } d}dD ]F}t          j        t          d          5  t          | ||           d d d            n# 1 swxY w Y   Gd S )Nr3   KH9rj  rj  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_rankrl  V  s    x00011HI 9 9]:-RSSS 	9 	9hi888	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	99 9s   AA	A	c                      t          j        g d          } t          | dd          t           j         k    sJ dD ]$}t          | |d          t           j         k    sJ %t	          | d          dk    sJ d S )Nri  r3   rM   r   r   )rL   r   )r?   r   r   infr   )rk  r   s     r.   test_small_eigenvalues_mlerp  _  s     x00011HXA<<<wFFFF @ @ 444?????Hb))Q......r0   c                      t          j        dddddd          \  } }t          d                              |           }|j        dk    sJ d S )Nr"  r3      *   )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_datarx  l  sk     '  DAq 5
!
!
!
%
%a
(
(C!!!!!!r0   c                      t          j        ddd          \  } }t          dd          }t          j        t
          d	          5  |                    |            d d d            d S # 1 swxY w Y   d S )
Nr"     rs  )r   r   rT   r  r   r5   z?n_components='mle' is only supported if n_samples >= n_featuresrn   )r   r   r
   rq   rr   r  r9   rw  s      r.   test_fit_mle_too_few_samplesr{  {  s     '"RTUUUDAq
5V
4
4
4C	O
 
 
   	


	                 s   A**A.1A.c                  4   d\  } }t           j                            d                              | |          }t          j        |d d d df         d          |d d df<   t          dd          }|                    |           |j        |dz
  k    sJ d S )	N)r   rM   r   r}   r   r  r   r  r3   )r?   rV   rp   r   r   r
   r9   r)   )r   n_dimrB   pca_skls       r.   test_mle_simple_caser    s      Iu
	a  &&y%88AwqCRCyr***AaaaeH%F+++GKKNNN EAI------r0   c                     d\  } }t          j        | |f          }t           j                            |d          \  }}}t	          |dd          t          j        |dz
            d           t          j        t          |d|                     sJ t          d|          D ]$}t          |||           t           j	         k    sJ %d S )	N)	   r  T)full_matricesr3   r   r6   rn  rL   )
r?   r   r   svdr   r   r   r   r  ro  )r   r   rB   r?  sr   s         r.   test_assess_dimesion_rank_oner    s     Iz
J'((AimmATm22GAq!AabbE28JN33%@@@@;(iHHHIIIIIa$$ @ @ D)44?????@ @r0   c                  J   t           j                            d          } d}|                     d|          }t	          dd|d                              |          }t	          dd                              |          }t	          dd	d
                              |          }t          t          j        |j                  t          j        |j                             t          t          j        |j                  t          j        |j                             dS )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   r3   r   )r2   r1   n_oversamplesrT   r   r5   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!ff  f55599!<<H!qIIIMMaPPJBF8/00"&9O2P2PQQQBF>566z?U8V8VWWWWWr0   c                      t          d                              t          j                  } |                                 }t          d t          d          D             |           dS )z Check feature names out for PCA.rL   r   c                     g | ]}d | S )rC   r   )r  rP  s     r.   r  z*test_feature_names_out.<locals>.<listcomp>  s    444a	a		444r0   N)r
   r9   r7   r8   get_feature_names_outr   r  )rC   namess     r.   test_feature_names_outr    s^    
1



!
!$)
,
,C%%''E44588444e<<<<<r0   c                 b   t           j                            d          }|                    dd          }t	                                          |          }|j        |j        z  }t          j        |dd          	                                }t           j
                            ||           dS )z9Check the accuracy of PCA's internal variance calculationr   r   r7  r3   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    s     )


"
"C		$A
%%))A,,C%(EEGvaaa(((,,..HJw11111r0   c           	      H   t          ||          }t          j                            |          }|                    ||          }|                    |           |                                }|                                }	|j        dk    rdnd}
t          d          5  t          |                              |          }|                                }|j        dk    sJ |j        |j        k    sJ t          t          ||          ||
t          |          	           |                                }|j        dk    sJ |j        |j        k    sJ t          t          ||          |	|
t          |          	           d d d            d S # 1 swxY w Y   d S )
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    s   	ov	6	6Biz**Gjjj00GMM'**,,L,,..M=I--444D	4	0	0	0 
 
Y''++G44#1133!V++++!W]2222lr222
++		
 	
 	
 	
 %3355"f,,,,"gm3333m333
++		
 	
 	
 	
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s   #C'FFFz#array_namespace, device, dtype_namecheckr  r5   r   rK   QR)r2   r1   power_iteration_normalizerrT   c                 >    | j         j        } ||| |||           d S )Nr   r  )	__class____name__)r  r  r  r   r  r  s         r.   test_pca_array_api_compliancer    s0    8 'D	E$	?6jQQQQQQr0   r  c                 N   | j         j        } ||| |||           t          ||          }t          d          \  }}|                    |d          }t          |j                  }	t          |           }
|                    ||          }|                    ||          }|
	                    ||           |
j
        }|
j        }t          |
          }t          d          5  |	                    ||           |j
        }t          |          t          |          k    sJ t          ||	          }|j        }t          |          t          |          k    sJ t          ||	          }d d d            n# 1 swxY w Y   |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         k    rp|d         }||d          }||d          }t%          t'          j        ||z
            |	k               sJ t%          t'          j        ||z
            |	k               sJ d S d S )Nr  rs  rl   Fr   r   Tr  r  r3   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   rf  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    s-   . 'D	E$	?6jQQQQ 
ov	6	6BB///DAq	%((A!'""D
	

C::a:''D::a:''DGGAqMMMOM33ZZF	4	0	0	0 S S

4*M**l4.@.@@@@@,]rBBB & :122l46H6HHHHH#45Jr#R#R#R S S S S S S S S S S S S S S S !]%88888!!$(;A(>>>>>#)-B-HHHHH )/2M4G4JKKN .1o~o.    a M$7$:::2261.//B7H26+.@@AADHIIIII26.1CCDDtKLLLLL ;:
 	MLs   +BFF	Fc                  .   t          j        d           t          j        d          } |                     t          j                  }t          ddd          }t          j        d          }t          j        t          |          5  t          d	
          5  |                    |           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                    dd           t          j        d          }t          j        t          |          5  t          d	
          5  |                    |           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                    dd           t          j        d          }t          j        t          |          5  t          d	
          5  |                    |           d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Narray_api_compatarray_api_strictrL   r   r   rU   zCPCA with svd_solver='arpack' is not supported for Array API inputs.rn   Tr  r   LU)r1   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  ]  sx   
*+++		/	0	0Bjj##G
1
B
B
BC9M L 
z	6	6	6  t444 	 	GGG	 	 	 	 	 	 	 	 	 	 	 	 	 	 	               NNltNLLL9	6 L 
z	6	6	6  t444 	 	GGG	 	 	 	 	 	 	 	 	 	 	 	 	 	 	               NNlvNNNN9	Q L 
k	6	6	6  t444 	 	GGG	 	 	 	 	 	 	 	 	 	 	 	 	 	 	                 s   	CB<0C<C 	 CC 	CCC$E.5EE.E	E.E	E..E25E2?H
G2&H
2G6	6H
9G6	:H

HH)r   r   )kr  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  -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   rD  r  r
  r  r  r  r   r&  r)  rM  r,  r5  r:  r@  rB  rE  rK  rQ  rU  rS  rT  rg  rl  rp  rx  r{  r  r  r  r  r  r  r  r  r  r   r0   r.   <module>r     s   				           , , , , , , , , , , , , , ,       Q Q Q Q Q Q Q Q Q Q % % % % % % J J J J J J J J         
 < ; ; ; ; ; R R R R R R H H H H H H H H      ? > > > > > > >xIII
  (Hh// 6 6 6 6 {33q$)/!2D)E)EFFL L GF 43L( $5$5$56644+^n-LMM2C'DEE,,,//5Q 5Q 0/ FE NM 54 76
5Qp +^n-LMML L NMLB f'=>>+^n-LMM  NM ?>$ +^n-LMMW W NMW"   $//;//1K 1K 0/ 0/1Kj ttCC$4$47G$GHHII  '788)E4=99E4=11C
 C
 21 :9 98 C
L 
	a  &&sB//$$S"BQOOOPQR
	a  &&r3//
 	:99    {33I I 43 I ,'?@@V V A@V {33? ? 43?: {336 6 436 {334 4 434 'G'G'GHHE4=11- - 21 IH-  
XRXyyy))),--xrxIII8N/O/O/QR  '    ? ?!  &?, 	TY_%%&	33ty''!+,	ss49?++,  $)TY[!9::. . ;: . '788" " 98" ,'?@@  A@" " "' ' '"* * *
* 
* 
* -	D!	D!			q	!	!	&	&q"	-	-sA6 7 7 7 {33  43*   {33H H 43H ,'?@@F F A@F '=>>  ?>* :   	@ 	@ 	@ {33T T 43T {335 5 435
R R R0G G G"	, 	, 	,9 9 9
/ 
/ 
/" " "
 
 
. . .
@ 
@ 
@X X X4= = = $//2 2 0/2
 
 
D )+T+T+V+V  %'DE    
 v...vd;;;==='8999'8FFF#'+		
 	
 	
 	!   "R R#   2R )+T+T+V+V  "#    
  	6222 	!   7M 7M   (7Mt    r0   