a
    �ù»jk§  ã                   @   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�„ Zad�d‘„ Zbd’d“„ Zcd”d•„ Zdd–d—„ Zeej. /d-d.d/g¡d˜d™„ ƒZfdšd›„ Zgej. /dœeƒ ¡ej.j/d�e#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/d�egg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stJ ‚| j|jks„J ‚| j|jks”J ‚d S )N©ÚrtolÚatol)	r   Úcomponents_Úexplained_variance_Úsingular_values_Zmean_Únoise_variance_Ún_components_Z
n_samples_Zn_features_in_)Úpca1Úpca2r    r!   © r)   úJE:\soccer\ml_env\Lib\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s4J ‚| |¡}t||ƒ | |¡}t||ƒ | ¡ }| 	¡ }tt
 ||¡t
 |jd ¡dd� d S )N©r-   r,   r.   r   ©r!   )ÚirisÚdatar	   ÚfitÚ	transformÚshapeÚfit_transformr   Úget_covarianceÚget_precisionÚnpÚdotÚeye)r,   r-   ÚXÚpcaZX_rZX_r2ÚcovÚ	precisionr)   r)   r*   Útest_pca3   s    



r@   Údensity)ç{®Gáz„?çš™™™™™¹?g333333Ó?)r.   é   é
   Úsparse_containerr   r   Úscale)r.   rE   é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_staterA   r.   ©r-   r,   rK   r0   N)r9   ÚrandomÚdefault_rngÚspÚsparseÚSPARSE_MÚSPARSE_Nr5   Úmultiplyr	   r3   Ztoarrayr+   r   r4   )Úglobal_random_seedr,   rF   r-   rA   rG   r!   Ztransform_atolrK   r<   Zscale_vectorr=   ZXdZpcadÚX2ZX2dr)   r)   r*   Útest_pca_sparseI   sL    üÿ	
ý
ý
üÿrV   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 )NrB   rJ   rE   r   rL   )r9   rM   rN   rO   rP   rQ   rR   r	   r3   r6   r+   r   r4   )rT   rF   rK   r<   rU   Zpca_fitZpca_fit_transformÚtransformed_Xr)   r)   r*   Útest_pca_sparse_fit_transform†   s6    üÿüÿ	ÿ


rX   r   r   c                 C   sv   t j | ¡}|tjjtt|d�ƒ}td|d�}d|› d�}tj	t
|d�� | |¡ W d   ƒ n1 sh0    Y  d S )N©rK   é   r/   zWPCA only support sparse inputs with the "arpack" and "covariance_eigh" solvers, while "z" was passed©Úmatch)r9   rM   ÚRandomStaterO   rP   rQ   rR   r	   ÚpytestÚraisesÚ	TypeErrorr3   )rT   r,   rF   rK   r<   r=   Zerror_msg_patternr)   r)   r*   Útest_sparse_pca_solver_error¨   s    ýÿÿÿra   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.rY   rE   r   r/   r   ç{®Gázt?©r    N)r9   rM   r]   rO   rP   rQ   rR   r	   r3   r   r$   )rT   rF   rK   r<   Ú
pca_arpackÚpca_autor)   r)   r*   Ú7test_sparse_pca_auto_arpack_singluar_values_consistency¼   s    ýÿrf   c                  C   sn   d} | d }t jjdd| |fd�}t| d�}t ¡ �& t dt¡ | |¡ W d   ƒ n1 s`0    Y  d S )NrE   rD   éÿÿÿÿr.   ©Úsize©r-   Úerror)	r9   rM   Úuniformr	   ÚwarningsÚcatch_warningsÚsimplefilterÚRuntimeWarningr3   )r-   Ú
n_featuresr<   r=   r)   r)   r*   Útest_no_empty_slice_warningÎ   s    

rr   Ú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s–J ‚| 	¡ }t
|d|| ddd�}	|	 | 	¡ ¡}
|
j||fksÒJ ‚|	 |¡}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   rH   éP   rZ   é2   g      $@ç      ð?é   ©ÚaxisgfffffæE@Té   )r-   Úwhitenrs   r,   rK   Úiterated_powergü©ñÒMb@?rc   r.   ©Zddofrz   r   r0   F)r-   r|   rs   r,   gfffff†R@rC   )Úrel)r9   rM   r]   r:   ÚrandnZdiagZlinspacer5   Ústdrs   r	   r6   r4   r   ÚonesÚmeanÚzerosr3   r^   Úapprox)rt   rs   ÚrngÚ	n_samplesrq   r-   Úrankr<   ZX_r=   Z
X_whitenedZX_whitened2ZX_unwhitenedr)   r)   r*   Útest_whiteningÙ   sH    
"þú	
ÿþ
r‰   Úother_svd_solverr   Ú
data_shapeÚtallZwideÚrank_deficientr|   c                 C   sú  |dkrd\}}nd\}}d}|rbt j |¡}	t||ƒd }
|	j|| |
fd�|	j|
|fd� }nt|| |d|d�}t||ƒ}
|j|d	d
�}|d |… ||d …  }}|t jkrÄtddd�}d}ntddd�}d}i }| dkrîd}ddi}n | dk�r
t  	||¡d }nd }t
|d|d�}t
f || ||dœ|¤Ž}| |¡}t  |¡ ¡ �sRJ ‚|j|k�sbJ ‚| |¡}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  |¡ ¡ �s‚J ‚|j|k�s’J ‚| |¡}t  |¡ ¡ �s°J ‚|j|k�sÀJ ‚t|d d …|f |d d …|f fi |¤Ž | |¡}t  |¡ ¡ �sJ ‚|j|k�sJ ‚| |¡}t  |¡ ¡ �s6J ‚|j|k�sFJ ‚|jjd |jjd k�r†t||fi |¤Ž t||fi |¤Ž np|jjd |
k �rÀ|j ¡ |k�s¬J ‚t||fi |¤Ž n6t| |¡d d …|f | |¡d d …|f fi |¤Ž d S )NrŒ   )rH   rZ   )rZ   rH   rE   rD   rh   ç      à?)r‡   rq   Ztail_strengthrK   F©rs   g¸…ëQ¸ž?çñhãˆµøä>)r!   r    rI   r   r   r}   rv   r   r.   r   ©r-   r,   r|   )r-   r,   r|   rK   r   )r9   rM   rN   ÚminZstandard_normalr   ÚastypeÚfloat32ÚdictÚminimumr	   r6   ÚisfiniteÚallÚdtyper#   r   Úexplained_variance_ratio_r"   Úsumr4   Úinverse_transformr5   )rŠ   r‹   r�   r|   rT   Zglobal_dtyper‡   rq   Zn_samples_testr†   rˆ   r<   ZX_trainZX_testZtolsZvariance_thresholdZextra_other_kwargsr-   Úpca_fullÚ	pca_otherZX_trans_full_trainZX_trans_other_trainZreference_componentsZother_componentsZstableZX_trans_full_testZX_trans_other_testZX_recons_full_testZX_recons_other_testr)   r)   r*   Útest_pca_solver_equivalence  sº    

ÿþü



üû

þý
ÿÿ

*

þýrŸ   r<   rH   ru   éN   )Ún_informativerK   rE   )zrandom-tallzcorrelated-tallzrandom-wide)Z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 )NrD   r   rL   r.   r~   F)ZrowvarT)Úreverserb   rc   )
r	   r6   r   r#   r9   ÚvarÚlinalgZeigr>   Úsorted)r<   r,   r=   ZX_pcaZ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   ©rH   ru   rD   r   rL   rb   rc   )r9   rM   r]   r€   r	   r3   r   r$   )r,   r†   r‡   rq   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§   rD   rL   Zfrory   )rH   én   rx   ç‰A`åÐ"	@r.   çX9´Èv¾@)rª   r«   rw   )r9   rM   r]   r€   r	   r6   r   r›   r$   r¤   ZnormÚsqrtr:   r"   r3   )r,   r†   r‡   rq   r<   r=   ÚX_transZ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   ©rH   rx   rC   rE   ©rx   é   é   r.   rD   r/   rw   rb   rc   )r9   rM   r]   r€   Úarrayr	   r3   r4   r¬   r›   r   Úabs)r,   r†   ÚnÚpr<   ÚXtZYtr)   r)   r*   Útest_pca_check_projectionÝ  s    r¸   c                 C   s^   ddgddgg}t d| dd�}| |¡}|js6J dƒ‚t| ¡ ddd� t| ¡ d	d
d� d S )Nrw   g        r.   r   rL   )rD   r.   r   r0   g¸…ëQ¸æ?rb   rc   )r	   r6   r5   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   )rv   rx   r.   r�   )r²   r±   rx   rD   r‘   çñhãˆµøÔ>rc   )	r9   rM   r]   r€   r	   r3   r4   rœ   r   )	r,   r|   r†   rµ   r¶   r<   r=   ÚYZ	Y_inverser)   r)   r*   Útest_pca_inverse÷  s    

r¼   r2   )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   rD   zmust be strictly less than min)r   rx   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>0    Y  | dkr |}d ||¡}tjt|d��" t || d� |¡ W d   ƒ n1 s–0    Y  d S )NrD   ©r,   r[   r   zgn_components={}L? must be strictly less than min\(n_samples, n_features\)={}L? with svd_solver='arpack')r	   r^   r_   Ú
ValueErrorr3   Úformat)r,   r2   r-   Úerr_msgZ
smallest_dZ
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	   r3   r&   )r2   rt   r&   r=   r)   r)   r*   Útest_n_components_none2  s    


rÃ   c                 C   sH   t j d¡}d\}}| ||¡}td| d�}| |¡ |jdksDJ ‚d S )Nr   ©iX  rE   Úmler/   r.   )r9   rM   r]   r€   r	   r3   r&   )r,   r†   r‡   rq   r<   r=   r)   r)   r*   Útest_n_components_mleA  s    
rÆ   c                 C   sr   t j d¡}d\}}| ||¡}td| d�}d | ¡}tjt|d�� | 	|¡ W d   ƒ n1 sd0    Y  d S )Nr   rÄ   rÅ   r/   z:n_components='mle' cannot be a string with svd_solver='{}'r[   )
r9   rM   r]   r€   r	   rÀ   r^   r_   r¿   r3   )r,   r†   r‡   rq   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sbJ ‚|jd	kspJ ‚d S )
Nr   ©rH   r²   rC   rE   ©rx   r±   r²   r.   rD   rÅ   r   r/   r.   )	r9   rM   r]   r€   r³   r	   r3   r-   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s¤J ‚d S )N©r   r²   r   rC   r.   rÉ   )r.   r   r{   r±   é   r   r/   c                    s   g | ]}t ˆ|ˆ ƒ‘qS r)   )r
   )Ú.0Úk©rµ   Úspectr)   r*   Ú
<listcomp>s  ó    z$test_infer_dim_1.<locals>.<listcomp>rB   )
r9   rM   r]   r€   r³   r	   r3   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sŽJ ‚d S )NrË   r   rC   rE   rÉ   é   ©rÌ   r   r{   rD   rg   r   r/   r.   ©	r9   rM   r]   r€   r³   r	   r3   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s°J ‚d S )NrÈ   r   rC   rE   rÉ   r×   rØ   rZ   é(   rD   )rg   r.   rg   r.   rg   r   r/   rÙ   rÚ   r)   r)   r*   Útest_infer_dim_3…  s    "
rÝ   z'X, n_components, n_components_validatedgffffffî?rD   rB   r²   r×   rŽ   c                 C   s<   t |dd�}| | ¡ |jt |¡ks*J ‚|j|ks8J ‚d S )Nr   r/   )r	   r3   r-   r^   r…   r&   )r<   r-   Z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sèJ ‚d S )N)r   rx   r   rC   r°   rD   r/   g      à¿r.   g|®Gáz„?gš™™™™™©?rc   gš™™™™™É?T)r-   r|   r,   )r9   rM   r]   r€   r³   r	   r3   ÚscoreÚlogÚpiÚexpr   )	r,   rµ   r¶   r†   r<   r=   Zll1ÚhZ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�}| |¡ | 	|¡||< qŽ| 
¡ dksÈJ ‚d S )N)éÈ   rx   r   r.   r°   )r.   r   r{   r   r/   )r9   rM   r]   r€   r³   r„   rÓ   r	   r3   rß   Zargmax)rµ   r¶   r†   Z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¡sBJ ‚d S )NT©Z
return_X_yrZ   r   rL   )r   Úload_digitsr	   r3   r9   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ç   rZ   r   r   rL   rº   rc   )r   rè   r	   r3   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sVJ ‚| |¡ | |j	¡ |jdkszJ ‚| |j	¡ d S )Nr¯   r   rC   r°   r/   )
r9   rM   r]   r€   r³   r	   r3   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))rE   rv   r²   r   )r   rv   rv   r   )r   éô  i�  r   )r   rî   rE   r   )r   rî   rŽ   r   c                 C   sf   t j d¡j| |fd�}t|dd�}t||dd�}| |¡ |j|ksJJ ‚| |¡ t|j|jƒ d S )Nr   rh   )r-   rK   rL   )	r9   rM   r]   rl   r	   r3   Z_fit_svd_solverr   r"   )r‡   rq   r-   Zexpected_solverr2   re   Z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   rE   )r×   rD   r×   rD   rL   )r9   rM   r]   Úrandr„   rÓ   r	   r6   r   ZtileZreshape)r,   r†   r<   rW   Úir=   r)   r)   r*   Útest_pca_deterministic_output  s    
rò   c                 C   s   t | |ƒ t| ƒ d S )N)Ú"check_pca_float_dtype_preservationÚ$check_pca_int_dtype_upcast_to_double)r,   rT   r)   r)   r*   Útest_pca_dtype_preservation  s    
rõ   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sjJ ‚|j	j
t jks|J ‚| |¡j
t jks’J ‚| |¡j
t jks¨J ‚t|j	|j	ddd� d S )	Nr   r±   Fr�   rx   rL   gü©ñÒMbP?r   )r9   rM   r]   rð   r“   Úfloat64r”   r	   r3   r"   r™   r4   r   )r,   Úseedr<   Z	X_float64Z	X_float32Úpca_64Úpca_32r)   r)   r*   ró   !  s    ÿÿró   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spJ ‚|j	j
t jks‚J ‚| |¡j
t jks˜J ‚| |¡j
t jks®J ‚t|j	|j	dd	� d S )
Nr   r   )r   r±   Fr�   rx   rL   g-Cëâ6?rc   )r9   rM   r]   Úrandintr“   Zint64Zint32r	   r3   r"   r™   rö   r4   r   )r,   ZX_i64ZX_i32rø   rù   r)   r)   r*   rô   9  s    rô   c                  C   sT   t dd�\} }tƒ  | |¡}|j ¡ d }t|d� | |¡}|j| jd ksPJ ‚d S )NTrç   éþÿÿÿrj   r.   )r   r	   r3   rš   Zcumsumr&   r5   )r<   Úyr'   r-   r(   r)   r)   r*   Ú5test_pca_n_components_mostly_explained_variance_ratioJ  s
    rý   c               	   C   sZ   t  g d¢¡} d}dD ]>}tjtdd�� t| ||ƒ W d   ƒ q1 sJ0    Y  qd S )N©r.   ç ÂëþKH´9rÿ   rÿ   rE   )r   r²   z"should be in \[1, n_features - 1\]r[   )r9   r³   r^   r_   r¿   r
   )Úspectrumr‡   rˆ   r)   r)   r*   Útest_assess_dimension_bad_rankV  s
    r  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 )Nrþ   r.   rE   ©rˆ   r‡   )rD   rx   )r9   r³   r
   Úinfr   )r   rˆ   r)   r)   r*   Útest_small_eigenvalues_mle_  s
    r  c                  C   s<   t jddddddd�\} }tdd� | ¡}|jdks8J ‚d S )Nr×   r.   é   é*   )rq   r¡   Z
n_repeatedZn_redundantZn_clusters_per_classrK   rÅ   rj   )r   r   r	   r3   r&   ©r<   ré   r=   r)   r)   r*   Útest_mle_redundant_datal  s    ú
r  c                  C   s\   t jdddd�\} }tddd�}tjtdd	�� | | ¡ W d   ƒ n1 sN0    Y  d S )
Nr×   é   r  )r‡   rq   rK   rÅ   r   r/   z?n_components='mle' is only supported if n_samples >= n_featuresr[   )r   r   r	   r^   r_   r¿   r3   r  r)   r)   r*   Útest_fit_mle_too_few_samples{  s    þr
  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snJ ‚d S )	N)r   rE   r   rg   ry   rÅ   r   r¾   r.   )r9   rM   r]   r€   rƒ   r	   r3   r&   )r‡   Zn_dimr<   Zpca_sklr)   r)   r*   Útest_mle_simple_caseˆ  s    *
r  c                  C   s�   d\} }t  | |f¡}t jj|dd�\}}}t|dd … t  |d ¡dd� t  t|d| d�¡sdJ ‚td|ƒD ]}t||| ƒt j	 ksnJ ‚qnd S )	N)é	   rÌ   T)Zfull_matricesr.   r   r0   r  rD   )
r9   r‚   r¤   Zsvdr   r„   r—   r
   rÓ   r  )r‡   rq   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   rH   r   r.   r   )r-   r,   Zn_oversamplesrK   r   r/   r   rL   N)	r9   rM   r]   r€   r	   r3   r   r´   r"   )r†   rq   r<   Zpca_randomizedr�   rd   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.rD   rj   c                 S   s   g | ]}d |› �‘qS )r=   r)   )rÍ   rñ   r)   r)   r*   rÑ   ¿  rÒ   z*test_feature_names_out.<locals>.<listcomp>N)r	   r3   r1   r2   Z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å   r.   r~   N)r9   rM   r]   r€   r	   r3   r#   rš   r£   r›   Ztestingr   )rs   r†   r<   r=   Zpca_varZtrue_varr)   r)   r*   Útest_variance_correctnessÂ  s    r  c                 C   s  t ||ƒ}tj |¡}|j||d�}| |¡ | ¡ }| ¡ }	|jdkrLdnd}
t	dd��¢ t
|ƒ |¡}| ¡ }|jdks€J ‚|j|jks�J ‚tt||d�||
t|ƒd	� | ¡ }|jdksÂJ ‚|j|jksÒJ ‚tt||d�|	|
t|ƒd	� W d   ƒ n1 �s0    Y  d S )
Nr   r”   g-Cëâ6*?gH¯¼šò×Š>T©Zarray_api_dispatch)r±   r±   ©Úxpr   )r   r1   r2   r“   Úasarrayr3   r8   r7   r™   r   r   r5   r   r   r   )ÚnameÚ	estimatorÚarray_namespacer   Ú
dtype_namer  Ziris_npÚiris_xpZprecision_npZcovariance_npr    Zestimator_xpZprecision_xpZcovariance_xpr)   r)   r*   Úcheck_array_api_get_precisionÍ  s6    


ü
ür  z#array_namespace, device, dtype_nameÚcheckr  r/   r‘   rC   ZQR)r-   r,   Úpower_iteration_normalizerrK   c                 C   s   | j j}||| |||d� d S )N©r   r  )Ú	__class__Ú__name__)r  r  r  r   r  r  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��h | 	||¡ |j
}t|ƒt|ƒksÀJ ‚t||d	�}|j}t|ƒt|ƒksæJ ‚t||d	�}W d   ƒ n1 �s0    Y  |j|jk�s$J ‚|jd
 |jd
 k�s>J ‚|j|jk�sPJ ‚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 )Nr  r  rY   Fr�   r   Tr  r  r.   r   r0   rg   )r   r!  r   r   r“   r   r™   r   r  r3   r"   r#   r   Úarray_devicer   r5   r’   r   r˜   r9   r´   )r  r  r  r   r  r  r  r<   rü   r!   ZestZX_xpZy_xpZcomponents_npZexplained_variance_npZest_xpZcomponents_xpZcomponents_xp_npZexplained_variance_xpZexplained_variance_xp_npZmin_componentsZreference_varianceZextra_variance_npZextra_variance_xp_npr)   r)   r*   Ú!test_pca_mle_array_api_compliance  sH    

,

ýr$  c               	   C   s˜  t  d¡ t  d¡} |  tj¡}tdddd�}t d¡}t jt	|d��D t
d	d
�� | |¡ W d   ƒ n1 sr0    Y  W d   ƒ n1 s�0    Y  |jddd� t d¡}t jt	|d��D t
d	d
�� | |¡ W d   ƒ n1 sì0    Y  W d   ƒ n1 �s0    Y  |jddd� t d¡}t jt|d��F t
d	d
�� | |¡ W d   ƒ n1 �sj0    Y  W d   ƒ n1 �sŠ0    Y  d S )NZarray_api_compatZarray_api_strictrD   r   r   rL   zCPCA with svd_solver='arpack' is not supported for Array API inputs.r[   Tr  r   ZLU)r,   r  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.)r^   Zimportorskipr  r1   r2   r	   ÚreÚescaper_   r¿   r   r3   Z
set_paramsZwarnsÚUserWarning)r  r  r=   Zexpected_msgr)   r)   r*   Ú7test_array_api_error_and_warnings_on_unsupported_params]  s0    

ÿFÿHÿr(  )r   r   )kr%  rm   Únumpyr9   r^   ZscipyrO   Znumpy.testingr   Zsklearnr   r   Zsklearn.baser   Zsklearn.datasetsr   r   r   Zsklearn.decompositionr	   Zsklearn.decomposition._pcar
   r   Zsklearn.utils._array_apir   r   r   r   r#  Z-sklearn.utils._test_common.instance_generatorr   Zsklearn.utils._testingr   r   Zsklearn.utils.estimator_checksr   Zsklearn.utils.fixesr   r   r1   ZPCA_SOLVERSrQ   rR   r’   ZSPARSE_MAX_COMPONENTSr+   ÚmarkZparametrizerÓ   r2   r5   r@   rV   rX   ra   rf   rr   r‰   r¥   ÚlistÚsetrŸ   rM   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í   rï   rò   rõ   ró   rô   rý   r  r  r  r
  r  r  r  r  r  r  r"  r$  r(  r)   r)   r)   r*   Ú<module>   s`  

8
!
5ÿ ýù	





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




ýþ




þ


	

"ÿý

üúñÿý
úö: