U
    f»{j©4  ã                   @   s  d dl mZ d dlZd dlZd dlmZmZm	Z	 d dl
mZmZmZmZ d dlmZmZmZ d dlmZ e e e¡ddddd	¡Ze ed
¡Ze ed¡Zd\ZZeddd�Zd\ZZ d'dd„Z!d(dd„Z"ej#j$dd„ ƒZ%edd„ ƒZ&edd„ ƒZ'dd „ Z(d!d"„ Z)d#d$„ Z*d%d&„ Z+dS ))é    N)Úassert_array_almost_equalÚassert_array_equalÚassert_equal)ÚioÚEpochsÚread_eventsÚ
pick_types)ÚCSPÚ	_ajd_phamÚSPoC)Úrequires_sklearnz..r   ZtestsÚdataztest_raw.fifztest-eve.fif)gš™™™™™É¿ç      à?é   é   )Úaud_lÚvis_l)r   é   éd   é
   é*   c                 C   sŽ   t j |¡}t j | ||¡¡d }| ||d¡}|dd…df  t  t  | ¡¡j9  < |dd…dd…f  d9  < t  	||¡ 
d¡}||fS )zìSimulate data according to an instantaneous mixin model.

    Data are simulated in the statistical source space, where one source is
    modulated according to a target variable, before being mixed with a
    random mixing matrix.
    r   é2   Nr   g{®Gáz„?)r   r   é   )ÚnpÚrandomÚRandomStateZlinalgZsvdÚrandnÚ
atleast_2dÚsqrtÚTÚdotZ	transpose)ÚtargetZn_trialsÚ
n_channelsZrandom_stateÚrsZ
mixing_matÚSÚX© r&   úZ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/decoding/tests/test_csp.pyÚsimulate_data   s    &r(   ©Úclass_aÚclass_bc                 C   sþ  t jddddddddddddddddgddddddddddddddddgddddddddddddddddgddddddddddddddddggtd�d d }t jddddddddddddddddgddddddddddddddddgddddddddddddddddgddddddddddddddddggtd�d d }|ddd…f  d9  < |ddd…f  d9  < |ddd…f  d9  < |ddd…f  d9  < t  dd	d
dgd	dd	d
gd
d	dd	gdd
d	dgg¡}|| }|| }t  ||g¡}t  | ¡}||fS )z’Generate a small deterministic toy data set.

    Four independent sources are modulated by the target class and mixed
    into signal space.
    r   r   )Zdtyper   Nr   é   ç      ð?gš™™™™™é?g333333ã?gš™™™™™Ù?)r   ÚarrayÚfloatÚstack)ÚclassesZ	sources_aZ	sources_bZmixingZ	x_class_aZ	x_class_bÚxÚyr&   r&   r'   Údeterministic_toy_data2   sH    &"""ýüüü&"""ýüüü


ý
r4   c                  C   sN  t jtdd�} ttƒ}t| jdddddd�}|ddd… }| jg dd	� t| |t	t
t|d
ddd�	}| ¡ }|jd }|jdd…df }tjttddd� dD ]0}t|dd�}t t|j||jdd…df ¡ qœdD ]}t|dd� qÒdD ]}	tjtt|	dd� qètjtdd�� tdd� W 5 Q R X dD ]}	t|	dd� �q(d}
dD ],}t|
|d�}| ||jdd…df ¡ �qDtt|jƒ|
ƒ tt|jƒ|
ƒ | ||¡}| |¡}|jd |
k�s¼t‚|jj||fk�sÒt‚|jj||fk�sèt‚t||ƒ t t|j|t  |j¡¡ t t|j||¡ t t|j|¡ |jdd� d}t !|
¡}|j"|j#fD ]}||j|dd|d� �qTt| |t
t|t$ddddd �d
ddd!�	}| ¡ }|jd }|jd }dD ]h}	t|
|	dd"�}| ||jdd…df ¡ |¡ tt|j%ƒdƒ t&|jj||gƒ t&|jj||gƒ �q¶d}
|j'd#k�s4t‚t|ƒ|
g}t$ƒ }d$D ]V}t|
|dd%�}|j(|k�slt‚| ||jdd…df ¡}t&|j|ƒ ||t)|ƒ< �qJt|d& |d' ƒ t *|d' |d(  d ¡d)k�sØt‚tjttd#dd*� td+dd,�}|j'd+k�st‚d-D ]}tjttd+|dd.� �q
d}
t|
d+dd/�}| ||jdd…df ¡ |¡}t|ƒ|
|jd g}t&|j|ƒ t +d0gd1 dgd1  ¡}t,|ƒ\}}dD ]¦}	td|	dd"�}| ||¡ t -t .|jd2dd…f j/|dd…d2f ¡d3 ¡}t -|¡d4k�st‚| |¡}t -t .|dd…d2f |¡d3 ¡}t -|¡d5k�s¢t‚�q¢dS )6z1Test Common Spatial Patterns algorithm on epochs.F)ÚpreloadTÚbads©ÚmegZstimZecgZeogÚexcluder   é   r   )Zremove_existing©Nr   )ÚpicksÚbaseliner5   Úprojr   NéÿÿÿÿÚfoo)Ún_componentsÚ
norm_trace)r@   gš™™™™™¹¿gš™™™™™ñ?©ÚregrB   )ÚoasÚledoit_wolfr   r   r-   )r@   N)Úcov_estrB   zinstance of bool)Úmatch)rB   )ÚconcatÚepoch)TFÚmag)r8   )ZRdBuT)Ú
componentsÚresÚshowÚcmapr,   )r   Zaud_rr   Zvis_r)ÚtminÚtmaxr<   Úevent_idr=   r>   r5   )rA   rG   rB   Úaverage_power)NTF)rA   ÚlogrB   ÚNoneÚTrueÚFalser-   )Útransform_intorT   Ú	csp_space)rX   rB   )r@   TF)rX   rT   rB   )rA   rX   rB   r   r   r   ©r   r   ç®Gáz®ï?gffffffî?)0r   Úread_raw_fifÚ	raw_fnamer   Ú
event_namer   ÚinfoZadd_projr   rR   rP   rQ   Úget_dataÚshapeÚeventsÚpytestÚraisesÚ
ValueErrorr	   ÚfitÚ	TypeErrorr   ÚlenZmean_Zstd_Úfit_transformÚ	transformÚAssertionErrorÚfilters_Ú	patterns_r   r   Ú
zeros_likeZarangeZplot_patternsZplot_filtersÚdictZ_classesr   rX   rT   ÚstrÚsumr.   r(   ÚabsÚcorrcoefr   )Úrawrb   r<   ÚepochsÚepochs_datar"   r3   rD   ÚcsprG   rA   rB   r%   ÚsourcesrO   rL   ZplotZfeature_shapeZX_transrT   ÚXtÚAÚcorrÚoutr&   r&   r'   Útest_cspX   sÊ     ÿ  ÿ
"


ÿ
  þ

 $ÿ
ÿ 2
"r}   c               
   C   sd  t  t¡} ttƒ}t| jdddddd�}|ddd… }t| |tt	t
|ddd	�}| ¡ }|jd }d}d
dddg}|D ]ê}t||dd
d�}	|	 ||jd
d
…df ¡ |jd
d
…df }
|	 ||
¡}|	jj||fksÔt‚|	jj||fksèt‚t|	 ||
¡ |¡|ƒ t t|	j|t |j¡¡ t t|	j||
¡ t t|	j|¡ ||	_|	 |¡}|jd |kstt‚qtd
S )zDTest Common Spatial Patterns algorithm using regularized covariance.TFr6   r7   r   é   r   r;   )r<   r=   r5   Ngš™™™™™©?rF   rE   )rA   rD   rB   Zrankr?   )r   r\   r]   r   r^   r   r_   r   rR   rP   rQ   r`   ra   r	   rf   rb   ri   rl   rk   rm   r   rj   rc   rd   re   r   rn   rA   )rt   rb   r<   ru   rv   r"   rA   Zreg_covrD   rw   r3   r%   rx   r&   r&   r'   Útest_regularized_cspÕ   sJ    
 ÿ ÿ
ÿÿÿ
ÿ
r   c                  C   sb   ddl m}  ddlm} tddd�}| ƒ }|d|fd|fgƒ}|jd	d
� | ¡ d d	ks^t‚dS )z Test if CSP works in a pipeline.r   )ÚSVC)ÚPipeliner   FrC   r	   r€   gš™™™™™É?)ÚCSP__regr‚   N)Zsklearn.svmr€   Zsklearn.pipeliner�   r	   Z
set_paramsÚ
get_paramsrk   )r€   r�   rw   ZsvcÚpiper&   r&   r'   Útest_csp_pipelineú   s    r…   c            
   
   C   sÖ   d\} }t j d¡}dd| | |¡  }d| ||¡ d }|t  t  t  |d d¡¡¡j }t  	| ||f¡}t
| ƒD ](}t  t  |t  || ¡¡|j¡||< qvt|ƒ\}}ddd	gd
ddgdddgg}	t||	ƒ dS )z'Test approximate joint diagonalization.)r   r   r   g       @gš™™™™™¹?r   r   gM9éÀg¯Ã‚%þÀgO’Tfëá@gvtä:æ?g©`3–tÒè?g,BÍ}º—ò¿gsÛÙšöâ¿gª£È™û*ã¿gWÃý'ð?N)r   r   r   r   Úrandr   r   rq   r   ÚemptyÚranger    Zdiagr
   r   )
Zn_timesr"   ÚseedZdiagsrz   ZcovmatsÚiÚVÚDZV_matlabr&   r&   r'   Útest_ajd  s    "&þr�   c                  C   s”  t j ddd¡} t j d¡}tdd�}| | |¡ | | ¡}t|jddgƒ tddd�}| | |¡ | | ¡}t|jdddgƒ t|jjddgƒ t|j	jddgƒ t
 t|j| |d ¡ t
jttdd	� t j d
¡}| d¡d d }t|ƒ\} }tdd�}| | |¡ t  t  |j	ddd…f j|dd…df ¡d ¡}t  |¡dk�sPt‚| | ¡}t  t  |dd…df |¡d ¡}t  |¡dk�s�t‚dS )z
Test SPoC.r   é   r,   )rA   rY   )rA   rX   r   rJ   )rG   r   r   r   r   NrZ   r[   g333333ë?)r   r   r   r   rf   rj   r   ra   rl   rm   rc   rd   re   rg   r   r†   r(   rr   rs   r   rk   )r%   r3   Zspocry   r#   rz   r{   r|   r&   r&   r'   Ú	test_spoc  s0    



2
"r�   c                  C   s‚   t ddgƒ\} }tdddd�}| | |¡}|d |d  }t ddgƒ\} }tdddd�}| | |¡}|d |d  }t||ƒ d	S )
z1Test that CSP is symmetric when swapping classes.r*   r+   FrS   T)rB   rX   rT   r   r   N)r4   r	   ri   r   )r2   r3   rw   Z	log_powerZlog_power_ratio_abZlog_power_ratio_bar&   r&   r'   Útest_csp_twoclass_symmetryD  s    ÿr�   c               	   C   sš   t ddgƒ\} }tjttdd� tdd�}t t¡� | t d¡ddd	g¡ W 5 Q R X tdd� | |¡j}td
d� | |¡j}t	||ddddg ƒ dS )z3Test that CSP component ordering works as expected.r*   r+   Úinvalid)Zcomponent_orderZ	alternate)r   r   r   ÚaÚbÚcZmutual_infor   r   r   r   N)
r4   rc   rd   re   r	   rf   r   Zzerosrm   r   )r2   r3   rw   Zp_altZp_mutr&   r&   r'   Útest_csp_component_orderingT  s    
"r•   )r   r   r   )r)   ),Úos.pathÚpathÚopÚnumpyr   rc   Znumpy.testingr   r   r   Zmner   r   r   r   Zmne.decoding.cspr	   r
   r   Z	mne.utilsr   ÚjoinÚdirnameÚ__file__Údata_dirr]   r^   rP   rQ   ro   rR   ÚstartÚstopr(   r4   ÚmarkZslowtestr}   r   r…   r�   r�   r�   r•   r&   r&   r&   r'   Ú<module>   s0   

&
|
$
)