U
    ,-e                  !   @   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 dd	lm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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.ddd/g!ZG d0d deZ d1d Z!G d2d dZ"G d3d dZ#eee$d4d5dZ%d6d7 Z&dge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,dAd Z-dBd Z.dCd Z/dDd Z0e+dEZ1dFd Z2e+dGZ3dHd  Z4e+dIZ5dJd! Z6dhdKd"Z7dLd# Z8dMd$ Z9dNd% Z:dOd& Z;dPd' Z<G dQd( d(Z=e= Z>i Z?e= Z@i ZAeeeBf edR< i ZCe
D ]ZDeEeDestFeDG D ]\ZHZIeId ZJeIdd ZKejLeKkre@MeH ejNeKkreAOeHdSreJeCeH< neJeAeH< ejPeKkrejNeKkre>MeH eJe?eH< qqe+e>Q ZRe+dTe@Q  dUZSe+dVZTe+dWZUe+dXZVe+dYZWeeeeeeef e$e$e#e$ed<
dZd)ZXdid[d*ZYd\d+ ZZd]d, Z[e+d^Z\d_d- Z]d`d. Z^djee$eeeeeee$ee$e$e$e$ee# ededfd/Z_dS )ka   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Iterable)Enumc                   @   s   e Zd ZdZdZdS )CurrentStater      N)__name__
__module____qualname__INITIALIZEDDONE r   r   a/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/torch/utils/hipify/hipify_python.pyr   )   s   r   c                   @   s   e Zd Zdd Zdd ZdS )HipifyResultc                 C   s   || _ || _d| _d S )N )current_statehipified_pathstatus)selfr   r   r   r   r   __init__.   s    zHipifyResult.__init__c                 C   s   d | j| j| jS )Nz@HipifyResult:: current_state: {}, hipified_path : {}, status: {})formatr   r   r   r   r   r   r   __str__3   s     zHipifyResult.__str__N)r   r   r   r   r   r   r   r   r   r   -   s   r   z;// !!! 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_special_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  | || _d S N)superr   message)r   rB   	__class__r   r   r   K   s    zInputError.__init__c                 C   s   d| j  S )NzInput error: )rB   r   r   r   r   r   O   s    zInputError.__str__)r   r   r   r   r   __classcell__r   r   rC   r   r"   H   s   c                 C   s   t | |ddS )Nignore)errors)open)filenamemoder   r   r   r#   S   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)r   r   r   HEADERZOKBLUEOKGREENWARNINGFAILENDCZBOLDZ	UNDERLINEr   r   r   r   r$   X   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   rP   r   r   r   r   m   s    zGeneratedFileCleaner.__init__c                 C   s   | S r@   r   r   r   r   r   	__enter__r   s    zGeneratedFileCleaner.__enter__c                 O   s0   t j|s | jt j| t|f||S r@   )ospathexistsrR   addabspathrH   )r   fnargskwargsr   r   r   rH   u   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)
rU   rV   splitrW   makedirsisdirmkdirrS   appendrY   )r   dnr]   parentnr   r   r   r_   z   s    
zGeneratedFileCleaner.makedirsc                 C   s@   | j s<| jD ]}t| q| jd d d D ]}t| q,d S )N)rP   rR   rU   unlinkrS   rmdir)r   typevalue	tracebackfdr   r   r   __exit__   s
    
zGeneratedFileCleaner.__exit__N)F)F)	r   r   r   __doc__r   rT   rH   r_   rn   r   r   r   r   r%   k   s   


)rI   
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rI   r   r   	<genexpr>   s     z#match_extensions.<locals>.<genexpr>any)rI   rp   r   rv   r   r&      s    c                    s   t  fdd|D S )Nc                 3   s   | ]}t   |V  qd S r@   )fnmatch)rt   patternfilepathr   r   rw      s     z_fnmatch.<locals>.<genexpr>rx   )r}   patternsr   r|   r   _fnmatch   s    r   r   F)	root_pathincludesignoresrp   out_of_place_onlyis_pytorch_extensionrq   c                 c   s   t |}tj| ddD ]\}}}	tj|| }
|
dkrvd|krH|d d|krZ|d d|krv|d |d |	D ]p}tj||}tj|
|}t||rzt||szt	||s||krz|st
|st|sqz|rt|sqz|V  qzqd S )NT)topdown.z.gitbuildZthird_partyzthird_party/nvfuser)rQ   rU   walkrV   relpathremoverb   joinr   r&   r4   r7   r3   )r   r   r   rp   r   r   Zexact_matchesZabs_dirpathdirs	filenamesZrel_dirpathrI   r}   rel_filepathr   r   r   r'      s8    



)
output_directoryr}   	all_filesheader_include_dirsstatship_clang_launchr   	clean_ctxshow_progressrq   c	              
   C   st   t jt j| |}	ttj|	d}
|
t|	< t| ||||||||	}|rhd|j	krht
|	d|j|j	dd |t|	< d S )N)r   r   Zignoredz->T)flush)rU   rV   rY   r   r   r   r   r    r9   r   printr   )r   r}   r   r   r   r   r   r   r   fin_pathhipify_resultresultr   r   r   r(      s$    
      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   )rt   Z	cuda_callZ	_filepathr   r   r   	<setcomp>   s     z compute_stats.<locals>.<setcomp>unsupported_callsz1Total number of unsupported CUDA function calls: rm   , z+
Total number of replaced kernel launches: kernel_launches)r   lenr   )r   r   r   r   r   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}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   )rt   _r   r   r   
<listcomp>   s     zadd_dim3.<locals>.<listcomp>r   startr   (),end
 zdim3()replacerange	enumerater   strip)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   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rd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 )Nr   r   z::groupZ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 ]"} | }	|||f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rP||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   rf   )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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   rf   r   r   zno kernel end found)r   r   r   )findr"   rb   )r   Z
kernel_endZkernel_positionsZkernel_startr   r   r   find_kernel_boundsM  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rd}nX|dkr|d	ks~|d
krd}n:|dkr|dkr|dkrd}n|dkr|dkr|dkrd}|}|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_commentse  s2    

z,processKernelLaunches.<locals>.mask_commentsr   r   r   r   r   rf   r   r   r   r   zhipLaunchKernelGGL(z, 0   r   r   )	RE_KERNEL_LAUNCHsublistr   r*   r   r=   r   rb   )r   r   r   r   r   Zget_kernel_positionsoutput_stringZkernelparamsZparenthesisr   r   Zend_param_indexZkernel_name_with_templateZcuda_kernel_dim3Znum_klpZ
hip_kernelr   r   r   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, ["(", ")"])
        (0, 3)
    Fr   )rf   rf   Tr   )NN)r   )input_stringr   r   Zinside_parenthesisparensr   Zp_startZp_endr   r   r   r,     s$    

c                 C   s   t | |ddgdS )z%Finds the first balanced parantheses.{}r   r,   r   r   r   r   r   r-     s    c                 C   s   t | |ddgdS )z!Finds the first balanced bracket.r   r   r   r   r   r   r   r   r.     s    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   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 | d| d V  qdS )z#include ("z"|<z>)N)research)rt   extr   r   r   rw     s     z#hip_header_magic.<locals>.<genexpr>ZhipLaunchKernelGGL
__global__Z
__shared__Nz#include "hip/hip_runtime.h"
)ry   RE_SYNCTHREADSr   )r   headersZhasDeviceLogicr   r   r   r0     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 d|  d dS )	NzHIP_DYNAMIC_SHARED(r   r   r   r   r   r   r   r   r   r   r   r   r     r   z'replace_extern_shared.<locals>.<lambda>)RE_EXTERN_SHAREDr   )r   r   r   r   r   r1     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rt j|d}|r||kr|| |kr|d
 }t j||| S )z3
    Returns the new name of the hipified file
    .cu.hipcudaZhipCUDAHIPTHCTHHzcaffe2/coreZ_hip)	rU   rV   isabsAssertionErrorr3   r^   splitextr   r   )r   r   dirpathrI   rootr   orig_filenameZorig_dirpathr   r   r   r2     s*    $c                 C   s>   t j| rt| drdS | dr,dS | dr:dS dS )Ntorch/Fthird_party/nvfuser/tools/autograd/templates/TrU   rV   r   r   
startswithr   r   r   r   r3   c  s    


c                 C   sZ   t j| rt| dr,| dr(dS dS | dr:dS | drHdS | drVdS dS )Nzaten/zaten/src/ATen/core/FTr   r   r   r   r   r   r   r   r4   o  s    




c                 C   s   t | rd|  kS dS )NsparseFr4   lowerr   r   r   r   r5   ~  s    c                 C   s<   t | r8d|  krdS d|  kr8d|  kr4dS dS dS )Nr   TZlinalgZbatchlinearalgebralibblasFr   r   r   r   r   r6     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)rU   rV   r   r   r   basenamer   )r   rI   r   r   r   r   r   r7     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 )r8   zRegex::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    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   rX     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   s<  |}d|kr t | dkr d S g }g }d}t| D ]d}t|| trz&| || }|| ||  W q tk
r   || | Y qX q8d}q8t |dk }t |dkrt |dkr||d  n|dd	| d  t |dkr|d }	ndd	| d }	|r8|r,|	d	7 }	nd|	 d
}	|	S )Nr   r   r   []z(?:|r   ?z)?)
r   keyssorted
isinstancedict_patternrb   r	  	Exceptionr   )
r   ZpDatar  Zaltccqr   recurseZcconlyr   r   r   r   r    s6    

zTrie._patternc                 C   s   |  |  S r@   )r  r  r   r   r   r   r{     s    zTrie.patternN)
r   r   r   ro   r   rX   r  r	  r  r{   r   r   r   r   r8     s   %PYTORCH_MAPr   z(?<=\W)(z)(?=\W)z#include "([^"]+)"z#include <([^>]+)>z"#define THC_GENERIC_FILE "([^"]+)"z\.cu\bc	                    s|  t jt j|t }	| kr>d|	_d|	_tj|	_	|	S t j
|}
tddH}| tkrd|	_d|	_tj|	_	|	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|
rDt|}ndd }t||}d' 	f	dd	}t|dd|}t|dd|}t|d|}|dr|dd}|dd}td|}st|	}|drd|krt |}t!|}rR||krRt jt j|krR|	_d|	_tj|	_	|	S |krpt"drpt| }d}t j|rt|dd}| |k}W 5 Q R X |r`z@j|ddd}|#| W 5 Q R X ||	_d|	_tj|	_	|	W S  t$k
r\ } zPt%t&j' d | d!|j( d" d#t&j) 	t*j+d$ |	_d%|	_tj|	_	|	 W Y S d}~X Y nX n||	_d&|	_tj|	_	|	S d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   )r  r   mr   r   r   pt_repl-  s    zpreprocessor.<locals>.pt_replc                    s   t | d | S r  )PYTORCH_SPECIAL_MAPgetr   r  )r  r   r   pt_special_repl0  s    z%preprocessor.<locals>.pt_special_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s8|drN|dsNt|  dS rt fddD rd }d }rtj}tj	tj
||}tj|r|}|}|d krD ]<}tj
|}tj	tj
||}tj|r|}|}q|d kr|  dS |tkr0t|
		 nz|tkrt| }|jtjkrtj|}	tj	tj
t|	}
|
|_|t|< tj|
d k	r|
n||S t| j}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@   rr   )rt   srv   r   r   rw   R  s     z>preprocessor.<locals>.mk_repl.<locals>.repl.<locals>.<genexpr>r   )r   rU   rV   r^   r   r   r2   ry   dirnamerY   r   rW   r    r(   r   r   r   r   r   )r  rl   r   Z
header_dirZheader_filepathZheader_dir_to_checkZheader_path_to_checkheader_include_dirZheader_resultZheader_rel_pathZheader_fout_pathZhipified_header_filepath)r   r   r   r   r   include_current_dirr   r   r   r   templrv   r   replC  sr    




     
 
 z+preprocessor.<locals>.mk_repl.<locals>.replr   )r&  r%  r'  )	r   r   r   r   r   r   r   r   r   )r%  r&  r   mk_replB  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   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),rU   rV   rY   r   r    r   r   r   r   r   r   rH   readlineHIPIFY_C_BREADCRUMBseekreadr2   rW   r#  r_   RE_PYTORCH_PREPROCESSORr   r6   r4   RE_CAFFE2_PREPROCESSORRE_QUOTE_HEADERRE_ANGLE_HEADERRE_THC_GENERIC_FILErs   r   RE_CU_SUFFIXr+   r/   r0   r&   writePermissionErrorr   r$   rM   strerrorrO   sysstderr)r   r}   r   r   r   r   r   r   r   r   r   ZfinZoutput_sourceZorig_output_sourceZ	fout_pathr  r!  r(  Zdo_writeZfout_oldZfoutru   r   )
r   r   r   r   r   r   r   r  r   r   r   r9     s    


<
&c              	      st   t | d`}| }|r>tdt| d fdd|}n|| }|d || |  W 5 Q R X d S )Nr+z\b(z)\bc                    s    S r@   r   )r   replace_stringr   r   r     r   z+file_specific_replacement.<locals>.<lambda>r   )	r#   r4  r   r   r  r   r3  r;  truncate)r}   search_stringrB  strictrl   contentsr   rA  r   r:     s    &

c              	   C   sr   t | d^}| }|d dkr8|d dkr8d| d}d| d| }|d || |  W 5 Q R X d S )	Nr@  r   r   rf   r   r   z	#include z 
)r#   r4  r3  r;  rC  )r}   headerrl   rF  r   r   r   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_txtr   r   r   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   rb   )r   r   	argumentsZclosurescurrent_positionZargument_start_posr   r   r   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falserl   re   0FzBoolean value expected.N)r   argparseArgumentTypeError)vr   r   r   r>     s
    r   r  r)  r*  r+  r,  z.inr-  r  r,  r-  r   T)project_directoryshow_detailedrp   header_extensionsr   r   r   extra_filesr   r   r   r   r   hipify_extra_files_onlyr   rq   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 st	  t
t ||	|||d	}t|}|D ]0}t j|st j |}||kr|| qd
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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   Z_amdc                    s   g | ]}|  qS r   rH  )rt   includer   rZ  r   r   r   7  s     zhipify.<locals>.<listcomp>c                    s   g | ]}|  qS r   rH  )rt   rF   r`  r   r   r   8  s     )r   r   rp   r   r   r   )Pathr   T)rP   )r   r   z-Successfully preprocessed all matching files.r/  ) rU   getcwdrV   rW   r   r>  exitrstripshutilcopytreer   r'   rQ   r   r   rb   pathlibra  rglobis_filer   strr&   namer%   r(   r$   rL   rO   r?  r)   r    )rZ  r[  rp   r\  r   r   r   r]  r   r   r   r   r   r^  r   r   Zall_files_setrl   ra  r$  Zheader_include_dir_pathrV   r   r}   r   r`  r   r?     sn    

 





    )r   r   r   FF)F)F)FrW  rX  r   r   rY  r   Fr   TFFFN)`ro   rT  rz   r   re  r>  rU   r   r   Zcuda_to_hip_mappingsr   r   typingr   r   r   r	   collections.abcr
   r   enumr   r   r   rj  ZHipifyFinalResultr2  r    __annotations__ZPYTORCH_TEMPLATE_MAP__all__r  r"   r#   r$   r%   boolr&   r   r'   r(   r)   r*   compiler   r+   r,   r-   r.   Z	RE_ASSERTr/   r   r0   r   r1   r2   r3   r4   r5   r6   r7   r8   ZCAFFE2_TRIEr   ZPYTORCH_TRIEr  objectr  mappingr  r   itemssrcrj   dstZ	meta_dataZ
API_CAFFE2rX   ZAPI_SPECIALr  ZAPI_PYTORCHr{   r6  r5  r7  r8  r9  r:  r9   r:   r;   r<   Z
RE_INCLUDEr=   r>   r?   r   r   r   r   <module>   sZ  

                      !      -
 #
 &



H

=








  9

.              