o
    ¢Äi-/  ã                
   @   sÀ  d dl Zd dlZd dl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mZ d dlmZ d2dd	„Zd
d„ Zdd„ Zedd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zej de
e	g¡ej dddg¡dd „ ƒƒZej de
e	f¡ej d!d"¡ej d#ej ej fej!ej!fej"ej!fej#ej!ff¡d$d%„ ƒƒƒZ$ej de
e	f¡ej d!d"¡d&d'„ ƒƒZ%ej de
e	g¡d(d)„ ƒZ&d*d+„ Z'd,d-„ Z(d.d/„ Z)ej de
e	g¡d0d1„ ƒZ*dS )3é    N)Úassert_array_equal)Úmake_low_rank_matrix)ÚPCAÚMiniBatchSparsePCAÚ	SparsePCA)Úcheck_random_state)Úassert_allcloseÚassert_array_almost_equalÚ!if_safe_multiprocessing_with_blas)Úsvd_flipc                 C   s  |d |d  }t |ƒ}| || ¡}| | |¡}g d¢}g d¢}	t| ƒD ]I}
t |¡}||
 d |	|
  ||
 d |	|
  }}||
 d |	|
  ||
 d |	|
  }}d|||… d d …||…f< | ¡ ||
d d …f< q$t ||¡}|d| |jd |jd ¡ 7 }|||fS )Nr   é   ))é   r   )é   é   )é   r   )r   é   r   g      ð?gš™™™™™¹?)r   ÚrandnÚrangeÚnpZzerosZravelÚdotÚshape)Ún_componentsÚ	n_samplesZ
image_sizeÚrandom_stateÚ
n_featuresÚrngÚUÚVZcentersÚszÚkZimgZxminZxmaxZyminZymaxÚY© r!   úe/home/kim/smarthome/.venv/lib/python3.10/site-packages/sklearn/decomposition/tests/test_sparse_pca.pyÚgenerate_toy_data   s   
** 
r#   c                  C   s„   t j d¡} |  dd¡}td| d}| |¡}|jjdksJ ‚|jdks&J ‚td| d}| |¡}|jjd	ks9J ‚|jd
ks@J ‚d S )Nr   é   é
   r   ©r   r   ©r   r%   ©r$   r   é   ©r)   r%   ©r$   r)   )r   ÚrandomÚRandomStater   r   Úfit_transformÚcomponents_r   )r   ÚXÚspcar   r!   r!   r"   Útest_correct_shapes.   s   

r2   c                 C   sl   d}t j | ¡}tddd|d\}}}tdd|| d}| |¡ tdd| |d	}| |¡ t|j|jƒ d S )
Nr   r   r%   ©r   r   ©r   Úlars©r   ÚmethodÚalphar   Úcd)r   r7   r   r8   )r   r,   r-   r#   r   Úfitr	   r/   )Úglobal_random_seedr8   r   r    Ú_Ú	spca_larsÚ
spca_lassor!   r!   r"   Útest_fit_transform<   s   ÿ
ÿ
r?   c           	      C   sŽ   d}t j | ¡}tddd|d\}}}tdd|| d}| |¡ | |¡}tddd|| d	 |¡}| |¡}t  |jd
k¡r@J ‚t	||ƒ d S )Nr   r   r%   r3   r4   r5   r6   r   )r   Zn_jobsr7   r8   r   r   )
r   r,   r-   r#   r   r:   Ú	transformÚallr/   r	   )	r;   r8   r   r    r<   r=   ÚU1r1   ÚU2r!   r!   r"   Útest_fit_transform_parallelM   s(   ÿ

ûú
rD   c                 C   s\   t j | ¡}tddd|d\}}}d|d d …df< td| d}t  t  | |¡¡¡r,J ‚d S )Nr   r%   r3   r4   r   r   r&   )r   r,   r-   r#   r   ÚanyÚisnanr.   )r;   r   r    r<   Z	estimatorr!   r!   r"   Útest_transform_nand   s
   rG   c                 C   sf   t j | ¡}tddd|d\}}}tdd|d}| |¡}tdd|d}| |¡ |¡}t||ƒ d S )Nr   éA   r3   r4   r5   ©r   r7   r   r9   )	r   r,   r-   r#   r   r.   r:   r@   r	   )r;   r   r    r<   r=   rB   r>   rC   r!   r!   r"   Útest_fit_transform_talln   s   
rJ   c                 C   s‚   t j | ¡}| dd¡}| dd¡}td||d|d}| | dd¡¡ |t jj|ddd }t|j	d d	d j	}t
|j|ƒ d S )
Né   r   é   r   )r   ÚU_initÚV_initÚmax_iterr   r   T)ZaxisZkeepdims)ÚuÚv)r   r,   r-   r   r   r:   ZlinalgZnormr   ÚTr   r/   )r;   r   rM   rN   ÚmodelZexpected_componentsr!   r!   r"   Útest_initializationx   s   
ÿrT   c                  C   sˆ   t j d¡} |  dd¡}tdd| d}| |¡}|jjdks J ‚|jdks'J ‚td	d| d}| |¡}|jjd
ks;J ‚|jdksBJ ‚d S )Nr   r$   r%   r   r   )r   rO   r   r'   r(   r)   r*   r+   )r   r,   r-   r   r   r.   r/   r   )r   r0   Úpcar   r!   r!   r"   Útest_mini_batch_correct_shapes†   s   

rV   c                 C   sh   d}t j | ¡}tddd|d\}}}tdd||d}| |¡}| |d d… ¡}t|d	 |d	 ƒ d S )
Nr   r   éè  r3   r4   r5   r6   r%   r   )r   r,   r-   r#   r   r.   r@   r   )r;   r8   r   r    r<   r=   Zresults_trainZresults_testr!   r!   r"   Útest_scaling_fit_transform”   s   
rX   c           	      C   sè   t j | ¡}tddd|d\}}}tddd|d\}}}tddd|d}td|d	}| |¡ | |¡ | |¡}| |¡}tt  	|j
 |j
j¡¡t  d¡d
d |t  |dd d …f ¡9 }|t  |dd d …f ¡9 }t||d
d d S )Nr   rW   r3   r4   r%   r   r   )r8   Úridge_alphar   r   r&   g-Cëâ6?)Zatol)r   r,   r-   r#   r   r   r:   r@   r   Úabsr/   r   rR   ÚeyeÚsign)	r;   r   r    r<   ÚZr1   rU   Zresults_test_pcaZresults_test_spcar!   r!   r"   Útest_pca_vs_spcaž   s   



ÿr^   ÚSPCAr   r   c                 C   s\   t j d¡}d\}}| ||¡}| |d |¡}|d ur%|j|ks#J ‚d S |j|ks,J ‚d S )Nr   ©r$   r%   ©r   )r   r,   r-   r   r:   Zn_components_)r_   r   r   r   r   r0   rS   r!   r!   r"   Útest_spca_n_components_°   s   rb   r7   )r5   r9   zdata_type, expected_typec                 C   s`   d\}}}t j d¡}| ||¡ |¡}| ||d}	|	 |¡}
|
j|ks&J ‚|	jj|ks.J ‚d S )N)r$   r%   r   r   )r   r7   )r   r,   r-   r   Úastyper.   Zdtyper/   )r_   r7   Z	data_typeÚexpected_typer   r   r   r   Úinput_arrayrS   Ztransformedr!   r!   r"   Útest_sparse_pca_dtype_match¿   s   

rf   c                 C   sv   d\}}}t ||||d}| |||d}| | tj¡¡}| |||d}	|	 | tj¡¡}
t|
|ƒ t|	j|jƒ d S )N)é   rg   rK   )r   r   Zeffective_rankr   rI   )r   r.   rc   r   Úfloat32Úfloat64r   r/   )r_   r7   r;   r   r   r   re   Zmodel_32Ztransformed_32Zmodel_64Ztransformed_64r!   r!   r"   Ú%test_sparse_pca_numerical_consistencyÖ   s*   
üýý
rj   c                    sb   t j d¡}d\}}| ||¡}| dd |¡}| ¡ }| j ¡ ‰ t‡ fdd„t	dƒD ƒ|ƒ dS )z'Check feature names out for *SparsePCA.r   r`   rL   ra   c                    s   g | ]}ˆ › |› ‘qS r!   r!   )Ú.0Úi©Zestimator_namer!   r"   Ú
<listcomp>þ   s    z/test_spca_feature_names_out.<locals>.<listcomp>N)
r   r,   r-   r   r:   Zget_feature_names_outÚ__name__Úlowerr   r   )r_   r   r   r   r0   rS   Únamesr!   rm   r"   Útest_spca_feature_names_outó   s   
 rr   c                 C   s˜   t j | ¡}d\}}| ||¡}tdd| d |¡}tdd| d |¡}|j|jk s,J ‚tddd| d |¡}tddd| d |¡}|j|jk sJJ ‚d	S )
z@Check that `tol` and `max_no_improvement` act as early stopping.)é2   r%   éd   g      à?)rO   Útolr   gü©ñÒMbP?gíµ ÷Æ°>r   )rO   ru   Zmax_no_improvementr   N)r   r,   r-   r   r   r:   Zn_iter_)r;   r   r   r   r0   Zmodel_early_stoppedZmodel_not_early_stoppedr!   r!   r"   Útest_spca_early_stopping  s2   ÿþÿþÿþÿþrv   c                 C   sZ   t j | ¡}| dd¡}d}t|ddd |¡}t|ddddd |¡}t|j|jƒ d	S )
z¤Check the equivalence of the components found by PCA and SparsePCA.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/23932
    rs   rL   r   Z
randomizedr   )r   Z
svd_solverr   r5   )r   r7   rY   r8   r   N)	r   r,   r-   r   r   r:   r   r   r/   )r;   r   r0   r   rU   r1   r!   r!   r"   Ú$test_equivalence_components_pca_spca  s(   ýüûúrw   c           
      C   sn   t j | ¡}d\}}| ||¡}d}t|dd| d}t|| d}| |¡}| |¡}	t| |¡| |	¡ƒ dS )zDCheck that `inverse_transform` in `SparsePCA` and `PCA` are similar.©r%   rK   r   çê-™—q=©r   r8   rY   r   r&   N)	r   r,   r-   r   r   r   r.   r   Úinverse_transform)
r;   r   r   r   r0   r   r1   rU   ÚX_trans_spcaZX_trans_pcar!   r!   r"   Ú!test_sparse_pca_inverse_transform5  s    ü

ÿr}   c           	      C   sR   t j |¡}d\}}| ||¡}|}| |dd|d}| |¡}t| |¡|ƒ dS )z^Check the `transform` and `inverse_transform` round trip with no loss of
    information.
    rx   ry   rz   N)r   r,   r-   r   r.   r   r{   )	r_   r;   r   r   r   r0   r   r1   r|   r!   r!   r"   Ú+test_transform_inverse_transform_round_tripJ  s   ü
r~   )N)+Únumpyr   ZpytestZnumpy.testingr   Zsklearn.datasetsr   Zsklearn.decompositionr   r   r   Zsklearn.utilsr   Zsklearn.utils._testingr   r	   r
   Zsklearn.utils.extmathr   r#   r2   r?   rD   rG   rJ   rT   rV   rX   r^   ÚmarkZparametrizerb   rh   ri   Zint32Zint64rf   rj   rr   rv   rw   r}   r~   r!   r!   r!   r"   Ú<module>   sV   








üþ	
