U
    ‰d¢  ã                   @   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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!dd„ Z"d_eeeee e ee dœdd„Z#eeeeeeef e e ee ddœ
d d!„Z$d"d#„ Z%d$d%„ Z&e 'd&¡Z(d'd(„ Z)d)d*„ Z*d+d,„ Z+d-d.„ Z,e 'd/¡Z-d0d1„ Z.e 'd2¡Z/d3d4„ Z0e 'd5¡Z1d6d7„ Z2d`d8d9„Z3d:d;„ Z4d<d=„ Z5d>d?„ Z6d@dA„ Z7G dBdC„ dCƒZ8e8ƒ Z9i Z:e8ƒ Z;i Z<eee=f edD< i Z>e
D ]žZ?e@e?eƒs6tA‚e? B¡ D ]~\ZCZDeDd ZEeDdd… ZFejGeFkrœe; HeC¡ ejIeFkr”e< JeCdE¡r”eEe>eC< neEe<eC< ejKeFkr>e9 HeC¡ eEe:eC< q>q"e 'e9 L¡ ¡ZMe 'dF Ne; L¡ ¡¡ZOe 'dG¡ZPe 'dH¡ZQe 'dI¡ZRe 'dJ¡ZSeeeeeeef e e ee edœ
dKdL„ZTdadMdN„ZUdOdP„ ZVdQdR„ ZWe 'dS¡ZXdTdU„ ZYdVdW„ ZZdbe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ÚTc                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )Ú
InputErrorc                    s   t t| ƒ |¡ || _d S ©N)Úsuperr   Ú__init__Úmessage)Úselfr   ©Ú	__class__© úD/tmp/pip-unpacked-wheel-ua33x9lu/torch/utils/hipify/hipify_python.pyr   5   s    zInputError.__init__c                 C   s   d  d| j¡S )Nz{}: {}zInput error)Úformatr   ©r   r   r   r   Ú__str__9   s    zInputError.__str__)Ú__name__Ú
__module__Ú__qualname__r   r   Ú__classcell__r   r   r   r   r   2   s   r   c                 C   s   t | |ddS )NÚignore)Úerrors)Úopen)ÚfilenameÚmoder   r   r   Úopenf=   s    r$   c                   @   s,   e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
Úbcolorsz[95mz[94mz[92mz[93mz[91mz[0mz[1mz[4mN)r   r   r   ÚHEADERZOKBLUEÚOKGREENÚWARNINGÚFAILÚENDCZBOLDZ	UNDERLINEr   r   r   r   r%   B   s   r%   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 )ÚGeneratedFileCleanerz+Context Manager to clean up generated filesFc                 C   s   || _ tƒ | _g | _d S r   )Úkeep_intermediatesÚsetÚfiles_to_cleanÚdirs_to_clean)r   r,   r   r   r   r   V   s    zGeneratedFileCleaner.__init__c                 C   s   | S r   r   r   r   r   r   Ú	__enter__[   s    zGeneratedFileCleaner.__enter__c                 O   s0   t j |¡s | j t j |¡¡ t|f|ž|ŽS r   )ÚosÚpathÚexistsr.   ÚaddÚabspathr!   )r   ÚfnÚargsÚkwargsr   r   r   r!   ^   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)
r1   r2   Úsplitr3   ÚmakedirsÚisdirÚmkdirr/   Úappendr5   )r   Údnr9   ÚparentÚnr   r   r   r;   c   s    
zGeneratedFileCleaner.makedirsc                 C   s@   | j s<| jD ]}t |¡ q| jd d d… D ]}t |¡ q,d S )Néÿÿÿÿ)r,   r.   r1   Úunlinkr/   Úrmdir)r   ÚtypeÚvalueÚ	tracebackÚfÚdr   r   r   Ú__exit__m   s
    
zGeneratedFileCleaner.__exit__N)F)F)	r   r   r   Ú__doc__r   r0   r!   r;   rJ   r   r   r   r   r+   T   s   


r+   )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"   r   r   Ú	<genexpr>v   s     z#match_extensions.<locals>.<genexpr>©Úany)r"   rL   r   rR   r   Úmatch_extensionst   s    rV   c                    s   t ‡ fdd„|D ƒƒS )Nc                 3   s   | ]}t   ˆ |¡V  qd S r   )Úfnmatch)rP   Úpattern©Úfilepathr   r   rS   y   s     z_fnmatch.<locals>.<genexpr>rT   )rZ   Úpatternsr   rY   r   Ú_fnmatchx   s    r\   r   F)Ú	root_pathÚincludesÚignoresrL   Úout_of_place_onlyÚis_pytorch_extensionrM   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)r-   r1   Úwalkr2   ÚrelpathÚremoveÚjoinr\   rV   Úis_pytorch_fileÚis_caffe2_gpu_fileÚis_out_of_place)r]   r^   r_   rL   r`   ra   Zexact_matchesZabs_dirpathÚdirsÚ	filenamesZrel_dirpathr"   rZ   Úrel_filepathr   r   r   Úmatched_files_iter{   s6    


ÿþýýro   )
Úoutput_directoryrZ   Ú	all_filesÚheader_include_dirsÚstatsÚhip_clang_launchra   Ú	clean_ctxÚshow_progressrM   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)Úpreprocessorr1   r2   r5   rh   ÚstrÚprintr   )rp   rZ   rq   rr   rs   rt   ra   ru   rv   ÚresultÚfin_pathr   r   r   Úpreprocess_file_and_save_result¦   s     
   ÿ   þr   c                 C   sL   dd„ | d D ƒ}t d t|ƒ¡ƒ t d |¡ƒ t d t| d ƒ¡ƒ d S )Nc                 S   s   h | ]\}}|’qS r   r   )rP   Z	cuda_callZ	_filepathr   r   r   Ú	<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|   r   Úlenrh   )rs   r   r   r   r   Úcompute_stats½   s    r…   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 r   r   )rP   Ú_r   r   r   Ú
<listcomp>Ï   s     zadd_dim3.<locals>.<listcomp>é   Ústartr   ú(ú)ú,ÚendÚ
ú zdim3({}))ÚreplaceÚrangeÚ	enumerater„   Ústripr   )Ú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_dim3r   r   r   Úadd_dim3Ê   s6    
  **

r   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‹   ©r   Úgroup©Úinpr   r   r   Ú<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   rB   )Ú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_NAMErw   ÚiÚchar©Ústringr   r   Ú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†   rB   rˆ   r¨   zno kernel end found)rŒ   r   rŸ   )Úfindr   r>   )r³   Z
kernel_endZkernel_positionsZkernel_startr   r   r   Úfind_kernel_bounds0  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‘   Úxr   )r³   Z
in_commentZprev_cZ
new_stringrœ   r   r   r   Úmask_commentsH  s2    

z,processKernelLaunches.<locals>.mask_commentsr   r   r   rŒ   r   rB   rŸ   r†   rˆ   rŽ   zhipLaunchKernelGGL(z, 0é   r‚   rƒ   )	ÚRE_KERNEL_LAUNCHÚsubÚlistrµ   r   r„   Úextract_argumentsr“   r>   )r³   rs   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_kernelr   r²   r   ÚprocessKernelLaunchesð   s>    ;!
 
" ÿ ÿ þ 
þrÇ   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   )rB   rB   Tr   )NN)r„   )Úinput_stringrŒ   rŸ   Zinside_parenthesisÚparensr®   Zp_startZp_endr   r   r   Úfind_closure_groupŠ  s$    

rÊ   c                 C   s   t | |ddgdS )z%Finds the first balanced parantheses.Ú{Ú}©rŸ   ©rÊ   ©rÈ   rŒ   r   r   r   Úfind_bracket_group²  s    rÐ   c                 C   s   t | |ddgdS )z!Finds the first balanced bracket.r   rŽ   rÍ   rÎ   rÏ   r   r   r   Úfind_parentheses_group·  s    rÑ   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“   r   )rÈ   rÄ   Úfuncr   r   r   Úreplace_math_functions¿  s    	rÓ   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Úsearchr   )rP   Úext©rÄ   r   r   rS   Þ  s     z#hip_header_magic.<locals>.<genexpr>ZhipLaunchKernelGGLÚ
__global__Z
__shared__Nz#include "hip/hip_runtime.h"
)rU   ÚRE_SYNCTHREADSrÕ   )rÈ   ÚheadersZhasDeviceLogicr   r×   r   Úhip_header_magicÒ  s    rÛ   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    r   r   r   r¢   û  s     ÿz'replace_extern_shared.<locals>.<lambda>)ÚRE_EXTERN_SHAREDrÁ   )rÈ   rÄ   r   r   r   Úreplace_extern_sharedò  s    þrÝ   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)	r1   r2   ÚisabsÚAssertionErrorrk   r:   Úsplitextr“   rh   )rn   ra   Údirpathr"   ÚrootrÖ   Úorig_filenameZorig_dirpathr   r   r   Úget_hip_file_path  s*    $rê   c                 C   s0   t j | ¡rt‚|  d¡rdS |  d¡r,dS dS )Nútorch/Fútools/autograd/templates/T©r1   r2   rä   rå   Ú
startswith©rn   r   r   r   rk   I  s    

rk   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ï   r   r   r   ri   S  s    



ri   c                 C   s   t | ƒrd|  ¡ kS dS )NÚsparseF)ri   Úlowerrï   r   r   r   Úis_cusparse_file`  s    rò   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)r1   r2   rä   rå   rî   Úbasenameræ   )rn   r"   r‰   rÖ   r   r   r   rj   e  s    
rj   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 )ÚTriezº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   ©Údatar   r   r   r   r   s  s    zTrie.__init__c                 C   s<   | j }|D ]$}||kr|| p i ||< || }q
d|d< d S )Nr   r‡   rö   )r   ÚwordÚrefr±   r   r   r   r4   v  s
    
zTrie.addc                 C   s   | j S r   rö   r   r   r   r   Údump}  s    z	Trie.dumpc                 C   s
   t  |¡S r   )rÔ   Úescape)r   r±   r   r   r   Ú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Ú_patternr>   rü   Ú	Exceptionrh   )
r   ZpDatar÷   ZaltÚccÚqr±   ZrecurseZcconlyr}   r   r   r   r  ƒ  s6    

zTrie._patternc                 C   s   |   |  ¡ ¡S r   )r  rú   r   r   r   r   rX   ¨  s    zTrie.patternN)
r   r   r   rK   r   r4   rú   rü   r  rX   r   r   r   r   rõ   o  s   %rõ   ÚPYTORCH_MAPr‡   z(?<=\W)({0})(?=\W)z#include "([^"]+)"z#include <([^>]+)>z"#define THC_GENERIC_FILE "([^"]+)"z\.cu\bc	                    s6  |ˆ 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|ƒ}t|ƒ}ˆr4||kr4t j ˆ¡t j |¡kr4ˆddœS ˆ|krRtˆd ƒrRt| }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])rx   rw   Úrzutf-8)Úencodingz#[ignored, input is hipified output]r   c                 S   s   t |  d¡ S ©Nr   )r	  rŸ   ©Úmr   r   r   Úpt_replø  s    zpreprocessor.<locals>.pt_replc                    s   t  |  d¡ˆ | ƒ¡S r  )ÚPYTORCH_SPARSE_MAPÚgetrŸ   r  )r  r   r   Úpt_sparse_replû  s    z$preprocessor.<locals>.pt_sparse_replc                 S   s   t |  d¡ S r  )Ú
CAFFE2_MAPrŸ   r  r   r   r   Ú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   rN   )rP   ÚsrR   r   r   rS     s     z>preprocessor.<locals>.mk_repl.<locals>.repl.<locals>.<genexpr>r   rx   )rŸ   r1   r2   r:   rî   r   rê   rU   Údirnamer5   rh   r3   r   r   rf   )	r  rH   rç   Ú
header_dirZheader_filepathZheader_dir_to_checkZheader_path_to_checkÚheader_include_dirZhipified_header_filepath)rq   ru   r~   rr   rt   Úinclude_current_dirra   rp   rv   rs   ÚtemplrR   r   Úrepl  sp    
ÿþýüûúùøø




     ý ÿz+preprocessor.<locals>.mk_repl.<locals>.replr   )r  r  r  )	rq   ru   r~   rr   rt   ra   rp   rv   rs   )r  r  r   Ú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)'r1   r2   r5   rh   rf   r!   ÚreadlineÚHIPIFY_C_BREADCRUMBÚseekÚreadrê   r3   r  r;   ÚRE_PYTORCH_PREPROCESSORrÁ   rò   ri   ÚRE_CAFFE2_PREPROCESSORÚRE_QUOTE_HEADERÚRE_ANGLE_HEADERÚRE_THC_GENERIC_FILErO   r“   ÚRE_CU_SUFFIXrÇ   rÓ   rÛ   rÝ   rV   ÚwriteÚPermissionErrorr|   r%   r(   Ústrerrorr*   ÚsysÚstderr)rp   rZ   rq   rr   rs   rt   ra   ru   rv   rn   ZfinZoutput_sourceZorig_output_sourceZ	fout_pathr  r  r  Zdo_writeZfout_oldZfoutrQ   r   )
rq   ru   r~   rr   rt   ra   rp   r  rv   rs   r   rz   Ù  sz    



1
"ÿþý
&ÿ"rz   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   r   )r½   ©Úreplace_stringr   r   r¢   u  r£   z+file_specific_replacement.<locals>.<lambda>r   )
r$   r(  rÔ   rÁ   r   rû   r“   r'  r/  Útruncate)rZ   Zsearch_stringr6  ÚstrictrH   Úcontentsr   r5  r   Úfile_specific_replacementq  s    $

r:  c              	   C   sn   t | dƒZ}| ¡ }|d dkr6|d dkr6d |¡}d |¡| }| d¡ | |¡ | ¡  W 5 Q R X d S )Nr4  r   rª   rB   r©   z"{0}"z#include {0} 
)r$   r(  r   r'  r/  r7  )rZ   ÚheaderrH   r9  r   r   r   Úfile_add_header}  s    


r<  c                 C   s   |   dd¡} | S )z<Static global kernels in HIP results in a compilation error.z __global__ staticrØ   ©r“   )Zin_txtr   r   r   Úfix_static_global_kernelsˆ  s    r>  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„   r>   )rŒ   r³   Ú	argumentsZclosuresÚcurrent_positionZargument_start_posr   r   r   rÃ   ‘  s.    þ(*
rÃ   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ÚfalserH   rA   Ú0FzBoolean value expected.N)rñ   ÚargparseÚArgumentTypeError)Úvr   r   r   Ústr2bool¿  s
    rM  ©rÞ   ró   r  r  r  r   z.inr!  ©ró   r   r!  ©r¸   T)Úproject_directoryÚshow_detailedrL   Úheader_extensionsrp   rr   r^   Úextra_filesr`   r_   rv   rt   ra   Úhipify_extra_files_onlyru   rM   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 r   r=  )rP   Úinclude©rp   rQ  r   r   rŠ   é  s     zhipify.<locals>.<listcomp>c                    s   g | ]}|  ˆˆ ¡‘qS r   r=  )rP   r   rW  r   r   rŠ   ê  s     )r^   r_   rL   r`   ra   r   )ÚPathr¸   T)r,   )r   rƒ   z-Successfully preprocessed all matching files.r#  ) r1   Úgetcwdr2   r3   r|   r2  ÚexitÚrstripÚshutilÚcopytreerÂ   ro   r-   rä   rh   r>   ÚpathlibrX  ÚrglobÚis_filer\   r{   rV   Únamer+   r   r%   r'   r*   r3  r…   r   )rQ  rR  rL   rS  rp   rr   r^   rT  r`   r_   rv   rt   ra   rU  ru   rq   Zall_files_setrH   rX  r  Zheader_include_dir_pathr2   rs   rZ   r   rW  r   ÚhipifyÊ  sn    

 ý
ÿþý
ü



    ÿrb  )r   r   r   FF)F)F)FrN  rO  r‡   r   rP  r   Fr   TFFFN)\rK   rJ  rW   rÔ   r\  r2  r1   r‡   r   Zcuda_to_hip_mappingsr   r   Útypingr   r   r   r	   Úcollections.abcr
   r   r{   ZHipifyResultZHipifyFinalResultr&  r   Ú__annotations__ZPYTORCH_TEMPLATE_MAPr  r   r$   r%   r+   ÚboolrV   r\   ro   r   r…   r   ÚcompilerÀ   rÇ   rÊ   rÐ   rÑ   Z	RE_ASSERTrÓ   rÙ   rÛ   rÜ   rÝ   rê   rk   ri   rò   rj   rõ   ZCAFFE2_TRIEr  ZPYTORCH_TRIEr	  Úobjectr  Úmappingr  rå   ÚitemsÚsrcrF   ÚdstZ	meta_dataZ
API_CAFFE2r4   Z
API_SPARSEr  ZAPI_PYTORCHrX   r*  r   r)  r+  r,  r-  r.  rz   r:  r<  r>  Z
RE_INCLUDErÃ   rM  rb  r   r   r   r   Ú<module>   s  
      ú ú,
 ÷#
 (



H

=	







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