a
    ‡ù»jz  ã                   @   s‚   d Z dgZddlZddlmZ ddlmZ ddlm	Z	m
Z
 ddlmZmZ G d	d
„ d
ejjƒZddlmZ ddd„Zddd„ZdS )zz
Matrix square root for general matrices and for upper triangular matrices.

This module exists to avoid cyclic imports.

Úsqrtmé    N)Ú_asarray_validatedé   )Únorm)ÚztrsylÚdtrsyl)ÚschurÚrsf2csfc                   @   s   e Zd ZdS )Ú
SqrtmErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   úBE:\soccer\ml_env\Lib\site-packages\scipy/linalg/_matfuncs_sqrtm.pyr
      s   r
   )Úwithin_block_loopé@   c              
   C   s^  t  | ¡}t  | ¡o t  |¡dk}|sJt j| t jdd�} t j|t jd�}n"t j| t jdd�} t j|t jd�}t  t  |¡¡}| j\}}t	|| dƒ}t
||ƒ\}}|d }	|| }
|
| ||	  |krÎtdƒ‚g }d}|
|f||	ffD ]0\}}t|ƒD ]}| ||| f¡ ||7 }qöqæzt|| ||ƒ W n2 t�y\ } zt|jŽ |‚W Y d}~n
d}~0 0 t|ƒD ]ò}|| \}}t|d ddƒD ]Î}|| \}}| ||…||…f }|| dk�ræ||||…||…f  |||…||…f ¡ }|||…||…f }|||…||…f }|�r(t|||ƒ\}}}nt|||ƒ\}}}|| |||…||…f< �q†�qf|S )	aÜ  
    Matrix square root of an upper triangular matrix.

    This is a helper function for `sqrtm` and `logm`.

    Parameters
    ----------
    T : (N, N) array_like upper triangular
        Matrix whose square root to evaluate
    blocksize : int, optional
        If the blocksize is not degenerate with respect to the
        size of the input array, then use a blocked algorithm. (Default: 64)

    Returns
    -------
    sqrtm : (N, N) ndarray
        Value of the sqrt function at `T`

    References
    ----------
    .. [1] Edvin Deadman, Nicholas J. Higham, Rui Ralha (2013)
           "Blocked Schur Algorithms for Computing the Matrix Square Root,
           Lecture Notes in Computer Science, 7782. pp. 171-182.

    r   ÚC)ÚdtypeÚorder)r   r   zinternal inconsistencyNéÿÿÿÿ)ÚnpZdiagÚ	isrealobjÚminÚasarrayZ
complex128Zfloat64ÚsqrtÚshapeÚmaxÚdivmodÚ	ExceptionÚrangeÚappendr   ÚRuntimeErrorr
   ÚargsÚdotr   r   )ÚTÚ	blocksizeZT_diagÚkeep_it_realÚRÚnZnblocksZbsmallZnlargeZblargeZnsmallZstart_stop_pairsÚstartÚcountÚsizeÚiÚeÚjZjstartZjstopÚistartÚistopÚSZRiiZRjjÚxÚscaleÚinfor   r   r   Ú_sqrtm_triu   sR    

"ÿ
 r5   Tc                 C   s  t  | ¡jj}t| ddd�} t| jƒdkr2tdƒ‚|dk rBtdƒ‚t  | ¡}|rÄt	| ƒ\}}t  
|¡}t  
|d¡}t  |j¡j}	t|ƒ|	t|dd… ƒt|dd… ƒ  k}
|
 ¡ rÔt||ƒ\}}nt	| d	d
�\}}d}zªt||d�}t  |¡j}| |¡ |¡}t  |¡�s.|jdt  |dd¡› �dd�}nRtt dƒ�r^|jdt  |d dd¡› �dd�}n"|jdt  |d dd¡› �dd�}W n. t�y°   d}t  | ¡}| t j¡ Y n0 |�rÊ|�rÆtdƒ |S z&t| |¡|  dƒd t| dƒ }W n t�y
   t j}Y n0 ||fS dS )a  
    Matrix square root.

    Parameters
    ----------
    A : (N, N) array_like
        Matrix whose square root to evaluate
    disp : bool, optional
        Print warning if error in the result is estimated large
        instead of returning estimated error. (Default: True)
    blocksize : integer, optional
        If the blocksize is not degenerate with respect to the
        size of the input array, then use a blocked algorithm. (Default: 64)

    Returns
    -------
    sqrtm : (N, N) ndarray
        Value of the sqrt function at `A`. The dtype is float or complex.
        The precision (data size) is determined based on the precision of
        input `A`. When the dtype is float, the precision is the same as `A`.
        When the dtype is complex, the precision is double that of `A`. The
        precision might be clipped by each dtype precision range.

    errest : float
        (if disp == False)

        Frobenius norm of the estimated error, ||err||_F / ||A||_F

    References
    ----------
    .. [1] Edvin Deadman, Nicholas J. Higham, Rui Ralha (2013)
           "Blocked Schur Algorithms for Computing the Matrix Square Root,
           Lecture Notes in Computer Science, 7782. pp. 171-182.

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.linalg import sqrtm
    >>> a = np.array([[1.0, 3.0], [1.0, 4.0]])
    >>> r = sqrtm(a)
    >>> r
    array([[ 0.75592895,  1.13389342],
           [ 0.37796447,  1.88982237]])
    >>> r.dot(r)
    array([[ 1.,  3.],
           [ 1.,  4.]])

    T)Zcheck_finiteZ
as_inexacté   z$Non-matrix input to matrix function.r   z#The blocksize should be at least 1.r   NÚcomplex)ÚoutputF)r%   Úfé   )ÚcopyZ
complex256Úcé   é    zFailed to find a square root.Zfro)r   r   r   Úitemsizer   Úlenr   Ú
ValueErrorr   r   ZdiagonalZfinfoÚepsÚabsÚanyr	   r5   Ú	conjugater$   r#   ZiscomplexobjZastypeZclipÚhasattrr
   Z
empty_likeÚfillÚnanÚprintr   Úinf)ÚAZdispr%   Z	byte_sizer&   r$   ÚZZd0Zd1rB   Zneeds_conversionZfailflagr'   ZZHÚXZarg2r   r   r   r   u   sN    1

, $&
&)r   )Tr   )Ú__doc__Ú__all__Únumpyr   Zscipy._lib._utilr   Z_miscr   Zlapackr   r   Z_decomp_schurr   r	   ZlinalgZLinAlgErrorr
   Z_matfuncs_sqrtm_triur   r5   r   r   r   r   r   Ú<module>   s   
Z