
    9jo              !          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    `/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/utils/hipify/hipify_python.py_deprecatedr   -   s    MM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1C1C0DDVW[WiWiVjjtuy  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    ww~~b!##BGGOOB$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    GGMM"%	f-IFAav 6MM&4M0ww}}R HHRL%%bggoob&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    8Z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     Jgwx1Js    #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      MM +-'')T*J &dIggook9=#~F#$G$$M*12! 		H$RWW\\+x%HIH 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     wwrww||,<hGHH |/G/GW_`M$1!*HiATV[*,@)]\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    AFGZA[\'=	9\\ 
=cBS>TUV=W
XY 
$))%
&' 
8UCT=U9VWX8Y
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<<UBGM27(%;Qb%;H%; HUOGM* 3Q198qLG#XqLGHs=1A557a<%(AH%5HUOE"QJEqy+.7(3 "(1+g"6x{57IA7MNM"8A;w#7E8JKN#HQK$8!U9KLTTUY[]^ddehiO$Xa[%9(1+e:LMUUVZ\^_eefij_-Q/N./q1O&..O(001A?S%%mn&DFX[nFnoK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syy|nB.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)EBRS%'3"$R0
 q	  s?+G4q8"bA %	aA!9D %--3;!,12J.$K1$K3;$K1$KT{a'V{-B34J0!/ $!9$$&&)7P*P/!/45M*51 Av67M*73 "%]!3s:#oJ^`` /67M*73 "%]!3s:#oJ^``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    
 kk%,2!;;uj9L  UL9A=JQ !677 ##l:.4\:.N%P Q kk%,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.Vs]!$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    !!"OQWXF9av 0B   2=3H IJM ' 4)&1 kk#ve}5 VAYw/a@vgve}=%ay/25!1$*6!9W+=f_>UV[>\_`>`$a!#M;?'6'?+B+B5#+N+V+VW\^a+bcd*-=a-C-K-K5AK(50.229'%2Fww4H !:CB[<[^a<abc

 &--k:F 	 ''
3144 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NGU
L!
!a(!U*%)"!#%(*/AaKF{~%q L!
!  r   c                 "    t        | |ddg      S )z%Finds the first balanced parentheses.{}r   r;   r%  r   s     r   r<   r<         lE#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# \%--$qk>QRV>W=XXY;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299C5C53]C
Ws   '*hipLaunchKernelGGL
__global__
__shared__Nz#include "hip/hip_runtime.h"
)r   RE_SYNCTHREADSr6  )r%  headershasDeviceLogicr  s      @r   r?   r?     s     !M #$;<G

Ww
WW *]:Nlm33Nlm33Nn++M:$FFN 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,*<")=Qsyy|nBsyyYZ|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    
ww}}\"CDD(El3GX  *ID#H e|MLoofe,Goofe,GooeU+G<<&D<<&D-||E5)G|$;'',,w.< 7TCZM<Yf}77<<,,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    	ww}}\"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    !"	ww}}\"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    $%	ww}}\"CDDz*ww-HWWh'FAsX7!7VgX>UVr   c                       e Zd ZdZddZy)TrieNodezA 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   zCreates 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
zz((*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    

$++-(zz((*yy 	'DMM$$T8:6==&D	' !br   c                     | j                   S )zReturn the root node of Trie. )rQ  r)   s    r   dumpz	Trie.dump  s    yyr   c                 ,    t        j                  |      S )z Escape a char for regex. )r5  escape)r&   r  s     r   quotez
Trie.quote  s    yy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     yy 	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)zConvert 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    3t}}'9'9';#<#A4==--/0 	D$---x80"mmDMM$,?NGJJtzz$/'9: 	 X\!r7Q;2w!|

2a5!

3,s23s8q=VFSXXc]*S0F#  vhb)- ! 0IIdjj./0s   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      }}TYY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    1771:&&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 rt        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 rt        |   }|j                  t        j                   k(  rt        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     ,UaQZZ-A,Ur   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ww''*H & ' e$Q\\&-A||$5aggajBV$WXX$,U9,U)U!
"&&*,''//(*C'+-77??277<<H[]^;_+`(ww~~&:;%8
*>"*.A C*.0ggll;KM_.`+/1wwrww||L_ab?c/d,77>>*>?)<J.BOC #*771:%"*==34D4C4=?RTY[k4H)Ubd %(;;$7$HM$22l6N6NN*,''///K[*\+-77??277<<HXHYZik  IA<B ,C(6F3?L+O<$||BGGOOP`Pl<LR\-^  _ _APR\-^  _ _+>+O+]+](||M"''//^v  _CBZGVXb3d %e f f 771: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    wwrww||,<hGHHX&H'1My &*#>&2&7&7# ;K!LML	h	) #S<<>00*.M'#HM *6*;*;M' # # 	
# ' -=?PQ]_s?t uvI77>>"''//)45277??956' ,//GM  499; G	8 h7)#; $bii	&::GFF7HmDM *11)XFMG; ;x $''0@$(GWM#''0@%(H-XM'++G4T,UWdeM )*%--fe<%--eU;$((? -mUC 	/*80K.}= %]3M 	-/GGOOH%)CC&.#6&2&7&7# 9!1(<n!o+m;H	ww~~i )g. 	8(}}-7H	8	!	3A *T

=)**3M'#)M *6*;*;M'   '0#<&2&7&7#I# #^	8 	8* *  	!W__%_YKwqzzlR]^f]ggrszss  sA  Bzz#*2M'#>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	 !668vvRYY}%=$>cBD\^fgH''~FH	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	 !668!9r
c 1]Fxs+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*SMQM$%,SMQM$%,SMQM$%,8H18L1MQT1TYabeYfijYjSMQM C=A(3-1"4'9BRST  C=A(3-1"4@P9QUX9X'9BRST!1A!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:     	wwy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IIK 77>>+,<=   %,v5,,X`aWGOO$57GHaU\]66>>"35EF] 77>>*+)+;<Cx01H3}g./G'(8807J:K=QS TI 	NM  ww}}Q-q1AM!Q	  1 

77==+,&*+=&>#&*277<<8HJ\+]&^# 
"9"?"?"D
 	


 (DA	 46"ME&=Y; q'(8(IOb(-/?AUW`bo	qq 
'//K
Kgll
Zadakak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% % %9s 9 9T 9
K  !"'%*### # 	#
  # ## 08}#L+++ + &	+
 CI+ + #+ (+ + !%+2
\ F 2::>? Wt#LE
E
 BJJ()	  =>: 2::hi "F-R	T 	T .	T 		W \6 \6| v!#T#v+ ## Ggw'WXXMMO SC %"**1M1M1O0PPW%XY "**23"**23 bjj!FG rzz)$zzz z &	z
 CIz z #z (z z !-zx	 RZZ()
)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   