a
    
d7                     @   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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=d0d1 Z>dS )2    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_lockZnopythonZforceobjboundscheckfastmathZtarget_backend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sR|j|_d|_|d d S )	Nenable_pyobjectTenable_loopliftZnrt)default	debuginfor   r   )	is_setr   r    Zinherit_if_not_setr   ZDEBUGINFO_DEFAULTr"   r   Zenable_pyobject_looplift)selfflagsoptions r'   d/var/www/html/stable-diffusion-webui/venv/lib/python3.9/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(   r0   ;   s    zUFuncTarget.__init__c                 C   s   t jS N)r   typing_contextr1   r'   r'   r(   r5   >   s    zUFuncTarget.typing_contextc                 C   s   t jS r4   )r   target_contextr1   r'   r'   r(   r6   B   s    zUFuncTarget.target_context)
r*   r+   r,   r   r&   r0   propertyr5   r6   __classcell__r'   r'   r2   r(   r-   8   s   
r-   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 r4   )py_funcr   Z
UniqueDict	overloadstargetoptionslocalsr   cache)r$   r:   r=   r<   r'   r'   r(   r0   P   s
    
zUFuncDispatcher.__init__c                 C   s   t | j| j| jdS )4
        NOTE: part of ReduceMixin protocol
        )pyfuncr=   r<   )dictr:   r=   r<   r1   r'   r'   r(   _reduce_statesW   s
    zUFuncDispatcher._reduce_statesc                 C   s   | |||dS )r?   )r:   r=   r<   r'   )clsr@   r=   r<   r'   r'   r(   _rebuilda   s    zUFuncDispatcher._rebuildc                 C   s   t | j| _d S r4   )r   r:   r>   r1   r'   r'   r(   enable_cachingh   s    zUFuncDispatcher.enable_cachingc                 K   s`   | j  }|| | j }|| t }| jj|| d|_	d|_
d|_| |||S )NTnumpyF)r=   copyupdater<   r   ZFlagstargetdescrr&   Zparse_as_flagsZno_cpython_wrapperZerror_modelr    _compile_core)r$   sigr=   r<   ZlocsZtoptr%   r'   r'   r(   compilek   s    



zUFuncDispatcher.compilec           	         sD  j j}j j}t fdd}t t |  |  j	
||  dur W  d   W  d   W  d   S t|\}}tj||j||||d j	|   W  d   W  d   W  d   S 1  s0    Y  W d   n1 s0    Y  W d   n1 s60    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   sF   z
d V  W n t y    Y n$0 j j} | d u rB j j< d S r4   )	Exceptionr;   get	signature)existscresr$   r'   r(   store_overloads_on_success   s    
zAUFuncDispatcher._compile_core.<locals>.store_overloads_on_successN)argsreturn_typer%   r=   )rI   r5   r6   r   r   r   ZConfigStackZenterrG   r>   Zload_overloadr   normalize_signaturer   Zcompile_extrar:   Zsave_overload)	r$   rK   r%   r=   Z	typingctxZ	targetctxrS   rT   rU   r'   rQ   r(   rJ   ~   s$    .zUFuncDispatcher._compile_coreN)r*   r+   r,   __doc__ufunc_targetrI   r0   rB   classmethodrD   rE   rL   rJ   r'   r'   r'   r(   r9   J   s   

r9   npyufuncc                 C   s*   | j |fi |}t|\}}|||fS r4   )rL   r   rV   )nb_funcr<   rK   rR   rT   rU   r'   r'   r(   _compile_element_wise_function   s    r\   c                 C   s6   |du r | j rtdn| 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	TypeErrorrO   rU   r   Zpyobject)rR   rT   rU   r'   r'   r(   _finalize_ufunc_signature   s    
r_   c                 C   s   | j }| j}| jj}t2 t||||| j| }|j|j}W d   n1 sP0    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>)r6   libraryZfndescZllvm_func_namer   r   r]   get_pointer_to_functionnamerT   appendr   rU   r`   environment)rR   rO   ctxrf   fnameinfoptr	dtypenumsr'   r'   r(   !_build_element_wise_ufunc_wrapper   s    
,rp   )r      NZreorderablec                 C   s2   zt |  } W n  ty,   td| f Y n0 | S )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
    rv   c                   c   sB   t  & t jdtdd dV  W d   n1 s40    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 )Nr<   )hasattrr<   r[   r\   _finalize_signature_sigsri   _cres)r$   rK   r<   rR   rT   rU   r'   r'   r(   add   s    


z_BaseUFuncBuilder.addc                 C   s   dS )zI
        Disable the compilation of new signatures at call time.
        Nr'   r1   r'   r'   r(   disable_compile	  s    z!_BaseUFuncBuilder.disable_compile)N)r*   r+   r,   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f d|d||| _W d    n1 sT0    Y  g | _i | _d S )NrZ   _targetr>   )	r   r:   rv   ru   r}   r   r[   r   r   )r$   r:   ru   r>   r<   r'   r'   r(   r0     s    
$zUFuncBuilder.__init__c                 C   s   t |||S )z^Slated for deprecation, use ufuncbuilder._finalize_ufunc_signature()
        instead.
        )r_   r$   rR   rT   rU   r'   r'   r(   r     s    z UFuncBuilder._finalize_signaturec                 C   s   t  g }g }| jstdg }d }| jD ]H}| j| }| ||\}}}|| |t| ||j|f q*d gt	| }	|d u rt
| j}
t	|
j}nt	|jj}d}t| jj| jj|||||	|| j	}|W  d    S 1 s0    Y  d S )NNo definitionrq   )r   r[   r^   r   r   buildri   intrf   leninspectgetfullargspecr:   rT   rO   r   fromfuncr*   rW   ru   )r$   Z	dtypelistZptrlist	keepaliverR   rK   ro   rn   envZdatlistZargspecZinctZoutctr.   r'   r'   r(   build_ufunc$  s2    



zUFuncBuilder.build_ufuncc                 C   s
   t ||S )z^Slated for deprecation, use
        ufuncbuilder._build_element_wise_ufunc_wrapper().
        )rp   )r$   rR   rO   r'   r'   r(   r   K  s    zUFuncBuilder.build)r*   r+   r,   r0   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>0    Y  || _t|\| _| _	|| _
|| _g | _i | _t| t fdd|D | _d S )NrZ   r   c                    s   g | ]} |qS r'   r'   ra   transform_argr'   r(   rd   c  re   z*GUFuncBuilder.__init__.<locals>.<listcomp>)r:   rv   ru   r}   r   r[   rO   r   sinsoutr<   r>   r   r   _get_transform_argtupler   )r$   r:   rO   ru   r>   r<   r   r'   r   r(   r0   U  s    
0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)r]   rO   rU   r   voidr^   r   r'   r'   r(   r   e  s
    z!GUFuncBuilder._finalize_signaturec                 C   s   g }g }| j stdg }| jD ]F}| j| }| |\}}}|| |t| ||j|f q d gt| }	t| j	}
t| j
}t| jj| jj|||
||	|| j| j| j}|S )Nr   )r[   r^   r   r   r   ri   r   rf   r   r   r   r   r   r:   r*   rW   ru   rO   r   )r$   Z	type_listZ	func_listr   rK   rR   ro   rn   r   ZdatalistZninZnoutr.   r'   r'   r(   r   n  s(    





zGUFuncBuilder.build_ufuncc           	      C   sx   |j }t| j|| j| j| jdd}|j}|j|j	}g }|j
D ],}t|tjrX|j}n|}|t|j q@|||fS )zJ
        Returns (dtype numbers, function ptr, EnvironmentObject)
        F)r>   Z
is_parfors)rO   r   r:   r   r   r>   r   rf   rg   rh   rT   
isinstancer   ArrayZdtyperi   r   r`   )	r$   rR   rO   rm   r   rn   ro   rc   tyr'   r'   r(   r     s    
zGUFuncBuilder.build)r*   r+   r,   r0   r   r   r   r   r'   r'   r'   r(   r   R  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'   )rb   iargr'   r'   r(   
<dictcomp>  re   z&_get_transform_arg.<locals>.<dictcomp>c              	      sP   t | tr| S z
|  W S  tyJ   d|  d  dj }t|Y n0 d S )NzSpecified writable arg z not found in arg list z for function )r   r   rs   r,   RuntimeError)r   msgrT   Z
pos_by_argr:   r'   r(   r     s    

z)_get_transform_arg.<locals>.transform_arg)r   r   rT   	enumerate)r:   r   r'   r   r(   r     s    r   )?r   rz   
contextlibr   Z
numba.corer   r   Znumba.core.decoratorsr   Znumba.core.descriptorsr   Znumba.core.extendingr   Znumba.core.errorsr   Znumba.core.optionsr	   r
   Znumba.core.registryr   Znumba.core.target_extensionr   r   r   r   r   r   r   Znumba.np.numpy_supportr   Znumba.np.ufuncr   Znumba.np.ufunc.sigparser   Znumba.np.ufunc.wrappersr   r   Znumba.core.cachingr   r   Znumba.core.compiler_lockr   Z_options_mixinr   r-   rX   ZReduceMixinr9   r\   r_   rp   ZPyUFunc_ZeroZPyUFunc_OneZPyUFunc_NoneZPyUFunc_ReorderableNonerr   rv   r}   objectr~   r   r   r   r'   r'   r'   r(   <module>   sZ   
^
BQ