
    xfs(              
       6   d Z ddlZddlmZ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 d	d
gZg dZ	 	 ddZ ej$                  e      j(                  Z ej$                  e      j(                  Zdddddddddd	ZdddddddZddgddggZd Zd ZddZy)zSchur decomposition functions.    N)asarray_chkfinitesingleasarrayarray)norm   )LinAlgError_datacopied)get_lapack_funcs)eigvalsschurrsf2csf)ildc                    |dvrt        d      |rt        |       }nt        |       }t        |j                        dk7  s|j                  d   |j                  d   k7  rt        d      |j
                  j                  }|dv r3|dvr/|t        v r|j                  d	      }d	}n|j                  d
      }d
}|xs t        ||       }t        d|f      \  }||dk(  r; |d |d      }	|	d   d   j                  j                  t        j                        }|d}
d }n?d}
t        |      r|}n/|dk(  rd }n&|dk(  rd }n|dk(  rd }n|dk(  rd }nt        d       ||||||
      }	|	d   }|dk  rt        dj                  |             ||j                  d   dz   k(  rt!        d      ||j                  d   dz   k(  rt!        d      |dkD  rt!        d      |
dk(  r
|	d   |	d   fS |	d   |	d   |	d   fS ) a  
    Compute Schur decomposition of a matrix.

    The Schur decomposition is::

        A = Z T Z^H

    where Z is unitary and T is either upper-triangular, or for real
    Schur decomposition (output='real'), quasi-upper triangular. In
    the quasi-triangular form, 2x2 blocks describing complex-valued
    eigenvalue pairs may extrude from the diagonal.

    Parameters
    ----------
    a : (M, M) array_like
        Matrix to decompose
    output : {'real', 'complex'}, optional
        Construct the real or complex Schur decomposition (for real matrices).
    lwork : int, optional
        Work array size. If None or -1, it is automatically computed.
    overwrite_a : bool, optional
        Whether to overwrite data in a (may improve performance).
    sort : {None, callable, 'lhp', 'rhp', 'iuc', 'ouc'}, optional
        Specifies whether the upper eigenvalues should be sorted. A callable
        may be passed that, given a eigenvalue, returns a boolean denoting
        whether the eigenvalue should be sorted to the top-left (True).
        Alternatively, string parameters may be used::

            'lhp'   Left-hand plane (x.real < 0.0)
            'rhp'   Right-hand plane (x.real > 0.0)
            'iuc'   Inside the unit circle (x*x.conjugate() <= 1.0)
            'ouc'   Outside the unit circle (x*x.conjugate() > 1.0)

        Defaults to None (no sorting).
    check_finite : bool, optional
        Whether to check that the input matrix contains only finite numbers.
        Disabling may give a performance gain, but may result in problems
        (crashes, non-termination) if the inputs do contain infinities or NaNs.

    Returns
    -------
    T : (M, M) ndarray
        Schur form of A. It is real-valued for the real Schur decomposition.
    Z : (M, M) ndarray
        An unitary Schur transformation matrix for A.
        It is real-valued for the real Schur decomposition.
    sdim : int
        If and only if sorting was requested, a third return value will
        contain the number of eigenvalues satisfying the sort condition.

    Raises
    ------
    LinAlgError
        Error raised under three conditions:

        1. The algorithm failed due to a failure of the QR algorithm to
           compute all eigenvalues.
        2. If eigenvalue sorting was requested, the eigenvalues could not be
           reordered due to a failure to separate eigenvalues, usually because
           of poor conditioning.
        3. If eigenvalue sorting was requested, roundoff errors caused the
           leading eigenvalues to no longer satisfy the sorting condition.

    See Also
    --------
    rsf2csf : Convert real Schur form to complex Schur form

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.linalg import schur, eigvals
    >>> A = np.array([[0, 2, 2], [0, 1, 2], [1, 0, 1]])
    >>> T, Z = schur(A)
    >>> T
    array([[ 2.65896708,  1.42440458, -1.92933439],
           [ 0.        , -0.32948354, -0.49063704],
           [ 0.        ,  1.31178921, -0.32948354]])
    >>> Z
    array([[0.72711591, -0.60156188, 0.33079564],
           [0.52839428, 0.79801892, 0.28976765],
           [0.43829436, 0.03590414, -0.89811411]])

    >>> T2, Z2 = schur(A, output='complex')
    >>> T2
    array([[ 2.65896708, -1.22839825+1.32378589j,  0.42590089+1.51937378j],
           [ 0.        , -0.32948354+0.80225456j, -0.59877807+0.56192146j],
           [ 0.        ,  0.                    , -0.32948354-0.80225456j]])
    >>> eigvals(T2)
    array([2.65896708, -0.32948354+0.80225456j, -0.32948354-0.80225456j])

    An arbitrary custom eig-sorting condition, having positive imaginary part,
    which is satisfied by only one eigenvalue

    >>> T3, Z3, sdim = schur(A, output='complex', sort=lambda x: x.imag > 0)
    >>> sdim
    1

    )realcomplexrcz%argument must be 'real', or 'complex'   r   r   zexpected square matrix)r   r   )FDr   r   )geesc                      y N xs    </usr/lib/python3/dist-packages/scipy/linalg/_decomp_schur.py<lambda>zschur.<locals>.<lambda>   s        )lworkc                      y r   r   r   s    r!   	sfunctionzschur.<locals>.sfunction   s    r#   lhpc                      | j                   dk  S N        r   r   s    r!   r'   zschur.<locals>.sfunction   s    vv|#r#   rhpc                      | j                   dk\  S r*   r,   r   s    r!   r'   zschur.<locals>.sfunction   s    vv}$r#   iucc                     t        |       dk  S Ng      ?absr   s    r!   r'   zschur.<locals>.sfunction   s    1v}$r#   oucc                     t        |       dkD  S r1   r2   r   s    r!   r'   zschur.<locals>.sfunction   s    1v|#r#   zZ'sort' parameter must either be 'None', or a callable, or one of ('lhp','rhp','iuc','ouc'))r$   overwrite_asort_tz0illegal value in {}-th argument of internal geesz2Eigenvalues could not be separated for reordering.z2Leading eigenvalues do not satisfy sort condition.z/Schur form not found. Possibly ill-conditioned.)
ValueErrorr   r   lenshapedtypechar_double_precisionastyper
   r   r   numpyint_callableformatr	   )aoutputr$   r6   sortcheck_finitea1typr   resultr7   r'   infos                r!   r   r      s>   H 22@AAq!QZ
288}bhhqkRXXa[8122
((--C!!c&;##3BC3BC5+b!"4KY.ED}nb3r
1""))%**5|	 D>IU]$U]%U]%U]$  M N N )Ru+!F ":Dax "FD5M+ 	+	!q	 NOO	!q	 NOO	KLL{ay&*$$ay&*fQi//r#   )	bhBr   r   fr   r   r   )r   r   rO   r   r   r   rO   r   r   r   c                      d}d}| D ]>  }|j                   j                  }t        |t        |         }t        |t        |         }@ t
        |   |   S )Nr   )r<   r=   max_array_kind_array_precision_array_type)arrayskind	precisionrD   ts        r!   _commonTyperY      s\    DI 8GGLL4Q(	#3A#67	8 tY''r#   c                     d}|D ]E  }|j                   j                  | k(  r||j                         fz   }1||j                  |       fz   }G t	        |      dk(  r|d   S |S )Nr   r   r   )r<   r=   copyr?   r:   )typerU   cast_arraysrD   s       r!   	_castCopyr^      sl    K :77<<4%3K%$(99K	:
 ;11~r#   c           	      v   |rt        t        || f      \  }} nt        t        || f      \  }} t        || g      D ]P  \  }}|j                  dk7  s |j
                  d   |j
                  d   k7  s5t        dj                  d|                | j
                  d   |j
                  d   k7  r/t        dj                  |j
                  | j
                              | j
                  d   }t        || t        dgd            }t        |||       \  }} t        |dz
  dd	      D ]  }t        | ||dz
  f         t        t        | |dz
  |dz
  f         t        | ||f         z   z  kD  r@t        | |dz
  |dz   |dz
  |dz   f         | ||f   z
  }t        |d   | ||dz
  f   g      }	|d   |	z  }
| ||dz
  f   |	z  }t        |
j!                         |g| |
gg|
      }|j#                  | |dz
  |dz   |dz
  df         | |dz
  |dz   |dz
  df<   | d|dz   |dz
  |dz   f   j#                  |j!                         j$                        | d|dz   |dz
  |dz   f<   |dd|dz
  |dz   f   j#                  |j!                         j$                        |dd|dz
  |dz   f<   d| ||dz
  f<    | |fS )aQ  
    Convert real Schur form to complex Schur form.

    Convert a quasi-diagonal real-valued Schur form to the upper-triangular
    complex-valued Schur form.

    Parameters
    ----------
    T : (M, M) array_like
        Real Schur form of the original array
    Z : (M, M) array_like
        Schur transformation matrix
    check_finite : bool, optional
        Whether to check that the input arrays contain only finite numbers.
        Disabling may give a performance gain, but may result in problems
        (crashes, non-termination) if the inputs do contain infinities or NaNs.

    Returns
    -------
    T : (M, M) ndarray
        Complex Schur form of the original array
    Z : (M, M) ndarray
        Schur transformation matrix corresponding to the complex form

    See Also
    --------
    schur : Schur decomposition of an array

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.linalg import schur, rsf2csf
    >>> A = np.array([[0, 2, 2], [0, 1, 2], [1, 0, 1]])
    >>> T, Z = schur(A)
    >>> T
    array([[ 2.65896708,  1.42440458, -1.92933439],
           [ 0.        , -0.32948354, -0.49063704],
           [ 0.        ,  1.31178921, -0.32948354]])
    >>> Z
    array([[0.72711591, -0.60156188, 0.33079564],
           [0.52839428, 0.79801892, 0.28976765],
           [0.43829436, 0.03590414, -0.89811411]])
    >>> T2 , Z2 = rsf2csf(T, Z)
    >>> T2
    array([[2.65896708+0.j, -1.64592781+0.743164187j, -1.21516887+1.00660462j],
           [0.+0.j , -0.32948354+8.02254558e-01j, -0.82115218-2.77555756e-17j],
           [0.+0.j , 0.+0.j, -0.32948354-0.802254558j]])
    >>> Z2
    array([[0.72711591+0.j,  0.28220393-0.31385693j,  0.51319638-0.17258824j],
           [0.52839428+0.j,  0.24720268+0.41635578j, -0.68079517-0.15118243j],
           [0.43829436+0.j, -0.76618703+0.01873251j, -0.03063006+0.46857912j]])

    r   r   r   zInput '{}' must be square.ZTz.Input array shapes must match: Z: {} vs. T: {}g      @r   r   )r<   Nr+   )mapr   r   	enumeratendimr;   r9   rC   rY   r   r^   ranger3   epsr   r   conjdotT)rh   ZrG   indXNrX   mmur   r   sGs                r!   r   r      s   l $q!f-17QF#1QF# MQ66Q;!''!*
29@@cKLLM 	wwqzQWWQZ "F177AGG46 	6	
AAq%s+,AQ1DAq1Q32 qAaCy>CQqsAaCx[!1C!Q$L!@AA1Q3qs7AaC!G+,-!Q$7BbeQq!A#vY'(A1	A!QqS&	AA!}r1g.a8A uuQqs1Q3w!}%56Aac!A#gqstm !A#qs1Q3w/33AFFHJJ?AdqsdAaC!Gma1QqSjM--affhjj9Aa1QqSjM!QqS&	 a4Kr#   )r   NFNT)T)__doc__r@   r   r   r   r   numpy.linalgr   _miscr	   r
   lapackr   _decompr   __all__r>   r   finfofloatre   fepsrR   rS   rT   rY   r^   r   r   r#   r!   <module>rz      s    $  ; ;  , $ I
#  AEd0N ekk%u{{6AAAAAAA/C SzC:&(
Sr#   