
    h$,f	                     J   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 d dlmZ d dlmZmZ d dlmZmZmZ d d	lmZ d d
lmZmZ d dlm Z m!Z! d dl"m#Z#m$Z$  ej                         Z%g dZ&d\  Z'Z( e)e'e(      Z*d Z+ejX                  j[                  de&      ejX                  j[                  d e.de%j^                  j`                  d               d               Z1ejX                  j[                  dg d      ejX                  j[                  dg d      ejX                  j[                  de$e#z         ejX                  j[                  ddg      ejX                  j[                  dg d      d                                    Z2ejX                  j[                  de$e#z         d        Z3ejX                  j[                  dg d      ejX                  j[                  de$e#z         d               Z4d Z5ejX                  j[                  d d!d"g      ejX                  j[                  d#e&      d$               Z6ejX                  j[                  ddd%g      d&        Z7ejX                  j[                  d'ejp                  js                  d       ju                  d(d)       ej                   d(d)d*d +      d    gd,d-g.      ejX                  j[                  de&      d/               Z;ejX                  j[                  ddd%g      d0        Z<ejX                  j[                  de&      d1        Z=ejX                  j[                  de&      d2        Z>ejX                  j[                  de&      d3        Z?ejX                  j[                  dg d4      ejX                  j[                  d5d"d!g      d6               Z@ejX                  j[                  d7 ej                  g d8g d9g       ej                  g d8g d9g      j                  g      ejX                  j[                  d:g d;      d<               ZCejX                  j[                  d=d> e)e%j^                  j`                        fd e)e%j^                  j`                        dz
  fd% e)e%j^                  j`                        fg      ejX                  j[                  d7e%j^                  e%j^                  j                  g      d?               ZDejX                  j[                  dd@d>g      dA        ZEejX                  j[                  ddd%g      dB        ZFdC ZGdD ZHdE ZIdF ZJejX                  j[                  dGe%j^                  dHdIfe%j^                  dJdfejp                  js                  d       j                  dKdL      dMdIfg      dN        ZLejX                  j[                  de&      dO        ZMdP ZNejX                  j[                  de&      dQ        ZOejX                  j[                  ddd%g      dR        ZPejX                  j[                  dd>d%g      dS        ZQejX                  j[                  dTejp                  js                  d       j                  dUV      dMd>fejp                  js                  d       j                  dWV      dKd>fejp                  js                  d       j                  dUV      dXd>fejp                  js                  d       j                  dUV      dYd%fg      dZ        ZSejX                  j[                  de&      d[        ZTejX                  j[                  de&      d\        ZUd] ZVd^ ZWd_ ZXd` ZYda ZZdb Z[dc Z\dd Z]de Z^df Z_dg Z`ejX                  j[                  d d!d"g      dh        Zadi ZbejX                  j[                  dj e             ejX                  j[                  dke!ebge .      ejX                  j[                  dl edId>m       ednd>d!o       edId%dpd q      ge .      dr                      ZcejX                  j[                  dj e             ejX                  j[                  dkebge .      ejX                  j[                  dl edsd>m      ge .      dt                      Zddu Zey)v    N)assert_array_equal)config_contextdatasets)clone)	load_irismake_classification)PCA)_assess_dimension_infer_dimension)_atol_for_type_convert_to_numpy)yield_namespace_device_dtype_combinationsdevice)_array_api_for_testsassert_allclose)_get_check_estimator_ids check_array_api_input_and_values)CSC_CONTAINERSCSR_CONTAINERS)fullarpack
randomizedauto)  i,  c                 $   t        | j                  |j                  |       t        | j                  |j                  |       t        | j                  |j                  |       t        | j                  |j                  |       t        | j
                  |j
                  |       t        | j                  |j                  |       t        | j                  |j                  |       t        | j                  |j                  |       y )Nrtol)	r   components_explained_variance_singular_values_mean_n_components_
n_samples_noise_variance_n_features_in_)pca1pca2r   s      Dlib/python3.12/site-packages/sklearn/decomposition/tests/test_pca.py_check_fitted_pca_closer*   %   s    D$$d&6&6TBD,,d.F.FTRD))4+@+@tLDJJ

6D&&(:(:FDOOT__4@D(($*>*>TJD'')<)<4H    
svd_solvern_components   c                    t         j                  }t        ||       }|j                  |      j	                  |      }|j
                  d   |k(  sJ |j                  |      }t        ||       |j	                  |      }t        ||       |j                         }|j                         }t        t        j                  ||      t        j                  |j
                  d         d       y )Nr-   r,   r.   -q=atol)irisdatar	   fit	transformshapefit_transformr   get_covarianceget_precisionnpdoteye)r,   r-   XpcaX_rX_r2cov	precisions           r)   test_pcarE   0   s     			A
<J
?C ''!*

q
!C99Q<<''' QDC
--
CC 


C!!#IBFF3	*BFF1771:,>UKr+   density){Gz?皙?g333333?)r.      
   sparse_containerr   scale)r.   rJ   d   c                    d}d}t         j                  j                  |       } |t        j                  j                  t
        t        ||            }	|j                  |	j                  d         |z  }
|	j                  |
      }	t        |||       }|j                  |	       |	j                         }t        |||       }|j                  |       t        |||        |t        j                  j                  t
        t        ||            }|j                         }t        |j                  |      |j                  |      |       t        |j                  |      |j                  |      |       y )NgƠ>giUMu>random_staterF   r.   r-   r,   rP   r   )r<   randomdefault_rngspsparseSPARSE_MSPARSE_Nr8   multiplyr	   r6   toarrayr*   r   r7   )global_random_seedr,   rK   r-   rF   rL   r   transform_rtolrP   r?   scale_vectorr@   XdpcadX2X2ds                   r)   test_pca_sparsera   F   sN    DN99(();<L
		%	 	 	
	A  &&qwwqz2U:L	

< A
!'C
 GGAJ	
B!'D
 	HHRL CD1 

		%	 	 	

B **,CCMM"%s}}S'9OCMM"%t~~c':Pr+   c                 j   t         j                  j                  |       } |t        j                  j                  t
        t        |d            } |t        j                  j                  t
        t        |d            }t        dd|       }t        dd|       }|j                  |       |j                  |      }t        ||d       t        ||j                  |      d       t        ||j                  |      d       t        |j                  |      |j                  |      d       y )	NrG   rO   rJ   r   rQ   g|=r   g&.!>)r<   rR   rS   rT   rU   rV   rW   r	   r6   r9   r*   r   r7   )rZ   rK   rP   r?   r_   pca_fitpca_fit_transformtransformed_Xs           r)   test_pca_sparse_fit_transformrf      s   99(();<L
		%	 	 	
	A 

		%	 	 	

B rhEWXGH;M KKN%33A6MG%6UCM#4#>#>q#AMM7#4#4Q#7dCG%%b)+<+F+Fr+JQUVr+   )r   r   r   c                 J   t         j                  j                  |       } |t        j                  j                  t
        t        |            }t        d|      }d| d}t        j                  t        |      5  |j                  |       d d d        y # 1 sw Y   y xY w)NrP      r0   z@PCA only support sparse inputs with the "arpack" solver, while "z" was passedmatch)r<   rR   RandomStaterT   rU   rV   rW   r	   pytestraises	TypeErrorr6   )rZ   r,   rK   rP   r?   r@   error_msg_patterns          r)   test_sparse_pca_solver_errorrq      s     99(();<L
		% 	 	
	A 2*
5C
J:, W 	  
y(9	: 
  s   >BB"c                     d} | dz   }t         j                  j                  dd| |f      }t        |       }t	        j
                         5  t	        j                  dt               |j                  |       d d d        y # 1 sw Y   y xY w)NrJ   rI   r.   sizer-   error)	r<   rR   uniformr	   warningscatch_warningssimplefilterRuntimeWarningr6   )r-   
n_featuresr?   r@   s       r)   test_no_empty_slice_warningr~      sw    L!J
		"a|Z&@AA
<
(C		 	 	" g~6
  s   ,BB
copyTFsolverc                    t         j                  j                  d      }d}d}d}d}t        j                  |j	                  ||      t        j                  t        j
                  t        j                  dd|            |j	                  ||                  }|d d d dfxx   dz  cc<   |j                  ||fk(  sJ |j                  d	      j                         d
kD  sJ |j                         }t        |d|| dd      }	|	j                  |j                               }
|
j                  ||fk(  sJ |	j                  |      }t        |
|d       t        |
j                  dd      t        j                  |             t        |
j                  d	      t        j                   |      d       |j                         }t        |d||       j#                  |j                               }	|	j                  |      }|j                  ||fk(  sJ |j                  d	      j                         t%        j&                  dd      k(  sJ y )Nr   rM   P   ri   2   g      $@      ?   axisgfffffE@T   )r-   whitenr   r,   rP   iterated_powergMb@?r   r.   ddofr   r1   r2   F)r-   r   r   r,   gfffffR@rH   )rel)r<   rR   rl   r=   randndiaglinspacer8   stdr   r	   r9   r7   r   onesmeanzerosr6   rm   approx)r   r   rng	n_samplesr}   r-   rankr?   X_r@   
X_whitenedX_whitened2X_unwhiteneds                r)   test_whiteningr      s	    ))


"CIJLD 			)T"
rwwr{{4d34ciij6QR	A a"fINI77y*---- 55a5=%%% 
B
!C ""2779-J	<8888--#KJ$7JNNN2BGGL4IJJOOO+RXXl-C%P	
B
!%dv	c"'')n  ==$L)\!:::: #'')V]]4T-JJJJr+   r   c                 r   t         j                  j                  d      }d\  }}|j                  ||      }t	        dd      }t	        d| d      }|j                  |       |j                  |       t        |j                  |j                  d       t        |j                  |j                  d       y )	Nr   rM   r   rI   r   r0   rQ   皙?r   )	r<   rR   rl   r   r	   r6   r   r    explained_variance_ratio_r,   r   r   r}   r?   pca_full	pca_others          r)   .test_pca_explained_variance_equivalence_solverr      s    
))


"C#Iz		)Z(Af5HzJILLOMM!$$i&C&C$ **++r+   r?   rM   r   N   )n_informativerP   zrandom-datazcorrelated-data)idsc                 X   t        d|d      }|j                  |       }t        |j                  t	        j
                  |dd             t        j                  j                  t	        j                  | d            d   }t        |d	      d d }t        |j                  |d
       y )NrI   r   rQ   r.   r   F)rowvarT)reverse{Gzt?r   )
r	   r9   r   r    r<   varlinalgeigrC   sorted)r?   r,   r@   X_pcaexpected_results        r)   %test_pca_explained_variance_empiricalr     s     1!
DCa EC++RVVE-JKiimmBFF1U$;<Q?O_d;BQ?OC++_4Hr+   c                 0   t         j                  j                  d      }d\  }}|j                  ||      }t	        dd|      }t	        d| |      }|j                  |       |j                  |       t        |j                  |j                  d       y )Nr   r   rI   r   rQ   r   r   )r<   rR   rl   r   r	   r6   r   r!   r   s          r)   $test_pca_singular_values_consistencyr   !  s|    
))


"C#Iz		)Z(Af3GHzLILLOMM!H--y/I/IPTUr+   c           	      l   t         j                  j                  d      }d\  }}|j                  ||      }t	        d| |      }|j                  |      }t        t        j                  |j                  dz        t         j                  j                  |d      dz         t        |j                  t        j                  t        j                  |dz  d                   d\  }}|j                  ||      }t	        d| |      }|j                  |      }|t        j                  t        j                  |dz  d            z  }|d d dfxx   d	z  cc<   |d d d
fxx   dz  cc<   t        j                  ||j                        }|j                  |       t        |j                  g d       y )Nr   r   rI   rQ   fror   )rM   n   r   A`"	@r.   X9v@)r   r   r   )r<   rR   rl   r   r	   r9   r   sumr!   r   normsqrtr=   r   r6   )r,   r   r   r}   r?   r@   X_transX_hats           r)   test_pca_singular_valuesr   0  s_   
))


"C#Iz		)Z(A
1#
FC"G 
s##Q&')G1)L C(("''"&&!!2L*MN %Iz		)Z(A
1#
FC"Grwwrvvgqjq122GAqDMUMAqDMUMFF7COO,EGGENC((*=>r+   c                    t         j                  j                  d      }d\  }}|j                  ||      dz  }|d dxxx t        j                  g d      z  ccc d|j                  d|      z  t        j                  g d      z   }t        d|       j                  |      j                  |      }|t        j                  |dz  j                               z  }t        t        j                  |d   d         d	d
       y )Nr   rM   r   rH   rJ   r         r.   rI   r0   r   r   r   )r<   rR   rl   r   arrayr	   r6   r7   r   r   r   abs)r,   r   npr?   XtYts          r)   test_pca_check_projectionr   N  s     ))


"CDAq		!Q#AcrFbhhy!!F	syyA	)!4	4B	!
	3	7	7	:	D	DR	HB"''2q5++-
  BBFF2a58$c5r+   c                     ddgddgg}t        d| d      }|j                  |      }|j                  sJ d       t        |j	                         dd       t        |j                         d	d
       y )Nr   g        r.   r   rQ   )rI   r.   r1   r2   gQ?r   r   )r	   r9   r8   r   r   r   )r,   r?   r@   r   s       r)   test_pca_check_projection_listr   ]  si     sc3Z A
1!
DC"G== & =GLLNDu5GKKM4d3r+   )r   r   r   r   c                 :   t         j                  j                  d      }d\  }}|j                  ||      }|d d dfxx   dz  cc<   |g dz  }t	        d| |      j                  |      }|j                  |      }|j                  |      }t        ||d	       y )
Nr   )r   r   r.   gh㈵>)r   r   r   rI   r-   r,   r   h㈵>r   )	r<   rR   rl   r   r	   r6   r7   inverse_transformr   )	r,   r   r   r   r   r?   r@   Y	Y_inverses	            r)   test_pca_inverser   h  s     ))


"CDAq		!QAadGwGNA 1F
C
G
G
JCaA%%a(IAyt,r+   r5   )r   r.   r   )r.   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   rI   zmust be strictly less than min)r   r   zZn_components=3 must be between 0 and min\(n_samples, n_features\)=2 with svd_solver='full'c                 p   d}t        ||       }t        j                  t        |      5  |j	                  |       d d d        | dk(  rU|}dj                  ||      }t        j                  t        |      5  t        ||       j	                  |       d d d        y y # 1 sw Y   dxY w# 1 sw Y   y xY w)NrI   r,   rj   r   zgn_components={}L? must be strictly less than min\(n_samples, n_features\)={}L? with svd_solver='arpack')r	   rm   rn   
ValueErrorr6   format)r,   r5   r-   err_msg
smallest_d
pca_fitteds         r)   test_pca_validationr   z  s    , J\j9J	z	1 t X!""(&z"B 	
 ]]:W5 	?488>	? 	? 	 	? 	?s   B 9B, B),B5zsolver, n_components_r   c                 `    t        |      }|j                  |        |j                  |k(  sJ y )Nr   )r	   r6   r#   )r5   r   r#   r@   s       r)   test_n_components_noner     s-     
 CGGDM---r+   r   c                     t         j                  j                  d      }d\  }}|j                  ||      }t	        d|       }|j                  |       |j                  dk(  sJ y )Nr   iX  rJ   mler0   r.   )r<   rR   rl   r   r	   r6   r#   )r,   r   r   r}   r?   r@   s         r)   test_n_components_mler     s]     ))


"C#Iz		)Z(A
5Z
8CGGAJ!!!r+   c                 .   t         j                  j                  d      }d\  }}|j                  ||      }t	        d|       }dj                  |       }t        j                  t        |      5  |j                  |       d d d        y # 1 sw Y   y xY w)Nr   r   r   r0   z:n_components='mle' cannot be a string with svd_solver='{}'rj   )
r<   rR   rl   r   r	   r   rm   rn   r   r6   )r,   r   r   r}   r?   r@   r   s          r)   test_n_components_mle_errorr     s     ))


"C#Iz		)Z(A
5Z
8CJQQG 
z	1 
  s   0BBc                  8   t         j                  j                  d      } d\  }}| j                  ||      dz  }|d dxxx t        j                  g d      z  ccc t        dd      j                  |      }|j                  dk(  sJ |j                  d	k(  sJ y )
Nr   rM   r   rH   rJ   r   r   r   r.   rI   r   r   r0   r.   )	r<   rR   rl   r   r   r	   r6   r-   r#   )r   r   r   r?   r@   s        r)   test_pca_dimr     s    
))


"CDAq		!Q#AcrFbhh''F
5V
4
8
8
;Cu$$$!!!r+   c            
         d\  } }t         j                  j                  d      }|j                  | |      dz  |j                  | d      t        j                  g d      z  z   t        j                  g d      z   }t        |d      }|j                  |       |j                  }t        j                  t        d|      D cg c]  }t        |||        c}      }|d   |j                         d	| z  z
  kD  sJ y c c}w )
Nr   r   r   rH   r.   r   )r.   r   r   r      r   r0   rG   )r<   rR   rl   r   r   r	   r6   r    ranger
   max)r   r   r   r?   r@   spectklls           r)   test_infer_dim_1r     s     DAq
))


"C		!Q#
))Aq/BHH_5
5	6
((?
#	$ 
 1
0CGGAJ##E	5A;Ga$UAq1G	HBa52668dQh&&&& Hs   C>c                  x   d\  } }t         j                  j                  d      }|j                  | |      dz  }|d dxxx t        j                  g d      z  ccc |ddxxx t        j                  g d      z  ccc t        |d	      }|j                  |       |j                  }t        ||       d
kD  sJ y )Nr   r   rH   rJ   r      r   r   r   rI   rs   r   r0   r.   	r<   rR   rl   r   r   r	   r6   r    r   r   r   r   r?   r@   r   s         r)   test_infer_dim_2r     s     DAq
))


"C		!Q#AcrFbhh''FbH)**H
1
0CGGAJ##EE1%)))r+   c            	         d\  } }t         j                  j                  d      }|j                  | |      dz  }|d dxxx t        j                  g d      z  ccc |ddxxx t        j                  g d      z  ccc |dd	xxx d
t        j                  g d      z  z  ccc t        |d      }|j                  |       |j                  }t        ||       d
kD  sJ y )Nr   r   rH   rJ   r   r   r   ri   (   rI   )rs   r.   rs   r.   rs   r   r0   r   r   s         r)   test_infer_dim_3r     s    DAq
))


"C		!Q#AcrFbhh''FbH)**HbHBHH/000H
1
0CGGAJ##EE1%)))r+   z'X, n_components, n_components_validatedgffffff?rI   rG   r   r   g      ?c                     t        |d      }|j                  |        |j                  t        j                  |      k(  sJ |j
                  |k(  sJ y )Nr   r0   )r	   r6   r-   rm   r   r#   )r?   r-   n_components_validatedr@   s       r)   $test_infer_dim_by_explained_variancer     sM     <F
;CGGAJv}}\:::: 6666r+   c                    d\  }}t         j                  j                  d      }|j                  ||      dz  t        j                  g d      z   }t        d|       }|j                  |       |j                  |      }dt        j                  dt         j                  z  t        j                  d      z  d	z        z  |z  }t        ||z  dd
       |j                  |j                  ||      dz  t        j                  g d      z         }||kD  sJ t        dd|       }|j                  |       |j                  |      }||kD  sJ y )N)r   r   r   rH   r   rI   r0   g      r.   g|Gz?r   r   g?T)r-   r   r,   )r<   rR   rl   r   r   r	   r6   scorelogpiexpr   )	r,   r   r   r   r?   r@   ll1hll2s	            r)   test_pca_scorer    s    DAq
))


"C		!Q# 33A
1
4CGGAJ
))A,Crvva"%%i"&&)+f4559AC!GQT*
))CIIaOc)BHHY,??
@C99
1Tj
ACGGAJ
))A,C99r+   c                  x   d\  } }t         j                  j                  d      }|j                  | |      |j                  | d      t        j                  g d      z  z   t        j                  g d      z   }|j                  | |      |j                  | d      t        j                  g d      z  z   t        j                  g d      z   }t        j
                  |      }t        |      D ]4  }t        |d      }|j                  |       |j                  |      ||<   6 |j                         dk(  sJ y )N)   r   r   r.   r   )r.   r   r   r   r0   )r<   rR   rl   r   r   r   r   r	   r6   r  argmax)r   r   r   Xlr   r   r   r@   s           r)   test_pca_score3r  (  s    DAq
))


"C	1a399Q?RXXi-@@	@288ICV	VB	1a399Q?RXXi-@@	@288ICV	VB	!B1X qV4		"1
 99;!r+   c                     t        j                  d      \  }}t        d| d      }|j                  |       t	        j
                  |j                  |j                  z
  dk\        sJ y )NT
return_X_yri   r   rQ   )r   load_digitsr	   r6   r<   allr    r%   )r,   r?   _r@   s       r)   test_pca_sanity_noise_variancer  7  sY     40DAq
2*1
ECGGAJ663**S-@-@@QFGGGr+   c                 
   t        j                  d      \  }}t        ddd      }t        d| d      }|j                  |       |j                  |       t	        |j                  |      |j                  |      d       y )	NTr  ri   r   r   rQ   r   r   )r   r  r	   r6   r   r  )r,   r?   r  r   r   s        r)   "test_pca_score_consistency_solversr  C  si     40DAqvAFH
KILLOMM!HNN1%yq'9Er+   c                    d\  }}t         j                  j                  d      }|j                  ||      dz  t        j                  g d      z   }t        ||       }|j                  |       |j                  dk(  sJ |j                  |       |j                  |j                         |j                  dk(  sJ |j                  |j                         y )Nr   r   rH   r   r0   )
r<   rR   rl   r   r   r	   r6   r%   r  T)r,   r   r   r   r?   r@   s         r)   'test_pca_zero_noise_variance_edge_casesr  O  s     DAq
))


"C		!Q# 33A
1
4CGGAJ!### IIaLGGACCL!### IIaccNr+   z#data, n_components, expected_solver)r   r   rt   )rJ   r   r   rJ   c                     t        |d      }t        ||d      }|j                  |        |j                  |        t        |j                  |j                         y )Nr   )r-   rP   rQ   )r	   r6   r   r   )r5   r-   expected_solverpca_autopca_tests        r)   test_pca_svd_solver_autor  e  sQ     1=H!oAH LLLLH(((*>*>?r+   c           	      p   t         j                  j                  d      }|j                  dd      }t        j                  d      }t        d      D ]+  }t        d| |      }|j                  |      d   ||d d f<   - t        |t        j                  |dd d f   d      j                  dd             y )Nr   rJ   )r   rI   r   rI   rQ   )r<   rR   rl   randr   r   r	   r9   r   tilereshape)r,   r   r?   re   ir@   s         r)   test_pca_deterministic_outputr$  {  s    
))


"CRAHHW%M2Y 6qZcJ!//215ad6 M277=A+>#C#K#KBPQ#RSr+   c                 0    t        |        t        |        y )N)"check_pca_float_dtype_preservation$check_pca_int_dtype_upcast_to_doubler   s    r)   test_pca_dtype_preservationr(    s    &z2(4r+   c                    t         j                  j                  d      j                  dd      j	                  t         j
                  d      }|j	                  t         j                        }t        d| d      j                  |      }t        d| d      j                  |      }|j                  j                  t         j
                  k(  sJ |j                  j                  t         j                  k(  sJ |j                  |      j                  t         j
                  k(  sJ |j                  |      j                  t         j                  k(  sJ t        |j                  |j                  d	       y )
Nr   r   r   Fr   r   rQ   g-C6*?r   )r<   rR   rl   r   astypefloat64float32r	   r6   r   dtyper7   r   )r,   X_64X_32pca_64pca_32s        r)   r&  r&    s   99  #((q188%8PD;;rzz"DaJQGKKDQFaJQGKKDQF##rzz111##rzz111D!''2::555D!''2::555
 F&&(:(:Fr+   c                    t         j                  j                  d      j                  ddd      }|j	                  t         j
                  d      }|j	                  t         j                  d      }t        d| d      j                  |      }t        d| d      j                  |      }|j                  j                  t         j                  k(  sJ |j                  j                  t         j                  k(  sJ |j                  |      j                  t         j                  k(  sJ |j                  |      j                  t         j                  k(  sJ t        |j                  |j                  d	       y )
Nr   r   )r   r   Fr*  r   rQ   g-C6?r   )r<   rR   rl   randintr+  int64int32r	   r6   r   r.  r,  r7   r   )r,   X_i64X_i32r1  r2  s        r)   r'  r'    s   II!!!$,,Qi@ELLL.ELLL.EaJQGKKERFaJQGKKERF##rzz111##rzz111E"((BJJ666E"((BJJ666F&&(:(:Fr+   c                     t        d      \  } }t               j                  | |      }|j                  j	                         d   }t        |      j                  | |      }|j
                  | j                  d   k(  sJ y )NTr  rv   r.   )r   r	   r6   r   cumsumr#   r8   )r?   yr'   r-   r(   s        r)   5test_pca_n_components_mostly_explained_variance_ratior=    so     %DAq599Q?D1188:2>LL)--a3D+++r+   c                      t        j                  g d      } d}dD ]3  }t        j                  t        d      5  t        | ||       d d d        5 y # 1 sw Y   @xY w)Nr.   KH9r@  r@  rJ   )r   r   z"should be in \[1, n_features - 1\]rj   )r<   r   rm   rn   r   r
   )spectrumr   r   s      r)   test_assess_dimension_bad_rankrB    sZ    xx01HI 9]]:-RS 	9hi8	9 	99	9 	9s   AA	c                      t        j                  g d      } t        | dd      t         j                   kD  sJ dD ]#  }t        | |d      t         j                   k(  r#J  t	        | d      dk(  sJ y )Nr?  r.   rJ   r   r   )rI   r   )r<   r   r
   infr   )rA  r   s     r)   test_small_eigenvalues_mlerF    su     xx01HXA<wFFF @ 44???@ Hb)Q...r+   c                      t        j                  dddddd      \  } }t        d      j                  |       }|j                  dk(  sJ y )Nr   r.      *   )r}   r   
n_repeatedn_redundantn_clusters_per_classrP   r   rv   )r   r   r	   r6   r#   r?   r  r@   s      r)   test_mle_redundant_datarN    sU     ''DAq 5
!
%
%a
(C!!!r+   c                      t        j                  ddd      \  } }t        dd      }t        j                  t
        d	      5  |j                  |        d d d        y # 1 sw Y   y xY w)
Nr      rI  )r   r}   rP   r   r   r0   z?n_components='mle' is only supported if n_samples >= n_featuresrj   )r   r   r	   rm   rn   r   r6   rM  s      r)   test_fit_mle_too_few_samplesrQ    s]     ''"RTUDAq
5V
4C	O
  	
	  s   AA(c                     d\  } }t         j                  j                  d      j                  | |      }t        j                  |d d d df   d      |d d df<   t        dd      }|j                  |       |j                  |dz
  k(  sJ y )	N)r   rJ   r   rs   r   r   r   r   r.   )r<   rR   rl   r   r   r	   r6   r#   )r   n_dimr?   pca_skls       r)   test_mle_simple_caserU    s      Iu
		a &&y%8AwwqCRCyr*AaeH%F+GKKN  EAI---r+   c                  ~   d\  } }t        j                  | |f      }t         j                  j                  |d      \  }}}t	        |dd  t        j
                  |dz
        d       t        j                  t        |d|             sJ t        d|      D ]#  }t        |||       t         j                   k(  r#J  y )	N)	   r   T)full_matricesr.   r1   r2   rD  rI   )
r<   r   r   svdr   r   isfiniter
   r   rE  )r   r}   r?   r  sr   s         r)   test_assess_dimesion_rank_oner\    s     Iz
J'(AiimmATm2GAq!AabE288JN3%@;;(iHIIIa$ @ D)4???@r+   c                  0   t         j                  j                  d      } d}| j                  d|      }t	        dd|d      j                  |      }t	        dd      j                  |      }t	        dd	d
      j                  |      }t        t        j                  |j                        t        j                  |j                               t        t        j                  |j                        t        j                  |j                               y)zCheck that exposing and setting `n_oversamples` will provide accurate results
    even when `X` as a large number of features.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/20589
    r   rM   r   r.   r   )r-   r,   n_oversamplesrP   r   r0   r   rQ   N)	r<   rR   rl   r   r	   r6   r   r   r   )r   r}   r?   pca_randomizedr   
pca_arpacks         r)   %test_pca_randomized_svd_n_oversamplesra    s     ))


"CJ		%$A  	
 
c!f  f599!<H!qIMMaPJBFF8//0"&&9O9O2PQBFF>556z?U?U8VWr+   c                      t        d      j                  t        j                        } | j	                         }t        t        d      D cg c]  }d| 	 c}|       yc c}w )z Check feature names out for PCA.rI   rv   r@   N)r	   r6   r4   r5   get_feature_names_outr   r   )r@   namesr#  s      r)   test_feature_names_outre  !  sK    
1

!
!$))
,C%%'E584a#aS	4e<4s   A!c                 V   t         j                  j                  d      }|j                  dd      }t	               j                  |      }|j                  |j                  z  }t        j                  |dd      j                         }t         j                  j                  ||       y)z9Check the accuracy of PCA's internal variance calculationr   r   r
  r.   r   N)r<   rR   rl   r   r	   r6   r    r   r   r   testingr   )r   r   r?   r@   pca_vartrue_vars         r)   test_variance_correctnessrj  )  s|     ))


"C		$A
%))A,C%%(E(EEGvvaaa(,,.HJJw1r+   c                    t        ||      }t        j                  j                  |      }|j	                  ||      }|j                  |       |j                         }|j                         }	t        d      5  t        |      j                  |      }
|
j                         }|j                  dk(  sJ |j                  |j                  k(  sJ t        t        ||      |t        |             |
j                         }|j                  dk(  sJ |j                  |j                  k(  sJ t        t        ||      |	t        |             d d d        y # 1 sw Y   y xY w)Nr   Tarray_api_dispatch)r   r   xpr2   )r   r4   r5   r+  asarrayr6   r;   r:   r   r   r8   r.  r   r   r   )name	estimatorarray_namespacer   
dtype_namero  iris_npiris_xpprecision_npcovariance_npestimator_xpprecision_xpcovariance_xps                r)   check_array_api_get_precisionr|  4  s>   	ov	6Biiz*Gjjj0GMM'**,L,,.M	4	0 
Y'++G4#113!!V+++!!W]]222lr2
+	

 %335""f,,,""gmm333m3
+	

 
 
s   <CEE%z#array_namespace, device, dtype_namecheckrr  r0   rH   r   QR)r-   r,   power_iteration_normalizerrP   c                 J    | j                   j                  } ||| |||       y )Nr   rt  )	__class____name__)rr  r}  rs  r   rt  rq  s         r)   test_pca_array_api_compliancer  S  s%    2 ''D	$	?6jQr+   r   c                    | j                   j                  } ||| |||       t        ||      }t        d      \  }}|j	                  |d      }t        |j                        }	t        |       }
|j                  ||      }|j                  ||      }|
j                  ||       |
j                  }|
j                  }t        |
      }t        d      5  |j                  ||       |j                  }t        |      t        |      k(  sJ t        ||	      }|j                  }t        |      t        |      k(  sJ t        ||	      }d d d        j                  |j                  k(  sJ |j                  d
   |j                  d
   k(  sJ j                  |j                  k(  sJ t!        |j                  d   |j                  d         }t#        |d | |d | |	       |j                  d   |j                  d   k7  r\|d   }||d  }||d  }t%        t'        j(                  ||z
        |	k        sJ t%        t'        j(                  ||z
        |	k        sJ y y # 1 sw Y   xY w)Nr  rI  rh   Fr*  r   Trl  rn  r.   r   r2   rs   )r  r  r   r   r+  r   r.  r   rp  r6   r   r    r   array_devicer   r8   minr   r  r<   r   )rr  r}  rs  r   rt  rq  ro  r?   r<  r3   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  p  s{   . ''D	$	?6jQ 
ov	6BB/DAq	%(A!''"D
	
C::a:'D::a:'DGGAqMOOM333ZF	4	0 S

4**M*l4.@@@@,]rB & : :12l46HHHH#45Jr#R S !!]%8%8888!!!$(;(;A(>>>>#))-B-H-HHHH )//2M4G4G4JKN .1o~. a M$7$7$::2261./B7H266+.@@ADHIII266.1CCDtKLLL ;3S Ss   A7I%%I/c                     t        j                  d       t        j                  d      } | j                  t        j                        }t        ddd      }t        j                  d      }t        j                  t        |      5  t        d	
      5  |j                  |       d d d        d d d        |j                  dd       t        j                  d      }t        j                  t        |      5  t        d	
      5  |j                  |       d d d        d d d        |j                  dd       t        j                  d      }t        j                  t        |      5  t        d	
      5  |j                  |       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   BxY w# 1 sw Y   y xY w)Narray_api_compatznumpy.array_apirI   r   r   rQ   zCPCA with svd_solver='arpack' is not supported for Array API inputs.rj   Trl  r   LU)r,   r  z[Array API does not support LU factorization. Set `power_iteration_normalizer='QR'` instead.r   zArray API does not support LU factorization, falling back to QR instead. Set `power_iteration_normalizer='QR'` explicitly to silence this warning.)rm   importorskiprp  r4   r5   r	   reescapern   r   r   r6   
set_paramswarnsUserWarning)ro  rv  r@   expected_msgs       r)   7test_array_api_error_and_warnings_on_unsupported_paramsr    s   
*+			.	/Bjj#G
1
BC99ML 
z	6 t4 	GGG	 NNltNL99	6L 
z	6 t4 	GGG	 NNlvNN99	QL 
k	6 t4 	GGG	 #	 	 	 	 	 	 sl   F(F'F(:G F4G ,G9GGF%	!F((F14F=	9G  G	G	GG!)fr  ry   numpyr<   rm   scipyrT   numpy.testingr   sklearnr   r   sklearn.baser   sklearn.datasetsr   r   sklearn.decompositionr	   sklearn.decomposition._pcar
   r   sklearn.utils._array_apir   r   r   r   r  sklearn.utils._testingr   r   sklearn.utils.estimator_checksr   r   sklearn.utils.fixesr   r   r4   PCA_SOLVERSrV   rW   r  SPARSE_MAX_COMPONENTSr*   markparametrizer   r5   r8   rE   ra   rf   rq   r~   r   r   rR   rl   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  rx   r  r$  r(  r&  r'  r=  rB  rF  rN  rQ  rU  r\  ra  re  rj  r|  r  r  r   r+   r)   <module>r     s	   	     , ,  ; % J 
 < H ?x6
  (Hh/ I {3q$))//!2D)EFL G 4L( $564+^n-LMz2,/2Q 0 3 N 5 7
2Qj +^n-LMW NWB 'EF+^n-LM N G$ $/;/1K 0 01Kj ,'?@ A* 
		a &&sB/$$$S"BQOPQR 
)*   {3I 4I ,'?@V AV {3? 4?: {36 46 {34 44 'GHE4=1- 2 I-  
XRXXy),-xrxxI8N/O/Q/QR ' ?!&?, 	TYY__%&	3tyy'!+,	s499??+, $))TYY[[!9:. ;. '78" 9" ,'?@ A"'"*
* -	D!	D!			q	!	&	&q"	-sA677 {3 4* {3H 4H ,'?@F AF '=> ?* )			q	!	)	)z	)	:CH			q	!	)	)x	)	8!VD			q	!	)	)z	)	:BG			q	!	)	)z	)	:BM@@ {3T 4T {35 45
G&G"	,9
/"
.
@X4= $/2 02
> )+T+V %'DE   
 v.=#'+		
	 	!  R,R )+T+V "#   
  	62 	!  7M(7Mtr+   