o
    ?Hh|                     @   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 dd	l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rsf2csf)_ensure_dtype_cdszc                   @   s   e Zd ZdS )
SqrtmErrorN)__name__
__module____qualname__ r   r   \/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/scipy/linalg/_matfuncs_sqrtm.pyr      s    r   )within_block_loop@   c              
   C   sN  t | }t | ot j|dddk}|s't 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ritdg }d}|
|f||	ffD ]\}}t|D ]}|||| f ||7 }q}quz	t|| || W n ty } zt|j |d	}~ww t|D ]v}|| \}}t|d d
d
D ]e}|| \}}| ||||f }|| dkr||||||f |||||f  }|||||f }|||||f }|rt|||\}}}n	t|||\}}}|| |||||f< qq|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.

    g        )initialr   C)dtypeorder)r   r   zinternal inconsistencyN)npdiag	isrealobjminasarray
complex128float64sqrtshapemaxdivmod	Exceptionrangeappendr   RuntimeErrorr   argsdotr   r   )T	blocksizeT_diagkeep_it_realRnnblocksbsmallnlargeblargensmallstart_stop_pairsstartcountsizeiejjstartjstopistartistopSRiiRjjxscaleinfor   r   r   _sqrtm_triu   sZ   



rE   Tc                 C   s  t | ddd} t| jdkrtd|dk rtdt| \} 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| j
t|rdnd}|j|dd}W n ty   d}
t| }|tj Y nw |r|
rtd |S zt|||  dd t| d }W ||fS  ty   tj}Y ||fS w )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`.

    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)check_finite
as_inexact   z$Non-matrix input to matrix function.r   z#The blocksize should be at least 1.r   Ncomplex)outputF)r*   y              ?)copyzFailed to find a square root.fro)r   lenr    
ValueErrorr
   r   r   r   diagonalfinfor   epsabsanyr	   rE   	conjugater)   r(   result_typeiscomplexobjastyper   
empty_likefillnanprintr   inf)Adispr*   r,   r)   Zd0d1rQ   needs_conversionfailflagr-   ZHXr   arg2r   r   r   r   v   sP   /


,
$)r   )Tr   )__doc____all__numpyr   scipy._lib._utilr   _miscr   lapackr   r   _decomp_schurr   r	   _basicr
   linalgLinAlgErrorr   _matfuncs_sqrtm_triur   rE   r   r   r   r   r   <module>   s    
Z