U
    f»{j¸  ã                   @   sª   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	 d dl
mZ ddd	„Zed
d„ ƒZedd„ ƒZdd„ Zedd„ ƒZe j dddg¡dd„ ƒZddd„ZdS )é    N)Úassert_almost_equal)Ústats)Úlinalg)Úinfomax)Úrequires_sklearnéÿÿÿÿc                 C   s0   t  | |¡} | | jdd�8 } | | jdd� } dS )a
  Center and norm 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rollaxisZmeanZstd)Úxr   © r   úc/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/preprocessing/tests/test_infomax.pyÚcenter_and_norm   s    r   c                  C   sp  t j d¡ 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  ||¡}t
|ƒ tƒ  |j	¡}t|ddd	�}t  ||j	¡}	t
|	ƒ |	\}
}tt  |
|¡ƒtt  |
|¡ƒk�r|	\}}
|
t  t  |
|¡¡9 }
|t  t  ||¡¡9 }tt  |
|¡|  ddd
� tt  ||¡|  ddd
� dS )z,Test the infomax algorithm blowup condition.r   éd   é   é   ©Úsizeç333333ã?Tçš™™™™™¹?)ÚextendedZl_rate©ÚdecimalN)r	   ÚrandomÚseedÚsinÚlinspacer   ÚtÚrvsÚc_ÚTr   ÚarrayÚcosÚdotÚ_get_pcaÚfit_transformr   ÚabsÚsignr   )Ú	n_samplesÚs1Ús2ÚsÚphiÚmixingÚmÚXÚk_Ús_Ús1_Ús2_r   r   r   Útest_infomax_blowup#   s0     ÿ"r3   c               	   C   sî  t j d¡} t j d¡ 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¡}dD �]B}t  ||¡}|rÎ|d	|  d|¡ 7 }t|ƒ d
dg}	|	D �]}
tƒ  |j
¡}t||
d�}t  ||j
¡}t|ƒ |\}}tt  ||¡ƒtt  ||¡ƒk�rJ|\}}|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âq¤dS )z/Test the infomax algorithm on very simple data.r   iô  r   r   r   r   r   ©FTr   TF)r   r   N)r	   r   ÚRandomStater   r   r   r   r   r   r   r   r   r    r!   r"   Úrandnr#   r$   r   r%   r&   r   )Úrngr'   r(   r)   r*   r+   r,   Ú	add_noiser-   ZalgosÚalgor.   r/   r0   r1   r2   r   r   r   Útest_infomax_simpleJ   sB     ÿ

"r:   c                  C   sl   t j d¡} t jdddgdddgdd	d
ggt jd�}t| d|dd�}t| d|dd�}t||ƒ t||ƒ dS )z4Test the infomax algorithm w/initial weights matrix.©é   r   r   r   r<   é   é   é   é   é   é	   )Zdtyper   T)Úmax_iterÚweightsr   FN)r	   r   r    Zfloat64r   r   )r.   rD   Zw1Zw2r   r   r   Útest_infomax_weights_iniz   s    (
rE   c                  C   s–  t j d¡} d}t  dd|¡}t  |¡}t  t  t j| ¡¡}t j||f j}t	|ƒ |\}}d}|  
|d¡}dD �]}t  ||¡}	|rœ|	d|  
||¡ 7 }	t	|	ƒ |	j}	t| ƒ |	¡}	t|	| dd	�}
t  |
|	j¡}t |
j¡}t|	|j |¡ƒ t	|ƒ |\}}tt  ||¡ƒtt  ||¡ƒk�r,|\}}|t  t  ||¡¡9 }|t  t  ||¡¡9 }|srtt  ||¡| d
dd� tt  ||¡| d
dd� qrdS )zTest non-square infomax.r   éÈ   r   r?   r   r4   r   T)Úrandom_stater   r   r   N)r	   r   r5   r   r   ÚceilÚpir   r   r   r6   r"   r#   r$   r   r   Zpinvr   r%   r&   )r7   r'   r   r(   r)   r*   Z
n_observedr,   r8   r-   Z	unmixing_r0   Zmixing_r1   r2   r   r   r   Útest_non_square_infomax†   s<    

"rJ   Úreturn_n_iterTFc                 C   sX   t j d¡}d}t||d| d�}| rDt|tƒs2t‚|d |ksTt‚nt|t jƒsTt‚dS )zTest the return_n_iter kwarg.r;   r   T)rC   r   rK   N)r	   r   r   Ú
isinstanceÚtupleÚAssertionErrorZndarray)rK   r.   rC   Úrr   r   r   Útest_infomax_n_iter·   s    ÿrP   c                 C   s   ddl m} |ddd| d�S )Nr   )ÚPCAr   TZ
randomized)Zn_componentsZwhitenZ
svd_solverrG   )Zsklearn.decompositionrQ   )r7   rQ   r   r   r   r#   Æ   s    ÿr#   )r   )N)ZpytestÚnumpyr	   Znumpy.testingr   Zscipyr   r   Zmne.preprocessing.infomax_r   Z	mne.utilsr   r   r3   r:   rE   rJ   ÚmarkZparametrizerP   r#   r   r   r   r   Ú<module>   s"   

&
/
0
