
    \ci4                         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
 ddlmZmZ dd	lmZmZ dd
lmZ g dZ e
d          dd            ZddZ e
ddd          d             Z	 	 ddZdS )zLU decomposition functions.    )warn)asarrayasarray_chkfiniteN)product)_apply_over_batch   )_datacopiedLinAlgWarning)get_lapack_funcs_normalize_lapack_dtype)lu_dispatcher)lulu_solve	lu_factor)a   FTc                    |rt          |           }nt          |           }|j        dk    r8t          j        |          }t          j        dt          j                  }||fS |pt          ||           }t          d|f          \  } |||          \  }}}|dk     rt          d|  d          |dk    rt          d| dt          d	
           ||fS )al
  
    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 : (K,) ndarray
        Pivot indices representing the permutation matrix P:
        row i of matrix was interchanged with row piv[i].
        Of shape ``(K,)``, with ``K = min(M, N)``.

    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.

    While the underlying ``*GETRF`` routines return 1-based pivot indices, the
    ``piv`` array returned by ``lu_factor`` contains 0-based indices.

    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

    >>> def pivot_to_permutation(piv):
    ...     perm = np.arange(len(piv))
    ...     for i in range(len(piv)):
    ...         perm[i], perm[piv[i]] = perm[piv[i]], perm[i]
    ...     return perm
    ...
    >>> p_inv = pivot_to_permutation(piv)
    >>> p_inv
    array([2, 0, 3, 1])
    >>> L, U = np.tril(lu, k=-1) + np.eye(4), np.triu(lu)
    >>> np.allclose(A[p_inv] - L @ U, np.zeros((4, 4)))
    True

    The P matrix in P L U is defined by the inverse permutation and
    can be recovered using argsort:

    >>> p = np.argsort(p_inv)
    >>> p
    array([1, 3, 0, 2])
    >>> np.allclose(A - L[p] @ U, np.zeros((4, 4)))
    True

    or alternatively:

    >>> P = np.eye(4)[p]
    >>> np.allclose(A - P @ L @ U, np.zeros((4, 4)))
    True
    r   dtype)getrf)overwrite_aillegal value in z)th argument of internal getrf (lu_factor)zDiagonal number z" is exactly zero. Singular matrix.r   )
stacklevel)r   r   sizenp
empty_likearangeint32r	   r   
ValueErrorr   r
   )r   r   check_finitea1r   pivr   infos           g/var/www/html/mdtn/previsions/meteo_cartes/venv/lib/python3.11/site-packages/scipy/linalg/_decomp_lu.pyr   r      s   l  q!!QZZ 
w!||]2i***3w5+b!"4"4Kj2%00FEE"+666MBTaxxPPPP
 
 	
 axxGtGGG	
 	
 	
 	

 s7N    c                 6    | \  }}t          ||||||          S )a  Solve an equation system, a x = b, given the LU factorization of a

    The documentation is written assuming array arguments are of specified
    "core" shapes. However, 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
    ----------
    (lu, piv)
        Factorization of the coefficient matrix a, as given by lu_factor.
        In particular piv are 0-indexed pivot indices.
    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

    )transoverwrite_br    )	_lu_solve)
lu_and_pivbr'   r(   r    r   r"   s          r$   r   r      s2    j IRRau+".0 0 0 0r%   )r   r   )r"   r   )r+   z1|2c                 >   |rt          |          }nt          |          }|pt          ||          }| j        d         |j        d         k    r t	          d| j         d|j         d          |j        dk    rat          t          j        d| j	                  ddgft          j
        d|j	                            }t          j        ||j	                  S t          d| |f          \  } || ||||	          \  }	}
|
dk    r|	S t	          d
|
  d          )Nr   zShapes of lu z and b z are incompatibler   r   r   )getrs)r'   r(   r   z!th argument of internal gesv|posv)r   r   r	   shaper   r   r   r   eyer   onesr   r   )r   r"   r+   r'   r(   r    b1mr-   xr#   s              r$   r)   r)      s0    q!!QZZ3R!3!3K	x{bhqk!!UUU"(UUUVVV 
w!||bfQbh///!Q8"'!17:S:S:STT}Rqw////j2r(33FEeBRu+FFFGAtqyy
Q$QQQ
R
RRr%   c                    |rt          j        |           nt          j        |           }|j        dk     rt	          d          t          ||          \  }}|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 )a  
    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``.

    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 : (..., 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
    -------
    (p, l, u) | (pl, u):
        The tuple `(p, l, u)` is returned if `permute_l` is ``False`` (default) else
        the tuple `(pl, u)` is returned, where:

        p : (..., M, M) ndarray
            Permutation arrays or vectors depending on `p_indices`.
        l : (..., M, K) ndarray
            Lower triangular or trapezoidal array with unit diagonal, where the last
            dimension is ``K = min(M, N)``.
        pl : (..., M, K) ndarray
            Permuted L matrix with last dimension being ``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], dtype=int32)  # 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.fFfdr   )r.   r   r   N)r   r   C)orderC_CONTIGUOUS	WRITEABLEc                 ,    g | ]}t          |          S  range.0r3   s     r$   
<listcomp>zlu.<locals>.<listcomp>u       A A Aaq A A Ar%   c                 ,    g | ]}t          |          S r>   r?   rA   s     r$   rC   zlu.<locals>.<listcomp>{  rD   r%   c                 6    g | ]}t          j        |          S r>   )r   r   rA   s     r$   rC   zlu.<locals>.<listcomp>  s     777qbill777r%   r   )r   r   r   ndimr   r   r.   minr   charemptyr   	ones_likecopyzerosintr	   flagsr   r   ix_r   )r   	permute_lr   r    	p_indicesr!   ndr2   nk
real_dcharPLUPLpuindPand_ixs                       r$   r   r      s   @ %1	C	a	 	 	 bjmmB	w{{LMMM .b+>>OB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   scipy._lib._utilr   _miscr	   r
   lapackr   r   _decomp_lu_cythonr   __all__r   r   r)   r   r>   r%   r$   <module>ri      sW   ! !       , , , , , , , ,           . . . . . . . - - - - - - - = = = = = = = = , , , , , , *
)
) 8n n n nb70 70 70 70t 9j,77S S 87S. <@u. u. u. u. u. u.r%   