o
    Ü?Hhñ¢  ã                   @   sº  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
mZ d dlmZ d dlmZmZmZ d dlmZ d dlmZmZ d dlmZmZmZ d d	lmZ d d
lmZ d dlm Z m!Z! d dl"m#Z# d dl$m%Z%m&Z& e ¡ Z'g d¢Z(d\Z)Z*e+e)e*ƒZ,d«dd„Z-ej. /de(¡ej. /de0de'j1j2d ƒ¡dd„ ƒƒZ3ej. /dg d¢¡ej. /dg d¢¡ej. /de&e% ¡ej. /dddg¡ej. /dg d ¢¡d!d"„ ƒƒƒƒƒZ4ej. /de&e% ¡d#d$„ ƒZ5ej. /dd%d&g¡ej. /de&e% ¡d'd(„ ƒƒZ6ej. /de&e% ¡d)d*„ ƒZ7d+d,„ Z8ej. /d-d.d/g¡ej. /d0e(¡d1d2„ ƒƒZ9ej. /d3e:e;e<e(ƒd&d4h ƒƒ¡ej. /d5d6d7g¡ej. /d8d/d.g¡ej. /d9d/d.g¡d:d;„ ƒƒƒƒZ=ej.j/d<ej> ?d ¡ @d=d>¡ejd=d>d?d d@d  ej> ?d ¡ @dAd=¡gg dB¢dCej. /de(¡dDdE„ ƒƒZAej. /ddd%g¡dFdG„ ƒZBej. /de(¡dHdI„ ƒZCej. /de(¡dJdK„ ƒZDej. /de(¡dLdM„ ƒZEej. /dg dN¢¡ej. /d9d/d.g¡dOdP„ ƒƒZFej. /dQe Gg dR¢g dS¢g¡e Gg dR¢g dS¢g¡jHg¡ej. /dTg dU¢¡dVdW„ ƒƒZIej. /dXd&e+e'j1j2ƒfde+e'j1j2ƒd fd%e+e'j1j2ƒfg¡ej. /dQe'j1e'j1jHg¡dYdZ„ ƒƒZJej. /dd4d&g¡d[d\„ ƒZKej. /ddd%g¡d]d^„ ƒZLd_d`„ ZMdadb„ ZNdcdd„ ZOdedf„ ZPej. /dge'j1dhdife'j1djdfej> ?d ¡ Qdkdl¡dmdifg¡dndo„ ƒZRej. /de(¡dpdq„ ƒZSdrds„ ZTej. /de(¡dtdu„ ƒZUej. /ddd%g¡dvdw„ ƒZVej. /dd&d%g¡dxdy„ ƒZWej. /dzg d{¢¡d|d}„ ƒZXej. /de(¡d~d„ ƒZYej. /de(¡d€d„ ƒZZd‚dƒ„ Z[d„d…„ Z\d†d‡„ Z]dˆd‰„ Z^dŠd‹„ Z_dŒd„ Z`dŽd„ Zadd‘„ Zbd’d“„ Zcd”d•„ Zdd–d—„ Zeej. /d-d.d/g¡d˜d™„ ƒZfdšd›„ Zgej. /dœeƒ ¡ej.j/de#eggedCej.j/dž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¥„ ƒƒƒZhej. /dœeƒ ¡ej.j/deggedCej.j/džed¦d&dŸgedCd§d¨„ ƒƒƒZid©dª„ ZjdS )¬é    N)Úassert_array_equal)Úconfig_contextÚdatasets)Úclone)Ú	load_irisÚmake_classificationÚmake_low_rank_matrix)ÚPCA)Ú_assess_dimensionÚ_infer_dimension)Ú_atol_for_typeÚ_convert_to_numpyÚ)yield_namespace_device_dtype_combinations©Údevice)Ú_get_check_estimator_ids)Ú_array_api_for_testsÚassert_allclose)Ú check_array_api_input_and_values)ÚCSC_CONTAINERSÚCSR_CONTAINERS)ÚfullÚcovariance_eighÚarpackÚ
randomizedÚauto)éè  i,  ç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,   úd/home/air/sanwanet/gpt-api/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©r0   r/   r1   r   ©r!   )ÚirisÚdatar	   ÚfitÚ	transformÚshapeÚfit_transformr   Úget_covarianceÚget_precisionÚnpÚdotÚeye)r/   r0   ÚXÚpcaÚX_rÚX_r2ÚcovÚ	precisionr,   r,   r-   Útest_pca3   s   



&rE   Údensity)ç{®Gáz„?çš™™™™™¹?g333333Ó?)r1   é   é
   Úsparse_containerr   r   Úscale)r1   rJ   é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_staterF   r1   ©r0   r/   rP   r3   N)r<   ÚrandomÚdefault_rngÚspÚsparseÚSPARSE_MÚSPARSE_Nr8   Úmultiplyr	   r6   Útoarrayr.   r   r7   )Úglobal_random_seedr/   rK   r0   rF   rL   r!   Útransform_atolrP   r?   Úscale_vectorr@   ÚXdÚpcadÚX2ÚX2dr,   r,   r-   Útest_pca_sparseI   sL   üÿ	
ý
ý
üÿra   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 )NrG   rO   rJ   r   rQ   )r<   rR   rS   rT   rU   rV   rW   r	   r6   r9   r.   r   r7   )rZ   rK   rP   r?   r_   Úpca_fitÚpca_fit_transformÚtransformed_Xr,   r,   r-   Útest_pca_sparse_fit_transform†   s6   üÿüÿ	ÿ


re   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©rP   é   r2   zWPCA only support sparse inputs with the "arpack" and "covariance_eigh" solvers, while "z" was passed©Úmatch)r<   rR   ÚRandomStaterT   rU   rV   rW   r	   ÚpytestÚraisesÚ	TypeErrorr6   )rZ   r/   rK   rP   r?   r@   Úerror_msg_patternr,   r,   r-   Útest_sparse_pca_solver_error¨   s    ýÿÿÿ"ÿro   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.rf   rJ   r   r2   r   ç{®Gázt?©r    N)r<   rR   rj   rT   rU   rV   rW   r	   r6   r   r$   )rZ   rK   rP   r?   Ú
pca_arpackÚpca_autor,   r,   r-   Ú7test_sparse_pca_auto_arpack_singluar_values_consistency¼   s   ýÿrt   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 )NrJ   rI   éÿÿÿÿr1   ©Úsize©r0   Úerror)	r<   rR   Úuniformr	   ÚwarningsÚcatch_warningsÚsimplefilterÚRuntimeWarningr6   )r0   Ú
n_featuresr?   r@   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   rM   éP   rg   é2   g      $@ç      ð?é   ©ÚaxisgfffffæE@Té   )r0   Úwhitenr   r/   rP   Úiterated_powergü©ñÒMb@?rq   r1   ©Úddofrˆ   r   r3   F)r0   rŠ   r   r/   gfffff†R@rH   )Úrel)r<   rR   rj   r=   ÚrandnÚdiagÚlinspacer8   Ústdr   r	   r9   r7   r   ÚonesÚmeanÚzerosr6   rk   Úapprox)r‚   r   ÚrngÚ	n_samplesr   r0   Úrankr?   ÚX_r@   Ú
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¡   )rM   rg   )rg   rM   rJ   rI   rv   ç      à?)r˜   r   Útail_strengthrP   F©r   g¸…ëQ¸ž?çñhãˆµøä>)r!   r    rN   r   r   r‹   r„   r   r1   r   ©r0   r/   rŠ   )r0   r/   rŠ   rP   r   r,   )r<   rR   rS   ÚminÚstandard_normalr   ÚastypeÚfloat32ÚdictÚminimumr	   r9   ÚisfiniteÚallÚdtyper#   r   Úexplained_variance_ratio_r"   Úsumr7   Úinverse_transformr8   )rŸ   r    r£   rŠ   rZ   Úglobal_dtyper˜   r   Ún_samples_testr—   r™   r?   ÚX_trainÚX_testÚtolsÚvariance_thresholdÚextra_other_kwargsr0   Úpca_fullÚ	pca_otherÚX_trans_full_trainÚX_trans_other_trainÚreference_componentsÚother_componentsÚstableÚX_trans_full_testÚX_trans_other_testÚX_recons_full_testÚX_recons_other_testr,   r,   r-   Útest_pca_solver_equivalence  sº   

ÿþü


üû

þý
ÿÿ

*

þ
ýrÇ   r?   rM   rƒ   éN   )Ún_informativerP   rJ   )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 )NrI   r   rQ   r1   rŒ   F)ÚrowvarT)Úreverserp   rq   )
r	   r9   r   r#   r<   ÚvarÚlinalgÚeigrC   Úsorted)r?   r/   r@   Ú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   ©rM   rƒ   rI   r   rQ   rp   rq   )r<   rR   rj   r   r	   r6   r   r$   )r/   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Ô   rI   rQ   Úfror‡   )rM   én   r†   ç‰A`åÐ"	@r1   çX9´Èv¾@)rØ   rÙ   r…   )r<   rR   rj   r   r	   r9   r   r³   r$   rÎ   ÚnormÚsqrtr=   r"   r6   )r/   r—   r˜   r   r?   r@   Ú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   ©rM   r†   rH   rJ   ©r†   é   é   r1   rI   r2   r…   rp   rq   )r<   rR   rj   r   Úarrayr	   r6   r7   rÛ   r³   r   Úabs)r/   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        r1   r   rQ   )rI   r1   r   r3   g¸…ëQ¸æ?rp   rq   )r	   r9   r8   r   r”   r’   )r/   r?   r@   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†   r1   r§   )râ   rá   r†   rI   r¨   çñhãˆµøÔ>rq   )	r<   rR   rj   r   r	   r6   r7   r´   r   )	r/   rŠ   r—   rå   ræ   r?   r@   ÚYÚ	Y_inverser,   r,   r-   Útest_pca_inverse÷  s   

rî   r5   )r   r1   r   )r1   r   r   z!svd_solver, n_components, err_msg))r   r   ú2must be between 1 and min\(n_samples, n_features\))r   r   rï   )r   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                 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 )NrI   ©r/   rh   r   zgn_components={}L? must be strictly less than min\(n_samples, n_features\)={}L? with svd_solver='arpack')r	   rk   rl   Ú
ValueErrorr6   Úformat)r/   r5   r0   Ú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	   r6   r'   )r5   r‚   r'   r@   r,   r,   r-   Útest_n_components_none2  s   


r÷   c                 C   sH   t j d¡}d\}}| ||¡}td| d}| |¡ |jdks"J ‚d S )Nr   ©iX  rJ   Úmler2   r1   )r<   rR   rj   r   r	   r6   r'   )r/   r—   r˜   r   r?   r@   r,   r,   r-   Útest_n_components_mleA  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ù   r2   z:n_components='mle' cannot be a string with svd_solver='{}'rh   )
r<   rR   rj   r   r	   rò   rk   rl   rñ   r6   )r/   r—   r˜   r   r?   r@   ró   r,   r,   r-   Útest_n_components_mle_errorL  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   ©rM   râ   rH   rJ   ©r†   rá   râ   r1   rI   rù   r   r2   r1   )	r<   rR   rj   r   rã   r	   r6   r0   r'   )r—   rå   ræ   r?   r@   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   rH   r1   rý   )r1   r   r‰   rá   é   r   r2   c                    s   g | ]}t ˆ|ˆ ƒ‘qS r,   )r
   )Ú.0Úk©rå   Úspectr,   r-   Ú
<listcomp>s  s    z$test_infer_dim_1.<locals>.<listcomp>rG   )
r<   rR   rj   r   rã   r	   r6   r#   ÚrangeÚmax)ræ   r—   r?   r@   Úllr,   r  r-   Útest_infer_dim_1f  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   rH   rJ   rý   é   ©r   r   r‰   rI   ru   r   r2   r1   ©	r<   rR   rj   r   rã   r	   r6   r#   r   ©rå   ræ   r—   r?   r@   r  r,   r,   r-   Útest_infer_dim_2w  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   rH   rJ   rý   r
  r  rg   é(   rI   )ru   r1   ru   r1   ru   r   r2   r  r  r,   r,   r-   Útest_infer_dim_3…  s   "
r  z'X, n_components, n_components_validatedgffffffî?rI   rG   râ   r
  r¤   c                 C   s<   t |dd}| | ¡ |jt |¡ksJ ‚|j|ksJ ‚d S )Nr   r2   )r	   r6   r0   rk   r–   r'   )r?   r0   Ún_components_validatedr@   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   rH   rà   rI   r2   g      à¿r1   g|®Gáz„?gš™™™™™©?rq   gš™™™™™É?T)r0   rŠ   r/   )r<   rR   rj   r   rã   r	   r6   ÚscoreÚlogÚpiÚexpr   )	r/   rå   ræ   r—   r?   r@   Ú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   r1   rà   )r1   r   r‰   r   r2   )r<   rR   rj   r   rã   r•   r  r	   r6   r  Úargmax)rå   ræ   r—   ÚXlrç   r  r  r@   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_yrg   r   rQ   )r   Úload_digitsr	   r6   r<   r°   r#   r&   )r/   r?   Ú_r@   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  rg   r   r   rQ   rë   rq   )r   r!  r	   r6   r   r  )r/   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   rH   rà   r2   )
r<   rR   rj   r   rã   r	   r6   r&   r  ÚT)r/   rå   ræ   r—   r?   r@   r,   r,   r-   Ú'test_pca_zero_noise_variance_edge_casesÞ  s   

r&  z4n_samples, n_features, n_components, expected_solver))rJ   r„   râ   r   )r   r„   r„   r   )r   éô  i  r   )r   r'  rJ   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   rv   )r0   rP   rQ   )	r<   rR   rj   rz   r	   r6   Ú_fit_svd_solverr   r"   )r˜   r   r0   Úexpected_solverr5   rs   Ú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   rJ   )r
  rI   r
  rI   rQ   )r<   rR   rj   Úrandr•   r  r	   r9   r   ÚtileÚreshape)r/   r—   r?   rd   Úir@   r,   r,   r-   Útest_pca_deterministic_output  s   
*r0  c                 C   s   t | |ƒ t| ƒ d S )N)Ú"check_pca_float_dtype_preservationÚ$check_pca_int_dtype_upcast_to_double)r/   rZ   r,   r,   r-   Útest_pca_dtype_preservation  s   
r3  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†   rQ   gü©ñÒMbP?r   )r<   rR   rj   r,  r«   Úfloat64r¬   r	   r6   r"   r±   r7   r   )r/   Úseedr?   Ú	X_float64Ú	X_float32Úpca_64Úpca_32r,   r,   r-   r1  !  s   ÿÿr1  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†   rQ   g-Cëâ6?rq   )r<   rR   rj   Úrandintr«   Úint64Úint32r	   r6   r"   r±   r4  r7   r   )r/   ÚX_i64ÚX_i32r8  r9  r,   r,   r-   r2  9  s   r2  c                  C   sT   t dd\} }tƒ  | |¡}|j ¡ d }t|d | |¡}|j| jd ks(J ‚d S )NTr  éþÿÿÿrx   r1   )r   r	   r6   r²   Úcumsumr'   r8   )r?   Úyr*   r0   r+   r,   r,   r-   Ú5test_pca_n_components_mostly_explained_variance_ratioJ  s
   rB  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©r1   ç ÂëþKH´9rD  rD  rJ   )r   râ   z"should be in \[1, n_features - 1\]rh   )r<   rã   rk   rl   rñ   r
   )Úspectrumr˜   r™   r,   r,   r-   Útest_assess_dimension_bad_rankV  s   ÿ€ÿrF  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 )NrC  r1   rJ   ©r™   r˜   )rI   r†   )r<   rã   r
   Úinfr   )rE  r™   r,   r,   r-   Útest_small_eigenvalues_mle_  s
   rI  c                  C   s<   t jddddddd\} }tdd | ¡}|jdksJ ‚d S )Nr
  r1   é   é*   )r   rÉ   Ú
n_repeatedÚn_redundantÚn_clusters_per_classrP   rù   rx   )r   r   r	   r6   r'   ©r?   r"  r@   r,   r,   r-   Útest_mle_redundant_datal  s   
úrP  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
  é   rK  )r˜   r   rP   rù   r   r2   z?n_components='mle' is only supported if n_samples >= n_featuresrh   )r   r   r	   rk   rl   rñ   r6   rO  r,   r,   r-   Útest_fit_mle_too_few_samples{  s   þ"ürR  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   rJ   r   ru   r‡   rù   r   rð   r1   )r<   rR   rj   r   r”   r	   r6   r'   )r˜   Ún_dimr?   Úpca_sklr,   r,   r-   Útest_mle_simple_caseˆ  s   *
rU  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_matricesr1   r   r3   rG  rI   )
r<   r“   rÎ   Úsvdr   r•   r¯   r
   r  rH  )r˜   r   r?   r"  Úsr™   r,   r,   r-   Útest_assess_dimesion_rank_one“  s    ÿrZ  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   rM   r   r1   r   )r0   r/   Ún_oversamplesrP   r   r2   r   rQ   N)	r<   rR   rj   r   r	   r6   r   rä   r"   )r—   r   r?   Úpca_randomizedr¼   rr   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.rI   rx   c                 S   s   g | ]}d |› ‘qS )r@   r,   )r  r/  r,   r,   r-   r  ¿  s    z*test_feature_names_out.<locals>.<listcomp>N)r	   r6   r4   r5   Úget_feature_names_outr   r  )r@   Únamesr,   r,   r-   Útest_feature_names_outº  s   r`  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  r1   rŒ   N)r<   rR   rj   r   r	   r6   r#   r²   rÍ   r³   Útestingr   )r   r—   r?   r@   Úpca_varÚtrue_varr,   r,   r-   Útest_variance_correctnessÂ  s   rd  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   r4   r5   r«   Úasarrayr6   r;   r:   r±   r   r   r8   r   r   r   )ÚnameÚ	estimatorÚarray_namespacer   Ú
dtype_namerh  Úiris_npÚiris_xpÚprecision_npÚcovariance_npr    Úestimator_xpÚprecision_xpÚcovariance_xpr,   r,   r-   Úcheck_array_api_get_precisionÍ  s8   


ü
ü"ðru  z#array_namespace, device, dtype_nameÚcheckrk  r2   r¨   rH   ÚQR)r0   r/   Úpower_iteration_normalizerrP   c                 C   s   | j j}||| |||d d S )N©r   rm  )Ú	__class__Ú__name__)rk  rv  rl  r   rm  rj  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 )Nry  rK  rf   Fr¦   r   Tre  rg  r1   r   r3   ru   )rz  r{  r   r   r«   r   r±   r   ri  r6   r"   r#   r   Úarray_devicer   r8   r©   r   r°   r<   rä   )rk  rv  rl  r   rm  rj  rh  r?   rA  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Œ  c               	   C   s¤  t  d¡ t  d¡} |  tj¡}tdddd}t d¡}t jt	|d" t
d	d
 | |¡ W d   ƒ n1 s9w   Y  W d   ƒ n1 sHw   Y  |jddd t d¡}t jt	|d" t
d	d
 | |¡ W d   ƒ n1 svw   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_compatÚarray_api_strictrI   r   r   rQ   zCPCA with svd_solver='arpack' is not supported for Array API inputs.rh   Tre  r   ÚLU)r/   rx  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.)rk   Úimportorskipri  r4   r5   r	   ÚreÚescaperl   rñ   r   r6   Ú
set_paramsÚwarnsÚUserWarning)rh  ro  r@   Úexpected_msgr,   r,   r-   Ú7test_array_api_error_and_warnings_on_unsupported_params]  sD   

ÿÿ€ÿÿÿ€ÿÿÿÿ"ÿr—  )r   r   )kr‘  r{   Únumpyr<   rk   ÚscipyrT   Únumpy.testingr   Úsklearnr   r   Úsklearn.baser   Úsklearn.datasetsr   r   r   Úsklearn.decompositionr	   Úsklearn.decomposition._pcar
   r   Úsklearn.utils._array_apir   r   r   r   r}  Ú-sklearn.utils._test_common.instance_generatorr   Úsklearn.utils._testingr   r   Úsklearn.utils.estimator_checksr   Úsklearn.utils.fixesr   r   r4   ÚPCA_SOLVERSrV   rW   r©   ÚSPARSE_MAX_COMPONENTSr.   ÚmarkÚparametrizer  r5   r8   rE   ra   re   ro   rt   r€   rž   rÐ   ÚlistÚsetrÇ   rR   rj   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+  r0  r3  r1  r2  rB  rF  rI  rP  rR  rU  rZ  r]  r`  rd  ru  r|  rŒ  r—  r,   r,   r,   r-   Ú<module>   sb   

8
!
5ÿ ýù	

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

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