
    \ci.~                     N   d dl Z d dlmZ d dlZd dlmZmZmZmZm	Z	m
Z
mZmZmZmZmZmZ d dlmZ d dlmZ d dlmZmZmZ ddlmZ dd	lmZ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' ddl(m)Z)m*Z* ddl+m,Z, g dZ- ej.        d          j/        Z/ ej.        d          j/        Z0ddd dd ddZ1d Z2d(dZ3 ed          d             Z4 ed          efd            Z5d Z6d Z7eefdZ8 ed          d             Z9 ed          d             Z: ed          d             Z; ed          d             Z< ed          d              Z= ed          d!             Z> ed          d)d#            Z? ed          efd$            Z@ ed%d&          d'             ZAdS )*    N)product)dotdiagprodlogical_notravel	transpose	conjugateabsoluteamaxsignisfinitetriu)_apply_over_batch)_NoValue)LinAlgError	bandwidthLinAlgWarning   )norm)solveinv)svd)schurrsf2csf)expm_frechet	expm_cond)recursive_schur_sqrtm)pick_pade_structurepade_UV_calc)_funm_loops)expmcosmsinmtanmcoshmsinhmtanhmlogmfunmsignmsqrtmfractional_matrix_powerr   r   
khatri_raodf)ilr0   r/   FDc                     t          j        |           } t          | j                  dk    s| j        d         | j        d         k    rt	          d          | S )a  
    Wraps asarray with the extra requirement that the input be a square matrix.

    The motivation is that the matfuncs module has real functions that have
    been lifted to square matrix functions.

    Parameters
    ----------
    A : array_like
        A square matrix.

    Returns
    -------
    out : ndarray
        An ndarray copy or view or other representation of A.

       r   r   z expected square array_like input)npasarraylenshape
ValueErrorAs    f/var/www/html/mdtn/previsions/meteo_cartes/venv/lib/python3.11/site-packages/scipy/linalg/_matfuncs.py_asarray_squarer?   '   sN    $ 	
1A
17||qAGAJ!'!*44;<<<H    c                     t          j        |           rit          j        |          rU|0t          dz  t          dz  dt
          |j        j                          }t          j        |j	        d|          r|j
        }|S )a(  
    Return either B or the real part of B, depending on properties of A and B.

    The motivation is that B has been computed as a complicated function of A,
    and B may be perturbed by negligible imaginary components.
    If A is real and B is complex with small imaginary components,
    then return a real copy of B.  The assumption in that case would be that
    the imaginary components of B are numerical artifacts.

    Parameters
    ----------
    A : ndarray
        Input array whose type is to be checked as real vs. complex.
    B : ndarray
        Array to be returned, possibly without its imaginary part.
    tol : float
        Absolute tolerance.

    Returns
    -------
    out : real or complex array
        Either the input array B or only the real part of the input array B.

    N     @@g    .Ar   r           )atol)r7   	isrealobjiscomplexobjfepseps_array_precisiondtypecharallcloseimagreal)r=   Btols      r>   _maybe_realrR   ?   su    4 
|A 2?1-- ;3h3s7++,<QW\,JKC;qvs--- 	AHr@   )r=   r6   c                 h    t          |           } ddl}|j        j                            | |          S )a  
    Compute the fractional power of a matrix.

    Proceeds according to the discussion in section (6) of [1]_.

    Parameters
    ----------
    A : (N, N) array_like
        Matrix whose fractional power to evaluate.
    t : float
        Fractional power.

    Returns
    -------
    X : (N, N) array_like
        The fractional power of the matrix.

    References
    ----------
    .. [1] Nicholas J. Higham and Lijing Lin (2011)
           "A Schur-Pade Algorithm for Fractional Powers of a Matrix."
           SIAM Journal on Matrix Analysis and Applications,
           32 (3). pp. 1056-1078. ISSN 0895-4798.
           :doi:`10.1137/10081232X`

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.linalg import fractional_matrix_power
    >>> a = np.array([[1.0, 3.0], [1.0, 4.0]])
    >>> b = fractional_matrix_power(a, 0.5)
    >>> b
    array([[ 0.75592895,  1.13389342],
           [ 0.37796447,  1.88982237]])
    >>> np.dot(b, b)      # Verify square root
    array([[ 1.,  3.],
           [ 1.,  4.]])

    r   N)r?   scipy.linalg._matfuncs_inv_ssqlinalg_matfuncs_inv_ssq_fractional_matrix_power)r=   tscipys      r>   r-   r-   e   s9    V 	A))))<)BB1aHHHr@   c                 v   |t           u rd}nt          j        dt          d           t	          j        |           } ddl}|j        j        	                    |           }t          | |          }dt          z  }t	          j        dd	          5  t          t          |          | z
  d
          t	          j        t          | d
          | j                  j        d         z  }ddd           n# 1 swxY w Y   |r8t#          |          r||k    r!d| }t          j        |t$          d           |S ||fS )a  
    Compute matrix logarithm.

    The matrix logarithm is the inverse of
    expm: expm(logm(`A`)) == `A`

    Parameters
    ----------
    A : (N, N) array_like
        Matrix whose logarithm to evaluate
    disp : bool, optional
        Emit warning if error in the result is estimated large
        instead of returning estimated error. (Default: True)

        .. deprecated:: 1.16.0
            The `disp` argument is deprecated and will be
            removed in SciPy 1.18.0. The previously returned error estimate
            can be computed as ``norm(expm(logm(A)) - A, 1) / norm(A, 1)``.

    Returns
    -------
    logm : (N, N) ndarray
        Matrix logarithm of `A`
    errest : float
        (if disp == False)

        1-norm of the estimated error, ||err||_1 / ||A||_1

    References
    ----------
    .. [1] Awad H. Al-Mohy and Nicholas J. Higham (2012)
           "Improved Inverse Scaling and Squaring Algorithms
           for the Matrix Logarithm."
           SIAM Journal on Scientific Computing, 34 (4). C152-C169.
           ISSN 1095-7197

    .. [2] Nicholas J. Higham (2008)
           "Functions of Matrices: Theory and Computation"
           ISBN 978-0-898716-46-7

    .. [3] Nicholas J. Higham and Lijing lin (2011)
           "A Schur-Pade Algorithm for Fractional Powers of a Matrix."
           SIAM Journal on Matrix Analysis and Applications,
           32 (3). pp. 1056-1078. ISSN 0895-4798

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.linalg import logm, expm
    >>> a = np.array([[1.0, 3.0], [1.0, 4.0]])
    >>> b = logm(a)
    >>> b
    array([[-1.02571087,  2.05142174],
           [ 0.68380725,  1.02571087]])
    >>> expm(b)         # Verify expm(logm(a)) returns a
    array([[ 1.,  3.],
           [ 1.,  4.]])

    TFThe `disp` argument is deprecated and will be removed in SciPy 1.18.0.r6   
stacklevelr   N  ignore)divideinvalidr   rK    z1logm result may be inaccurate, approximate err = )r   warningswarnDeprecationWarningr7   r8   rT   rU   rV   _logmrR   rI   errstater   r"   rK   rO   r   RuntimeWarning)r=   disprY   r3   errtolerrestmessages          r>   r)   r)      s   z x =(Q	8 	8 	8 	8 	
1A))))&,,Q//AAqA#XF	Hh	7	7	7 U Ud1ggai##bja17&K&K&K&PQS&TTU U U U U U U U U U U U U U U  	A6V#3#3R&RRGM'>a@@@@&ys   AC22C69C6c           
      h	   t          j        |           }|j        dk    rE|j        dk     r:t          j        t          j        |                                          gg          S |j        dk     rt          d          |j        d         |j        d         k    rt          d          t          |j         dk    rCt          t          j        d|j                            j        }t          j        ||          S |j        dd	         d
k    rt          j        |          S t          j        |j        t           j                  s |                    t           j                  }n4|j        t           j        k    r|                    t           j                  }|j        d         }t          j        |j        |j                  }t          j        d||f|j                  }t+          d |j        d	d         D              D ]}||         }t-          |          }t/          |          s<t          j        t          j        t          j        |                              ||<   e||dd	d	d	d	f<   t3          |          \  }	}
|	dk     rt5          d|	 d          t7          ||	          }|dk    r,|dk    rt5          d| d          t9          d| d          |d         }|
dk    rd|d         dk    s|d         dk    r4t          j        |          }t          j        |d|
 z  z            t          j        d|          d	d	<   t          j        ||d         dk    rdnd          }t=          |
dz
  dd          D ]}||z  }t          j        |d| z  z            t          j        d|          d	d	<   t?          |d| z  z            |d| z  z  z  }|d         dk    r'|t          j        d|dd	d	df                   d	d	<   |t          j        d|d	ddd	f                   d	d	<   nt=          |
          D ]}||z  }|d         dk    s|d         dk    r9|d         dk    rt          j         |          nt          j!        |          ||<   |||<   |S )au	  Compute the matrix exponential of an array.

    Array argument(s) of this function may have additional
    "batch" dimensions prepended to the core shape. In this case, the array is treated
    as a batch of lower-dimensional slices; see :ref:`linalg_batch` for details.

    Parameters
    ----------
    A : ndarray
        Input with last two dimensions are square ``(..., n, n)``.

    Returns
    -------
    eA : ndarray
        The resulting matrix exponential with the same shape of ``A``

    Notes
    -----
    Implements the algorithm given in [1]_, which is essentially a Pade
    approximation with a variable order that is decided based on the array
    data.

    For input with size ``n``, the memory usage is in the worst case in the
    order of ``8*(n**2)``. If the input data is not of single and double
    precision of real and complex dtypes, it is copied to a new array.

    For cases ``n >= 400``, the exact 1-norm computation cost, breaks even with
    1-norm estimation and from that point on the estimation scheme given in
    [2]_ is used to decide on the approximation order.

    References
    ----------
    .. [1] Awad H. Al-Mohy and Nicholas J. Higham, (2009), "A New Scaling
           and Squaring Algorithm for the Matrix Exponential", SIAM J. Matrix
           Anal. Appl. 31(3):970-989, :doi:`10.1137/09074721X`

    .. [2] Nicholas J. Higham and Francoise Tisseur (2000), "A Block Algorithm
           for Matrix 1-Norm Estimation, with an Application to 1-Norm
           Pseudospectra." SIAM J. Matrix Anal. Appl. 21(4):1185-1201,
           :doi:`10.1137/S0895479899356080`

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.linalg import expm, sinm, cosm

    Matrix version of the formula exp(0) = 1:

    >>> expm(np.zeros((3, 2, 2)))
    array([[[1., 0.],
            [0., 1.]],
    <BLANKLINE>
           [[1., 0.],
            [0., 1.]],
    <BLANKLINE>
           [[1., 0.],
            [0., 1.]]])

    Euler's identity (exp(i*theta) = cos(theta) + i*sin(theta))
    applied to a matrix:

    >>> a = np.array([[1.0, 2.0], [-1.0, 3.0]])
    >>> expm(1j*a)
    array([[ 0.42645930+1.89217551j, -2.13721484-0.97811252j],
           [ 1.06860742+0.48905626j, -1.71075555+0.91406299j]])
    >>> cosm(a) + 1j*sinm(a)
    array([[ 0.42645930+1.89217551j, -2.13721484-0.97811252j],
           [ 1.06860742+0.48905626j, -1.71075555+0.91406299j]])

    r   r6   0The input array must be at least two-dimensional-Last 2 dimensions of the array must be squarer   rb   Nr   r      c                 ,    g | ]}t          |          S rc   )range).0xs     r>   
<listcomp>zexpm.<locals>.<listcomp>R  s    888aq888r@   znscipy.linalg.expm could not allocate sufficient memory while trying to compute the Pade structure (error code z).izkscipy.linalg.expm could not allocate sufficient memory while trying to compute the exponential (error code z^scipy.linalg.expm got an internal LAPACK error during the exponential computation (error code )zii->i)kg       @)"r7   r8   sizendimarrayexpitemr   r:   minr"   eyerK   
empty_like
issubdtypeinexactastypefloat64float16float32emptyr   r   anyr   r   MemoryErrorr    RuntimeErroreinsumrv   
_exp_sinchr   tril)r=   arK   neAAmindawlumsinfoeAwdiag_awsdr1   exp_sd_s                     r>   r"   r"      s   N 	
1Av{{qvzzx"&**+,---vzzLMMMwr{agbk!!IJJJ AG}RVAQW---..4}Qe,,,, 	wrss|vvayy="*-- !HHRZ  	
BJ		HHRZ   	
A	!'	)	)	)B	1a)17	+	+	+B 88173B3<8889 > >sVr]]2ww 	gbfRWR[[1122BsG
 1aaa7"2&&1EE =78= = = > > > B""199s{{! #B9=#B #B #B C C C # $:26$: $: $: ; ; ; e661

1

 '"++-/VGa1"g4E-F-F	'3''*WRA!22;;;qsB++ 	E 	EA)C 24"r(8J1K1KBIgs++AAA.'28(<==a1"gNF!uzz>D	'3qrr3B3w<88;;>D	'3ssABBw<88;;	E q $ $A)CC qEQJJBqEQJJ&(eqjjbgclllbgcllBsGGBsGGIr@   c                     t          j        t          j        |                     }t          j        |           }|dk    }|| xx         ||          z  cc<   t          j        | d d         |                   ||<   |S )NrD   rp   )r7   diffr   )rx   	lexp_diffl_diffmask_zs       r>   r   r     sy    q		""IWQZZFr\Fvg&&/)q"vf~..Ifr@   c                 8   |t           u rd}nt          j        dt          d           |t           urt          j        dt          d           t	          j        |           }|j        dk    rE|j        dk     r:t	          j        t	          j	        |
                                          gg          S |j        dk     rt          d          |j        d         |j        d	         k    rt          d
          t          |j         dk    rCt          t	          j        d|j                            j        }t	          j        ||          S |j        d	d         dk    rt          j                            |          S t	          j        |j        t          j                  s |                    t          j                  }n|j        t          j        k    r |                    t          j                  }n[|j        j        dv r |                    t          j                  }n-|j        j        dv r|                    t          j                  }|j        j        dvrt9          d|j                   t;          |          \  }}}}|dk     rt          d|           |s|r#|rd}	nd}	t          j        |	t<          d           |du rL	 t?          ||z  | z
  d          dz  t?          | d          z  }
n# t@          $ r t          j!        }
Y nw xY w||
fS |S )a@  
    Compute, if exists, the matrix square root.

    The matrix square root of ``A`` is a matrix ``X`` such that ``X @ X = A``.
    Every square matrix is not guaranteed to have a matrix square root, for
    example, the array ``[[0, 1], [0, 0]]`` does not have a square root.

    Moreover, not every real matrix has a real square root. Hence, for
    real-valued matrices the return type can be complex if, numerically, there
    is an eigenvalue on the negative real axis.

    Array argument(s) of this function may have additional
    "batch" dimensions prepended to the core shape. In this case, the array is treated
    as a batch of lower-dimensional slices; see :ref:`linalg_batch` for details.

    Parameters
    ----------
    A : ndarray
        Input with last two dimensions are square ``(..., n, n)``.
    disp : bool, optional
        Print warning if error in the result is estimated large
        instead of returning estimated error. (Default: True)

        .. deprecated:: 1.16.0
            The `disp` argument is deprecated and will be
            removed in SciPy 1.18.0. The previously returned error estimate
            can be computed as ``norm(X @ X - A, 'fro')**2 / norm(A, 'fro')``

    blocksize : integer, optional

        .. deprecated:: 1.16.0
            The `blocksize` argument is deprecated as it is unused by the algorithm
            and will be removed in SciPy 1.18.0.

    Returns
    -------
    sqrtm : ndarray
        Computed matrix squareroot of `A` with same size ``(..., n, n)``.

    errest : float
        Frobenius norm of the estimated error, ||err||_F / ||A||_F. Only
        returned, if ``disp`` is set to ``False``. This return argument will be
        removed in version 1.20.0 and only the sqrtm result will be returned.

        .. deprecated:: 1.16.0

    Notes
    -----
    This function uses the Schur decomposition method to compute the matrix
    square root following [1]_ and for real matrices [2]_. Moreover, note
    that, there exist matrices that have square roots that are not polynomials
    in ``A``. For a classical example from [2]_, the matrix satisfies::

            [ a, a**2 + 1]**2     [-1,  0]
            [-1,       -a]     =  [ 0, -1]

    for any scalar ``a`` but it is not a polynomial in ``-I``. Thus, they will
    not be found by this function.

    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.
           :doi:`10.1016/0024-3795(87)90118-2`
    .. [2] Nicholas J. Higham (1987) "Computing real square roots of a real
           matrix", Linear Algebra and its Applications, 88/89:405-430.
           :doi:`10.1016/0024-3795(87)90118-2`

    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.]])

    Tr[   r6   r\   zKThe `blocksize` argument is deprecated and will be removed in SciPy 1.18.0.r   ro   rp   rq   rr   r   rb   Nrs   GgfdFDz6scipy.linalg.sqrtm is not supported for the data type z&Internal error in scipy.linalg.sqrtm: z]Matrix is singular. The result might be inaccurate or the array might not have a square root.zdMatrix is ill-conditioned. The result might be inaccurate or the array might not have a square root.Ffro)"r   rd   re   rf   r7   r8   r|   r}   r~   r   r   r   r:   r   r,   r   rK   r   emathsqrtr   r   r   r   r   r   rL   
complex128	TypeErrorr   r   r   r;   inf)r=   rj   	blocksizer   rK   resisIllconditioned
isSingularr   msgarg2s              r>   r,   r,     s!   h x  (Q	8 	8 	8 	8    &(Q	8 	8 	8 	8 	
1Av{{qvzzx"&**+,---vzzLMMMwr{agbk!!IJJJ AG}bfQag...//5}Qe,,,, 	wrss|vx}}Q="*-- !HHRZ  	
BJ		HHRZ  	
		HHR]##	
		HHRZ  w|6!! &G& & ' ' 	' /DA.F.F+C	:taxxI4IIJJJ 8% 8 	B:CCACc=Q7777u}}	c	Au--q045>>ADD 	 	 	6DDD	 Dy
s   *K: :LLc                     t          |           } t          j        |           r(dt          d| z            t          d| z            z   z  S t          d| z            j        S )a!  
    Compute the matrix cosine.

    This routine uses expm to compute the matrix exponentials.

    Parameters
    ----------
    A : (N, N) array_like
        Input array

    Returns
    -------
    cosm : (N, N) ndarray
        Matrix cosine of A

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.linalg import expm, sinm, cosm

    Euler's identity (exp(i*theta) = cos(theta) + i*sin(theta))
    applied to a matrix:

    >>> a = np.array([[1.0, 2.0], [-1.0, 3.0]])
    >>> expm(1j*a)
    array([[ 0.42645930+1.89217551j, -2.13721484-0.97811252j],
           [ 1.06860742+0.48905626j, -1.71075555+0.91406299j]])
    >>> cosm(a) + 1j*sinm(a)
    array([[ 0.42645930+1.89217551j, -2.13721484-0.97811252j],
           [ 1.06860742+0.48905626j, -1.71075555+0.91406299j]])

          ?              ?             )r?   r7   rG   r"   rO   r<   s    r>   r#   r#   5  sZ    D 	A	q DAJJc!e,--BqDzzr@   c                     t          |           } t          j        |           r(dt          d| z            t          d| z            z
  z  S t          d| z            j        S )a   
    Compute the matrix sine.

    This routine uses expm to compute the matrix exponentials.

    Parameters
    ----------
    A : (N, N) array_like
        Input array.

    Returns
    -------
    sinm : (N, N) ndarray
        Matrix sine of `A`

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.linalg import expm, sinm, cosm

    Euler's identity (exp(i*theta) = cos(theta) + i*sin(theta))
    applied to a matrix:

    >>> a = np.array([[1.0, 2.0], [-1.0, 3.0]])
    >>> expm(1j*a)
    array([[ 0.42645930+1.89217551j, -2.13721484-0.97811252j],
           [ 1.06860742+0.48905626j, -1.71075555+0.91406299j]])
    >>> cosm(a) + 1j*sinm(a)
    array([[ 0.42645930+1.89217551j, -2.13721484-0.97811252j],
           [ 1.06860742+0.48905626j, -1.71075555+0.91406299j]])

    y             r   r   )r?   r7   rG   r"   rN   r<   s    r>   r$   r$   ^  sZ    D 	A	q d2a4jj4A;;.//BqDzzr@   c           	          t          |           } t          | t          t          |           t	          |                               S )a  
    Compute the matrix tangent.

    This routine uses expm to compute the matrix exponentials.

    Parameters
    ----------
    A : (N, N) array_like
        Input array.

    Returns
    -------
    tanm : (N, N) ndarray
        Matrix tangent of `A`

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.linalg import tanm, sinm, cosm
    >>> a = np.array([[1.0, 3.0], [1.0, 4.0]])
    >>> t = tanm(a)
    >>> t
    array([[ -2.00876993,  -8.41880636],
           [ -2.80626879, -10.42757629]])

    Verify tanm(a) = sinm(a).dot(inv(cosm(a)))

    >>> s = sinm(a)
    >>> c = cosm(a)
    >>> s.dot(np.linalg.inv(c))
    array([[ -2.00876993,  -8.41880636],
           [ -2.80626879, -10.42757629]])

    )r?   rR   r   r#   r$   r<   s    r>   r%   r%     s8    H 	Aq%Qa11222r@   c                     t          |           } t          | dt          |           t          |            z   z            S )a  
    Compute the hyperbolic matrix cosine.

    This routine uses expm to compute the matrix exponentials.

    Parameters
    ----------
    A : (N, N) array_like
        Input array.

    Returns
    -------
    coshm : (N, N) ndarray
        Hyperbolic matrix cosine of `A`

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.linalg import tanhm, sinhm, coshm
    >>> a = np.array([[1.0, 3.0], [1.0, 4.0]])
    >>> c = coshm(a)
    >>> c
    array([[ 11.24592233,  38.76236492],
           [ 12.92078831,  50.00828725]])

    Verify tanhm(a) = sinhm(a).dot(inv(coshm(a)))

    >>> t = tanhm(a)
    >>> s = sinhm(a)
    >>> t - s.dot(np.linalg.inv(c))
    array([[  2.72004641e-15,   4.55191440e-15],
           [  0.00000000e+00,  -5.55111512e-16]])

    r   r?   rR   r"   r<   s    r>   r&   r&     :    H 	Aq#a488!34555r@   c                     t          |           } t          | dt          |           t          |            z
  z            S )a  
    Compute the hyperbolic matrix sine.

    This routine uses expm to compute the matrix exponentials.

    Parameters
    ----------
    A : (N, N) array_like
        Input array.

    Returns
    -------
    sinhm : (N, N) ndarray
        Hyperbolic matrix sine of `A`

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.linalg import tanhm, sinhm, coshm
    >>> a = np.array([[1.0, 3.0], [1.0, 4.0]])
    >>> s = sinhm(a)
    >>> s
    array([[ 10.57300653,  39.28826594],
           [ 13.09608865,  49.86127247]])

    Verify tanhm(a) = sinhm(a).dot(inv(coshm(a)))

    >>> t = tanhm(a)
    >>> c = coshm(a)
    >>> t - s.dot(np.linalg.inv(c))
    array([[  2.72004641e-15,   4.55191440e-15],
           [  0.00000000e+00,  -5.55111512e-16]])

    r   r   r<   s    r>   r'   r'     r   r@   c           	          t          |           } t          | t          t          |           t	          |                               S )a  
    Compute the hyperbolic matrix tangent.

    This routine uses expm to compute the matrix exponentials.

    Parameters
    ----------
    A : (N, N) array_like
        Input array

    Returns
    -------
    tanhm : (N, N) ndarray
        Hyperbolic matrix tangent of `A`

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.linalg import tanhm, sinhm, coshm
    >>> a = np.array([[1.0, 3.0], [1.0, 4.0]])
    >>> t = tanhm(a)
    >>> t
    array([[ 0.3428582 ,  0.51987926],
           [ 0.17329309,  0.86273746]])

    Verify tanhm(a) = sinhm(a).dot(inv(coshm(a)))

    >>> s = sinhm(a)
    >>> c = coshm(a)
    >>> t - s.dot(np.linalg.inv(c))
    array([[  2.72004641e-15,   4.55191440e-15],
           [  0.00000000e+00,  -5.55111512e-16]])

    )r?   rR   r   r&   r'   r<   s    r>   r(   r(     s8    H 	Aq%a%((33444r@   Tc                    t          |           } t          |           \  }}t          ||          \  }}|j        \  }}t	           |t	          |                              }|                    |j        j                  }t          |d                   }t          ||||          \  }}t          t          ||          t          t          |                              }t          | |          }t          t          dt           |j        j                          }|dk    r|}t#          dt%          |||z  t'          t)          |d          d          z                      }	t+          t-          t/          t1          |                              d          rt2          j        }	|r|	d|z  k    rt7          d|	           |S ||	fS )	a  
    Evaluate a matrix function specified by a callable.

    Returns the value of matrix-valued function ``f`` at `A`. The
    function ``f`` is an extension of the scalar-valued function `func`
    to matrices.

    Parameters
    ----------
    A : (N, N) array_like
        Matrix at which to evaluate the function
    func : callable
        Callable object that evaluates a scalar function f.
        Must be vectorized (eg. using vectorize).
    disp : bool, optional
        Print warning if error in the result is estimated large
        instead of returning estimated error. (Default: True)

    Returns
    -------
    funm : (N, N) ndarray
        Value of the matrix function specified by func evaluated at `A`
    errest : float
        (if disp == False)

        1-norm of the estimated error, ||err||_1 / ||A||_1

    Notes
    -----
    This function implements the general algorithm based on Schur decomposition
    (Algorithm 9.1.1. in [1]_).

    If the input matrix is known to be diagonalizable, then relying on the
    eigendecomposition is likely to be faster. For example, if your matrix is
    Hermitian, you can do

    >>> from scipy.linalg import eigh
    >>> def funm_herm(a, func, check_finite=False):
    ...     w, v = eigh(a, check_finite=check_finite)
    ...     ## if you further know that your matrix is positive semidefinite,
    ...     ## you can optionally guard against precision errors by doing
    ...     # w = np.maximum(w, 0)
    ...     w = func(w)
    ...     return (v * w).dot(v.conj().T)

    References
    ----------
    .. [1] Gene H. Golub, Charles F. van Loan, Matrix Computations 4th ed.

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.linalg import funm
    >>> a = np.array([[1.0, 3.0], [1.0, 4.0]])
    >>> funm(a, lambda x: x*x)
    array([[  4.,  15.],
           [  5.,  19.]])
    >>> a.dot(a)
    array([[  4.,  15.],
           [  5.,  19.]])

    )r   r   rC   rD   r   r   )axisr^   z0funm result may be inaccurate, approximate err =)r?   r   r   r:   r   r   rK   rL   absr!   r   r	   r
   rR   rH   rI   rJ   r   maxr   r   r   r   r   r   r7   r   print)
r=   funcrj   TZr   r3   mindenrQ   errs
             r>   r*   r*   '  s   @ 	A88DAq1a==DAq7DAqTT$q'']]A	A4\\F Aq!V,,IAvC1IIy1..//AAqAs

,QW\:
;C}}
aS3v:tDAJJ':'::;;
<
<CE+hqkk**++!444 f c>>DcJJJ#vr@   c                    |t           u rd}nt          j        dt          d           t	          |           } d }t          | |d          \  }}dt          z  dt          z  d	t          |j	        j
                          }||k     r|S t          | d
          }t          j        |          }d|z  }| |t          j        | j        d                   z  z   }	|}
t!          d          D ]`}t#          |	          }d|	|z   z  }	dt%          |	|	          |	z   z  }t'          t%          ||          |z
  d          }||k     s|
|k    r n|}
a|r't)          |          r||k    rt+          d|           |	S |	|fS )a  
    Matrix sign function.

    Extension of the scalar sign(x) to matrices.

    Parameters
    ----------
    A : (N, N) array_like
        Matrix at which to evaluate the sign function
    disp : bool, optional
        Print warning if error in the result is estimated large
        instead of returning estimated error. (Default: True)

        .. deprecated:: 1.16.0
            The `disp` argument is deprecated and will be
            removed in SciPy 1.18.0. The previously returned error estimate
            can be computed as ``norm(signm @ signm - signm, 1)``.

    Returns
    -------
    signm : (N, N) ndarray
        Value of the sign function at `A`
    errest : float
        (if disp == False)

        1-norm of the estimated error, ||err||_1 / ||A||_1

    Examples
    --------
    >>> from scipy.linalg import signm, eigvals
    >>> a = [[1,2,3], [1,2,1], [1,1,1]]
    >>> eigvals(a)
    array([ 4.12488542+0.j, -0.76155718+0.j,  0.63667176+0.j])
    >>> eigvals(signm(a))
    array([-1.+0.j,  1.+0.j,  1.+0.j])

    Tr[   r6   r\   c                     t          j        |           }|j        j        dk    rdt          z  t          |           z  }ndt          z  t          |           z  }t          t          |          |k    |z            S )Nr0   rB   )	r7   rO   rK   rL   rH   r   rI   r   r   )rx   rxcs      r>   rounded_signzsignm.<locals>.rounded_sign  se    WQZZ8=CDa AACQAXb\\A%+,,,r@   r   )rj   rB   rC   F)
compute_uvr   d   r   z1signm result may be inaccurate, approximate err =)r   rd   re   rf   r?   r*   rH   rI   rJ   rK   rL   r   r7   r   identityr:   rv   r   r   r   r   r   )r=   rj   r   resultrl   rk   valsmax_svr   S0prev_errestr1   iS0Pps                 r>   r+   r+     s   N x =(Q	8 	8 	8 	8 	A- - - !\222NFFTc#g&&'78I'JKF qU###DWT]]F 	F
A	
Qr{171:&&&	&BK3ZZ  "gg"s(^#b"++b.!c"bkk"na((F??kV33E  	O6V#3#3EvNNN	6zr@   )r   r6   )br6   c                 R   t          j        |           } t          j        |          }| j        dk    r|j        dk    st          d          | j        d         |j        d         k    st          d          | j        dk    s|j        dk    r@| j        d         |j        d         z  }| j        d         }t          j        | ||f          S | dddt           j        ddf         |dt           j        ddddf         z  }|                    d	|j        dd         z             S )
a  
    Khatri-Rao product of two matrices.

    A column-wise Kronecker product of two matrices

    Parameters
    ----------
    a : (n, k) array_like
        Input array
    b : (m, k) array_like
        Input array

    Returns
    -------
    c:  (n*m, k) ndarray
        Khatri-rao product of `a` and `b`.

    Notes
    -----
    The mathematical definition of the Khatri-Rao product is:

    .. math::

        (A_{ij}  \bigotimes B_{ij})_{ij}

    which is the Kronecker product of every column of A and B, e.g.::

        c = np.vstack([np.kron(a[:, k], b[:, k]) for k in range(b.shape[1])]).T

    Examples
    --------
    >>> import numpy as np
    >>> from scipy import linalg
    >>> a = np.array([[1, 2, 3], [4, 5, 6]])
    >>> b = np.array([[3, 4, 5], [6, 7, 8], [2, 3, 9]])
    >>> linalg.khatri_rao(a, b)
    array([[ 3,  8, 15],
           [ 6, 14, 24],
           [ 2,  6, 27],
           [12, 20, 30],
           [24, 35, 48],
           [ 8, 15, 54]])

    r6   z(The both arrays should be 2-dimensional.r   z6The number of columns for both arrays should be equal.r   )r:   .N)rp   )	r7   r8   r}   r;   r:   r|   r   newaxisreshape)r   r   r   r   r   s        r>   r.   r.     s   \ 	
1A

1AFaKKAFaKKCDDD71:## , - - 	- 	v{{afkkGAJ#GAJ}Qq!f---- 	
#qqq"*aaa
 1S"*aaa%:#;;A99UQWQRR[()))r@   )N)T)Brd   	itertoolsr   numpyr7   r   r   r   r   r   r	   r
   r   r   r   r   r   scipy._lib._utilr   scipy._lib.deprecationr   scipy.linalgr   r   r   _miscr   _basicr   r   _decomp_svdr   _decomp_schurr   r   _expm_frechetr   r   _matfuncs_schur_sqrtmr   _matfuncs_expmr   r    _linalg_pythranr!   __all__finforI   rH   rJ   r?   rR   r-   r)   r"   r   r,   r#   r$   r%   r&   r'   r(   r*   r+   r.   rc   r@   r>   <module>r      s^             D D D D D D D D D D D D D D D D D D D D D D D D D D D D / . . . . . + + + + + + ? > > > > > > > > >                     ) ) ) ) ) ) ) ) 2 2 2 2 2 2 2 2 8 8 8 8 8 8 = = = = = = = = ( ( ( ( ( (& & & bhsmmrx}}CC   0   L 8,I ,I ,I^ 8 Q Q Q Qhh h hV   h S S S Sl 8% % %P 8% % %P 8$3 $3 $3N 8$6 $6 $6N 8$6 $6 $6N 8$5 $5 $5N 8[ [ [ [| 8 Y Y Y Yx 8X&&?* ?* '&?* ?* ?*r@   