U
    9%efW                     @   s&  d dl Z d dlZd dlZd dlZd dlmZmZmZ d dlm	Z	m
Z
mZmZmZmZ d dlZd dlm  m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m Z m!Z!m"Z"m#Z#m$Z$ d d	l%m&Z& d d
l'm(Z(m)Z)m*Z*m+Z+m,Z, d dl-m.Z. eddddddgZ/e0eee"e#f  e	e!ef e/dddZ1d)ee" e	e!ef e!ee! e0e0ee
e$  ddddZ2ddddZ3d*e*e0e0e	e!ef eee"e#f  e!ee! e0dd	ddZ4d+e*e0e0e	e!ef eee"e#f  e!e!d!e5e5e0e5dd"d#d$Z6d,e0e0e5ee0 dd%d&d'Z7e8d(kr"e3  dS )-    N)Counterdefaultdict
namedtuple)DictListOptionalSequenceSetUnion)DispatcherSignature)CodeTemplate)native_function_manager)get_grouped_native_functionsparse_native_yaml)BackendIndexBackendMetadataDispatchKeyNativeFunctionNativeFunctionsGroupOperatorName)SelectiveBuilder)	concatMapcontextFileManagerNamespaceHelperTarget)
YamlLoaderParsedExternalYamlbackend_keyautograd_key
class_namecpp_namespacebackend_indices)backend_yaml_pathgrouped_native_functionsr"   returnc              
      s$  dd t dd |D t| }tj|td}W 5 Q R X t|tsHtdddd	d
dddddg
}|dd d k	s|td|dd }|dd d k	std|dd}t|t	std| |dd}t|t	std| |d
g }	|	d krg }	t|	t
s,td|	 dt|	 d|dg }
|
d krFg }
t|
t
sltd|	 dt|	 dt|
}|dg }t|t
std| |dg }|	| |di }|di }t| dkst|  dd|  dd| tt tt tt	t	td fd!d"}d t|	dkrtfd#d tW 5 Q R X ||	|||d$}kst|< d  t|dkrtfd%d td&  W 5 Q R X ||| ||d$} kst| < |D ]}t|trVd krg nd'd(  |fD } d kr:g nd)d(   |fD }n`d krdg n d*d( fd+d(| D D } d krg n d,d(  fd-d(| D D }d.d( |D }d/d( |D }t|dkst|dkstd0|d j d1|d j d2qt |S )3Nc                 S   s   i | ]}|j j|qS  )funcname.0fr&   r&   Y/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torchgen/gen_backend_stubs.py
<dictcomp>*   s    z&parse_backend_yaml.<locals>.<dictcomp>c                 S   s   t | tr| gS t|  S N)
isinstancer   list	functionsr+   r&   r&   r,   <lambda>-       z$parse_backend_yaml.<locals>.<lambda>)Loaderbackendr    r!   extra_headers	supportedZautogradfull_codegen
non_nativeZir_gensymintz&You must provide a value for "backend"z,You must provide a value for "cpp_namespace"use_out_as_primaryFzHYou must provide either True or False for use_out_as_primary. Provided: device_guardzBYou must provide either True or False for device_guard. Provided: z,expected "supported" to be a list, but got: z
 (of type )z)expected "symint" to be a list, but got: z+expected "autograd" to be a list, but got: r   z contains unexpected keys: z, z). Only the following keys are supported: )backend_ops
symint_opsdispatch_keyr<   use_device_guardr%   c          
         sv   i }| D ]Z}t |}|ks,td| t| j}||krL|d7 }t|d d}	|	||< qt||d||dS )Nz Found an invalid operator name: Z_symintF)kernelZ
structuredr!   T)rA   r<   Zexternalr=   index)r   parseAssertionError
dispatcherr(   r'   r   r   )
r?   r@   rA   r<   rB   metadataopop_nameZkernel_namem)r!   native_functions_mapr&   r,   create_backend_indexy   s.    
  
z0parse_backend_yaml.<locals>.create_backend_indexc                      s   d  dS )NzFThe provided value for "backend" must be a valid DispatchKey, but got .r&   r&   r6   r&   r,   r3      r4   )r<   rB   c                      s   d  dS )NzThe "autograd" key was specified, which indicates that you would like to override the behavior of autograd for some operators on your backend. However "Autogradz" is not a valid DispatchKey.r&   r&   rO   r&   r,   r3      s   ZAutogradc                 S   s   g | ]}|d k	r|qS r.   r&   r*   rK   r&   r&   r,   
<listcomp>   s   z&parse_backend_yaml.<locals>.<listcomp>c                 S   s   g | ]}|d k	r|qS r.   r&   rP   r&   r&   r,   rQ      s   c                 S   s   g | ]}|d k	r|qS r.   r&   rP   r&   r&   r,   rQ      s   c                    s   g | ]}   |qS r&   
get_kernelr)   )r"   r   r&   r,   rQ      s   c                 S   s   g | ]}|d k	r|qS r.   r&   rP   r&   r&   r,   rQ      s   c                    s   g | ]}   |qS r&   rR   r)   )r   r"   r&   r,   rQ      s   c                 S   s   g | ]}|d k	r|qS r.   r&   r)   r&   r&   r,   rQ      s      c                 S   s   g | ]}|d k	r|qS r.   r&   r)   r&   r&   r,   rQ      s      zCurrently, all variants of an op must either be registered to a backend key, or to a backend's autograd key. They cannot be mix and matched. If this is something you need, feel free to create an issue! z" is listed under "supported", but z is listed under "autograd".)r   openyamlloadr   r/   dictrF   popboolr0   typesetextendlenkeysjoinr   strr	   r   r   r   rE   r   rS   r1   rC   r   )r#   r$   r"   r+   Zyaml_valuesZ
valid_keysr    r<   rB   r8   r;   Z
symint_setZsupported_autogradr9   r:   _rM   Zbackend_idxZautograd_idxgZforward_kernelsZbackward_kernelsr&   )r   r6   r"   r   r!   rL   r,   parse_backend_yaml%   sB   
  
 
  





    rc   )native_functionsr"   r   r   r    kernel_defn_file_pathr9   r%   c                    s  z t |}| }W 5 Q R X W n2 tk
rR }	 ztd| |	W 5 d }	~	X Y nX d kr`g || jg|d krvg n
|| jg }
tttdd |
fdd| D }tt}|D ]}||j	j
  | qd| d}tdd t||D }d	}| D ]t\}}t|}|| }||krttd
dd d fdd|D }|d| d| d| d| d| d7 }q|d	kst|d S )Nz2Unable to read from the specified impl_path file: c                 S   s   dd |   D S )Nc                 S   s   g | ]\}}||j fqS r&   )rC   )r*   rJ   rH   r&   r&   r,   rQ     s    z>error_on_missing_kernels.<locals>.<lambda>.<locals>.<listcomp>)items)rD   r&   r&   r,   r3     s   z*error_on_missing_kernels.<locals>.<lambda>c                    s,   g | ]$}|j j  kr|j jkr|qS r&   )r'   r(   r^   r)   )expected_backend_op_namesr9   r&   r,   rQ     s   z,error_on_missing_kernels.<locals>.<listcomp>z(.*)z::\s*([\w\d]*)\(c                 S   s   g | ]\}}| d s|qS ):)endswith)r*   xyr&   r&   r,   rQ   0  s   
 )r+   r%   c              
   S   s0   t |  t| j W  5 Q R  S Q R X d S r.   )r   r   Zfrom_schemar'   declr2   r&   r&   r,   create_decl=  s    
z-error_on_missing_kernels.<locals>.create_decl
c                    s   g | ]} |qS r&   r&   r)   )rn   r&   r,   rQ   A  s     z$ is missing a kernel definition for z. We found z( kernel(s) with that name,
but expected zH kernel(s). The expected function schemas for the missing operator are:
z

)rT   readOSErrorrF   rD   rW   r0   r   r   r'   r(   appendr   refindallrf   r]   r   r`   r_   )rd   r"   r   r   r    re   r9   r+   Zbackend_defnseindicesZexpected_backend_native_funcsZ#expected_backend_kernel_name_countsZnative_fZkernel_defn_regexZ!actual_backend_kernel_name_countsZmissing_kernels_err_msgZexpected_namefuncsZexpected_overload_countZactual_overload_countZexpected_schemas_strr&   )rn   rg   r9   r,   error_on_missing_kernels   sv    	





rx   )r%   c                  C   sz   t jdd} | jddddd | jdd	d
dd | jddtddd | jddtd dd |  }t|j|j|j	|j
 d S )NzGenerate backend stub files)descriptionz-sz--source-yamlz--source_yamlzApath to source yaml file containing operator external definitions)helpz-oz--output-dirz--output_dirzoutput directoryz	--dry-runz	--dry_runF)rZ   defaultrz   z--impl-pathz--impl_pathz9path to the source C++ file containing kernel definitions)argparseArgumentParseradd_argumentrY   r`   
parse_argsrunsource_yaml
output_dirdry_run	impl_path)parseroptionsr&   r&   r,   mainK  s0        r   rl   )	fmr    r!   r"   r$   backend_dispatch_keyautograd_dispatch_keybackend_namer%   c                    s|   d k	st dtttfdd|tttfdd| t||  dd fdd d S )NzAAutogenerated file by gen_backend_stubs.py. Do not edit directly!c                    s   t |   S r.   destZ#compute_native_function_declarationr2   )r   r"   r&   r,   r3   x  s    z4gen_dispatchkey_nativefunc_headers.<locals>.<lambda>c                    s    d krg S t |   S r.   r   r2   )r   r"   r&   r,   r3     s     NativeFunctions.hzDispatchKeyNativeFunctions.hc                      s   j j  dS )N)generated_commentZnamespace_prologuer    Znamespace_epilogueZdispatch_declarationsZBackendNamer   )prologueepiloguer&   )autograd_declarationsbackend_declarationsr   r   r    r   	ns_helperr&   r,   r3     s    )rF   sortedr[   r   r   write_with_template)r   r    r!   r"   r$   r   r   r   r&   )	r   r   r   r   r"   r   r    r   r   r,   "gen_dispatchkey_nativefunc_headersc  s2    

r   FTr   )r   r   r    r"   r$   r   rA   selectorbuild_in_treeper_operator_headersr   eager_registrationr%   c                    s   | d| dg}|r,d dd |D nd dd |D d k	sLt|  tttj tj
dd dd	}dtd
ddd|rt	d}|j
|dnt	d}|j
|
|dd dd 	
fdd d S )N/r   ro   c                 s   s   | ]}d | dV  qdS )z
#include <>Nr&   r*   hr&   r&   r,   	<genexpr>  s     z/gen_dispatcher_registrations.<locals>.<genexpr>c                 s   s   | ]}d | dV  qdS )z
#include ""Nr&   r   r&   r&   r,   r     s     FTrocmr;   Zclass_method_nameZskip_dispatcher_op_registrationat)Znamespace_strrl   zPTORCH_LIBRARY_IMPL(aten, $dispatch_key, m) {
    $dispatch_registrations_body
};)rA   dispatch_registrations_bodyzTORCH_API void Register${backend_name}${dispatch_key}NativeFunctions();
TORCH_API void Register${backend_name}${dispatch_key}NativeFunctions() {
    static auto m = MAKE_TORCH_LIBRARY_IMPL(aten, $dispatch_key);
    $dispatch_registrations_body
})r   rA   r   ZRegisterz.cppzRegisterDispatchKey.cppc                      sP   d	sdnd  tj 	ddd 
fdddS )	Nrl   z#include <ATen/Functions.h>F)r   r   zRegisterDispatchDefinitions.inic                      sF   j jt  dtttj tj	dd dddS )Nrl   FTr   )Zns_prologueZns_epilogue"static_init_dispatch_registrationsdeferred_dispatch_registrationsZdispatch_helpersdispatch_namespaceZdispatch_namespaced_definitionsZdispatch_anonymous_definitions)
r   r   r   Zgen_registration_helperslowerr0   r   RegisterDispatchKeyr   ZANONYMOUS_DEFINITIONr&   )backend_indexr    r   rA   r$   r   r   r   r&   r,   r3     s,    	z@gen_dispatcher_registrations.<locals>.<lambda>.<locals>.<lambda>)Zextra_cuda_headersZexternal_backend_headersZops_headersr   r   Zdispatch_headersZdispatch_definitions)r   r   Zgen_registration_headersZsubstitute_with_templatesplitr&   r   r    r   rA   Zexternal_backend_headers_strr   r$   newliner   r   r   r   r&   r,   r3     s&      z.gen_dispatcher_registrations.<locals>.<lambda>)r_   rF   r0   r   r   r   r   ZREGISTRATIONr   r   
substituter   )r   r   r    r"   r$   r   rA   r   r   r   r   r   headersr   Zstatic_templateZdeferred_templater&   r   r,   gen_dispatcher_registrations  s\    	

 r   )r   r   r   r   r%   c              
      s@  t tjj }tj|dtt	d fdd}||}tj|d}tj|d}t
||}	|	j|	j }
}t|
}t| ||}|j}|j}|j}|j}|j}t }|d krd S |d kr||  }|d k	st|d k	rt|
||||| t||||||| |d kr|gn||gD ]}t|||||||| qd S )Nzaten/src/ATen/templates)install_dirr%   c                    s   t |  dS )N)r   template_dirr   )r   )r   r   r   r&   r,   make_file_manager  s
      zrun.<locals>.make_file_managerz*aten/src/ATen/native/native_functions.yamlzaten/src/ATen/native/tags.yaml)pathlibPath__file__parentabsoluteospathr_   r`   r   r   rd   r"   r   rc   r   r   r!   r    r   Zget_nop_selectorZnative_function_class_namerF   rx   r   r   )r   r   r   r   Zpytorch_rootr   r   Znative_yaml_pathZtags_yaml_pathZparsed_yamlrd   r"   r$   Zparsed_backend_yamlr   r   r!   r    r   rA   r&   r   r,   r     sx     
  	r   __main__)N)rl   )FFrl   T)N)9r|   r   r   rs   collectionsr   r   r   typingr   r   r   r   r	   r
   rU   Ztorchgen.api.dispatcherapirG   Ztorchgen.destr   Ztorchgen.api.typesr   Ztorchgen.code_templater   Ztorchgen.contextr   Ztorchgen.genr   r   Ztorchgen.modelr   r   r   r   r   r   Z!torchgen.selective_build.selectorr   Ztorchgen.utilsr   r   r   r   r   Ztorchgen.yaml_utilsr   r   r`   rc   rx   r   r   rY   r   r   __name__r&   r&   r&   r,   <module>   s     
 Y 

U  
C    
s    R
