U
    f»{jÊ  ã                   @   sL   d dl mZ d dlZddlmZmZmZmZ eddd„ƒZ	eddd„ƒZ
dS )é    )ÚsqrtNé   )Úcheck_random_stateÚloggerÚverboseÚfill_docéè  çü©ñÒMbP?c                 C   s¦   |j d }t|ƒ}| ||¡}|tj |d¡ }t | j| ¡}t ||j¡}	tj}
t	|ƒD ]F}t t ||¡|	¡}tj |d¡}t
||
 ƒ|k r” q¢|| }|}
qZ|S )a–  Find the largest singular value for the matrix kron(C.T, A).

    It uses power iterations.

    Parameters
    ----------
    A : array
        An array
    C : array
        An array
    max_iter : int
        Maximum number of iterations
    %(random_state)s

    Returns
    -------
    L : float
        largest singular value

    Notes
    -----
    http://en.wikipedia.org/wiki/Power_iteration
    r   Zfro)Úshaper   ZrandnÚnpÚlinalgÚnormÚdotÚTÚinfÚrangeÚabs)ÚAÚCÚmax_iterÚtolZrandom_stateZAS_sizeÚrngÚBZATAZCCTZL0Ú_ÚYÚL© r   ú`/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/inverse_sparse/mxne_debiasing.pyÚpower_iteration_kron   s    
r   ç�íµ ÷Æ°>é   c                 C   sb  |j d }dt||ƒ }t |¡}	t |¡}
d}t|ƒD ]ü}|	}| t ||
 |¡ }|
tjt |j|¡| dd�|  }	|dkr¬tj|	 	d|¡dd�}	t 
|	|dg¡j ¡ }	t |	d¡}	|}ddtdd|d	   ƒ  }|
 d
¡ |d | }|	||	|   }
tj |	| tj¡}||k r8t d|||f ¡  �q^q8tj |	| tj¡}t d|||f ¡ |	S )a‹  Compute scaling to correct amplitude bias.

    It solves the following optimization problem using FISTA:

    min 1/2 * (|| M - GDX ||fro)^2
    s.t. D >= 1 and D is a diagonal matrix

    Reference for the FISTA algorithm:
    Amir Beck and Marc Teboulle
    A Fast Iterative Shrinkage-Thresholding Algorithm for Linear Inverse
    Problems, SIAM J. Imaging Sci., 2(1), 183-202. (20 pages)
    http://epubs.siam.org/doi/abs/10.1137/080716542

    Parameters
    ----------
    M : array
        measurement data.
    G : array
        leadfield matrix.
    X : array
        reconstructed time courses with amplitude bias.
    max_iter : int
        Maximum number of iterations.
    tol : float
        The tolerance on convergence.
    n_orient : int
        The number of orientations (1 for fixed and 3 otherwise).
    %(verbose)s

    Returns
    -------
    D : array
        Debiasing weights.
    r   gš™™™™™ñ?g      ð?r    )Zaxiséÿÿÿÿg      à?g      @r   g        z?Debiasing converged after %d iterations max(|D - D0| = %e < %e)zHDebiasing did not converge after %d iterations! max(|D - D0| = %e >= %e))r
   r   r   Zonesr   r   Úsumr   ZmeanZreshapeZtileZravelÚmaximumr   Úfillr   r   r   r   Úinfo)ÚMÚGÚXr   r   Zn_orientr   Ú	n_sourcesZlipschitz_constantÚDr   ÚtÚiZD0ÚRÚt0ÚdtZDdiffr   r   r   Úcompute_bias8   s:    $


$
ÿÿr0   )r   r	   r   )r   r   r    N)Úmathr   Únumpyr   Úutilsr   r   r   r   r   r0   r   r   r   r   Ú<module>   s   +