
    ge-                         d Z ddlmZ ddlmZmZ ddlZddlmZ ddl	m
Z
mZ ddlmZ dd	lmZ d
 ej        d         D             Zg dZddZddZ	 	 ddZdS )zLU decomposition functions.    )warn)asarrayasarray_chkfiniteN)product   )_datacopiedLinAlgWarning)get_lapack_funcs)lu_dispatcherc                 T    i | ]$d                      fddD                       %S ) c                 >    g | ]}t          j        |          |S  )npcan_cast).0yxs     7lib/python3.11/site-packages/scipy/linalg/_decomp_lu.py
<listcomp>z<dictcomp>.<listcomp>   s*    GGGaR[A5F5FGGGG    fdFD)joinr   r   s    @r   
<dictcomp>r      sL     2 2 2 rwwGGGG6GGGHH 2 2 2r   All)lulu_solve	lu_factorFTc                 *   |rt          |           }nt          |           }|pt          ||           }t          d|f          \  } |||          \  }}}|dk     rt	          d| z            |dk    rt          d|z  t          d           ||fS )aJ  
    Compute pivoted LU decomposition of a matrix.

    The decomposition is::

        A = P L U

    where P is a permutation matrix, L lower triangular with unit
    diagonal elements, and U upper triangular.

    Parameters
    ----------
    a : (M, N) array_like
        Matrix to decompose
    overwrite_a : bool, optional
        Whether to overwrite data in A (may increase performance)
    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
    -------
    lu : (M, N) ndarray
        Matrix containing U in its upper triangle, and L in its lower triangle.
        The unit diagonal elements of L are not stored.
    piv : (N,) ndarray
        Pivot indices representing the permutation matrix P:
        row i of matrix was interchanged with row piv[i].

    See Also
    --------
    lu : gives lu factorization in more user-friendly format
    lu_solve : solve an equation system using the LU factorization of a matrix

    Notes
    -----
    This is a wrapper to the ``*GETRF`` routines from LAPACK. Unlike
    :func:`lu`, it outputs the L and U factors into a single array
    and returns pivot indices instead of a permutation matrix.

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.linalg import lu_factor
    >>> A = np.array([[2, 5, 8, 7], [5, 2, 2, 8], [7, 5, 6, 6], [5, 4, 4, 8]])
    >>> lu, piv = lu_factor(A)
    >>> piv
    array([2, 2, 3, 3], dtype=int32)

    Convert LAPACK's ``piv`` array to NumPy index and test the permutation

    >>> piv_py = [2, 0, 3, 1]
    >>> L, U = np.tril(lu, k=-1) + np.eye(4), np.triu(lu)
    >>> np.allclose(A[piv_py] - L @ U, np.zeros((4, 4)))
    True
    )getrf)overwrite_ar   z<illegal value in %dth argument of internal getrf (lu_factor)z4Diagonal number %d is exactly zero. Singular matrix.   )
stacklevel)r   r   r   r
   
ValueErrorr   r	   )ar"   check_finitea1r!   r   pivinfos           r   r   r      s    t  q!!QZZ5+b!"4"4Kj2%00FEE"+666MBTaxx 69=> ? ? 	?axxCdJq	* 	* 	* 	*s7Nr   c                    | \  }}|rt          |          }nt          |          }|pt          ||          }|j        d         |j        d         k    r-t	          d                    |j        |j                            t          d||f          \  } ||||||          \  }	}
|
dk    r|	S t	          d|
 z            )a  Solve an equation system, a x = b, given the LU factorization of a

    Parameters
    ----------
    (lu, piv)
        Factorization of the coefficient matrix a, as given by lu_factor
    b : array
        Right-hand side
    trans : {0, 1, 2}, optional
        Type of system to solve:

        =====  =========
        trans  system
        =====  =========
        0      a x   = b
        1      a^T x = b
        2      a^H x = b
        =====  =========
    overwrite_b : bool, optional
        Whether to overwrite data in b (may increase performance)
    check_finite : bool, optional
        Whether to check that the input matrices 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
    -------
    x : array
        Solution to the system

    See Also
    --------
    lu_factor : LU factorize a matrix

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.linalg import lu_factor, lu_solve
    >>> A = np.array([[2, 5, 8, 7], [5, 2, 2, 8], [7, 5, 6, 6], [5, 4, 4, 8]])
    >>> b = np.array([1, 1, 1, 1])
    >>> lu, piv = lu_factor(A)
    >>> x = lu_solve((lu, piv), b)
    >>> np.allclose(A @ x - b, np.zeros((4,)))
    True

    r   z)Shapes of lu {} and b {} are incompatible)getrs)transoverwrite_bz4illegal value in %dth argument of internal gesv|posv)r   r   r   shaper%   formatr
   )
lu_and_pivbr-   r.   r'   r   r)   b1r,   r   r*   s              r   r   r   ^   s    ^ IR q!!QZZ3R!3!3K	x{bhqk!!D &28446 6 	6 j2r(33FEeBRu+FFFGAtqyy
Ku   r   c                 X	   |rt          j        |           nt          j        |           }|j        dk     rt	          d          |j        j        dvrNt          |j        j                 }|st          d|j         d          |	                    |d                   }d}|j
        ^ }}}	t          ||	          }
|j        j        dv rd	nd
}t          |j
         dk    r|rFt          j        g |||
|j                  }t          j        g ||
|	|j                  }||fS |r$t          j        g |dt           j                  nt          j        g |dd|          }t          j        g |||
|j                  }t          j        g ||
|	|j                  }|||fS |j
        dd         dk    r|r,t          j        |          |r|n|                                fS |rt          j        g ||t"                    nt          j        |          }|t          j        |          |r|n|                                fS t%          ||           s|s|                    d          }|j        d         r|j        d         s|                    d          }|sdt          j        |t           j                  }t          j        |
|
g|j                  }t)          ||||           ||	k    r|||fn|||f\  }}}nt          j        g ||t           j                  }||	k    rkt          j        g ||
|
|j                  }t+          d |j
        dd         D              D ]&}t)          ||         ||         ||         |           '|}njt          j        g ||
|
|j                  }t+          d |j
        dd         D              D ]&}t)          ||         ||         ||         |           '|}|s|s|rWt          j        g ||||          }t          j        d |D             t          j        |          gz    }d|g ||R <   |}n3t          j        ||g|          }d|t          j        |          |f<   |}|r||fn|||fS )ae  
    Compute LU decomposition of a matrix with partial pivoting.

    The decomposition satisfies::

        A = P @ L @ U

    where ``P`` is a permutation matrix, ``L`` lower triangular with unit
    diagonal elements, and ``U`` upper triangular. If `permute_l` is set to
    ``True`` then ``L`` is returned already permuted and hence satisfying
    ``A = L @ U``.

    Parameters
    ----------
    a : (M, N) array_like
        Array to decompose
    permute_l : bool, optional
        Perform the multiplication P*L (Default: do not permute)
    overwrite_a : bool, optional
        Whether to overwrite data in a (may improve performance)
    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.
    p_indices : bool, optional
        If ``True`` the permutation information is returned as row indices.
        The default is ``False`` for backwards-compatibility reasons.

    Returns
    -------
    **(If `permute_l` is ``False``)**

    p : (..., M, M) ndarray
        Permutation arrays or vectors depending on `p_indices`
    l : (..., M, K) ndarray
        Lower triangular or trapezoidal array with unit diagonal.
        ``K = min(M, N)``
    u : (..., K, N) ndarray
        Upper triangular or trapezoidal array

    **(If `permute_l` is ``True``)**

    pl : (..., M, K) ndarray
        Permuted L matrix.
        ``K = min(M, N)``
    u : (..., K, N) ndarray
        Upper triangular or trapezoidal array

    Notes
    -----
    Permutation matrices are costly since they are nothing but row reorder of
    ``L`` and hence indices are strongly recommended to be used instead if the
    permutation is required. The relation in the 2D case then becomes simply
    ``A = L[P, :] @ U``. In higher dimensions, it is better to use `permute_l`
    to avoid complicated indexing tricks.

    In 2D case, if one has the indices however, for some reason, the
    permutation matrix is still needed then it can be constructed by
    ``np.eye(M)[P, :]``.

    Examples
    --------

    >>> import numpy as np
    >>> from scipy.linalg import lu
    >>> A = np.array([[2, 5, 8, 7], [5, 2, 2, 8], [7, 5, 6, 6], [5, 4, 4, 8]])
    >>> p, l, u = lu(A)
    >>> np.allclose(A, p @ l @ u)
    True
    >>> p  # Permutation matrix
    array([[0., 1., 0., 0.],  # Row index 1
           [0., 0., 0., 1.],  # Row index 3
           [1., 0., 0., 0.],  # Row index 0
           [0., 0., 1., 0.]]) # Row index 2
    >>> p, _, _ = lu(A, p_indices=True)
    >>> p
    array([1, 3, 0, 2])  # as given by row indices above
    >>> np.allclose(A, l[p, :] @ u)
    True

    We can also use nd-arrays, for example, a demonstration with 4D array:

    >>> rng = np.random.default_rng()
    >>> A = rng.uniform(low=-4, high=4, size=[3, 2, 4, 8])
    >>> p, l, u = lu(A)
    >>> p.shape, l.shape, u.shape
    ((3, 2, 4, 4), (3, 2, 4, 4), (3, 2, 4, 8))
    >>> np.allclose(A, p @ l @ u)
    True
    >>> PL, U = lu(A, permute_l=True)
    >>> np.allclose(A, PL @ U)
    True

    r#   z1The input array must be at least two-dimensional.r   z
The dtype z5 cannot be cast to float(32, 64) or complex(64, 128).r   TfFfd)r/   dtype)r8   N)r   r   C)orderC_CONTIGUOUS	WRITEABLEc                 ,    g | ]}t          |          S r   ranger   s     r   r   zlu.<locals>.<listcomp>C       A A Aaq A A Ar   c                 ,    g | ]}t          |          S r   r?   r   s     r   r   zlu.<locals>.<listcomp>I  rA   r   c                 6    g | ]}t          j        |          S r   )r   aranger   s     r   r   zlu.<locals>.<listcomp>S  s     777qbill777r   r   )r   r   r   ndimr%   r8   charlapack_cast_dict	TypeErrorastyper/   minemptyint32	ones_likecopyzerosintr   flagsr   r   ix_rD   )r&   	permute_lr"   r'   	p_indicesr(   
dtype_charndmnk
real_dcharPLUPLpuindPand_ixs                        r   r   r      sE   @ %1	C	a	 	 	 bjmmB	w{{LMMM 
x}F""%bhm4
 	E D D D D E E E YYz!}%%IRAAq		A--3J BH~ 		"a28<<<B{{Q{{"(;;;Aq5L7@ 9(B(("(3333+B++1+Z888 {{Q{{"(;;;A{{Q{{"(;;;Aa7N 
x} 	K<##K&FbbRWWYYGG8A '"a4444l2&& bl2&&{)I		JJ r1 $ 	$s##B H^$  +)>  WW3W HQbh'''HaV28,,,b!Q	*** !A1b!**Aq":1aa
 HXrX1XRX...q552q!BH555A A A28CRC= A A AB B BbgqvqvyAAAAAA 2q!BH555A A A28CRC= A A AB B BbgqvqvyAAAAA  
	 
 		+B++1+Z888BF77B7771FHEB{{{{OAA1a&
333B"#Bry||QA-Aq66Q1I-r   )FT)r   FT)FFTF)__doc__warningsr   numpyr   r   r   	itertoolsr   _miscr   r	   lapackr
   _decomp_lu_cythonr   	typecodesrG   __all__r   r   r   r   r   r   <module>rm      s   ! !       , , , , , , , ,           . - - - - - - - $ $ $ $ $ $ , , , , , ,2 2\%02 2 2  *
)
)G G G GT> > > >B <@|. |. |. |. |. |.r   