o
    ki)                  !   @   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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
d ZG dd deZG d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 deZ dd Z!G dd dZ"G dd dZ#dedefdd Z$d!ed"ede%fd#d$Z&d%d& Z'	'	'	'	(	(dd)ed*ed+ed"ed,e%d-e%dee fd.d/Z(d0ed1ed2ed3ed4eee)f d5e%d-e%d6e#d7e%ddfd8d9Z*dd:d;Z+d<d= Z,e-d>Z.d?d@ Z/dAdB Z0dCdD Z1dEdF Z2e-dGZ3dHdI Z4e-dJZ5dKdL Z6e-dMZ7dNdO Z8ddPdQZ9de%fdRdSZ:de%fdTdUZ;dVdW Z<de%fdXdYZ=dZd[ Z>G d\d] d]Z?G d^d_ d_Z@e@ ZAi ZBeeeCf ed`< e	D ] ZDeEeDesfeFdaeDG D ]\ZHZIeAJeH eIeBeH< qjqZe-dbeAK  dcZLe-ddZMe-deZNe-dfZOe-dgZP	 d0ed1ed2ed3ed4eee)f d5e%d-e%d6e#d7e%defdhdiZQdddjdkZRddldmZSdndo ZTe-dpZUdqdr ZVdsede%fdtduZW	(	v	w	x	'	y	'	(	'	z	(	(	(	dd{ed|e%d"ed}ed0ed3ed*ed~ed,e%d+ed7e%d5e%d-e%de%d6e#dB def ddZXdS )a   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                 C   s   t jd|  tdd d S )Nz-hipify version 2.0.0 no longer uses function    )
stacklevel)warningswarnFutureWarning)name r   j/var/www/addictedbytheproject.nl/epg/venv/lib/python3.10/site-packages/torch/utils/hipify/hipify_python.py_deprecated-   s   r   c                   @   s   e Zd ZdZdZdS )CurrentStater   r
   N)__name__
__module____qualname__INITIALIZEDDONEr   r   r   r   r   0   s    r   c                   @   s$   e Zd ZdddZdefddZdS )HipifyResultreturnNc                 C   s   || _ || _d| _d S )N current_statehipified_pathstatus)selfr   r   r   r   r   __init__5   s   
zHipifyResult.__init__c                 C   s   d| j  d| j d| j S )NzHipifyResult:: current_state: z, hipified_path : z
, status: r   r    r   r   r   __str__:   s   zHipifyResult.__str__r   N)r   r   r   r!   strr#   r   r   r   r   r   4   s    
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                       s,   e Zd Zd fddZdefddZ  ZS )r*   r   Nc                    s   t  | || _d S N)superr!   message)r    rJ   	__class__r   r   r!   Q   s   
zInputError.__init__c                 C   s   d| j  S )NzInput error: )rJ   r"   r   r   r   r#   U   s   zInputError.__str__r$   )r   r   r   r!   r%   r#   __classcell__r   r   rK   r   r*   N   s    r*   c                 C   s   t | |ddS )Nignore)errors)open)filenamemoder   r   r   r+   Y      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 )
r,   z[95mz[94mz[92mz[93mz[91mz[0mz[1mz[4mN)r   r   r   HEADEROKBLUEOKGREENWARNINGFAILENDCBOLD	UNDERLINEr   r   r   r   r,   ^   s    r,   c                   @   s@   e Zd ZdZddddZdd Zd	d
 ZddddZdd ZdS )r-   z+Context Manager to clean up generated filesFr   Nc                 C   s   || _ t | _g | _d S rH   )keep_intermediatessetfiles_to_cleandirs_to_clean)r    r\   r   r   r   r!   s   s   
zGeneratedFileCleaner.__init__c                 C   s   | S rH   r   r"   r   r   r   	__enter__x   s   zGeneratedFileCleaner.__enter__c                 O   s6   t j|s| jt j| t|g|R i |S rH   )ospathexistsr^   addabspathrP   )r    fnargskwargsr   r   r   rP   {   s   zGeneratedFileCleaner.openc                 C   s|   t j|\}}|st j|\}}|r#|r#t j|s#| j|dd t j|r+|s<t | | jt j	| d S d S )NT)exist_ok)
ra   rb   splitrc   makedirsisdirmkdirr_   appendre   )r    dnri   parentnr   r   r   rk      s   
zGeneratedFileCleaner.makedirsc                 C   sD   | j s| jD ]}t| q| jd d d D ]	}t| qd S d S )N)r\   r^   ra   unlinkr_   rmdir)r    typevalue	tracebackfdr   r   r   __exit__   s   
zGeneratedFileCleaner.__exit__Fr$   )	r   r   r   __doc__r!   r`   rP   rk   rz   r   r   r   r   r-   q   s    
r-   rb   r   c                 C   s   |  tjdS )N/)replacera   sep)rb   r   r   r   _to_unix_path   rS   r   rQ   
extensionsc                       t  fdd|D S )z<Helper method to see if filename ends with certain extensionc                 3   s    | ]}  |V  qd S rH   endswith).0erQ   r   r   	<genexpr>       z#match_extensions.<locals>.<genexpr>any)rQ   r   r   r   r   r.      s   r.   c                    r   )Nc                 3   s    | ]	}t   |V  qd S rH   )fnmatch)r   patternfilepathr   r   r      s    z_fnmatch.<locals>.<genexpr>r   )r   patternsr   r   r   _fnmatch   s   r   r   F	root_pathincludesignoresout_of_place_onlyis_pytorch_extensionc                 c   s    t |}tj| ddD ]T\}}}	tj|| }
|
dkr<d|v r%|d d|v r.|d d|v r<|d |d |	D ]!}ttj||}t	||r_t	||s_t
||s\||v r_|V  q>qd S )NT)topdown.z.gitbuildthird_partyzthird_party/nvfuser)r]   ra   walkrb   relpathremovern   r   joinr   r.   )r   r   r   r   r   r   exact_matchesabs_dirpathdirs	filenamesrel_dirpathrQ   r   r   r   r   r/      s2   



r/   output_directoryr   	all_filesheader_include_dirsstatship_clang_launch	clean_ctxshow_progressc	              
   C   st   t jt j| |}	ttj|	d}
|
t|	< t| ||||||||	}|r4d|j	vr4t
|	d|j|j	dd |t|	< d S )N)r   r   ignoredz->T)flush)ra   rb   re   r   r   r   r   r&   rA   r   printr   )r   r   r   r   r   r   r   r   r   fin_pathhipify_resultresultr   r   r   r0      s   

r0   c                 C   sP   dd | d D }t dt|d t d| t dt| d d d S )	Nc                 S   s   h | ]\}}|qS r   r   )r   	cuda_call	_filepathr   r   r   	<setcomp>   s    z compute_stats.<locals>.<setcomp>unsupported_callsz1Total number of unsupported CUDA function calls: ry   , z+
Total number of replaced kernel launches: kernel_launches)r   lenr   )r   r   r   r   r   r1      s   r1   c                 C   s  d}d}|  dd dd} dd tdD }d|| d< t| D ]E\}}|d	kr+ n<|d
kr4|d	7 }n|dkr<|d	8 }|dksH|t| d	 krf|dkrf||dk || d< |d	7 }|dk rf|d	 || d< q!| |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}| |	|}| |
|}| || || }|S )zBadds dim3() to the second and third arguments in the kernel launchr   <<<r   >>>c                 S   s   g | ]}i qS r   r   )r   _r   r   r   
<listcomp>   s    zadd_dim3.<locals>.<listcomp>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_dim3r   r   r   r2      s8   
  **r2   z([ ]+)(detail?)::[ ]+\\\n[ ]+c                    sT  t dd    fdd}dd }dd }t|| } }|D ]}||} d	|d
 }	 |d d |	d  }
 |d |d
  }|d d
 dkrPd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 | q"|S )zK Replace the CUDA style Kernel launches with the HIP style kernel launches.c                 S   s   |  d |  d dS )Nr   r
   z::groupinpr   r   r   <lambda>  s    z'processKernelLaunches.<locals>.<lambda>c           
         sz  | d | d dddddddd}ddi}d}d}d	}d
}|}t |d d d ddD ]} | }	|||fv ro|	dkrQ||krI|}||d d< |d  d7  < |	dkro|d  d8  < |d dkro||kro||d d< |}||kr |  s | dv r||kr|}||d d< |dkrd|d d< |d |d |d g  S q-||kr||d d< |d |d |d g  S q-d S )Nr   r   r   r   rr   )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stringr   r   grab_method_and_template  sJ   z7processKernelLaunches.<locals>.grab_method_and_templatec                 S   sr   d}g }|  d|dkr7|  d|}|  d|d }|dkr"td|||| || d |  d|dks|S )zKFinds the starting and ending points for all kernel launches in the string.r   r   rr   r   r   zno kernel end found)r   r   r   )findr*   rn   )r   
kernel_endkernel_positionskernel_startr   r   r   find_kernel_boundsQ  s   
z1processKernelLaunches.<locals>.find_kernel_boundsc                 S   s   d}d}d}| D ]f}|dkr3|dkr|dkrd}nF|dkr$|dkr$d}n;|dkr2|dkr2|dkr2d}n,|dkrB|d	ks?|d
krAd}n|dkrQ|dkrP|dkrPd}n|dkr_|dkr_|dkr_d}|}|dkrj||7 }q|d7 }q|S )Nr   r}   z//*z/*"\'r   xr   )r   
in_commentprev_c
new_stringr   r   r   r   mask_commentsi  s8   

z,processKernelLaunches.<locals>.mask_commentsr   r   r   r   r   rr   r   r   r   r   zhipLaunchKernelGGL(z, 0   r   r   )	RE_KERNEL_LAUNCHsublistr   r2   r   rE   r~   rn   )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_kernelr   r   r   r3     s4   ;! 
"
r3   c                 C   s   d}d}|}d\}}|t | k rJ| | |d kr(|du r#d}d}|}n|d7 }n| | |d kr@|r@|d8 }|dkr@|}||fS |d7 }|t | k s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, ["(", ")"])
        (0, 3)
    Fr   )rr   rr   Tr   )NN)r   )input_stringr   r   inside_parenthesisparensr   p_startp_endr   r   r   r4     s&   
r4   c                 C      t | |ddgdS )z%Finds the first balanced parentheses.{}r   r4   r  r   r   r   r   r5        r5   c                 C   r  )z!Finds the first balanced bracket.r   r   r   r  r  r   r   r   r6     r  r6   z\bassert[ ]*\(c                 C   s.   | }t D ]}|| dt |  d}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

    r   )r   r~   )r  r  funcr   r   r   r7     s   	r7   z:?:?\b(__syncthreads)\b(\w*\()c                    sh   |  ddg}t  fdd|D r S d v }|d v 7 }|d v 7 }|t du7 }|r2d	|    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 | d| d V  qdS )z#include ("z"|<z>)N)research)r   extr  r   r   r     s   ( z#hip_header_magic.<locals>.<genexpr>hipLaunchKernelGGL
__global__
__shared__Nz#include "hip/hip_runtime.h"
)r   RE_SYNCTHREADSr  )r  headershasDeviceLogicr   r  r   r8     s   r8   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.
    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                 S   s.   d|  dpd d|  d d|  d dS )	NzHIP_DYNAMIC_SHARED(r   r   r   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   r9     s
   
r9   c                 C   s   t j| r
td|st| s| S t j| \}}t j|\}}|dkr(d}|}|}|dd}|dd}|dd	}|dd}|dd}|d
krT|dd	}|sa||krat j|d}|rq||krq|| |krq|d }t j||| 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)	ra   rb   isabsAssertionErrorr;   rj   splitextr~   r   )rel_filepathr   dirpathrQ   rootr  orig_filenameorig_dirpathr   r   r   r:   "  s,   $r:   c                 C   sB   t j| r
td| drdS | drdS | drdS dS )Nr#  torch/Fthird_party/nvfuser/tools/autograd/templates/T)ra   rb   r-  r.  
startswithr0  r   r   r   r;   k  s   


r;   c                 C   s   t d tj| rtd| dr| drdS dS | dr#dS | dr*dS | d	r1dS | d
r8dS | dr?dS dS )Nr<   r#  zaten/zaten/src/ATen/core/FTr5  r6  zthird_party/fbgemm/zthird_party/mslk/r7  )r   ra   rb   r-  r.  r8  r9  r   r   r   r<   x  s$   






r<   c                 C   s    t d t| rd|  v S dS )Nr=   sparseFr   r<   lowerr9  r   r   r   r=     s   r=   c                 C   sD   t d t| r d|  v rdS d|  v r d|  v rdS dS dS )Nr>   r:  TlinalgbatchlinearalgebralibblasFr;  r9  r   r   r   r>     s   r>   c                 C   s^   t d tj| rtd| drdS tj| }tj|\}}d|v s+|dv o.d|vS )Nr?   r#  zc10/cudaTgpur$  .cuhcudnn)r   ra   rb   r-  r.  r8  basenamer/  )r0  rQ   r   r  r   r   r   r?     s   
r?   c                   @   s   e Zd ZdZdddZdS )TrieNodezA Trie node whose children are represented as a directory of char: TrieNode.
       A special char '' represents end of word
    r   Nc                 C   s
   i | _ d S rH   )childrenr"   r   r   r   r!     s   
zTrieNode.__init__r$   )r   r   r   r|   r!   r   r   r   r   rD    s    rD  c                   @   sZ   e Zd ZdZdddZdddZdd	 Zd
d Zdd Ze	j
dd Zdd Zdd ZdS )r@   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.r   Nc                 C   s&   t  | _tjdd| _| j | _dS )z,Initialize the trie with an empty root node.F)usedforsecurityN)rD  r2  hashlibmd5_hashdigest_digestr"   r   r   r   r!     s   zTrie.__init__c                 C   sT   | j |  | j  | _| j}|D ]}|j|t  |j| }qd|jd< dS )zAdd a word to the Trie. Tr   N)	rI  updateencoderJ  rK  r2  rE  
setdefaultrD  r    wordnoder   r   r   r   rd     s   zTrie.addc                 C   s   | j S )zReturn the root node of Trie. )r2  r"   r   r   r   dump  s   z	Trie.dumpc                 C   s
   t |S )z Escape a char for regex. )r  escape)r    r   r   r   r   quote  s   
z
Trie.quotec                 C   s4   | j }|D ]}||jv r|j| }q dS d|jv S )zZSearch whether word is present in the Trie.
        Returns True if yes, else return FalseFr   )r2  rE  rO  r   r   r   r    s   

zTrie.searchc              	   C   sB  |}d|j v rt|j  dkrdS g }g }d}t|j  D ]4}t|j | trQz| |j | | j}|| 	||  W q t
yP   || 	| Y qw d}qt|dk }	t|dkr{t|dkro||d  n|dd| d  t|dkr|d }
n	dd| d	 }
|r|	r|
d
7 }
|
S d|
 d}
|
S )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)?)rE  r   keyssorted
isinstancerD  _patternrK  rn   rT  	Exceptionr   )r    r2  rJ  rQ  altccqr   recursecconlyr   r   r   r   r\    s:   
zTrie._patternc                 C      |  | j| jS z#Export the Trie to a regex pattern.r\  r2  rK  r"   r   r   r   r        zTrie.patternc                 C   rc  rd  re  r"   r   r   r   export_to_regex  rf  zTrie.export_to_regexr$   )r   r   r   r|   r!   rd   rR  rT  r  	functools	lru_cacher\  r   rg  r   r   r   r   r@     s    


+r@   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	                    s  t jt j|t|}t }	| vr#d|	_d|	_tj	|	_
|	S tt j|}
tdd*}| tkrLd|	_d|	_tj	|	_
|	W  d   S |d | }W d   n1 s_w   Y  |}t jt jt|
}t jt j|st j| dd }t||}t D ]!\}}d	|v rd	|vrd
t| }t|||}q|||}qd% f	dd	}t|dd|}t|dd|}t|d|}|dr|dd}|dd}t d|}st!|}|drd|vrt"|}t#|}r2||kr2t jt j|kr2|	_d|	_tj	|	_
|	S |krAt$drAt| }d}t j|rgt|dd}| |k}W d   n	1 sbw   Y  |rz+j|ddd}|%| W d   n	1 sw   Y  ||	_d|	_tj	|	_
|	W S  t&y } z*t't(j) d| d|j* d  d!t(j+ 	t,j-d" |	_d#|	_tj	|	_
|	W  Y d}~S d}~ww ||	_d$|	_tj	|	_
|	S )&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                 S   s   t | d S )Nr   )rj  r   )mr   r   r   pt_replV  rS   zpreprocessor.<locals>.pt_replz/hip/z
(?<!/hip/)Tc                    s$    	
fdd}|S )Nc              
      s  |  d}tj| |ds|dr%|ds%t|  dS rt fddD rd }d }rStj}tj	tj
||}tj|rS|}|}|d u rxD ]}tj
|}tj	tj
||}tj|rw|}|}qY|d u r|  dS |tvrt|
		 n=|tv rt| }|jtjkrtj|}tj	tj
t|}	|	|_|t|< tj|	d ur|	|S ||S t| j}
ttj|
d u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*  THCPc                 3   s    | ]}|  V  qd S rH   r   )r   sr   r   r   r   ~  r   z>preprocessor.<locals>.mk_repl.<locals>.repl.<locals>.<genexpr>r   )r   ra   rb   rC  r8  formatr:   r   dirnamere   r   rc   r&   r0   r   r   r   r   r   r   )rl  rx   
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_filepath)r   r   r   r   r   include_current_dirr   r   r   r   templr   r   replo  sj   




z+preprocessor.<locals>.mk_repl.<locals>.replr   )r|  r{  r}  	r   r   r   r   r   r   r   r   r   )r{  r|  r   mk_repln  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@  	PowKernelz[skipped, no changes])r$  rA  .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).ra   rb   re   r   r   r&   r   r   r   r   r   r   rP   readlineHIPIFY_C_BREADCRUMBseekreadr:   rc   rq  rk   RE_PYTORCH_PREPROCESSORr   r   itemsr  rS  r~   RE_QUOTE_HEADERRE_ANGLE_HEADERRE_THC_GENERIC_FILEr   RE_CU_SUFFIXr3   r7   r8   r.   writeOSErrorr   r,   rW   strerrorrY   sysstderr)r   r   r   r   r   r   r   r   r   r   r0  finoutput_sourceorig_output_source	fout_pathrm  	cuda_pathhip_pathr   r  do_writefout_oldfoutr   r   r~  r   rA   /  s   

	<


&rA   c                    s   t | d6}| }|rtdt| d fdd|}n|| }|d || |  W d    d S 1 s>w   Y  d S )Nr+z\b(z)\bc                    s    S rH   r   )r   replace_stringr   r   r     s    z+file_specific_replacement.<locals>.<lambda>r   )	r+   r  r  r   rS  r~   r  r  truncate)r   search_stringr  strictrx   contentsr   r  r   rB     s   &


"rB   c                 C   s   t | d5}| }|d dkr|d dkrd| d}d| d| }|d || |  W d    d S 1 s=w   Y  d S )	Nr  r   r   rr   r   r   z	#include z 
)r+   r  r  r  r  )r   headerrx   r  r   r   r   rC     s   


"rC   c                 C   s   |  dd} | S )z<Static global kernels in HIP results in a compilation error.z __global__ staticr  r~   )in_txtr   r   r   rD     s   rD   z#include .*\nc                 C   s:  g }ddd}| }|d }|t |k r|| dkr"|d  d7  < n:|| dkr1|d  d8  < n+|| dkr@|d  d7  < n|| dkr\||d  dkr\|d dkr\|d  d8  < |d dkrs|d dkrs|||d	 	 |S |d dkr|d dkr|| d
kr|||d	 |d }|d7 }|t |k s|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   rn   )r   r   	argumentsclosurescurrent_positionargument_start_posr   r   r   rE     s2   	(	$rE   vc                 C   s*   |   dv rdS |   dv rdS t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falserx   rq   0FzBoolean value expected.)r<  argparseArgumentTypeError)r  r   r   r   rF   7  s
   
rF   r$  rA  r  r  r  r  z.inr  rA  r  r  r   r   Tproject_directoryshow_detailedheader_extensionsextra_fileshipify_extra_files_onlyc                    s  dkrt  t jstd td s"d d kr:fddD fddD t jsFt	 t
ttt
ttt
t|||d	}t|}|D ]}t j|sut j|}||vr~|| qfd
dlm} |D ]'}t j|r||}n	|t j|}| fdd|dD  q|d u rtdd}g g d}|s|n|D ]}t||||||||
	 qttjd tj tjd |rt| tS )Nr   z,The project folder specified does not exist.r   r}   _amdc                       g | ]}|  qS r   r  )r   includer   r  r   r   r   a      zhipify.<locals>.<listcomp>c                    r  r   r  )r   rN   r  r   r   r   b  r  )r   r   r   r   r   r   )Pathc                 3   sH    | ]}|  rtt|rtt|st|j rt|V  qd S rH   )is_filer   r%   r.   r   )r   rb   )r  r   r   r   r   r   ~  s    

zhipify.<locals>.<genexpr>r   T)r\   )r   r   z-Successfully preprocessed all matching files.r  )ra   getcwdrb   rc   r   r  exitrstripshutilcopytreer  mapr   r/   r]   r-  r   rn   pathlibr  extendrglobr-   r0   r,   rV   rY   r  r1   r&   )r  r  r   r  r   r   r   r  r   r   r   r   r   r  r   r   all_files_setrx   r  rv  header_include_dir_pathr   r   r   )r  r   r   r   r  r   rG   B  s\   








rG   )r   r   r   FFr$   r{   )Fr  r  r   r   r  r   Fr   TFFFN)Yr|   r  r   r  r  r  ra   r   cuda_to_hip_mappingsr   r   r   collections.abcr   r   r   enumr	   rh  rG  r   r   r   dictr%   HipifyFinalResultr  r&   __annotations__PYTORCH_TEMPLATE_MAP__all__r]  r*   r+   r,   r-   r   boolr.   r   r/   r  r0   r1   r2   compiler   r3   r4   r5   r6   	RE_ASSERTr7   r  r8   r"  r9   r:   r;   r<   r=   r>   r?   rD  r@   PYTORCH_TRIErj  objectmappingr[  	TypeErrorr  srcdstrd   rg  r  r  r  r  r  rA   rB   rC   rD   
RE_INCLUDErE   rF   rG   r   r   r   r   <module>   sr  	
"
&
		


# &



I	^





		
 =

,	
