
    /iiݣ                        d dl Z 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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j0        1                    de*          ej0        1                    d e2de)j3        j4        d                             d                         Z5ej0        1                    dg d          ej0        1                    dg d          ej0        1                    de(e'z             ej0        1                    dddg          ej0        1                    dg d          d                                                             Z6ej0        1                    de(e'z             d              Z7ej0        1                    dd!d"g          ej0        1                    de(e'z             d#                         Z8ej0        1                    de(e'z             d$             Z9d% Z:ej0        1                    d&d'd(g          ej0        1                    d)e*          d*                         Z;ej0        1                    d+ e< e= e>e*          d"d,hz
                                ej0        1                    d-d.d/g          ej0        1                    d0d(d'g          ej0        1                    d1d(d'g          d2                                                 Z?ej0        1                    d3ej@        A                    d           B                    d4d5           ej        d4d5d6d 7          d          ej@        A                    d           B                    d8d4          gg d9:          ej0        1                    de*          d;                         ZCej0        1                    ddd!g          d<             ZDej0        1                    de*          d=             ZEej0        1                    de*          d>             ZFej0        1                    de*          d?             ZGej0        1                    dg d@          ej0        1                    d1d(d'g          dA                         ZHej0        1                    dB ejI        g dCg dDg           ejI        g dCg dDg          jJ        g          ej0        1                    dEg dF          dG                         ZKej0        1                    dHd" e-e)j3        j4                  fd e-e)j3        j4                  dz
  fd! e-e)j3        j4                  fg          ej0        1                    dBe)j3        e)j3        jJ        g          dI                         ZLej0        1                    dd,d"g          dJ             ZMej0        1                    ddd!g          dK             ZNdL ZOdM ZPdN ZQdO ZRej0        1                    dPe)j3        dQdRfe)j3        dSdfej@        A                    d           S                    dTdU          dVdRfg          dW             ZTej0        1                    de*          dX             ZUdY ZVej0        1                    de*          dZ             ZWej0        1                    ddd!g          d[             ZXej0        1                    dd"d!g          d\             ZYej0        1                    d]g d^          d_             ZZej0        1                    de*          d`             Z[ej0        1                    de*          da             Z\db Z]dc Z^dd Z_de Z`df Zadg Zbdh Zcdi Zddj Zedk Zfdl Zgej0        1                    d&d'd(g          dm             Zhdn Ziej0        1                    do e            e:          ej0        1                    dpe%eige :          ej0        1                    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                                     Zjej0        1                    do e            e:          ej0        1                    dpeige :          ej0        1                    dq edxd"r          ge :          dy                                     Zkej0        l                    e jm        n                    dz          d{k    d|}          d~             Zod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_get_namespace_device_dtype_ids)yield_namespace_device_dtype_combinationsdevice)_get_check_estimator_ids)_array_api_for_testsassert_allclose) check_array_api_input_and_values)CSC_CONTAINERSCSR_CONTAINERS)fullcovariance_eigharpack
randomizedauto)  i,  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       j/var/www/html/bet.cuttalo.com/ml/venv/lib/python3.11/site-packages/sklearn/decomposition/tests/test_pca.py_check_fitted_pca_closer0   '   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r3   r2   r4   r    r$   )irisdatar
   fit	transformshapefit_transformr   get_covarianceget_precisionnpdoteye)r2   r3   XpcaX_rX_r2cov	precisions           r/   test_pcarI   5   s     		A
<J
?
?
?C ''!**

q
!
!C9Q<<'''' QDC
--

CC 



C!!##IBF3	**BF171:,>,>UKKKKKKr1   density){Gz?皙?g333333?)r4      
   sparse_containerr   r   scale)r4   rN   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_staterJ   r4   r3   r2   rU   r7   N)r@   randomdefault_rngspsparseSPARSE_MSPARSE_Nr<   multiplyr
   r:   toarrayr0   r   r;   )global_random_seedr2   rO   r3   rJ   rP   r$   transform_atolrU   rC   scale_vectorrD   XdpcadX2X2ds                   r/   test_pca_sparserf   K   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Pr1   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 )NrK   rT   rN   r   rV   )r@   rW   rX   rY   rZ   r[   r\   r
   r:   r=   r0   r   r;   )r_   rO   rU   rC   rd   pca_fitpca_fit_transformtransformed_Xs           r/   test_pca_sparse_fit_transformrk      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Kr1   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rU      r6   zWPCA only support sparse inputs with the "arpack" and "covariance_eigh" solvers, while "z" was passedmatch)r@   rW   RandomStaterY   rZ   r[   r\   r
   pytestraises	TypeErrorr:   )r_   r2   rO   rU   rC   rD   error_msg_patterns          r/   test_sparse_pca_solver_errorrv      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.rm   rN   r   r6   r   {Gzt?r#   N)r@   rW   rq   rY   rZ   r[   r\   r
   r:   r   r'   )r_   rO   rU   rC   
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Vr1   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 )NrN   rM   r4   sizer3   error)	r@   rW   uniformr
   warningscatch_warningssimplefilterRuntimeWarningr:   )r3   
n_featuresrC   rD   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   rQ   P   rn   2   g      $@      ?   axisgfffffE@T   )r3   whitenr   r2   rU   iterated_powergMb@?ry   r4   ddofr   r    r7   F)r3   r   r   r2   gfffffR@rL   )rel)r@   rW   rq   rA   randndiaglinspacer<   stdr   r
   r=   r;   r   onesmeanzerosr:   rr   approx)r   r   rng	n_samplesr   r3   rankrC   X_rD   
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Jr1   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   )rQ   rn   )rn   rQ   rN   rM   r         ?)r   r   tail_strengthrU   Fr   gQ?h㈵>)r$   r#   rS   r    r   r   r   r   r4   r   r3   r2   r   )r3   r2   r   rU   r    )r@   rW   rX   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   rC   X_trainX_testtolsvariance_thresholdextra_other_kwargsr3   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?	
 	
 	
 	
 	
 	
 	
r1   rC   rQ   r   N   )n_informativerU   rN   )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 )NrM   r   rV   r4   r   F)rowvarT)reverserx   ry   )
r
   r=   r   r&   r@   varlinalgeigrG   sorted)rC   r2   rD   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Hr1   c                 N   t           j                            d          }d\  }}|                    ||          }t	          dd|          }t	          d| |          }|                    |           |                    |           t          |j        |j        d           d S )Nr   rQ   r   rM   r   rV   rx   ry   )r@   rW   rq   r   r
   r:   r   r'   )r2   r   r   r   rC   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Ur1   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   rM   rV   fror   )rQ   n   r   A`"	@r4   X9v@)r   r   r   )r@   rW   rq   r   r
   r=   r   r   r'   r   normsqrtrA   r%   r:   )r2   r   r   r   rC   rD   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(*=*=*=>>>>>r1   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   rQ   r   rL   rN   r         r4   rM   r6   r   rx   ry   )r@   rW   rq   r   arrayr
   r:   r;   r   r   r   abs)r2   r   nprC   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5r1   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        r4   r   rV   )rM   r4   r    r7   gQ?rx   ry   )r
   r=   r<   r   r   r   )r2   rC   rD   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3r1   )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   r4   r   )r   r   r   rM   r   h㈵>ry   )	r@   rW   rq   r   r
   r:   r;   r   r   )	r2   r   r   r   r   rC   rD   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,,,,,,r1   r9   )r   r4   r   )r4   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   rM   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 )NrM   r2   ro   r   zgn_components={}L? must be strictly less than min\(n_samples, n_features\)={}L? with svd_solver='arpack')r
   rr   rs   
ValueErrorr:   format)r2   r9   r3   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
   r:   r*   )r9   r   r*   rD   s       r/   test_n_components_noner  4  s=     
 
 
 CGGDMMM------r1   c                     t           j                            d          }d\  }}|                    ||          }t	          d|           }|                    |           |j        dk    sJ d S )Nr   iX  rN   mler6   r4   )r@   rW   rq   r   r
   r:   r*   )r2   r   r   r   rC   rD   s         r/   test_n_components_mler  C  sq     )


"
"C#Iz		)Z((A
5Z
8
8
8CGGAJJJ!!!!!!r1   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  r6   z:n_components='mle' cannot be a string with svd_solver='{}'ro   )
r@   rW   rq   r   r
   r  rr   rs   r  r:   )r2   r   r   r   rC   rD   r  s          r/   test_n_components_mle_errorr  N  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   rQ   r   rL   rN   r   r   r   r4   rM   r  r   r6   r4   )	r@   rW   rq   r   r   r
   r:   r3   r*   )r   r   r   rC   rD   s        r/   test_pca_dimr  ]  s    
)


"
"CDAq		!Q#AcrcFFFbh'''FFF
5V
4
4
4
8
8
;
;Cu$$$$!!!!!!r1   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   rL   r4   r  )r4   r   r   r      r   r6   c                 2    g | ]}t          |          S r   )r   ).0kr   spects     r/   
<listcomp>z$test_infer_dim_1.<locals>.<listcomp>u  s&    GGGa$UAq11GGGr1   rK   )
r@   rW   rq   r   r   r
   r:   r&   rangemax)r   r   rC   rD   llr   r  s        @@r/   test_infer_dim_1r!  h  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&&&&&&&r1   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   rL   rN   r     r  r   r   rM   r~   r   r6   r4   	r@   rW   rq   r   r   r
   r:   r&   r   r   r   r   rC   rD   r  s         r/   test_infer_dim_2r'  y  s     DAq
)


"
"C		!Q#AcrcFFFbh'''FFFbeHHH)))***HHH
1
0
0
0CGGAJJJ#EE1%%))))))r1   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   rL   rN   r  r#  r$  rn   (   rM   )r~   r4   r~   r4   r~   r   r6   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%%))))))r1   z'X, n_components, n_components_validatedgffffff?rM   rK   r   r#  r   c                     t          |d          }|                    |            |j        t          j        |          k    sJ |j        |k    sJ d S )Nr   r6   )r
   r:   r3   rr   r   r*   )rC   r3   n_components_validatedrD   s       r/   $test_infer_dim_by_explained_variancer-    s^     <F
;
;
;CGGAJJJv}\:::::: 6666666r1   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   rL   r   rM   r6   g      r4   g|Gz?g?ry   g?T)r3   r   r2   )r@   rW   rq   r   r   r
   r:   scorelogpiexpr   )	r2   r   r   r   rC   rD   ll1hll2s	            r/   test_pca_scorer6    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999999r1   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   r4   r   )r4   r   r   r   r6   )r@   rW   rq   r   r   r   r  r
   r:   r/  argmax)r   r   r   Xlr   r   r  rD   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;;!r1   c                     t          j        d          \  }}t          d| d          }|                    |           t	          j        |j        |j        z
  dk              sJ d S )NT
return_X_yrn   r   rV   )r   load_digitsr
   r:   r@   r   r&   r)   )r2   rC   _rD   s       r/   test_pca_sanity_noise_variancerA    sj     4000DAq
2*1
E
E
ECGGAJJJ63*S-@@QFGGGGGGGr1   c                 B   t          j        d          \  }}t          ddd          }t          d| d          }|                    |           |                    |           t	          |                    |          |                    |          d           d S )	NTr=  rn   r   r   rV   r   ry   )r   r?  r
   r:   r   r/  )r2   rC   r@  r   r   s        r/   "test_pca_score_consistency_solversrC    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Er1   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   rL   r   r6   )
r@   rW   rq   r   r   r
   r:   r)   r/  T)r2   r   r   r   rC   rD   s         r/   'test_pca_zero_noise_variance_edge_casesrF    s     DAq
)


"
"C		!Q# 3 33A
1
4
4
4CGGAJJJ!#### IIaLLLGGACLLL!#### IIacNNNNNr1   z4n_samples, n_features, n_components, expected_solver))rN   r   r   r   )r   r   r   r   )r     i  r   )r   rG  rN   r   )r   rG  r   r   c                 X   t           j                            d                              | |f          }t	          |d          }t	          ||d          }|                    |           |j        |k    sJ |                    |           t          |j        |j                   d S )Nr   r   )r3   rU   rV   )	r@   rW   rq   r   r
   r:   _fit_svd_solverr   r%   )r   r   r3   expected_solverr9   r{   pca_tests          r/   test_pca_svd_solver_autorL    s      9  ##++)Z1H+IID1===H!oA  H LL#6666LLH((*>?????r1   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   rN   )r#  rM   r#  rM   rV   )r@   rW   rq   randr   r  r
   r=   r   tilereshape)r2   r   rC   rj   irD   s         r/   test_pca_deterministic_outputrR    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Sr1   c                 D    t          | |           t          |            d S )N)"check_pca_float_dtype_preservation$check_pca_int_dtype_upcast_to_double)r2   r_   s     r/   test_pca_dtype_preservationrV    s'    &z3EFFF(44444r1   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   rV   gMbP?r"   )r@   rW   rq   rN  r   float64r   r
   r:   r%   r   r;   r   )r2   seedrC   	X_float64	X_float32pca_64pca_32s          r/   rT  rT  #  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Qr1   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   rV   g-C6?ry   )r@   rW   rq   randintr   int64int32r
   r:   r%   r   rX  r;   r   )r2   X_i64X_i32r\  r]  s        r/   rU  rU  ;  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Fr1   c                  &   t          d          \  } }t                                          | |          }|j                                        d         }t          |                              | |          }|j        | j        d         k    sJ d S )NTr=  r   r4   )r   r
   r:   r   cumsumr*   r<   )rC   yr-   r3   r.   s        r/   5test_pca_n_components_mostly_explained_variance_ratiorh  L  s     %%%DAq5599Q??D188::2>LL)))--a33D++++++r1   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r4   KH9rk  rk  rN   )r   r   z"should be in \[1, n_features - 1\]ro   )r@   r   rr   rs   r  r   )spectrumr   r   s      r/   test_assess_dimension_bad_rankrm  X  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 )Nrj  r4   rN   r   r   )rM   r   )r@   r   r   infr   )rl  r   s     r/   test_small_eigenvalues_mlerq  a  s     x00011HXA<<<wFFFF @ @ 444?????Hb))Q......r1   c                      t          j        dddddd          \  } }t          d                              |           }|j        dk    sJ d S )Nr#  r4      *   )r   r   
n_repeatedn_redundantn_clusters_per_classrU   r  r   )r   r   r
   r:   r*   rC   r@  rD   s      r/   test_mle_redundant_datary  n  sk     '  DAq 5
!
!
!
%
%a
(
(C!!!!!!r1   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#     rt  )r   r   rU   r  r   r6   z?n_components='mle' is only supported if n_samples >= n_featuresro   )r   r   r
   rr   rs   r  r:   rx  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   rN   r   r~   r   r  r   r  r4   )r@   rW   rq   r   r   r
   r:   r*   )r   n_dimrC   pca_skls       r/   test_mle_simple_caser    s      Iu
	a  &&y%88AwqCRCyr***AaaaeH%F+++GKKNNN EAI------r1   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_matricesr4   r    r7   ro  rM   )
r@   r   r   svdr   r   r   r   r  rp  )r   r   rC   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?????@ @r1   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   rQ   r   r4   r   )r3   r2   n_oversamplesrU   r   r6   r   rV   N)	r@   rW   rq   r   r
   r:   r   r   r%   )r   r   rC   pca_randomizedr   rz   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Wr1   c                      t          d                              t          j                  } |                                 }t          d t          d          D             |           dS )z Check feature names out for PCA.rM   r   c                     g | ]}d | S )rD   r   )r  rQ  s     r/   r  z*test_feature_names_out.<locals>.<listcomp>  s    444a	a		444r1   N)r
   r:   r8   r9   get_feature_names_outr   r  )rD   namess     r/   test_feature_names_outr    s^    
1



!
!$)
,
,C%%''E44588444e<<<<<r1   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   r8  r4   r   N)r@   rW   rq   r   r
   r:   r&   r   r   r   testingr   )r   r   rC   rD   pca_vartrue_vars         r/   test_variance_correctnessr    s     )


"
"C		$A
%%))A,,C%(EEGvaaa(((,,..HJw11111r1   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   r8   r9   r   asarrayr:   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  r6   r   rL   QR)r3   r2   power_iteration_normalizerrU   c                 \    | j         j        }t          |           }  ||| |||           d S )Nr   r  )	__class____name__r   )r  r  r  r   r  r  s         r/   test_pca_array_api_compliancer    s=    < 'Di  I	E$	?6jQQQQQQr1   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  rt  rm   Fr   r   Tr  r  r4   r   r7   r~   )r  r  r   r   r   r   r   r   r  r:   r%   r&   r   array_devicer   r<   r   r   r   r@   r   )r  r  r  r   r  r  r  rC   rg  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-   2 '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SCIPY_ARRAY_API1zSCIPY_ARRAY_API not set to 1.)reasonc                     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_strictrM   r   r   rV   zCPCA with svd_solver='arpack' is not supported for Array API inputs.ro   Tr  r   LU)r2   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.)rr   importorskipr  r8   r9   r
   reescapers   r  r   r:   
set_paramswarnsUserWarning)r  r  rD   expected_msgs       r/   7test_array_api_error_and_warnings_on_unsupported_paramsr  d  sh    
	/	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   5B?B(B?(B,	,B?/B,	0B??CCE!E7EE	E
E	EE!E+G6<GG6G"	"G6%G"	&G66G:=G:)r   r    )posr  r   numpyr@   rr   scipyrY   numpy.testingr   sklearnr   r   sklearn.baser   sklearn.datasetsr   r   r	   sklearn.decompositionr
   sklearn.decomposition._pcar   r   sklearn.utils._array_apir   r   r   r   r   r  -sklearn.utils._test_common.instance_generatorr   sklearn.utils._testingr   r   sklearn.utils.estimator_checksr   sklearn.utils.fixesr   r   r8   PCA_SOLVERSr[   r\   r   SPARSE_MAX_COMPONENTSr0   markparametrizer  r9   r<   rI   rf   rk   rv   r|   r   r   r   listsetr   rW   rq   r   r   r   r   r   r   r   r   rE  r	  r  r  r  r  r!  r'  r*  rN  r-  r6  r;  rA  rC  rF  rL  rR  rV  rT  rU  rh  rm  rq  ry  r|  r  r  r  r  r  r  r  r  skipifenvirongetr  r   r1   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 )--//'   
 %'DE    
 v...vd;;;==='8999'8FFF#'+		
 	
 	
 	!   "R R#   6R )--//'   
 "#    
  	6222 	!   7M 7M   ,7Mt JNN$%%,5T       r1   