U
    ‘Ç-e<  ã                
   @   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 d7d	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d d!d"d#d$d%g¡d&d'„ ƒƒZd(d)„ Z d*d+„ Z!ej d,d-d.dg¡ej d/ddg¡ej d0ddg¡d1d2„ ƒƒƒZ"ej dddg¡d3d4„ ƒZ#d5d6„ Z$dS )8z
Test the fastica algorithm.
é    N)Ústats)ÚPCAÚFastICAÚfastica)Ú_gs_decorrelation)ÚConvergenceWarning)Úassert_allcloseéÿÿÿÿ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   úi/var/www/html/Darija-Ai-Train/env/lib/python3.8/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 sPt‚|  d¡}t||dƒ}t  	||j
¡}|d d… d  ¡ dk st‚d S )Nr   é
   é   g»½×Ùß|Û=é   )r   ÚrandomÚRandomStateZlinalgÚsvdÚrandnr   ÚsumÚAssertionErrorÚ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sFt	‚|j
j| ksVt	‚|jj| ksft	‚|jj| ksvt	‚d S )	Nr   ©éd   r   F©Úcopyr   éè  úunit-variance©Ún_componentsÚmax_iterÚwhitenÚrandom_state)r   r   r   Úrandom_sampleÚastyper   ÚfitÚcomponents_Údtyper   Úmixing_Zmean_Z
whitening_)Úglobal_dtyper   ÚXZficar   r   r   Útest_fastica_attributes_dtypes0   s       ÿþr7   c                 C   sd   t j d¡}| d¡j| dd}t|dd|d\}}}|j| ksDt‚|j| ksRt‚|j| ks`t‚d S )Nr   r$   Fr&   r(   r)   )r,   r-   r.   )r   r   r   r/   r0   r   r3   r   )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}dddg}t |||¡D ]Ä\}}}|rt|
j||||d\}}}t t¡ t|
jt j||d W 5 Q R X nXtdd|d}| |
j¡}t|||d|d\}}}t t¡ t|t j|d W 5 Q R X |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 n4tt  ||¡| d	dd tt  ||¡| d	dd q8t|
j|||d \}}}t |||d }| |
j¡}|j!j"d!ksDt#‚|j"d"ksTt#‚t||ƒ t  $t  |¡¡|t jkr|dnd# }t|| %|
j¡|d |j&j"d!ksªt#‚t t j|d}t t¡ | '|
j¡ W 5 Q R X 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_testl   s    z#test_fastica_simple.<locals>.g_testÚparallelZ	deflationZlogcoshÚexpZcubeúarbitrary-variancer)   F)Úfunr-   Ú	algorithmr.   )rF   r-   rG   T©r+   r-   r.   )rF   rG   r-   r.   )rF   rG   gñhãˆµøä>©Úatolg{®Gáz„?)rF   rG   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   Úshaper   Ú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   rJ   Ús1_Ús2_r   Zsources_funÚicaÚsourcesr   r   r   Útest_fastica_simpleG   s¨    ÿþýüÿ 
0

    ÿ     ÿ"   ÿ
$rp   c               	   C   sX   ddgddgg} t dddd}d}tjt|d | | ¡ W 5 Q R X t|dƒsTt‚d S )Nr   r=   FrH   z(Ignoring n_components with whiten=False.©Úmatchr4   )r   rO   ÚwarnsÚUserWarningr1   Úhasattrr   )ri   rn   Úwarn_msgr   r   r   Útest_fastica_nowhiten³   s    rw   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 5 Q R X d S )Nr   r(   r%   é   r   z\FastICA did not converge. Consider increasing tolerance or the maximum number of iterations.rq   rC   ç        )rG   r+   r.   r,   Ztol)r   r   r   rQ   rP   ÚceilÚpirT   r   r   r   r   rO   rs   r   r   r1   )
r   rc   rR   rd   re   rf   rh   ri   rv   rn   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%   rx   r   r@   r)   rH   r=   gü©ñÒMbP?rI   )r   r   r   rQ   rP   rz   r{   rT   r   r   r   r   r   r   r]   r^   )r;   r   rc   rR   rd   re   rf   rh   ri   r8   r4   r9   rl   rm   r   r   r   Útest_non_square_fasticaÜ   s<    
   ÿ"r}   c              
   C   sZ  t j | ¡}| d¡ |¡}d}ddgddgfD ]"\}}|dk	rF|n|jd }t|||dd	}t ¡ ( t 	d
t
¡ t 	dt¡ | |¡}	W 5 Q R X |jj|dfksªt‚|	j|jd |fksÂt‚t|||dd	}
t ¡ ( t 	d
t
¡ t 	dt¡ |
 |¡ W 5 Q R X |
jj|dfkst‚|
 |¡}|rBt  |¡ ¡ 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    €„.Ary   rI   )r   r   r   r/   r0   r_   r   ÚwarningsÚcatch_warningsÚsimplefilterÚRuntimeWarningr   r\   r2   r   r1   ra   r]   r   r   )rb   r5   r   r6   r,   r-   r+   Zn_components_rn   ÚXtZica2ZXt2rJ   r   r   r   Útest_fit_transform
  sB    	   ÿ
   ÿ

r…   z/ignore:Ignoring n_components with whiten=False.z+whiten, n_components, expected_mixing_shape)rE   r   ©r   r   )rE   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 5 Q R X |jj|kslt‚| |	¡}
|j|
jks†t‚||jd kr¾|r¬t  |
¡ ¡ d }nd}t||
|d d S )	Nr%   r   )r+   r.   r-   r   r=   g     jø@ry   rI   )r   r   r   r/   r0   r   r€   r   r‚   r   r\   r4   r_   r   Zinverse_transformr]   r   r   )r-   r+   Zexpected_mixing_shaperb   r5   rc   r   r6   rn   r„   ZX2rJ   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 5 Q R X tjtd	d t||d
 W 5 Q R X d S )NrA   r   r   r=   zalpha must be in \[1,2\]rq   Úalpha)Zfun_argsz0w_init has invalid shape.+should be \(3L?, 3L?\))Úw_init)	r   r   r   r/   r   rO   rY   rZ   r   )Ú
n_featuresrc   r   r6   rŠ   r   r   r   Útest_fastica_errorsh  s     ÿrŒ   c                  C   sT   t j d¡} |  d¡}|jd }t|ddd}| |¡}t  |¡t 	d¡ksPt
‚dS )zTTest unit variance of transformed data using FastICA algorithm.

    Bug #13056
    r   r$   r=   r)   rH   g      ð?N)r   r   r   r/   r_   r   r\   ÚvarrO   Zapproxr   )r   r6   r+   rn   r„   r   r   r   Ú!test_fastica_whiten_unit_variancev  s    


rŽ   r-   rE   r)   Úreturn_X_meanÚreturn_n_iterc           	      C   sf   d}d}t j d¡}| ||f¡}d| | }t|| ||d}t|ƒ|ksNt‚| sb|d d ksbt‚d S )NrA   r   r   )r-   r   r   )r   r   r   r/   r   Úlenr   )	r-   r   r   r‹   rc   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t‚|jdksØt‚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_solverrK   rL   r•   r   gê-™—q=rI   N)r   r   r   rP   rQ   r   rR   rS   rT   r   r   Zrandr{   rU   rV   r   r   r   r\   r2   r_   r   r   )r;   rb   r   rc   rd   re   rf   rg   rh   ri   ZoutsZsolverrn   ro   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 | 	|¡ W 5 Q R X 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 valuesrq   N)
r   r   r   r   r   r   rO   rs   rt   r1   )rb   r   ÚAr6   rn   Úmsgr   r   r   Ú"test_fastica_eigh_low_rank_warning»  s    
rš   )r	   )%Ú__doc__rW   rM   r€   Únumpyr   rO   Zscipyr   Zsklearn.decompositionr   r   r   Zsklearn.decomposition._fasticar   Zsklearn.exceptionsr   Zsklearn.utils._testingr   r   r#   r7   r:   ÚmarkZparametrizerp   rw   r|   r}   r…   Úfilterwarningsrˆ   rŒ   rŽ   r”   r—   rš   r   r   r   r   Ú<module>   sT   

k
-2
úþ 
"