§
    ƒÛgß"  ã                   ó  — d dl mZ d dlmZ d dlmZ d dlmZm	Z	m
Z
  G d„ de¦  «        Z G d„ de
¦  «        Z G d	„ d
e	¦  «        Z G d„ de¦  «        ZdZ G d„ dej        ¦  «        ZdZ G d„ dej        ¦  «        ZdS )é    )Úcuda)Úarray)Údeviceufunc)ÚUFuncMechanismÚGeneralizedUFuncÚGUFuncCallStepsc                   ó,   — e Zd ZdZd„ Zd„ Zdd„Zd„ ZdS )	ÚCUDAUFuncDispatcherzD
    Invoke the CUDA ufunc specialization for the given inputs.
    c                 ó,   — || _         |j        | _        d S ©N)Ú	functionsÚ__name__)ÚselfÚtypes_to_retty_kernelsÚpyfuncs      úL/granary/edev/quantum/lib/python3.11/site-packages/numba/cuda/vectorizers.pyÚ__init__zCUDAUFuncDispatcher.__init__   s   € Ø/ˆŒØœˆŒˆˆó    c                 óD   — t                                | j        ||¦  «        S )a¦  
        *args: numpy arrays or DeviceArrayBase (created by cuda.to_device).
               Cannot mix the two types in one call.

        **kws:
            stream -- cuda stream; when defined, asynchronous mode is used.
            out    -- output array. Can be a numpy array or DeviceArrayBase
                      depending on the input arguments.  Type must match
                      the input arguments.
        )ÚCUDAUFuncMechanismÚcallr   )r   ÚargsÚkwss      r   Ú__call__zCUDAUFuncDispatcher.__call__   s   € õ "×&Ò& t¤~°t¸SÑAÔAÐAr   r   c                 ó°  — t          t          | j                             ¦   «         ¦  «        d         ¦  «        dk    s
J d¦   «         ‚|j        dk    s
J d¦   «         ‚|j        d         }g }|dk    rt          d¦  «        ‚|dk    r|d         S |pt          j        ¦   «         }| 	                    ¦   «         5  t          j
        j                             |¦  «        r|}nt          j        ||¦  «        }|                      |||¦  «        }t          d|j        ¬¦  «        }|                     ||¬	¦  «         d d d ¦  «         n# 1 swxY w Y   |d         S )
Nr   é   zmust be a binary ufuncé   zmust use 1d arrayzReduction on an empty array.)r   )Údtype©Ústream)ÚlenÚlistr   ÚkeysÚndimÚshapeÚ	TypeErrorr   r    Úauto_synchronizeÚcudadrvÚdevicearrayÚis_cuda_ndarrayÚ	to_deviceÚ_CUDAUFuncDispatcher__reduceÚnp_arrayr   Úcopy_to_host)r   Úargr    ÚnÚgpu_memsÚmemÚoutÚbufs           r   ÚreducezCUDAUFuncDispatcher.reduce   s‹  € Ý•4˜œ×+Ò+Ñ-Ô-Ñ.Ô.¨qÔ1Ñ2Ô2°aÒ7Ð7Ð7ð :AÑ7Ô7Ð7àŒx˜1Š}ˆ}ˆ}Ð1‰}Œ}ˆ}àŒI�aŒLˆØˆà�Š6ˆ6ÝÐ:Ñ;Ô;Ð;Ø�!ŠVˆVØ�q”6ˆMð Ð(�4œ;™=œ=ˆØ×$Ò$Ñ&Ô&ð 
	1ð 
	1åŒ|Ô'×7Ò7¸Ñ<Ô<ð 2Ø��å”n S¨&Ñ1Ô1�à—-’-  X¨vÑ6Ô6ˆCå˜4 s¤yÐ1Ñ1Ô1ˆCØ×Ò˜S¨ÐÑ0Ô0Ð0ð
	1ð 
	1ð 
	1ñ 
	1ô 
	1ð 
	1ð 
	1ð 
	1ð 
	1ð 
	1ð 
	1øøøð 
	1ð 
	1ð 
	1ð 
	1ð �1Œvˆs   Â8BEÅE	ÅE	c                 ó  — |j         d         }|dz  dk    r€|                     |dz
  ¦  «        \  }}|                     |¦  «         |                     |¦  «         |                      |||¦  «        }|                     |¦  «          | ||||¬¦  «        S |                     |dz  ¦  «        \  }}	|                     |¦  «         |                     |	¦  «          | ||	||¬¦  «         |dz  dk    r|                      |||¦  «        S |S )Nr   r   r   )r3   r    )r%   ÚsplitÚappendr,   )
r   r2   r1   r    r0   ÚfatcutÚthincutr3   ÚleftÚrights
             r   Ú__reducezCUDAUFuncDispatcher.__reduce;   s  € ØŒI�aŒLˆØˆq‰5�AŠ:ˆ:Ø!Ÿiši¨¨A©Ñ.Ô.‰OˆF�Gà�OŠO˜FÑ#Ô#Ð#Ø�OŠO˜GÑ$Ô$Ð$à—-’- ¨°&Ñ9Ô9ˆCØ�OŠO˜CÑ Ô Ð Ø�4˜˜W¨#°fÐ=Ñ=Ô=Ð=àŸ)š) A¨¡FÑ+Ô+‰KˆD�%à�OŠO˜DÑ!Ô!Ð!Ø�OŠO˜EÑ"Ô"Ð"àˆD��u $¨vÐ6Ñ6Ô6Ð6Ø�A‰v˜ŠzˆzØ—}’} T¨8°VÑ<Ô<Ð<à�r   N©r   )r   Ú
__module__Ú__qualname__Ú__doc__r   r   r5   r,   © r   r   r
   r
      sb   € € € € € ðð ð(ð (ð (ðBð Bð Bðð ð ð ð:ð ð ð ð r   r
   c                   óH   ‡ — e Zd ZdgZˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
ˆ xZS )	Ú_CUDAGUFuncCallStepsÚ_streamc                 ó†   •— t          ¦   «                              ||||¦  «         |                     dd¦  «        | _        d S )Nr    r   )Úsuperr   ÚgetrE   )r   ÚninÚnoutr   ÚkwargsÚ	__class__s        €r   r   z_CUDAGUFuncCallSteps.__init__X   s:   ø€ Ý‰Œ×Ò˜˜d D¨&Ñ1Ô1Ð1Ø—z’z (¨AÑ.Ô.ˆŒˆˆr   c                 ó*   — t          j        |¦  «        S r   ©r   Úis_cuda_array©r   Úobjs     r   Úis_device_arrayz$_CUDAGUFuncCallSteps.is_device_array\   ó   € ÝÔ! #Ñ&Ô&Ð&r   c                 óv   — t           j        j                             |¦  «        r|S t          j        |¦  «        S r   ©r   r(   r)   r*   Úas_cuda_arrayrP   s     r   Úas_device_arrayz$_CUDAGUFuncCallSteps.as_device_array_   ó5   € õ Œ<Ô#×3Ò3°CÑ8Ô8ð 	ØˆJÝÔ! #Ñ&Ô&Ð&r   c                 ó8   — t          j        || j        ¬¦  «        S ©Nr   )r   r+   rE   )r   Úhostarys     r   r+   z_CUDAGUFuncCallSteps.to_devicei   s   € ÝŒ~˜g¨d¬lÐ;Ñ;Ô;Ð;r   c                 ó>   — |                      || j        ¬¦  «        }|S rZ   )r.   rE   )r   Údevaryr[   r3   s       r   Úto_hostz_CUDAGUFuncCallSteps.to_hostl   s!   € Ø×!Ò! '°$´,Ð!Ñ?Ô?ˆØˆ
r   c                 ó:   — t          j        ||| j        ¬¦  «        S ©N)r%   r   r    )r   Údevice_arrayrE   )r   r%   r   s      r   Úallocate_device_arrayz*_CUDAGUFuncCallSteps.allocate_device_arrayp   s   € ÝÔ  u°EÀ$Ä,ÐOÑOÔOÐOr   c                 óD   —  |                      || j        ¬¦  «        |Ž  d S rZ   )ÚforallrE   )r   ÚkernelÚnelemr   s       r   Úlaunch_kernelz"_CUDAGUFuncCallSteps.launch_kernels   s'   € Ø1ˆ�Š�e D¤LˆÑ1Ô1°4Ð8Ð8Ð8Ð8r   )r   r?   r@   Ú	__slots__r   rR   rW   r+   r^   rb   rg   Ú__classcell__©rL   s   @r   rD   rD   S   sŸ   ø€ € € € € àð€Ið/ð /ð /ð /ð /ð'ð 'ð 'ð'ð 'ð 'ð<ð <ð <ðð ð ðPð Pð Pð9ð 9ð 9ð 9ð 9ð 9ð 9r   rD   c                   ó@   ‡ — e Zd Zˆ fd„Zed„ ¦   «         Zd„ Zd„ Zˆ xZS )ÚCUDAGeneralizedUFuncc                 ód   •— |j         | _         t          ¦   «                              ||¦  «         d S r   )r   rG   r   )r   Ú	kernelmapÚenginer   rL   s       €r   r   zCUDAGeneralizedUFunc.__init__x   s,   ø€ ØœˆŒÝ‰Œ×Ò˜ FÑ+Ô+Ð+Ð+Ð+r   c                 ó   — t           S r   )rD   ©r   s    r   Ú_call_stepsz CUDAGeneralizedUFunc._call_steps|   s   € å#Ð#r   c                 óf   — t           j        j                             |d|j        |j        ¬¦  «        S ©Nr>   ©r%   Ústridesr   Úgpu_data)r   r(   r)   ÚDeviceNDArrayr   rw   )r   Úaryr%   s      r   Ú_broadcast_scalar_inputz,CUDAGeneralizedUFunc._broadcast_scalar_input€   s6   € ÝŒ|Ô'×5Ò5¸EØ>BØ<?¼IØ?B¼|ð 6ñ Mô Mð 	Mr   c                 óÈ   — t          |¦  «        t          |j        ¦  «        z
  }d|z  |j        z   }t          j        j                             |||j        |j        ¬¦  «        S rt   )	r!   r%   rv   r   r(   r)   rx   r   rw   )r   ry   ÚnewshapeÚnewaxÚ
newstridess        r   Ú_broadcast_add_axisz(CUDAGeneralizedUFunc._broadcast_add_axis†   s^   € Ý�H‘”¥ C¤I¡¤Ñ.ˆà˜E‘\ C¤KÑ/ˆ
ÝŒ|Ô'×5Ò5¸HØ>HØ<?¼IØ?B¼|ð 6ñ Mô Mð 	Mr   )	r   r?   r@   r   Úpropertyrr   rz   r   ri   rj   s   @r   rl   rl   w   s{   ø€ € € € € ð,ð ,ð ,ð ,ð ,ð ð$ð $ñ „Xð$ðMð Mð MðMð Mð Mð Mð Mð Mð Mr   rl   c                   ó@   — e Zd ZdZdZd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
S )r   z%
    Provide CUDA specialization
    r   c                 ó:   —  |                      ||¬¦  «        |Ž  d S rZ   )rd   )r   ÚfuncÚcountr    r   s        r   ÚlaunchzCUDAUFuncMechanism.launch–   s%   € Ø)ˆ�Š�E &ˆÑ)Ô)¨4Ð0Ð0Ð0Ð0r   c                 ó*   — t          j        |¦  «        S r   rN   rP   s     r   rR   z"CUDAUFuncMechanism.is_device_array™   rS   r   c                 óv   — t           j        j                             |¦  «        r|S t          j        |¦  «        S r   rU   rP   s     r   rW   z"CUDAUFuncMechanism.as_device_arrayœ   rX   r   c                 ó.   — t          j        ||¬¦  «        S rZ   )r   r+   )r   r[   r    s      r   r+   zCUDAUFuncMechanism.to_device¦   s   € ÝŒ~˜g¨fÐ5Ñ5Ô5Ð5r   c                 ó.   — |                      |¬¦  «        S rZ   )r.   )r   r]   r    s      r   r^   zCUDAUFuncMechanism.to_host©   s   € Ø×"Ò"¨&Ð"Ñ1Ô1Ð1r   c                 ó0   — t          j        |||¬¦  «        S r`   )r   ra   )r   r%   r   r    s       r   rb   z(CUDAUFuncMechanism.allocate_device_array¬   s   € ÝÔ  u°EÀ&ÐIÑIÔIÐIr   c                 óN  ‡‡— ˆˆfd„t          t          ‰¦  «        ¦  «        D ¦   «         }t          ‰¦  «        t          ‰j        ¦  «        z
  }dg|z  t          ‰j        ¦  «        z   }|D ]}d||<   Œt
          j        j                             ‰|‰j	        ‰j
        ¬¦  «        S )Nc                 óX   •— g | ]&}|‰j         k    s‰j        |         ‰|         k    ¯$|‘Œ'S rB   )r$   r%   )Ú.0Úaxry   r%   s     €€r   ú
<listcomp>z7CUDAUFuncMechanism.broadcast_device.<locals>.<listcomp>°   sB   ø€ ð 5ð 5ð 5˜RØ˜sœxš˜Øœ 2œ¨%°¬)Ò3Ð3ð à3Ð3Ð3r   r   ru   )Úranger!   r%   r"   rv   r   r(   r)   rx   r   rw   )r   ry   r%   Ú
ax_differsÚ
missingdimrv   rŽ   s    ``    r   Úbroadcast_devicez#CUDAUFuncMechanism.broadcast_device¯   sÁ   øø€ ð5ð 5ð 5ð 5ð 5¥5­¨U©¬Ñ#4Ô#4ð 5ñ 5ô 5ˆ
õ ˜‘Z”Z¥# c¤i¡.¤.Ñ0ˆ
Ø�#˜
Ñ"¥T¨#¬+Ñ%6Ô%6Ñ6ˆàð 	ð 	ˆBØˆG�B‰KˆKåŒ|Ô'×5Ò5¸EØ>EØ<?¼IØ?B¼|ð 6ñ Mô Mð 	Mr   N)r   r?   r@   rA   ÚDEFAULT_STREAMr…   rR   rW   r+   r^   rb   r“   rB   r   r   r   r   �   s–   € € € € € ðð ð €Nð1ð 1ð 1ð'ð 'ð 'ð'ð 'ð 'ð6ð 6ð 6ð2ð 2ð 2ðJð Jð JðMð Mð Mð Mð Mr   r   z�
def __vectorized_{name}({args}, __out__):
    __tid__ = __cuda__.grid(1)
    if __tid__ < __out__.shape[0]:
        __out__[__tid__] = __core__({argitems})
c                   ó<   — e Zd Zd„ Zd„ Zd„ Zd„ Zed„ ¦   «         ZdS )ÚCUDAVectorizec                 óˆ   —  t          j        |dd¬¦  «        | j        ¦  «        }||j        |j                 j        j        fS )NT)ÚdeviceÚinline)r   Újitr   Ú	overloadsr   Ú	signatureÚreturn_type)r   ÚsigÚcudevfns      r   Ú_compile_corezCUDAVectorize._compile_coreÉ   s?   € Ø9•$”(˜3 t°DÐ9Ñ9Ô9¸$¼+ÑFÔFˆØ˜Ô)¨#¬(Ô3Ô=ÔIÐIÐIr   c                 ó|   — | j         j                             ¦   «         }|                     t          |dœ¦  «         |S )N©Ú__cuda__Ú__core__)r   Ú__globals__ÚcopyÚupdater   )r   ÚcorefnÚglbls      r   Ú_get_globalszCUDAVectorize._get_globalsÍ   sB   € ØŒ{Ô&×+Ò+Ñ-Ô-ˆØ�Š¥Ø!'ð)ð )ñ 	*ô 	*ð 	*àˆr   c                 ó*   — t          j        |¦  «        S r   ©r   rš   ©r   Úfnobjrž   s      r   Ú_compile_kernelzCUDAVectorize._compile_kernelÓ   s   € ÝŒx˜‰ŒÐr   c                 ó6   — t          | j        | j        ¦  «        S r   )r
   rn   r   rq   s    r   Úbuild_ufunczCUDAVectorize.build_ufuncÖ   s   € Ý" 4¤>°4´;Ñ?Ô?Ð?r   c                 ó   — t           S r   )Úvectorizer_stager_sourcerq   s    r   Ú_kernel_templatezCUDAVectorize._kernel_templateÙ   s   € å'Ð'r   N)	r   r?   r@   r    rª   r¯   r±   r€   r´   rB   r   r   r–   r–   È   sq   € € € € € ðJð Jð Jðð ð ðð ð ð@ð @ð @ð ð(ð (ñ „Xð(ð (ð (r   r–   zy
def __gufunc_{name}({args}):
    __tid__ = __cuda__.grid(1)
    if __tid__ < {checkedarg}:
        __core__({argitems})
c                   ó6   — e Zd Zd„ Zd„ Zed„ ¦   «         Zd„ ZdS )ÚCUDAGUFuncVectorizec                 óx   — t          j        | j        | j        ¦  «        }t	          | j        || j        ¬¦  «        S )N)rn   ro   r   )r   ÚGUFuncEngineÚinputsigÚ	outputsigrl   rn   r   )r   ro   s     r   r±   zCUDAGUFuncVectorize.build_ufuncê   s;   € ÝÔ)¨$¬-¸¼ÑHÔHˆÝ#¨d¬nØ+1Ø+/¬;ð8ñ 8ô 8ð 	8r   c                 ó<   —  t          j        |¦  «        |¦  «        S r   r¬   r­   s      r   r¯   z#CUDAGUFuncVectorize._compile_kernelð   s   € Ø�tŒx˜‰}Œ}˜UÑ#Ô#Ð#r   c                 ó   — t           S r   )Ú_gufunc_stager_sourcerq   s    r   r´   z$CUDAGUFuncVectorize._kernel_templateó   s   € å$Ð$r   c                 óÄ   —  t          j        |d¬¦  «        | j        ¦  «        }| j        j                             ¦   «         }|                     t           |dœ¦  «         |S )NT)r˜   r¢   )r   rš   r   Úpy_funcr¥   r¦   r§   )r   rž   r¨   Úglblss       r   rª   z CUDAGUFuncVectorize._get_globals÷   sb   € Ø+•”˜# dÐ+Ñ+Ô+¨D¬KÑ8Ô8ˆØ”Ô(×-Ò-Ñ/Ô/ˆØ�Š¥$Ø"(ð*ð *ñ 	+ô 	+ð 	+àˆr   N)r   r?   r@   r±   r¯   r€   r´   rª   rB   r   r   r¶   r¶   é   s\   € € € € € ð8ð 8ð 8ð$ð $ð $ð ð%ð %ñ „Xð%ðð ð ð ð r   r¶   N)Únumbar   Únumpyr   r-   Únumba.np.ufuncr   Únumba.np.ufunc.deviceufuncr   r   r   Úobjectr
   rD   rl   r   r³   ÚDeviceVectorizer–   r½   ÚDeviceGUFuncVectorizer¶   rB   r   r   ú<module>rÈ      s¥  ðØ Ð Ð Ð Ð Ð Ø #Ð #Ð #Ð #Ð #Ð #Ø &Ð &Ð &Ð &Ð &Ð &ð9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ðHð Hð Hð Hð H˜&ñ Hô Hð HðV!9ð !9ð !9ð !9ð !9˜?ñ !9ô !9ð !9ðHMð Mð Mð Mð MÐ+ñ Mô Mð Mð2-Mð -Mð -Mð -Mð -M˜ñ -Mô -Mð -Mð`Ð ð(ð (ð (ð (ð (�KÔ/ñ (ô (ð (ð2Ð ðð ð ð ð ˜+Ô;ñ ô ð ð ð r   