o
    kiZ                     @  s  d dl m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
 d dl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rd dl-m.Z. edg dZ/dEddZ0	dFdGd%d&Z1dHd'd(Z2	)dIdJd0d1Z3	2	2	)	3dKdLd<d=Z4	dFdMdBdCZ5e6dDkre2  dS dS )N    )annotationsN)Counterdefaultdict
namedtuple)Path)TYPE_CHECKING)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)SequenceParsedExternalYaml)backend_keyautograd_key
class_namecpp_namespacebackend_indicesbackend_yaml_pathstrgrouped_native_functions/Sequence[NativeFunction | NativeFunctionsGroup]r    dict[DispatchKey, BackendIndex]returnc                   sT  dd t dd |D t| }tj|td}W d    n1 s"w   Y  t|ts5tdt| g d}|	dd d u rGtd	|	d
d }|	dd d u r[td|	dd}t|t
smtd| |	dd}t|t
std| |	dg }	|	d u rg }	t|	tstd|	 dt|	 d|	dg }
|
d u rg }
t|
tstd|
 dt|
 dt|
}|	dg }t|tstd| |	dg }|	| |	di  |	di  t| dkrt|  dd|  d d| d?fd+d,}d t|	dkrMtfd-d tW d    n	1 s/w   Y  ||	|||d.}v rItd/ |< d  t|dkrtfd0d td1  W d    n	1 srw   Y  ||| ||d.} v rtd2  | < |D ]}t|trÈd u rg nd3d4  |fD } d u rg nd5d4   |fD }n0d u rg nd6d4 fd7d4| D D } d u rg nd8d4  fd9d4| D D }d:d4 |D }d;d4 |D }t|dks t|dks td<|d j d=|d j d>qt |S )@Nc                 S  s   i | ]}|j j|qS  funcname.0fr'   r'   d/var/www/addictedbytheproject.nl/epg/venv/lib/python3.10/site-packages/torchgen/gen_backend_stubs.py
<dictcomp>0   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>3   s    z$parse_backend_yaml.<locals>.<lambda>)Loaderz'Expected yaml_values to be a dict, got )
backendr   r   extra_headers	supportedautogradfull_codegen
non_nativeir_gensymintr7   z&You must provide a value for "backend"r   r   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: r9   z,expected "supported" to be a list, but got: z
 (of type )r>   z)expected "symint" to be a list, but got: r:   z+expected "autograd" to be a list, but got: r;   r<   r=   r   z contains unexpected keys: z, z). Only the following keys are supported: backend_ops	list[str]
symint_opsset[str]dispatch_keyr   booluse_device_guardr&   r   c          
        sv   i }| D ]-}t |}|vrtd| t| j}||v r&|d7 }t|d d}	|	||< qt||d||dS )Nz Found an invalid operator name: _symintF)kernel
structuredr   T)rF   r?   externalr@   index)r   parseAssertionError
dispatcherr*   r)   r   r   )
rB   rD   rF   r?   rH   metadataopop_namekernel_namem)r   native_functions_mapr'   r.   create_backend_index   s&   

z0parse_backend_yaml.<locals>.create_backend_indexc                        d  dS )NzFThe provided value for "backend" must be a valid DispatchKey, but got .r'   r'   r7   r'   r.   r5      s    )r?   rH   zDuplicate backend key: c                     rX   )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'   rZ   r'   r.   r5      s    AutogradzDuplicate autograd key: c                 S     g | ]}|d ur|qS r0   r'   r,   rU   r'   r'   r.   
<listcomp>   
    z&parse_backend_yaml.<locals>.<listcomp>c                 S  r\   r0   r'   r]   r'   r'   r.   r^      r_   c                 S  r\   r0   r'   r]   r'   r'   r.   r^      
    c                   s   g | ]	}   |qS r'   
get_kernelr+   )r    r   r'   r.   r^          c                 S  r\   r0   r'   r]   r'   r'   r.   r^      r`   c                   s   g | ]	}   |qS r'   ra   r+   )r   r    r'   r.   r^      rc   c                 S  r\   r0   r'   r+   r'   r'   r.   r^          c                 S  r\   r0   r'   r+   r'   r'   r.   r^      rd   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".)rB   rC   rD   rE   rF   r   r?   rG   rH   rG   r&   r   )r   openyamlloadr   r1   dictrO   typepoprG   r2   setextendlenkeysjoinr   r   rN   r   rb   r3   rJ   r   )r!   r#   r    r-   yaml_values
valid_keysr   r?   rH   r9   r>   
symint_setsupported_autogradr;   rW   backend_idxautograd_idxgforward_kernelsbackward_kernelsr'   )r   r7   r    r   r   rV   r.   parse_backend_yaml+   s  
















ry   native_functionsSequence[NativeFunction]r   r   r   DispatchKey | Noner   kernel_defn_file_pathr;   list[OperatorName] | NoneNonec                   s  zt |}| }W d    n1 sw   Y  W n ty. }	 ztd| |	d }	~	ww d u r5g || jg|d u r@g n|| jg }
tttdd |
fdd| D }tt}|D ]}||j	j
  | qbd| d}tdd t||D }d	}| D ]5\}}t|}|| }||krddd d fdd|D }|d| d| d| d| d| d7 }q|d	krt|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'   )rJ   )r,   rS   rQ   r'   r'   r.   r^   '  s    z>error_on_missing_kernels.<locals>.<lambda>.<locals>.<listcomp>)items)rM   r'   r'   r.   r5   '  s    z*error_on_missing_kernels.<locals>.<lambda>c                   s(   g | ]}|j j v r|j jvr|qS r'   r(   r+   )expected_backend_op_namesr;   r'   r.   r^   .  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.   r^   D  s     r-   r   r&   r"   c                 S  s<   t |  t| j W  d    S 1 sw   Y  d S r0   )r
   r   from_schemar)   declr4   r'   r'   r.   create_declQ  s   
$z-error_on_missing_kernels.<locals>.create_decl
c                   s   g | ]} |qS r'   r'   r+   )r   r'   r.   r^   U  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

)r-   r   r&   r"   )re   readOSErrorrO   rM   rh   r2   r   r   r)   r*   appendr   refindallr   rm   ro   )rz   r    r   r   r   r}   r;   r-   backend_defnseindicesexpected_backend_native_funcs#expected_backend_kernel_name_countsnative_fkernel_defn_regex!actual_backend_kernel_name_countsmissing_kernels_err_msgexpected_namefuncsexpected_overload_countactual_overload_countexpected_schemas_strr'   )r   r   r;   r.   error_on_missing_kernels  s   	








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)ri   defaultr   z--impl-pathz--impl_pathz9path to the source C++ file containing kernel definitions)argparseArgumentParseradd_argumentrG   r"   
parse_argsrunsource_yaml
output_dirdry_run	impl_path)parseroptionsr'   r'   r.   main`  s(   
r   r   fmr   r   backend_dispatch_keyautograd_dispatch_keybackend_namec                   s   d u rt ddtttfdd|tttfdd| t||  dd fdd d S )	Nclass_name must not be NonezAAutogenerated file by gen_backend_stubs.py. Do not edit directly!c                   s   t |   S r0   dest#compute_native_function_declarationr4   )r   r    r'   r.   r5     s    z4gen_dispatchkey_nativefunc_headers.<locals>.<lambda>c                   s    d u rg S t |   S r0   r   r4   )r   r    r'   r.   r5     s
   NativeFunctions.hzDispatchKeyNativeFunctions.hc                     s   j j  dS )N)generated_commentnamespace_prologuer   namespace_epiloguedispatch_declarationsBackendNamer   )prologueepiloguer'   )autograd_declarationsbackend_declarationsr   r   r   r   	ns_helperr'   r.   r5     s   )rO   sortedrk   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_headersx  s4   

r   FTr   rF   selectorr   build_in_treerG   per_operator_headerseager_registrationc                   s   | d| dg}|rd dd |D n
d dd |D d u r(td|  tttj tj
dd	 dd
}dtdddd|rXt	d}|j
|dnt	d}|j
|
|dd dd 	
fdd d S )N/r   r   c                 s      | ]	}d | dV  qdS )z
#include <>Nr'   r,   hr'   r'   r.   	<genexpr>      z/gen_dispatcher_registrations.<locals>.<genexpr>c                 s  r   )z
#include ""Nr'   r   r'   r'   r.   r     r   r   FTrocmr>   class_method_nameskip_dispatcher_op_registrationat)namespace_strr   zOTORCH_LIBRARY_IMPL(aten, $dispatch_key, m) {
    $dispatch_registrations_body
})rF   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   rF   r   Registerz.cppzRegisterDispatchKey.cppc                     sX   d	sdnd  tj 	ddt d 
fdddS )	Nr   z#include <ATen/Functions.h>F)r   r   zRegisterDispatchDefinitions.inic                     s>   j j dtttj tjdd dddS )Nr   FTr   )ns_prologuens_epilogue"static_init_dispatch_registrationsdeferred_dispatch_registrationsdispatch_namespacedispatch_namespaced_definitionsdispatch_anonymous_definitions)	r   r   lowerr2   r   r   RegisterDispatchKeyr   ANONYMOUS_DEFINITIONr'   )backend_indexr   r   rF   r#   r   r   r   r'   r.   r5   
  s*   	z@gen_dispatcher_registrations.<locals>.<lambda>.<locals>.<lambda>)extra_cuda_headersexternal_backend_headersops_headersr   r   dispatch_headersdispatch_helpersdispatch_definitions)r   r   gen_registration_headersgen_registration_helperssubstitute_with_templatesplitr'   r   r   r   rF   external_backend_headers_strr   r#   newliner   r   r   r   r'   r.   r5     s"   z.gen_dispatcher_registrations.<locals>.<lambda>)ro   rO   r2   r   r   r   r   REGISTRATIONr   r	   
substituter   )r   r   r   r    r#   r   rF   r   r   r   r   r   headersr   static_templatedeferred_templater'   r   r.   gen_dispatcher_registrations  s^   	

 r   r   r   r   
str | Nonec              
     s8  t t jj}tj|dd fdd}||}tj|d}tj|d	}t||}	|	j|	j	}
}t
|
}t| ||}|j}|j}|j}|j}|j	}t }|d u rXd S |d u rb||  }|d u rjtd
|d urwt|
||||| t||||||| |d u r|gn||gD ]}t|||||||| qd S )Nzaten/src/ATen/templatesinstall_dirr"   r&   r   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.yamlr   )r   r"   r&   r   )r   __file__absoluteparentospathro   r   rz   r    r   ry   r   r   r   r   r   get_nop_selectornative_function_class_namerO   r   r   r   )r   r   r   r   pytorch_rootr   r   native_yaml_pathtags_yaml_pathparsed_yamlrz   r    r#   parsed_backend_yamlr   r   r   r   r   rF   r'   r   r.   r   %  sv   
	r   __main__)r!   r"   r#   r$   r    r%   r&   r   r0   )rz   r{   r    r%   r   r   r   r|   r   r"   r}   r"   r;   r~   r&   r   )r&   r   )r   )r   r   r   r"   r   r"   r    r%   r#   r$   r   r   r   r|   r   r"   r&   r   )FFr   T)r   r   r   r"   r   r"   r    r%   r#   r$   r   r   rF   r   r   r   r   rG   r   rG   r   r"   r   rG   r&   r   )
r   r"   r   r"   r   rG   r   r   r&   r   )7
__future__r   r   r   r   collectionsr   r   r   pathlibr   typingr   rf   torchgen.api.dispatcherapirP   torchgen.destr   torchgen.api.typesr   torchgen.code_templater	   torchgen.contextr
   torchgen.genr   r   torchgen.modelr   r   r   r   r   r   !torchgen.selective_build.selectorr   torchgen.utilsr   r   r   r   r   torchgen.yaml_utilsr   collections.abcr   r   ry   r   r   r   r   r   __name__r'   r'   r'   r.   <module>   sR     
 h
U DtS
