o
    X۷i                     @  sp   d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ ed		d
d	dZdS )    )annotationsN)cublas)device)_util)_uarraysolve_triangularFc                 C  s  t | | | jdkr(| jd | jd krtdt| t|kr%tdd}nP| jdkrt| jd | jd kr;td| jd	d |jd	| jd  krPtd
|j| jd k se| jd |j| jd  kritdt| jd	d }ntd| jj	dv r| j}nt
| jj	d}|r| jjdkrt|  std|jjdkrt| std|r|j| jkr|jdd	 n|jd df\}	}
||	|	f}|j}|jj}|dks|tjkrtj}| }tj| j| |d} nc|dks|tjkrtj}| }tj| j| |d} nH|dks|tjkrA|dks|dkr.tj}| }tj| j| |d} n"tj}tj| j| ddd|d} ntj| j| ddd|d} tj|||	|
ddd|d}|jj|kro|so| }| jj}|	|	 | j }|||  }tj|||tjd}|jj}|	|
 |j }|||  }tj|||tjd}nAtj| |dd	d} tj||d|rd	ndd}|jdkr|jdfn|j\}	}
|dkrtj}n|dkrtj}n|dkrtj}t  }t
jd|d}|rtj!}ntj"}|rtj#}ntj$}|rH|dkrtj%}n|dkrtj&}n|dkr$tj'}ntj(}||tj)||||	|
|j*j|jj|	|jj|	| |ddd|S |dkrQtj+}n|dkrZtj,}n|dkrctj-}ntj.}||tj)||||	|
|j*j| jj|	|jj|	 |S )aV  Solve the equation a x = b for x, assuming a is a triangular matrix.

    Args:
        a (cupy.ndarray): The matrix with dimension ``(..., M, M)``.
        b (cupy.ndarray): The matrix with dimension ``(..., M,)`` or
            ``(..., M, N)``.
        lower (bool): Use only data contained in the lower triangle of ``a``.
            Default is to use upper triangle.
        trans (0, 1, 2, 'N', 'T' or 'C'): Type of system to solve:

            - *'0'* or *'N'* -- :math:`a x  = b`
            - *'1'* or *'T'* -- :math:`a^T x = b`
            - *'2'* or *'C'* -- :math:`a^H x = b`

        unit_diagonal (bool): If ``True``, diagonal elements of ``a`` are
            assumed to be 1 and will not be referenced.
        overwrite_b (bool): Allow overwriting data in b (may enhance
            performance)
        check_finite (bool): 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:
        cupy.ndarray:
            The matrix with dimension ``(..., M,)`` or ``(..., M, N)``.

    .. note::
       Unlike the SciPy counterpart, the CuPy implementation supports batches
       of matrices.
    .. seealso:: :func:`scipy.linalg.solve_triangular`
       r      zexpected square matrixzincompatible dimensionsz#expected a batch of square matricesNzincompatible batch countz8expected one square matrix or a batch of square matricesfdfz#array must not contain infs or NaNsN)dtypeTCdF)r   ordercopyT)/r   _assert_cupy_arrayndimshape
ValueErrorlenmathprodr   charnumpypromote_typeskindcupyisfinitealldataptrr   CUBLAS_OP_NCUBLAS_OP_TascontiguousarrayreshapeCUBLAS_OP_C	transposer   itemsizearangeuintparraysizer   get_cublas_handleCUBLAS_FILL_MODE_LOWERCUBLAS_FILL_MODE_UPPERCUBLAS_DIAG_UNITCUBLAS_DIAG_NON_UNITstrsmBatcheddtrsmBatchedctrsmBatchedztrsmBatchedCUBLAS_SIDE_LEFTctypesstrsmdtrsmctrsmztrsm)abtranslowerunit_diagonaloverwrite_bcheck_finitebatch_countr   mna_new_shapeb_shape
b_data_ptrstartstepstopa_arrayb_arraycublas_handleoneuplodiagtrsm rW   Z/home/ubuntu/vllm_env/lib/python3.10/site-packages/cupyx/scipy/linalg/_solve_triangular.pyr      s   $

"*,

 









)r   FFFF)
__future__r   r   r   r!   	cupy.cudar   r   cupy.linalgr   cupyx.scipy.linalgr   
implementsr   rW   rW   rW   rX   <module>   s    