o
    Ü?Hh©=  ã                   @   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)ÚnpÚrollaxisÚmeanÚstd)Úxr   © r   úh/home/air/sanwanet/gpt-api/venv/lib/python3.10/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 s(J ‚|  d¡}t||dƒ}t  ||j	¡}|d d… d  ¡ dk sHJ ‚d S )Nr   é
   é   g»½×Ùß|Û=é   )
r   ÚrandomÚRandomStateÚ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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_Úmean_Ú
whitening_)Úglobal_dtyper    ÚXÚficar   r   r   Útest_fastica_attributes_dtypes1   s   ÿþr=   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/   r0   r1   )r   r   r   r2   r3   r   r6   )r:   r    r;   Úk_r7   Ú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é   ÚDISTRIBÚ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(   é   ©Úsizer1   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ÚparallelÚ	deflationÚlogcoshÚexpÚcube©úarbitrary-variancer,   F)Úfunr0   Ú	algorithmr1   )rR   r0   rS   T©r.   r0   r1   F)rR   rS   r0   r1   )rR   rS   gñhãˆµøä>©Úatolg{®Gáz„?)rR   rS   r1   ©r   r   ©r+   r   gH¯¼šò×z>)'r   Úfloat32ÚosÚgetenvÚpytestÚxfailr   r   ÚsinÚlinspacer   ÚtÚrvsÚc_r   r   r3   ÚarrayÚcosr   r   Ú	itertoolsÚproductr   ÚraisesÚ
ValueErrorÚtanhr   Úfit_transformr   ÚabsÚsignr   r5   ÚshapeÚmaxÚ	transformr7   r4   )rA   Úglobal_random_seedr:   r    Ú	n_samplesÚs1Ús2ÚsÚphiÚmixingÚmrJ   ÚalgosÚnlsÚ	whiteningÚalgoÚnlr0   r>   r7   r?   Úpcar;   rV   Ús1_Ús2_r"   Úsources_funÚicaÚsourcesr   r   r   Útest_fastica_simpleH   s”   
ÿÿ 
0
ÿÿ€
ÿÿ"
ÿ
$$ÿrƒ   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   rE   FrT   z(Ignoring n_components with whiten=False.©Úmatchr7   )r   r\   ÚwarnsÚUserWarningr4   Úhasattr)rw   r   Úwarn_msgr   r   r   Útest_fastica_nowhiten´   s   ÿrŠ   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   ƒ 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.r„   rK   ç        )rS   r.   r1   r/   Útol)r   r   r   r_   r^   ÚceilÚpirb   r   r   r   r   r\   r†   r   r   r4   )
r    rq   r`   rr   rs   rt   rv   rw   r‰   r   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  ||¡}| 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(   r‹   r   rH   r,   rT   rE   gü©ñÒMbP?rU   )r   r   r   r_   r^   rŽ   r   rb   r   r   r   r   r   r   rk   rl   )rA   r    rq   r`   rr   rs   rt   rv   rw   r>   r7   r?   r~   r   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   FNrE   r   r-   ÚerrorÚignorer   g    €„.ArŒ   rU   )r   r   r   r2   r3   rm   r   ÚwarningsÚcatch_warningsÚsimplefilterÚRuntimeWarningr   rj   r5   r4   ro   rk   r   r   )rp   r:   r    r;   r/   r0   r.   Ún_components_r   ÚXtÚica2ÚXt2rV   r   r   r   Útest_fit_transform  s<   	ÿ
ùÿ
û
Ýrœ   z/ignore:Ignoring n_components with whiten=False.z+whiten, n_components, expected_mixing_shape))rQ   r   ©r   r   )rQ   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.   r1   r0   r“   rE   g     jø@rŒ   rU   )r   r   r   r2   r3   r   r”   r•   r–   r   rj   r7   rm   Úinverse_transformrk   r   r   )r0   r.   Úexpected_mixing_shaperp   r:   rq   r    r;   r   r™   ÚX2rV   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 )NrI   r   r   rE   zalpha must be in \[1,2\]r„   Úalpha)Úfun_argsz0w_init has invalid shape.+should be \(3L?, 3L?\))Úw_init)	r   r   r   r2   r   r\   rg   rh   r   )Ú
n_featuresrq   r    r;   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s(J ‚dS )zTTest unit variance of transformed data using FastICA algorithm.

    Bug #13056
    r   r'   rE   r,   rT   g      ð?N)
r   r   r   r2   rm   r   rj   Úvarr\   Úapprox)r    r;   r.   r   r™   r   r   r   Ú!test_fastica_whiten_unit_variancew  s   


rª   r0   rP   Ú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 )NrI   r   r   )r0   r¬   r«   )r   r   r   r2   r   Úlen)	r0   r«   r¬   r¦   rq   r    r;   Ú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(   rE   rF   rH   )r   Úeighr,   ©r1   r0   Úwhiten_solverrW   rX   r±   r   gê-™—q=rU   N)r   r   r   r^   r_   r   r`   ra   rb   r   r   Úrandr   rc   rd   r   r   r   rj   r5   rm   r   )rA   rp   r    rq   rr   rs   rt   ru   rv   rw   ÚoutsÚsolverr   r‚   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 valuesr„   )ÚcategoryN)r   r   r   r   r   r   r\   r†   r‡   r	   r   r4   )rp   r    ÚAr;   r   Úmsgr   r   r   Ú"test_fastica_eigh_low_rank_warning¼  s   
üÿ"ÿr»   )r
   )&Ú__doc__re   rZ   r”   Únumpyr   r\   Úscipyr   Úsklearn.decompositionr   r   r   Úsklearn.decomposition._fasticar   Úsklearn.exceptionsr   Úsklearn.utils._testingr   r	   r   r&   r=   r@   ÚmarkÚparametrizerƒ   rŠ   r   r‘   rœ   Úfilterwarningsr¢   r§   rª   r°   r·   r»   r   r   r   r   Ú<module>   sJ    

k
-
2þ 
"