ó
    ýZh7x  ã                   óF  • S r SSKJrJr  SSKJr  SSKrSSKrSSKJ	r	  SSK
rSSKJrJr  SSKJrJr  SSKJr  SS	KJr  S
 rS rS r " S S\5      rS r " S S\5      r " S S\5      rS rS rS r S r! " S S\5      r" " S S\5      r# " S S\5      r$ " S S\S 9r%g)!zA
Implements custom ufunc dispatch mechanism for non-CPU devices.
é    )ÚABCMetaÚabstractmethod)ÚOrderedDictN)Úreduce)Ú_BaseUFuncBuilderÚparse_identity)ÚtypesÚsigutils)Ú	signature©Úparse_signaturec                 ód   • X:X  a  U $ U S:X  a  U$ US:X  a  U $ [        SR                  X5      5      e)ú-
Raises
------
ValueError if broadcast fails
é   zfailed to broadcast {0} and {1})Ú
ValueErrorÚformat)ÚaÚbs     Úe/home/gothic/public_html/Fooocus/fooocus_env/lib64/python3.13/site-packages/numba/cuda/deviceufunc.pyÚ_broadcast_axisr      s=   € ð 	ƒvØˆØ	
ˆa‹ØˆØ	
ˆa‹ØˆäÐ:×AÑAÀ!ÓGÓHÐHó    c                 ó:  • [        [        X/5      u  p[        U 5      [        U5      :  a  SU -   n [        U 5      [        U5      :  a  M  [        U 5      [        U5      :”  a  SU-   n[        U 5      [        U5      :”  a  M  [        S [        X5       5       5      $ )r   ©r   c              3   ó<   #   • U  H  u  p[        X5      v •  M     g 7f©N)r   )Ú.0r   r   s      r   Ú	<genexpr>Ú&_pairwise_broadcast.<locals>.<genexpr>1   s   é € ÐGÒ3F©4¨1” ×&Ð&Ò3Fùs   ‚)ÚmapÚtupleÚlenÚzip)Úshape1Úshape2s     r   Ú_pairwise_broadcastr%   #   s…   € ô œ Ð 0Ó1�N€Fä
ˆf‹+œ˜F›Ó
#Ø˜‘ˆô ˆf‹+œ˜F›Õ
#ô ˆf‹+œ˜F›Ó
#Ø˜‘ˆô ˆf‹+œ˜F›Õ
#ô ÑG´3°vÔ3FÓGÓGÐGr   c                  óº   • U (       d   eU S   nU SS n [        USS9 H  u  p4[        X5      nM     U$ ! [         a    [        SR                  W5      5      ef = f)r   r   r   N)Ústartz!failed to broadcast argument #{0})Ú	enumerater%   r   r   )Ú	shapelistÚresultÚothersÚiÚeachs        r   Ú_multi_broadcastr.   4   ss   € ö Ðˆ9à�q‰\€FØ�q�rˆ]€FðÜ  ¨qÔ1‰GˆAÜ(¨Ó6ŠFñ 2ð
 ˆøô ó HÜÐ<×CÑCÀAÓFÓGÐGðHús	   •5 µ%Ac                   ó�   • \ rS rSrSrSrSrS rS rS r	S r
S	 rS
 rS rS rS rS rS rS r\S 5       rS rS rS rS rSrg)ÚUFuncMechanisméG   z(
Prepare ufunc arguments for vectorize.
NFc                 óŽ   • Xl         X l        [        U R                  5      nS/U-  U l        / U l        SU l        S/U-  U l        g)zFNever used directly by user. Invoke by UFuncMechanism.call().
        N)ÚtypemapÚargsr!   ÚargtypesÚ	scalarposr   Úarrays)Úselfr3   r4   Únargss       r   Ú__init__ÚUFuncMechanism.__init__N   sC   € ð ŒØŒ	Ü�D—I‘I“ˆØ˜ ™ˆŒØˆŒØˆŒØ�f˜u‘nˆ�r   c                 óŠ  • [        U R                  5       Hª  u  pU R                  U5      (       a   U R                  U5      U R                  U'   M;  [        U[        [        [        [        R                  45      (       a  U R                  R                  U5        M‡  [        R                  " U5      U R                  U'   M¬     g)z!
Get all arguments in array form
N)r(   r4   Úis_device_arrayÚas_device_arrayr7   Ú
isinstanceÚintÚfloatÚcomplexÚnpÚnumberr6   ÚappendÚasarray)r8   r,   Úargs      r   Ú_fill_arraysÚUFuncMechanism._fill_arraysY   sƒ   € ô   §	¡	Ö*‰FˆAØ×#Ñ# C×(Ñ(Ø!%×!5Ñ!5°cÓ!:�—‘˜A“Ü˜C¤#¤u¬g´r·y±yÐ!A×BÑBà—‘×%Ñ% aÖ(ä!#§¢¨C£�—‘˜A“ò +r   c                 óÄ   • [        U R                  5       HG  u  pUc  M
  [        US5      nUc   [        R                  " U5      R
                  nX0R                  U'   MI     g)z
Get dtypes
NÚdtype)r(   r7   ÚgetattrrC   rF   rK   r5   )r8   r,   ÚaryrK   s       r   Ú_fill_argtypesÚUFuncMechanism._fill_argtypesf   sN   € ô   §¡Ö,‰FˆAØ‹Ü  WÓ-�Ø‘=ÜŸJšJ s›O×1Ñ1�EØ#(—‘˜aÓ ò -r   c                 ó˜  • / nU R                   (       a¦  U R                   H–  n/ n[        [        UU R                  5      5       HK  u  nu  pVUc-  [
        R                  " U R                  U   5      R                  nUR                  Xe:H  5        MM     [        U5      (       d  M…  UR                  U5        M˜     U(       dT  / nU R                   HB  n[        S [        X R                  5       5       5      nU(       d  M1  UR                  U5        MD     U(       d  [        S5      e[        U5      S:”  a  [        S5      eUS   U l        g)z,Resolve signature.
May have ambiguous case.
Nc              3   óD   #   • U  H  u  pUS L =(       d    X:H  v •  M     g 7fr   © )r   ÚformalÚactuals      r   r   Ú4UFuncMechanism._resolve_signature.<locals>.<genexpr>‰   s,   é € ð "Aâ"?ñ '5 fð #)¨D .×"D°FÑ4DÔ"Dâ"?ùs   ‚ 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   )r6   r3   r(   r"   r5   rC   rF   r4   rK   rE   ÚallÚ	TypeErrorr!   )r8   ÚmatchesÚ	formaltysÚ	match_mapr,   rS   rT   Úall_matchess           r   Ú_resolve_signatureÚ!UFuncMechanism._resolve_signatureq   s.  € ð ˆà�>�>à!Ÿ\œ\�	Ø�	Ü+4´S¸Ø9=¿¹ó6Hö ,IÑ'�AÑ'˜à‘~Ü!#§¢¨D¯I©I°a©LÓ!9×!?Ñ!?˜à×$Ñ$ VÑ%5Ö6ñ,Iô �y—>“>Ø—N‘N 9Ö-ñ *ö ØˆGØ!Ÿ\œ\�	Ü!ñ "Aä"% i·±Ô"?ó"Aó A�÷ �;Ø—N‘N 9Ö-ñ *ö Üð Dó Eð Eô ˆw‹<˜!ÓÜð Bó Cð Cð
   ™
ˆ�r   c                 óº   • U R                    H@  n[        R                  " U R                  U   /U R                  U   S9U R
                  U'   MB     U R
                  $ )z@Return the actual arguments
Casts scalar arguments to np.array.
©rK   )r6   rC   Úarrayr4   r5   r7   )r8   r,   s     r   Ú_get_actual_argsÚUFuncMechanism._get_actual_argsœ   sI   € ð —”ˆAÜŸXšX t§y¡y°¡| n¸D¿M¹MÈ!Ñ<LÑMˆD�K‰K˜‹Nñ  ð �{‰{Ðr   c                 ó¦  • U Vs/ s H  o"R                   PM     nn[        U6 n[        U5       GH  u  pVUR                   U:X  a  M  U R                  U5      (       a  U R	                  Xd5      X'   MC  [        [        U5      5       Vs/ s H+  nXvR                  :¼  d  UR                   U   XG   :w  d  M)  UPM-     nn[        U5      [        UR                   5      -
  n	S/U	-  [        UR                  5      -   n
U H  nSX§'   M	     [        R                  R                  R                  UUU
S9nU R                  U5      X'   GM     U$ s  snf s  snf )z)Perform numpy ufunc broadcasting
        r   )ÚshapeÚstrides)rd   r.   r(   r=   Úbroadcast_deviceÚranger!   ÚndimÚlistre   rC   ÚlibÚstride_tricksÚ
as_stridedÚforce_array_layout)r8   Úarysr   r)   rd   r,   rM   ÚaxÚ
ax_differsÚ
missingdimre   Ústrideds               r   Ú
_broadcastÚUFuncMechanism._broadcast¥   s@  € ñ '+Ó+¢d —W”W¡dˆ	Ð+Ü  )Ð,ˆä —o‰FˆAØ�y‰y˜EÓ!Ùð ×'Ñ'¨×,Ñ,Ø"×3Ñ3°CÓ?�D“Gô 05´S¸³ZÔ/@ó "AÒ/@¨Ø%'¯8©8£^Ø%(§Y¡Y¨r¡]°e±iÑ%?÷ #%Ñ/@�Jð "Aô "% U£¬c°#·)±)«nÑ!<�JØ ˜c JÑ.´°c·k±kÓ1BÑB�Gã(˜Ø&'˜›ñ )ô !Ÿf™f×2Ñ2×=Ñ=¸cØDIØFMð >ð O�Gð #×5Ñ5°gÓ>�D”Gñ/ &ð2 ˆùò9 ,ùò"As   …E	Â(EÂ4Ec                 ó¤   • U R                  5         U R                  5         U R                  5         U R                  5       nU R	                  U5      $ )zKPrepare and return the arguments for the ufunc.
Does not call to_device().
)rH   rN   r\   ra   rs   )r8   rn   s     r   Úget_argumentsÚUFuncMechanism.get_argumentsÆ   sE   € ð 	×ÑÔØ×ÑÔØ×ÑÔ!Ø×$Ñ$Ó&ˆØ�‰˜tÓ$Ð$r   c                 ó4   • U R                   U R                     $ )z)Returns (result_dtype, function)
        )r3   r5   ©r8   s    r   Úget_functionÚUFuncMechanism.get_functionÐ   s   € ð �|‰|˜DŸM™MÑ*Ð*r   c                 ó   • g)z2Is the `obj` a device array?
Override in subclass
FrR   ©r8   Úobjs     r   r=   ÚUFuncMechanism.is_device_arrayÕ   s   € ð r   c                 ó   • U$ )ziConvert the `obj` to a device array
Override in subclass

Default implementation is an identity function
rR   r}   s     r   r>   ÚUFuncMechanism.as_device_arrayÛ   s	   € ð ˆ
r   c                 ó   • [        S5      e)zDHandles ondevice broadcasting

Override in subclass to add support.
z'broadcasting on device is not supported©ÚNotImplementedError©r8   rM   rd   s      r   rf   ÚUFuncMechanism.broadcast_deviceã   s   € ô
 "Ð"KÓLÐLr   c                 ó   • U$ )zCEnsures array layout met device requirement.

Override in sublcass
rR   )r8   rM   s     r   rm   Ú!UFuncMechanism.force_array_layoutê   s	   € ð
 ˆ
r   c                 ón  ^^• UR                  SU R                  5      mUR                  SS5      nU(       a(  [        R                  " SSR	                  U5      -  5        U " X5      mTR                  5       nTR                  5       u  pVUS   R                  nUb'  TR                  U5      (       a  TR                  U5      nUU4S jnUS   R                  S:”  a  U V	s/ s H
  o˜" U	5      PM     nn	/ n
S	nU HO  n	TR                  U	5      (       a  U
R                  U	5        S
nM.  TR                  U	TS9nU
R                  U5        MQ     US   R                  nUco  TR                  XÕTS9nU
R                  U/5        TR                  XmS   TU
5        U(       a  UR!                  U5      $ UR#                  5       R!                  U5      $ TR                  U5      (       aS  UR                  S:”  a  U" U5      nUnU
R                  U/5        TR                  XmS   TU
5        UR!                  U5      $ UR                  U:X  d   eUR$                  U:X  d   eTR                  XÕTS9nU
R                  U/5        TR                  XmS   TU
5        UR#                  UTS9R!                  U5      $ s  sn	f )z1Perform the entire ufunc call mechanism.
        ÚstreamÚoutNzunrecognized keywords: %sú, r   c                 ó  >• TR                   (       a  [        e U R                  5       $ ! [         aL    TR                  U 5      (       d  e TR	                  U T5      R                  5       nTR                  UT5      s $ f = fr   )ÚSUPPORT_DEVICE_SLICINGr„   Úravelr=   Úto_hostÚ	to_device)r   ÚhostaryÚcrrŠ   s     €€r   Úattempt_ravelÚ*UFuncMechanism.call.<locals>.attempt_ravel  sr   ø€ Ø×(×(Ü)Ð)ð9à—w‘w“yÐ øÜ&ó 9à×)Ñ)¨!×,Ñ,Øð !Ÿj™j¨¨FÓ3×9Ñ9Ó;�GØŸ<™<¨°Ó8Ò8ð9ús   š* ªAB Á?B r   FT)rŠ   )ÚpopÚDEFAULT_STREAMÚwarningsÚwarnÚjoinrv   rz   rd   r=   r>   rh   rE   r‘   Úallocate_device_arrayÚextendÚlaunchÚreshapeÚcopy_to_hostrK   )Úclsr3   r4   Úkwsr‹   ÚrestyÚfuncÚoutshaper”   r   ÚdevarysÚ
any_deviceÚdev_ard   Údevoutr“   rŠ   s                  @@r   ÚcallÚUFuncMechanism.callñ   s‡  ù€ ð
 —‘˜ 3×#5Ñ#5Ó6ˆØ�g‰g�e˜TÓ"ˆæÜ�MŠMÐ5¸¿	¹	À#»ÑFÔGñ �ÓˆØ×ÑÓ!ˆØ—o‘oÓ'‰ˆà˜‘7—=‘=ˆð ‰?˜r×1Ñ1°#×6Ñ6Ø×$Ñ$ SÓ)ˆCö	9ð" �‰7�<‰<˜!ÓÙ.2Ó3ªd¨�M !Ö$©dˆDÐ3ð ˆØˆ
ÛˆAØ×!Ñ! !×$Ñ$Ø—‘˜qÔ!Ø!’
àŸ™ Q¨v˜Ð6�Ø—‘˜uÖ%ñ ð �Q‘—‘ˆØ‰;à×-Ñ-¨eÀ6Ð-ÐJˆFà�N‰N˜F˜8Ô$Ø�I‰I�d !™H f¨gÔ6æð —~‘~ hÓ/Ð/ð ×*Ñ*Ó,×4Ñ4°XÓ>Ð>à×Ñ ×$Ñ$ð �x‰x˜!‹|Ù# CÓ(�ØˆFØ�N‰N˜F˜8Ô$Ø�I‰I�d !™H f¨gÔ6Ø—>‘> (Ó+Ð+ð
 —9‘9 Ó%Ð%Ð%Ø—9‘9 Ó%Ð%Ð%Ø×-Ñ-¨eÀ6Ð-ÐJˆFØ�N‰N˜F˜8Ô$Ø�I‰I�d !™H f¨gÔ6Ø×&Ñ& s°6Ð&Ð:×BÑBÀ8ÓLÐLùòa 4s   Ã!J2c                 ó   • [         e)z2Implement to device transfer
Override in subclass
rƒ   )r8   r’   rŠ   s      r   r‘   ÚUFuncMechanism.to_deviceK  ó
   € ô "Ð!r   c                 ó   • [         e)z0Implement to host transfer
Override in subclass
rƒ   )r8   ÚdevaryrŠ   s      r   r�   ÚUFuncMechanism.to_hostQ  r­   r   c                 ó   • [         e)z2Implements device allocation
Override in subclass
rƒ   )r8   rd   rK   rŠ   s       r   r›   Ú$UFuncMechanism.allocate_device_arrayW  r­   r   c                 ó   • [         e)z;Implements device function invocation
Override in subclass
rƒ   )r8   r£   ÚcountrŠ   r4   s        r   r�   ÚUFuncMechanism.launch]  r­   r   )r4   r5   r7   r6   r   r3   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r—   rŽ   r:   rH   rN   r\   ra   rs   rv   rz   r=   r>   rf   rm   Úclassmethodr©   r‘   r�   r›   r�   Ú__static_attributes__rR   r   r   r0   r0   G   s€   † ñð €NØ"Ðò	%ò1ò	)ò)#òVòòB%ò+ò
òòMòð ñWMó ðWMòr"ò"ò"õ"r   r0   c                 ó–   • [        U [        R                  5      (       a  U R                  n [        R                  " [        U 5      5      $ r   )r?   r	   Ú
EnumMemberrK   rC   Ústr)Útys    r   Úto_dtyperÁ   d  s1   € Ü�"”e×&Ñ&×'Ñ'Ø�X‰XˆÜ�8Š8”C˜“GÓÐr   c                   ó\   • \ rS rSrSS0 4S jr\S 5       rSS jrS rS r	S	 r
S
 rS rSrg)ÚDeviceVectorizeij  NFc                 óî   • U(       a  [        S5      eU H8  nUS:X  a  [        R                  " S[        5        M&  SnUS-  n[	        Xe-  5      e   Xl        [        U5      U l        [        5       U l	        g )Núcaching is not supportedÚnopythonz+nopython kwarg for cuda target is redundantzUnrecognized options. z3cuda vectorize target does not support option: '%s')
rW   r˜   r™   ÚRuntimeWarningÚKeyErrorÚpy_funcr   Úidentityr   Ú	kernelmap)r8   r£   rÊ   ÚcacheÚtargetoptionsÚoptÚfmts          r   r:   ÚDeviceVectorize.__init__k  sp   € ÞÜÐ6Ó7Ð7Û ˆCØ�jÓ Ü—’ÐKÜ,ö.ð /�ØÐLÑL�Ü˜s™yÓ)Ð)ñ !ð ŒÜ& xÓ0ˆŒä$›ˆ�r   c                 ó   • U R                   $ r   ©rÉ   ry   s    r   ÚpyfuncÚDeviceVectorize.pyfunc{  ó   € à�|‰|Ðr   c           	      ó2  • [         R                  " U5      u  p#[        U/UQ76 nU R                  R                  nU R                  U R                  XE5      nU R                  U5      u  psU R                  U5      n[        [        R                  /U V	s/ s H  o™S S  PM	     sn	US S  /-   Q76 n[        Xh5        USU-     n
U R                  X¡5      n[        S UR                   5       5      n[        U5      nXÛ4U R                   [        U5      '   g s  sn	f )Nz__vectorized_%sc              3   ó8   #   • U  H  n[        U5      v •  M     g 7fr   )rÁ   )r   Úts     r   r   Ú&DeviceVectorize.add.<locals>.<genexpr>�  s   é € Ð=ª}¨!œ( 1Ÿ+˜+ª}ùó   ‚)r
   Únormalize_signaturer   rÓ   r¶   Ú_get_kernel_sourceÚ_kernel_templateÚ_compile_coreÚ_get_globalsr	   ÚvoidÚexecÚ_compile_kernelr    r4   rÁ   rË   )r8   Úsigr4   Úreturn_typeÚdevfnsigÚfuncnameÚkernelsourceÚcorefnÚglblr   ÚstagerÚkernelÚ	argdtypesÚresdtypes                 r   ÚaddÚDeviceVectorize.add  s  € ä$×8Ò8¸Ó=ÑˆÜ˜[Ð0¨4Ò0ˆà—;‘;×'Ñ'ˆØ×.Ñ.¨t×/DÑ/DØ/7óCˆà"×0Ñ0°Ó:ÑˆØ× Ñ  Ó(ˆÜœŸ
™
ÐO±TÓ&:²T°©£t±TÑ&:¸kÉ!¸nÐ=MÑ&MÒOˆÜˆ\Ô àÐ'¨(Ñ2Ñ3ˆØ×%Ñ% fÓ2ˆäÑ=¨x¯}ª}Ó=Ó=ˆ	Ü˜KÓ(ˆØ+3Ð+;ˆ�‰”u˜YÓ'Ò(ùò ';s   ÂD
c                 ó   • [         er   rƒ   ry   s    r   Úbuild_ufuncÚDeviceVectorize.build_ufunc“  ó   € Ü!Ð!r   c                 óò   • [        [        UR                  5      5       Vs/ s H  nSU-  PM
     nn[        USR	                  U5      SR	                  S U 5       5      S9nUR
                  " S0 UD6$ s  snf )Nza%drŒ   c              3   ó,   #   • U  H
  nS U-  v •  M     g7f)z%s[__tid__]NrR   ©r   r,   s     r   r   Ú5DeviceVectorize._get_kernel_source.<locals>.<genexpr>š  s   é € Ð&GÂ$¸Q }°qÖ'8Â$ùs   ‚)Únamer4   ÚargitemsrR   )rg   r!   r4   Údictrš   r   )r8   Útemplaterã   ræ   r,   r4   Úfmtss          r   rÜ   Ú"DeviceVectorize._get_kernel_source–  sl   € Ü#(¬¨S¯X©X«Ô#7Ó8Ò#7˜a�˜”	Ñ#7ˆÐ8Ü˜ØŸ™ 4›Ø!ŸY™YÑ&GÁ$Ó&GÓGñIˆð �ŠÑ& Ñ&Ð&ùò	 9s   ¡A4c                 ó   • [         er   rƒ   ©r8   rã   s     r   rÞ   ÚDeviceVectorize._compile_core�  ró   r   c                 ó   • [         er   rƒ   )r8   rè   s     r   rß   ÚDeviceVectorize._get_globals   ró   r   c                 ó   • [         er   rƒ   ©r8   Úfnobjrã   s      r   râ   ÚDeviceVectorize._compile_kernel£  ró   r   )rÊ   rË   rÉ   r   )r¶   r·   r¸   r¹   r:   ÚpropertyrÓ   rî   rñ   rÜ   rÞ   rß   râ   r¼   rR   r   r   rÃ   rÃ   j  s@   † Ø&*°%Àrô 'ð  ñó ðô<ò("ò'ò"ò"õ"r   rÃ   c                   óL   • \ rS rSrSS0 S4S jr\S 5       rSS jrS rS	 r	S
r
g)ÚDeviceGUFuncVectorizei§  NFrR   c                 óì  • U(       a  [        S5      eU(       a  [        S5      eUR                  SS5      (       d  [        S5      eU(       aU  SR                  UR                  5        Vs/ s H  n[	        U5      PM     sn5      nSn	[        U	R                  U5      5      eXl        [        U5      U l        X l	        [        U R                  5      u  U l        U l        [        5       U l        g s  snf )NrÅ   zwritable_args are not supportedrÆ   Tznopython flag must be TruerŒ   z3The following target options are not supported: {0})rW   r–   rš   ÚkeysÚreprr   rÉ   r   rÊ   r   r   ÚinputsigÚ	outputsigr   rË   )
r8   r£   rã   rÊ   rÌ   rÍ   Úwritable_argsÚkÚoptsrÏ   s
             r   r:   ÚDeviceGUFuncVectorize.__init__¨  sÇ   € æÜÐ6Ó7Ð7ÞÜÐ=Ó>Ð>ð × Ñ  ¨T×2Ñ2ÜÐ8Ó9Ð9æØ—9‘9¨}×/AÑ/AÔ/CÓDÒ/C¨!œd 1žgÑ/CÑDÓEˆDØGˆCÜ˜CŸJ™J tÓ,Ó-Ð-àŒÜ& xÓ0ˆŒØŒÜ(7¸¿¹Ó(GÑ%ˆŒ�t”~ô %›ˆ�ùò Es   Á+C1c                 ó   • U R                   $ r   rÒ   ry   s    r   rÓ   ÚDeviceGUFuncVectorize.pyfuncÀ  rÕ   r   c                 ó@  • U R                    Vs/ s H  n[        U5      PM     nnU R                   Vs/ s H  n[        U5      PM     nn[        R                  " U5      u  pVU[
        R                  S 4;   nU(       d  [        SU SU S35      eU R                  R                  n[        U R                  UXHU5      n	U R                  U5      n
[        Xš5        U
SR                  US9   n[        [!        XSU-   5      5      nU R#                  U[%        U5      S9n[        U5      nU Vs/ s H,  n[&        R(                  " [+        UR(                  5      5      PM.     nn[%        US U*  5      n[%        UU* S  5      nUU4U R,                  U'   g s  snf s  snf s  snf )Nz7guvectorized functions cannot return values: signature z specifies z return typez__gufunc_{name})rø   )rã   )r  r!   r  r
   rÛ   r	   ÚnonerW   rÉ   r¶   Úexpand_gufunc_templaterÝ   rß   rá   r   ri   Ú_determine_gufunc_outer_typesrâ   r    rC   rK   r¿   rË   )r8   rã   ÚxÚindimsÚoutdimsr4   rä   Úvalid_return_typeræ   ÚsrcÚglblsr  Úoutertysrë   ÚnoutrØ   ÚdtypesÚindtypesÚ	outdtypess                      r   rî   ÚDeviceGUFuncVectorize.addÄ  s‹  € Ø"&§-¢-Ó0¢-˜Q”#�a–&¡-ˆÐ0Ø#'§>¢>Ó2¢>˜a”3�q–6¡>ˆÐ2Ü$×8Ò8¸Ó=Ñˆð (¬E¯J©J¸Ð+=Ñ=ÐÞ Üð )Ø),¨¨[¸¸ð F#ð#ó $ð $ð —<‘<×(Ñ(ˆÜ$ T×%:Ñ%:¸FØ%,¸ó>ˆð ×!Ñ! #Ó&ˆäˆSÔØÐ'×.Ñ.°HÐ.Ð=Ñ>ˆäÔ5°dÀWÑ<LÓMÓNˆØ×%Ñ% e´°x³Ð%ÐAˆä�7‹|ˆÙ2:Ó;²(¨Q”"—(’(œ3˜qŸw™w›<Ö(±(ˆÐ;Ü˜  $ ˜Ó(ˆÜ˜& $  ˜.Ó)ˆ	à#,¨fÐ#4ˆ�‰�xÒ ùò; 1ùÚ2ùò0 <s   �F´FÄ,3Fc                 ó   • [         er   rƒ   r  s      r   râ   Ú%DeviceGUFuncVectorize._compile_kernelä  ró   r   c                 ó   • [         er   rƒ   rÿ   s     r   rß   Ú"DeviceGUFuncVectorize._get_globalsç  ró   r   )rÊ   r  rË   r  rÉ   r   r   )r¶   r·   r¸   r¹   r:   r  rÓ   rî   râ   rß   r¼   rR   r   r   r	  r	  §  s5   † Ø+/°uÈBØ!ô'ð0 ñó ðô5ò@"õ"r   r	  c              #   óð   #   • [        X5       Hc  u  p#[        U[        R                  5      (       a  UR	                  US-   S9v •  M:  US:”  a  [        S5      e[        R                  " USSS9v •  Me     g 7f)Nr   )rh   r   z,gufunc signature mismatch: ndim>0 for scalarÚA)rK   rh   Úlayout)r"   r?   r	   ÚArrayÚcopyr   )ÚargtysÚdimsÚatÚnds       r   r  r  ë  sb   é € Ü�fÖ#‰ˆÜ�bœ%Ÿ+™+×&Ñ&Ø—'‘'˜r A™v�'Ð&Ô&à�A‹vÜ Ð!OÓPÐPÜ—+’+ B¨Q°sÑ;Ô;ò $ùs   ‚A4A6c           
      ór  • X-   n[        [        U5      5       Vs/ s H  nSR                  U5      PM     nnSR                  SR                  U Vs/ s H  nSR                  U5      PM     sn5      5      n	[	        XqU5       V
VVs/ s H  u  p«n[        X«U5      PM     nnn
n[	        U[        U5      S UU[        U5      S 5       V
VVs/ s H  u  p«n[        X«U5      PM     nnn
nXÞ-   nU R                  USR                  U5      U	SR                  U5      S9nU$ s  snf s  snf s  snnn
f s  snnn
f )z"Expand gufunc source template
    zarg{0}zmin({0})rŒ   z{0}.shape[0]N)rø   r4   Ú
checkedargrù   )rg   r!   r   rš   r"   Ú_gen_src_for_indexing)rû   r  r  ræ   r5   Úargdimsr,   Úargnamesr   r3  ÚarefÚadimsÚatypeÚinputsÚoutputsrù   r  s                    r   r  r  õ  sa  € ð Ñ€GÜ,1´#°g³,Ô,?Ó@Ò,? q�—‘ Ö"Ñ,?€HÐ@Ø×"Ñ" 4§9¡9Ù7?ó.AÚ7?°!ð /=×.CÑ.CÀAÖ.FÙ7?ñ.Aó $Bó C€Jô ),¨H¸hÔ(GõIÚ(GÑ$�$˜uô $ D°Ö7Ù(Gð ò Iô *-¨X´c¸&³k°lÐ-CÀWØ-5´c¸&³k°lÐ-Cô*EõFò*EÑ%�4 ô % T°%Ö8ñ*Eð ò Fð Ñ€HØ
�/‰/˜x¨d¯i©i¸Ó.AØ%/Ø#'§9¡9¨XÓ#6ð ð 8€Cð €Jùò Aùò.AùôIùôFs   ›D!ÁD&ÂD+ÃD2c                 ó4   • SR                  U [        X5      S9$ )Nz{aref}[{sliced}])r7  Úsliced)r   Ú_gen_src_index)r7  r8  r9  s      r   r4  r4    s&   € Ø×$Ñ$¨$Ü,:¸5Ó,Hð %ð Jð Jr   c                 ó¨   • U S:”  a  SR                  S/S/U -  -   5      $ [        U[        R                  5      (       a  UR                  S-
  U :X  a  gg)Nr   Ú,Ú__tid__Ú:r   z__tid__:(__tid__ + 1))rš   r?   r	   r,  rh   )r8  r9  s     r   r>  r>    sM   € ØˆqƒyØ�x‰x˜˜ s e¨e¡mÑ3Ó4Ð4Ü	�Eœ5Ÿ;™;×	'Ñ	'¨E¯J©J¸©N¸eÓ,Cð 'àr   c                   ó4   • \ rS rSrSr\S 5       rS rS rSr	g)ÚGUFuncEnginei  zRDetermine how to broadcast and execute a gufunc
base on input shape and signature
c                 ó   • U " [        U5      6 $ r   r   )r    r   s     r   Úfrom_signatureÚGUFuncEngine.from_signature  s   € á”O IÓ.Ð/Ð/r   c                 ó„   • Xl         X l        [        U R                   5      U l        [        U R                  5      U l        g r   )ÚsinÚsoutr!   Úninr   )r8   r  r  s      r   r:   ÚGUFuncEngine.__init__"  s*   € àŒØŒ	ä�t—x‘x“=ˆŒÜ˜Ÿ	™	“Nˆ�	r   c                 ó
  • [        U5      U R                  :w  a  [        S5      e0 n/ n/ n[        [	        XR
                  5      5       HÀ  u  nu  pgUS-  n[        U5      n[        U5      U:  a  Sn	[        X•4-  5      eU(       a  Xh* S  n
US U*  nOSn
Un[        [	        X§5      5       H8  u  nu  pÞU[        U5      -  nXâ;   a  X.   U:w  a  Sn	[        X•U4-  5      eXÒU'   M:     UR                  U5        UR                  U
5        MÂ     / nU R                   H;  n/ nU H  nUR                  X.   5        M     UR                  [        U5      5        M=     U Vs/ s H  n[        [        R                  US5      PM      nn[        R                  " U5      nUU   nS/U R                  -  n[        U5       H3  u  nnUU:w  d  M  US:X  d  US:X  a  SUU'   M!  S	n	[        U	US-   4-  5      e   [        XUUU5      $ s  snf )
Nz invalid number of input argumentr   z%arg #%d: insufficient inner dimensionrR   z$arg #%d: shape[%d] mismatch argumentFr   Tz!arg #%d: outer dimension mismatch)r!   rK  rW   r(   r"   rI  r   rE   rJ  r    r   ÚoperatorÚmulrC   ÚargmaxÚGUFuncSchedule)r8   ÚishapesÚ	symbolmapÚouter_shapesÚinner_shapesÚargnrd   ÚsymbolsÚ
inner_ndimrÏ   Úinner_shapeÚouter_shapeÚaxisÚdimÚsymÚoshapesÚoutsigÚoshapeÚsÚsizesÚ	largest_iÚloopdimsÚpinnedr,   Úds                            r   ÚscheduleÚGUFuncEngine.schedule*  s  € Üˆw‹<˜4Ÿ8™8Ó#ÜÐ>Ó?Ð?ð ˆ	ØˆØˆä&/´°G¿X¹XÓ0FÖ&GÑ"ˆDÑ"�5Ø�A‰IˆDÜ˜W›ˆJÜ�5‹z˜JÓ&Ø=�Ü   w¡Ó/Ð/ÞØ# K LÐ1�Ø# L j [Ð1‘à �Ø#�ä$-¬c°+Ó.GÖ$HÑ �‘j�sØœ˜KÓ(Ñ(�ØÓ#Ø ‘~¨Ó,ØD˜Ü(¨°d¨|Ñ);Ó<Ð<Ø!$˜#“ñ %Ið ×Ñ Ô,Ø×Ñ Ö,ñ- 'Hð2 ˆØ—i”iˆFØˆFÛ�Ø—‘˜i™nÖ-ñ à�N‰Nœ5 ›=Ö)ñ	  ñ 6BÓB²\°”œŸ™ a¨Ö+±\ˆÐBÜ—I’I˜eÓ$ˆ	Ø 	Ñ*ˆà�˜4Ÿ8™8Ñ#ˆÜ˜lÖ+‰DˆAˆqØ�H�}Ø˜“9  R£Ø $�F˜1“Ià=�CÜ$ S¨A°©E¨8¡^Ó4Ð4ñ ,ô ˜d°'¸8ÀVÓLÐLùò Cs   Å%H )rK  r   rI  rJ  N)
r¶   r·   r¸   r¹   rº   r»   rF  r:   rg  r¼   rR   r   r   rD  rD    s&   † ñð ñ0ó ð0ò#õ7Mr   rD  c                   ó    • \ rS rSrS rS rSrg)rQ  id  c                 ó¾   • Xl         X l        X0l        X@l        [	        [
        R                  US5      U l        XPl        U Vs/ s H  odU-   PM	     snU l	        g s  snf )Nr   )
ÚparentrR  r^  rd  r   rN  rO  Úloopnre  Úoutput_shapes)r8   rk  rR  r^  rd  re  ra  s          r   r:   ÚGUFuncSchedule.__init__e  sK   € ØŒàŒØŒà ŒÜœHŸL™L¨(°AÓ6ˆŒ
àŒá4;Ó<²G¨q¨œl±GÑ<ˆÕùÒ<s   ÁAc                 ó„   • SS K nSnU Vs/ s H  o3[        X5      4PM     nnUR                  [        U5      5      $ s  snf )Nr   )rR  r^  rd  rl  re  )ÚpprintrL   Úpformatrú   )r8   rp  Úattrsr  Úvaluess        r   Ú__str__ÚGUFuncSchedule.__str__r  s>   € ÛàCˆÙ16Ó7²¨A”g˜dÓ&Ó'±ˆÐ7Ø�~‰~œd 6›lÓ+Ð+ùò 8s   ‹=)rR  rd  rl  r^  rm  rk  re  N)r¶   r·   r¸   r¹   r:   rt  r¼   rR   r   r   rQ  rQ  d  s   † ò=õ,r   rQ  c                   óD   • \ rS rSrS rS rS rS rS rS r	S r
S	 rS
rg)ÚGeneralizedUFunciz  c                 ó*   • Xl         X l        SU l        g )Ni   @)rË   ÚengineÚmax_blocksize)r8   rË   ry  s      r   r:   ÚGeneralizedUFunc.__init__{  s   € Ø"ŒØŒØ$ˆÕr   c                 ó¬  • U R                  U R                  R                  U R                  R                  X5      nU R	                  UR
                  UR                  5      u  pEpgUR                  U5        UR                  XV5      nUR                  5       n	U R                  XYU5      n
UR                  XuR                  U
5        UR                  U5      $ r   )Ú_call_stepsry  rK  r   Ú	_scheduler:  r;  Úadjust_input_typesÚprepare_outputsÚprepare_inputsrs   Úlaunch_kernelrl  Úpost_process_outputs)r8   r4   r¡   Ú	callstepsr"  rg  r#  rë   r;  r:  Ú
parameterss              r   Ú__call__ÚGeneralizedUFunc.__call__€  s°   € Ø×$Ñ$ T§[¡[§_¡_°d·k±k×6FÑ6FØ%)ó0ˆ	à04·±Ø×Ñ˜i×/Ñ/ó11Ñ-ˆ˜Ià×$Ñ$ XÔ.à×+Ñ+¨HÓ@ˆØ×)Ñ)Ó+ˆØ—_‘_ X°wÓ?ˆ
à×Ñ ¯©¸
ÔCà×-Ñ-¨gÓ6Ð6r   c                 ó¨  • U Vs/ s H  o3R                   PM     nnU R                  R                  U5      n[        S U 5       5      n U R                  U   u  px[        UR                  U5       H$  u  pšU
c  M
  XšR                   :w  d  M  [        S5      e   XeXx4$ s  snf ! [
         a%    U R                  U5      nU R                  U   u  px Nuf = f)Nc              3   ó8   #   • U  H  oR                   v •  M     g 7fr   r_   rö   s     r   r   Ú-GeneralizedUFunc._schedule.<locals>.<genexpr>”  s   é € Ð1ª& QŸžª&ùrÚ   zoutput shape mismatch)
rd   ry  rg  r    rË   rÈ   Ú_search_matching_signaturer"   rm  r   )r8   r:  Úoutsr   Úinput_shapesrg  r"  r#  rë   Úsched_shaper‹   s              r   r~  ÚGeneralizedUFunc._schedule�  sÓ   € Ù)/Ó0ª AŸœ©ˆÐ0Ø—;‘;×'Ñ'¨Ó5ˆô Ñ1©&Ó1Ó1ˆð	9Ø $§¡¨xÑ 8ÑˆIô !$ H×$:Ñ$:¸DÖ AÑˆKØ‹ ;·)±)Õ#;Ü Ð!8Ó9Ð9ñ !Bð  9Ð4Ð4ùò) 1øô ó 	9ð ×6Ñ6°xÓ@ˆHà $§¡¨xÑ 8ÑˆI‘vð	9ús   …BÁ
B" Â",CÃCc                 ó¢   • U R                   R                  5        H'  n[        S [        X!5       5       5      (       d  M%  Us  $    [	        S5      e)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   óR   #   • U  H  u  p[         R                  " X5      v •  M     g 7fr   )rC   Úcan_cast)r   rT   Údesireds      r   r   Ú>GeneralizedUFunc._search_matching_signature.<locals>.<genexpr>®  s%   é € ð =Ú*;‘�vô —;’;˜v×/Ð/Ú*;ùs   ‚%'zno matching signature)rË   r  rV   r"   rW   )r8   Úidtypesrã   s      r   r‹  Ú+GeneralizedUFunc._search_matching_signature¦  sM   € ð —>‘>×&Ñ&Ö(ˆCÜñ =Ü*-¨cÔ*;ó=÷ =ó =à’
ñ )ô
 Ð3Ó4Ð4r   c                 ó  • UR                   S:”  d   S5       eUR                  (       d  SOUR                   n/ n[        X!R                  5       Ha  u  pgU(       d4  UR                  S:X  a$  U R                  Xd5      nUR                  U5        M@  UR                  U R                  XdU5      5        Mc     / n	[        X1R                  5       H'  u  p«U	R                  U
R                  " U/UQ76 5        M)     [        U5      [        U	5      -   $ )Nr   zzero looping dimensionr   )rl  rd  r"   rR  ÚsizeÚ_broadcast_scalar_inputrE   Ú_broadcast_arrayr^  rž   r    )r8   rg  ÚparamsÚretvalsÚodimÚ	newparamsÚpÚcsr¯   Ú
newretvalsÚretvalr`  s               r   rs   ÚGeneralizedUFunc._broadcast´  sà   € Ø�~‰~ Ó!Ð;Ð#;Ó;Ð!à ×)×)‰q¨x¯~©~ˆØˆ	Ü˜×!1Ñ!1Ö2‰EˆAÞ˜!Ÿ&™& A›+à×5Ñ5°aÓ>�Ø× Ñ  Ö(ð × Ñ  ×!6Ñ!6°qÀÓ!CÖDñ 3ð ˆ
Ü! '×+;Ñ+;Ö<‰NˆFØ×Ñ˜fŸnšn¨TÐ;°FÒ;Ö<ñ =ä�YÓ¤%¨
Ó"3Ñ3Ð3r   c                 ó  • U4U-   nUR                   U:X  a  U$ [        UR                   5      [        U5      :  a?  U[        UR                   5      * S  UR                   :X  d   S5       eU R                  X5      $ UR                  " U6 $ )Nz+cannot add dim and reshape at the same time)rd   r!   Ú_broadcast_add_axisrž   )r8   rM   ÚnewdimÚinnerdimÚnewshapes        r   rš  Ú!GeneralizedUFunc._broadcast_arrayÇ  s…   € Ø�9˜xÑ'ˆà�9‰9˜Ó ØˆJô �—‘‹^œc (›mÓ+ØœS §¡›^˜OÐ,Ð-°·±Ó:ð >Ø=ó>Ð:à×+Ñ+¨CÓ:Ð:ð —;’; Ð)Ð)r   c                 ó   • [        S5      e)Nzcannot add new axisrƒ   )r8   rM   r¨  s      r   r¥  Ú$GeneralizedUFunc._broadcast_add_axis×  s   € Ü!Ð"7Ó8Ð8r   c                 ó   • [         er   rƒ   r…   s      r   r™  Ú(GeneralizedUFunc._broadcast_scalar_inputÚ  ró   r   )ry  rË   rz  N)r¶   r·   r¸   r¹   r:   r†  r~  r‹  rs   rš  r¥  r™  r¼   rR   r   r   rw  rw  z  s*   † ò%ò
7ò5ò.5ò4ò&*ò 9õ"r   rw  c                   óŽ   • \ rS rSrSr/ SQr\S 5       r\S 5       r\S 5       r	\S 5       r
\S 5       rS	 rS
 rS rS rS rSrg)ÚGUFuncCallStepsiÞ  aJ  
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                 ó   • g)zImplement the kernel launchNrR   )r8   rë   Únelemr4   s       r   r‚  ÚGUFuncCallSteps.launch_kernelð  ó   � r   c                 ó   • g)zJ
Return True if `obj` is a device array for this target, False
otherwise.
NrR   r}   s     r   r=   ÚGUFuncCallSteps.is_device_arrayô  r´  r   c                 ó   • g)zk
Return `obj` as a device array on this target.

May return `obj` directly if it is already on the target.
NrR   r}   s     r   r>   ÚGUFuncCallSteps.as_device_arrayû  r´  r   c                 ó   • g)z;
Copy `hostary` to the device and return the device array.
NrR   )r8   r’   s     r   r‘   ÚGUFuncCallSteps.to_device  r´  r   c                 ó   • g)zK
Allocate a new uninitialized device array with the given shape and
dtype.
NrR   )r8   rd   rK   s      r   r›   Ú%GUFuncCallSteps.allocate_device_array	  r´  r   c           
      óò  ^ • UR                  S5      nUcJ  [        U5      XU-   4;  a7  S nSU" U5       SU" X-   5       SU" [        U5      5       S3n[        U5      eUb  [        U5      U:”  a  [        S5      eU/U-  nSn/ T l        U Hb  n	T R                  U	5      (       a.  T R                  R                  T R                  U	5      5        S	nMG  T R                  R                  U	5        Md     [        U V
s/ s H  n
T R                  U
5      PM     sn
5      (       + nU=(       a    UT l	        U 4S
 jnU V
s/ s H
  o¬" U
5      PM     nn
US U T l
        XÑS  nU(       a  UT l        g g s  sn
f s  sn
f )Nr‹   c                 ó   • U  SSU S:g  -   3$ )Nz positional argumentra  r   rR   )Úns    r   Úpos_argnÚ*GUFuncCallSteps.__init__.<locals>.pos_argn  s   € Ø˜Ð0°¸¸Q¹±Ð0@Ð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                 óz   >• TR                  U 5      (       a  TR                  nO[        R                  nU" U 5      $ r   )r=   r>   rC   rF   )r   Úconvertr8   s     €r   Únormalize_argÚ/GUFuncCallSteps.__init__.<locals>.normalize_arg;  s2   ø€ Ø×#Ñ# A×&Ñ&Ø×.Ñ.‘äŸ*™*�á˜1“:Ðr   )Úgetr!   rW   r   r;  r=   rE   r>   Úanyr°  r:  )r8   rK  r   r4   Úkwargsr;  rÀ  ÚmsgÚall_user_outputs_are_hostÚoutputr   Úall_host_arraysrÅ  Únormalized_argsÚunused_inputss   `              r   r:   ÚGUFuncCallSteps.__init__  sš  ø€ Ø—*‘*˜UÓ#ˆð ‰?œs 4›y°¸T±zÐ0CÓCòBð *©(°3«-¨ð 9%Ù%-¨c©jÓ%9Ð$:ð ;-Ù-5´c¸$³iÓ-@Ð,AÀðDˆCô ˜C“.Ð àÑ¤3 t£9¨s£?Üð +ó ,ð ,ð �i $Ñ&ˆGð
 %)Ð!ØˆŒÛˆFØ×#Ñ# F×+Ñ+Ø—‘×#Ñ# D×$8Ñ$8¸Ó$@ÔAØ,1Ò)à—‘×#Ñ# FÖ+ñ ô "ÁDÓ"IÂD¸q 4×#7Ñ#7¸Ö#:ÁDÑ"IÓJÔJˆð &5÷ &?Ø%>ð 	Ô!õ
	ñ 6:Ó:²T°˜=¨Ö+±TˆÐ:Ø% d sÐ+ˆŒð (¨Ð-ˆÞØ(ˆD�Lð ùò- #Jùò" ;s   Ã=E/Ä>E4c                 ó"  • [        [        XR                  5      5       Hm  u  nu  p4X4R                  :w  d  M  [	        US5      (       d%  SR                  [        U5      5      n[        U5      eUR                  U5      U R                  U'   Mo     g)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:  rK   Úhasattrr   ÚtyperW   rÒ  )r8   r"  r,   ÚityÚvalrÊ  s         r   r  Ú"GUFuncCallSteps.adjust_input_typesK  sq   € ô '¤s¨8·[±[Ó'AÖB‰MˆA‰z�Ø—i‘iÕÜ˜s H×-Ñ-ð<ß=C¹VÄDÈÃIÓ=Nð ä# C›.Ð(à!$§¡¨C£�—‘˜A“ò Cr   c                 óÌ   • / n[        UR                  UU R                  5       H<  u  pEnUb  U R                  (       a  U R	                  XE5      nUR                  U5        M>     U$ )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"   rm  r;  r°  r›   rE   )r8   rg  r#  r;  rd   rK   rÌ  s          r   r€  ÚGUFuncCallSteps.prepare_outputs\  s^   € ð ˆÜ$'¨×(>Ñ(>À	Ø(,¯©ö%6Ñ ˆE˜&à‰~ ×!:×!:Ø×3Ñ3°EÓA�Ø�N‰N˜6Ö"ñ	%6ð ˆr   c                 ó^   ^ • U 4S jnT R                    Vs/ s H
  o!" U5      PM     sn$ s  snf )zJ
Returns a list of input parameters that all reside on the target device.
c                 ór   >• TR                  U 5      (       a  TR                  nOTR                  nU" U 5      $ r   )r=   r>   r‘   )Ú	parameterrÄ  r8   s     €r   Úensure_deviceÚ5GUFuncCallSteps.prepare_inputs.<locals>.ensure_deviceq  s3   ø€ Ø×#Ñ# I×.Ñ.Ø×.Ñ.‘àŸ.™.�á˜9Ó%Ð%r   )r:  )r8   rÝ  rŸ  s   `  r   r�  ÚGUFuncCallSteps.prepare_inputsm  s+   ø€ õ	&ð +/¯+ª+Ó6ª+ Q�˜aÖ ©+Ñ6Ð6ùÒ6s   –*c                 ó  • U R                   (       a9  [        XR                  5       VVs/ s H  u  p#U R                  X#5      PM     nnnOU R                  S   b  U R                  n[	        U5      S:X  a  US   $ [        U5      $ s  snnf )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.
r   r   )r°  r"   r;  r�   r!   r    )r8   r;  rÌ  Úself_outputs       r   rƒ  Ú$GUFuncCallSteps.post_process_outputs{  sƒ   € ð ×$×$ä25°g¿|¹|Ô2LôNÚ2LÑ.˜6ð —|‘| FÖ8Ù2Lð ñ NˆGà�\‰\˜!‰_Ñ(Ø—l‘lˆGäˆw‹<˜1ÓØ˜1‘:Ðä˜“>Ð!ùóNs   ªB)r°  r:  r;  N)r¶   r·   r¸   r¹   rº   Ú	__slots__r   r‚  r=   r>   r‘   r›   r:   r  r€  r�  rƒ  r¼   rR   r   r   r¯  r¯  Þ  sŒ   † ñò€Ið ñ*ó ð*ð ñó ðð ñó ðð ñó ðð
 ñó ðò9)òv1ò"ò"7õ"r   r¯  )Ú	metaclass)&rº   Úabcr   r   Úcollectionsr   rN  r˜   Ú	functoolsr   ÚnumpyrC   Únumba.np.ufunc.ufuncbuilderr   r   Ú
numba.corer	   r
   Únumba.core.typingr   Únumba.np.ufunc.sigparser   r   r%   r.   Úobjectr0   rÁ   rÃ   r	  r  r  r4  r>  rD  rQ  rw  r¯  rR   r   r   Ú<module>rî     s¼   ðñ÷ (Ý #Û Û Ý ã ç Iß &Ý 'Ý 3òIò Hò"ô&Z"�Vô Z"òzô:"Ð'ô :"ôzA"Ð-ô A"òH<òò&Jò
	ôHM�6ô HMôV,�Vô ,ô,a"�vô a"ôHn" ó n"r   