o
    X۷i!                     @  s   d dl mZ d dlZd dlZd dlmZ d dlZd dlZd dlmZ edZ	dd Z
dd	 Zd
d Zdd ZddddZdd Zdd Zdd ZejddddddZd(ddZejddd d!ddZd(d"d#Zd$d% Zd&d' ZdS ))    )annotationsN)linalg)_coreCUPY_DEFAULT_PRECISIONc                  G  s&   | D ]}t |tjjstdqd S )Nz&cupy.linalg only supports cupy.ndarray)
isinstancecupyr   ndarrayr   LinAlgErrorarraysa r   G/home/ubuntu/vllm_env/lib/python3.10/site-packages/cupy/linalg/_util.py_assert_cupy_array   s   r   c                  G  s*   | D ]}|j dkrtd|j qd S )N   z9{}-dimensional array given. Array must be two-dimensionalndimr   r	   formatr
   r   r   r   
_assert_2d      
r   c                  G  s*   | D ]}|j dk rtd|j qd S )Nr   zB{}-dimensional array given. Array must be at least two-dimensionalr   r
   r   r   r   _assert_stacked_2d!   r   r   c                  G  s2   | D ]}|j dd \}}||krtdqdS )a	  Assert that stacked matrices are square matrices

    Precondition: `arrays` are at least 2d. The caller should assert it
    beforehand. For example,

    >>> def det(a):
    ...     _assert_stacked_2d(a)
    ...     _assert_stacked_square(a)
    ...     ...

    Nz-Last 2 dimensions of the array must be square)shaper   r	   )r   r   mnr   r   r   _assert_stacked_square)   s   r   T)reject_float16c                 G  s   dd |D }| rd|v rt dtdur+tjd tdvr&tdtd	t }nd
}t|g|R  }|dkr>t	d}td
g|R  }||fS )a-  Common type for linalg

    The logic is intended to be equivalent with
    `numpy.linalg.linalg._commonType`.
    The differences from `numpy.common_type` are
    - to accept ``bool_`` arrays, and
    - to reject ``float16`` arrays.

    Args:
        *arrays (ndarray): Input arrays.
        reject_float16 (bool): Flag to follow NumPy to raise TypeError for
            ``float16`` inputs.

    Returns:
        compute_dtype (dtype): The precision to be used in linalg calls.
        result_dtype (dtype): The dtype of (possibly complex) output(s).
    c                 S  s   g | ]}|j qS r   )dtype).0arrr   r   r   
<listcomp>O   s    z&linalg_common_type.<locals>.<listcomp>float16z float16 is unsupported in linalgNr   )3264z"invalid CUPY_DEFAULT_PRECISION: {}floatfloat64float32)
	TypeError_default_precisionr   _utilexperimental
ValueErrorr   _common_type_internalnumpyr   )r   r   dtypesdefaultcompute_dtyperesult_dtyper   r   r   linalg_common_type=   s$   

r2   c                   s    fdd|D }t j| S )Nc                   s   g | ]}|j d v r|n qS )fc)kind)r   r   default_dtyper   r   r    h   s    z)_common_type_internal.<locals>.<listcomp>)r-   result_type)r6   r.   inexact_dtypesr   r5   r   r,   g   s   

r,   c                 C  s~   dd l }t|tjsJ |j }|dkrd S z| j}W n ty'   | }Y nw |dks.J |dk r=t	
d||d S )Nr   ignoreraisez[Error reported by {} in cuSOLVER. devInfo = {}. Please refer to the cuSOLVER documentation.)cupyxr   r   r   _ufunc_configget_config_linalg__name__AttributeErroranyr   r	   r   )routinedev_infor;   config_linalgnamer   r   r   3_check_cusolver_dev_info_if_synchronization_allowedn   s&   

rE   c                 C  sl   dd l }t|tjsJ |jdksJ |j }|dkrd S |dks$J |dk r4t	d
| j|d S )Nr      r9   r:   zfError reported by {} in cuBLAS. infoArray/devInfoArray = {}. Please refer to the cuBLAS documentation.)r;   r   r   r   r   r<   r=   r@   r   r	   r   r>   )rA   
info_arrayr;   rC   r   r   r   3_check_cublas_info_array_if_synchronization_allowed   s   
rH   zint64 kzS xz0x = (_ind.get()[1] - _ind.get()[0] <= k) ? x : 0cupy_tril_kernelF)reduce_dimsc                 C     t ||  | S N)_tril_kernelxkr   r   r   _tril      
rQ   zHx = (_ind.get()[_ind.ndim - 1] - _ind.get()[_ind.ndim - 2] >= k) ? x : 0cupy_triu_kernelc                 C  rK   rL   )_triu_kernelrN   r   r   r   _triu   rR   rU   c                 C  s4   | ||f }t |}t ||}d|d||f< |S )NrF   .)r   arangezeros)batch_shaper   r   r   idxrO   r   r   r   stacked_identity   s
   
rZ   c                 C  s0   | j d }t|}t| } d| d||f< | S )zH
    Precondition: ``x`` is `cupy.ndarray` of shape ``(..., N, N)``
    rF   .)r   r   rV   
zeros_like)rO   r   rY   r   r   r   stacked_identity_like   s
   


r]   )r   )
__future__r   osr-   r   r   
cupy._utilr   getenvr(   r   r   r   r   r2   r,   rE   rH   ElementwiseKernelrM   rQ   rT   rU   rZ   r]   r   r   r   r   <module>   s@    
*

