U
    3‰d„4  ã                
   @   sè  d dl Z d dlZd dlZd dlmZ d dlm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d	„Zd
d„ Zdd„ Ze	dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zejjddd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/d0„ Z&d1d2„ Z'd3d4„ Z(d5d6„ Z)d7d8„ Z*ej d!eeg¡d9d:„ ƒZ+dS )<é    N)Úassert_array_equal)Úassert_array_almost_equal)Úassert_allclose)Ú!if_safe_multiprocessing_with_blas)Ú	SparsePCAÚMiniBatchSparsePCAÚPCA)Úcheck_random_statec                 C   s  |d |d  }t |ƒ}| || ¡}| | |¡}dddg}dddg}	t| ƒD ]’}
t |¡}||
 d |	|
  ||
 d |	|
   }}||
 d |	|
  ||
 d |	|
   }}d|||… d d …||…f< | ¡ ||
d d …f< qLt ||¡}|d| |jd |jd ¡ 7 }|||fS )	Nr   é   )é   r   )é   é   )é   r
   é   g      ð?gš™™™™™¹?)r	   ÚrandnÚrangeÚnpÚzerosZravelÚdotÚshape)Ún_componentsÚ	n_samplesZ
image_sizeÚrandom_stateÚ
n_featuresÚrngÚUÚVZcentersÚszÚkÚimgZxminZxmaxZyminZymaxÚY© r!   úO/tmp/pip-unpacked-wheel-zrfo1fqw/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>t‚|jdksLt‚td| d}| |¡}|jjd	ksrt‚|jd
ks€t‚d S ©Nr   é   é
   r   ©r   r   )r   r&   )r%   r   é   )r(   r&   )r%   r(   )	r   ÚrandomÚRandomStater   r   Úfit_transformÚcomponents_r   ÚAssertionError)r   ÚXÚspcar   r!   r!   r"   Útest_correct_shapes,   s    

r0   c                  C   sl   d} t j d¡}tddd|d\}}}tdd| dd}| |¡ tdd	d| d
}| |¡ t|j|jƒ d S )Nr
   r   r   r&   ©r   r   ©r   Úlars©r   ÚmethodÚalphar   Úcd)r   r5   r   r6   )r   r)   r*   r#   r   Úfitr   r,   )r6   r   r    Ú_Ú	spca_larsÚ
spca_lassor!   r!   r"   Útest_fit_transform:   s    

r<   c                  C   sŽ   d} t j d¡}tddd|d\}}}tdd| dd}| |¡ | |¡}tdd	d| dd
 |¡}| |¡}t  |jdk¡r€t	‚t
||ƒ d S )Nr
   r   r   r&   r1   r2   r3   r4   r   )r   Ún_jobsr5   r6   r   )r   r)   r*   r#   r   r8   Ú	transformÚallr,   r-   r   )r6   r   r    r9   r:   ÚU1r/   ÚU2r!   r!   r"   Útest_fit_transform_parallelG   s$    

    ÿþ
rB   c                  C   sZ   t j d¡} tddd| d\}}}d|d d …df< tdd}t  t  | |¡¡¡rVt‚d S )Nr   r   r&   r1   r2   r   ©r   )	r   r)   r*   r#   r   ÚanyÚisnanr+   r-   )r   r    r9   Z	estimatorr!   r!   r"   Útest_transform_nanX   s
    
rF   c                  C   sf   t j d¡} tddd| d\}}}tdd| d}| |¡}tdd| d}| |¡ |¡}t||ƒ d S )	Nr   r   éA   r1   r2   r3   )r   r5   r   r7   )	r   r)   r*   r#   r   r+   r8   r>   r   )r   r    r9   r:   r@   r;   rA   r!   r!   r"   Útest_fit_transform_tallb   s    
rH   c                  C   st   t j d¡} |  dd¡}|  dd¡}td||d| d}| |  dd¡¡ t|j|t jj	|ddd d …d f  ƒ d S )Nr   é   r   é   )r   ÚU_initÚV_initÚmax_iterr   r
   )Zaxis)
r   r)   r*   r   r   r8   r   r,   ZlinalgZnorm)r   rK   rL   Úmodelr!   r!   r"   Útest_initializationl   s        ÿrO   c                  C   s„   t j d¡} |  dd¡}td| d}| |¡}|jjdks>t‚|jdksLt‚td| d}| |¡}|jjd	ksrt‚|jd
ks€t‚d S r$   )	r   r)   r*   r   r   r+   r,   r   r-   )r   r.   Úpcar   r!   r!   r"   Útest_mini_batch_correct_shapesw   s    

rQ   Tz"skipping mini_batch_fit_transform.)Úreasonc                  C   sþ   d} t j d¡}tddd|d\}}}tdd| d |¡}| |¡}tjdkr˜dd l	}|j
j}d |j
_z$tdd	| dd
}| |¡ |¡}	W 5 ||j
_X n tdd	| dd
}| |¡ |¡}	t  |jdk¡rÌt‚t||	ƒ tdd| dd |¡}
t|
j|jƒ d S )Nr
   r   r   r&   r1   r2   )r   r   r6   Úwin32r   )r   r=   r6   r   r7   r4   )r   r)   r*   r#   r   r8   r>   ÚsysÚplatformÚjoblibÚparallelÚmultiprocessingr?   r,   r-   r   )r6   r   r    r9   r:   r@   rV   Z_mpr/   rA   r;   r!   r!   r"   Útest_mini_batch_fit_transform†   s>    

   ÿ
   ÿþrY   c                  C   sh   d} t j d¡}tddd|d\}}}tdd| |d}| |¡}| |d d	… ¡}t|d |d ƒ d S )
Nr
   r   r   éè  r1   r2   r3   r4   r&   )r   r)   r*   r#   r   r+   r>   r   )r6   r   r    r9   r:   Zresults_trainZresults_testr!   r!   r"   Útest_scaling_fit_transform¦   s    
r[   c                  C   sà   t j d¡} 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 S )Nr   r   rZ   r1   r2   r&   r   )r6   Úridge_alphar   rC   gñhãˆµøä>)Zatol)r   r)   r*   r#   r   r   r8   r>   r   Úabsr,   r   ÚTZeyeÚsign)r   r    r9   ÚZr/   rP   Zresults_test_pcaZresults_test_spcar!   r!   r"   Útest_pca_vs_spca°   s"    




  ÿra   ÚSPCAr   r   c                 C   sZ   t j d¡}d\}}| ||¡}| |d |¡}|d k	rH|j|ksVt‚n|j|ksVt‚d S )Nr   ©r%   r&   rC   )r   r)   r*   r   r8   Zn_components_r-   )rb   r   r   r   r   r.   rN   r!   r!   r"   Útest_spca_n_components_Â   s    rd   r5   )r3   r7   zdata_type, expected_typec                 C   s`   d\}}}t j d¡}| ||¡ |¡}| ||d}	|	 |¡}
|
j|ksLt‚|	jj|ks\t‚d S )N©r%   r&   r   r   )r   r5   )	r   r)   r*   r   Úastyper+   Zdtyper-   r,   )rb   r5   Z	data_typeZexpected_typer   r   r   r   Úinput_arrayrN   Ztransformedr!   r!   r"   Útest_sparse_pca_dtype_matchÑ   s    

rh   c                 C   s’   d}d}d\}}}t j d¡}| ||¡}| |||dd}	|	 | t j¡¡}
| |||dd}| | t j¡¡}t||
|d t|j	|	j	|d d S )Nçü©ñÒMbP?r   re   r   )r   r6   r5   r   )Úrtol)
r   r)   r*   r   r+   rf   Úfloat32Úfloat64r   r,   )rb   r5   rj   r6   r   r   r   r   rg   Zmodel_32Ztransformed_32Zmodel_64Ztransformed_64r!   r!   r"   Ú%test_sparse_pca_numerical_consistencyè   s*    
   ÿ   ÿrm   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   rc   rJ   rC   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   r8   Zget_feature_names_outÚ__name__Úlowerr   r   )rb   r   r   r   r.   rN   Únamesr!   rp   r"   Útest_spca_feature_names_out   s    
ru   c               	   C   s¤   t j d¡} d\}}|  ||¡}d}tjt|d tdd |¡ W 5 Q R X d\}}tjt|d t||dd |¡}W 5 Q R X |j	d	ks’t
‚|j	|ks t
‚d
S )zvCheck that we raise a warning for the deprecation of `n_iter` and it is ignored
    when `max_iter` is specified.
    r   rc   z9'n_iter' is deprecated in version 1.1 and will be removed©Úmatchr   )Ún_iter)r
   éd   )rx   rM   r   r
   N)r   r)   r*   r   ÚpytestÚwarnsÚFutureWarningr   r8   Ún_iter_r-   )r   r   r   r.   Zwarn_msgrx   rM   rN   r!   r!   r"   Útest_spca_n_iter_deprecation  s"      ÿþr~   c               	   C   sb   t  ddgddgddgddgddgddgg¡} tdd | ¡}tjtdd	 |j W 5 Q R X d S )
Néÿÿÿÿéþÿÿÿéýÿÿÿr
   r   r   rC   z`n_features_` was deprecatedrv   )r   Úarrayr   r8   rz   r{   r|   Zn_features_)r.   rP   r!   r!   r"   Útest_pca_n_features_deprecation$  s    .rƒ   c                 C   s˜   t j | ¡}d\}}| ||¡}tdd| d |¡}tdd| d |¡}|j|jk sXt‚tddd| d |¡}tddd| d |¡}|j|jk s”t‚d	S )
z@Check that `tol` and `max_no_improvement` act as early stopping.)é2   r&   ry   g      à?)rM   Útolr   ri   gíµ ÷Æ°>r   )rM   r…   Zmax_no_improvementr   N)r   r)   r*   r   r   r8   r}   r-   )Úglobal_random_seedr   r   r   r.   Zmodel_early_stoppedZmodel_not_early_stoppedr!   r!   r"   Útest_spca_early_stopping+  sF      ÿþ  ÿþ   ÿþ   ÿþr‡   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
    r„   rJ   r   Z
randomizedr   )r   Z
svd_solverr   r3   )r   r5   r\   r6   r   N)	r   r)   r*   r   r   r8   r   r   r,   )r†   r   r.   r   rP   r/   r!   r!   r"   Ú$test_equivalence_components_pca_spcaE  s(    ýüûúrˆ   c            	      C   sn   t j d¡} d\}}|  ||¡}d}t|dddd}t|dd}| |¡}| |¡}t| |¡| |¡ƒ dS )zDCheck that `inverse_transform` in `SparsePCA` and `PCA` are similar.r   ©r&   rI   r   çê-™—q=©r   r6   r\   r   r'   N)	r   r)   r*   r   r   r   r+   r   Úinverse_transform)	r   r   r   r.   r   r/   rP   ÚX_trans_spcaZX_trans_pcar!   r!   r"   Ú!test_sparse_pca_inverse_transform_  s"       ÿ

 ÿrŽ   c                 C   sR   t j d¡}d\}}| ||¡}|}| |dddd}| |¡}t| |¡|ƒ dS )z^Check the `transform` and `inverse_transform` round trip with no loss of
    information.
    r   r‰   rŠ   r‹   N)r   r)   r*   r   r+   r   rŒ   )rb   r   r   r   r.   r   r/   r   r!   r!   r"   Ú+test_transform_inverse_transform_round_tripq  s       ÿ
r   )N),rT   rz   Znumpyr   Znumpy.testingr   Zsklearn.utils._testingr   r   r   Zsklearn.decompositionr   r   r   Zsklearn.utilsr	   r#   r0   r<   rB   rF   rH   rO   rQ   ÚmarkZskipifrY   r[   ra   Zparametrizerd   rk   rl   Zint32Zint64rh   rm   ru   r~   rƒ   r‡   rˆ   rŽ   r   r!   r!   r!   r"   Ú<module>   s^   









üþ	
