Ë
    S²jo¶  ã            !       óŒ  — U d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	 ddlm
Z
 ddlmZ ddlmZ ddlmZmZ dd	lmZ ddlZddlZd
„ Z G d„ de«      Z G d„ d«      Zeeef   ZdZi Zeed<   	 dddœZg d¢Z G d„ de«      Z d„ Z! G d„ d«      Z" G d„ d«      Z#dedefd„Z$dedede%fd „Z&d!„ Z'	 	 	 	 	 d^d"ed#ed$eded%e%d&e%dee   fd'„Z(d(ed)ed*ed+ed,eee)f   d-e%d&e%d.e#d/e%ddfd0„Z*d_d1„Z+d2„ Z, ejZ                  d3«      Z.d4„ Z/d5„ Z0d6„ Z1d7„ Z2 ejZ                  d8«      Z3d9„ Z4 ejZ                  d:«      Z5d;„ Z6 ejZ                  d<«      Z7d=„ Z8d`d>„Z9de%fd?„Z:de%fd@„Z;dA„ Z<de%fdB„Z=dC„ Z> G dD„ dE«      Z? G dF„ dG«      Z@ e@«       ZAi ZBeeeCf   edH<   e	D ]A  ZD eEeDe«      s eFdI«      ‚eDj�                  «       D ]  \  ZHZIeAj•                  eH«       eIeBeH<   Œ ŒC  ejZ                  dJeAj—                  «       › dK�«      ZL ejZ                  dL«      ZM ejZ                  dM«      ZN ejZ                  dN«      ZO ejZ                  dO«      ZP	 d(ed)ed*ed+ed,eee)f   d-e%d&e%d.e#d/e%defdP„ZQd`d_dQ„ZRd_dR„ZSdS„ ZT ejZ                  dT«      ZUdU„ ZVdVede%fdW„ZW	 	 	 	 	 	 	 	 	 	 	 	 	 	 dadXedYe%dedZed(ed+ed#ed[ed%e%d$ed/e%d-e%d&e%d\e%d.e#dz  def d]„ZXy)ba   The Python Hipify script.
##
# Copyright (c) 2015-2016 Advanced Micro Devices, Inc. All rights reserved.
#               2017-2018 Advanced Micro Devices, Inc. and
#                         Facebook Inc. All rights reserved.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
é    Né   )ÚCUDA_TO_HIP_MAPPINGS)ÚMATH_TRANSPILATIONS)ÚCAFFE2_PATH_MAPPINGS)ÚIterator)ÚMappingÚIterable)ÚEnumc                 óB   — t        j                  d| › �t        d¬«       y )Nz-hipify version 2.0.0 no longer uses function é   )Ú
stacklevel)ÚwarningsÚwarnÚFutureWarning)Únames    ú_/var/www/html/ia-enhanced/venv/lib/python3.12/site-packages/torch/utils/hipify/hipify_python.pyÚ_deprecatedr   -   s   € Ü‡M�MÐAÀ$ÀÐHÌ-ÐdeÖfó    c                   ó   — e Zd ZdZdZy)ÚCurrentStater   r   N)Ú__name__Ú
__module__Ú__qualname__ÚINITIALIZEDÚDONE© r   r   r   r   0   s   „ Ø€KØ�Dr   r   c                   ó    — e Zd Zdd„Zdefd„Zy)ÚHipifyResultÚreturnNc                 ó.   — || _         || _        d| _        y )NÚ ©Úcurrent_stateÚhipified_pathÚstatus)Úselfr#   r$   s      r   Ú__init__zHipifyResult.__init__5   s   € Ø*ˆÔØ*ˆÔØˆ�r   c                 óT   — d| j                   › d| j                  › d| j                  › �S )NzHipifyResult:: current_state: z, hipified_path : z
, status: r"   ©r&   s    r   Ú__str__zHipifyResult.__str__:   sF   € Ø0°×1CÑ1CÐ0DÐDVÐW[×WiÑWiÐVjÐjtÐuy÷  vAñ  vAð  uBð  Cð  	Dr   ©r   N)r   r   r   r'   Ústrr*   r   r   r   r   r   4   s   „ óð
D˜ô Dr   r   z;// !!! This is a file automatically generated by hipify!!!
ÚHIPIFY_FINAL_RESULTÚscalar_t)ÚDtypeÚT) Ú
InputErrorÚopenfÚbcolorsÚGeneratedFileCleanerÚmatch_extensionsÚmatched_files_iterÚpreprocess_file_and_save_resultÚcompute_statsÚadd_dim3ÚprocessKernelLaunchesÚfind_closure_groupÚfind_bracket_groupÚfind_parentheses_groupÚreplace_math_functionsÚhip_header_magicÚreplace_extern_sharedÚget_hip_file_pathÚis_out_of_placeÚis_pytorch_fileÚis_cusparse_fileÚis_special_fileÚis_caffe2_gpu_fileÚTrieÚpreprocessorÚfile_specific_replacementÚfile_add_headerÚfix_static_global_kernelsÚextract_argumentsÚstr2boolr   r   Úhipifyc                   ó,   ‡ — e Zd Zdˆ fd„Zdefd„Zˆ xZS )r1   r   c                 ó2   •— t         ‰| �  |«       || _        y ©N)Úsuperr'   Úmessage)r&   rS   Ú	__class__s     €r   r'   zInputError.__init__Q   s   ø€ Ü‰Ñ˜Ô!Øˆ�r   c                 ó    — d| j                   › �S )NzInput error: )rS   r)   s    r   r*   zInputError.__str__U   s   € Ø˜tŸ|™|˜nÐ-Ð-r   r+   )r   r   r   r'   r,   r*   Ú__classcell__)rT   s   @r   r1   r1   N   s   ø„ õð.˜÷ .r   r1   c                 ó   — t        | |d¬«      S )NÚignore)Úerrors)Úopen)ÚfilenameÚmodes     r   r2   r2   Y   s   € Ü�˜$ xÔ0Ð0r   c                   ó,   — e Zd ZdZdZdZdZdZdZdZ	dZ
y	)
r3   z[95mz[94mz[92mz[93mz[91mz[0mz[1mz[4mN)r   r   r   ÚHEADERÚOKBLUEÚOKGREENÚWARNINGÚFAILÚENDCÚBOLDÚ	UNDERLINEr   r   r   r3   r3   ^   s*   „ Ø€FØ€FØ€GØ€GØ€DØ€DØ€DØ�Ir   r3   c                   ó6   — e Zd ZdZdd	d„Zd„ Zd„ Zdd	d„Zd„ Zy)
r4   z+Context Manager to clean up generated filesNc                 ó>   — || _         t        «       | _        g | _        y rQ   )Úkeep_intermediatesÚsetÚfiles_to_cleanÚdirs_to_clean)r&   rh   s     r   r'   zGeneratedFileCleaner.__init__s   s   € Ø"4ˆÔÜ!›eˆÔØˆÕr   c                 ó   — | S rQ   r   r)   s    r   Ú	__enter__zGeneratedFileCleaner.__enter__x   s   € Øˆr   c                 óÎ   — t         j                  j                  |«      s8| j                  j	                  t         j                  j                  |«      «       t        |g|¢­i |¤ŽS rQ   )ÚosÚpathÚexistsrj   ÚaddÚabspathrZ   )r&   ÚfnÚargsÚkwargss       r   rZ   zGeneratedFileCleaner.open{   sH   € Ü�w‰w�~‰~˜bÔ!Ø×Ñ×#Ñ#¤B§G¡G§O¡O°BÓ$7Ô8ä�BÐ(˜Ò( Ñ(Ð(r   c                 óÚ  — t         j                  j                  |«      \  }}|s"t         j                  j                  |«      \  }}|r4|r2t         j                  j                  |«      s| j	                  |d¬«       t         j                  j                  |«      r|sNt        j                  |«       | j                  j                  t         j                  j                  |«      «       y y )NT)Úexist_ok)
ro   rp   Úsplitrq   ÚmakedirsÚisdirÚmkdirrk   Úappendrs   )r&   Údnrx   ÚparentÚns        r   rz   zGeneratedFileCleaner.makedirs�   s˜   € Ü—G‘G—M‘M "Ó%‰	ˆ�ÙÜŸ™Ÿ™ fÓ-‰IˆF�AÙ‘a¤§¡§¡¨vÔ 6Ø�M‰M˜&¨4ˆMÔ0Ü�w‰w�}‰}˜RÔ ©Ü�H‰H�RŒLØ×Ñ×%Ñ%¤b§g¡g§o¡o°bÓ&9Õ:ð )1r   c                 óÂ   — | j                   sS| j                  D ]  }t        j                  |«       Œ | j                  d d d…   D ]  }t        j
                  |«       Œ y y )Néÿÿÿÿ)rh   rj   ro   Úunlinkrk   Úrmdir)r&   ÚtypeÚvalueÚ	tracebackÚfÚds         r   Ú__exit__zGeneratedFileCleaner.__exit__‹   sY   € Ø×&Ò&Ø×(Ñ(ò �Ü—	‘	˜!•ðà×'Ñ'©¨"¨Ñ-ò �Ü—‘˜•ñð 'r   ©Fr+   )	r   r   r   Ú__doc__r'   rm   rZ   rz   rŠ   r   r   r   r4   r4   q   s   „ Ù5ô ò
ò)ô;ór   r4   rp   r   c                 óB   — | j                  t        j                  d«      S )Nú/)Úreplacero   Úsep)rp   s    r   Ú_to_unix_pathr‘   “   s   € Ø�<‰<œŸ™ Ó$Ð$r   r[   Ú
extensionsc                 ó,   ‡ — t        ˆ fd„|D «       «      S )z<Helper method to see if filename ends with certain extensionc              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wrQ   ©Úendswith)Ú.0Úer[   s     €r   ú	<genexpr>z#match_extensions.<locals>.<genexpr>˜   s   øè ø€ Ò8¨ˆx× Ñ  ×#Ñ8ùó   ƒ©Úany)r[   r’   s   ` r   r5   r5   –   s   ø€ äÓ8¨ZÔ8Ó8Ð8r   c                 ó,   ‡ — t        ˆ fd„|D «       «      S )Nc              3   óJ   •K  — | ]  }t        j                   ‰|«      –— Œ y ­wrQ   )Úfnmatch)r—   ÚpatternÚfilepaths     €r   r™   z_fnmatch.<locals>.<genexpr>œ   s   øè ø€ ÒJ°gŒw�‰˜x¨×1ÑJùs   ƒ #r›   )r¡   Úpatternss   ` r   Ú_fnmatchr£   ›   s   ø€ ÜÓJÀÔJÓJÐJr   Ú	root_pathÚincludesÚignoresÚout_of_place_onlyÚis_pytorch_extensionc              #   ó
  K  — t        |«      }t        j                  | d¬«      D ]Ú  \  }}}	t        j                  j	                  || «      }
|
dk(  rPd|v r|j                  d«       d|v r|j                  d«       d|v r"|j                  d«       |j                  d«       |	D ]Z  }t        t        j                  j                  ||«      «      }t        ||«      sŒ9t        ||«      rŒFt        ||«      s||v sŒW|–— Œ\ ŒÜ y ­w)NT)Útopdownú.z.gitÚbuildÚthird_partyzthird_party/nvfuser)ri   ro   Úwalkrp   ÚrelpathÚremover}   r‘   Újoinr£   r5   )r¤   r¥   r¦   r’   r§   r¨   Úexact_matchesÚabs_dirpathÚdirsÚ	filenamesÚrel_dirpathr[   r¡   s                r   r6   r6   Ÿ   së   è ø€ ô ˜“M€Mô +-¯'©'°)ÀTÔ*Jò Ñ&ˆ�d˜IÜ—g‘g—o‘o k°9Ó=ˆØ˜#Òà˜‰~Ø—‘˜FÔ#Ø˜$‰Ø—‘˜GÔ$Ø Ñ$Ø—‘˜MÔ*Ø—‘Ð1Ô2Ø!ò 		ˆHÜ$¤R§W¡W§\¡\°+¸xÓ%HÓIˆHô ˜ 8Õ,Ü! (¨GÕ4Ü% h°
Ô;¸xÈ=Ò?Xà“ñ		ñùs   ‚CDÃDÃ)DÃ:	DÚoutput_directoryr¡   Ú	all_filesÚheader_include_dirsÚstatsÚhip_clang_launchÚ	clean_ctxÚshow_progressc	                 óf  — t         j                  j                  t         j                  j                  | |«      «      }	t	        t
        j                  |	¬«      }
|
t        |	<   t        | ||||||||«	      }|r2d|j                  vr$t        |	d|j                  |j                  d¬«       |t        |	<   y )N)r#   r$   Úignoredz->T)Úflush)ro   rp   rs   r±   r   r   r   r-   rH   r%   Úprintr$   )r·   r¡   r¸   r¹   rº   r»   r¨   r¼   r½   Úfin_pathÚhipify_resultÚresults               r   r7   r7   Å   s¡   € ô �w‰w�‰œrŸw™wŸ|™|Ð,<¸hÓGÓH€HÜ ¬|×/GÑ/GÐW_Ô`€MØ$1Ô˜Ñ!ÜÐ*¨H°iÐATÐV[Ø*Ð,@À)È]ó\€Fñ ˜¨&¯-©-Ñ7ÜØ�dØ× Ñ  &§-¡-°tõ	=ð %+Ô˜Ò!r   c                 óØ   — | d   D ��ch c]  \  }}|’Œ	 }}}t        dt        |«      d›�«       t        dj                  |«      «       t        dt        | d   «      d›�«       y c c}}w )NÚunsupported_callsz1Total number of unsupported CUDA function calls: r‰   ú, z+
Total number of replaced kernel launches: Úkernel_launches)rÁ   Úlenr±   )rº   Ú	cuda_callÚ	_filepathrÆ   s       r   r8   r8   Þ   sx   € ØAFÐGZÑA[×\Ñ'=¨	°9šÐ\ÐÑ\ô 
Ð=¼cÐBSÓ>TÐUVÐ=WÐ
XÔYô 
ˆ$�)‰)Ð%Ó
&Ô'ô 
Ð8¼¸UÐCTÑ=UÓ9VÐWXÐ8YÐ
ZÕ[ùó ]s   ‰A&c                 ó  — d}d}| j                  dd«      j                  dd«      } t        d«      D �cg c]  }i ‘Œ }}d||   d<   t        | «      D ]b  \  }}|dkD  r nX|dk(  r|dz  }n
|d	k(  r|dz  }|d
k(  s|t        | «      dz
  k(  sŒ9|dk(  sŒ?||d
k7  z   ||   d<   |dz  }|dk  sŒX|dz   ||   d<   Œd | |d   d   |d   d   dz    }| |d   d   |d   d    }	| |d   d   |d   d    j                  dd«      j	                  d«      }
| |d   d   |d   d    j                  dd«      j	                  d«      }d|
› d	�}d|› d	�}|j                  |
|«      }|	j                  ||«      }|j                  ||	z   ||z   «      }|S c c}w )zBadds dim3() to the second and third arguments in the kernel launchr   ú<<<r!   ú>>>r   Ústartr   ú(ú)ú,Úendú
ú zdim3()r�   ÚrangeÚ	enumeraterÉ   Ústrip)Úkernel_stringÚcuda_kernelÚcountÚclosureÚ_Úarg_locsÚindÚcÚfirst_arg_rawÚsecond_arg_rawÚfirst_arg_cleanÚsecond_arg_cleanÚfirst_arg_dim3Úsecond_arg_dim3Úfirst_arg_raw_dim3Úsecond_arg_raw_dim3s                   r   r9   r9   ë   s  € à€EØ€GØ!×)Ñ)¨%°Ó4×<Ñ<¸UÀBÓG€MÜ27¸³(Ö%;¨Q¢bÐ%;€HÐ%;Ø €HˆU�O�GÑÜ˜MÓ*ò 3‰ˆˆQØ�1Š9ÙØ�Š8Ø�q‰L‰GØ�#ŠXØ�q‰LˆGØ�ŠH˜œs =Ó1°AÑ5Ó5¸7Àa»<Ø%(¨A°©HÑ%5ˆH�U‰O˜EÑ"Ø�Q‰JˆEØ�q‹yØ+.°©7�˜‘ Ò(ð3ð " (¨1¡+¨gÑ"6°xÀ±{À5Ñ7IÈAÑ7MÐN€MØ" 8¨A¡;¨wÑ#7¸À¹ÀEÑ8JÐK€Nà# H¨Q¡K°Ñ$8¸À!¹ÀUÑ9KÐL×TÑTÐUYÐ[]Ó^×dÑdÐehÓi€OØ$ X¨a¡[°Ñ%9¸(À1¹+ÀeÑ:LÐM×UÑUÐVZÐ\^Ó_×eÑeÐfiÓjÐà˜_Ð-¨QÐ/€NØÐ.Ð/¨qÐ1€Oà&×.Ñ.¨ÀÓOÐØ(×0Ñ0Ð1AÀ?ÓSÐØ×%Ñ% m°nÑ&DÐFXÐ[nÑFnÓo€KØÐùò7 &<s   ´	Fz([ ]+)(detail?)::[ ]+\\\n[ ]+c           
      óÄ  ‡ — t         j                  d„ ‰ «      Š ˆ fd„}d„ }d„ }t         | |‰ «      «      «      }‰ }|D �]  } ||«      }‰ j                  d|d   «      }	‰ |d   d   |	d	z    }
‰ |d   |d    }|d	   d   d
k(  rdnd	}‰ |d   d   ||   d   d	z    }t	        ||
«      }t        t        d|d   j                  dd«      j                  dd«      «      «      }d|dd
 j                  ddd|z
  z  dz   «      j                  dd«      j                  dd«      j                  |d|z   dz   «      z   }|j                  |
|«      }|d   j                  |«       �Œ  |S )zK Replace the CUDA style Kernel launches with the HIP style kernel launches.c                 óL   — | j                  d«      › | j                  d«      › d�S )Nr   r   z::©Úgroup©Úinps    r   ú<lambda>z'processKernelLaunches.<locals>.<lambda>  s!   € °·±¸1³°¸s¿y¹yÈ»|¸nÈBÐ.O€ r   c                 ó   •— | d   | d   dœdddœdddœdœ}ddi}d}d}d	}d
}|}t        |d   d   dz
  dd«      D ]Á  }‰
|   }	|||fv rJ|	dk(  r||k(  r
|}||d   d<   |dxx   dz  cc<   |	dk(  r$|dxx   dz  cc<   |d   dk(  r||k(  r
||d   d<   |}||k7  sŒ^‰
|   j                  «       s‰
|   dv r-||k7  r
|}||d   d<   |dk(  sŒ�d|d   d<   |d   |d   |d   gc S ||k(  sŒ«||d   d<   |d   |d   |d   gc S  y )NrÏ   rÓ   ©rÏ   rÓ   r‚   )Úkernel_launchÚkernel_nameÚtemplatez<>r   r   r   é   rò   ú>rô   ú<>   rÝ   ú#rÐ   rÑ   ú:ró   )rÖ   Úisalnum)Ú	in_kernelÚposrÛ   ÚSTARTÚAT_TEMPLATEÚAFTER_TEMPLATEÚAT_KERNEL_NAMEr%   ÚiÚcharÚstrings             €r   Úgrab_method_and_templatez7processKernelLaunches.<locals>.grab_method_and_template  s¯  ø€ ð (1°Ñ'9À)ÈEÑBRÑSØ%'°Ñ3Ø"$¨RÑ0ñ
ˆð �q�	ˆð ˆØˆØˆØˆàˆô �s˜?Ñ+¨GÑ4°qÑ8¸"¸bÓAò %	aˆAØ˜!‘9ˆDð ˜% Ð-Ñ-Ø˜3’;Ø ’Ø!,˜Ø12˜˜J™¨Ñ.Ø˜$“K 1Ñ$“Kà˜3’;Ø˜$“K 1Ñ$“KØ˜T‘{ aÒ'¨V°{Ò-BØ34˜˜J™¨Ñ0Ø!/˜ð ˜Ó$Ø˜!‘9×$Ñ$Ô&¨&°©)Ð7PÑ*PØ Ò/Ø!/˜Ø45˜˜MÑ*¨5Ñ1ð ˜A“vØ67˜˜MÑ*¨7Ñ3ð "% ]Ñ!3°s¸:±È#ÈoÑJ^Ð`Ò`ð  Ó/Ø67˜˜MÑ*¨7Ñ3ð "% ]Ñ!3°s¸:±È#ÈoÑJ^Ð`Ò`ñK%	ar   c                 ó  — d}g }| j                  d|«      dk7  re| j                  d|«      }| j                  d|«      dz   }|dk  rt        d«      ‚|j                  ||| || dœ«       | j                  d|«      dk7  rŒe|S )zKFinds the starting and ending points for all kernel launches in the string.r   rÍ   r‚   rÎ   rõ   zno kernel end found)rÏ   rÓ   rì   )Úfindr1   r}   )r  Ú
kernel_endÚkernel_positionsÚkernel_starts       r   Úfind_kernel_boundsz1processKernelLaunches.<locals>.find_kernel_boundsQ  sž   € àˆ
ØÐð �k‰k˜% Ó,°Ò2à!Ÿ;™; u¨jÓ9ˆLð  Ÿ™ U¨LÓ9¸AÑ=ˆJØ˜QŠÜ Ð!6Ó7Ð7ð ×#Ñ#¨lÀ:Ø.4°\À:Ð.Nñ%Pô Qð �k‰k˜% Ó,°Ó2ð  Ðr   c                 ó  — d}d}d}| D ]z  }|dk(  r,|dk(  r|dk(  rd}nT|dk(  r|dk(  rd}nG|dk(  rB|dk7  r=|dk7  r8d}n5|dk(  r|d	k(  s|d
k(  r&d}n#|dk(  r|dk(  r|dk(  rd}n|dk(  r|dk(  r|dk7  rd}|}|dk(  r||z  }Œv|dz  }Œ| |S )Nr!   rŽ   z//Ú*z/*ú"ú\ú'úrÔ   Úxr   )r  Ú
in_commentÚprev_cÚ
new_stringrà   s        r   Úmask_commentsz,processKernelLaunches.<locals>.mask_commentsi  sÚ   € Øˆ
ØˆØˆ
Øò 	"ˆAØ˜RÒà˜’8 ¨#¢Ø!%‘JØ˜#’X &¨C¢-Ø!%‘JØ˜#’X &¨D¢.°V¸s²]Ø!$‘JØ˜tÒ#à˜’9  T¢	Ø!#‘JØ˜tÒ#à˜’8 ¨#¢Ø!#‘JØ˜sÒ"à˜’8 ¨$¢Ø!#�JØˆFØ˜RÒØ˜a‘‘
à˜cÑ!‘
ð3	"ð4 Ðr   rÐ   rÓ   r   rÏ   r   r‚   rì   rÍ   rÎ   rÑ   zhipLaunchKernelGGL(z, 0é   rÇ   rÈ   )	ÚRE_KERNEL_LAUNCHÚsubÚlistr  r9   rÉ   rL   r�   r}   )r  rº   r  r
  r  Úget_kernel_positionsÚoutput_stringÚkernelÚparamsÚparenthesisrÚ   rÙ   Úend_param_indexÚkernel_name_with_templateÚcuda_kernel_dim3Únum_klpÚ
hip_kernels   `                r   r:   r:     s¾  ø€ ô ×!Ñ!Ñ"OÐQWÓX€Fô9aòv ò0ôB  Ñ 2±=ÀÓ3HÓ IÓJÐØ€Mð 'ó 4ˆá)¨&Ó1ˆð —k‘k # v¨e¡}Ó5ˆð ˜V A™Y wÑ/°¸a±Ð@ˆØ˜v g™¨v°e©}Ð=ˆØ% a™y¨Ñ/°2Ò5™!¸1ˆØ$*¨6°!©9°WÑ+=¸fÀ_Ñ>UÐV[Ñ>\Ð_`Ñ>`Ð$aÐ!Ü# M°;Ó?ÐäÔ'¨¨6°'©?×+BÑ+BÀ5È#Ó+N×+VÑ+VÐW\Ð^aÓ+bÓcÓdˆà*Ð-=¸aÀÐ-C×-KÑ-KØ�5˜A ™KÑ(¨5Ñ0ó.2ß29±'¸%ÀÓ2FÇwÁwØ�4óHß ™Ð!:¸CÐB[Ñ<[Ð^aÑ<aÓbñcˆ
ð
 &×-Ñ-¨k¸:ÓFˆð 	ÐÑ ×'Ñ'¨
Ö3ð14ð4 Ðr   c                 óÐ   — d}d}|}d\  }}|t        | «      k  rM| |   |d   k(  r|du rd}d}|}n#|dz  }n| |   |d   k(  r|r|dz  }|dk(  r|}||fS |dz  }|t        | «      k  rŒMy)aÊ  Generalization for finding a balancing closure group

         if group = ["(", ")"], then finds the first balanced parentheses.
         if group = ["{", "}"], then finds the first balanced bracket.

    Given an input string, a starting position in the input string, and the group type,
    find_closure_group returns the positions of group[0] and group[1] as a tuple.

    Example:
        >>> find_closure_group("(hi)", 0, ["(", ")"])
        (0, 3)
    Fr   )r‚   r‚   Tr   )NN)rÉ   )Úinput_stringrÏ   rì   Úinside_parenthesisÚparensrü   Úp_startÚp_ends           r   r;   r;   «  s¬   € ð ÐØ€FØ
€CØ�N€GˆUà
”�LÓ!Ò
!Ø˜Ñ  a¡Ò(Ø! UÑ*Ø%)Ð"Ø�Ø‘à˜!‘‘Ø˜#Ñ %¨¡(Ò*Ñ/AØ�a‰KˆFà˜Š{Ø�Ø �~Ð%àˆq‰ˆð ”�LÓ!Ó
!ð  r   c                 ó"   — t        | |ddg¬«      S )z%Finds the first balanced parentheses.ú{ú}rë   ©r;   ©r%  rÏ   s     r   r<   r<   Ñ  ó   € ä˜l¨E¸#¸s¸ÔDÐDr   c                 ó"   — t        | |ddg¬«      S )z!Finds the first balanced bracket.rÐ   rÑ   rë   r-  r.  s     r   r=   r=   Ö  r/  r   z\bassert[ ]*\(c                 ó^   — | }t         D ]!  }|j                  |› d�t         |   › d�«      }Œ# |S )a‹  FIXME: Temporarily replace std:: invocations of math functions
        with non-std:: versions to prevent linker errors NOTE: This
        can lead to correctness issues when running tests, since the
        correct version of the math function (exp/expf) might not get
        called.  Plan is to remove this function once HIP supports
        std:: math function calls inside device code

    rÐ   )r   r�   )r%  r  Úfuncs      r   r>   r>   Þ  sJ   € ð !€MÜ#ò \ˆØ%×-Ñ-°$°°q¨kÔ>QÐRVÑ>WÐ=XÐXYÐ;ZÓ[‰ð\ð Ðr   z:?:?\b(__syncthreads)\b(\w*\()c                 ó¦   ‡— | Šddg}t        ˆfd„|D «       «      r‰S d‰v }|d‰v z  }|d‰v z  }|t        j                  ‰«      duz  }|rd| z   Š‰S )	a  If the file makes kernel builtin calls and does not include the cuda_runtime.h header,
    then automatically add an #include to match the "magic" includes provided by NVCC.
    TODO:
        Update logic to ignore cases where the cuda_runtime.h is included by another file.
    zhip/hip_runtime.hzhip/hip_runtime_api.hc              3   óX   •K  — | ]!  }t        j                  d |› d|› d�‰«      –— Œ# y­w)z#include ("z"|<z>)N)ÚreÚsearch)r—   Úextr  s     €r   r™   z#hip_header_magic.<locals>.<genexpr>ý  s+   øè ø€ Ò
WÈŒ2�9‰9˜ C 5¨¨C¨5°Ð3°]×CÑ
Wùs   ƒ'*ÚhipLaunchKernelGGLÚ
__global__Ú
__shared__Nz#include "hip/hip_runtime.h"
)rœ   ÚRE_SYNCTHREADSr6  )r%  ÚheadersÚhasDeviceLogicr  s      @r   r?   r?   ñ  s„   ø€ ð !€Mð #Ð$;Ð<€GÜ
Ó
WÈwÔ
WÔWØÐð *¨]Ð:€NØ�l mÐ3Ñ3€NØ�l mÐ3Ñ3€NØ”n×+Ñ+¨MÓ:À$ÐFÑF€Nñ Ø8¸<ÑGˆàÐr   zGextern\s+([\w\(\)]+)?\s*__shared__\s+([\w:<>\s]+)\s+(\w+)\s*\[\s*\]\s*;c                 ó8   — | }t         j                  d„ |«      }|S )a¢  
    Match 'extern __shared__ type foo[];' syntax and use HIP_DYNAMIC_SHARED() MACRO instead.
    See: https://github.com/ROCm/hip/blob/master/docs/markdown/hip_kernel_language.md#__shared__
    Examples:
        "extern __shared__ char smemChar[];"
            => "HIP_DYNAMIC_SHARED( char, smemChar)"
        "extern __shared__ unsigned char smem[];"
            => "HIP_DYNAMIC_SHARED( unsigned char, my_smem)"
    c                 ó|   — d| j                  d«      xs d› d| j                  d«      › d| j                  d«      › d�S )	NzHIP_DYNAMIC_SHARED(r   r!   rÕ   r   rÇ   rõ   rÑ   rë   rí   s    r   rï   z'replace_extern_shared.<locals>.<lambda>  s<   € Ð)¨#¯)©)°A«,Ò*<¸"Ð)=¸Q¸s¿y¹yÈ»|¸nÈBÈsÏyÉyÐYZË|ÈnÐ\]Ð^€ r   )ÚRE_EXTERN_SHAREDr  )r%  r  s     r   r@   r@     s(   € ð !€MÜ$×(Ñ(Ù^Ð`móo€Mð Ðr   c                 ó°  — t         j                  j                  | «      rt        d«      ‚|st	        | «      s| S t         j                  j                  | «      \  }}t         j                  j                  |«      \  }}|dk(  rd}|}|}|j                  dd«      }|j                  dd«      }|j                  dd	«      }|j                  dd«      }|j                  dd«      }|d
k7  r|j                  dd	«      }|s%||k(  r t         j                  j                  |d«      }|r||k(  r||z   |k(  r|dz   }t         j                  j                  |||z   «      S )z3
    Returns the new name of the hipified file
    ú$rel_filepath must be a relative pathú.cuú.hipÚcudaÚhipÚCUDAÚHIPÚTHCÚTHHzcaffe2/coreÚ_hip)	ro   rp   ÚisabsÚAssertionErrorrB   ry   Úsplitextr�   r±   )Úrel_filepathr¨   Údirpathr[   Úrootr7  Úorig_filenameÚorig_dirpaths           r   rA   rA   "  s5  € ô 
‡w�w‡}�}�\Ô"ÜÐCÓDÐDÙ¬¸Ô(EØÐäŸ™Ÿ™ lÓ3Ñ€GˆXÜ—‘× Ñ  Ó*�I€Dˆ#ðH ˆe‚|Øˆà€MØ€Là�o‰o˜f eÓ,€GØ�o‰o˜f eÓ,€GØ�o‰o˜e UÓ+€Gà�<‰<˜ Ó&€DØ�<‰<˜ Ó&€Dà�-ÒØ�|‰|˜E 5Ó)ˆá G¨|Ò$;Ü—'‘'—,‘,˜w¨Ó.ˆá ¨<Ò 7¸TÀC¹ZÈMÒ<YØ�f‰}ˆä�7‰7�<‰<˜ ¨¡Ó,Ð,r   c                 óÄ   — t         j                  j                  | «      rt        d«      ‚| j	                  d«      ry| j	                  d«      ry| j	                  d«      ryy)NrB  útorch/Fúthird_party/nvfuser/útools/autograd/templates/T)ro   rp   rL  rM  Ú
startswith©rO  s    r   rB   rB   k  sV   € Ü	‡w�w‡}�}�\Ô"ÜÐCÓDÐDØ×Ñ˜xÔ(ØØ×ÑÐ5Ô6ØØ×ÑÐ:Ô;ØØr   c                 óŽ  — t        d«       t        j                  j                  | «      rt	        d«      ‚| j                  d«      r| j                  d«      ryy| j                  d«      ry| j                  d«      ry| j                  d	«      ry| j                  d
«      ry| j                  d«      ry| j                  d«      ryy)NrC   rB  zaten/zaten/src/ATen/core/FTrU  rV  zthird_party/fbgemm/zthird_party/mslk/rW  ztest/cpp/c10d/)r   ro   rp   rL  rM  rX  rY  s    r   rC   rC   x  s¸   € ÜÐ!Ô"Ü	‡w�w‡}�}�\Ô"ÜÐCÓDÐDØ×Ñ˜wÔ'Ø×"Ñ"Ð#8Ô9ØØØ×Ñ˜xÔ(ØØ×ÑÐ5Ô6ØØ×ÑÐ4Ô5ØØ×ÑÐ2Ô3ØØ×ÑÐ:Ô;ØØ×ÑÐ/Ô0ØØr   c                 óT   — t        d«       t        | «      rd| j                  «       v S y)NrD   ÚsparseF©r   rC   ÚlowerrY  s    r   rD   rD   �  s*   € ÜÐ"Ô#Ü�|Ô$Ø˜<×-Ñ-Ó/Ð/Ð/Ør   c                 ó¢   — t        d«       t        | «      r9d| j                  «       v ryd| j                  «       v rd| j                  «       v ryyy)NrE   r\  TÚlinalgÚbatchlinearalgebralibblasFr]  rY  s    r   rE   rE   –  sR   € ÜÐ!Ô"Ü�|Ô$Ø�|×)Ñ)Ó+Ñ+ØØ˜×+Ñ+Ó-Ñ-Ø*¨l×.@Ñ.@Ó.BÑBØØØr   c                 ó2  — t        d«       t        j                  j                  | «      rt	        d«      ‚| j                  d«      ryt        j                  j                  | «      }t        j                  j                  |«      \  }}d|v xs |dv xr d|vS )NrF   rB  zc10/cudaTÚgpu©rC  ú.cuhÚcudnn)r   ro   rp   rL  rM  rX  ÚbasenamerN  )rO  r[   rÝ   r7  s       r   rF   rF   ¢  sƒ   € ÜÐ$Ô%Ü	‡w�w‡}�}�\Ô"ÜÐCÓDÐDØ×Ñ˜zÔ*ØÜ�w‰w×Ñ Ó-€HÜ�W‰W×Ñ˜hÓ'�F€A€sà�XÐÒ7 ¨Ð!7ÒV¸gÈXÐ>UÐVr   c                   ó   — e Zd ZdZdd„Zy)ÚTrieNodez�A Trie node whose children are represented as a directory of char: TrieNode.
       A special char '' represents end of word
    Nc                 ó   — i | _         y rQ   )Úchildrenr)   s    r   r'   zTrieNode.__init__³  s	   € Øˆ�r   r+   )r   r   r   rŒ   r'   r   r   r   ri  ri  ®  s   „ ñôr   ri  c                   ób   — e Zd ZdZdd„Zdd„Zd„ Zd„ Zd„ Ze	j                  d„ «       Zd	„ Zd
„ Zy)rG   z£Creates a Trie out of a list of words. The trie can be exported to a Regex pattern.
    The corresponding Regex should match much faster than a simple Regex union.Nc                 ó–   — t        «       | _        t        j                  d¬«      | _        | j                  j                  «       | _        y)z,Initialize the trie with an empty root node.F)ÚusedforsecurityN)ri  rQ  ÚhashlibÚmd5Ú_hashÚdigestÚ_digestr)   s    r   r'   zTrie.__init__»  s/   € ä“JˆŒ	Ü—[‘[°Ô7ˆŒ
Ø—z‘z×(Ñ(Ó*ˆ�r   c                 ó>  — | j                   j                  |j                  «       «       | j                   j                  «       | _        | j
                  }|D ]5  }|j                  j                  |t        «       «       |j                  |   }Œ7 d|j                  d<   y)zAdd a word to the Trie. Tr!   N)	rq  ÚupdateÚencoderr  rs  rQ  rk  Ú
setdefaultri  ©r&   ÚwordÚnoder  s       r   rr   zTrie.addÁ  sz   € à�
‰
×Ñ˜$Ÿ+™+›-Ô(Ø—z‘z×(Ñ(Ó*ˆŒØ�y‰yˆàò 	'ˆDØ�M‰M×$Ñ$ T¬8«:Ô6Ø—=‘= Ñ&‰Dð	'ð !ˆ�‰�bÒr   c                 ó   — | j                   S )zReturn the root node of Trie. )rQ  r)   s    r   Údumpz	Trie.dumpÌ  s   € à�y‰yÐr   c                 ó,   — t        j                  |«      S )z Escape a char for regex. )r5  Úescape)r&   r  s     r   Úquotez
Trie.quoteÐ  s   € ä�y‰y˜‹Ðr   c                 ó‚   — | j                   }|D ]!  }||j                  v r|j                  |   }Œ! y d|j                  v S )zZSearch whether word is present in the Trie.
        Returns True if yes, else return FalseFr!   )rQ  rk  rx  s       r   r6  zTrie.searchÔ  sJ   € ð �y‰yˆØò 	ˆDØ�t—}‘}Ñ$Ø—}‘} TÑ*‘áð		ð �T—]‘]Ð"Ð"r   c                 óN  — |}d|j                   v r't        |j                   j                  «       «      dk(  ryg }g }d}t        |j                   j                  «       «      D ]o  }t	        |j                   |   t
        «      rN	 | j                  |j                   |   | j                  «      }|j                  | j                  |«      |z   «       Œnd}Œq t        |«      dkD   }	t        |«      dkD  rIt        |«      dk(  r|j                  |d   «       n&|j                  ddj                  |«      z   dz   «       t        |«      dk(  r|d   }
nddj                  |«      z   d	z   }
|r|	r|
d
z  }
|
S d|
› d�}
|
S # t        $ r$ |j                  | j                  |«      «       Y �ŒBw xY w)zžConvert a Trie into a regular expression pattern

        Memoized on the hash digest of the trie, which is built incrementally
        during add().
        r!   r   Nr   ú[ú]z(?:ú|rÑ   ú?z)?)rk  rÉ   ÚkeysÚsortedÚ
isinstanceri  Ú_patternrs  r}   r  Ú	Exceptionr±   )r&   rQ  rr  rz  ÚaltÚccÚqr  ÚrecurseÚcconlyrÄ   s              r   r‰  zTrie._patterná  s‰  € ð ˆà�—‘Ñ¤3 t§}¡}×'9Ñ'9Ó';Ó#<ÀÒ#AØàˆØˆØˆÜ˜4Ÿ=™=×-Ñ-Ó/Ó0ò 	ˆDÜ˜$Ÿ-™-¨Ñ-¬xÔ8ð0Ø"Ÿm™m¨D¯M©M¸$Ñ,?ÀÇÁÓN�GØ—J‘J˜tŸz™z¨$Ó/°'Ñ9Õ:ð ‘ð	ô ˜“X ‘\Ð!ˆäˆr‹7�QŠ;Ü�2‹w˜!Š|Ø—
‘
˜2˜a™5Õ!à—
‘
˜3 §¡¨£Ñ,¨sÑ2Ô3äˆs‹8�qŠ=Ø˜‘V‰Fà˜SŸX™X c›]Ñ*¨SÑ0ˆFáÙØ˜#‘�ð ˆð ˜v˜h bÐ)�Øˆøô- !ò 0Ø—I‘I˜dŸj™j¨Ó.×/ð0ús   ÂAE7Å7)F$Æ#F$c                 óN   — | j                  | j                  | j                  «      S ©z#Export the Trie to a regex pattern.©r‰  rQ  rs  r)   s    r   r    zTrie.pattern  ó   € à�}‰}˜TŸY™Y¨¯©Ó5Ð5r   c                 óN   — | j                  | j                  | j                  «      S r‘  r’  r)   s    r   Úexport_to_regexzTrie.export_to_regex  r“  r   r+   )r   r   r   rŒ   r'   rr   r|  r  r6  Ú	functoolsÚ	lru_cacher‰  r    r•  r   r   r   rG   rG   ·  sF   „ ñSó+ó	!òòò#ð ×Ññ)ó ð)òV6ó6r   rG   ÚPYTORCH_MAPz=Expected each mapping in CUDA_TO_HIP_MAPPINGS to be a Mappingz(?<=\W)(z)(?=\W)z#include "([^"]+)"z#include <([^>]+)>z"#define THC_GENERIC_FILE "([^"]+)"z\.cu\bc	                 óx
  ‡ ‡‡‡‡‡‡‡‡— t         j                  j                  t         j                  j                  ‰ |«      «      Št	        |«      }t
        ‰   }	|‰vr%d|	_        d|	_        t        j                  |	_
        |	S t	        t         j                  j                  |‰ «      «      }
t        ‰d¬«      5 }|j                  «       t        k(  r.d|	_        d|	_        t        j                  |	_
        |	cddd«       S |j                  d«       |j!                  «       }ddd«       }t         j                  j                  t         j                  j                  ‰ t#        |
‰«      «      «      }t         j                  j%                  t         j                  j'                  |«      «      s.‰j)                  t         j                  j'                  |«      «       d„ }t*        j-                  ||«      }t/        j0                  «       D ]O  \  }}d|v r4d|vr0d	t3        j4                  |«      z   }t3        j,                  |||«      }Œ>|j7                  ||«      }ŒQ d#ˆˆˆˆˆˆˆ ˆˆf	d„	}t8        j-                   |dd
«      |«      }t:        j-                   |dd«      |«      }t<        j-                   |d«      |«      }|j?                  d«      r:|j7                  dd«      }|j7                  dd«      }t@        j-                  d|«      }‰stC        |‰«      }|j?                  d«      rd|vrtE        |«      }tG        |«      }‰ri||k(  rdt         j                  j'                  ‰«      t         j                  j'                  |«      k(  r%‰|	_        d|	_        t        j                  |	_
        |	S ‰|k7  rtI        ‰d«      r	t        |z   }d
}t         j                  j%                  |«      r)t        |d¬«      5 }|j!                  «       |k7  }ddd«       |rT	 ‰j                  |dd¬«      5 }|jK                  |«       ddd«       ||	_        d|	_        t        j                  |	_
        |	S ||	_        d"|	_        t        j                  |	_
        |	S # 1 sw Y   �ŒnxY w# 1 sw Y   Œ‘xY w# 1 sw Y   ŒlxY w# tL        $ r~}tO        tP        jR                  › d|› d|jT                  › d‰› dtP        jV                  › �	tX        jZ                  ¬ «       ‰|	_        d!|	_        t        j                  |	_
        |	cY d}~S d}~ww xY w)$z< Executes the CUDA -> HIP conversion on the specified file. Nz[ignored, not to be hipified]zutf-8)Úencodingz#[ignored, input is hipified output]r   c                 ó2   — t         | j                  d«         S )Nr   )r˜  rì   )Úms    r   Úpt_replzpreprocessor.<locals>.pt_replX  s   € Ü˜1Ÿ7™7 1›:Ñ&Ð&r   z/hip/z
(?<!/hip/)Tc                 ó*   •	‡ ‡— ˆˆˆˆˆˆˆˆ	ˆ
ˆˆ fd„}|S )Nc                 óN  •‡— | j                  d«      }t        j                  j                  |«      Š|j	                  d«      s"|j	                  d«      r;|j	                  d«      s*‰j                  t        | j                  d«      ‰«      «      S ‰�rƒt        ˆfd„‰D «       «      �rnd }d }‰rt        j                  j                  ‰«      }t        j                  j                  t        j                  j                  ||«      «      }t        j                  j                  |«      r|}|}|€ˆ‰D ]ƒ  }t        j                  j                  ‰|«      }t        j                  j                  t        j                  j                  ||«      «      }t        j                  j                  |«      sŒ€|}|}Œ… |€| j                  d«      S |t        vrt        ‰|‰‰‰‰‰‰‰«	       ná|t        v rÙt        |   }|j                  t        j                   k(  r³t        j                  j#                  |‰«      }t        j                  j                  t        j                  j                  ‰t        |‰«      «      «      }	|	|_        |t        |<   ‰j                  t        j                  j#                  |	�|	|«      «      S ||«      «      S t        |   j$                  }
‰j                  t'        t        j                  j#                  |
�|
n||«      «      «      S | j                  d«      S )Nr   )z	ATen/cudazATen/native/cudazATen/native/nested/cudazATen/native/quantized/cudazATen/native/sparse/cudazATen/native/transformers/cudazTHC/rI  ÚTHCPc              3   ó@   •K  — | ]  }|j                  ‰«      –— Œ y ­wrQ   r•   )r—   Úsr[   s     €r   r™   z>preprocessor.<locals>.mk_repl.<locals>.repl.<locals>.<genexpr>€  s   øè ø€ Ò,UÀa¨Q¯Z©Z¸×-AÑ,Uùrš   r   )rì   ro   rp   rg  rX  ÚformatrA   rœ   Údirnamers   r±   rq   r-   r7   r#   r   r   r¯   r$   r‘   )rœ  rˆ   Ú
header_dirÚheader_filepathÚheader_dir_to_checkÚheader_path_to_checkÚheader_include_dirÚheader_resultÚheader_rel_pathÚheader_fout_pathÚhipified_header_filepathr[   r¸   r¼   rÂ   r¹   r»   Úinclude_current_dirr¨   r·   r½   rº   Útempls              @€€€€€€€€€€€r   Úreplz+preprocessor.<locals>.mk_repl.<locals>.replq  s»  ù€ Ø—‘˜“
ˆAÜ—w‘w×'Ñ'¨Ó*ˆHà—‘ð &ô 'ð —‘˜eÔ$¨Q¯\©\¸&Ô-Aà—|‘|Ô$5°a·g±g¸a³jÐBVÓ$WÓXÐXâ$¬Ó,UÈ9Ô,UÕ)UØ!�
Ø"&�á&Ü*,¯'©'¯/©/¸(Ó*CÐ'Ü+-¯7©7¯?©?¼2¿7¹7¿<¹<ÐH[Ð]^Ó;_Ó+`Ð(Ü—w‘w—~‘~Ð&:Ô;Ø%8˜
Ø*>˜à"Ð*Ø.Aò CÐ*Ü.0¯g©g¯l©lÐ;KÐM_Ó.`Ð+Ü/1¯w©w¯©¼r¿w¹w¿|¹|ÐL_ÐabÓ?cÓ/dÐ,ÜŸ7™7Ÿ>™>Ð*>Õ?Ø)<˜JØ.B™OðCð #Ð*ØŸ7™7 1›:Ð%à"Ô*=Ñ=Ü3Ð4DØ4CØ4=Ð?RÐTYÐ[kØ4HÈ)ÐUbõdð %Ô(;Ñ;Ü$7¸Ñ$H�MØ$×2Ñ2´l×6NÑ6NÒNä*,¯'©'¯/©/¸/ÐK[Ó*\˜Ü+-¯7©7¯?©?¼2¿7¹7¿<¹<ÐHXÜHYÐZiÐkó  IAó<Bó ,CÐ(à6F˜Ô3Ø?LÔ+¨OÑ<Ø$Ÿ|™|¬B¯G©G¯O©OÐP`ÐPlÐ<LØR\ó-^ó  _ð _ØAPÐR\ó-^ó  _ð _ä+>¸Ñ+O×+]Ñ+]Ð(Ø—|‘|¤M´"·'±'·/±/Ð^vð  _CÑBZØGVÐXbó3dó %eó fð fð —7‘7˜1“:Ðr   r   )r¯  r®  r°  r¸   r¼   rÂ   r¹   r»   r¨   r·   r½   rº   s   `` €€€€€€€€€r   Úmk_replzpreprocessor.<locals>.mk_replp  s   ú€ ÷9	ö 9	ðt ˆr   z#include "{0}"z#include <{0}>Fz#define THC_GENERIC_FILE "{0}"zCMakeLists.txtrG  rH  rI  rJ  rD  rd  Ú	PowKernelz[skipped, no changes])rC  re  ú.cú.ccú.cppú.hú.hppÚwz[ok]zFailed to save z with "z", leaving z unchanged.©Úfilez[skipped, no permissions]z[skipped, already hipified])T).ro   rp   rs   r±   r‘   r-   r$   r%   r   r   r#   r¯   rZ   ÚreadlineÚHIPIFY_C_BREADCRUMBÚseekÚreadrA   rq   r¤  rz   ÚRE_PYTORCH_PREPROCESSORr  r   Úitemsr5  r~  r�   ÚRE_QUOTE_HEADERÚRE_ANGLE_HEADERÚRE_THC_GENERIC_FILEr–   ÚRE_CU_SUFFIXr:   r>   r?   r5   ÚwriteÚOSErrorrÁ   r3   ra   Ústrerrorrc   ÚsysÚstderr)r·   r¡   r¸   r¹   rº   r»   r¨   r¼   r½   rÃ   rO  ÚfinÚoutput_sourceÚorig_output_sourceÚ	fout_pathr�  Ú	cuda_pathÚhip_pathr    r±  Údo_writeÚfout_oldÚfoutr˜   rÂ   s   ` ```````               @r   rH   rH   1  sˆ  ÿø€ ô �w‰w�‰œrŸw™wŸ|™|Ð,<¸hÓGÓH€HÜ˜XÓ&€HÜ'¨Ñ1€MØ�yÑ Ø&*ˆÔ#Ø>ˆÔÜ&2×&7Ñ&7ˆÔ#ØÐä ¤§¡§¡°Ð;KÓ!LÓM€Lä	ˆh Ô	)ð #¨SØ�<‰<‹>Ô0Ò0Ø*.ˆMÔ'Ø#HˆMÔ Ü*6×*;Ñ*;ˆMÔ'Ø ÷#ñ #ð 	�‰�ŒØŸ™›
ˆ÷#ð 'Ðô —‘—‘¤§¡§¡Ð-=Ô?PÐQ]Ð_sÓ?tÓ uÓv€IÜ�7‰7�>‰>œ"Ÿ'™'Ÿ/™/¨)Ó4Ô5Ø×Ñœ2Ÿ7™7Ÿ?™?¨9Ó5Ô6ò'ô ,×/Ñ/°¸ÓG€Mô  4×9Ñ9Ó;ò GÑˆ	�8ð �hÑ 7°)Ñ#;ð $¤b§i¡i°	Ó&:Ñ:ˆGÜŸF™F 7¨H°mÓD‰Mð *×1Ñ1°)¸XÓF‰MðG÷;õ ;ôx $×'Ñ'©Ð0@À$Ó(GÈÓW€MÜ#×'Ñ'©Ð0@À%Ó(HÈ-ÓX€MÜ'×+Ñ+©GÐ4TÓ,UÐWdÓe€Mð ×ÑÐ)Ô*Ø%×-Ñ-¨f°eÓ<ˆØ%×-Ñ-¨e°UÓ;ˆÜ$×(Ñ(¨°Ó?ˆñ Ü-¨m¸UÓCˆð 	×Ñ˜/Ô*°À8Ñ0KÜ.¨}Ó=ˆô % ]Ó3€Mñ 	Ø -Ò/Ü�G‰G�O‰O˜HÓ%¬¯©¯©¸Ó)CÒCà&.ˆÔ#Ø6ˆÔÜ&2×&7Ñ&7ˆÔ#ØÐð �9ÒÔ!1°(Ð<nÔ!oÜ+¨mÑ;ˆà€HÜ	‡w�w‡~�~�iÔ Ü�) gÔ.ð 	8°(Ø—}‘}“¨-Ñ7ˆH÷	8áð	!Ø—‘ 	¨3¸�ÓAð *ÀTØ—
‘
˜=Ô)÷*à*3ˆMÔ'Ø#)ˆMÔ Ü*6×*;Ñ*;ˆMÔ'Ø Ð ð '0ˆÔ#Ø<ˆÔÜ&2×&7Ñ&7ˆÔ#ØÐ÷I#ñ #ú÷^	8ð 	8ú÷*ð *ûô ò 	!Ü”W—_‘_Ð% _°Y°K¸wÀqÇzÁzÀlÐR]Ð^fÐ]gÐgrÔsz×sÑsð  sAð  BÜ—z‘zõ#à*2ˆMÔ'Ø#>ˆMÔ Ü*6×*;Ñ*;ˆMÔ'Ø Õ ûð	!úsU   Â:<RÄ !RÏ6RÐR2 Ð)R&Ð;,R2 ÒRÒR#Ò&R/Ò+R2 Ò2	T9Ò;A3T4Ô.T9Ô4T9c                 óX  ‡— t        | d«      5 }|j                  «       }|r2t        j                  dt        j                  |«      › d�ˆfd„|«      }n|j                  |‰«      }|j                  d«       |j                  |«       |j                  «        d d d «       y # 1 sw Y   y xY w)Núr+z\b(z)\bc                 ó   •— ‰S rQ   r   )r  Úreplace_strings    €r   rï   z+file_specific_replacement.<locals>.<lambda>ñ  s   ø€ Èn€ r   r   )	r2   r¾  r5  r  r~  r�   r½  rÅ  Útruncate)r¡   Úsearch_stringrÖ  Ústrictrˆ   Úcontentss     `   r   rI   rI   í  s‹   ø€ Ü	ˆx˜Ó	ð  !Ø—6‘6“8ˆÙÜ—v‘v ¤R§Y¡Y¨}Ó%=Ð$>¸cÐBÓD\Ð^fÓg‰Hà×'Ñ'¨°~ÓFˆHØ	�‰ˆqŒ	Ø	�‰�ÔØ	�
‰
Œ÷÷ ñ ús   ŽB	B Â B)c                 ó  — t        | d«      5 }|j                  «       }|d   dk7  r|d   dk7  rd|› d�}d|› d�|z   }|j                  d«       |j                  |«       |j	                  «        d d d «       y # 1 sw Y   y xY w)	NrÔ  r   r÷   r‚   rö   r  z	#include z 
)r2   r¾  r½  rÅ  r×  )r¡   Úheaderrˆ   rÚ  s       r   rJ   rJ   ù  s…   € Ü	ˆx˜Ó	ð  !Ø—6‘6“8ˆØ�!‰9˜Ò  r¡
¨cÒ 1Ø˜˜ �]ˆFØ ˜x sÐ+¨xÑ7ˆØ	�‰ˆqŒ	Ø	�‰�ÔØ	�
‰
Œ÷÷ ñ ús   �A"A8Á8Bc                 ó*   — | j                  dd«      } | S )z<Static global kernels in HIP results in a compilation error.z __global__ staticr9  )r�   )Úin_txts    r   rK   rK     s   € à�^‰^Ð0°,Ó?€FØ€Mr   z#include .*\nc                 óê  — g }dddœ}| }|dz   }|t        |«      k  rÖ||   dk(  r|dxx   dz  cc<   nT||   dk(  r|dxx   dz  cc<   n>||   dk(  r|dxx   dz  cc<   n(||   dk(  r ||dz
     dk7  r|d   dkD  r|dxx   dz  cc<   |d   dk(  r|d   dk(  r|j                  ||d	œ«       	 |S |d   dk(  r)|d   dk(  r!||   d
k(  r|j                  ||d	œ«       |dz   }|dz  }|t        |«      k  rŒÖ|S )a2  
    Return the list of arguments in the upcoming function parameter closure.
    Example:
    string (input): '(blocks, threads, 0, THCState_getCurrentStream(state))'
    arguments (output): [{'start': 1, 'end': 7}, {'start': 8, 'end': 16},         {'start': 17, 'end': 19}, {'start': 20, 'end': 53}]
    r   )r÷   rÐ   r   rÐ   rÑ   r÷   rö   ú-rñ   rÒ   )rÉ   r}   )rÏ   r  Ú	argumentsÚclosuresÚcurrent_positionÚargument_start_poss         r   rL   rL     sj  € ð €IàØñ€Hð ÐØ)¨AÑ-Ðð œS ›[Ò
(ØÐ"Ñ# sÒ*Ø�S‹M˜QÑŒMØÐ$Ñ%¨Ò,Ø�S‹M˜QÑŒMØÐ$Ñ%¨Ò,Ø�S‹M˜QÑŒMØÐ$Ñ%¨Ò,°Ð8HÈ1Ñ8LÑ1MÐQTÒ1TÐYaÐbeÑYfÐijÒYjØ�S‹M˜QÑ‹Mð �C‰=˜AÒ (¨3¡-°1Ò"4à×ÑÐ'9ÐBRÑSÔTØð Ðð �C‰=˜AÒ (¨3¡-°1Ò"4¸Ð@PÑ9QÐUXÒ9XØ×ÑÐ'9ÐBRÑSÔTØ!1°AÑ!5Ðà˜AÑÐð+ œS ›[Ó
(ð. Ðr   Úvc                 óx   — | j                  «       dv ry| j                  «       dv ryt        j                  d«      ‚)zArgumentParser doesn't support type=bool. Thus, this helper method will convert
    from possible string types to True / False.)ÚyesÚtrueÚtÚyÚ1T)ÚnoÚfalserˆ   r€   Ú0FzBoolean value expected.)r^  ÚargparseÚArgumentTypeError)rå  s    r   rM   rM   9  s:   € ð 	‡w�wƒyÐ2Ñ2ØØ	
�‰‹Ð4Ñ	4Øä×(Ñ(Ð)BÓCÐCr   Úproject_directoryÚshow_detailedÚheader_extensionsÚextra_filesÚhipify_extra_files_onlyc                 ód  ‡‡‡	— | dk(  rt        j                  «       } t         j                  j                  | «      s t	        d«       t        j                  d«       |s| j                  d«       | dz   }| |k7  r@‰D �cg c]  }|j                  | |«      ‘Œ c}Š‰	D �cg c]  }|j                  | |«      ‘Œ c}Š	t         j                  j                  |«      st        j                  | |«       t        t        t        ‰«      «      Št        t        t        ‰	«      «      Š	t        t        |‰‰	|||¬«      «      }t        |«      }|D ]W  }t         j                  j!                  |«      s t         j                  j#                  ||«      }||vsŒG|j%                  |«       ŒY ddlm} |D ]{  }t         j                  j!                  |«      r	 ||«      }n& |t         j                  j#                  ||«      «      }|j+                  ˆˆ	ˆfd	„|j-                  d
«      D «       «       Œ} |€t/        d¬«      }g g dœ}|s|n|D ]  }t1        |||||||||
«	       Œ t	        t2        j4                  dz   t2        j6                  z   t
        j8                  ¬«       |rt;        |«       t<        S c c}w c c}w )Nr!   z,The project folder specified does not exist.r   rŽ   Ú_amd)r¥   r¦   r’   r§   r¨   r   )ÚPathc              3   óÖ   •K  — | ]`  }|j                  «       sŒt        t        |«      ‰«      r8t        t        |«      ‰«      s#t        |j                  ‰«      rt        |«      –— Œb y ­wrQ   )Úis_filer£   r,   r5   r   )r—   rp   ró  r¦   r¥   s     €€€r   r™   zhipify.<locals>.<genexpr>€  sP   øè ø€ ò 
ØÈÏÉÍÜœ˜T› HÔ-Üœc $›i¨Ô1Ü  §¡Ð,=Ô>ô ��Iñ
ùs   ƒA)™AA)r  T)rh   )rÆ   rÈ   z-Successfully preprocessed all matching files.r¹  )ro   Úgetcwdrp   rq   rÁ   rÈ  ÚexitÚrstripr�   ÚshutilÚcopytreer  Úmapr‘   r6   ri   rL  r±   r}   Úpathlibrø  ÚextendÚrglobr4   r7   r3   r`   rc   rÉ  r8   r-   )rñ  rò  r’   ró  r·   r¹   r¥   rô  r§   r¦   r½   r»   r¨   rõ  r¼   ÚincluderX   r¸   Úall_files_setrˆ   rø  r©  Úheader_include_dir_pathrº   r¡   s      `  `  `               r   rN   rN   D  sk  ú€ ð" ˜BÒÜŸI™I›KÐô �7‰7�>‰>Ð+Ô,ÜÐ<Ô=Ü�‰�Œñ Ø× Ñ  Ô%Ø,¨vÑ5ÐàÐ,Ò,ØX`ÖaÈW�G—O‘OÐ$5Ð7GÕHÒaˆØU\Ö]È6�6—>‘>Ð"3Ð5EÕFÒ]ˆô �7‰7�>‰>Ð*Ô+Ü�‰Ð)Ð+;Ô<ä”Cœ xÓ0Ó1€HÜ”3”} gÓ.Ó/€GäÔ'Ð(8À8Ø07ÀJØ:KØ=QôSó T€Iô ˜	“N€Màò  ˆÜ�w‰w�}‰}˜QÔÜ—‘—‘Ð-¨qÓ1ˆAØ�MÒ!Ø×Ñ˜QÕð	 õ Ø1ò 

ÐÜ�7‰7�=‰=Ð+Ô,Ù&*Ð+=Ó&>Ñ#á&*¬2¯7©7¯<©<Ð8HÐJ\Ó+]Ó&^Ð#Ø×Ñõ 
Ø"9×"?Ñ"?ÀÓ"Dô
õ 	
ð

ð ÐÜ(¸DÔAˆ	ð 46È"ÑM€Eá&=‘YÀ;ò qˆÜ'Ð(8¸(ÀIÐObØ(-Ð/?ÐAUÐW`Ðboõ	qðqô 
Œ'�/‰/ÐKÑ
KÌgÏlÉlÑ
ZÔad×akÑakÕlñ Ü�eÔäÐùòi bùÚ]s   Á=J(ÂJ-)r   r   r   FFr+   r‹   )F)rC  re  r³  r´  rµ  r¶  z.inr·  )re  r¶  r·  r!   r   )r  r   Fr   TFFFN)YrŒ   rï  rŸ   r5  rþ  rÈ  ro   r   Úcuda_to_hip_mappingsr   r   r   Úcollections.abcr   r   r	   Úenumr
   r–  ro  r   r   r   Údictr,   ÚHipifyFinalResultr¼  r-   Ú__annotations__ÚPYTORCH_TEMPLATE_MAPÚ__all__rŠ  r1   r2   r3   r4   r‘   Úboolr5   r£   r6   r  r7   r8   r9   Úcompiler  r:   r;   r<   r=   Ú	RE_ASSERTr>   r;  r?   r@  r@   rA   rB   rC   rD   rE   rF   ri  rG   ÚPYTORCH_TRIEr˜  ÚobjectÚmappingrˆ  Ú	TypeErrorrÀ  ÚsrcÚdstrr   r•  r¿  rÁ  rÂ  rÃ  rÄ  rH   rI   rJ   rK   Ú
RE_INCLUDErL   rM   rN   r   r   r   ú<module>r     s  ðòó0 Û Û 	Û Û 
Û 	Û å 6Ý 5Ý 6å $ß -Ý Û Û ògô�4ô ÷Dñ Dð ˜˜lÐ*Ñ+Ð ØTÐ Ø)+Ð Ð&Ó +ðà!+°*Ñ=Ð òs€ô.�ô .ò1÷
ñ ÷&ñ ðD%˜ð % ó %ð9˜sð 9°ð 9¸Tó 9ò
Kð  ØØ!Ø"'Ø%*ñ#Øð#àð#ð ð#ð ð	#ð
  ð#ð #ð#ð 08¸©}ó#ðL+Øð+àð+ð ð+ð &ð	+ð
 �C˜�I‰ð+ð ð+ð #ð+ð (ð+ð ð+ð !%ó+ó2
\ò ðF �2—:‘:Ð>Ó?Ð òWòt#òLEò
Eð
 ˆB�J‰JÐ(Ó)€	òð  �—‘Ð=Ó>€òð: �2—:‘:ÐhÓiÐ òó"F-ðR	 Tó 	ð Tó ò.ð	 Tó 	ò	W÷ñ ÷\6ñ \6ñ| ‹v€Ø!#€ˆT�#�v�+ÑÓ #à#ò €GÙ�g˜wÔ'ÙÐWÓXÐXØ—M‘M“Oò ‰ˆˆSØ×Ñ˜ÔØˆ�CÒñðð %˜"Ÿ*™*¨°×1MÑ1MÓ1OÐ0PÐPWÐ%XÓYÐ à�"—*‘*Ð2Ó3€Ø�"—*‘*Ð2Ó3€Ø �b—j‘jÐ!FÓGÐ Øˆr�z‰z˜)Ó$€ððzØðzàðzð ðzð &ð	zð
 �C˜�I‰ðzð ðzð #ðzð (ðzð ðzð !-ózôx	óòð ˆR�Z‰ZÐ(Ó)€
ò)ðXD�ð D˜ó Dð  ØTØ"8ØØ$&ØØØ#ØØØ"Ø!&Ø$)Ø-1ñSØðSàðSð ðSð  ð	Sð
 ðSð "ðSð ðSð ðSð ðSð ðSð ðSð ðSð ðSð "ðSð $ dÑ*ðSð  ô!Sr   