o
    Z۷i7                     @   s  d dl Z d dlZd dlmZ d dlmZmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZmZ d d	lmZ d d
lmZmZ d dlmZmZmZmZmZ d dlm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) edddddZ*G dd de*eZ+G dd de
Z,e, Z-G dd dej.Z/e/eed < dd Z0d d! Z1d"d# Z2ej3ej4ej5ej6d$Z7d%d& Z8ed'd( Z9G d)d* d*e:Z;G d+d, d,e;Z<G d-d. d.e;Z=d/d0 Z>dS )1    N)contextmanager)configtargetconfig)jit)TargetDescriptor)	is_jitted)NumbaDeprecationWarning)TargetOptionsinclude_default_options)
cpu_target)dispatcher_registrytarget_registry)utilstypes	serializecompilersigutils)as_dtype)	_internal)parse_signature)build_ufunc_wrapperbuild_gufunc_wrapper)FunctionCache	NullCache)global_compiler_locknopythonforceobjboundscheckfastmathwritable_argsc                   @   s   e Zd Zdd ZdS )UFuncTargetOptionsc                 C   sf   | dsd|_| dsd|_|jddd | ds tj|_| ds)|j|_d|_|d d S )	Nenable_pyobjectTenable_loopliftnrt)default	debuginfor   r   )	is_setr!   r"   inherit_if_not_setr   DEBUGINFO_DEFAULTr%   r   enable_pyobject_looplift)selfflagsoptions r-   Q/home/ubuntu/vllm_env/lib/python3.10/site-packages/numba/np/ufunc/ufuncbuilder.pyfinalize#   s   



zUFuncTargetOptions.finalizeN)__name__
__module____qualname__r/   r-   r-   r-   r.   r    !   s    r    c                       s8   e Zd ZeZ fddZedd Zedd Z  Z	S )UFuncTargetc                    s   t  d d S )Nufunc)super__init__r*   	__class__r-   r.   r6   :      zUFuncTarget.__init__c                 C      t jS N)r   typing_contextr7   r-   r-   r.   r=   =      zUFuncTarget.typing_contextc                 C   r;   r<   )r   target_contextr7   r-   r-   r.   r?   A   r>   zUFuncTarget.target_context)
r0   r1   r2   r    r,   r6   propertyr=   r?   __classcell__r-   r-   r8   r.   r3   7   s    
r3   c                   @   sR   e Zd ZdZeZi i fddZdd Zedd Z	dd	 Z
i fd
dZdd ZdS )UFuncDispatcherzK
    An object handling compilation of various signatures for a ufunc.
    c                 C   s(   || _ t | _|| _|| _t | _d S r<   )py_funcr   
UniqueDict	overloadstargetoptionslocalsr   cache)r*   rC   rG   rF   r-   r-   r.   r6   O   s
   
zUFuncDispatcher.__init__c                 C   s   t | j| j| jdS )4
        NOTE: part of ReduceMixin protocol
        )pyfuncrG   rF   )dictrC   rG   rF   r7   r-   r-   r.   _reduce_statesV   s
   zUFuncDispatcher._reduce_statesc                 C   s   | |||dS )rI   )rC   rG   rF   r-   )clsrJ   rG   rF   r-   r-   r.   _rebuild`   s   zUFuncDispatcher._rebuildc                 C   s   t | j| _d S r<   )r   rC   rH   r7   r-   r-   r.   enable_cachingg   r:   zUFuncDispatcher.enable_cachingc                 K   s`   | j  }|| | j }|| t }| jj|| d|_	d|_
d|_| |||S )NTnumpyF)rG   copyupdaterF   r   Flagstargetdescrr,   parse_as_flagsno_cpython_wrappererror_modelr"   _compile_core)r*   sigrG   rF   locstoptr+   r-   r-   r.   compilej   s   



zUFuncDispatcher.compilec           	         sN  j j}j j}t fdd}t t | h | U j	
||  durD W  d   W  d   W  d   S t|\}}tj||j||||d j	|   W  d   W  d   W  d   S 1 syw   Y  W d   n1 sw   Y  W d   dS W d   dS 1 sw   Y  dS )z
        Trigger the compiler on the core function or load a previously
        compiled version from the cache.  Returns the CompileResult.
        c                  3   sH    zd V  W n t y    w j j} | d u r" j j< d S d S r<   )	ExceptionrE   get	signature)existscresr*   r-   r.   store_overloads_on_success   s   
zAUFuncDispatcher._compile_core.<locals>.store_overloads_on_successN)argsreturn_typer+   rG   )rT   r=   r?   r   r   r   ConfigStackenterrQ   rH   load_overloadr   normalize_signaturer   compile_extrarC   save_overload)	r*   rY   r+   rG   	typingctx	targetctxrc   rd   re   r-   ra   r.   rX   }   s:   	"zUFuncDispatcher._compile_coreN)r0   r1   r2   __doc__ufunc_targetrT   r6   rL   classmethodrN   rO   r\   rX   r-   r-   r-   r.   rB   I   s    

rB   npyufuncc                 C   s*   | j |fi |}t|\}}|||fS r<   )r\   r   ri   )nb_funcrF   rY   rb   rd   re   r-   r-   r.   _compile_element_wise_function   s   
rs   c                 C   s4   |du r| j rtd| jj}|tjksJ || S )zGiven a compilation result, argument types, and a return type,
    build a valid Numba signature after validating that it doesn't
    violate the constraints for the compilation mode.
    Nz-return type must be specified for object mode)
objectmode	TypeErrorr_   re   r   pyobject)rb   rd   re   r-   r-   r.   _finalize_ufunc_signature   s   rw   c                 C   s   | j }| j}| jj}t t||||| j| }|j|j}W d   n1 s(w   Y  dd |j	D }|
t|jj ||| jfS )zBuild a wrapper for the ufunc loop entry point given by the
    compilation result object, using the element-wise signature.
    Nc                 S   s   g | ]}t |jqS r-   )r   num.0ar-   r-   r.   
<listcomp>       z5_build_element_wise_ufunc_wrapper.<locals>.<listcomp>)r?   libraryfndescllvm_func_namer   r   rt   get_pointer_to_functionnamerd   appendr   re   rx   environment)rb   r_   ctxr~   fnameinfoptr	dtypenumsr-   r-   r.   !_build_element_wise_ufunc_wrapper   s   
r   )r      Nreorderablec                 C   s,   zt |  } W | S  ty   td| f w )z]
    Parse an identity value and return the corresponding low-level value
    for Numpy.
    zInvalid identity value %r)_identitiesKeyError
ValueError)identityr-   r-   r.   parse_identity   s   
r   c                   c   sF    t   t jdtdd dV  W d   dS 1 sw   Y  dS )zThis suppresses the NumbaDeprecationWarning that occurs through the use
    of `jit` without the `nopython` kwarg. This use of `jit` occurs in a few
    places in the `{g,}ufunc` mechanism in Numba, predominantly to wrap the
    "kernel" function.ignorez3.*The 'nopython' keyword argument was not supplied*)categorymessageN)warningscatch_warningsfilterwarningsr   r-   r-   r-   r.   3_suppress_deprecation_warning_nopython_not_supplied   s   
"r   c                   @   s   e Zd ZdddZdd ZdS )_BaseUFuncBuilderNc                 C   sV   t | dr	| j}n| jj}t| j||\}}}| |||}| j| || j|< |S )NrF   )hasattrrF   rr   rs   _finalize_signature_sigsr   _cres)r*   rY   rF   rb   rd   re   r-   r-   r.   add   s   


z_BaseUFuncBuilder.addc                 C   s   dS )zI
        Disable the compilation of new signatures at call time.
        Nr-   r7   r-   r-   r.   disable_compile  s    z!_BaseUFuncBuilder.disable_compiler<   )r0   r1   r2   r   r   r-   r-   r-   r.   r      s    
r   c                   @   s4   e Zd Zddi fddZdd Zdd Zd	d
 ZdS )UFuncBuilderNFc                 C   sn   t |r|j}|| _t|| _t  tdd|d||| _W d    n1 s*w   Y  g | _i | _d S )Nrq   _targetrH   r-   )	r   rC   r   r   r   r   rr   r   r   )r*   rC   r   rH   rF   r-   r-   r.   r6     s   

zUFuncBuilder.__init__c                 C   s   t |||S )z^Slated for deprecation, use ufuncbuilder._finalize_ufunc_signature()
        instead.
        )rw   r*   rb   rd   re   r-   r-   r.   r     s   z UFuncBuilder._finalize_signaturec                 C   s   t r g }g }| jstdg }d }| jD ]$}| j| }| ||\}}}|| |t| ||j|f qd gt	| }	|d u rQt
| j}
t	|
j}nt	|jj}d}t| jj| jj|||||	|| j	}|W  d    S 1 sww   Y  d S )NNo definitionr   )r   rr   ru   r   r   buildr   intr~   leninspectgetfullargspecrC   rd   r_   r   fromfuncr0   rn   r   )r*   	dtypelistptrlist	keepaliverb   rY   r   r   envdatlistargspecinctoutctr4   r-   r-   r.   build_ufunc#  s4   



$zUFuncBuilder.build_ufuncc                 C   s
   t ||S )z^Slated for deprecation, use
        ufuncbuilder._build_element_wise_ufunc_wrapper().
        )r   )r*   rb   r_   r-   r-   r.   r   J  s   
zUFuncBuilder.build)r0   r1   r2   r6   r   r   r   r-   r-   r-   r.   r     s
    'r   c                   @   s:   e Zd Zddi dfddZdd Zedd	 Zd
d ZdS )GUFuncBuilderNFr-   c                    s   || _ t|| _t  td|d|| _W d    n1 sw   Y  || _t|\| _| _	|| _
|| _g | _i | _t| t fdd|D | _d S )Nrq   r   c                    s   g | ]} |qS r-   r-   ry   transform_argr-   r.   r|   b  s    z*GUFuncBuilder.__init__.<locals>.<listcomp>)rC   r   r   r   r   rr   r_   r   sinsoutrF   rH   r   r   _get_transform_argtupler   )r*   rC   r_   r   rH   rF   r   r-   r   r.   r6   T  s   
zGUFuncBuilder.__init__c                 C   s2   |j s|jjtjkrtd|d u rtj}|| S )Nz(gufunc kernel must have void return type)rt   r_   re   r   voidru   r   r-   r-   r.   r   d  s
   z!GUFuncBuilder._finalize_signaturec                 C   s   g }g }| j stdg }| jD ]#}| j| }| |\}}}|| |t| ||j|f qd gt| }	t| j	}
t| j
}t| jj| jj|||
||	|| j| j| j}|S )Nr   )rr   ru   r   r   r   r   r   r~   r   r   r   r   r   rC   r0   rn   r   r_   r   )r*   	type_list	func_listr   rY   rb   r   r   r   datalistninnoutr4   r-   r-   r.   r   m  s(   





zGUFuncBuilder.build_ufuncc           	      C   sx   |j }t| j|| j| j| jdd}|j}|j|j	}g }|j
D ]}t|tjr,|j}n|}|t|j q |||fS )zJ
        Returns (dtype numbers, function ptr, EnvironmentObject)
        F)rH   
is_parfors)r_   r   rC   r   r   rH   r   r~   r   r   rd   
isinstancer   Arraydtyper   r   rx   )	r*   rb   r_   r   r   r   r   r{   tyr-   r-   r.   r     s   

zGUFuncBuilder.build)r0   r1   r2   r6   r   r   r   r   r-   r-   r-   r.   r   Q  s    
	
r   c                    s2   t j dd t D  fdd}|S )z-Return function that transform arg into indexc                 S   s   i | ]\}}||qS r-   r-   )rz   iargr-   r-   r.   
<dictcomp>  r}   z&_get_transform_arg.<locals>.<dictcomp>c              	      sH   t | tr| S z|  W S  ty#   d|  d  dj }t|w )NzSpecified writable arg z not found in arg list z for function )r   r   r   r2   RuntimeError)r   msgrd   
pos_by_argrC   r-   r.   r     s   

z)_get_transform_arg.<locals>.transform_arg)r   r   rd   	enumerate)rC   r   r-   r   r.   r     s   r   )?r   r   
contextlibr   
numba.corer   r   numba.core.decoratorsr   numba.core.descriptorsr   numba.core.extendingr   numba.core.errorsr   numba.core.optionsr	   r
   numba.core.registryr   numba.core.target_extensionr   r   r   r   r   r   r   numba.np.numpy_supportr   numba.np.ufuncr   numba.np.ufunc.sigparser   numba.np.ufunc.wrappersr   r   numba.core.cachingr   r   numba.core.compiler_lockr   _options_mixinr    r3   ro   ReduceMixinrB   rs   rw   r   PyUFunc_ZeroPyUFunc_OnePyUFunc_NonePyUFunc_ReorderableNoner   r   r   objectr   r   r   r   r-   r-   r-   r.   <module>   sZ   	^
BQ