§
    1@Äj‚|  ã                   óx  — d Z ddlmZmZ ddlmZ ddlZddlZddlm	Z	 ddl
ZddlmZmZ ddlmZmZ ddlmZ dd	lmZ d
„ Zd„ Zd„ Z G d„ de¦  «        Zd„ Z G d„ de¦  «        Z G d„ de¦  «        Zd„ Zd„ Zd„ Z d„ Z! G d„ de¦  «        Z" G d„ de¦  «        Z# G d„ de¦  «        Z$ G d„ de¬ ¦  «        Z%dS )!zA
Implements custom ufunc dispatch mechanism for non-CPU devices.
é    )ÚABCMetaÚabstractmethod)ÚOrderedDictN)Úreduce)Ú_BaseUFuncBuilderÚparse_identity)ÚtypesÚsigutils)Ú	signature©Úparse_signaturec                 óx   — | |k    r| S | dk    r|S |dk    r| S t          d                     | |¦  «        ¦  «        ‚)ú=
    Raises
    ------
    ValueError if broadcast fails
    é   zfailed to broadcast {0} and {1})Ú
ValueErrorÚformat)ÚaÚbs     úGC:\Projects\Historical\venv\Lib\site-packages\numba/cuda/deviceufunc.pyÚ_broadcast_axisr      sM   € ð 	ˆA‚v€vØˆØ	
ˆaŠˆØˆØ	
ˆaŠˆØˆåÐ:×AÒAÀ!ÀQÑGÔGÑHÔHÐHó    c                 ó˜  — t          t          | |g¦  «        \  } }t          | ¦  «        t          |¦  «        k     r%d| z   } t          | ¦  «        t          |¦  «        k     °%t          | ¦  «        t          |¦  «        k    r%d|z   }t          | ¦  «        t          |¦  «        k    °%t          d„ t          | |¦  «        D ¦   «         ¦  «        S )r   ©r   c              3   ó<   K  — | ]\  }}t          ||¦  «        V — Œd S ©N)r   )Ú.0r   r   s      r   ú	<genexpr>z&_pairwise_broadcast.<locals>.<genexpr>1   s0   è è € ÐGÐG©4¨1¨a•  AÑ&Ô&ÐGÐGÐGÐGÐGÐGr   )ÚmapÚtupleÚlenÚzip)Úshape1Úshape2s     r   Ú_pairwise_broadcastr$   #   s¹   € õ � ¨Ð 0Ñ1Ô1�N€FˆFå
ˆf‰+Œ+�˜F™œÒ
#Ð
#Ø˜‘ˆõ ˆf‰+Œ+�˜F™œÒ
#Ð
#õ ˆf‰+Œ+�˜F™œÒ
#Ð
#Ø˜‘ˆõ ˆf‰+Œ+�˜F™œÒ
#Ð
#õ ÐGÐGµ3°v¸vÑ3FÔ3FÐGÑGÔGÑGÔGÐGr   c                  óä   — | sJ ‚| d         }| dd…         }	 t          |d¬¦  «        D ]\  }}t          ||¦  «        }Œ	 |S # t          $ r# t          d                     |¦  «        ¦  «        ‚w xY w)r   r   r   N)Ústartz!failed to broadcast argument #{0})Ú	enumerater$   r   r   )Ú	shapelistÚresultÚothersÚiÚeachs        r   Ú_multi_broadcastr-   4   s¥   € ð ÐÐˆ9à�qŒ\€FØ�q�r�rŒ]€FðÝ  ¨qÐ1Ñ1Ô1ð 	7ð 	7‰GˆAˆtÝ(¨°Ñ6Ô6ˆFˆFð	7ð
 ˆøõ ð Hð Hð HÝÐ<×CÒCÀAÑFÔFÑGÔGÐGðHøøøs   ˜'A Á-A/c                   ó�   — e Zd ZdZdZdZd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zed„ ¦   «         Zd„ Zd„ Zd„ Zd„ ZdS )ÚUFuncMechanismz0
    Prepare ufunc arguments for vectorize.
    NFc                 ó’   — || _         || _        t          | j        ¦  «        }dg|z  | _        g | _        d| _        dg|z  | _        dS )zFNever used directly by user. Invoke by UFuncMechanism.call().
        N)ÚtypemapÚargsr    ÚargtypesÚ	scalarposr   Úarrays)Úselfr1   r2   Únargss       r   Ú__init__zUFuncMechanism.__init__N   sK   € ð ˆŒØˆŒ	Ý�D”I‘”ˆØ˜ ™ˆŒØˆŒØˆŒØ�f˜u‘nˆŒˆˆr   c                 óh  — t          | j        ¦  «        D ]œ\  }}|                      |¦  «        r|                      |¦  «        | j        |<   Œ8t          |t          t          t          t          j
        f¦  «        r| j                             |¦  «         Œ€t          j        |¦  «        | j        |<   Œ�dS )z1
        Get all arguments in array form
        N)r'   r2   Úis_device_arrayÚas_device_arrayr5   Ú
isinstanceÚintÚfloatÚcomplexÚnpÚnumberr4   ÚappendÚasarray)r6   r+   Úargs      r   Ú_fill_arrayszUFuncMechanism._fill_arraysY   s§   € õ   ¤	Ñ*Ô*ð 	1ð 	1‰FˆAˆsØ×#Ò# CÑ(Ô(ð 1Ø!%×!5Ò!5°cÑ!:Ô!:�”˜A‘�Ý˜C¥#¥u­gµr´yÐ!AÑBÔBð 1à”×%Ò% aÑ(Ô(Ð(Ð(å!#¤¨C¡¤�”˜A‘�ð	1ð 	1r   c                 ó¨   — t          | j        ¦  «        D ]<\  }}|�5t          |d¦  «        }|€t          j        |¦  «        j        }|| j        |<   Œ=dS )z
        Get dtypes
        NÚdtype)r'   r5   Úgetattrr@   rC   rG   r3   )r6   r+   ÚaryrG   s       r   Ú_fill_argtypeszUFuncMechanism._fill_argtypesf   sa   € õ   ¤Ñ,Ô,ð 	)ð 	)‰FˆAˆsØˆÝ  WÑ-Ô-�Ø�=ÝœJ s™OœOÔ1�EØ#(�”˜aÑ øð	)ð 	)r   c                 ón  — g }| j         rš| j        D ]’}g }t          t          || j        ¦  «        ¦  «        D ]G\  }\  }}|€$t          j        | j        |         ¦  «        j        }| 	                    ||k    ¦  «         ŒHt          |¦  «        r| 	                    |¦  «         Œ“|sOg }| j        D ]E}t          d„ t          || j        ¦  «        D ¦   «         ¦  «        }|r| 	                    |¦  «         ŒF|st          d¦  «        ‚t          |¦  «        dk    rt          d¦  «        ‚|d         | _        dS )z<Resolve signature.
        May have ambiguous case.
        Nc              3   ó0   K  — | ]\  }}|d u p||k    V — Œd S r   © )r   ÚformalÚactuals      r   r   z4UFuncMechanism._resolve_signature.<locals>.<genexpr>‰   sP   è è € ð "Að "AÙ&4 f¨fð #)¨D .Ð"D°F¸fÒ4Dð "Að "Að "Að "Að "Að "Ar   z…No matching version.  GPU ufunc requires array arguments to have the exact types.  This behaves like regular ufunc with casting='no'.r   zqFailed to resolve ufunc due to ambiguous signature. Too many untyped scalars. Use numpy dtype object to type tag.r   )r4   r1   r'   r!   r3   r@   rC   r2   rG   rB   ÚallÚ	TypeErrorr    )r6   ÚmatchesÚ	formaltysÚ	match_mapr+   rN   rO   Úall_matchess           r   Ú_resolve_signaturez!UFuncMechanism._resolve_signatureq   s›  € ð ˆàŒ>ð 	.à!œ\ð 
.ð 
.�	Ø�	Ý+4µS¸Ø9=¼ñ6Hô 6Hñ ,Iô ,Ið 7ð 7Ñ'�AÑ'˜ à�~Ý!#¤¨D¬I°a¬LÑ!9Ô!9Ô!?˜à×$Ò$ V¨vÒ%5Ñ6Ô6Ð6Ð6å�y‘>”>ð .Ø—N’N 9Ñ-Ô-Ð-øð ð 	.ØˆGØ!œ\ð .ð .�	Ý!ð "Að "Aå"% i°´Ñ"?Ô"?ð"Añ "Aô "Añ Aô A�ð ð .Ø—N’N 9Ñ-Ô-Ð-øàð 	EÝð Dñ Eô Eð Eõ ˆw‰<Œ<˜!ÒÐÝð Bñ Cô Cð Cð
   œ
ˆŒˆˆr   c                 óŽ   — | j         D ]7}t          j        | j        |         g| j        |         ¬¦  «        | j        |<   Œ8| j        S )zPReturn the actual arguments
        Casts scalar arguments to np.array.
        ©rG   )r4   r@   Úarrayr2   r3   r5   )r6   r+   s     r   Ú_get_actual_argszUFuncMechanism._get_actual_argsœ   sJ   € ð ”ð 	Nð 	NˆAÝœX t¤y°¤| n¸D¼MÈ!Ô<LÐMÑMÔMˆDŒK˜‰NˆNàŒ{Ðr   c                 ó6  ‡	‡
— d„ |D ¦   «         }t          |Ž Š
t          |¦  «        D ]ñ\  }Š	‰	j        ‰
k    rŒ|                      ‰	¦  «        r|                      ‰	‰
¦  «        ||<   Œ@ˆ	ˆ
fd„t          t          ‰
¦  «        ¦  «        D ¦   «         }t          ‰
¦  «        t          ‰	j        ¦  «        z
  }dg|z  t          ‰	j        ¦  «        z   }|D ]}d||<   Œt          j
        j                             ‰	‰
|¬¦  «        }|                      |¦  «        ||<   Œò|S )z)Perform numpy ufunc broadcasting
        c                 ó   — g | ]	}|j         ‘Œ
S rM   ©Úshape©r   r   s     r   ú
<listcomp>z-UFuncMechanism._broadcast.<locals>.<listcomp>¨   s   € Ð+Ð+Ð+ �Q”WÐ+Ð+Ð+r   c                 óX   •— g | ]&}|‰j         k    s‰j        |         ‰|         k    ¯$|‘Œ'S rM   )Úndimr^   )r   ÚaxrI   r^   s     €€r   r`   z-UFuncMechanism._broadcast.<locals>.<listcomp>´   sE   ø€ ð "Að "Að "A¨Ø%'¨3¬8¢^ ^Ø%(¤Y¨r¤]°e¸B´iÒ%?Ð%?ð #%à%?Ð%?Ð%?r   r   )r^   Ústrides)r-   r'   r^   r:   Úbroadcast_deviceÚranger    Úlistrd   r@   ÚlibÚstride_tricksÚ
as_stridedÚforce_array_layout)r6   Úarysr(   r+   Ú
ax_differsÚ
missingdimrd   rc   ÚstridedrI   r^   s            @@r   Ú
_broadcastzUFuncMechanism._broadcast¥   sY  øø€ ð ,Ð+ dÐ+Ñ+Ô+ˆ	Ý  )Ð,ˆå ‘o”oð 	?ð 	?‰FˆAˆsØŒy˜EÒ!Ð!Øð ×'Ò'¨Ñ,Ô,ð ?Ø"×3Ò3°C¸Ñ?Ô?�D˜‘G�Gð"Að "Að "Að "Að "A­uµS¸±Z´ZÑ/@Ô/@ð "Añ "Aô "A�Jõ "% U¡¤­c°#´)©n¬nÑ!<�JØ ˜c JÑ.µ°c´kÑ1BÔ1BÑB�Gà(ð (ð (˜Ø&'˜ ™˜å œfÔ2×=Ò=¸cØDIØFMð >ñ Oô O�Gð #×5Ò5°gÑ>Ô>�D˜‘G�Gàˆr   c                 óÌ   — |                       ¦   «          |                      ¦   «          |                      ¦   «          |                      ¦   «         }|                      |¦  «        S )z[Prepare and return the arguments for the ufunc.
        Does not call to_device().
        )rE   rJ   rV   rZ   rp   )r6   rl   s     r   Úget_argumentszUFuncMechanism.get_argumentsÆ   s]   € ð 	×ÒÑÔÐØ×ÒÑÔÐØ×ÒÑ!Ô!Ð!Ø×$Ò$Ñ&Ô&ˆØ�Š˜tÑ$Ô$Ð$r   c                 ó&   — | j         | j                 S )z)Returns (result_dtype, function)
        )r1   r3   ©r6   s    r   Úget_functionzUFuncMechanism.get_functionÐ   s   € ð Œ|˜DœMÔ*Ð*r   c                 ó   — dS )zBIs the `obj` a device array?
        Override in subclass
        FrM   ©r6   Úobjs     r   r:   zUFuncMechanism.is_device_arrayÕ   s	   € ð ˆur   c                 ó   — |S )z�Convert the `obj` to a device array
        Override in subclass

        Default implementation is an identity function
        rM   rw   s     r   r;   zUFuncMechanism.as_device_arrayÛ   s	   € ð ˆ
r   c                 ó    — t          d¦  «        ‚)zTHandles ondevice broadcasting

        Override in subclass to add support.
        z'broadcasting on device is not supported©ÚNotImplementedError©r6   rI   r^   s      r   re   zUFuncMechanism.broadcast_deviceã   s   € õ
 "Ð"KÑLÔLÐLr   c                 ó   — |S )zSEnsures array layout met device requirement.

        Override in sublcass
        rM   )r6   rI   s     r   rk   z!UFuncMechanism.force_array_layoutê   s	   € ð
 ˆ
r   c                 óî  ‡‡‡— |                      d| j        ¦  «        Š|                      dd¦  «        }|r*t          j        dd                     |¦  «        z  ¦  «          | ||¦  «        Š‰                     ¦   «         }‰                     ¦   «         \  }}|d         j        }|�*‰                     |¦  «        r‰ 	                    |¦  «        }ˆˆfd„Š|d         j
        dk    rˆfd	„|D ¦   «         }g }d
}	|D ][}
‰                     |
¦  «        r|                     |
¦  «         d}	Œ/‰                     |
‰¬¦  «        }|                     |¦  «         Œ\|d         j        }|€Š‰                     ||‰¬¦  «        }|                     |g¦  «         ‰                     ||d         ‰|¦  «         |	r|                     |¦  «        S |                     ¦   «                              |¦  «        S ‰                     |¦  «        ra|j
        dk    r ‰|¦  «        }|}|                     |g¦  «         ‰                     ||d         ‰|¦  «         |                     |¦  «        S |j        |k    sJ ‚|j        |k    sJ ‚‰                     ||‰¬¦  «        }|                     |g¦  «         ‰                     ||d         ‰|¦  «         |                     |‰¬¦  «                             |¦  «        S )z1Perform the entire ufunc call mechanism.
        ÚstreamÚoutNzunrecognized keywords: %sú, r   c                 ó  •— ‰j         rt          ‚	 |                      ¦   «         S # t          $ rW ‰                     | ¦  «        s‚ ‰                     | ‰¦  «                             ¦   «         }‰                     |‰¦  «        cY S w xY wr   )ÚSUPPORT_DEVICE_SLICINGr|   Úravelr:   Úto_hostÚ	to_device)r   ÚhostaryÚcrr€   s     €€r   Úattempt_ravelz*UFuncMechanism.call.<locals>.attempt_ravel  s–   ø€ ØÔ(ð *Ý)Ð)ð9à—w’w‘y”yÐ øÝ&ð 9ð 9ð 9à×)Ò)¨!Ñ,Ô,ð 9Øð !Ÿjšj¨¨FÑ3Ô3×9Ò9Ñ;Ô;�GØŸ<š<¨°Ñ8Ô8Ð8Ð8Ð8ð9øøøs   ‘% ¥ABÂBr   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS rM   rM   )r   r   rŠ   s     €r   r`   z'UFuncMechanism.call.<locals>.<listcomp>  s#   ø€ Ð3Ð3Ð3¨�M�M !Ñ$Ô$Ð3Ð3Ð3r   FT)r€   )ÚpopÚDEFAULT_STREAMÚwarningsÚwarnÚjoinrr   ru   r^   r:   r;   rb   rB   r‡   Úallocate_device_arrayÚextendÚlaunchÚreshapeÚcopy_to_hostrG   )Úclsr1   r2   Úkwsr�   ÚrestyÚfuncÚoutshapeÚdevarysÚ
any_devicer   Údev_ar^   ÚdevoutrŠ   r‰   r€   s                 @@@r   ÚcallzUFuncMechanism.callñ   s2  øøø€ ð
 —’˜ 3Ô#5Ñ6Ô6ˆØ�gŠg�e˜TÑ"Ô"ˆàð 	HÝŒMÐ5¸¿	º	À#¹¼ÑFÑGÔGÐGð ˆS�˜$ÑÔˆØ×ÒÑ!Ô!ˆØ—o’oÑ'Ô'‰ˆˆtà˜”7”=ˆð ˆ?˜r×1Ò1°#Ñ6Ô6ˆ?Ø×$Ò$ SÑ)Ô)ˆCð	9ð 	9ð 	9ð 	9ð 	9ð 	9ð" �Œ7Œ<˜!ÒÐØ3Ð3Ð3Ð3¨dÐ3Ñ3Ô3ˆDð ˆØˆ
Øð 	&ð 	&ˆAØ×!Ò! !Ñ$Ô$ð &Ø—’˜qÑ!Ô!Ð!Ø!�
�
àŸš Q¨v˜Ñ6Ô6�Ø—’˜uÑ%Ô%Ð%Ð%ð �Q””ˆØˆ;à×-Ò-¨e°UÀ6Ð-ÑJÔJˆFà�NŠN˜F˜8Ñ$Ô$Ð$Ø�IŠI�d˜E !œH f¨gÑ6Ô6Ð6àð ?ð —~’~ hÑ/Ô/Ð/ð ×*Ò*Ñ,Ô,×4Ò4°XÑ>Ô>Ð>à×Ò Ñ$Ô$ð 	Mð Œx˜!Š|ˆ|Ø#�m CÑ(Ô(�ØˆFØ�NŠN˜F˜8Ñ$Ô$Ð$Ø�IŠI�d˜E !œH f¨gÑ6Ô6Ð6Ø—>’> (Ñ+Ô+Ð+ð
 ”9 Ò%Ð%Ð%Ð%Ø”9 Ò%Ð%Ð%Ð%Ø×-Ò-¨e°UÀ6Ð-ÑJÔJˆFØ�NŠN˜F˜8Ñ$Ô$Ð$Ø�IŠI�d˜E !œH f¨gÑ6Ô6Ð6Ø×&Ò& s°6Ð&Ñ:Ô:×BÒBÀ8ÑLÔLÐLr   c                 ó   — t           ‚)zBImplement to device transfer
        Override in subclass
        r{   )r6   rˆ   r€   s      r   r‡   zUFuncMechanism.to_deviceK  ó
   € õ "Ð!r   c                 ó   — t           ‚)z@Implement to host transfer
        Override in subclass
        r{   )r6   Údevaryr€   s      r   r†   zUFuncMechanism.to_hostQ  r¡   r   c                 ó   — t           ‚)zBImplements device allocation
        Override in subclass
        r{   )r6   r^   rG   r€   s       r   r‘   z$UFuncMechanism.allocate_device_arrayW  r¡   r   c                 ó   — t           ‚)zKImplements device function invocation
        Override in subclass
        r{   )r6   r™   Úcountr€   r2   s        r   r“   zUFuncMechanism.launch]  r¡   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r�   r„   r8   rE   rJ   rV   rZ   rp   rr   ru   r:   r;   re   rk   ÚclassmethodrŸ   r‡   r†   r‘   r“   rM   r   r   r/   r/   G   sB  € € € € € ðð ð €NØ"Ðð	%ð 	%ð 	%ð1ð 1ð 1ð	)ð 	)ð 	)ð)#ð )#ð )#ðVð ð ðð ð ðB%ð %ð %ð+ð +ð +ð
ð ð ðð ð ðMð Mð Mðð ð ð ðWMð WMñ „[ðWMðr"ð "ð "ð"ð "ð "ð"ð "ð "ð"ð "ð "ð "ð "r   r/   c                 ó†   — t          | t          j        ¦  «        r| j        } t	          j        t          | ¦  «        ¦  «        S r   )r<   r	   Ú
EnumMemberrG   r@   Ústr)Útys    r   Úto_dtyper°   d  s4   € Ý�"•eÔ&Ñ'Ô'ð ØŒXˆÝŒ8•C˜‘G”GÑÔÐr   c                   óR   — e Zd Zdd„Zed„ ¦   «         Zdd„Zd„ Zd„ Zd„ Z	d	„ Z
d
„ ZdS )ÚDeviceVectorizeNFc                 ó  — |€i }|rt          d¦  «        ‚|D ];}|dk    rt          j        dt          ¦  «         Œ#d}|dz  }t	          ||z  ¦  «        ‚|| _        t          |¦  «        | _        t          ¦   «         | _	        d S )Núcaching is not supportedÚnopythonz+nopython kwarg for cuda target is redundantzUnrecognized options. z3cuda vectorize target does not support option: '%s')
rQ   rŽ   r�   ÚRuntimeWarningÚKeyErrorÚpy_funcr   Úidentityr   Ú	kernelmap)r6   r™   r¹   ÚcacheÚtargetoptionsÚoptÚfmts          r   r8   zDeviceVectorize.__init__k  s¦   € ØÐ ØˆMØð 	8ÝÐ6Ñ7Ô7Ð7Ø ð 	*ð 	*ˆCØ�jÒ Ð Ý”ÐKÝ,ñ.ô .ð .ð .ð /�ØÐLÑL�Ý˜s S™yÑ)Ô)Ð)ØˆŒÝ& xÑ0Ô0ˆŒå$™œˆŒˆˆr   c                 ó   — | j         S r   ©r¸   rt   s    r   ÚpyfunczDeviceVectorize.pyfunc}  ó
   € àŒ|Ðr   c                 ó@  — t          j        |¦  «        \  }}t          |g|¢R Ž }| j        j        }|                      | j        ||¦  «        }|                      |¦  «        \  }}|                      |¦  «        }t          t          j
        gd„ |D ¦   «         |d d …         gz   ¢R Ž }t          ||¦  «         |d|z           }	|                      |	|¦  «        }
t          d„ |j        D ¦   «         ¦  «        }t          |¦  «        }||
f| j        t          |¦  «        <   d S )Nc                 ó"   — g | ]}|d d …         ‘ŒS r   rM   r_   s     r   r`   z'DeviceVectorize.add.<locals>.<listcomp>‹  s    € Ð&:Ð&:Ð&:° q¨¨¨¤tÐ&:Ð&:Ð&:r   z__vectorized_%sc              3   ó4   K  — | ]}t          |¦  «        V — Œd S r   )r°   ©r   Úts     r   r   z&DeviceVectorize.add.<locals>.<genexpr>‘  s(   è è € Ð=Ð=¨!�( 1™+œ+Ð=Ð=Ð=Ð=Ð=Ð=r   )r
   Únormalize_signaturer   rÁ   r§   Ú_get_kernel_sourceÚ_kernel_templateÚ_compile_coreÚ_get_globalsr	   ÚvoidÚexecÚ_compile_kernelr   r2   r°   rº   )r6   Úsigr2   Úreturn_typeÚdevfnsigÚfuncnameÚkernelsourceÚcorefnÚglblÚstagerÚkernelÚ	argdtypesÚresdtypes                r   ÚaddzDeviceVectorize.add�  s7  € å$Ô8¸Ñ=Ô=ÑˆˆkÝ˜[Ð0¨4Ð0Ð0Ð0ˆà”;Ô'ˆØ×.Ò.¨tÔ/DØ/7¸ñCô Cˆà"×0Ò0°Ñ:Ô:Ñˆ�Ø× Ò  Ñ(Ô(ˆÝ�œ
ÐOÐ&:Ð&:°TÐ&:Ñ&:Ô&:¸kÈ!È!È!¼nÐ=MÑ&MÐOÐOÐOˆÝˆ\˜4Ñ Ô Ð àÐ'¨(Ñ2Ô3ˆØ×%Ò% f¨cÑ2Ô2ˆåÐ=Ð=¨x¬}Ð=Ñ=Ô=Ñ=Ô=ˆ	Ý˜KÑ(Ô(ˆØ+3°VÐ+;ˆŒ•u˜YÑ'Ô'Ñ(Ð(Ð(r   c                 ó   — t           ‚r   r{   rt   s    r   Úbuild_ufunczDeviceVectorize.build_ufunc•  ó   € Ý!Ð!r   c                 óö   — d„ t          t          |j        ¦  «        ¦  «        D ¦   «         }t          |d                     |¦  «        d                     d„ |D ¦   «         ¦  «        ¬¦  «        } |j        di |¤ŽS )Nc                 ó   — g | ]}d |z  ‘ŒS )za%drM   ©r   r+   s     r   r`   z6DeviceVectorize._get_kernel_source.<locals>.<listcomp>™  s   € Ð8Ð8Ð8˜a�˜‘	Ð8Ð8Ð8r   r‚   c              3   ó    K  — | ]	}d |z  V — Œ
dS )z%s[__tid__]NrM   rá   s     r   r   z5DeviceVectorize._get_kernel_source.<locals>.<genexpr>œ  s'   è è € Ð&GÐ&G¸Q }°qÑ'8Ð&GÐ&GÐ&GÐ&GÐ&GÐ&Gr   )Únamer2   ÚargitemsrM   )rf   r    r2   Údictr�   r   )r6   ÚtemplaterÐ   rÓ   r2   Úfmtss         r   rÉ   z"DeviceVectorize._get_kernel_source˜  sƒ   € Ø8Ð8¥5­¨S¬X©¬Ñ#7Ô#7Ð8Ñ8Ô8ˆÝ˜ØŸš 4™œØ!ŸYšYÐ&GÐ&GÀ$Ð&GÑ&GÔ&GÑGÔGðIñ Iô Iˆð ˆxŒÐ&Ð& Ð&Ð&Ð&r   c                 ó   — t           ‚r   r{   ©r6   rÐ   s     r   rË   zDeviceVectorize._compile_coreŸ  rÞ   r   c                 ó   — t           ‚r   r{   )r6   rÕ   s     r   rÌ   zDeviceVectorize._get_globals¢  rÞ   r   c                 ó   — t           ‚r   r{   ©r6   ÚfnobjrÐ   s      r   rÏ   zDeviceVectorize._compile_kernel¥  rÞ   r   )NFNr   )r§   r¨   r©   r8   ÚpropertyrÁ   rÛ   rÝ   rÉ   rË   rÌ   rÏ   rM   r   r   r²   r²   j  s¢   € € € € € ð'ð 'ð 'ð 'ð$ ðð ñ „Xðð<ð <ð <ð <ð("ð "ð "ð'ð 'ð 'ð"ð "ð "ð"ð "ð "ð"ð "ð "ð "ð "r   r²   c                   óH   — e Zd Z	 	 	 	 d	d„Zed„ ¦   «         Zd
d„Zd„ Zd„ ZdS )ÚDeviceGUFuncVectorizeNFrM   c                 óö  — |€i }|rt          d¦  «        ‚|rt          d¦  «        ‚|                     dd¦  «        st          d¦  «        ‚|rUd                     d„ |                     ¦   «         D ¦   «         ¦  «        }d}t          |                     |¦  «        ¦  «        ‚|| _        t          |¦  «        | _        || _        t          | j        ¦  «        \  | _
        | _        t          ¦   «         | _        d S )	Nr´   zwritable_args are not supportedrµ   Tznopython flag must be Truer‚   c                 ó,   — g | ]}t          |¦  «        ‘ŒS rM   )Úrepr)r   Úks     r   r`   z2DeviceGUFuncVectorize.__init__.<locals>.<listcomp>¿  s   € ÐDÐDÐD¨!�d 1™gœgÐDÐDÐDr   z3The following target options are not supported: {0})rQ   rŒ   r�   Úkeysr   r¸   r   r¹   r   r   ÚinputsigÚ	outputsigr   rº   )	r6   r™   rÐ   r¹   r»   r¼   Úwritable_argsÚoptsr¾   s	            r   r8   zDeviceGUFuncVectorize.__init__ª  sÿ   € ð Ð ØˆMØð 	8ÝÐ6Ñ7Ô7Ð7Øð 	?ÝÐ=Ñ>Ô>Ð>ð × Ò  ¨TÑ2Ô2ð 	:ÝÐ8Ñ9Ô9Ð9àð 	.Ø—9’9ÐDÐD¨}×/AÒ/AÑ/CÔ/CÐDÑDÔDÑEÔEˆDØGˆCÝ˜CŸJšJ tÑ,Ô,Ñ-Ô-Ð-àˆŒÝ& xÑ0Ô0ˆŒØˆŒÝ(7¸¼Ñ(GÔ(GÑ%ˆŒ�t”~õ %™œˆŒˆˆr   c                 ó   — | j         S r   rÀ   rt   s    r   rÁ   zDeviceGUFuncVectorize.pyfuncË  rÂ   r   c                 óÈ  — d„ | j         D ¦   «         }d„ | j        D ¦   «         }t          j        |¦  «        \  }}|t          j        d fv }|st          d|› d|› d�¦  «        ‚| j        j        }t          | j
        ||||¦  «        }|                      |¦  «        }	t          ||	¦  «         |	d                     |¬¦  «                 }
t          t          |||z   ¦  «        ¦  «        }|                      |
t#          |¦  «        ¬¦  «        }t%          |¦  «        }d	„ |D ¦   «         }t#          |d | …         ¦  «        }t#          || d …         ¦  «        }||f| j        |<   d S )
Nc                 ó,   — g | ]}t          |¦  «        ‘ŒS rM   ©r    ©r   Úxs     r   r`   z-DeviceGUFuncVectorize.add.<locals>.<listcomp>Ð  s   € Ð0Ð0Ð0˜Q•#�a‘&”&Ð0Ð0Ð0r   c                 ó,   — g | ]}t          |¦  «        ‘ŒS rM   rý   rþ   s     r   r`   z-DeviceGUFuncVectorize.add.<locals>.<listcomp>Ñ  s   € Ð2Ð2Ð2˜a•3�q‘6”6Ð2Ð2Ð2r   z7guvectorized functions cannot return values: signature z specifies z return typez__gufunc_{name})rã   )rÐ   c                 óZ   — g | ](}t          j        t          |j        ¦  «        ¦  «        ‘Œ)S rM   )r@   rG   r®   rÆ   s     r   r`   z-DeviceGUFuncVectorize.add.<locals>.<listcomp>é  s*   € Ð;Ð;Ð;¨Q•"”(�3˜qœw™<œ<Ñ(Ô(Ð;Ð;Ð;r   )rö   r÷   r
   rÈ   r	   ÚnonerQ   r¸   r§   Úexpand_gufunc_templaterÊ   rÌ   rÎ   r   rg   Ú_determine_gufunc_outer_typesrÏ   r   r    rº   )r6   rÐ   ÚindimsÚoutdimsr2   rÑ   Úvalid_return_typerÓ   ÚsrcÚglblsrí   ÚoutertysrØ   ÚnoutÚdtypesÚindtypesÚ	outdtypess                    r   rÛ   zDeviceGUFuncVectorize.addÏ  s›  € Ø0Ð0 $¤-Ð0Ñ0Ô0ˆØ2Ð2 4¤>Ð2Ñ2Ô2ˆÝ$Ô8¸Ñ=Ô=Ñˆˆkð (­E¬J¸Ð+=Ð=ÐØ ð 	$Ýð #Ø),ð#ð #Ø9Dð#ð #ð #ñ $ô $ð $ð ”<Ô(ˆÝ$ TÔ%:¸FØ%,¨h¸ñ>ô >ˆð ×!Ò! #Ñ&Ô&ˆåˆS�%ÑÔÐØÐ'×.Ò.°HÐ.Ñ=Ô=Ô>ˆåÕ5°d¸FÀWÑ<LÑMÔMÑNÔNˆØ×%Ò% eµ°x±´Ð%ÑAÔAˆå�7‰|Œ|ˆØ;Ð;°(Ð;Ñ;Ô;ˆÝ˜  $  œÑ(Ô(ˆÝ˜& $   œ.Ñ)Ô)ˆ	à#,¨fÐ#4ˆŒ�xÑ Ð Ð r   c                 ó   — t           ‚r   r{   rì   s      r   rÏ   z%DeviceGUFuncVectorize._compile_kernelï  rÞ   r   c                 ó   — t           ‚r   r{   ré   s     r   rÌ   z"DeviceGUFuncVectorize._get_globalsò  rÞ   r   )NFNrM   r   )	r§   r¨   r©   r8   rî   rÁ   rÛ   rÏ   rÌ   rM   r   r   rð   rð   ©  s…   € € € € € ð
 ØØØð'ð 'ð 'ð 'ðB ðð ñ „Xðð5ð 5ð 5ð 5ð@"ð "ð "ð"ð "ð "ð "ð "r   rð   c              #   óþ   K  — t          | |¦  «        D ]i\  }}t          |t          j        ¦  «        r|                     |dz   ¬¦  «        V — Œ;|dk    rt          d¦  «        ‚t          j        |dd¬¦  «        V — Œjd S )Nr   )rb   r   z,gufunc signature mismatch: ndim>0 for scalarÚA)rG   rb   Úlayout)r!   r<   r	   ÚArrayÚcopyr   )ÚargtysÚdimsÚatÚnds       r   r  r  ö  sš   è è € Ý�f˜dÑ#Ô#ð <ð <‰ˆˆBÝ�b�%œ+Ñ&Ô&ð 	<Ø—'’'˜r A™v�'Ñ&Ô&Ð&Ð&Ð&Ð&à�AŠvˆvÝ Ð!OÑPÔPÐPÝ”+ B¨Q°sÐ;Ñ;Ô;Ð;Ð;Ð;Ð;ð<ð <r   c           	      ó  — ||z   }d„ t          t          |¦  «        ¦  «        D ¦   «         }d                     d                     d„ |D ¦   «         ¦  «        ¦  «        }d„ t	          |||¦  «        D ¦   «         }d„ t	          |t          |¦  «        d…         ||t          |¦  «        d…         ¦  «        D ¦   «         }	||	z   }
|                      |d                     |¦  «        |d                     |
¦  «        ¬¦  «        }|S )	z"Expand gufunc source template
    c                 ó8   — g | ]}d                       |¦  «        ‘ŒS )zarg{0}©r   rá   s     r   r`   z*expand_gufunc_template.<locals>.<listcomp>  s$   € Ð@Ð@Ð@ q�—’ Ñ"Ô"Ð@Ð@Ð@r   zmin({0})r‚   c                 ó8   — g | ]}d                       |¦  «        ‘ŒS )z{0}.shape[0]r  r_   s     r   r`   z*expand_gufunc_template.<locals>.<listcomp>  s<   € ð .Að .Að .AØ23ð /=×.CÒ.CÀAÑ.FÔ.Fð .Að .Að .Ar   c                 ó8   — g | ]\  }}}t          |||¦  «        ‘ŒS rM   ©Ú_gen_src_for_indexing©r   ÚarefÚadimsÚatypes       r   r`   z*expand_gufunc_template.<locals>.<listcomp>  s@   € ð Ið Ið IÙ$�$˜˜uõ $ D¨%°Ñ7Ô7ð Ið Ið Ir   c                 ó8   — g | ]\  }}}t          |||¦  «        ‘ŒS rM   r  r!  s       r   r`   z*expand_gufunc_template.<locals>.<listcomp>	  s@   € ð Fð Fð FÙ%�4˜ õ % T¨5°%Ñ8Ô8ð Fð Fð Fr   N)rã   r2   Ú
checkedargrä   )rf   r    r   r�   r!   )ræ   r  r  rÓ   r3   ÚargdimsÚargnamesr&  ÚinputsÚoutputsrä   r  s               r   r  r     sI  € ð �wÑ€GØ@Ð@­Eµ#°g±,´,Ñ,?Ô,?Ð@Ñ@Ô@€HØ×"Ò" 4§9¢9ð .Að .AØ7?ð.Añ .Aô .Añ $Bô $Bñ Cô C€JðIð IÝ(+¨H°f¸hÑ(GÔ(GðIñ Iô I€FðFð FÝ),¨Xµc¸&±k´k°l°lÔ-CÀWØ-5µc¸&±k´k°l°lÔ-Cñ*Eô *EðFñ Fô F€Gð ˜Ñ€HØ
�/Š/˜x¨d¯iªi¸Ñ.AÔ.AØ%/Ø#'§9¢9¨XÑ#6Ô#6ð ñ 8ô 8€Cð €Jr   c                 óL   — d                      | t          ||¦  «        ¬¦  «        S )Nz{aref}[{sliced}])r"  Úsliced)r   Ú_gen_src_index)r"  r#  r$  s      r   r   r     s1   € Ø×$Ò$¨$Ý,:¸5À%Ñ,HÔ,Hð %ñ Jô Jð Jr   c                 ó    — | dk    rd                      dgdg| z  z   ¦  «        S t          |t          j        ¦  «        r|j        dz
  | k    rdS dS )Nr   ú,Ú__tid__ú:r   z__tid__:(__tid__ + 1))r�   r<   r	   r  rb   )r#  r$  s     r   r-  r-    s[   € Øˆq‚y€yØ�xŠx˜˜ s e¨e¡mÑ3Ñ4Ô4Ð4Ý	�E�5œ;Ñ	'Ô	'ð ¨E¬J¸©N¸eÒ,CÐ,Cð 'Ð&àˆyr   c                   ó4   — e Zd ZdZed„ ¦   «         Zd„ Zd„ ZdS )ÚGUFuncEnginezZDetermine how to broadcast and execute a gufunc
    base on input shape and signature
    c                 ó&   —  | t          |¦  «        Ž S r   r   )r–   r   s     r   Úfrom_signaturezGUFuncEngine.from_signature)  s   € àˆs•O IÑ.Ô.Ð/Ð/r   c                 ó†   — || _         || _        t          | j         ¦  «        | _        t          | j        ¦  «        | _        d S r   )ÚsinÚsoutr    Úninr  )r6   rö   r÷   s      r   r8   zGUFuncEngine.__init__-  s2   € àˆŒØˆŒ	å�t”x‘=”=ˆŒÝ˜œ	‘N”NˆŒ	ˆ	ˆ	r   c                 ó4  — t          |¦  «        | j        k    rt          d¦  «        ‚i }g }g }t          t	          || j        ¦  «        ¦  «        D ]î\  }\  }}|dz  }t          |¦  «        }t          |¦  «        |k     rd}	t          |	|fz  ¦  «        ‚|r|| d …         }
|d | …         }nd}
|}t          t	          |
|¦  «        ¦  «        D ]E\  }\  }}|t          |¦  «        z  }||v r"||         |k    rd}	t          |	||fz  ¦  «        ‚|||<   ŒF|                     |¦  «         |                     |
¦  «         Œïg }| j        D ]F}g }|D ]}|                     ||         ¦  «         Œ|                     t          |¦  «        ¦  «         ŒGd„ |D ¦   «         }t          j        |¦  «        }||         }dg| j        z  }t          |¦  «        D ]5\  }}||k    r*|dk    s|dk    rd	||<   Œd
}	t          |	|dz   fz  ¦  «        ‚Œ6t          | ||||¦  «        S )Nz invalid number of input argumentr   z%arg #%d: insufficient inner dimensionrM   z$arg #%d: shape[%d] mismatch argumentc                 óD   — g | ]}t          t          j        |d ¦  «        ‘ŒS r   )r   ÚoperatorÚmul)r   Úss     r   r`   z)GUFuncEngine.schedule.<locals>.<listcomp>_  s&   € ÐBÐBÐB°•�œ a¨Ñ+Ô+ÐBÐBÐBr   Fr   Tz!arg #%d: outer dimension mismatch)r    r9  rQ   r'   r!   r7  r   rB   r8  r   r@   ÚargmaxÚGUFuncSchedule)r6   ÚishapesÚ	symbolmapÚouter_shapesÚinner_shapesÚargnr^   ÚsymbolsÚ
inner_ndimr¾   Úinner_shapeÚouter_shapeÚaxisÚdimÚsymÚoshapesÚoutsigÚoshapeÚsizesÚ	largest_iÚloopdimsÚpinnedr+   Úds                           r   ÚschedulezGUFuncEngine.schedule5  s“  € Ýˆw‰<Œ<˜4œ8Ò#Ð#ÝÐ>Ñ?Ô?Ð?ð ˆ	ØˆØˆå&/µ°G¸T¼XÑ0FÔ0FÑ&GÔ&Gð 	-ð 	-Ñ"ˆDÑ"�5˜'Ø�A‰IˆDÝ˜W™œˆJÝ�5‰zŒz˜JÒ&Ð&Ø=�Ý  ¨ w¡Ñ/Ô/Ð/Øð $Ø# Z K L LÔ1�Ø# L j [ LÔ1��à �Ø#�å$-­c°+¸wÑ.GÔ.GÑ$HÔ$Hð %ð %Ñ �‘j�s˜CØ�˜KÑ(Ô(Ñ(�Ø˜)Ð#Ð#Ø  ”~¨Ò,Ð,ØD˜Ý(¨°°d¨|Ñ);Ñ<Ô<Ð<Ø!$�	˜#‘�à×Ò Ñ,Ô,Ð,Ø×Ò Ñ,Ô,Ð,Ð,ð ˆØ”ið 	*ð 	*ˆFØˆFØð .ð .�Ø—’˜i¨œnÑ-Ô-Ð-Ð-Ø�NŠN�5 ™=œ=Ñ)Ô)Ð)Ð)ð CÐB°\ÐBÑBÔBˆÝ”I˜eÑ$Ô$ˆ	Ø 	Ô*ˆà�˜4œ8Ñ#ˆÝ˜lÑ+Ô+ð 	5ð 	5‰DˆAˆqØ�HŠ}ˆ}Ø˜’9�9  R¢ Ø $�F˜1‘I�Ià=�CÝ$ S¨A°©E¨8¡^Ñ4Ô4Ð4ð õ ˜d L°'¸8ÀVÑLÔLÐLr   N)r§   r¨   r©   rª   r«   r5  r8   rU  rM   r   r   r3  r3  $  s\   € € € € € ðð ð ð0ð 0ñ „[ð0ð#ð #ð #ð7Mð 7Mð 7Mð 7Mð 7Mr   r3  c                   ó   — e Zd Zd„ Zd„ ZdS )r@  c                 ó´   ‡— || _         || _        || _        ‰| _        t	          t
          j        ‰d¦  «        | _        || _        ˆfd„|D ¦   «         | _	        d S )Nr   c                 ó   •— g | ]}‰|z   ‘ŒS rM   rM   )r   r>  rR  s     €r   r`   z+GUFuncSchedule.__init__.<locals>.<listcomp>{  s   ø€ Ð<Ð<Ð<¨q˜h¨™lÐ<Ð<Ð<r   )
ÚparentrA  rM  rR  r   r<  r=  ÚloopnrS  Úoutput_shapes)r6   rY  rA  rM  rR  rS  s       ` r   r8   zGUFuncSchedule.__init__p  s]   ø€ ØˆŒàˆŒØˆŒà ˆŒÝ�HœL¨(°AÑ6Ô6ˆŒ
àˆŒà<Ð<Ð<Ð<°GÐ<Ñ<Ô<ˆÔÐÐr   c                 óp   ‡ — dd l }d}ˆ fd„|D ¦   «         }|                     t          |¦  «        ¦  «        S )Nr   )rA  rM  rR  rZ  rS  c                 ó4   •— g | ]}|t          ‰|¦  «        f‘ŒS rM   )rH   )r   rô   r6   s     €r   r`   z*GUFuncSchedule.__str__.<locals>.<listcomp>�  s(   ø€ Ð7Ð7Ð7¨A�1•g˜d AÑ&Ô&Ð'Ð7Ð7Ð7r   )ÚpprintÚpformatrå   )r6   r^  ÚattrsÚvaluess   `   r   Ú__str__zGUFuncSchedule.__str__}  sB   ø€ ØˆˆˆàCˆØ7Ð7Ð7Ð7°Ð7Ñ7Ô7ˆØ�~Š~�d 6™lœlÑ+Ô+Ð+r   N)r§   r¨   r©   r8   rb  rM   r   r   r@  r@  o  s2   € € € € € ð=ð =ð =ð,ð ,ð ,ð ,ð ,r   r@  c                   ó>   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	S )
ÚGeneralizedUFuncc                 ó0   — || _         || _        d| _        d S )Ni   @)rº   ÚengineÚmax_blocksize)r6   rº   rf  s      r   r8   zGeneralizedUFunc.__init__†  s   € Ø"ˆŒØˆŒØ$ˆÔÐÐr   c                 ó²  — |                       | j        j        | j        j        ||¦  «        }|                      |j        |j        ¦  «        \  }}}}|                     |¦  «         |                     ||¦  «        }| 	                    ¦   «         }	|  
                    ||	|¦  «        }
|                     ||j        |
¦  «         |                     |¦  «        S r   )Ú_call_stepsrf  r9  r  Ú	_scheduler)  r*  Úadjust_input_typesÚprepare_outputsÚprepare_inputsrp   Úlaunch_kernelrZ  Úpost_process_outputs)r6   r2   r—   Ú	callstepsr  rU  r  rØ   r*  r)  Ú
parameterss              r   Ú__call__zGeneralizedUFunc.__call__‹  sÍ   € Ø×$Ò$ T¤[¤_°d´kÔ6FØ%)¨3ñ0ô 0ˆ	à04·²ØÔ˜iÔ/ñ11ô 11Ñ-ˆ�(˜I và×$Ò$ XÑ.Ô.Ð.à×+Ò+¨H°iÑ@Ô@ˆØ×)Ò)Ñ+Ô+ˆØ—_’_ X¨v°wÑ?Ô?ˆ
à×Ò ¨¬¸
ÑCÔCÐCà×-Ò-¨gÑ6Ô6Ð6r   c                 óˆ  — d„ |D ¦   «         }| j                              |¦  «        }t          d„ |D ¦   «         ¦  «        }	 | j        |         \  }}n5# t          $ r( |                      |¦  «        }| j        |         \  }}Y nw xY wt          |j        |¦  «        D ]!\  }}	|	�||	j        k    rt          d¦  «        ‚Œ"||||fS )Nc                 ó   — g | ]	}|j         ‘Œ
S rM   r]   r_   s     r   r`   z.GeneralizedUFunc._schedule.<locals>.<listcomp>›  s   € Ð0Ð0Ð0 A˜œÐ0Ð0Ð0r   c              3   ó$   K  — | ]}|j         V — Œd S r   rX   rá   s     r   r   z-GeneralizedUFunc._schedule.<locals>.<genexpr>Ÿ  s$   è è € Ð1Ð1 Q˜œÐ1Ð1Ð1Ð1Ð1Ð1r   zoutput shape mismatch)
rf  rU  r   rº   r·   Ú_search_matching_signaturer!   r[  r^   r   )
r6   r)  ÚoutsÚinput_shapesrU  r  r  rØ   Úsched_shaper�   s
             r   rj  zGeneralizedUFunc._scheduleš  sø   € Ø0Ð0¨Ð0Ñ0Ô0ˆØ”;×'Ò'¨Ñ5Ô5ˆõ Ð1Ð1¨&Ð1Ñ1Ô1Ñ1Ô1ˆð	9Ø $¤¨xÔ 8ÑˆI�v�vøÝð 	9ð 	9ð 	9ð ×6Ò6°xÑ@Ô@ˆHà $¤¨xÔ 8ÑˆI�v�v�vð	9øøøõ !$ HÔ$:¸DÑ AÔ Að 	:ð 	:ÑˆK˜Øˆ ;°#´)Ò#;Ð#;Ý Ð!8Ñ9Ô9Ð9øà˜ 9¨fÐ4Ð4s   ÁA Á/BÂBc                 ó®   — | j                              ¦   «         D ]-}t          d„ t          ||¦  «        D ¦   «         ¦  «        r|c S Œ.t	          d¦  «        ‚)zÌ
        Given the input types in `idtypes`, return a compatible sequence of
        types that is defined in `kernelmap`.

        Note: Ordering is guaranteed by `kernelmap` being a OrderedDict
        c              3   óF   K  — | ]\  }}t          j        ||¦  «        V — Œd S r   )r@   Úcan_cast)r   rO   Údesireds      r   r   z>GeneralizedUFunc._search_matching_signature.<locals>.<genexpr>¹  sF   è è € ð =ð =Ù&�v˜wõ ”;˜v wÑ/Ô/ð =ð =ð =ð =ð =ð =r   zno matching signature)rº   rõ   rP   r!   rQ   )r6   ÚidtypesrÐ   s      r   rv  z+GeneralizedUFunc._search_matching_signature±  sx   € ð ”>×&Ò&Ñ(Ô(ð 	5ð 	5ˆCÝð =ð =Ý*-¨c°7Ñ*;Ô*;ð=ñ =ô =ñ =ô =ð à�
�
�
ðõ Ð3Ñ4Ô4Ð4r   c                 ó  — |j         dk    s
J d¦   «         ‚|j        sdn|j         }g }t          ||j        ¦  «        D ]h\  }}|s7|j        dk    r,|                      ||¦  «        }|                     |¦  «         Œ>|                     |                      |||¦  «        ¦  «         Œig }	t          ||j        ¦  «        D ]&\  }
}|	                      |
j	        |g|¢R Ž ¦  «         Œ't          |¦  «        t          |	¦  «        z   S )Nr   zzero looping dimensionr   )rZ  rR  r!   rA  ÚsizeÚ_broadcast_scalar_inputrB   Ú_broadcast_arrayrM  r”   r   )r6   rU  ÚparamsÚretvalsÚodimÚ	newparamsÚpÚcsr£   Ú
newretvalsÚretvalrO  s               r   rp   zGeneralizedUFunc._broadcast¿  s-  € ØŒ~ Ò!Ð!Ð!Ð#;Ñ!Ô!Ð!à Ô)Ð=ˆqˆq¨x¬~ˆØˆ	Ý˜ Ô!1Ñ2Ô2ð 	Eð 	E‰EˆAˆrØð E˜!œ& Aš+˜+à×5Ò5°a¸Ñ>Ô>�Ø× Ò  Ñ(Ô(Ð(Ð(ð × Ò  ×!6Ò!6°q¸$ÀÑ!CÔ!CÑDÔDÐDÐDàˆ
Ý! '¨8Ô+;Ñ<Ô<ð 	=ð 	=‰NˆF�FØ×Ò˜n˜fœn¨TÐ;°FÐ;Ð;Ð;Ñ<Ô<Ð<Ð<Ý�YÑÔ¥%¨
Ñ"3Ô"3Ñ3Ð3r   c                 ó  — |f|z   }|j         |k    r|S t          |j         ¦  «        t          |¦  «        k     rF|t          |j         ¦  «         d …         |j         k    s
J d¦   «         ‚|                      ||¦  «        S  |j        |Ž S )Nz+cannot add dim and reshape at the same time)r^   r    Ú_broadcast_add_axisr”   )r6   rI   ÚnewdimÚinnerdimÚnewshapes        r   r‚  z!GeneralizedUFunc._broadcast_arrayÒ  s•   € Ø�9˜xÑ'ˆàŒ9˜Ò Ð ØˆJõ �”‰^Œ^�c (™mœmÒ+Ð+Ø�S ¤™^œ^˜OÐ,Ð,Ô-°´Ò:Ð:Ð:Ø=ñ ;Ô:Ð:à×+Ò+¨C°Ñ:Ô:Ð:ð �3”; Ð)Ð)r   c                 ó    — t          d¦  «        ‚)Nzcannot add new axisr{   )r6   rI   r�  s      r   rŒ  z$GeneralizedUFunc._broadcast_add_axisâ  s   € Ý!Ð"7Ñ8Ô8Ð8r   c                 ó   — t           ‚r   r{   r}   s      r   r�  z(GeneralizedUFunc._broadcast_scalar_inputå  rÞ   r   N)r§   r¨   r©   r8   rr  rj  rv  rp   r‚  rŒ  r�  rM   r   r   rd  rd  …  sŒ   € € € € € ð%ð %ð %ð
7ð 7ð 7ð5ð 5ð 5ð.5ð 5ð 5ð4ð 4ð 4ð&*ð *ð *ð 9ð 9ð 9ð"ð "ð "ð "ð "r   rd  c                   ó¦   — e Zd ZdZg d¢Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Z	ed„ ¦   «         Z
d„ Zd	„ Zd
„ Zd„ Zd„ ZdS )ÚGUFuncCallStepsab  
    Implements memory management and kernel launch operations for GUFunc calls.

    One instance of this class is instantiated for each call, and the instance
    is specific to the arguments given to the GUFunc call.

    The base class implements the overall logic; subclasses provide
    target-specific implementations of individual functions.
    )r*  r)  Ú_copy_result_to_hostc                 ó   — dS )zImplement the kernel launchNrM   )r6   rØ   Únelemr2   s       r   rn  zGUFuncCallSteps.launch_kernelû  ó   € € € r   c                 ó   — dS )zb
        Return True if `obj` is a device array for this target, False
        otherwise.
        NrM   rw   s     r   r:   zGUFuncCallSteps.is_device_arrayÿ  r—  r   c                 ó   — dS )zƒ
        Return `obj` as a device array on this target.

        May return `obj` directly if it is already on the target.
        NrM   rw   s     r   r;   zGUFuncCallSteps.as_device_array  r—  r   c                 ó   — dS )zK
        Copy `hostary` to the device and return the device array.
        NrM   )r6   rˆ   s     r   r‡   zGUFuncCallSteps.to_device  r—  r   c                 ó   — dS )zc
        Allocate a new uninitialized device array with the given shape and
        dtype.
        NrM   )r6   r^   rG   s      r   r‘   z%GUFuncCallSteps.allocate_device_array  r—  r   c           
      óÜ  ‡ ‡— |                      d¦  «        }|€_t          |¦  «        |||z   fvrId„ }d ||¦  «        › d |||z   ¦  «        › d |t          |¦  «        ¦  «        › d�}t          |¦  «        ‚|�"t          |¦  «        |k    rt          d¦  «        ‚|g|z  }d}g ‰ _        |D ]a}	‰                      |	¦  «        r0‰ j                             ‰                      |	¦  «        ¦  «         d	}ŒG‰ j                             |	¦  «         Œbt          ˆ fd
„|D ¦   «         ¦  «         }
|
o|‰ _	        ˆ fd„Šˆfd„|D ¦   «         }|d |…         ‰ _
        ||d …         }|r	|‰ _        d S d S )Nr�   c                 ó   — | › dd| dk    z  › �S )Nz positional argumentr>  r   rM   )Úns    r   Úpos_argnz*GUFuncCallSteps.__init__.<locals>.pos_argn   s   € ØÐAÐA°¸¸Qº±ÐAÐAÐAr   zThis gufunc accepts z  (when providing input only) or z( (when providing input and output). Got ú.z<cannot specify argument 'out' as both positional and keywordTFc                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS rM   )r:   )r   r   r6   s     €r   r`   z,GUFuncCallSteps.__init__.<locals>.<listcomp>=  s'   ø€ Ð"IÐ"IÐ"I¸q 4×#7Ò#7¸Ñ#:Ô#:Ð"IÐ"IÐ"Ir   c                 ól   •— ‰                      | ¦  «        r‰j        }nt          j        } || ¦  «        S r   )r:   r;   r@   rC   )r   Úconvertr6   s     €r   Únormalize_argz/GUFuncCallSteps.__init__.<locals>.normalize_argF  s8   ø€ Ø×#Ò# AÑ&Ô&ð %ØÔ.��åœ*�à�7˜1‘:”:Ðr   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS rM   rM   )r   r   r¤  s     €r   r`   z,GUFuncCallSteps.__init__.<locals>.<listcomp>N  s#   ø€ Ð:Ð:Ð:°˜=˜=¨Ñ+Ô+Ð:Ð:Ð:r   )Úgetr    rQ   r   r*  r:   rB   r;   Úanyr”  r)  )r6   r9  r  r2   Úkwargsr*  rŸ  ÚmsgÚall_user_outputs_are_hostÚoutputÚall_host_arraysÚnormalized_argsÚunused_inputsr¤  s   `            @r   r8   zGUFuncCallSteps.__init__  s  øø€ Ø—*’*˜UÑ#Ô#ˆð ˆ?�s 4™yœy°°s¸T±zÐ0CÐCÐCðBð Bð BðD¨(¨(°3©-¬-ð Dð DØ%- X¨c°D©jÑ%9Ô%9ðDð Dà-5¨Xµc¸$±i´iÑ-@Ô-@ðDð Dð DˆCõ ˜C‘.”.Ð àÐ¥3 t¡9¤9¨s¢? ?Ýð +ñ ,ô ,ð ,ð �i $Ñ&ˆGð
 %)Ð!ØˆŒØð 	,ð 	,ˆFØ×#Ò# FÑ+Ô+ð ,Ø”×#Ò# D×$8Ò$8¸Ñ$@Ô$@ÑAÔAÐAØ,1Ð)Ð)à”×#Ò# FÑ+Ô+Ð+Ð+å!Ð"IÐ"IÐ"IÐ"IÀDÐ"IÑ"IÔ"IÑJÔJÐJˆð &5ð &?Ø%>ð 	Ô!ð
	ð 	ð 	ð 	ð 	ð ;Ð:Ð:Ð:°TÐ:Ñ:Ô:ˆØ% d s dÔ+ˆŒð (¨¨¨Ô-ˆØð 	)Ø(ˆDŒLˆLˆLð	)ð 	)r   c                 ó.  — t          t          || j        ¦  «        ¦  «        D ]q\  }\  }}||j        k    r^t	          |d¦  «        s1d                     t          |¦  «        ¦  «        }t          |¦  «        ‚|                     |¦  «        | j        |<   ŒrdS )zØ
        Attempt to cast the inputs to the required types if necessary
        and if they are not device arrays.

        Side effect: Only affects the elements of `inputs` that require
        a type cast.
        ÚastypezNcompatible signature is possible by casting but {0} does not support .astype()N)	r'   r!   r)  rG   Úhasattrr   ÚtyperQ   r°  )r6   r  r+   ÚityÚvalr©  s         r   rk  z"GUFuncCallSteps.adjust_input_typesV  s—   € õ '¥s¨8°T´[Ñ'AÔ'AÑBÔBð 	1ð 	1‰MˆA‰z��SØ�c”iÒÐÝ˜s HÑ-Ô-ð )ð<ß=CºVÅDÈÁIÄIÑ=NÔ=Nð å# C™.œ.Ð(à!$§¢¨C¡¤�”˜A‘øð	1ð 	1r   c                 ó¶   — g }t          |j        || j        ¦  «        D ]:\  }}}|�| j        r|                      ||¦  «        }|                     |¦  «         Œ;|S )zï
        Returns a list of output parameters that all reside on the target
        device.

        Outputs that were passed-in to the GUFunc are used if they reside on the
        device; other outputs are allocated as necessary.
        )r!   r[  r*  r”  r‘   rB   )r6   rU  r  r*  r^   rG   r«  s          r   rl  zGUFuncCallSteps.prepare_outputsg  sp   € ð ˆÝ$'¨Ô(>À	Ø(,¬ñ%6ô %6ð 	#ð 	#Ñ ˆE�5˜&àˆ~ Ô!:ˆ~Ø×3Ò3°E¸5ÑAÔA�Ø�NŠN˜6Ñ"Ô"Ð"Ð"àˆr   c                 ó6   ‡ ‡— ˆ fd„Šˆfd„‰ j         D ¦   «         S )zZ
        Returns a list of input parameters that all reside on the target device.
        c                 ób   •— ‰                      | ¦  «        r‰j        }n‰j        } || ¦  «        S r   )r:   r;   r‡   )Ú	parameterr£  r6   s     €r   Úensure_devicez5GUFuncCallSteps.prepare_inputs.<locals>.ensure_device|  s:   ø€ Ø×#Ò# IÑ.Ô.ð )ØÔ.��àœ.�à�7˜9Ñ%Ô%Ð%r   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS rM   rM   )r   r‡  r¹  s     €r   r`   z2GUFuncCallSteps.prepare_inputs.<locals>.<listcomp>„  s#   ø€ Ð6Ð6Ð6 Q��˜aÑ Ô Ð6Ð6Ð6r   )r)  )r6   r¹  s   `@r   rm  zGUFuncCallSteps.prepare_inputsx  s;   øø€ ð	&ð 	&ð 	&ð 	&ð 	&ð 7Ð6Ð6Ð6¨$¬+Ð6Ñ6Ô6Ð6r   c                 óÒ   ‡ — ‰ j         r"ˆ fd„t          |‰ j        ¦  «        D ¦   «         }n‰ j        d         �‰ j        }t          |¦  «        dk    r|d         S t	          |¦  «        S )a+  
        Moves the given output(s) to the host if necessary.

        Returns a single value (e.g. an array) if there was one output, or a
        tuple of arrays if there were multiple. Although this feels a little
        jarring, it is consistent with the behavior of GUFuncs in general.
        c                 óB   •— g | ]\  }}‰                      ||¦  «        ‘ŒS rM   )r†   )r   r«  Úself_outputr6   s      €r   r`   z8GUFuncCallSteps.post_process_outputs.<locals>.<listcomp>�  sA   ø€ ð Nð Nð NÙ.˜6 ;ð —|’| F¨KÑ8Ô8ð Nð Nð Nr   r   Nr   )r”  r!   r*  r    r   )r6   r*  s   ` r   ro  z$GUFuncCallSteps.post_process_outputs†  s‡   ø€ ð Ô$ð 	#ðNð Nð Nð NÝ25°g¸t¼|Ñ2LÔ2LðNñ Nô NˆGˆGàŒ\˜!Œ_Ð(Ø”lˆGåˆw‰<Œ<˜1ÒÐØ˜1”:Ðå˜‘>”>Ð!r   N)r§   r¨   r©   rª   Ú	__slots__r   rn  r:   r;   r‡   r‘   r8   rk  rl  rm  ro  rM   r   r   r“  r“  é  s  € € € € € ðð ðð ð €Ið ð*ð *ñ „^ð*ð ðð ñ „^ðð ðð ñ „^ðð ðð ñ „^ðð
 ðð ñ „^ðð9)ð 9)ð 9)ðv1ð 1ð 1ð"ð ð ð"7ð 7ð 7ð"ð "ð "ð "ð "r   r“  )Ú	metaclass)&rª   Úabcr   r   Úcollectionsr   r<  rŽ   Ú	functoolsr   Únumpyr@   Únumba.np.ufunc.ufuncbuilderr   r   Ú
numba.corer	   r
   Únumba.core.typingr   Únumba.np.ufunc.sigparser   r   r$   r-   Úobjectr/   r°   r²   rð   r  r  r   r-  r3  r@  rd  r“  rM   r   r   ú<module>rÉ     s¯  ððð ð (Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø #Ð #Ð #Ð #Ð #Ð #Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð à Ð Ð Ð à IÐ IÐ IÐ IÐ IÐ IÐ IÐ IØ &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3ðIð Ið Ið Hð Hð Hð"ð ð ð&Z"ð Z"ð Z"ð Z"ð Z"�Vñ Z"ô Z"ð Z"ðzð ð ð<"ð <"ð <"ð <"ð <"Ð'ñ <"ô <"ð <"ð~J"ð J"ð J"ð J"ð J"Ð-ñ J"ô J"ð J"ðZ<ð <ð <ðð ð ð&Jð Jð Jð
	ð 	ð 	ðHMð HMð HMð HMð HM�6ñ HMô HMð HMðV,ð ,ð ,ð ,ð ,�Vñ ,ô ,ð ,ð,a"ð a"ð a"ð a"ð a"�vñ a"ô a"ð a"ðHn"ð n"ð n"ð n"ð n" ð n"ñ n"ô n"ð n"ð n"ð n"r   