o
    Ö­j€p  ã                   @   sð   d Z ddlZddlZddlmZmZmZmZm	Z	 ddl
mZmZmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ g d¢Zdd„ Zdd„ ZeZdd„ Z dd„ Z!d dd„Z"d!dd„Z#d!dd„Z$d"dd„Z%dS )#zMatrix equation solver routinesé    N)ÚinvÚLinAlgErrorÚnormÚcondÚsvdé   )ÚsolveÚsolve_triangularÚmatrix_balance)Úget_lapack_funcs)Úschur)Úlu)Úqr)Úordqz)Ú_asarray_validated)Ú
block_diag)Úsolve_sylvesterÚsolve_continuous_lyapunovÚsolve_discrete_lyapunovÚsolve_lyapunovÚsolve_continuous_areÚsolve_discrete_arec                 C   s  | j dks
|j dkr*tjtjtjtjdœ}td| ||fd�\}tj|j||j	 d�S t
| dd�\}}t
| ¡  ¡ dd�\}}t t | ¡  ¡ |¡|¡}	td|||	fƒ\}
|
du r]td	ƒ‚|
|||	d
d�\}}}|| }|dk rxtd| f ƒ‚t t ||¡| ¡  ¡ ¡S )aŽ  
    Computes a solution (X) to the Sylvester equation :math:`AX + XB = Q`.

    Parameters
    ----------
    a : (M, M) array_like
        Leading matrix of the Sylvester equation
    b : (N, N) array_like
        Trailing matrix of the Sylvester equation
    q : (M, N) array_like
        Right-hand side

    Returns
    -------
    x : (M, N) ndarray
        The solution to the Sylvester equation.

    Raises
    ------
    LinAlgError
        If solution was not found

    Notes
    -----
    Computes a solution to the Sylvester matrix equation via the Bartels-
    Stewart algorithm. The A and B matrices first undergo Schur
    decompositions. The resulting matrices are used to construct an
    alternative Sylvester equation (``RY + YS^T = F``) where the R and S
    matrices are in quasi-triangular form (or, when R, S or F are complex,
    triangular form). The simplified equation is then solved using
    ``*TRSYL`` from LAPACK directly.

    .. versionadded:: 0.11.0

    Examples
    --------
    Given `a`, `b`, and `q` solve for `x`:

    >>> import numpy as np
    >>> from scipy import linalg
    >>> a = np.array([[-3, -2, 0], [-1, -1, 3], [3, -5, -1]])
    >>> b = np.array([[1]])
    >>> q = np.array([[1],[2],[3]])
    >>> x = linalg.solve_sylvester(a, b, q)
    >>> x
    array([[ 0.0625],
           [-0.5625],
           [ 0.6875]])
    >>> np.allclose(a.dot(x) + x.dot(b), q)
    True

    r   ©ÚsÚdÚcÚz©Útrsyl©Úarrays©ÚdtypeÚreal©ÚoutputNzQLAPACK implementation does not contain a proper Sylvester equation solver (TRSYL)ÚC©Útranbz(Illegal value encountered in the %d term)ÚsizeÚnpÚfloat32Úfloat64Ú	complex64Ú
complex128r   ÚemptyÚshapeÚtypecoder   ÚconjÚ	transposeÚdotÚRuntimeErrorr   )ÚaÚbÚqÚtdictÚfuncÚrÚur   ÚvÚfr   ÚyÚscaleÚinfo© rB   úR/var/www/html/CropPilot/venv/lib/python3.10/site-packages/scipy/linalg/_solvers.pyr      s&   6ÿÿr   c                 C   sr  t  t| dd�¡} t  t|dd�¡}t}t| |fƒD ]\}}t  |¡r%t}t j|jŽ s5t	dd| › d�ƒ‚q| j|jkr@t	dƒ‚| j
dkrdt jt jt jt jdœ}td	| |fd
�\}t j| j||j d�S t| dd�\}}| ¡ j | |¡¡}	td||	fƒ}
|tu r„dnd}|
|||	|d�\}}}|dk ržt	d| › d�ƒ‚|dkrªtjdtdd� ||9 }| |¡ | ¡ j¡S )aÍ  
    Solves the continuous Lyapunov equation :math:`AX + XA^H = Q`.

    Uses the Bartels-Stewart algorithm to find :math:`X`.

    Parameters
    ----------
    a : array_like
        A square matrix

    q : array_like
        Right-hand side square matrix

    Returns
    -------
    x : ndarray
        Solution to the continuous Lyapunov equation

    See Also
    --------
    solve_discrete_lyapunov : computes the solution to the discrete-time
        Lyapunov equation
    solve_sylvester : computes the solution to the Sylvester equation

    Notes
    -----
    The continuous Lyapunov equation is a special form of the Sylvester
    equation, hence this solver relies on LAPACK routine ?TRSYL.

    .. versionadded:: 0.11.0

    Examples
    --------
    Given `a` and `q` solve for `x`:

    >>> import numpy as np
    >>> from scipy import linalg
    >>> a = np.array([[-3, -2, 0], [-1, -1, 0], [0, -5, -1]])
    >>> b = np.array([2, 4, -1])
    >>> q = np.eye(3)
    >>> x = linalg.solve_continuous_lyapunov(a, q)
    >>> x
    array([[ -0.75  ,   0.875 ,  -3.75  ],
           [  0.875 ,  -1.375 ,   5.3125],
           [ -3.75  ,   5.3125, -27.0625]])
    >>> np.allclose(a.dot(x) + x.dot(a.T), q)
    True
    T©Úcheck_finiteúMatrix Úaqú should be square.ú*Matrix a and q should have the same shape.r   r   r   r   r!   r#   r$   r   ÚTr&   r'   zH?TRSYL exited with the internal error "illegal value in argument number z8.". See LAPACK documentation for the ?TRSYL error codes.r   z†Input "a" has an eigenvalue pair whose sum is very close to or exactly zero. The solution is obtained via perturbing the coefficients.é   )Ú
stacklevel)r*   Ú
atleast_2dr   ÚfloatÚ	enumerateÚiscomplexobjÚcomplexÚequalr0   Ú
ValueErrorr)   r+   r,   r-   r.   r   r/   r1   r   r2   rJ   r4   ÚwarningsÚwarnÚRuntimeWarning)r6   r8   Úr_or_cÚindÚ_r9   r:   r;   r<   r>   r   Údtype_stringr?   r@   rA   rB   rB   rC   r   s   s@   2
ÿ
ÿ
ÿýr   c                 C   s@   t  | |  ¡ ¡}t  |jd ¡| }t|| ¡ ƒ}t  ||j¡S )zÄ
    Solves the discrete Lyapunov equation directly.

    This function is called by the `solve_discrete_lyapunov` function with
    `method=direct`. It is not supposed to be called directly.
    r   )r*   Úkronr2   Úeyer0   r   ÚflattenÚreshape)r6   r8   ÚlhsÚxrB   rB   rC   Ú_solve_discrete_lyapunov_directÚ   s   ra   c                 C   sl   t  | jd ¡}|  ¡  ¡ }t|| ƒ}t  || |¡}dt  t  t| | ƒ|¡|¡ }t| ¡  ¡ | ƒS )zÝ
    Solves the discrete Lyapunov equation using a bilinear transformation.

    This function is called by the `solve_discrete_lyapunov` function with
    `method=bilinear`. It is not supposed to be called directly.
    r   rK   )r*   r\   r0   r2   r3   r   r4   r   )r6   r8   r\   ÚaHÚaHI_invr7   r   rB   rB   rC   Ú!_solve_discrete_lyapunov_bilinearé   s    rd   c                 C   sv   t  | ¡} t  |¡}|du r| jd dkrd}nd}| ¡ }|dkr)t| |ƒ}|S |dkr4t| |ƒ}|S td|› �ƒ‚)a	  
    Solves the discrete Lyapunov equation :math:`AXA^H - X + Q = 0`.

    Parameters
    ----------
    a, q : (M, M) array_like
        Square matrices corresponding to A and Q in the equation
        above respectively. Must have the same shape.

    method : {'direct', 'bilinear'}, optional
        Type of solver.

        If not given, chosen to be ``direct`` if ``M`` is less than 10 and
        ``bilinear`` otherwise.

    Returns
    -------
    x : ndarray
        Solution to the discrete Lyapunov equation

    See Also
    --------
    solve_continuous_lyapunov : computes the solution to the continuous-time
        Lyapunov equation

    Notes
    -----
    This section describes the available solvers that can be selected by the
    'method' parameter. The default method is *direct* if ``M`` is less than 10
    and ``bilinear`` otherwise.

    Method *direct* uses a direct analytical solution to the discrete Lyapunov
    equation. The algorithm is given in, for example, [1]_. However, it requires
    the linear solution of a system with dimension :math:`M^2` so that
    performance degrades rapidly for even moderately sized matrices.

    Method *bilinear* uses a bilinear transformation to convert the discrete
    Lyapunov equation to a continuous Lyapunov equation :math:`(BX+XB'=-C)`
    where :math:`B=(A-I)(A+I)^{-1}` and
    :math:`C=2(A' + I)^{-1} Q (A + I)^{-1}`. The continuous equation can be
    efficiently solved since it is a special case of a Sylvester equation.
    The transformation algorithm is from Popov (1964) as described in [2]_.

    .. versionadded:: 0.11.0

    References
    ----------
    .. [1] "Lyapunov equation", Wikipedia,
       https://en.wikipedia.org/wiki/Lyapunov_equation#Discrete_time
    .. [2] Gajic, Z., and M.T.J. Qureshi. 2008.
       Lyapunov Matrix Equation in System Stability and Control.
       Dover Books on Engineering Series. Dover Publications.

    Examples
    --------
    Given `a` and `q` solve for `x`:

    >>> import numpy as np
    >>> from scipy import linalg
    >>> a = np.array([[0.2, 0.5],[0.7, -0.9]])
    >>> q = np.eye(2)
    >>> x = linalg.solve_discrete_lyapunov(a, q)
    >>> x
    array([[ 0.70872893,  1.43518822],
           [ 1.43518822, -2.4266315 ]])
    >>> np.allclose(a.dot(x).dot(a.T)-x, -q)
    True

    Nr   é
   ÚbilinearÚdirectzUnknown solver )r*   Úasarrayr0   Úlowerra   rd   rS   )r6   r8   ÚmethodÚmethr`   rB   rB   rC   r   ø   s   
F

û
þr   Tc              
   C   sœ  t | |||||dƒ\
} }}}}}}}}	}
tjd| | d| | f|	d�}| |d|…d|…f< d|d|…|d| …f< ||d|…d| d…f< | ||d| …d|…f< |  ¡ j ||d| …|d| …f< |du rldn| ||d| …d| d…f< |du r�dn| ¡ j|d| d…d|…f< | ¡ j|d| d…|d| …f< ||d| d…d| d…f< |
rÄ|durÄt|| ¡ jtj||	d�ƒ}ntt d| ¡tj||	d�ƒ}|�r9t |¡t |¡ }t 	|d¡ t
|ddd�\}\}}t |t |¡¡�s9t |¡}t ||d| … |d|…  d ¡}dtj|| |d| d… f  }|dd…df t |¡ }||9 }||9 }t|dd…| d…f ƒ\}}|dd…|d…f  ¡ j |dd…dd| …f ¡}|dd| …|d…f  ¡ j |dd| …dd| …f ¡}|	tu �r‡d	nd
}t||dddd|d�\}}}}}}|du�r½tt | |d|…d|…f ¡||d…d|…f f¡ƒ\}}|d|…d|…f }||d…d|…f }t|ƒ\}}}dt|ƒ t d¡k �rètdƒ‚t| ¡ jt| ¡ j| ¡ jdd�dd� ¡ j | ¡ j¡}|�r||d|…df |d|…  9 }| ¡ j |¡}t|dƒ}|| ¡ j }t t d¡d| g¡}t|dƒ|k�rEtdƒ‚|| ¡ j d S )a  
    Solves the continuous-time algebraic Riccati equation (CARE).

    The CARE is defined as

    .. math::

          X A + A^H X - X B R^{-1} B^H X + Q = 0

    The limitations for a solution to exist are :

        * All eigenvalues of :math:`A` on the right half plane, should be
          controllable.

        * The associated hamiltonian pencil (See Notes), should have
          eigenvalues sufficiently away from the imaginary axis.

    Moreover, if ``e`` or ``s`` is not precisely ``None``, then the
    generalized version of CARE

    .. math::

          E^HXA + A^HXE - (E^HXB + S) R^{-1} (B^HXE + S^H) + Q = 0

    is solved. When omitted, ``e`` is assumed to be the identity and ``s``
    is assumed to be the zero matrix with sizes compatible with ``a`` and
    ``b``, respectively.

    Parameters
    ----------
    a : (M, M) array_like
        Square matrix
    b : (M, N) array_like
        Input
    q : (M, M) array_like
        Input
    r : (N, N) array_like
        Nonsingular square matrix
    e : (M, M) array_like, optional
        Nonsingular square matrix
    s : (M, N) array_like, optional
        Input
    balanced : bool, optional
        The boolean that indicates whether a balancing step is performed
        on the data. The default is set to True.

    Returns
    -------
    x : (M, M) ndarray
        Solution to the continuous-time algebraic Riccati equation.

    Raises
    ------
    LinAlgError
        For cases where the stable subspace of the pencil could not be
        isolated. See Notes section and the references for details.

    See Also
    --------
    solve_discrete_are : Solves the discrete-time algebraic Riccati equation

    Notes
    -----
    The equation is solved by forming the extended hamiltonian matrix pencil,
    as described in [1]_, :math:`H - \lambda J` given by the block matrices ::

        [ A    0    B ]             [ E   0    0 ]
        [-Q  -A^H  -S ] - \lambda * [ 0  E^H   0 ]
        [ S^H B^H   R ]             [ 0   0    0 ]

    and using a QZ decomposition method.

    In this algorithm, the fail conditions are linked to the symmetry
    of the product :math:`U_2 U_1^{-1}` and condition number of
    :math:`U_1`. Here, :math:`U` is the 2m-by-m matrix that holds the
    eigenvectors spanning the stable subspace with 2-m rows and partitioned
    into two m-row matrices. See [1]_ and [2]_ for more details.

    In order to improve the QZ decomposition accuracy, the pencil goes
    through a balancing step where the sum of absolute values of
    :math:`H` and :math:`J` entries (after removing the diagonal entries of
    the sum) is balanced following the recipe given in [3]_.

    .. versionadded:: 0.11.0

    References
    ----------
    .. [1]  P. van Dooren , "A Generalized Eigenvalue Approach For Solving
       Riccati Equations.", SIAM Journal on Scientific and Statistical
       Computing, Vol.2(2), :doi:`10.1137/0902010`

    .. [2] A.J. Laub, "A Schur Method for Solving Algebraic Riccati
       Equations.", Massachusetts Institute of Technology. Laboratory for
       Information and Decision Systems. LIDS-R ; 859. Available online :
       http://hdl.handle.net/1721.1/1301

    .. [3] P. Benner, "Symplectic Balancing of Hamiltonian Matrices", 2001,
       SIAM J. Sci. Comput., 2001, Vol.22(5), :doi:`10.1137/S1064827500367993`

    Examples
    --------
    Given `a`, `b`, `q`, and `r` solve for `x`:

    >>> import numpy as np
    >>> from scipy import linalg
    >>> a = np.array([[4, 3], [-4.5, -3.5]])
    >>> b = np.array([[1], [-1]])
    >>> q = np.array([[9, 6], [6, 4.]])
    >>> r = 1
    >>> x = linalg.solve_continuous_are(a, b, q, r)
    >>> x
    array([[ 21.72792206,  14.48528137],
           [ 14.48528137,   9.65685425]])
    >>> np.allclose(a.T.dot(x) + x.dot(a)-x.dot(b).dot(b.T).dot(x), -q)
    True

    ÚcarerK   r!   Nç        r   r   ©ÚseparateÚpermuter#   rQ   ÚlhpTF©ÚsortÚoverwrite_aÚoverwrite_brE   r%   ç      ð?ú!Failed to find a finite solution.©ri   ©Úunit_diagonalç     @�@çš™™™™™¹?zQThe associated Hamiltonian pencil has eigenvalues too close to the imaginary axis)Ú_are_validate_argsr*   r/   r2   rJ   r   Ú
zeros_liker\   ÚabsÚfill_diagonalr
   ÚallcloseÚ	ones_likeÚlog2ÚroundÚr_Ú
reciprocalr   r4   rN   r   Úvstackr   r   Úspacingr   r	   r   Úmax)r6   r7   r8   r;   Úer   ÚbalancedÚmÚnrW   Úgen_areÚHÚJÚMrY   ÚscaÚelwisescaleÚout_strr<   Úu00Úu10ÚupÚulÚuur`   Úu_symÚn_u_symÚsym_thresholdrB   rB   rC   r   S  sx   xÿ"$**"
&"4<
þ
<

þüû 
r   c              
   C   sœ  t | |||||dƒ\
} }}}}}}}}	}
tjd| | d| | f|	d�}| |d|…d|…f< ||d|…d| d…f< | ||d| …d|…f< |du rQt |¡n| ¡ j||d| …|d| …f< |du rhdn| ||d| …d| d…f< |du r}dn| ¡ j|d| d…d|…f< ||d| d…d| d…f< tj||	d�}|du rªt |¡n||d|…d|…f< |  ¡ j||d| …|d| …f< | ¡ j |d| d…|d| …f< |�r=t |¡t |¡ }t |d¡ t	|ddd�\}\}}t 
|t |¡¡�s=t |¡}t ||d| … |d|…  d ¡}dtj|| |d| d… f  }|dd…df t |¡ }||9 }||9 }t|dd…| d…f ƒ\}}|dd…|d…f  ¡ j |dd…dd| …f ¡}|dd…|d…f  ¡ j |dd…dd| …f ¡}|	tu �r‡d	nd
}t||dddd|d�\}}}}}}|du�r½tt | |d|…d|…f ¡||d…d|…f f¡ƒ\}}|d|…d|…f }||d…d|…f }t|ƒ\}}}dt|ƒ t d¡k �rètdƒ‚t| ¡ jt| ¡ j| ¡ jdd�dd� ¡ j | ¡ j¡}|�r||d|…df |d|…  9 }| ¡ j |¡}t|dƒ}|| ¡ j }t t d¡d| g¡}t|dƒ|k�rEtdƒ‚|| ¡ j d S )al  
    Solves the discrete-time algebraic Riccati equation (DARE).

    The DARE is defined as

    .. math::

          A^HXA - X - (A^HXB) (R + B^HXB)^{-1} (B^HXA) + Q = 0

    The limitations for a solution to exist are :

        * All eigenvalues of :math:`A` outside the unit disc, should be
          controllable.

        * The associated symplectic pencil (See Notes), should have
          eigenvalues sufficiently away from the unit circle.

    Moreover, if ``e`` and ``s`` are not both precisely ``None``, then the
    generalized version of DARE

    .. math::

          A^HXA - E^HXE - (A^HXB+S) (R+B^HXB)^{-1} (B^HXA+S^H) + Q = 0

    is solved. When omitted, ``e`` is assumed to be the identity and ``s``
    is assumed to be the zero matrix.

    Parameters
    ----------
    a : (M, M) array_like
        Square matrix
    b : (M, N) array_like
        Input
    q : (M, M) array_like
        Input
    r : (N, N) array_like
        Square matrix
    e : (M, M) array_like, optional
        Nonsingular square matrix
    s : (M, N) array_like, optional
        Input
    balanced : bool
        The boolean that indicates whether a balancing step is performed
        on the data. The default is set to True.

    Returns
    -------
    x : (M, M) ndarray
        Solution to the discrete algebraic Riccati equation.

    Raises
    ------
    LinAlgError
        For cases where the stable subspace of the pencil could not be
        isolated. See Notes section and the references for details.

    See Also
    --------
    solve_continuous_are : Solves the continuous algebraic Riccati equation

    Notes
    -----
    The equation is solved by forming the extended symplectic matrix pencil,
    as described in [1]_, :math:`H - \lambda J` given by the block matrices ::

           [  A   0   B ]             [ E   0   B ]
           [ -Q  E^H -S ] - \lambda * [ 0  A^H  0 ]
           [ S^H  0   R ]             [ 0 -B^H  0 ]

    and using a QZ decomposition method.

    In this algorithm, the fail conditions are linked to the symmetry
    of the product :math:`U_2 U_1^{-1}` and condition number of
    :math:`U_1`. Here, :math:`U` is the 2m-by-m matrix that holds the
    eigenvectors spanning the stable subspace with 2-m rows and partitioned
    into two m-row matrices. See [1]_ and [2]_ for more details.

    In order to improve the QZ decomposition accuracy, the pencil goes
    through a balancing step where the sum of absolute values of
    :math:`H` and :math:`J` rows/cols (after removing the diagonal entries)
    is balanced following the recipe given in [3]_. If the data has small
    numerical noise, balancing may amplify their effects and some clean up
    is required.

    .. versionadded:: 0.11.0

    References
    ----------
    .. [1]  P. van Dooren , "A Generalized Eigenvalue Approach For Solving
       Riccati Equations.", SIAM Journal on Scientific and Statistical
       Computing, Vol.2(2), :doi:`10.1137/0902010`

    .. [2] A.J. Laub, "A Schur Method for Solving Algebraic Riccati
       Equations.", Massachusetts Institute of Technology. Laboratory for
       Information and Decision Systems. LIDS-R ; 859. Available online :
       http://hdl.handle.net/1721.1/1301

    .. [3] P. Benner, "Symplectic Balancing of Hamiltonian Matrices", 2001,
       SIAM J. Sci. Comput., 2001, Vol.22(5), :doi:`10.1137/S1064827500367993`

    Examples
    --------
    Given `a`, `b`, `q`, and `r` solve for `x`:

    >>> import numpy as np
    >>> from scipy import linalg as la
    >>> a = np.array([[0, 1], [0, -1]])
    >>> b = np.array([[1, 0], [2, 1]])
    >>> q = np.array([[-4, -4], [-4, 7]])
    >>> r = np.array([[9, 3], [3, 1]])
    >>> x = la.solve_discrete_are(a, b, q, r)
    >>> x
    array([[-4., -4.],
           [-4.,  7.]])
    >>> R = la.solve(r + b.T.dot(x).dot(b), b.T.dot(x).dot(a))
    >>> np.allclose(a.T.dot(x).dot(a) - x - a.T.dot(x).dot(b).dot(R), -q)
    True

    ÚdarerK   r!   Nrm   r   r   rn   r#   rQ   ÚiucTFrr   rv   rw   rx   ry   r{   r|   zMThe associated symplectic pencil has eigenvalues too close to the unit circle)r}   r*   Úzerosr\   r2   rJ   r~   r   r€   r
   r�   r‚   rƒ   r„   r…   r†   r   r4   rN   r   r‡   r   r   rˆ   r   r	   r   r‰   )r6   r7   r8   r;   rŠ   r   r‹   rŒ   r�   rW   rŽ   r�   r�   r‘   rY   r’   r“   Úq_of_qrr”   r<   r•   r–   r—   r˜   r™   r`   rš   r›   rœ   rB   rB   rC   r      sz   zÿ"4**&"$
&"44ü
<

þüû 
r   rl   c              
   C   s”  |  ¡ dvr
tdƒ‚t t| dd�¡} t t|dd�¡}t t|dd�¡}t t|dd�¡}t |¡r5tnt}t| ||fƒD ]\}}	t |	¡rIt}tj	|	j
Ž sYtdd| › d�ƒ‚q>|j
\}
}|
| j
d krjtd	ƒ‚|
|j
d krutd
ƒ‚||j
d kr€tdƒ‚t||fƒD ]"\}}	t|	|	 ¡ j dƒt t|	dƒ¡d kr¨tdd| › d�ƒ‚q†|dkrÉt|dd�d }|dksÅ|t d¡t|dƒ k rÉtdƒ‚|dupÐ|du}|�r>|du�rt t|dd�¡}tj	|j
Ž sìtdƒ‚|
|j
d kr÷tdƒ‚t|dd�d }|dk�s|t d¡t|dƒ k �rtdƒ‚t |¡�rt}|du�r>t t|dd�¡}|j
|j
k�r6tdƒ‚t |¡�r>t}| ||||||
|||f
S )a‹  
    A helper function to validate the arguments supplied to the
    Riccati equation solvers. Any discrepancy found in the input
    matrices leads to a ``ValueError`` exception.

    Essentially, it performs:

        - a check whether the input is free of NaN and Infs
        - a pass for the data through ``numpy.atleast_2d()``
        - squareness check of the relevant arrays
        - shape consistency check of the arrays
        - singularity check of the relevant arrays
        - symmetricity check of the relevant matrices
        - a check whether the regular or the generalized version is asked.

    This function is used by ``solve_continuous_are`` and
    ``solve_discrete_are``.

    Parameters
    ----------
    a, b, q, r, e, s : array_like
        Input data
    eq_type : str
        Accepted arguments are 'care' and 'dare'.

    Returns
    -------
    a, b, q, r, e, s : ndarray
        Regularized input data
    m, n : int
        shape of the problem
    r_or_c : type
        Data type of the problem, returns float or complex
    gen_or_not : bool
        Type of the equation, True for generalized and False for regular ARE.

    )r�   rl   z;Equation type unknown. Only 'care' and 'dare' is understoodTrD   rF   ÚaqrrH   r   z3Matrix a and b should have the same number of rows.rI   z3Matrix b and r should have the same number of cols.r   éd   r   z should be symmetric/hermitian.rl   F)Ú
compute_uvéÿÿÿÿrm   rv   z!Matrix r is numerically singular.NzMatrix e should be square.z*Matrix a and e should have the same shape.z!Matrix e is numerically singular.z*Matrix b and s should have the same shape.)ri   rS   r*   rM   r   rP   rQ   rN   rO   rR   r0   r   r2   rJ   rˆ   r   )r6   r7   r8   r;   rŠ   r   Úeq_typerW   rX   ÚmatrŒ   r�   Úmin_svÚgeneralized_caserB   rB   rC   r}   ñ  s`   '
ÿ
(ÿ 
$
r}   )N)NNT)rl   )&Ú__doc__rT   Únumpyr*   Únumpy.linalgr   r   r   r   r   Ú_basicr   r	   r
   Úlapackr   Ú_decomp_schurr   Ú
_decomp_lur   Ú
_decomp_qrr   Ú
_decomp_qzr   Ú_decompr   Ú_special_matricesr   Ú__all__r   r   r   ra   rd   r   r   r   r}   rB   rB   rB   rC   Ú<module>   s0    
Ud

[ 
N R