o
    ‘i,>  ã                   @   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   úw/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/site-packages/sklearn/decomposition/tests/test_fastica.pyÚcenter_and_norm   s   r   c                 C   s”   t j | ¡}t j | dd¡¡\}}}| d¡}t||dƒ |d  ¡ dk s(J ‚| d¡}t||dƒ}t  ||j	¡}|d d… d  ¡ dk sHJ ‚d S )Né
   é   g»½×Ùß|Û=é   )
r   ÚrandomÚRandomStateZlinalgÚsvdÚrandnr   ÚsumÚdotÚT)Úglobal_random_seedÚ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s#J ‚|j	j| ks+J ‚|j
j| ks3J ‚|jj| ks;J ‚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   ÿþr8   c                 C   sd   t j d¡}| d¡j| dd}t|dd|d\}}}|j| ks"J ‚|j| ks)J ‚|j| ks0J ‚d S )Nr   r%   Fr'   r)   r*   )r-   r.   r/   )r   r   r   r0   r1   r   r4   )r6   r   r7   Úk_r5   Ú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Éw   Y  n7tdd|d}| |
j¡}t|||d|d\}}}t t¡ t|t j|d W d   ƒ n	1 sw   Y  |j}|r%|t jkrdnd}tt  t  ||¡|
¡||d t|ƒ |\}}tt  ||¡ƒtt  ||¡ƒkrB|\}}|t  t  ||¡¡9 }|t  t  ||¡¡9 }| svtt  ||¡| d	dd tt  ||¡| d	dd q›tt  ||¡| d	dd tt  ||¡| d	dd q›t|
j|||d\}}}t |||d}| |
j¡}|j!j"d ks³J ‚|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   ƒ d S 1 sw   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/   )rH   r.   rI   T©r,   r.   r/   F)rH   rI   r.   r/   )rH   rI   gñhãˆµøä>©Úatolg{®Gáz„?)rH   rI   r/   ©r   r   ©r)   r   gH¯¼šò×z>)'r   Zfloat32ÚosÚgetenvÚpytestZxfailr   r   ÚsinÚlinspacer   ÚtÚrvsÚc_r   r   r1   ÚarrayÚcosr   r   Ú	itertoolsÚproductr   ÚraisesÚ
ValueErrorÚtanhr   Úfit_transformr   ÚabsÚsignr   r3   ÚshapeÚmaxÚ	transformr5   r2   )r<   r   r6   r   Ú	n_samplesÚs1Ús2ÚsÚphiÚmixingÚmrC   ZalgosZnlsZ	whiteningÚalgoÚnlr.   r9   r5   r:   Zpcar7   rL   Ús1_Ús2_r    Zsources_funÚicaÚsourcesr   r   r   Útest_fastica_simpleH   s”   
ÿÿ 
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 s(w   Y  t|dƒs4J ‚d S )Nr   r>   FrJ   z(Ignoring n_components with whiten=False.©Úmatchr5   )r   rQ   ÚwarnsÚUserWarningr2   Úhasattr)rj   ro   Úwarn_msgr   r   r   Útest_fastica_nowhiten´   s   ÿrx   c                 C   sÄ   t j | ¡}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   ƒ d S 1 s[w   Y  d S )Nr)   r   r&   é   r   z\FastICA did not converge. Consider increasing tolerance or the maximum number of iterations.rr   rD   ç        )rI   r,   r/   r-   Ztol)r   r   r   rS   rR   ÚceilÚpirV   r   r   r   r   rQ   rt   r   r   r2   )r   r   rd   rT   re   rf   rg   ri   rj   rw   ro   r   r   r   Útest_fastica_convergence_fail¿   s"   
ÿ
ÿ"ür}   c                 C   sr  t j | ¡}d}t  dd|¡}t  |¡}t  t  t j| ¡¡}t j||f j}t	|ƒ |\}}| 
dd¡}t  ||¡}	|rG|	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 }|s·tt  ||¡| d	d
d tt  ||¡| d	d
d d S d S )Nr)   r   r&   ry   r   rA   r*   rJ   r>   gü©ñÒMbP?rK   )r   r   r   rS   rR   r{   r|   rV   r   r   r   r   r   r   r_   r`   )r   r<   r   rd   rT   re   rf   rg   ri   rj   r9   r5   r:   rm   rn   r   r   r   Útest_non_square_fasticaÝ   s8   

ÿ þr~   c              	   C   s|  t j | ¡}| d¡ |¡}d}ddgddgfD ]£\}}|dur"|n|jd }t|||dd	}t ¡  t 	d
t
¡ t 	dt¡ | |¡}	W d  ƒ n1 sOw   Y  |jj|dfks^J ‚|	j|jd |fksjJ ‚t|||dd	}
t ¡  t 	d
t
¡ t 	dt¡ |
 |¡ W d  ƒ n1 s’w   Y  |
jj|dfks¡J ‚|
 |¡}|r²t  |¡ ¡ d }nd}t|	||d qd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   rK   )r   r   r   r0   r1   ra   r   ÚwarningsÚcatch_warningsÚsimplefilterÚRuntimeWarningr   r^   r3   r2   rc   r_   r   r   )r   r6   r   r7   r-   r.   r,   Zn_components_ro   ÚXtZica2ZXt2rL   r   r   r   Útest_fit_transform  s<   	ÿ
ùÿ
û
Ýr†   z/ignore:Ignoring n_components with whiten=False.z+whiten, n_components, expected_mixing_shape))rG   r   ©r   r   )rG   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 s3w   Y  |jj|ks@J ‚| |	¡}
|j|
jksMJ ‚||jd krk|r`t  |
¡ ¡ d }nd}t||
|d d S d S )	Nr&   r   )r,   r/   r.   r€   r>   g     jø@rz   rK   )r   r   r   r0   r1   r   r   r‚   rƒ   r   r^   r5   ra   Zinverse_transformr_   r   r   )r.   r,   Zexpected_mixing_shaper   r6   rd   r   r7   ro   r…   ZX2rL   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 s5w   Y  tjtd	d t||d
 W d   ƒ d S 1 sSw   Y  d S )NrB   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   r0   r   rQ   r[   r\   r   )Ú
n_featuresrd   r   r7   r‹   r   r   r   Útest_fastica_errorsi  s   ÿÿ"ýr   c                 C   sT   t j | ¡}| d¡}|jd }t|ddd}| |¡}t  |¡t 	d¡ks(J ‚dS )zTTest unit variance of transformed data using FastICA algorithm.

    Bug #13056
    r%   r>   r*   r   rJ   g      ð?N)
r   r   r   r0   ra   r   r^   ÚvarrQ   Zapprox)r   r   r7   r,   ro   r…   r   r   r   Ú!test_fastica_whiten_unit_variancew  s   


r   r.   rF   Úreturn_X_meanÚreturn_n_iterc           	      C   sj   d}d}t j d¡}| ||f¡}d| | }t|| ||d}t|ƒ|ks'J ‚| s1|d d u s3J ‚d S d S )NrB   r   r   )r.   r‘   r   )r   r   r   r0   r   Úlen)	r.   r   r‘   rŒ   rd   r   r7   Úexpected_lenÚoutr   r   r   Útest_fastica_output_shape…  s   ÿÿr•   c                 C   s8  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  ||¡}	| rd|	d| dd¡ 7 }	t
|	ƒ i }
dD ]"}tdd	|d
}| |	j	¡}||
|< |jjdks‡J ‚|jdksŽJ ‚qlt|
d |
d dd dS )z2Test FastICA is consistent between whiten_solvers.r)   r   r   r&   r>   r?   rA   )r   Úeighr*   ©r/   r.   Zwhiten_solverrM   rN   r–   r   gê-™—q=rK   N)r   r   r   rR   rS   r   rT   rU   rV   r   r   Zrandr|   rW   rX   r   r   r   r^   r3   ra   r   )r<   r   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+ t	t
d	 | |¡ W d
  ƒ n1 s7w   Y  W d
  ƒ d
S W d
  ƒ d
S 1 sOw   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   rQ   rt   ru   r	   r   r2   )r   r   ÚAr7   ro   Úmsgr   r   r   Ú"test_fastica_eigh_low_rank_warning¼  s   
üÿ"ÿrœ   )r
   )&Ú__doc__rY   rO   r   Únumpyr   rQ   Zscipyr   Zsklearn.decompositionr   r   r   Zsklearn.decomposition._fasticar   Zsklearn.exceptionsr   Zsklearn.utils._testingr   r	   r   r$   r8   r;   ÚmarkZparametrizerq   rx   r}   r~   r†   Úfilterwarningsr‰   r   r   r•   r˜   rœ   r   r   r   r   Ú<module>   sJ    

k
-
2þ 
"