a
    ¶Àh©=  ã                   @   s|  d Z 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mZ ddlmZ ddlmZ ddlmZmZ d1d	d
„Zdd„ Zdd„ Zdd„ Zej dddg¡dd„ ƒZdd„ Zdd„ Zej dddg¡dd„ ƒZdd„ Zej d¡ej dg d ¢¡d!d"„ ƒƒZ d#d$„ Z!d%d&„ Z"ej d'g d(¢¡ej d)ddg¡ej d*ddg¡d+d,„ ƒƒƒZ#ej dddg¡d-d.„ ƒZ$d/d0„ Z%dS )2z
Test the fastica algorithm.
é    N)Ústats)ÚPCAÚFastICAÚfastica)Ú_gs_decorrelation)ÚConvergenceWarning)Úassert_allcloseÚignore_warningséÿÿÿÿc                 C   s0   t  | |¡} | | jdd8 } | | jdd } dS )a  Centers and norms x **in place**

    Parameters
    -----------
    x: ndarray
        Array with an axis of observations (statistical units) measured on
        random variables.
    axis: int, optional
        Axis along which the mean and variance are calculated.
    r   ©ÚaxisN)ÚnpZrollaxisÚmeanZstd)Úxr   © r   úd/var/www/html/assistant/venv/lib/python3.9/site-packages/sklearn/decomposition/tests/test_fastica.pyÚcenter_and_norm   s    r   c                  C   s”   t j d¡} t j |  dd¡¡\}}}|  d¡}t||dƒ |d  ¡ dk sPJ ‚|  d¡}t||dƒ}t  ||j	¡}|d d… d  ¡ dk sJ ‚d S )Nr   é
   é   g»½×Ùß|Û=é   )
r   ÚrandomÚRandomStateZlinalgÚsvdÚrandnr   ÚsumÚdotÚT)ÚrngÚWÚ_ÚwÚuÚtmpr   r   r   Útest_gs#   s    

r#   c                 C   sz   t j d¡}| d¡j| dd}tddddd |¡}|jj| ksFJ ‚|j	j| ksVJ ‚|j
j| ksfJ ‚|jj| ksvJ ‚d S )	Nr   ©éd   r   F©Úcopyr   éè  úunit-variance©Ún_componentsÚmax_iterÚwhitenÚrandom_state)r   r   r   Úrandom_sampleÚastyper   ÚfitÚcomponents_ÚdtypeÚmixing_Zmean_Z
whitening_)Úglobal_dtyper   ÚXZficar   r   r   Útest_fastica_attributes_dtypes1   s    ÿþr7   c                 C   sd   t j d¡}| d¡j| dd}t|dd|d\}}}|j| ksDJ ‚|j| ksRJ ‚|j| ks`J ‚d S )Nr   r$   Fr&   r(   r)   )r,   r-   r.   )r   r   r   r/   r0   r   r3   )r5   r   r6   Úk_r4   Ús_r   r   r   Útest_fastica_return_dtypes=   s    ÿr:   Ú	add_noiseTFc              	   C   s  |dkr.|t jkr.| s.t d¡dkr.t d¡ t j |¡}d}dt  t  	dd|¡¡ dkd	 }t
jjd	||d
}t j||f j}t|ƒ | |¡}|\}}d}t  t  |¡t  |¡gt  |¡t  |¡ gg¡}	|	 |¡}	t  |	|¡}
| rü|
d| dd¡ 7 }
t|
ƒ dd„ }ddg}ddd|g}g d¢}t |||¡D ]ð\}}}|r¤t|
j||||d\}}}t t¡$ t|
jt j||d W d   ƒ n1 s˜0    Y  nntdd|d}| |
j¡}t|||d|d\}}}t t¡  t|t j|d W d   ƒ n1 s0    Y  |j}|rP|t jkr.dnd}tt  t  ||¡|
¡||d t|ƒ |\}}tt  ||¡ƒtt  ||¡ƒkrŠ|\}}|t  t  ||¡¡9 }|t  t  ||¡¡9 }| sòtt  ||¡| d	dd tt  ||¡| d	dd n4tt  ||¡| d	dd tt  ||¡| d	dd q6t|
j|||d\}}}t |||d}| |
j¡}|j!j"d ksnJ ‚|j"d!ks~J ‚t||ƒ t  #t  |¡¡|t jkr¦dnd" }t|| $|
j¡|d |j%j"d ksÔJ ‚t t j|d}t t¡ | &|
j¡ W d   ƒ n1 s0    Y  d S )#Né   ZDISTRIBZubuntuz®FastICA instability with Ubuntu Atlas build with float32 global_dtype. For more details, see https://github.com/scikit-learn/scikit-learn/issues/24131#issuecomment-1208091119r(   r   r   r%   é   ©Úsizer.   g333333ã?çš™™™™™¹?c                 S   s   | d d| d  j ddfS )Né   r   r
   r   )r   )r   r   r   r   Úg_testm   s    z#test_fastica_simple.<locals>.g_testÚparallelZ	deflationZlogcoshÚexpZcube©úarbitrary-variancer)   F)Úfunr-   Ú	algorithmr.   )rG   r-   rH   T©r+   r-   r.   F)rG   rH   r-   r.   )rG   rH   gñhãˆµøä>©Úatolg{®Gáz„?)rG   rH   r.   ©r   r   ©r(   r   gH¯¼šò×z>)'r   Zfloat32ÚosÚgetenvÚpytestZxfailr   r   ÚsinÚlinspacer   ÚtÚrvsÚc_r   r   r0   ÚarrayÚcosr   r   Ú	itertoolsÚproductr   ÚraisesÚ
ValueErrorÚtanhr   Úfit_transformr   ÚabsÚsignr   r2   ÚshapeÚmaxÚ	transformr4   r1   )r;   Úglobal_random_seedr5   r   Ú	n_samplesÚs1Ús2ÚsÚphiÚmixingÚmrB   ZalgosZnlsZ	whiteningÚalgoÚnlr-   r8   r4   r9   Zpcar6   rK   Ús1_Ús2_r   Zsources_funÚicaÚsourcesr   r   r   Útest_fastica_simpleH   s’    ÿþýüÿ 
0
ÿ6
ÿ0"
ÿ
$rq   c                  C   sl   ddgddgg} t dddd}d}tjt|d | | ¡ W d   ƒ n1 sP0    Y  t|dƒshJ ‚d S )Nr   r=   FrI   z(Ignoring n_components with whiten=False.©Úmatchr4   )r   rP   ÚwarnsÚUserWarningr1   Úhasattr)rj   ro   Úwarn_msgr   r   r   Útest_fastica_nowhiten´   s    (rx   c            
      C   sÂ   t j d¡} d}t  dd|¡}t  |¡}t  t  t j| ¡¡}t j||f j}t	|ƒ |  
dd¡}t  ||¡}d}tjt|d. tdd| dd	d
}	|	 |j¡ W d   ƒ n1 s´0    Y  d S )Nr   r(   r%   é   r   z\FastICA did not converge. Consider increasing tolerance or the maximum number of iterations.rr   rC   ç        )rH   r+   r.   r,   Ztol)r   r   r   rR   rQ   ÚceilÚpirU   r   r   r   r   rP   rt   r   r   r1   )
r   rd   rS   re   rf   rg   ri   rj   rw   ro   r   r   r   Útest_fastica_convergence_fail¿   s     
ÿ
ÿr}   c                 C   sr  t j d¡}d}t  dd|¡}t  |¡}t  t  t j| ¡¡}t j||f j}t	|ƒ |\}}| 
dd¡}t  ||¡}| rŽ|d| 
d|¡ 7 }t	|ƒ t|jdd|d\}	}
}|j}t|t  t  |
|	¡|¡ƒ t	|ƒ |\}}tt  ||¡ƒtt  ||¡ƒkr|\}}|t  t  ||¡¡9 }|t  t  ||¡¡9 }| sntt  ||¡| d	d
d tt  ||¡| d	d
d d S )Nr   r(   r%   ry   r   r@   r)   rI   r=   gü©ñÒMbP?rJ   )r   r   r   rR   rQ   r{   r|   rU   r   r   r   r   r   r   r^   r_   )r;   r   rd   rS   re   rf   rg   ri   rj   r8   r4   r9   rm   rn   r   r   r   Útest_non_square_fasticaÝ   s6    

ÿ"r~   c              	   C   s„  t j | ¡}| d¡ |¡}d}ddgddgfD ]L\}}|durF|n|jd }t|||dd	}t ¡ 2 t 	d
t
¡ t 	dt¡ | |¡}	W d  ƒ n1 s 0    Y  |jj|dfks¾J ‚|	j|jd |fksÖJ ‚t|||dd	}
t ¡ 2 t 	d
t
¡ t 	dt¡ |
 |¡ W d  ƒ n1 s(0    Y  |
jj|dfksHJ ‚|
 |¡}|rlt  |¡ ¡ d }nd}t|	||d q0dS )z¶Test unit variance of transformed data using FastICA algorithm.

    Check that `fit_transform` gives the same result as applying
    `fit` and then `transform`.

    Bug #13056
    r$   i,  r)   r   FNr=   r   r*   ÚerrorÚignorer   g    €„.Arz   rJ   )r   r   r   r/   r0   r`   r   ÚwarningsÚcatch_warningsÚsimplefilterÚRuntimeWarningr   r]   r2   r1   rb   r^   r   r   )rc   r5   r   r6   r,   r-   r+   Zn_components_ro   ÚXtZica2ZXt2rK   r   r   r   Útest_fit_transform  s6    	ÿ
(ÿ
*
r†   z/ignore:Ignoring n_components with whiten=False.z+whiten, n_components, expected_mixing_shape))rF   r   ©r   r   )rF   r   ©r   r   )r)   r   r‡   )r)   r   rˆ   )Fr   rˆ   )Fr   rˆ   c                 C   sÖ   d}t j |¡}| |df¡ |¡}t||| d}t ¡ & t dt	¡ | 
|¡}	W d   ƒ n1 sf0    Y  |jj|ks€J ‚| |	¡}
|j|
jksšJ ‚||jd krÒ|rÀt  |
¡ ¡ d }nd}t||
|d d S )	Nr%   r   )r+   r.   r-   r€   r=   g     jø@rz   rJ   )r   r   r   r/   r0   r   r   r‚   rƒ   r   r]   r4   r`   Zinverse_transformr^   r   r   )r-   r+   Zexpected_mixing_shaperc   r5   rd   r   r6   ro   r…   ZX2rK   r   r   r   Útest_inverse_transform=  s    
(
r‰   c                  C   s²   d} d}t j d¡}| || f¡}| | d | d ¡}tjtdd  t|ddid W d   ƒ n1 sj0    Y  tjtd	d t||d
 W d   ƒ n1 s¤0    Y  d S )NrA   r   r   r=   zalpha must be in \[1,2\]rr   Úalpha)Zfun_argsz0w_init has invalid shape.+should be \(3L?, 3L?\))Úw_init)	r   r   r   r/   r   rP   rZ   r[   r   )Ú
n_featuresrd   r   r6   r‹   r   r   r   Útest_fastica_errorsi  s    .ÿr   c                  C   sT   t j d¡} |  d¡}|jd }t|ddd}| |¡}t  |¡t 	d¡ksPJ ‚dS )zTTest unit variance of transformed data using FastICA algorithm.

    Bug #13056
    r   r$   r=   r)   rI   g      ð?N)
r   r   r   r/   r`   r   r]   ÚvarrP   Zapprox)r   r6   r+   ro   r…   r   r   r   Ú!test_fastica_whiten_unit_variancew  s    


r   r-   rE   Úreturn_X_meanÚreturn_n_iterc           	      C   sf   d}d}t j d¡}| ||f¡}d| | }t|| ||d}t|ƒ|ksNJ ‚| sb|d d u sbJ ‚d S )NrA   r   r   )r-   r‘   r   )r   r   r   r/   r   Úlen)	r-   r   r‘   rŒ   rd   r   r6   Úexpected_lenÚoutr   r   r   Útest_fastica_output_shape…  s    ÿr•   c                 C   s:  t j |¡}d}dt  t  dd|¡¡ dkd }tjjd||d}t j||f j	}t
|ƒ |\}}| ¡ d t j }t  t  |¡t  |¡gt  |¡t  |¡ gg¡}t  ||¡}	| rÈ|	d| dd¡ 7 }	t
|	ƒ i }
dD ]F}tdd	|d
}| |	j	¡}||
|< |jjdksJ ‚|jdksØJ ‚qØt|
d |
d dd dS )z2Test FastICA is consistent between whiten_solvers.r(   r   r   r%   r=   r>   r@   )r   Úeighr)   ©r.   r-   Zwhiten_solverrL   rM   r–   r   gê-™—q=rJ   N)r   r   r   rQ   rR   r   rS   rT   rU   r   r   Zrandr|   rV   rW   r   r   r   r]   r2   r`   r   )r;   rc   r   rd   re   rf   rg   rh   ri   rj   ZoutsZsolverro   rp   r   r   r   Ú%test_fastica_simple_different_solvers™  s*     0r˜   c              	   C   sš   t j | ¡}| dd¡}||j }tdddd}d}tjt|dD t	t
d	 | |¡ W d
  ƒ n1 sn0    Y  W d
  ƒ n1 sŒ0    Y  d
S )z:Test FastICA eigh solver raises warning for low-rank data.r   r   r   r)   r–   r—   z$There are some small singular valuesrr   )ÚcategoryN)r   r   r   r   r   r   rP   rt   ru   r	   r   r1   )rc   r   ÚAr6   ro   Úmsgr   r   r   Ú"test_fastica_eigh_low_rank_warning¼  s    
rœ   )r
   )&Ú__doc__rX   rN   r   Únumpyr   rP   Zscipyr   Zsklearn.decompositionr   r   r   Zsklearn.decomposition._fasticar   Zsklearn.exceptionsr   Zsklearn.utils._testingr   r	   r   r#   r7   r:   ÚmarkZparametrizerq   rx   r}   r~   r†   Úfilterwarningsr‰   r   r   r•   r˜   rœ   r   r   r   r   Ú<module>   sH   

k
-2
þ 
"