o
    ×tBh;=  ã                   @   sœ  d 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	 ddlm
Z
 ddlmZmZmZ ddlmZ ddlmZ d5d
d„Zdd„ Zdd„ Zdd„ Zej d¡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ej d¡d%d&„ ƒZ d'd(„ Z!ej d)eƒ edd*g¡d+d,„ ƒZ"d-d.„ Z#ej d/g d0¢¡ej d1ddg¡ej d2ddg¡d3d4„ ƒƒƒZ$dS )6z
Test the fastica algorithm.
é    N)Ústats)Úassert_array_equal)Úassert_allclose)ÚFastICAÚfasticaÚPCA)Ú_gs_decorrelation)ÚConvergenceWarningéÿÿÿÿ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/html/riverr-enterprise-integrations-main/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@   zGignore:From version 1.3 whiten='unit-variance' will be used by default.Ú	add_noiseTFc              	   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  t  |¡t  |¡gt  |¡t  |¡ gg¡}	|	 |¡}	t  |	|¡}
| rg|
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  n6t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r)|\}}|t  t  ||¡¡9 }|t  t  ||¡¡9 }| s]t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||  |
j	¡ƒ |j!jdks¹J ‚t jdfD ]%}t||d}t t¡ | "|
j	¡ W d   ƒ n	1 sÝw   Y  q¾t t#¡ tt$dƒd  "|
j	¡ W d   ƒ d S 1 sw   Y  d S )!Nr+   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_teste   s   z#test_fastica_simple.<locals>.g_testÚparallelÚ	deflationÚlogcoshÚexpÚcube©úarbitrary-variancer,   F)Úfunr0   Ú	algorithmr1   )rN   r0   rO   T©r.   r0   r1   F)rN   rO   r0   r1   )rN   rO   gñhãˆµøä>©Úatolç{®Gáz„?)rN   rO   r1   )r   r   )r+   r   zexp(-.5(x^2))r   )rN   )%r   r   r   ÚsinÚlinspacer   ÚtÚrvsÚc_r   r   r3   ÚarrayÚcosr   r   Ú	itertoolsÚproductr   ÚpytestÚraisesÚ
ValueErrorÚtanhr   Úfit_transformÚfloat32r   ÚabsÚsignr   r5   ÚshapeÚ	transformr7   r4   Ú	TypeErrorÚrange)rA   Úglobal_random_seedr:   r    Ú	n_samplesÚs1Ús2ÚsÚphiÚmixingÚmrF   ÚalgosÚnlsÚ	whiteningÚalgoÚnlr0   r>   r7   r?   Úpcar;   rR   Ús1_Ús2_r"   Úsources_funÚicaÚsourcesÚfnr   r   r   Útest_fastica_simpleI   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   rB   FrP   z(Ignoring n_components with whiten=False.©Úmatchr7   )r   r]   ÚwarnsÚUserWarningr4   Úhasattr)rp   rz   Ú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~   rG   ç        )rO   r.   r1   r/   Útol)r   r   r   rU   rT   ÚceilÚpirX   r   r   r   r   r]   r€   r	   r   r4   )
r    rj   rV   rk   rl   rm   ro   rp   rƒ   rz   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   rD   r,   rP   rB   gü©ñÒMbP?rQ   )r   r   r   rU   rT   rˆ   r‰   rX   r   r   r   r   r   r   rc   rd   )rA   r    rj   rV   rk   rl   rm   ro   rp   r>   r7   r?   rw   rx   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   FNrB   r   r-   ÚerrorÚignorer   g    €„.Ar†   rQ   )r   r   r   r2   r3   re   r   ÚwarningsÚcatch_warningsÚsimplefilterÚRuntimeWarningr	   ra   r5   r4   rf   rc   r   r   )ri   r:   r    r;   r/   r0   r.   Ún_components_rz   ÚXtÚica2ÚXt2rR   r   r   r   Útest_fit_transform  s<   	ÿ
ùÿ
û
Ýr–   z/ignore:Ignoring n_components with whiten=False.z+whiten, n_components, expected_mixing_shape))rM   r   ©r   r   )rM   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   rB   g     jø@r†   rQ   )r   r   r   r2   r3   r   rŽ   r   r   r	   ra   r7   re   Úinverse_transformrc   r   r   )r0   r.   Úexpected_mixing_shaperi   r:   rj   r    r;   rz   r“   ÚX2rR   r   r   r   Útest_inverse_transform6  s"   
û
÷rœ   c                  C   s0  d} d}t j d¡}| || f¡}| | d | d ¡}tdd}tjtdd | 	|¡ W d   ƒ n1 s7w   Y  tjtdd t
|d	did
 W d   ƒ n1 sVw   Y  tjtdd t
||d W d   ƒ n1 ssw   Y  tjtdd t
|dd W d   ƒ d S 1 s‘w   Y  d S )NrE   r   r   rB   )r/   z!max_iter should be greater than 1r~   zalpha must be in \[1,2\]Úalpha)Úfun_argsz0w_init has invalid shape.+should be \(3L?, 3L?\))Úw_initz3Invalid algorithm.+must be.+parallel.+or.+deflationÚpizza)rO   )r   r   r   r2   r   r   r]   r^   r_   r4   r   )Ú
n_featuresrj   r    r;   rŸ   Úfastica_estimatorr   r   r   Útest_fastica_errorsc  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'   rB   r,   rP   g      ð?N)
r   r   r   r2   re   r   ra   Úvarr]   Úapprox)r    r;   r.   rz   r“   r   r   r   Ú!test_fastica_whiten_unit_variance{  s   


r¦   rz   )r0   c                 C   sb   t j d¡}| d¡}tjtdd |  |¡ | jdksJ ‚W d  ƒ dS 1 s*w   Y  dS )zSTest FastICA whiten default value deprecation.

    Regression test for #19490
    r   r'   zFrom version 1.3 whiten=r~   rM   N)	r   r   r   r2   r]   r€   ÚFutureWarningr4   Ú_whiten)rz   r    r;   r   r   r   Ú-test_fastica_whiten_default_value_deprecation‰  s   

"þr©   c            	      C   sH  t j d¡} |  d¡}|jd }t|dd}t t¡ | 	|¡}W d  ƒ n1 s+w   Y  t|ddd}t t¡ | 	|¡}W d  ƒ n1 sLw   Y  t|ddd}t
 ¡  t
 d	t¡ | 	|¡}W d  ƒ n1 srw   Y  |jdks~J ‚|jdks…J ‚|jdksŒJ ‚t||ƒ t||ƒ t  |¡t d
¡ks¢J ‚dS )z_Test previous behavior for FastICA whitening (whiten=True)

    Regression test for #19490
    r   r'   rB   )r.   r1   NTrP   rM   rŒ   rS   )r   r   r   r2   re   r   r]   r€   r§   ra   rŽ   r   r   r¨   r   r¤   r¥   )	r    r;   r.   Údefault_icaÚXt_on_defaultrz   r“   Úav_icaÚXt_avr   r   r   Ú+test_fastica_whiten_backwards_compatibility–  s0   

ÿÿÿ
þ

r®   r0   rL   Ú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 )NrE   r   r   )r0   r°   r¯   )r   r   r   r2   r   Úlen)	r0   r¯   r°   r¡   rj   r    r;   Úexpected_lenÚoutr   r   r   Útest_fastica_output_shapeº  s   ÿÿr´   )r
   )%Ú__doc__r[   r]   rŽ   Únumpyr   Úscipyr   Úsklearn.utils._testingr   r   Úsklearn.decompositionr   r   r   Úsklearn.decomposition._fasticar   Úsklearn.exceptionsr	   r   r&   r=   r@   ÚmarkÚfilterwarningsÚparametrizer}   r„   rŠ   r‹   r–   rœ   r£   r¦   r©   r®   r´   r   r   r   r   Ú<module>   sV    
ÿ`
-
2þ!ÿ

$