o
    װi                     @   s   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 d dl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 )(    N)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   E/home/ubuntu/.local/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>N   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$   

r1   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   g   s    z)_common_type_internal.<locals>.<listcomp>)r,   result_type)r5   r-   inexact_dtypesr   r4   r   r+   f   s   

r+   c                 C   sv   t |tjsJ tj }|dkrd S z| j}W n ty#   | }Y nw |dks*J |dk r9t	
d||d S )Nignoreraiser   z[Error reported by {} in cuSOLVER. devInfo = {}. Please refer to the cuSOLVER documentation.)r   r   r   cupyx_ufunc_configget_config_linalg__name__AttributeErroranyr   r   r   )routinedev_infoconfig_linalgnamer   r   r   3_check_cusolver_dev_info_if_synchronization_allowedm   s$   

rD   c                 C   sd   t |tjsJ |jdksJ tj }|dkrd S |dks J |dk r0t	d
| j|d S )N   r8   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=   )r@   
info_arrayrB   r   r   r   3_check_cublas_info_array_if_synchronization_allowed   s   
rG   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      
rP   zHx = (_ind.get()[_ind.ndim - 1] - _ind.get()[_ind.ndim - 2] >= k) ? x : 0cupy_triu_kernelc                 C   rJ   rK   )_triu_kernelrM   r   r   r   _triu   rQ   rT   c                 C   s4   | ||f }t |}t ||}d|d||f< |S )NrE   .)r   arangezeros)batch_shaper   r   r   idxrN   r   r   r   stacked_identity   s
   
rY   c                 C   s0   | j d }t|}t| } d| d||f< | S )zH
    Precondition: ``x`` is `cupy.ndarray` of shape ``(..., N, N)``
    rE   .)r   r   rU   
zeros_like)rN   r   rX   r   r   r   stacked_identity_like   s
   


r\   )r   )osr,   r   r   
cupy._utilr   r:   getenvr'   r   r   r   r   r1   r+   rD   rG   ElementwiseKernelrL   rP   rS   rT   rY   r\   r   r   r   r   <module>   s@    
*

