a
    ¶ÀhJ1  ã                
   @   sÔ  d dl Z d dlZd dl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 d6d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.d/„ Z(d0d1„ Z)d2d3„ Z*ej d e	eg¡d4d5„ ƒZ+dS )7é    N)Úassert_array_equal)Ú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 ]’}
t |¡}||
 d |	|
  ||
 d |	|
   }}||
 d |	|
  ||
 d |	|
   }}d|||… d d …||…f< | ¡ ||
d d …f< qHt ||¡}|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    úg/var/www/html/assistant/venv/lib/python3.9/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sLJ ‚td| d}| |¡}|jjd	ksrJ ‚|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    

r1   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   r6   r   r7   )r   r+   r,   r"   r   Úfitr   r.   )r7   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€J ‚t	||ƒ d S )Nr   r   r   r$   r2   r3   r4   r5   r   )r   Ún_jobsr6   r7   r   )
r   r+   r,   r"   r   r9   Ú	transformÚallr.   r   )r7   r   r   r:   r;   ÚU1r0   ÚU2r    r    r!   Útest_fit_transform_parallelI   s    


ÿþ
rC   c                  C   sZ   t j d¡} tddd| d\}}}d|d d …df< tdd}t  t  | |¡¡¡rVJ ‚d S )Nr   r   r$   r2   r3   r   ©r   )r   r+   r,   r"   r   ÚanyÚisnanr-   )r   r   r:   Z	estimatorr    r    r!   Útest_transform_nanZ   s
    
rG   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   r2   r3   r4   )r   r6   r   r8   )	r   r+   r,   r"   r   r-   r9   r?   r   )r   r   r:   r;   rA   r<   rB   r    r    r!   Útest_fit_transform_talld   s    
rI   c                  C   s‚   t j d¡} |  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 )
Nr   é   r   é   )r   ÚU_initÚV_initÚmax_iterr   r   T)ZaxisZkeepdims)ÚuÚv)r   r+   r,   r   r   r9   ZlinalgZnormr
   ÚTr   r.   )r   rL   rM   ÚmodelZexpected_componentsr    r    r!   Útest_initializationn   s    
ÿrS   c                  C   sˆ   t j d¡} |  dd¡}tdd| d}| |¡}|jjdks@J ‚|jdksNJ ‚td	d| d}| |¡}|jjd
ksvJ ‚|jdks„J ‚d S )Nr   r#   r$   r   r   )r   rN   r   r&   r'   r(   r)   r*   )r   r+   r,   r   r   r-   r.   r   )r   r/   Úpcar   r    r    r!   Útest_mini_batch_correct_shapes|   s    

rU   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 ||j
_qÀ||j
_0 n tdd	| dd
}| |¡ |¡}	t  |jdk¡rÔJ ‚t||	ƒ tdd| dd |¡}
t|
j|jƒ d S )Nr   r   r   r$   r2   r3   )r   r   r7   Úwin32r   )r   r>   r7   r   r8   r5   )r   r+   r,   r"   r   r9   r?   ÚsysÚplatformÚjoblibÚparallelÚmultiprocessingr@   r.   r   )r7   r   r   r:   r;   rA   rZ   Z_mpr0   rB   r<   r    r    r!   Útest_mini_batch_fit_transform‹   s2    

ÿ
ÿþr]   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   éè  r2   r3   r4   r5   r$   )r   r+   r,   r"   r   r-   r?   r   )r7   r   r   r:   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   r^   r2   r3   r$   r   )r7   Úridge_alphar   rD   gñhãˆµøä>)Zatol)r   r+   r,   r"   r   r   r9   r?   r   Úabsr.   r   rQ   ÚeyeÚsign)r   r   r:   ÚZr0   rT   Zresults_test_pcaZresults_test_spcar    r    r!   Útest_pca_vs_spcaµ   s    




ÿre   ÚSPCAr   r   c                 C   sZ   t j d¡}d\}}| ||¡}| |d |¡}|d urH|j|ksVJ ‚n|j|ksVJ ‚d S )Nr   ©r#   r$   rD   )r   r+   r,   r   r9   Zn_components_)rf   r   r   r   r   r/   rR   r    r    r!   Útest_spca_n_components_Ç   s    rh   r6   )r4   r8   zdata_type, expected_typec                 C   s`   d\}}}t j d¡}| ||¡ |¡}| ||d}	|	 |¡}
|
j|ksLJ ‚|	jj|ks\J ‚d S )N©r#   r$   r   r   )r   r6   )r   r+   r,   r   Úastyper-   Zdtyper.   )rf   r6   Z	data_typeÚexpected_typer   r   r   r   Úinput_arrayrR   Ztransformedr    r    r!   Útest_sparse_pca_dtype_matchÖ   s    

rm   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   ri   r   )r   r7   r6   r   )Úrtol)
r   r+   r,   r   r-   rj   Úfloat32Úfloat64r   r.   )rf   r6   ro   r7   r   r   r   r   rl   Zmodel_32Ztransformed_32Zmodel_64Ztransformed_64r    r    r!   Ú%test_sparse_pca_numerical_consistencyí   s    
ÿÿrr   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   rg   rK   rD   c                    s   g | ]}ˆ › |› ‘qS r    r    )Ú.0Úi©Zestimator_namer    r!   Ú
<listcomp>  ó    z/test_spca_feature_names_out.<locals>.<listcomp>N)
r   r+   r,   r   r9   Zget_feature_names_outÚ__name__Úlowerr   r   )rf   r   r   r   r/   rR   Únamesr    ru   r!   Útest_spca_feature_names_out  s    
r{   c                 C   s˜   t j | ¡}d\}}| ||¡}tdd| d |¡}tdd| d |¡}|j|jk sXJ ‚tddd| d |¡}tddd| d |¡}|j|jk s”J ‚d	S )
z@Check that `tol` and `max_no_improvement` act as early stopping.)é2   r$   éd   g      à?)rN   Útolr   rn   gíµ ÷Æ°>r   )rN   r~   Zmax_no_improvementr   N)r   r+   r,   r   r   r9   Zn_iter_)Úglobal_random_seedr   r   r   r/   Zmodel_early_stoppedZmodel_not_early_stoppedr    r    r!   Útest_spca_early_stopping  s2    ÿþÿþÿþÿþ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|   rK   r   Z
randomizedr   )r   Z
svd_solverr   r4   )r   r6   r`   r7   r   N)	r   r+   r,   r   r   r9   r   r   r.   )r   r   r/   r   rT   r0   r    r    r!   Ú$test_equivalence_components_pca_spca-  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$   rJ   r   çê-™—q=©r   r7   r`   r   r%   N)	r   r+   r,   r   r   r   r-   r   Úinverse_transform)	r   r   r   r/   r   r0   rT   ÚX_trans_spcaZX_trans_pcar    r    r!   Ú!test_sparse_pca_inverse_transformG  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…   )rf   r   r   r   r/   r   r0   r†   r    r    r!   Ú+test_transform_inverse_transform_round_tripY  s    ÿ
rˆ   )N),rX   Únumpyr   ZpytestZnumpy.testingr   Zsklearn.decompositionr   r   r   Zsklearn.utilsr   Zsklearn.utils._testingr   r   r	   Zsklearn.utils.extmathr
   r"   r1   r=   rC   rG   rI   rS   rU   ÚmarkZskipifr]   r_   re   Zparametrizerh   rp   rq   Zint32Zint64rm   rr   r{   r€   r   r‡   rˆ   r    r    r    r!   Ú<module>   sX   









üþ	
