o
    Ó\i¼£  ã                   @   sê  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 ¡ Z)g d¢Z*d\Z+Z,e-e+e,ƒZ.d¯dd„Z/ej0 1de*¡ej0 1de2de)j3j4d ƒ¡dd„ ƒƒZ5ej0 1dg d¢¡ej0 1dg d¢¡ej0 1de(e' ¡ej0 1dddg¡ej0 1dg d ¢¡d!d"„ ƒƒƒƒƒZ6ej0 1de(e' ¡d#d$„ ƒZ7ej0 1dd%d&g¡ej0 1de(e' ¡d'd(„ ƒƒZ8ej0 1de(e' ¡d)d*„ ƒZ9d+d,„ Z:ej0 1d-d.d/g¡ej0 1d0e*¡d1d2„ ƒƒZ;ej0 1d3e<e=e>e*ƒd&d4h ƒƒ¡ej0 1d5d6d7g¡ej0 1d8d/d.g¡ej0 1d9d/d.g¡d:d;„ ƒƒƒƒZ?ej0j1d<ej@ Ad ¡ Bd=d>¡ejd=d>d?d d@d  ej@ Ad ¡ BdAd=¡gg dB¢dCej0 1de*¡dDdE„ ƒƒZCej0 1ddd%g¡dFdG„ ƒZDej0 1de*¡dHdI„ ƒZEej0 1de*¡dJdK„ ƒZFej0 1de*¡dLdM„ ƒZGej0 1dg dN¢¡ej0 1d9d/d.g¡dOdP„ ƒƒZHej0 1dQe Ig dR¢g dS¢g¡e Ig dR¢g dS¢g¡jJg¡ej0 1dTg dU¢¡dVdW„ ƒƒZKej0 1dXd&e-e)j3j4ƒfde-e)j3j4ƒd fd%e-e)j3j4ƒfg¡ej0 1dQe)j3e)j3jJg¡dYdZ„ ƒƒZLej0 1dd4d&g¡d[d\„ ƒZMej0 1ddd%g¡d]d^„ ƒZNd_d`„ ZOdadb„ ZPdcdd„ ZQdedf„ ZRej0 1dge)j3dhdife)j3djdfej@ Ad ¡ Sdkdl¡dmdifg¡dndo„ ƒZTej0 1de*¡dpdq„ ƒZUdrds„ ZVej0 1de*¡dtdu„ ƒZWej0 1ddd%g¡dvdw„ ƒZXej0 1dd&d%g¡dxdy„ ƒZYej0 1dzg d{¢¡d|d}„ ƒZZej0 1de*¡d~d„ ƒZ[ej0 1de*¡d€d„ ƒZ\d‚dƒ„ Z]d„d…„ Z^d†d‡„ Z_dˆd‰„ Z`dŠd‹„ ZadŒd„ ZbdŽd„ Zcdd‘„ Zdd’d“„ Zed”d•„ Zfd–d—„ Zgej0 1d-d.d/g¡d˜d™„ ƒZhdšd›„ Ziej0j1dœeƒ edCej0j1de%eige dCej0j1džedid&dŸedid&d.d ed¡d&d.d ediddŸedidd.d edid%d¢d d£ge dCd¤d¥„ ƒƒƒZjej0j1dœeƒ edCej0j1deige dCej0j1džed¦d&dŸge dCd§d¨„ ƒƒƒZkej0jle jm nd©¡dªkd«d¬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,  çH¯¼šò×z>çê-™—q=c                 C   s˜   t | j|j||d t | j|j||d t | j|j||d t | j|j||d t | j|j||d | j|jks:J ‚| j|jksBJ ‚| j|jksJJ ‚d S )N©ÚrtolÚatol)	r   Úcomponents_Úexplained_variance_Úsingular_values_Úmean_Únoise_variance_Ún_components_Ú
n_samples_Ún_features_in_)Úpca1Úpca2r!   r"   © r-   ú…/var/www/www-root/data/www/176.119.141.140/sports-predictor/venv/lib/python3.10/site-packages/sklearn/decomposition/tests/test_pca.pyÚ_check_fitted_pca_close'   s   ÿr/   Ú
svd_solverÚn_componentsé   c                 C   s’   t j}t|| d}| |¡ |¡}|jd |ksJ ‚| |¡}t||ƒ | |¡}t||ƒ | ¡ }| 	¡ }tt
 ||¡t
 |jd ¡dd d S )N©r1   r0   r2   r   ©r"   )ÚirisÚdatar	   ÚfitÚ	transformÚshapeÚfit_transformr   Úget_covarianceÚget_precisionÚnpÚdotÚeye)r0   r1   ÚXÚpcaÚX_rÚX_r2ÚcovÚ	precisionr-   r-   r.   Útest_pca5   s   



&rF   Údensity)ç{®Gáz„?çš™™™™™¹?g333333Ó?)r2   é   é
   Úsparse_containerr   r   Úscale)r2   rK   éd   c                 C   sè   d}d}t j | ¡}|tjjtt||dƒ}	| |	jd ¡| }
|	 |
¡}	t	||| d}| 
|	¡ |	 ¡ }t	||| d}| 
|¡ t|||d |tjjtt||dƒ}| ¡ }t| |¡| |¡|d t| |¡| |¡|d dS )z?Check that the results are the same for sparse and dense input.r   ç»½×Ùß|Û=©Úrandom_staterG   r2   ©r1   r0   rQ   r4   N)r=   ÚrandomÚdefault_rngÚspÚsparseÚSPARSE_MÚSPARSE_Nr9   Úmultiplyr	   r7   Útoarrayr/   r   r8   )Úglobal_random_seedr0   rL   r1   rG   rM   r"   Útransform_atolrQ   r@   Úscale_vectorrA   ÚXdÚpcadÚX2ÚX2dr-   r-   r.   Útest_pca_sparseK   sL   üÿ	
ý
ý
üÿrb   c                 C   s°   t j | ¡}|tjjtt|ddƒ}|tjjtt|ddƒ}tdd| d}tdd| d}| |¡ | 	|¡}t
||ƒ t|| |¡ƒ t|| |¡ƒ t| |¡| |¡ƒ d S )NrH   rP   rK   r   rR   )r=   rS   rT   rU   rV   rW   rX   r	   r7   r:   r/   r   r8   )r[   rL   rQ   r@   r`   Úpca_fitÚpca_fit_transformÚtransformed_Xr-   r-   r.   Útest_pca_sparse_fit_transformˆ   s6   üÿüÿ	ÿ


rf   r   r   c                 C   sx   t j | ¡}|tjjtt|dƒ}td|d}d|› d}tj	t
|d | |¡ W d   ƒ d S 1 s5w   Y  d S )N©rQ   é   r3   zWPCA only support sparse inputs with the "arpack" and "covariance_eigh" solvers, while "z" was passed©Úmatch)r=   rS   ÚRandomStaterU   rV   rW   rX   r	   ÚpytestÚraisesÚ	TypeErrorr7   )r[   r0   rL   rQ   r@   rA   Úerror_msg_patternr-   r-   r.   Útest_sparse_pca_solver_errorª   s    ýÿÿÿ"ÿrp   c                 C   s\   t j | ¡}|tjjtt|dƒ}tddd |¡}tddd |¡}t	|j
|j
dd dS )	zHCheck that "auto" and "arpack" solvers are equivalent for sparse inputs.rg   rK   r   r3   r   ç{®Gázt?©r!   N)r=   rS   rk   rU   rV   rW   rX   r	   r7   r   r%   )r[   rL   rQ   r@   Ú
pca_arpackÚpca_autor-   r-   r.   Ú7test_sparse_pca_auto_arpack_singluar_values_consistency¾   s   ýÿru   c                  C   sp   d} | d }t jjdd| |fd}t| d}t ¡  t dt¡ | |¡ W d   ƒ d S 1 s1w   Y  d S )NrK   rJ   éÿÿÿÿr2   ©Úsize©r1   Úerror)	r=   rS   Úuniformr	   ÚwarningsÚcatch_warningsÚsimplefilterÚRuntimeWarningr7   )r1   Ú
n_featuresr@   rA   r-   r-   r.   Útest_no_empty_slice_warningÐ   s   

"þr   ÚcopyTFÚsolverc                 C   s„  t j d¡}d}d}d}d}t  | ||¡t  t  t  dd|¡¡| ||¡¡¡}|d d …d d…f  d9  < |j||fks?J ‚|jdd	 ¡ d
ksKJ ‚| 	¡ }t
|d|| ddd}	|	 | 	¡ ¡}
|
j||fksiJ ‚|	 |¡}t|
|dd t|
jdddt  |¡ƒ t|
jdd	t  |¡dd | 	¡ }t
|d|| d | 	¡ ¡}	|	 |¡}|j||fks¯J ‚|jdd	 ¡ tjdddksÀJ ‚d S )Nr   rN   éP   rh   é2   g      $@ç      ð?é   ©ÚaxisgfffffæE@Té   )r1   Úwhitenr‚   r0   rQ   Úiterated_powergü©ñÒMb@?rr   r2   ©Úddofr‰   r   r4   F)r1   r‹   r‚   r0   gfffff†R@rI   )Úrel)r=   rS   rk   r>   ÚrandnÚdiagÚlinspacer9   Ústdr‚   r	   r:   r8   r   ÚonesÚmeanÚzerosr7   rl   Úapprox)rƒ   r‚   ÚrngÚ	n_samplesr€   r1   Úrankr@   ÚX_rA   Ú
X_whitenedÚX_whitened2ÚX_unwhitenedr-   r-   r.   Útest_whiteningÛ   sH   
"þú	
ÿ
þ
&rŸ   Úother_svd_solverr   Ú
data_shapeÚtallÚwideÚrank_deficientr‹   c                 C   sî  |dkr	d\}}nd\}}d}|r1t j |¡}	t||ƒd }
|	j|| |
fd|	j|
|fd }nt|| |d|d}t||ƒ}
|j|d	d
}|d |… ||d … }}|t jkrbtddd}d}ntddd}d}i }| dkrwd}ddi}n| dkr„t  	||¡d }nd }t
|d|d}t
d|| ||dœ|¤Ž}| |¡}t  |¡ ¡ s§J ‚|j|ks®J ‚| |¡}t  |¡ ¡ s¼J ‚|j|ksÃJ ‚|jdk ¡ sÌJ ‚t|j|jfi |¤Ž t|j|jfi |¤Ž |j}t  |¡ ¡ sîJ ‚|j}t  |¡ ¡ súJ ‚|j|k}| ¡ dksJ ‚t|| || fi |¤Ž t|d d …|f |d d …|f fi |¤Ž | |¡}t  |¡ ¡ s9J ‚|j|ksAJ ‚| |¡}t  |¡ ¡ sPJ ‚|j|ksXJ ‚t|d d …|f |d d …|f fi |¤Ž | |¡}t  |¡ ¡ s|J ‚|j|ks„J ‚| |¡}t  |¡ ¡ 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¢   )rN   rh   )rh   rN   rK   rJ   rw   ç      à?)r™   r€   Útail_strengthrQ   F©r‚   g¸…ëQ¸ž?çñhãˆµøä>)r"   r!   rO   r   r   rŒ   r…   r   r2   r   ©r1   r0   r‹   )r1   r0   r‹   rQ   r   r-   )r=   rS   rT   ÚminÚstandard_normalr   ÚastypeÚfloat32ÚdictÚminimumr	   r:   ÚisfiniteÚallÚdtyper$   r   Úexplained_variance_ratio_r#   Úsumr8   Úinverse_transformr9   )r    r¡   r¤   r‹   r[   Úglobal_dtyper™   r€   Ún_samples_testr˜   rš   r@   ÚX_trainÚX_testÚtolsÚvariance_thresholdÚextra_other_kwargsr1   Úpca_fullÚ	pca_otherÚX_trans_full_trainÚX_trans_other_trainÚreference_componentsÚother_componentsÚstableÚX_trans_full_testÚX_trans_other_testÚX_recons_full_testÚX_recons_other_testr-   r-   r.   Útest_pca_solver_equivalence  sº   

ÿþü


üû

þý
ÿÿ

*

þ
ýrÈ   r@   rN   r„   éN   )Ún_informativerQ   rK   )zrandom-tallzcorrelated-tallzrandom-wide)Úidsc                 C   sr   t d|dd}| | ¡}t|jtj|dddƒ tj tj| dd¡d }t	|dd	d d… }t|j|d
d d S )NrJ   r   rR   r2   r   F)ÚrowvarT)Úreverserq   rr   )
r	   r:   r   r$   r=   ÚvarÚlinalgÚeigrD   Úsorted)r@   r0   rA   ÚX_pcaÚexpected_resultr-   r-   r.   Ú%test_pca_explained_variance_empiricalž  s   
rÔ   c                 C   sf   t j d¡}d\}}| ||¡}tdd|d}td| |d}| |¡ | |¡ t|j|jdd d S )Nr   ©rN   r„   rJ   r   rR   rq   rr   )r=   rS   rk   r   r	   r7   r   r%   )r0   r˜   r™   r€   r@   r½   r¾   r-   r-   r.   Ú$test_pca_singular_values_consistency²  s   

rÖ   c                 C   s   t j d¡}d\}}| ||¡}td| |d}| |¡}tt  |jd ¡t j	 
|d¡d ƒ t|jt  t j|d dd¡ƒ d\}}| ||¡}td| |d}| |¡}|t  t j|d dd¡ }|d d …df  d	9  < |d d …d
f  d9  < t  ||j¡}| |¡ t|jg d¢ƒ d S )Nr   rÕ   rJ   rR   Úfrorˆ   )rN   én   r‡   ç‰A`åÐ"	@r2   çX9´Èv¾@)rÙ   rÚ   r†   )r=   rS   rk   r   r	   r:   r   r´   r%   rÏ   ÚnormÚsqrtr>   r#   r7   )r0   r˜   r™   r€   r@   rA   ÚX_transÚX_hatr-   r-   r.   Útest_pca_singular_valuesÁ  s&   
ÿ 

rß   c                 C   s®   t j d¡}d\}}| ||¡d }|d d…  t  g d¢¡7  < d| d|¡ t  g d¢¡ }td| d |¡ |¡}|t  |d  	¡ ¡ }t
t  |d d ¡d	d
d d S )Nr   ©rN   r‡   rI   rK   ©r‡   é   é   r2   rJ   r3   r†   rq   rr   )r=   rS   rk   r   Úarrayr	   r7   r8   rÜ   r´   r   Úabs)r0   r˜   ÚnÚpr@   ÚXtÚYtr-   r-   r.   Útest_pca_check_projectionß  s    rê   c                 C   s^   ddgddgg}t d| dd}| |¡}|jsJ dƒ‚t| ¡ ddd t| ¡ d	d
d d S )Nr†   g        r2   r   rR   )rJ   r2   r   r4   g¸…ëQ¸æ?rq   rr   )r	   r:   r9   r   r•   r“   )r0   r@   rA   rÝ   r-   r-   r.   Útest_pca_check_projection_listî  s   
rë   )r   r   r   c           	      C   s~   t j d¡}d\}}| ||¡}|d d …df  d9  < |g d¢7 }td| |d |¡}| |¡}| |¡}t||dd	 d S )
Nr   )r…   r‡   r2   r¨   )rã   râ   r‡   rJ   r©   çñhãˆµøÔ>rr   )	r=   rS   rk   r   r	   r7   r8   rµ   r   )	r0   r‹   r˜   ræ   rç   r@   rA   ÚYÚ	Y_inverser-   r-   r.   Útest_pca_inverseù  s   

rï   r6   )r   r2   r   )r2   r   r   z!svd_solver, n_components, err_msg))r   r   ú2must be between 1 and min\(n_samples, n_features\))r   r   rð   )r   rJ   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                 C   sª   d}t || d}tjt|d | |¡ W d   ƒ n1 sw   Y  | dkrS|}d ||¡}tjt|d t || d |¡ W d   ƒ d S 1 sLw   Y  d S d S )NrJ   ©r0   ri   r   zgn_components={}L? must be strictly less than min\(n_samples, n_features\)={}L? with svd_solver='arpack')r	   rl   rm   Ú
ValueErrorr7   Úformat)r0   r6   r1   Úerr_msgÚ
smallest_dÚ
pca_fittedr-   r-   r.   Útest_pca_validation  s   ÿý"ÿør÷   zsolver, n_components_c                 C   s&   t |d}| | ¡ |j|ksJ ‚d S )Nrñ   )r	   r7   r(   )r6   rƒ   r(   rA   r-   r-   r.   Útest_n_components_none4  s   


rø   c                 C   sH   t j d¡}d\}}| ||¡}td| d}| |¡ |jdks"J ‚d S )Nr   ©iX  rK   Úmler3   r2   )r=   rS   rk   r   r	   r7   r(   )r0   r˜   r™   r€   r@   rA   r-   r-   r.   Útest_n_components_mleC  s   
rû   c                 C   st   t j d¡}d\}}| ||¡}td| d}d | ¡}tjt|d | 	|¡ W d   ƒ d S 1 s3w   Y  d S )Nr   rù   rú   r3   z:n_components='mle' cannot be a string with svd_solver='{}'ri   )
r=   rS   rk   r   r	   ró   rl   rm   rò   r7   )r0   r˜   r™   r€   r@   rA   rô   r-   r-   r.   Útest_n_components_mle_errorN  s   ÿ"ÿrü   c                  C   st   t j d¡} d\}}|  ||¡d }|d d…  t  g d¢¡7  < tddd |¡}|jdks1J ‚|jd	ks8J ‚d S )
Nr   ©rN   rã   rI   rK   ©r‡   râ   rã   r2   rJ   rú   r   r3   r2   )	r=   rS   rk   r   rä   r	   r7   r1   r(   )r˜   ræ   rç   r@   rA   r-   r-   r.   Útest_pca_dim]  s   rÿ   c                     s¨   d\‰ } t j d¡}| ˆ | ¡d | ˆ d¡t  g d¢¡  t  g d¢¡ }t| dd}| |¡ |j‰t  ‡ ‡fd	d
„td| ƒD ƒ¡}|d | 	¡ dˆ   ksRJ ‚d S )N©r   rã   r   rI   r2   rþ   )r2   r   rŠ   râ   é   r   r3   c                    s   g | ]}t ˆ|ˆ ƒ‘qS r-   )r
   )Ú.0Úk©ræ   Úspectr-   r.   Ú
<listcomp>u  s    z$test_infer_dim_1.<locals>.<listcomp>rH   )
r=   rS   rk   r   rä   r	   r7   r$   ÚrangeÚmax)rç   r˜   r@   rA   Úllr-   r  r.   Útest_infer_dim_1h  s   ÿþÿ
  r
  c                  C   s’   d\} }t j d¡}| | |¡d }|d d…  t  g d¢¡7  < |dd…  t  g d¢¡7  < t|dd	}| |¡ |j}t|| ƒd
ksGJ ‚d S )Nr   r   rI   rK   rþ   é   ©r  r   rŠ   rJ   rv   r   r3   r2   ©	r=   rS   rk   r   rä   r	   r7   r$   r   ©ræ   rç   r˜   r@   rA   r  r-   r-   r.   Útest_infer_dim_2y  s   
r  c                  C   s´   d\} }t j d¡}| | |¡d }|d d…  t  g d¢¡7  < |dd…  t  g d¢¡7  < |dd	…  d
t  g d¢¡ 7  < t|dd}| |¡ |j}t|| ƒd
ksXJ ‚d S )Nrý   r   rI   rK   rþ   r  r  rh   é(   rJ   )rv   r2   rv   r2   rv   r   r3   r  r  r-   r-   r.   Útest_infer_dim_3‡  s   "
r  z'X, n_components, n_components_validatedgffffffî?rJ   rH   rã   r  r¥   c                 C   s<   t |dd}| | ¡ |jt |¡ksJ ‚|j|ksJ ‚d S )Nr   r3   )r	   r7   r1   rl   r—   r(   )r@   r1   Ún_components_validatedrA   r-   r-   r.   Ú$test_infer_dim_by_explained_variance”  s   	
r  c           	      C   sì   d\}}t j d¡}| ||¡d t  g d¢¡ }td| d}| |¡ | |¡}dt  dt j	 t  
d¡ d	 ¡ | }t|| dd
d | | ||¡d t  g d¢¡ ¡}||ks]J ‚tdd| d}| |¡ | |¡}||kstJ ‚d S )N)r   r‡   r   rI   rá   rJ   r3   g      à¿r2   g|®Gáz„?gš™™™™™©?rr   gš™™™™™É?T)r1   r‹   r0   )r=   rS   rk   r   rä   r	   r7   ÚscoreÚlogÚpiÚexpr   )	r0   ræ   rç   r˜   r@   rA   Úll1ÚhÚll2r-   r-   r.   Útest_pca_score£  s   

&$

r  c                  C   sÌ   d\} }t j d¡}| | |¡| | d¡t  g d¢¡  t  g d¢¡ }| | |¡| | d¡t  g d¢¡  t  g d¢¡ }t  |¡}t|ƒD ]}t|dd}| |¡ | 	|¡||< qG| 
¡ dksdJ ‚d S )N)éÈ   r‡   r   r2   rá   )r2   r   rŠ   r   r3   )r=   rS   rk   r   rä   r–   r  r	   r7   r  Úargmax)ræ   rç   r˜   ÚXlrè   r	  r  rA   r-   r-   r.   Útest_pca_score3¹  s   44

r  c                 C   sF   t jdd\}}td| dd}| |¡ t |j|j dk¡s!J ‚d S )NT©Ú
return_X_yrh   r   rR   )r   Úload_digitsr	   r7   r=   r±   r$   r'   )r0   r@   Ú_rA   r-   r-   r.   Útest_pca_sanity_noise_varianceÈ  s   
r$  c                 C   s^   t jdd\}}tdddd}td| dd}| |¡ | |¡ t| |¡| |¡dd d S )	NTr   rh   r   r   rR   rì   rr   )r   r"  r	   r7   r   r  )r0   r@   r#  r½   r¾   r-   r-   r.   Ú"test_pca_score_consistency_solversÔ  s   

r%  c                 C   sŠ   d\}}t j d¡}| ||¡d t  g d¢¡ }t|| d}| |¡ |jdks+J ‚| |¡ | |j	¡ |jdks=J ‚| |j	¡ d S )Nrà   r   rI   rá   r3   )
r=   rS   rk   r   rä   r	   r7   r'   r  ÚT)r0   ræ   rç   r˜   r@   rA   r-   r-   r.   Ú'test_pca_zero_noise_variance_edge_casesà  s   

r'  z4n_samples, n_features, n_components, expected_solver))rK   r…   rã   r   )r   r…   r…   r   )r   éô  i  r   )r   r(  rK   r   )r   r(  r¥   r   c                 C   sf   t j d¡j| |fd}t|dd}t||dd}| |¡ |j|ks%J ‚| |¡ t|j|jƒ d S )Nr   rw   )r1   rQ   rR   )	r=   rS   rk   r{   r	   r7   Ú_fit_svd_solverr   r#   )r™   r€   r1   Úexpected_solverr6   rt   Úpca_testr-   r-   r.   Útest_pca_svd_solver_autoö  s   ÿ

r,  c                 C   s‚   t j d¡}| dd¡}t  d¡}tdƒD ]}td| |d}| |¡d ||d d …f< qt|t  	|dd d …f d¡ 
dd¡ƒ d S )Nr   rK   )r  rJ   r  rJ   rR   )r=   rS   rk   Úrandr–   r  r	   r:   r   ÚtileÚreshape)r0   r˜   r@   re   ÚirA   r-   r-   r.   Útest_pca_deterministic_output  s   
*r1  c                 C   s   t | |ƒ t| ƒ d S )N)Ú"check_pca_float_dtype_preservationÚ$check_pca_int_dtype_upcast_to_double)r0   r[   r-   r-   r.   Útest_pca_dtype_preservation  s   
r4  c                 C   sÀ   t j |¡ dd¡}|jt jdd}| t j¡}td| |d |¡}td| |d |¡}|j	j
t jks5J ‚|j	j
t jks>J ‚| |¡j
t jksIJ ‚| |¡j
t jksTJ ‚t|j	|j	ddd d S )	Nr   râ   Fr§   r‡   rR   gü©ñÒMbP?r    )r=   rS   rk   r-  r¬   Úfloat64r­   r	   r7   r#   r²   r8   r   )r0   Úseedr@   Ú	X_float64Ú	X_float32Úpca_64Úpca_32r-   r-   r.   r2  #  s   ÿÿr2  c                 C   sÄ   t j d¡ ddd¡}|jt jdd}|jt jdd}td| dd |¡}td| dd |¡}|j	j
t jks8J ‚|j	j
t jksAJ ‚| |¡j
t jksLJ ‚| |¡j
t jksWJ ‚t|j	|j	dd	 d S )
Nr   r   )r   râ   Fr§   r‡   rR   g-Cëâ6?rr   )r=   rS   rk   Úrandintr¬   Úint64Úint32r	   r7   r#   r²   r5  r8   r   )r0   ÚX_i64ÚX_i32r9  r:  r-   r-   r.   r3  ;  s   r3  c                  C   sT   t dd\} }tƒ  | |¡}|j ¡ d }t|d | |¡}|j| jd ks(J ‚d S )NTr   éþÿÿÿry   r2   )r   r	   r7   r³   Úcumsumr(   r9   )r@   Úyr+   r1   r,   r-   r-   r.   Ú5test_pca_n_components_mostly_explained_variance_ratioL  s
   rC  c               	   C   sZ   t  g d¢¡} d}dD ]}tjtdd t| ||ƒ W d   ƒ n1 s%w   Y  qd S )N©r2   ç ÂëþKH´9rE  rE  rK   )r   rã   z"should be in \[1, n_features - 1\]ri   )r=   rä   rl   rm   rò   r
   )Úspectrumr™   rš   r-   r-   r.   Útest_assess_dimension_bad_rankX  s   ÿ€ÿrG  c                  C   s`   t  g d¢¡} t| dddt j ksJ ‚dD ]}t| |dƒt j ks$J ‚qt| dƒdks.J ‚d S )NrD  r2   rK   ©rš   r™   )rJ   r‡   )r=   rä   r
   Úinfr   )rF  rš   r-   r-   r.   Útest_small_eigenvalues_mlea  s
   rJ  c                  C   s<   t jddddddd\} }tdd | ¡}|jdksJ ‚d S )Nr  r2   é   é*   )r€   rÊ   Ú
n_repeatedÚn_redundantÚn_clusters_per_classrQ   rú   ry   )r   r   r	   r7   r(   ©r@   r#  rA   r-   r-   r.   Útest_mle_redundant_datan  s   
úrQ  c                  C   s^   t jdddd\} }tddd}tjtdd	 | | ¡ W d   ƒ d S 1 s(w   Y  d S )
Nr  é   rL  )r™   r€   rQ   rú   r   r3   z?n_components='mle' is only supported if n_samples >= n_featuresri   )r   r   r	   rl   rm   rò   r7   rP  r-   r-   r.   Útest_fit_mle_too_few_samples}  s   þ"ürS  c                  C   sr   d\} }t j d¡ | |¡}t j|d d …d d…f dd|d d …df< tddd}| |¡ |j|d ks7J ‚d S )	N)r   rK   r   rv   rˆ   rú   r   rñ   r2   )r=   rS   rk   r   r•   r	   r7   r(   )r™   Ún_dimr@   Úpca_sklr-   r-   r.   Útest_mle_simple_caseŠ  s   *
rV  c                  C   s   d\} }t  | |f¡}t jj|dd\}}}t|dd … t  |d ¡dd t  t|d| d¡s2J ‚td|ƒD ]}t||| ƒt j	 ksEJ ‚q7d S )	N)é	   r  T)Úfull_matricesr2   r   r4   rH  rJ   )
r=   r”   rÏ   Úsvdr   r–   r°   r
   r  rI  )r™   r€   r@   r#  Úsrš   r-   r-   r.   Útest_assess_dimesion_rank_one•  s    ÿr[  c                  C   s   t j d¡} d}|  d|¡}tdd|dd |¡}tddd |¡}tdd	dd
 |¡}tt  |j¡t  |j¡ƒ tt  |j¡t  |j¡ƒ dS )zßCheck 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   rN   r   r2   r   )r1   r0   Ún_oversamplesrQ   r   r3   r   rR   N)	r=   rS   rk   r   r	   r7   r   rå   r#   )r˜   r€   r@   Úpca_randomizedr½   rs   r-   r-   r.   Ú%test_pca_randomized_svd_n_oversamples¢  s   üûr^  c                  C   s6   t dd tj¡} |  ¡ }tdd„ tdƒD ƒ|ƒ dS )z Check feature names out for PCA.rJ   ry   c                 S   s   g | ]}d |› ‘qS )rA   r-   )r  r0  r-   r-   r.   r  Á  s    z*test_feature_names_out.<locals>.<listcomp>N)r	   r7   r5   r6   Úget_feature_names_outr   r  )rA   Únamesr-   r-   r.   Útest_feature_names_out¼  s   ra  c                 C   sV   t j d¡}| dd¡}tƒ  |¡}|j|j }t j|ddd 	¡ }t j
 ||¡ dS )z9Check the accuracy of PCA's internal variance calculationr   r   r  r2   r   N)r=   rS   rk   r   r	   r7   r$   r³   rÎ   r´   Útestingr   )r‚   r˜   r@   rA   Úpca_varÚtrue_varr-   r-   r.   Útest_variance_correctnessÄ  s   re  c                 C   s  t ||ƒ}tj |¡}|j||d}| |¡ | ¡ }| ¡ }	|jdkr&dnd}
t	ddR t
|ƒ |¡}| ¡ }|jdks@J ‚|j|jksHJ ‚tt||d||
t|ƒd	 | ¡ }|jdksaJ ‚|j|jksiJ ‚tt||d|	|
t|ƒd	 W d   ƒ d S 1 s‚w   Y  d S )
Nr   r­   g-Cëâ6*?gH¯¼šò×Š>T©Úarray_api_dispatch)râ   râ   ©Úxpr    )r   r5   r6   r¬   Úasarrayr7   r<   r;   r²   r   r   r9   r   r   r   )ÚnameÚ	estimatorÚarray_namespacer   Ú
dtype_nameri  Úiris_npÚiris_xpÚprecision_npÚcovariance_npr!   Úestimator_xpÚprecision_xpÚcovariance_xpr-   r-   r.   Úcheck_array_api_get_precisionÏ  s8   


ü
ü"ðrv  z#array_namespace, device, dtype_nameÚcheckrl  r3   r©   rI   ÚQR)r1   r0   Úpower_iteration_normalizerrQ   c                 C   s   | j j}||| |||d d S )N©r   rn  )Ú	__class__Ú__name__)rl  rw  rm  r   rn  rk  r-   r-   r.   Útest_pca_array_api_complianceñ  s   r}  rú   c                 C   sì  | j j}||| |||d t||ƒ}tdd\}}|j|dd}t|jƒ}	t| ƒ}
|j||d}|j||d}|
 	||¡ |
j
}|
j}t|
ƒ}tdd4 | 	||¡ |j
}t|ƒt|ƒks`J ‚t||d	}|j}t|ƒt|ƒkssJ ‚t||d	}W d   ƒ n1 sƒw   Y  |j|jksJ ‚|jd
 |jd
 ksœJ ‚|j|jks¤J ‚t|jd |jd ƒ}t|d |… |d |… |	d |jd |jd krò|d }||d … }||d … }tt || ¡|	k ƒsåJ ‚tt || ¡|	k ƒsôJ ‚d S d S )Nrz  rL  rg   Fr§   r   Trf  rh  r2   r   r4   rv   )r{  r|  r   r   r¬   r   r²   r   rj  r7   r#   r$   r   Úarray_devicer   r9   rª   r   r±   r=   rå   )rl  rw  rm  r   rn  rk  ri  r@   rB  r"   ÚestÚX_xpÚy_xpÚcomponents_npÚexplained_variance_npÚest_xpÚcomponents_xpÚcomponents_xp_npÚexplained_variance_xpÚexplained_variance_xp_npÚmin_componentsÚreference_varianceÚextra_variance_npÚextra_variance_xp_npr-   r-   r.   Ú!test_pca_mle_array_api_compliance  sN   

ø


ýûr  ÚSCIPY_ARRAY_APIÚ1zSCIPY_ARRAY_API not set to 1.)Úreasonc               	   C   sš  t  d¡} |  tj¡}tdddd}t d¡}t jt	|d" t
dd	 | |¡ W d   ƒ n1 s4w   Y  W d   ƒ n1 sCw   Y  |jd
dd t d¡}t jt	|d" t
dd	 | |¡ W d   ƒ n1 sqw   Y  W d   ƒ n1 s€w   Y  |jd
dd t d¡}t jt|d+ t
dd	 | |¡ W d   ƒ n1 s®w   Y  W d   ƒ d S W d   ƒ d S 1 sÆw   Y  d S )NÚarray_api_strictrJ   r   r   rR   zCPCA with svd_solver='arpack' is not supported for Array API inputs.ri   Trf  r   ÚLU)r0   ry  z[Array API does not support LU factorization. Set `power_iteration_normalizer='QR'` instead.r   z’Array API does not support LU factorization, falling back to QR instead. Set `power_iteration_normalizer='QR'` explicitly to silence this warning.)rl   Úimportorskiprj  r5   r6   r	   ÚreÚescaperm   rò   r   r7   Ú
set_paramsÚwarnsÚUserWarning)ri  rp  rA   Úexpected_msgr-   r-   r.   Ú7test_array_api_error_and_warnings_on_unsupported_paramsc  sB   
ÿÿ€ÿÿÿ€ÿÿÿÿ"ÿrš  )r   r   )pÚosr”  r|   Únumpyr=   rl   ÚscipyrU   Ú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   r5   ÚPCA_SOLVERSrW   rX   rª   ÚSPARSE_MAX_COMPONENTSr/   ÚmarkÚparametrizer  r6   r9   rF   rb   rf   rp   ru   r   rŸ   rÑ   ÚlistÚsetrÈ   rS   rk   r   rÔ   rÖ   rß   rê   rë   rï   rä   r&  r÷   rø   rû   rü   rÿ   r
  r  r  r-  r  r  r  r$  r%  r'  r,  r1  r4  r2  r3  rC  rG  rJ  rQ  rS  rV  r[  r^  ra  re  rv  r}  r  ÚskipifÚenvironÚgetrš  r-   r-   r-   r.   Ú<module>   sr   

8
!
5ÿ ýù	





.ÿþýþ




ýþ




þ


	

"ýý

üúñýý
úö:ÿ