U
    Ovfh4                  
   @   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 d9d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&d/d0 Z'd1d2 Z(d3d4 Z)d5d6 Z*ejde	egd7d8 Z+dS ):    N)assert_array_equal)PCAMiniBatchSparsePCA	SparsePCA)check_random_state)assert_allcloseassert_array_almost_equal!if_safe_multiprocessing_with_blasc                 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-qu3nn_q2/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st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    

r3   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   r8   r   r9   )r   r,   r-   r#   r   fitr   r/   )r9   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rt	t
|| d S )Nr
   r   r   r%   r4   r5   r6   r7   r   )r   n_jobsr8   r9   r   )r   r,   r-   r#   r   r;   	transformallr/   r0   r   )r9   r   r    r<   r=   U1r2   U2r!   r!   r"   test_fit_transform_parallelH   s$    

    
rE   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%   r4   r5   r   r   )	r   r,   r-   r#   r   anyisnanr.   r0   )r   r    r<   Z	estimatorr!   r!   r"   test_transform_nanY   s
    
rI   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   r4   r5   r6   )r   r8   r   r:   )	r   r,   r-   r#   r   r.   r;   rA   r   )r   r    r<   r=   rC   r>   rD   r!   r!   r"   test_fit_transform_tallc   s    
rK   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   r;   r   r/   ZlinalgZnorm)r   rN   rO   modelr!   r!   r"   test_initializationm   s        rR   c                  C   s   t jd} | dd}tdd| d}||}|jjdks@t|jdksNttd	d| d}||}|jjd
ksvt|jdkstd S )Nr   r$   r%   r   r
   )r   rP   r   r'   r(   r)   r*   r+   )	r   r,   r-   r   r   r.   r/   r   r0   )r   r1   pcar   r!   r!   r"   test_mini_batch_correct_shapesx   s    

rT   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rd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rtt||	 tdd| dd|}
t|
j|j d S )Nr
   r   r   r%   r4   r5   )r   r   r9   win32r   )r   r@   r9   r   r:   r7   )r   r,   r-   r#   r   r;   rA   sysplatformjoblibparallelmultiprocessingrB   r/   r0   r   )r9   r   r    r<   r=   rC   rY   Z_mpr2   rD   r>   r!   r!   r"   test_mini_batch_fit_transform   s>    

   
   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     r4   r5   r6   r7   r%   )r   r,   r-   r#   r   r.   rA   r   )r9   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]   r4   r5   r%   r   )r9   ridge_alphar   rF   gh㈵>)Zatol)r   r,   r-   r#   r   r   r;   rA   r   absr/   r   TZeyesign)r   r    r<   Zr2   rS   Zresults_test_pcaZresults_test_spcar!   r!   r"   test_pca_vs_spca   s"    




  rd   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%   rF   )r   r,   r-   r   r;   Zn_components_r0   )re   r   r   r   r   r1   rQ   r!   r!   r"   test_spca_n_components_   s    rg   r8   )r6   r:   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   r8   )	r   r,   r-   r   astyper.   Zdtyper0   r/   )re   r8   Z	data_typeZexpected_typer   r   r   r   input_arrayrQ   Ztransformedr!   r!   r"   test_sparse_pca_dtype_match   s    

rk   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 )NMbP?r   rh   r   )r   r9   r8   r   )rtol)
r   r,   r-   r   r.   ri   float32float64r   r/   )re   r8   rm   r9   r   r   r   r   rj   Zmodel_32Ztransformed_32Zmodel_64Ztransformed_64r!   r!   r"   %test_sparse_pca_numerical_consistency   s*    
      rp   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   rf   rM   rF   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   )re   r   r   r   r1   rQ   namesr!   rs   r"   test_spca_feature_names_out  s    
rx   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st
|j	|kst
d
S )zvCheck that we raise a warning for the deprecation of `n_iter` and it is ignored
    when `max_iter` is specified.
    r   rf   z9'n_iter' is deprecated in version 1.1 and will be removedmatchr   )n_iter)r
   d   )r{   rP   r   r
   N)r   r,   r-   r   pytestwarnsFutureWarningr   r;   n_iter_r0   )r   r   r   r1   Zwarn_msgr{   rP   rQ   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 )
Nr
   r   r   rF   z`n_features_` was deprecatedry   )r   arrayr   r;   r}   r~   r   Zn_features_)r1   rS   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 std	S )
z@Check that `tol` and `max_no_improvement` act as early stopping.)2   r%   r|   g      ?)rP   tolr   rl   gư>r   )rP   r   Zmax_no_improvementr   N)r   r,   r-   r   r   r;   r   r0   )global_random_seedr   r   r   r1   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 )
zCheck the equivalence of the components found by PCA and SparsePCA.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/23932
    r   rM   r   Z
randomizedr   )r   Z
svd_solverr   r6   )r   r8   r_   r9   r   N)	r   r,   r-   r   r   r;   r   r   r/   )r   r   r1   r   rS   r2   r!   r!   r"   $test_equivalence_components_pca_spcaF  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%   rL   r   -q=r   r9   r_   r   r&   N)	r   r,   r-   r   r   r   r.   r   inverse_transform)	r   r   r   r1   r   r2   rS   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   )re   r   r   r   r1   r   r2   r   r!   r!   r"   +test_transform_inverse_transform_round_tripr  s       
r   )N),rW   Znumpyr   r}   Znumpy.testingr   Zsklearn.decompositionr   r   r   Zsklearn.utilsr   Zsklearn.utils._testingr   r   r	   r#   r3   r?   rE   rI   rK   rR   rT   markZskipifr\   r^   rd   Zparametrizerg   rn   ro   Zint32Zint64rk   rp   rx   r   r   r   r   r   r   r!   r!   r!   r"   <module>   sZ   









	
