U
    f»{jŠ4  ã                   @   sœ   d 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mZmZ ddd„Ze
ƒ dd„ ƒZe
ƒ dd„ ƒZddd„Zdd„ ZG dd„ deƒZdS )zTimeDelayingRidge class.é    Né   )ÚBaseEstimatoré   )Ú!_setup_cuda_fft_multiply_repeated)Únext_fast_len)Újit)ÚwarnÚProgressBarÚloggerFTc           %   
   C   s8  |rVt j| dd�}t j|dd�}| jdkrD|jdd�}t j|dd�}| | } || }nd }}| jdkr¦|jdksvt‚| dd…t jdd…f } |dd…t jdd…f }| jdd… |jdd… ksÆt‚|| }	| j\}
}}|j\}}}|
|ksòt‚td| jd  d ƒ}t|dg|d	ƒ\}}~t  |	|	ft	¡}t
|	ƒD ]N}t  |	| ¡|||d…f< t  |d ||	 | d
¡}|||d d…|f< �q6t  ||	 gd ¡}t j|	||fdd�}|||d  d |  }t d||f ¡ t|dd�}d}| |¡ t
|ƒD �]}| dd…|dd…f }|d ||dd�}| ¡ }|d |dd…|dd…f |dd�}t
|ƒD �]®} tt
| |ƒƒD ]Þ\}!}"|d |dd…| f |dd…|"f  |dd�}#|#| }#|�rÆt|#|||| |"ƒ || |	 | d |	 …|"|	 |"d |	 …f  |#7  < | |"k�r:||"|	 |"d |	 …| |	 | d |	 …f  |#j7  < |d7 }| |¡ �qp|d ||dd…t| | d ƒf  |dd�}$|dk �rØ|dk�rØ|d| …| f  |$|d… 7  < ||	| d…| f  |$d|… 7  < n |dd…| f  |$||… 7  < |d7 }| |¡ �q\�qút j|||	 |fdd�}|||||fS )z%Compute auto- and cross-correlations.r   )Úaxisé   ç        r   Nr   g      ð?zcorrelation calculationséÿÿÿÿÚF)ÚorderzFitting %d epochs, %d channelsZSample)ZmesgZrfft)Únr   Zirfft)ÚnpZmeanÚndimÚAssertionErrorÚnewaxisÚshaper   r   ÚemptyÚintÚrangeZarangeÚzerosr
   Úinfor	   ÚupdateZconjÚ	enumerateÚ_edge_correctÚTÚsliceÚreshape)%ÚXÚyÚsminÚsmaxÚn_jobsÚfit_interceptÚedge_correctionÚX_offsetÚy_offsetZlen_trfZlen_xZn_epochsÚn_ch_xZlen_yZn_epcohsZn_ch_yZn_fftÚ_Z	cuda_dictZijÚiiÚxÚx_xtÚx_yr   ZpbÚcountÚeiÚthis_XZX_fftZ
X_fft_conjZy_fftÚch0ÚoiÚch1Úthis_resultZcc_temp© r8   ú_/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/decoding/time_delaying_ridge.pyÚ_compute_corrs   s¢    


    ÿ
$  ÿ	 
ÿÿ
 
ÿÿ  ÿ"& r:   c                 C   s  |dkrŠt |d| d…|f |d| d…|f ƒ}|dkrV||d d …|d d …f }| t| d dƒd …t| d dƒd …f  |8  < |dk �r
t |d | …|f |d | …|f ƒd d d…d d d…f }|dk rê|d |…d |…f }| d | …d | …f  |8  < d S )Nr   r   r   )Ú_toeplitz_dotÚmax)r7   r3   r%   r$   r4   r6   ÚtailÚheadr8   r8   r9   r   p   s$    ÿ4
ÿÿÿr   c                 C   s–   | j |j kr| jdkst‚t | |¡}tdt| ƒƒD ]\}|||d…f  ||d |d d…f 7  < ||d d…|f  ||d…|d f 7  < q4|S )zDCreate upper triangular Toeplitz matrices & compute the dot product.r   Nr   )r   r   r   r   Úouterr   Úlen)ÚaÚbÚoutr-   r8   r8   r9   r;   €   s    	,.r;   Údirectc                 C   sL  ddl m} ddlm} d}t|tƒr0|fd }t|ƒdkrNtdt|ƒf ƒ‚|D ]}||krRtd||f ƒ‚qR|d dko‚|d	k}	|d	 dko–| d	k}
|	s®|
s®t 	| | ¡S |	�r.t 	|¡}|d	 }|j
d	d
|…  d7  < |j
|d
|…  d7  < |j
|d	 | d	 |…  d	7  < |g|  }|j|Ž }nt ||  fd ¡}|
�rÒ|| }||  }||  d	 }|j
|| |…  d7  < |j
|| d
|…  d	7  < |j
|| |…  d7  < |j
d
||  |…  d	7  < t |d
d
d…d
d
d…f |¡�søt‚|dk�r:|�r6t t |¡¡}|| }||d
d
…tjf  }|S || |d�}|S )z0Compute regularization parameter from neighbors.r   ©Úlinalg)Ú	laplacian)ÚridgerG   r   z'reg_type must have two elements, got %sz*reg_type entries must be one of %s, got %srG   r   Nr   rD   )Únormed)ÚscipyrF   Zscipy.sparse.csgraphrG   Ú
isinstanceÚstrr@   Ú
ValueErrorr   ÚeyeZflatZ
block_diagr   Zarray_equalr   ÚsqrtZdiagr   )r+   Ún_delaysÚreg_typeÚmethodrI   rF   rG   Zknown_typesÚrZreg_timeZreg_chsÚregZstrideÚargsÚblockÚ
row_offsetZnormr8   r8   r9   Ú_compute_reg_neighbors‘   sX    

ÿÿ
"
&
rX   c                 C   s´   ddl m} |jd }|jd | dks,t‚|jd | }t|||ƒ}	| ||	  }
z|j|
|ddd�}W n4 tjjk
rœ   tdƒ |j	|
|dd	�d }Y nX |j
 |||g¡}|S )
z)Fit the model using correlation matrices.r   rE   r   FÚpos)Zoverwrite_aZassume_azNSingular matrix in solving dual problem. Using least-squares solution instead.Zgelsy)Zlapack_driver)rJ   rF   r   r   rX   Zsolver   ZLinAlgErrorr   Zlstsqr   r!   )r/   r0   r+   rQ   ÚalphaZn_ch_inrF   Zn_ch_outrP   rT   ZmatÚwr8   r8   r9   Ú
_fit_corrsÉ   s    
r\   c                   @   sF   e Zd ZdZdZddd„Zed	d
„ ƒZedd„ ƒZdd„ Z	dd„ Z
dS )ÚTimeDelayingRidgeañ  Ridge regression of data with time delays.

    Parameters
    ----------
    tmin : int | float
        The starting lag, in seconds (or samples if ``sfreq`` == 1).
        Negative values correspond to times in the past.
    tmax : int | float
        The ending lag, in seconds (or samples if ``sfreq`` == 1).
        Positive values correspond to times in the future.
        Must be >= tmin.
    sfreq : float
        The sampling frequency used to convert times into samples.
    alpha : float
        The ridge (or laplacian) regularization factor.
    reg_type : str | list
        Can be "ridge" (default) or "laplacian".
        Can also be a 2-element list specifying how to regularize in time
        and across adjacent features.
    fit_intercept : bool
        If True (default), the sample mean is removed before fitting.
    n_jobs : int | str
        The number of jobs to use. Can be an int (default 1) or ``'cuda'``.

        .. versionadded:: 0.18
    edge_correction : bool
        If True (default), correct the autocorrelation coefficients for
        non-zero delays for the fact that fewer samples are available.
        Disabling this speeds up performance at the cost of accuracy
        depending on the relationship between epoch length and model
        duration. Only used if ``estimator`` is float or None.

        .. versionadded:: 0.18

    See Also
    --------
    mne.decoding.ReceptiveField

    Notes
    -----
    This class is meant to be used with :class:`mne.decoding.ReceptiveField`
    by only implicitly doing the time delaying. For reasonable receptive
    field and input signal sizes, it should be more CPU and memory
    efficient by using frequency-domain methods (FFTs) to compute the
    auto- and cross-correlations.
    Z	regressorr   rH   TNc	           	      C   s\   ||krt d||f ƒ‚t|ƒ| _t|ƒ| _t|ƒ| _t|ƒ| _|| _|| _|| _|| _	d S )Nz#tmin must be <= tmax, got %s and %s)
rM   ÚfloatÚtminÚtmaxÚsfreqrZ   rQ   r'   r(   r&   )	Úselfr_   r`   ra   rZ   rQ   r'   r&   r(   r8   r8   r9   Ú__init__  s    ÿ



zTimeDelayingRidge.__init__c                 C   s   t t| j| j ƒƒS )N)r   Úroundr_   ra   ©rb   r8   r8   r9   Ú_smin   s    zTimeDelayingRidge._sminc                 C   s   t t| j| j ƒƒd S )Nr   )r   rd   r`   ra   re   r8   r8   r9   Ú_smax$  s    zTimeDelayingRidge._smaxc                 C   sÜ   |j dkr:|j dkst‚|jdd… |jdd… ksjt‚n0|j dkrN|j dksRt‚|jd |jd ksjt‚t||| j| j| j| j| jƒ\| _	}}}}t
| j	||| j| j|ƒ| _| jrÒ|t || j d¡j¡ | _nd| _| S )a¼  Estimate the coefficients of the linear model.

        Parameters
        ----------
        X : array, shape (n_samples[, n_epochs], n_features)
            The training input samples to estimate the linear coefficients.
        y : array, shape (n_samples[, n_epochs],  n_outputs)
            The target values.

        Returns
        -------
        self : instance of TimeDelayingRidge
            Returns the modified instance.
        r   Nr   r   r   r   )r   r   r   r:   rf   rg   r&   r'   r(   Zcov_r\   rQ   rZ   Úcoef_r   ÚdotÚsumr   Ú
intercept_)rb   r"   r#   Zx_y_r+   r)   r*   r8   r8   r9   Úfit(  s.    
"     þ
  ÿzTimeDelayingRidge.fitc                 C   s<  ddl m} |jdkr4|dd…tjdd…f }d}nd}t |jdd… | jjd f ¡}| j}t	|dƒ}t
|jd ƒD ]˜}t
| jjd ƒD ]‚}t
| jjd ƒD ]l}	||dd…||	f | j||	f ƒ}
|
t	| dƒd… dt|ƒ| … }
||t|
ƒ| …||f  |
7  < q qŒqx|| j7 }|�r8|dd…ddd…f }|S )zïPredict the output.

        Parameters
        ----------
        X : array, shape (n_samples[, n_epochs], n_features)
            The data.

        Returns
        -------
        X : ndarray
            The predicted response.
        r   )Úfftconvolver   NTFr   )Zscipy.signalrm   r   r   r   r   r   rh   rf   r<   r   r@   rk   )rb   r"   rm   Z	singletonrC   r$   Úoffsetr2   r5   ÚfiÚtempr8   r8   r9   ÚpredictL  s$    
"
"$(
zTimeDelayingRidge.predict)r   rH   TNT)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Z_estimator_typerc   Úpropertyrf   rg   rl   rq   r8   r8   r8   r9   r]   à   s   /      ÿ


$r]   )NFT)rD   F)ru   Únumpyr   Úbaser   Úcudar   Úfilterr   Úfixesr   Úutilsr   r	   r
   r:   r   r;   rX   r\   r]   r8   r8   r8   r9   Ú<module>   s$     ÿ
_

  ÿ
8