U
    <ºcã¤  ã                   @   sÞ  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mZ ddl	m
Z
 ddl	mZ ddlmZmZmZmZ ddlmZmZ eeee f Zeeef Zd	Zi Zeed
< dddœZdddddddddddddddddddd d!d!d"d#d$d%d&d'd(d)gZG d*d„ deƒZd+d„ ZG d,d„ dƒZG d-d„ dƒZ eee!d.œd/d„Z"d0d1„ Z#d_eeeee!e!ee d4œd5d„Z$eeeeeeef e!e!e e!dd6œ
d7d„Z%d8d„ Z&d9d„ Z'e (d:¡Z)d;d„ Z*d<d„ Z+d=d„ Z,d>d„ Z-e (d?¡Z.d@d„ Z/e (dA¡Z0dBd„ Z1e (dC¡Z2dDd„ Z3d`dEd„Z4dFd„ Z5dGd„ Z6dHd „ Z7dId!„ Z8G dJd"„ d"ƒZ9e9ƒ Z:i Z;e9ƒ Z<i Z=eee>f edK< i Z?e
D ]žZ@eAe@eƒsvtB‚e@ C¡ D ]~\ZDZEeEd ZFeEdd… ZGejHeGkrÜe< IeD¡ ejJeGkrÔe= KeDdL¡rÔeFe?eD< neFe=eD< ejLeGkr~e: IeD¡ eFe;eD< q~qbe (e: M¡ ¡ZNe (dM Oe< M¡ ¡¡ZPe (dN¡ZQe (dO¡ZRe (dP¡ZSe (dQ¡ZTeeeeeeef e!e!e e!ed6œ
dRd#„ZUdadSd$„ZVdTd%„ ZWdUd&„ ZXe (dV¡ZYdWd'„ ZZdXd(„ Z[dbee!eeeeeee!ee!e!e!e!ee  ed]œd^d)„Z\dS )ca   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é   )Ú	constants)ÚCUDA_TO_HIP_MAPPINGS)ÚMATH_TRANSPILATIONS)ÚDictÚListÚIteratorÚOptional)ÚMappingÚIterablez;// !!! This is a file automatically generated by hipify!!!
ÚHIPIFY_FINAL_RESULTZscalar_t)Z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_caffe2_gpu_fileÚTrieÚpreprocessorÚfile_specific_replacementÚfile_add_headerÚfix_static_global_kernelsÚextract_argumentsÚstr2boolÚhipifyc                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )r   c                    s   t t| ƒ |¡ || _d S ©N)Úsuperr   Ú__init__Úmessage)Úselfr.   ©Ú	__class__© úD/tmp/pip-unpacked-wheel-gikjz4vx/torch/utils/hipify/hipify_python.pyr-   ;   s    zInputError.__init__c                 C   s   d  d| j¡S )Nz{}: {}zInput error)Úformatr.   ©r/   r2   r2   r3   Ú__str__?   s    zInputError.__str__)Ú__name__Ú
__module__Ú__qualname__r-   r6   Ú__classcell__r2   r2   r0   r3   r   8   s   c                 C   s   t | |ddS )NÚignore)Úerrors)Úopen)ÚfilenameÚmoder2   r2   r3   r   C   s    c                   @   s,   e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
r   z[95mz[94mz[92mz[93mz[91mz[0mz[1mz[4mN)r7   r8   r9   ÚHEADERZOKBLUEÚOKGREENÚWARNINGÚFAILÚENDCZBOLDZ	UNDERLINEr2   r2   r2   r3   r   H   s   c                   @   s<   e Zd ZdZddd„Zdd„ Zdd„ Zdd	d
„Zdd„ ZdS )r   z+Context Manager to clean up generated filesFc                 C   s   || _ tƒ | _g | _d S r+   )Úkeep_intermediatesÚsetÚfiles_to_cleanÚdirs_to_clean)r/   rE   r2   r2   r3   r-   \   s    zGeneratedFileCleaner.__init__c                 C   s   | S r+   r2   r5   r2   r2   r3   Ú	__enter__a   s    zGeneratedFileCleaner.__enter__c                 O   s0   t j |¡s | j t j |¡¡ t|f|ž|ŽS r+   )ÚosÚpathÚexistsrG   ÚaddÚabspathr=   )r/   ÚfnÚargsÚkwargsr2   r2   r3   r=   d   s    zGeneratedFileCleaner.openc                 C   sx   t j |¡\}}|s$t j |¡\}}|rF|rFt j |¡sF| j|dd t j |¡rV|stt  |¡ | j t j 	|¡¡ d S )NT)Úexist_ok)
rJ   rK   ÚsplitrL   ÚmakedirsÚisdirÚmkdirrH   ÚappendrN   )r/   ÚdnrR   ÚparentÚnr2   r2   r3   rT   i   s    
zGeneratedFileCleaner.makedirsc                 C   s@   | j s<| jD ]}t |¡ q| jd d d… D ]}t |¡ q,d S )Néÿÿÿÿ)rE   rG   rJ   ÚunlinkrH   Úrmdir)r/   ÚtypeÚvalueÚ	tracebackÚfÚdr2   r2   r3   Ú__exit__s   s
    
zGeneratedFileCleaner.__exit__N)F)F)	r7   r8   r9   Ú__doc__r-   rI   r=   rT   rc   r2   r2   r2   r3   r   Z   s   


)r>   Ú
extensionsÚreturnc                    s   t ‡ fdd„|D ƒƒS )z<Helper method to see if filename ends with certain extensionc                 3   s   | ]}ˆ   |¡V  qd S r+   ©Úendswith)Ú.0Úe©r>   r2   r3   Ú	<genexpr>|   s     z#match_extensions.<locals>.<genexpr>©Úany)r>   re   r2   rk   r3   r   z   s    c                    s   t ‡ fdd„|D ƒƒS )Nc                 3   s   | ]}t   ˆ |¡V  qd S r+   )Úfnmatch)ri   Úpattern©Úfilepathr2   r3   rl      s     z_fnmatch.<locals>.<genexpr>rm   )rr   Úpatternsr2   rq   r3   Ú_fnmatch~   s    rt   r2   F)Ú	root_pathÚincludesÚignoresre   Úout_of_place_onlyÚis_pytorch_extensionrf   c                 c   sè   t |ƒ}tj| ddD ]Ì\}}}	tj || ¡}
|
dkrld|krH| d¡ d|krZ| d¡ d|krl| d¡ |	D ]p}tj ||¡}tj |
|¡}t||ƒrpt||ƒspt||ƒs¶||krp|sÚt	|ƒsÌt
|ƒsÌqp|rÚt|ƒsÚqp|V  qpqd S )NT)ÚtopdownÚ.z.gitÚbuildZthird_party)rF   rJ   ÚwalkrK   ÚrelpathÚremoveÚjoinrt   r   r    r"   r   )ru   rv   rw   re   rx   ry   Zexact_matchesZabs_dirpathÚdirsÚ	filenamesZrel_dirpathr>   rr   Úrel_filepathr2   r2   r3   r      s6    


ÿþýý)
Úoutput_directoryrr   Ú	all_filesÚheader_include_dirsÚstatsÚhip_clang_launchry   Ú	clean_ctxÚshow_progressrf   c	              
   C   sh   t | ||||||||ƒ	}	tj tj | |¡¡}
|r\dt|	d ƒkr\t|
d|	d |	d dd |	t|
< d S )NZignoredÚstatusz->Úhipified_pathT)Úflush)r$   rJ   rK   rN   r€   ÚstrÚprintr   )r„   rr   r…   r†   r‡   rˆ   ry   r‰   rŠ   ÚresultÚfin_pathr2   r2   r3   r   ¬   s     
   ÿ   þc                 C   sL   dd„ | d D ƒ}t d t|ƒ¡ƒ t d |¡ƒ t d t| d ƒ¡ƒ d S )Nc                 S   s   h | ]\}}|’qS r2   r2   )ri   Z	cuda_callZ	_filepathr2   r2   r3   Ú	<setcomp>Ä   s     z compute_stats.<locals>.<setcomp>Úunsupported_callsz6Total number of unsupported CUDA function calls: {0:d}ú, z0
Total number of replaced kernel launches: {0:d}Úkernel_launches)r   r4   Úlenr€   )r‡   r“   r2   r2   r3   r   Ã   s    c                 C   s¢  d}d}|   dd¡  dd¡} dd„ tdƒD ƒ}d|| d< t| ƒD ]Š\}}|d	krV qÎ|d
krh|d	7 }n|dkrx|d	8 }|dks|t| ƒd	 krB|dkrB||dk || d< |d	7 }|dk rB|d	 || d< qB| |d d |d d d	 … }| |d	 d |d	 d … }| |d d |d d …   dd¡ d¡}	| |d	 d |d	 d …   dd¡ d¡}
d |	¡}d |
¡}|  |	|¡}|  |
|¡}|  || || ¡}|S )zBadds dim3() to the second and third arguments in the kernel launchr   ú<<<Ú ú>>>c                 S   s   g | ]}i ‘qS r2   r2   )ri   Ú_r2   r2   r3   Ú
<listcomp>Õ   s     zadd_dim3.<locals>.<listcomp>é   Ústartr   ú(ú)ú,ÚendÚ
ú zdim3({}))ÚreplaceÚrangeÚ	enumerater–   Ústripr4   )Úkernel_stringÚcuda_kernelÚcountÚclosureZarg_locsÚindÚcZfirst_arg_rawZsecond_arg_rawZfirst_arg_cleanZsecond_arg_cleanZfirst_arg_dim3Zsecond_arg_dim3Zfirst_arg_raw_dim3Zsecond_arg_raw_dim3r2   r2   r3   r   Ð   s6    
  **

z([ ]+)(detail?)::[ ]+\\\n[ ]+c                    sV  t  dd„ ˆ ¡‰ ‡ fdd„}dd„ }dd„ }t||ˆ ƒƒƒ}ˆ }|D ]
}||ƒ}ˆ  d	|d
 ¡}	ˆ |d d |	d … }
ˆ |d |d
 … }|d d
 dkr¢dnd}ˆ |d d || d
 d … }t||
ƒ}ttd|d  dd	¡ dd¡ƒƒ}d|dd…  ddd|  d ¡ dd¡ dd¡ |d	| d ¡ }| |
|¡}|d  |¡ qD|S )zK Replace the CUDA style Kernel launches with the HIP style kernel launches.c                 S   s   d  |  d¡|  d¡¡S )Nz{0}{1}::r   rœ   ©r4   Úgroup©Úinpr2   r2   r3   Ú<lambda>ù   ó    z'processKernelLaunches.<locals>.<lambda>c           
         sˆ  | d | d dœdddœdddœdœ}ddi}d}d}d	}d
}|}t |d d d ddƒD ]&}ˆ | }	||ksx||krä|	dkr¨||kr˜|}||d d< |d  d7  < |	dkrä|d  d8  < |d dkrä||krä||d d< |}||krZˆ |  ¡ sˆ | dkrT||kr"|}||d d< |dkr‚d|d d< |d |d |d g  S qZ||krZ||d d< |d |d |d g  S qZd S )Nr   r¡   ©r   r¡   r[   )Úkernel_launchÚkernel_nameÚtemplatez<>r   r   rœ   é   rµ   ú>r·   ú<>   rŸ   ú:ú#rž   rš   r¶   )r¥   Úisalnum)
Z	in_kernelÚposrª   ÚSTARTZAT_TEMPLATEZAFTER_TEMPLATEZAT_KERNEL_NAMEr‹   ÚiÚchar©Ústringr2   r3   Úgrab_method_and_templateû   sD    ý

z7processKernelLaunches.<locals>.grab_method_and_templatec                 S   sd   d}g }|   d|¡dkr`|   d|¡}|   d|¡d }|dkrDtdƒ‚| ||| ||… dœ¡ q|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¯   )Úfindr   rW   )rÃ   Z
kernel_endZkernel_positionsZkernel_startr2   r2   r3   Úfind_kernel_bounds6  s    
ÿ
z1processKernelLaunches.<locals>.find_kernel_boundsc                 S   sâ   d}d}d}| D ]Ì}|dkrf|dkr2|dkr2d}q¾|dkrH|dkrHd}q¾|dkr¾|dkr¾|dkr¾d}nX|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kr¾d}|}|dkrÔ||7 }q|d7 }q|S )Nr˜   ú/z//Ú*z/*ú"ú\ú'úr¢   Úxr2   )rÃ   Z
in_commentZprev_cZ
new_stringr­   r2   r2   r3   Úmask_commentsN  s2    

z,processKernelLaunches.<locals>.mask_commentsrž   r¡   r   r   r   r[   r¯   r—   r™   rŸ   zhipLaunchKernelGGL(z, 0é   r”   r•   )	ÚRE_KERNEL_LAUNCHÚsubÚlistrÅ   r   r–   r(   r¤   rW   )rÃ   r‡   rÄ   rÆ   rÎ   Zget_kernel_positionsÚoutput_stringÚkernelÚparamsZparenthesisr©   r¨   Zend_param_indexZkernel_name_with_templateZcuda_kernel_dim3Znum_klpZ
hip_kernelr2   rÂ   r3   r   ö   s>    ;!
 
" ÿ ÿ þ 
þc                 C   sŽ   d}d}|}d\}}|t | ƒk rŠ| | |d krP|dkrFd}d}|}q€|d7 }n0| | |d kr€|r€|d8 }|dkr€|}||fS |d7 }qdS )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, ["(", ")"])

    Returns:
        0, 3
    Fr   )r[   r[   Tr   )NN)r–   )Úinput_stringr   r¯   Zinside_parenthesisÚparensr¾   Zp_startZp_endr2   r2   r3   r     s$    

c                 C   s   t | |ddgdS )z%Finds the first balanced parantheses.Ú{Ú}©r¯   ©r   ©rÖ   r   r2   r2   r3   r   ¸  s    c                 C   s   t | |ddgdS )z!Finds the first balanced bracket.rž   rŸ   rÚ   rÛ   rÜ   r2   r2   r3   r   ½  s    z\bassert[ ]*\(c                 C   s.   | }t D ] }| d |¡d t | ¡¡}q|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

    z{}()r   r¤   r4   )rÖ   rÓ   Úfuncr2   r2   r3   r   Å  s    	z:?:?\b(__syncthreads)\b(\w*\()c                    sh   | ‰ ddg}t ‡ fdd„|D ƒƒr&ˆ S dˆ k}|dˆ k7 }|dˆ k7 }|t ˆ ¡dk	7 }|rdd	|  ‰ ˆ 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   s    | ]}t  d  |¡ˆ ¡V  qdS )z#include ("{0}"|<{0}>)N)ÚreÚsearchr4   )ri   Úext©rÓ   r2   r3   rl   ä  s     z#hip_header_magic.<locals>.<genexpr>ZhipLaunchKernelGGLÚ
__global__Z
__shared__Nz#include "hip/hip_runtime.h"
)rn   ÚRE_SYNCTHREADSrß   )rÖ   ÚheadersZhasDeviceLogicr2   rá   r3   r   Ø  s    zGextern\s+([\w\(\)]+)?\s*__shared__\s+([\w:<>\s]+)\s+(\w+)\s*\[\s*\]\s*;c                 C   s   | }t  dd„ |¡}|S )a  Match extern __shared__ type foo[]; syntax and use HIP_DYNAMIC_SHARED() MACRO instead.
       https://github.com/ROCm-Developer-Tools/HIP/blob/master/docs/markdown/hip_kernel_language.md#__shared__
    Example:
        "extern __shared__ char smemChar[];" => "HIP_DYNAMIC_SHARED( char, smemChar)"
        "extern __shared__ unsigned char smem[];" => "HIP_DYNAMIC_SHARED( unsigned char, my_smem)"
    c                 S   s$   d  |  d¡pd|  d¡|  d¡¡S )Nz HIP_DYNAMIC_SHARED({0} {1}, {2})r   r˜   rœ   r¸   r®   r°   r2   r2   r3   r²     s     ÿz'replace_extern_shared.<locals>.<lambda>)ÚRE_EXTERN_SHAREDrÑ   )rÖ   rÓ   r2   r2   r3   r   ø  s    þc                 C   sð   t j | ¡rt‚|s t| ƒs | S t j | ¡\}}t j |¡\}}|dkrLd}|}|}| dd¡}| dd¡}| dd¡}| dd¡}| dd¡}|d	kr¤| dd¡}|s¾||kr¾t j |d¡}|rÞ||krÞ|| |krÞ|d
 }t j ||| ¡S )z3
    Returns the new name of the hipified file
    ú.cuú.hipZcudaZhipÚCUDAÚHIPÚTHCÚTHHzcaffe2/coreZ_hip)	rJ   rK   ÚisabsÚAssertionErrorr   rS   Úsplitextr¤   r€   )rƒ   ry   Údirpathr>   Úrootrà   Úorig_filenameZorig_dirpathr2   r2   r3   r     s*    $c                 C   s0   t j | ¡rt‚|  d¡rdS |  d¡r,dS dS )Nútorch/Fútools/autograd/templates/T©rJ   rK   rì   rí   Ú
startswith©rƒ   r2   r2   r3   r   O  s    

c                 C   sL   t j | ¡rt‚|  d¡r,|  d¡r(dS dS |  d¡r:dS |  d¡rHdS dS )Nzaten/zaten/src/ATen/core/FTrò   ró   rô   rö   r2   r2   r3   r    Y  s    



c                 C   s   t | ƒrd|  ¡ kS dS )NÚsparseF)r    Úlowerrö   r2   r2   r3   r!   f  s    c                 C   sR   t j | ¡rt‚|  d¡rdS t j | ¡}t j |¡\}}d|ksJ|dkoPd|kS )Nzc10/cudaTZgpu)ræ   ú.cuhZcudnn)rJ   rK   rì   rí   rõ   Úbasenamerî   )rƒ   r>   rš   rà   r2   r2   r3   r"   k  s    
c                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )r#   zºRegex::Trie in Python. 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.c                 C   s
   i | _ d S r+   ©Údatar5   r2   r2   r3   r-   y  s    zTrie.__init__c                 C   s<   | j }|D ]$}||kr|| p i ||< || }q
d|d< d S )Nr   r˜   rû   )r/   ÚwordÚrefrÁ   r2   r2   r3   rM   |  s
    
zTrie.addc                 C   s   | j S r+   rû   r5   r2   r2   r3   Údumpƒ  s    z	Trie.dumpc                 C   s
   t  |¡S r+   )rÞ   Úescape)r/   rÁ   r2   r2   r3   Úquote†  s    z
Trie.quotec           
   	   C   s8  |}d|kr t | ¡ ƒdkr d S g }g }d}t| ¡ ƒD ]d}t|| tƒr˜z&|  || ¡}| |  |¡| ¡ W qœ tk
r”   | |  |¡¡ Y qœX q8d}q8t |ƒdk }t |ƒdkrìt |ƒdkrÔ| |d ¡ n| dd 	|¡ d ¡ t |ƒdkr|d }	ndd 	|¡ d }	|r4|r,|	d	7 }	nd
|	 }	|	S )Nr˜   r   r   ú[ú]z(?:ú|rŸ   ú?z(?:%s)?)
r–   ÚkeysÚsortedÚ
isinstanceÚdictÚ_patternrW   r  Ú	Exceptionr€   )
r/   ZpDatarü   ZaltÚccÚqrÁ   ZrecurseZcconlyr   r2   r2   r3   r
  ‰  s6    

zTrie._patternc                 C   s   |   |  ¡ ¡S r+   )r
  rÿ   r5   r2   r2   r3   rp   ®  s    zTrie.patternN)
r7   r8   r9   rd   r-   rM   rÿ   r  r
  rp   r2   r2   r2   r3   r#   u  s   %ÚPYTORCH_MAPr˜   z(?<=\W)({0})(?=\W)z#include "([^"]+)"z#include <([^>]+)>z"#define THC_GENERIC_FILE "([^"]+)"z\.cu\bc	                    s.  |ˆ krdddœS t j t j ˆ|¡¡‰t j |ˆ¡}	tˆddd:}
|
 ¡ tkrhdddœW  5 Q R £ S |
 d¡ |
 	¡ }W 5 Q R X |}t j t j ˆt
|	ˆƒ¡¡}t j t j |¡¡sÊˆ t j |¡¡ d	d
„ ‰‡fdd„}ˆrðt ˆ|¡}nDt|	ƒrt ||¡}n,t|	ƒr t ˆ|¡}ndd„ }t ||¡}d*‡ ‡‡‡‡‡‡‡‡	f	dd„	}t |ddƒ|¡}t |ddƒ|¡}t |dƒ|¡}| d¡r¶| dd¡}| dd¡}t d|¡}ˆsÆt|ˆ	ƒ}| d¡sÞ| d¡rðd|krðt|ƒ}t|ƒ}ˆr,||kr,t j ˆ¡t j |¡kr,ˆddœS ˆ|krJtˆd ƒrJt| }d}t j |¡r‚t|ddd}| 	¡ |k}W 5 Q R X |r z2ˆj|d!dd}| |¡ W 5 Q R X |d"dœW S  tk
r } zBtt j!› d#|› d$|j"› d%ˆ› d&t j#› 	t$j%d' ˆd(dœ W Y ¢S d}~X Y nX n
|d)dœS dS )+z< Executes the CUDA -> HIP conversion on the specified file. Nz[ignored, not to be hipified])rŒ   r‹   Úrzutf-8)Úencodingz#[ignored, input is hipified output]r   c                 S   s   t |  d¡ S ©Nr   )r  r¯   ©Úmr2   r2   r3   Úpt_replþ  s    zpreprocessor.<locals>.pt_replc                    s   t  |  d¡ˆ | ƒ¡S r  )ÚPYTORCH_SPARSE_MAPÚgetr¯   r  )r  r2   r3   Úpt_sparse_repl  s    z$preprocessor.<locals>.pt_sparse_replc                 S   s   t |  d¡ S r  )Ú
CAFFE2_MAPr¯   r  r2   r2   r3   Úc2_repl  s    zpreprocessor.<locals>.c2_replTc                    s$   ‡‡‡‡‡‡ ‡‡‡	‡
‡fdd„}|S )Nc           	   
      s¤  |   d¡}tj |¡\}‰ | d¡st| d¡st| d¡st| d¡st| d¡st| d¡st| d¡st| d	¡rŠ| d
¡sŠˆ t|   d¡ˆƒ¡S ˆršt‡ fdd„ˆD ƒƒršd }d }ˆrêtj ˆ¡}tj 	tj 
||¡¡}tj |¡rê|}|}|d kr6ˆD ]<}tj 
ˆ|¡}tj 	tj 
||¡¡}tj |¡rø|}|}qø|d krJ|   d¡S |tkrltˆ|ˆˆˆ
ˆˆˆˆ	ƒ	 t| d }ˆ tj |d k	r|n||¡¡S |   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/rê   ZTHCPc                 3   s   | ]}|  ˆ ¡V  qd S r+   rg   )ri   Úsrk   r2   r3   rl   "  s     z>preprocessor.<locals>.mk_repl.<locals>.repl.<locals>.<genexpr>r   rŒ   )r¯   rJ   rK   rS   rõ   r4   r   rn   ÚdirnamerN   r€   rL   r   r   r~   )	r  ra   rï   Ú
header_dirZheader_filepathZheader_dir_to_checkZheader_path_to_checkÚheader_include_dirZhipified_header_filepath)r…   r‰   r‘   r†   rˆ   Úinclude_current_dirry   r„   rŠ   r‡   Útemplrk   r3   Úrepl  sp    
ÿþýüûúùøø




     ý ÿz+preprocessor.<locals>.mk_repl.<locals>.replr2   )r  r  r   )	r…   r‰   r‘   r†   rˆ   ry   r„   rŠ   r‡   )r  r  r3   Úmk_repl  s     /zpreprocessor.<locals>.mk_replz#include "{0}"z#include <{0}>Fz#define THC_GENERIC_FILE "{0}"zCMakeLists.txtrè   ré   rê   rë   rç   ræ   rù   Z	PowKernelz[skipped, no changes])ræ   rù   ú.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)&rJ   rK   rN   r€   r~   r=   ÚreadlineÚHIPIFY_C_BREADCRUMBÚseekÚreadr   rL   r  rT   ÚRE_PYTORCH_PREPROCESSORrÑ   r!   r    ÚRE_CAFFE2_PREPROCESSORÚRE_QUOTE_HEADERÚRE_ANGLE_HEADERÚRE_THC_GENERIC_FILErh   r¤   ÚRE_CU_SUFFIXr   r   r   r   ÚwriteÚPermissionErrorr   r   rB   ÚstrerrorrD   ÚsysÚstderr)r„   rr   r…   r†   r‡   rˆ   ry   r‰   rŠ   rƒ   ZfinZoutput_sourceZorig_output_sourceZ	fout_pathr  r  r!  Zdo_writeZfout_oldZfoutrj   r2   )
r…   r‰   r‘   r†   rˆ   ry   r„   r  rŠ   r‡   r3   r$   ß  sx    



1
"ÿþý
&ÿ"c              	      sr   t | dƒ^}| ¡ }|r<t d t |¡¡‡ fdd„|¡}n| |ˆ ¡}| d¡ | |¡ | 	¡  W 5 Q R X d S )Núr+z	\b({0})\bc                    s   ˆ S r+   r2   )rÍ   ©Úreplace_stringr2   r3   r²   |  r³   z+file_specific_replacement.<locals>.<lambda>r   )
r   r-  rÞ   rÑ   r4   r   r¤   r,  r4  Útruncate)rr   Zsearch_stringr;  Ústrictra   Úcontentsr2   r:  r3   r%   x  s    $

c              	   C   sn   t | dƒZ}| ¡ }|d dkr6|d dkr6d |¡}d |¡| }| d¡ | |¡ | ¡  W 5 Q R X d S )Nr9  r   rº   r[   r¹   z"{0}"z#include {0} 
)r   r-  r4   r,  r4  r<  )rr   Úheaderra   r>  r2   r2   r3   r&   „  s    


c                 C   s   |   dd¡} | S )z<Static global kernels in HIP results in a compilation error.z __global__ staticrâ   ©r¤   )Zin_txtr2   r2   r3   r'     s    z#include .*\nc                 C   s6  g }dddœ}| }|d }|t |ƒk r2|| dkrF|d  d7  < nt|| dkrd|d  d8  < nV|| dkr‚|d  d7  < n8|| dkrº||d  dkrº|d dkrº|d  d8  < |d dkræ|d dkræ| ||d	œ¡ q2|d dkr(|d dkr(|| d
kr(| ||d	œ¡ |d }|d7 }q|S )ad   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–   rW   )r   rÃ   Ú	argumentsZclosuresÚcurrent_positionZargument_start_posr2   r2   r3   r(   ˜  s.    þ(*
c                 C   s.   |   ¡ dkrdS |   ¡ dkr dS t d¡‚dS )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Úfalsera   rZ   Ú0FzBoolean value expected.N)rø   ÚargparseÚArgumentTypeError)Úvr2   r2   r3   r)   Æ  s
    ©ræ   rù   r"  r#  r$  r%  z.inr&  ©rù   r%  r&  ©rÈ   T)Úproject_directoryÚshow_detailedre   Úheader_extensionsr„   r†   rv   Úextra_filesrx   rw   rŠ   rˆ   ry   Úhipify_extra_files_onlyr‰   rf   c                    sò  ˆdkrt  ¡ ‰t j ˆ¡s.tdƒ t d¡ ˆ sDˆ d¡ ˆd ‰ ˆˆ krt‡ ‡fdd„|D ƒ}‡ ‡fdd„|	D ƒ}	t j ˆ ¡sŒt 	ˆˆ ¡ t
tˆ ||	|||d	ƒ}t|ƒ}|D ]0}t j |¡sÎt j ˆ |¡}||kr°| |¡ q°d
dlm} |D ]†}t j |¡r||ƒ}n|t j ˆ |¡ƒ}| d¡D ]L}| ¡ r*tt|ƒ|ƒr*tt|ƒ|	ƒs*t|j|ƒr*| t|ƒ¡ q*qò|d krŽtdd}g g dœ}|s¢|n|D ]}tˆ ||||||||
ƒ	 q¦ttjd tj tjd |rît|ƒ tS )Nr˜   z,The project folder specified does not exist.r   rÇ   Z_amdc                    s   g | ]}|  ˆˆ ¡‘qS r2   r@  )ri   Úinclude©r„   rR  r2   r3   r›   ð  s     zhipify.<locals>.<listcomp>c                    s   g | ]}|  ˆˆ ¡‘qS r2   r@  )ri   r;   rX  r2   r3   r›   ñ  s     )rv   rw   re   rx   ry   r   )ÚPathrÈ   T)rE   )r“   r•   z-Successfully preprocessed all matching files.r(  ) rJ   ÚgetcwdrK   rL   r   r7  ÚexitÚrstripÚshutilÚcopytreerÒ   r   rF   rì   r€   rW   ÚpathlibrY  ÚrglobÚis_filert   rŽ   r   Únamer   r   r   rA   rD   r8  r   r   )rR  rS  re   rT  r„   r†   rv   rU  rx   rw   rŠ   rˆ   ry   rV  r‰   r…   Zall_files_setra   rY  r  Zheader_include_dir_pathrK   r‡   rr   r2   rX  r3   r*   Ñ  sn    

 ý
ÿþý
ü



    ÿ)r2   r2   r2   FF)F)F)FrO  rP  r˜   r2   rQ  r2   Fr2   TFFFN)]rd   rL  ro   rÞ   r]  r7  rJ   r˜   r   Zcuda_to_hip_mappingsr   r   Útypingr   r   r   r	   Úcollections.abcr
   r   rŽ   ZHipifyResultZHipifyFinalResultr+  r   Ú__annotations__ZPYTORCH_TEMPLATE_MAPÚ__all__r  r   r   r   r   Úboolr   rt   r   r   r   r   ÚcompilerÐ   r   r   r   r   Z	RE_ASSERTr   rã   r   rå   r   r   r   r    r!   r"   r#   ZCAFFE2_TRIEr  ZPYTORCH_TRIEr  Úobjectr  Úmappingr  rí   ÚitemsÚsrcr_   ÚdstZ	meta_dataZ
API_CAFFE2rM   Z
API_SPARSEr  ZAPI_PYTORCHrp   r/  r4   r.  r0  r1  r2  r3  r$   r%   r&   r'   Z
RE_INCLUDEr(   r)   r*   r2   r2   r2   r3   Ú<module>   sN  
                   û      ú ú,
 ÷#
 (



H

=	








 ÷ 

.              ñð