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)ÚnpÚrollaxisÚmeanÚstd)Úxr   © r   ú‰/var/www/www-root/data/www/176.119.141.140/sports-predictor/venv/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ÚRandomStateÚ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_Ú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-   )r0   r1   r2   )r   r   r   r3   r4   r   r7   )r;   r!   r<   Úk_r8   Ús_r   r   r   Útest_fastica_return_dtypes=   s   ÿrA   Ú	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)   é   ©Úsizer2   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)Úfunr1   Ú	algorithmr2   )rS   r1   rT   T©r/   r1   r2   F)rS   rT   r1   r2   )rS   rT   gñhãˆµøä>©Úatolg{®Gáz„?)rS   rT   r2   ©r   r   ©r,   r   gH¯¼šò×z>)'r   Úfloat32ÚosÚgetenvÚpytestÚxfailr   r   ÚsinÚlinspacer   ÚtÚrvsÚc_r   r   r4   ÚarrayÚcosr   r   Ú	itertoolsÚproductr   ÚraisesÚ
ValueErrorÚtanhr   Úfit_transformr   ÚabsÚsignr   r6   ÚshapeÚmaxÚ	transformr8   r5   )rB   r    r;   r!   Ú	n_samplesÚs1Ús2ÚsÚphiÚmixingÚmrK   ÚalgosÚnlsÚ	whiteningÚalgoÚnlr1   r?   r8   r@   Úpcar<   rW   Ú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   rF   FrU   z(Ignoring n_components with whiten=False.©Úmatchr8   )r   r]   ÚwarnsÚUserWarningr5   Úhasattr)rw   r   Úwarn_msgr   r   r   Útest_fastica_nowhiten´   s   ÿrŠ   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.r„   rL   ç        )rT   r/   r2   r0   Útol)r   r   r   r`   r_   ÚceilÚpirc   r   r   r   r   r]   r†   r   r   r5   )r    r!   rq   ra   rr   rs   rt   rv   rw   r‰   r   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)   r‹   r   rI   r-   rU   rF   gü©ñÒMbP?rV   )r   r   r   r`   r_   rŽ   r   rc   r   r   r   r   r   r   rl   rm   )r    rB   r!   rq   ra   rr   rs   rt   rv   rw   r?   r8   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   FNrF   r   r.   ÚerrorÚignorer   g    €„.ArŒ   rV   )r   r   r   r3   r4   rn   r   ÚwarningsÚcatch_warningsÚsimplefilterÚRuntimeWarningr   rk   r6   r5   rp   rl   r   r   )r    r;   r!   r<   r0   r1   r/   Ún_components_r   ÚXtÚica2ÚXt2rW   r   r   r   Útest_fit_transform  s<   	ÿ
ùÿ
û
Ýrœ   z/ignore:Ignoring n_components with whiten=False.z+whiten, n_components, expected_mixing_shape))rR   r   ©r   r   )rR   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/   r2   r1   r“   rF   g     jø@rŒ   rV   )r   r   r   r3   r4   r   r”   r•   r–   r   rk   r8   rn   Úinverse_transformrl   r   r   )r1   r/   Úexpected_mixing_shaper    r;   rq   r!   r<   r   r™   ÚX2rW   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 )NrJ   r   r   rF   zalpha must be in \[1,2\]r„   Úalpha)Úfun_argsz0w_init has invalid shape.+should be \(3L?, 3L?\))Úw_init)	r   r   r   r3   r   r]   rh   ri   r   )Ú
n_featuresrq   r!   r<   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(   rF   r-   r   rU   g      ð?N)
r   r   r   r3   rn   r   rk   Úvarr]   Úapprox)r    r!   r<   r/   r   r™   r   r   r   Ú!test_fastica_whiten_unit_variancew  s   


rª   r1   rQ   Ú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 )NrJ   r   r   )r1   r¬   r«   )r   r   r   r3   r   Úlen)	r1   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)   rF   rG   rI   )r   Úeighr-   ©r2   r1   Úwhiten_solverrX   rY   r±   r   gê-™—q=rV   N)r   r   r   r_   r`   r   ra   rb   rc   r   r   Úrandr   rd   re   r   r   r   rk   r6   rn   r   )rB   r    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   r5   )r    r!   ÚAr<   r   Úmsgr   r   r   Ú"test_fastica_eigh_low_rank_warning¼  s   
üÿ"ÿr»   )r
   )&Ú__doc__rf   r[   r”   Únumpyr   r]   Úscipyr   Úsklearn.decompositionr   r   r   Úsklearn.decomposition._fasticar   Úsklearn.exceptionsr   Úsklearn.utils._testingr   r	   r   r'   r>   rA   ÚmarkÚparametrizerƒ   rŠ   r   r‘   rœ   Úfilterwarningsr¢   r§   rª   r°   r·   r»   r   r   r   r   Ú<module>   sJ    

k
-
2þ 
"