o
    W۷i                     @  s:   d dl mZ d dlZd dlmZ dd ZG dd dZdS )    )annotationsN)_corec                 C  s"   t | dr	| jjS tt| jS )Ndtype)hasattrr   charnumpytype)arg r
   P/home/ubuntu/vllm_env/lib/python3.10/site-packages/cupy/_functional/vectorize.py_get_input_type   s   
r   c                   @  s2   e Zd ZdZ		d
ddZedd Zdd	 ZdS )	vectorizezKGeneralized function class.

    .. seealso:: :class:`numpy.vectorize`
    NFc                 C  sr   || _ |p|j| _|| _|| _|| _i | _d| _|dur'ddd |D | _|dur/td|dur7tddS )ab  
        Args:
            pyfunc (callable): The target python function.
            otypes (str or list of dtypes, optional): The output data type.
            doc (str or None): The docstring for the function.
            excluded: Currently not supported.
            cache: Currently Ignored.
            signature: Currently not supported.
        N c                 S  s   g | ]}t |jqS r
   )r   r   r   .0tr
   r
   r   
<listcomp>+   s    z&vectorize.__init__.<locals>.<listcomp>z<cupy.vectorize does not support `excluded` option currently.z=cupy.vectorize does not support `signature` option currently.)	pyfunc__doc__excludedcache	signature_kernel_cacheotypesjoinNotImplementedError)selfr   r   docr   r   r   r
   r
   r   __init__   s$   zvectorize.__init__c                 C  s   ddl m} t| |jr| jg}d| d}n>t| |jrNg }d| d}t| jD ]"\}}t||js;td|  |	|j |d| d	| d
7 }q*ntd|  dd t|D }d
||fS )Nr   _cuda_typeszout0 = ;zauto out = z;
zInvalid return type: outz = STD::get<z>(out);
c                 S  s   g | ]\}}| d | qS )z outr
   )r   ir   r
   r
   r   r   H   s    z'vectorize._get_body.<locals>.<listcomp>, )	cupyx.jitr    
isinstanceScalarr   Tuple	enumeratetypes	TypeErrorappendr   )return_typecallr    dtypescoder#   r   
out_paramsr
   r
   r   	_get_body6   s    zvectorize._get_bodyc                   s  ddl m} ddl m  ddd |D }| j|d }|d u r fdd|D }d }| jd ur3t|j| j	dd	d
}|
||}ddd t|D }	ddd tt|D }
|j d|
 d}| |j|\}}tj|	||d|jdd}|| j|< || S )Nr   )
_interfacer   r   c                 S  s   g | ]}t |qS r
   )r   )r   xr
   r
   r   r   N   s    z&vectorize.__call__.<locals>.<listcomp>c                   s   g | ]}  |qS r
   )r'   r   r   r
   r   r   R       r   T)devicer$   c                 s  s$    | ]\}}|j  d | V  qdS )z inN)r   )r   r#   r   r
   r
   r   	<genexpr>Z   s    
z%vectorize.__call__.<locals>.<genexpr>c                 S  s   g | ]}d | qS )inr
   )r   r#   r
   r
   r   r   \   r5   ()cupy_vectorize)z-DCUPY_JIT_MODEz--std=c++17)preambleoptions)r%   r3   r    r   r   getr   r   _CudaFunctionr   _emit_code_from_typesr)   rangelen	func_namer2   r-   r   ElementwiseKernelr0   )r   argsr3   itypeskernin_typesret_typefuncresult	in_paramsin_argsr.   r1   bodyr
   r   r   __call__K   s0   


zvectorize.__call__)NNNFN)__name__
__module____qualname__r   r   staticmethodr2   rO   r
   r
   r
   r   r      s    
!
r   )
__future__r   r   cupyr   r   r   r
   r
   r
   r   <module>   s
    