U
    <c                    @   s6  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mZmZ d dl	m
Z
 d dlmZmZmZmZmZmZmZmZmZ d dlZd dlmZ d dlm  mZ d dlm  mZ d dlm  m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(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. d d	l/m0Z0m1Z1m2Z2m3Z3 d d
l4m5Z5m6Z6m7Z7m8Z8 d dl9m:Z: d dl;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZR d dlSmTZTmUZUmVZVmWZW d dlXmYZY d dlZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZd edZeG dd dedZfi agi ahedddgZidejeek eeeA  ekeleidddZmdejekeek dddZnejoddekeek dd d!Zpddd"ekekeeeA  eleid#d$d%ZqeeG dd&d'd(Zrekekd)d*d+Zsee= eeA d,d-d.ZteGe=eeA d/d0d1ZueGee= eek d/d2d3Zvee= eek d,d4d5Zwee)e+f e)ekd6d7d8Zxee)e+f eGe=ekd9d:d;Zyee)e+f eGee= ekd<d=d>Zzee)e+f eGee= ekd<d?d@Z{e
dAdBG dCdD dDZ|e
dAdBG dEdF dFZ}e
dAdBG dGdH dHZ~e
dAdBG dIdJ dJZe
dAdBG dKdL dLZe2eGekdMdNdOZeHeek dPdQdRZeGeYeldSdTdUZe
dAdBG dVdW dWZejekdXdYdZZekejd)d[d\ZePekd]d^d_ZeeQ eek d`dadbZeGeeeekekf  eekekf f dMdcddZe(eleek eek eekekf ejdedfdgZe<eleek eek eekekf ejdhdidjZe2eGejdMdkdlZeGeldMdmdnZe3eGeeAe=f ekdodpdqZeeek  eek eYdrdsdtZeeG eeeGeIf  dudvdwZeeG eeeGeHf  dudxdyZeeeGeHf  eeAe=f eek dzd{d|ZeeGeHf e=ekd}d~dZe^eeeGeHf  eAe=eYeleleleleek d
ddZeeeGeHf  eAe=eYeleleek dddZeeG eYeeek ekf dddZeeG eeeGeHf  eeH ee= eYeeAe=f e^e^eeA eeA elddddZeeG eeeGeHf  ee= eYeeAe=f e^e^e^eeA eeA elddddZeeG eek eeeGeHf  eeH ee= eYeeAe=f e^e^e^e^eeA eeA elelddddZeeG eeeGeHf  eeH eeI eYee= eeAe=f e^e^e^e^eeA eeA elelelelddddZe^eeG ddddZejdddZddddZedkr2e  dS )    N)defaultdict
namedtupleOrderedDict)	dataclass)	AnyDictListOptionalSequenceSetTupleTypeVarUnion)Literal)cpp)	translate)BindingCppSignatureCppSignatureGroupDispatcherSignature
NamedCTypeNativeSignatureSpecialArgName)method_with_native_functionnative_function_managerwith_native_function with_native_function_and_indices)gen_composite_view_copy_kernel gen_functionalization_definition"gen_functionalization_registration.gen_functionalization_view_inverse_declarationgen_all_vmap_plumbing)ArgumentBackendIndexBackendMetadataBaseOperatorNameDEFAULT_KERNEL_NAMESPACEDispatchKeyFunctionSchemais_cuda_dispatch_keyis_generic_dispatch_keyis_ufunc_dispatch_keyLocationNativeFunctionNativeFunctionsGroupNativeFunctionsViewGroupOperatorNameOptionalType
SchemaKindSelfArgumentSTRUCTURED_DISPATCH_KEYSTensorOptionsArgumentsTypeVariantViewSchemaKind)add_generated_native_functionsgen_composite_functional_kernelgen_composite_out_kernelpre_group_native_functions)SelectiveBuilder)
assert_never	concatMapcontextFileManagermake_file_managermapMaybeNamespaceHelperTarget
YamlDumper
YamlLoaderTc                       s   e Zd Zd fdd	Z  ZS )
LineLoaderFc                    s$   t  j||d}|jjd |d< |S )N)deep   __line__)superconstruct_mappingZ
start_markline)selfnoderK   mapping	__class__ 0/tmp/pip-unpacked-wheel-gikjz4vx/torchgen/gen.pyrO   {   s    zLineLoader.construct_mapping)F)__name__
__module____qualname__rO   __classcell__rV   rV   rT   rW   rJ   z   s   rJ   
ParsedYamlnative_functionsbackend_indices<stdin>F)es
valid_tagsignore_keyspathskip_native_fns_genreturnc              
      s   t | tstg }tt}| D ]|}t |dts:t|t||d |d t fdd0 t	
|||\}}	|| t||	 W 5 Q R X qt| tdd }
|st|| | D ]"\}}t|ddt||d|
|< qt||
S )	NrM   funcc                      s   d d  S Nzin z:
  rV   rV   funcslocrV   rW   <lambda>       z*parse_native_yaml_struct.<locals>.<lambda>c                   S   s   t tjdddi dS )NTFdispatch_keyZuse_out_as_primaryZexternaldevice_guardindex)r$   r(   	UndefinedrV   rV   rV   rW   rk      s   TFrm   )
isinstancelistAssertionErrorr   dictgetintr-   rA   r.   Z	from_yamlappendr$   Z
grow_indexerror_check_native_functionsr:   itemsr*   r\   )r`   ra   rb   rc   rd   rsbserf   mindiceskvrV   rh   rW   parse_native_yaml_struct   s4    


r   )r`   rc   re   c              
      s   t | tstt }| D ]}t |dts4t|t||d  |dt fdd: | }|	d}|	dd}|dkst|
| W 5 Q R X q|S )NrM   tagc                      s   d  d S rg   rV   rV   rj   tagsrV   rW   rk      rl   z(parse_tags_yaml_struct.<locals>.<lambda>desc )rr   rs   rt   setrv   rw   r-   rA   copypopadd)r`   rc   r{   r}   Ze_inamer   rV   r   rW   parse_tags_yaml_struct   s    

r   )maxsize)rc   re   c              	   C   sD   | t kr<t| d$}tj|td}t|| dt | < W 5 Q R X t |  S )NrLoader)rc   )_GLOBAL_PARSE_TAGS_YAML_CACHEopenyamlloadrJ   r   )rc   fr`   rV   rV   rW   parse_tags_yaml   s
    r   )rd   )rc   tags_yaml_pathrb   rd   re   c             	   C   sR   | t krJt|}t| d}tj|td}W 5 Q R X t|||| |dt | < t |  S )Nr   r   )rc   rd   )_GLOBAL_PARSE_NATIVE_YAML_CACHEr   r   r   r   rJ   r   )rc   r   rb   rd   ra   r   r`   rV   rV   rW   parse_native_yaml   s    
r   )ri   re   c                 C   s   i }t t}| D ]$}|||jj< ||jjj | q| D ]}|jd k	rz||j }|jszt|jj d|j d|j dd|jkr:t	|jjdkr:|jjj}|jjj
}|jst|jj dt|jd|j}t|| dks:t|jj d	| d
q:d S )Nz0 is marked as a structured_delegate pointing to z, but zY is not marked as structured. Consider adding 'structured=True' to the delegated operatorZinplace_viewZresize_z is marked with tag: inplace_view, but it doesn't follow the naming convention for inplace ops - the codegen expects the base name to have a trailing underscore. Fr   zw is marked with tag: inplace_view. The codegen expects there to be a corresponding out-of-place view op with the name 'z/' and matching schema, but it didn't find one. )r   rs   rf   r   rx   structured_delegate
structuredrt   r   stroverload_nameinplacer&   baseZdunder_methodlen)ri   Zfunc_mapZbase_func_mapr   Zdelegate_func	base_namer   Zout_of_place_base_namerV   rV   rW   ry      s2    




  ry   )sre   c                 C   sl   |  dd} |  dd} |  dd} |  dd} |  d	d
} |  dd} |  dd} |  dd} d|  dS )z1Convert a python string into a c++ string literal\z\\"z\"z\az\bz\f
z\nz\v	z\t)replacer   rV   rV   rW   
cpp_string  s    r   )backendsre   c                 C   s6   t | dkrg S dd | D tjtjtjtjg S d S )Nr   c                 S   s   g | ]
}|j qS rV   )rn   ).0backendrV   rV   rW   
<listcomp>-  s     z(static_dispatch_keys.<locals>.<listcomp>)r   r(   CompositeImplicitAutograd%CompositeImplicitAutogradNestedTensorCompositeExplicitAutograd&CompositeExplicitAutogradNonFunctionalr   rV   rV   rW   static_dispatch_keys)  s    r   )r   backend_indexre   c                 C   sN   | j d k	s|| r|jS | jr&tjS | jr2tjS | jr>tj	S | j
rJtjS d S N)r   
has_kernelrn   &has_composite_explicit_autograd_kernelr(   r   5has_composite_explicit_autograd_non_functional_kernelr   &has_composite_implicit_autograd_kernelr   4has_composite_implicit_autograd_nested_tensor_kernelr   )r   r   rV   rV   rW   get_static_dispatch_backend5  s    r   c                 C   sZ   |d ks| j rd S g }|D ]4}t| |}|d k	r|d| j d|  d qd|S )N#include <ATen/ops/__dispatch.h>r   )manual_kernel_registrationr   rx   	root_namelowerjoin)r   r   outputrp   rn   rV   rV   rW   static_dispatch_ops_headerI  s    
r   c                 C   s   dd t | D S )Nc                 S   s   g | ]}d | dqS )#include <ATen/Functions.h>rV   )r   rn   rV   rV   rW   r   Z  s   z1static_dispatch_extra_headers.<locals>.<listcomp>)r   r   rV   rV   rW   static_dispatch_extra_headersY  s    r   )sigcpp_sigre   c                 C   sr   t t t t ddd}t|  }t| }|D ]}|jjtjkr4||} qTq4t||}d	dd |D S )N)input_bindingsre   c                 S   sT   g }| D ]F}|j dkrDtttj|jj|j |j|jd}|	| q|	| q|S )NZmemory_format)nctyper   defaultargument)
r   r   r   r    possibly_redundant_memory_formatr   typer   r   rx   )r   Zoutput_bindingsZbindingZspl_mem_format_bindingrV   rV   rW   add_spl_memory_format_bindingi  s    
	z5translate_args.<locals>.add_spl_memory_format_binding, c                 s   s   | ]}|j V  qd S r   exprr   arV   rV   rW   	<genexpr>  s     z!translate_args.<locals>.<genexpr>)
r   r   rs   	argumentsr   r   r   r   r   r   )r   r   r   Zsrc_bindingsZgoal_bindingsargexprsrV   rV   rW   translate_argsc  s    
r   )r   r   r   re   c           
   	   C   s   t j|ddd}| jr(|j r(|j}n|j}|d k	s:t| }t	| |}|
|}|rf|jrf|jnt}|dd}	d|	 d|j  d| d| d	S )	NFmethodZfallback_binding::nativer   return ::();)r   from_native_functionsymintrf   
has_symintsymint_signature	signaturert   r   r   
get_kernelcpp_namespacer'   r   rn   r   )
r   r   r   cpp_sigsr   r   r   backend_metadataZ	kernel_nsnsrV   rV   rW   %generate_static_dispatch_backend_call  s(      

r   )r   r   r^   re   c              	   C   s(  t j|ddd}| jr(|j r(|j}n|j}|d k	s:t| }t	| |}t
dd}|jrd| dtj  d| d| d	S |jrd| dtj  d| d| d	S |jrd| dtj  d| d| d	S |jrd| dtj  d| d| d	S d	| d
ddd |D  dS d S )NFr   r   r   r   r   r   r   z5TORCH_CHECK(false, "Static dispatch does not support z forr   c                 S   s   g | ]}t |jqS rV   )r   rn   )r   rp   rV   rV   rW   r     s     z:generate_static_dispatch_fallback_call.<locals>.<listcomp>z ");)r   r   r   rf   r   r   r   rt   r   r   r'   r   r   r(   r   r   r   r   r   r   r   r   r   )r   r   r^   r   r   r   r   r   rV   rV   rW   &generate_static_dispatch_fallback_call  s.      
$$$$r   c                    sH  t |dks jrdS  fdd|D }t |dkrDt|  |d S t |dkr\t|  |S dd |  D }d|} jjj}g }g }|dk	r|d	 |dkr|d
| d |dd| d |d g }	|D ]2}
|	d|
j	 d |	dt|  |
 d qt|  |}d}d|| d||	 d| dS )a  
    For a given `NativeFunction`, find out the corresponding backend and dispatch to it. If more than one
    backends exsit, fallback to static dispatch by determining dispatch key from inputs.
    Arguments:
        sig: A CppSignature or DispatcherSignature for this native function we want to use.
        f: NativeFunction to generate static dispatch.
        backend_indices: All available backends.
    Return:
        C++ code to call backend-specific functions, e.g., "return at::cpu::add(self, other, scale);"
    r   r   c                    s.   g | ]&}|  s& jd k	r|jtkr|qS r   )r   r   rn   r5   )r   br   rV   rW   r     s
   


z#static_dispatch.<locals>.<listcomp>rL   c                 S   s6   g | ].}t |jts,t |jtr|jj r|jqS rV   )rr   r   r4   r#   r   is_tensor_liker   r   rV   rV   rW   r     s
   r   Nz>DispatchKeySet(c10::computeDispatchKey(dtype, layout, device))z$c10::detail::multi_dispatch_key_set()zDispatchKeySet _dk_set = z | ;z=DispatchKey _dk = c10::highestPriorityBackendTypeId(_dk_set);zcase DispatchKey:::r   z
		
    z
    switch (_dk) {
        z
        default:
            z
    }
    )
r   r   r   r   r   r   rf   tensor_optionsrx   rn   )r   r   r^   keysnative_tensor_argstensor_argsZtensor_optsZstmtsZsubexprsZdispatch_coderp   fallbackZ	connectorrV   r   rW   static_dispatch  sN    
	


r   T)frozenc                   @   s.   e Zd ZU eed< eeee dddZ	dS )RegisterSchemaselectorr   re   c                 C   sJ   | j |sd S dddd |jD  d }dtt|j d| dS )N{r   c                 S   s   g | ]}d | qS )z	at::Tag::rV   )r   r   rV   rV   rW   r     s     z+RegisterSchema.__call__.<locals>.<listcomp>}zm.def(z);
)r  is_native_function_selectedr   r   r   r   rf   )rQ   r   r   rV   rV   rW   __call__  s    zRegisterSchema.__call__N)
rX   rY   rZ   r>   __annotations__r   r.   r	   r   r  rV   rV   rV   rW   r  	  s   
r  c                   @   sJ   e Zd ZU eeej eej f ed< e	e
 ed< eeedddZdS )ComputeOperatorstargetstatic_dispatch_backend_indicesr  c                 C   s  t |j}|jj }| jtjkrd| d|  d|jjj d|jjj	 dt
t|j d|jddd	 d
|jddd	 dS | jtjkrd| d|jjj d| d|jjj	 d| dt
t|j d|j d| d| d| d| d| d}dD ]}|r(ddgdd | D  }d}nddd | D }d}|}| d | }	d!| d"| d#| d$}
|st| jd%krt||| jd&}
|d'|j d(|j|	|d	 d)|
 d*7 }q|S t| j d S )+Nz
struct TORCH_API z {
  using schema = z;
  using ptr_schema = schema*;
  // See Note [static constexpr char* members for windows NVCC]
  STATIC_CONSTEXPR_STR_INL_EXCEPT_WIN_CUDA(name, "aten::z>")
  STATIC_CONSTEXPR_STR_INL_EXCEPT_WIN_CUDA(overload_name, "z:")
  STATIC_CONSTEXPR_STR_INL_EXCEPT_WIN_CUDA(schema_str, z)
  static callF)r   is_redispatching_fnz;
  static Z
redispatchTz;
};z+
STATIC_CONST_STR_OUT_OF_LINE_FOR_WIN_CUDA(z, name, "aten::z-")
STATIC_CONST_STR_OUT_OF_LINE_FOR_WIN_CUDA(z, overload_name, "z, schema_str, z)

// aten::z.
static C10_NOINLINE c10::TypedOperatorHandle<z::schema> create_zQ_typed_handle() {
  return c10::Dispatcher::singleton()
      .findSchemaOrThrow(z::name, z::overload_name)
      .typed<z::schema>();
}
)FTr   dispatchKeySetc                 S   s   g | ]
}|j qS rV   r   r   rV   rV   rW   r   X  s     z-ComputeOperators.__call__.<locals>.<listcomp>c                 S   s   g | ]
}|j qS rV   r  r   rV   rV   rW   r   \  s     r   z
    static auto op = create_z_typed_handle();
    return op.r   r   r   r^   

// aten::r    {
    z
}
)r   from_schemarf   r   unambiguous_namer
  rF   DECLARATIONr   r   r   r   defn
DEFINITIONr   r   r   r  r   r?   )rQ   r   r   r   Zdefnsr  Zdispatcher_exprs_strZmethod_baseZdispatcher_callmethod_nameZfn_bodyrV   rV   rW   r    s    	  zComputeOperators.__call__N)rX   rY   rZ   r   r   rF   r  r  r  r   r$   r   r.   r   r  rV   rV   rV   rW   r	    s   
r	  c                   @   s$   e Zd Zeeee dddZdS )ComputeFunctionr  c                 C   s   t j|jkrd S tj|d|jd}d}| D ]f}t|j	}t
| | }ddd |D }|d|j	 d|  d	|j	j  d
| d	7 }q.|S )NFr   r   r   c                 S   s   g | ]
}|j qS rV   r   r   r}   rV   rV   rW   r     s     z,ComputeFunction.__call__.<locals>.<listcomp>r  
inline  {
    return at::_ops::::call();
}
)r8   functionvariantsr   r   manual_cpp_binding
signaturesr   r  rf   r   r   r   declr   r  rQ   r   	sig_groupresultr   Z
target_sigr   Z	exprs_strrV   rV   rW   r  }  s,      
zComputeFunction.__call__NrX   rY   rZ   r   r.   r	   r   r  rV   rV   rV   rW   r  {  s   r  c                   @   sN   e Zd ZU eeej eej f ed< e	e
 ed< eeee dddZdS )ComputeTensorMethodr
  r  r  c                 C   s  t j|jkrd S |j rt|jjjd k	s0ttj	|d|j
d}| jtjkrvd}| D ]}||  d7 }qZ|S | jtjk	rt| j d}| D ]n}t|j}t| | dd}ddd |D }|d	|j d
|jdd d|jj  d| d	7 }q|S )NTr   r   z const;
)r   r   c                 S   s   g | ]
}|j qS rV   r   r  rV   rV   rW   r     s     z0ComputeTensorMethod.__call__.<locals>.<listcomp>r  r  zTensor::)prefixz const {
    return at::_ops::r  r  )r8   r   r   rf   	is_out_fnrt   r   Zself_argr   r   r!  r
  rF   r  r"  r#  r  r?   r   r  r   r   r  r   r  r$  rV   rV   rW   r    s>      


zComputeTensorMethod.__call__N)rX   rY   rZ   r   r   rF   r  r  r  r   r$   r   r.   r	   r   r  rV   rV   rV   rW   r(    s   
r(  c                   @   s$   e Zd Zeeee dddZdS )ComputeRedispatchFunctionr  c                 C   s   t j|d|jd}d}| D ]p}t|j}t| | }d	dgdd |D  }|d|j d	|j
d
d d|jj  d| d	7 }q|S )NFr   r   r   r  c                 S   s   g | ]
}|j qS rV   r   r   rV   rV   rW   r     s     z6ComputeRedispatchFunction.__call__.<locals>.<listcomp>r  r  T)r  r  z::redispatch(r  )r   r   r!  r"  r   r  rf   r   r   r   r#  r   r  r$  rV   rV   rW   r    s(      

z"ComputeRedispatchFunction.__call__Nr'  rV   rV   rV   rW   r+    s   r+  r  c                 C   s   d| j jj d| j jj dS )Nz{"aten::z", "z"},)rf   r   r   r   rV   rV   rW   compute_aten_op  s    r,  gre   c                 C   s  | j s
d S t| j t| }t | }ddd |D }| jj}|d krTd}d}| j rf| jjnd }|rZ|j	
 |jf}dd |D }dd |D }	dd	d |	D }
d
|
 d}dd |D }ddd |D }g }t|D ]"\}}d|	d | dg |	|d d   }d| d}|| jdd}| d|j d| d}d|| j d}d|	|  d| d}g }|| d t|D ]F\}}||kr|d|j d n|d|j d|j d  q|d! d"|}|d#| d$| d%| d& qd"|}ddgt|	 }d'| d(}d)}d*| d+| d#| d,}nd-}d-}d.| d/| d0| d1| d1| d2| d3W  5 Q R  S Q R X d S )4Nr   c                 s   s   | ]}|  V  qd S r   )r#  r   rV   rV   rW   r     s     z4compute_meta_function_declaration.<locals>.<genexpr>zat::impl::MetaBasevoidc                 S   s   g | ]}|D ]}|qqS rV   rV   )r   Zreplace_listelemrV   rV   rW   r     s      z5compute_meta_function_declaration.<locals>.<listcomp>c                 S   s   g | ]}|j  qS rV   )r   upperr   r0  rV   rV   rW   r      s    c                 s   s   | ]}d | dV  qdS )zbool z = falseNrV   )r   paramrV   rV   rW   r     s    z
template <>c                 S   s   g | ]}t j||jd qS ))binds)r   argument_typer   r2  rV   rV   rW   r   	  s   z;
c                 s   s&   | ]}|j d d d|j V  qdS )TZ	strip_ref N)cpp_typer   r2  rV   rV   rW   r     s   truerL   zprecompute_out<Tr7  z set_r   z value)r   z already set"zstatic_assert(z == false, r   z ret;zret.z	 = value;z	 = this->r   zreturn ret;r   z
                    z {
                        z
                        z'
                    }
                z'using meta_return_ty = precompute_out <z>;Zmeta_return_tyz
                zG
                struct TORCH_API precompute_out {
                    z;
            };r   zstruct TORCH_API structured_z
 : public r  r   z meta(z);
};
)r   r   outmetar   Zmeta_argumentsr   Zstructured_inheritsprecomputedr   valuesr   	enumerater9  rx   r   )r.  r   argsargs_strZparent_classZmeta_returnr=  Zprecomputed_valuesZprecomputed_elementsZprecomputed_template_parametersZprecomputed_template_params_strZprecompute_template_declZ#precomputed_elements_with_cpp_typesZprecomputed_elements_declZsetter_methodsir0  Zreturn_ty_templatesZ	return_tyZelem_cpp_tyr   Z
assert_msgZassert_stmtZconstruction_stmtsjZconstruction_blockZsetter_methods_declZmeta_return_template_paramsZmeta_return_typedefZprecomputed_declrV   rV   rW   !compute_meta_function_declaration  s    









rD  )r   r  re   c                 C   sB   t | jjj}|ds"|dr&dS | jjjd kr8dS || S )NZ_likeZnew_F)r   rf   r   endswith
startswithr   r   r  )r   r  r   rV   rV   rW   needs_backend_selectg  s    rG  c                   @   sJ   e Zd ZU eeej eej f ed< e	ed< e
eee dddZdS )ComputeBackendSelectr
  r  r  c                 C   s4  t || jsd S t|j}t|jdd}dd | D }t|j}|}|	 }d}| j
tjkr|r|jj sztddd |D }	d	| d
|	 d}
n|jj rtd| d}
d|j d|| d|
 d|jj  dddd |D  dS | j
tjkr&d|jj d| dS t| j
 d S )NTr   c                 S   s(   g | ] }t |jtr|jj r|qS rV   )rr   r   r#   r   r   r   rV   rV   rW   r     s    z1ComputeBackendSelect.__call__.<locals>.<listcomp>z.c10::computeDispatchKey(dtype, layout, device)r   c                 s   s   | ]}|j V  qd S r   r  r   rV   rV   rW   r     s     z0ComputeBackendSelect.__call__.<locals>.<genexpr>z-DispatchKeySet _dk_set = c10::DispatchKeySet(z() | c10::detail::multi_dispatch_key_set(z);
DispatchKeySet _dk_mask = c10::DispatchKeySet(DispatchKeySet::FULL_AFTER, DispatchKey::BackendSelect);
DispatchKeySet _dk = c10::impl::computeDispatchKeySet(_dk_set, _dk_mask);z)DispatchKeySet _dk = c10::DispatchKeySet(r   z	// aten::z
C10_ALWAYS_INLINE
z {
  z
  return at::_ops::z::redispatch(
      _dk, c                 s   s   | ]}|j V  qd S r   r   r   rV   rV   rW   r     s     r  zm.impl("aten::z", TORCH_FN(z));)rG  r  nativer   rf   r   r   r   r  r   r
  rF   r  Zhas_tensor_argrt   r   r  r  REGISTRATIONr?   )rQ   r   r   Z
native_sigr   Zdispatcher_sigr   Zdispatcher_exprsrn   r   Z
compute_dkrV   rV   rW   r  {  sJ    


	zComputeBackendSelect.__call__N)rX   rY   rZ   r   r   rF   r  rK  r  r>   r   r.   r	   r   r  rV   rV   rV   rW   rH  s  s   
rH  )datare   c                 C   s:   dd t _tttddd}t t| tj| dt ddS )	Nc                 S   s   dS )NTrV   )rQ   rL  rV   rV   rW   rk     rl   zformat_yaml.<locals>.<lambda>)dumperrL  re   c                 S   s   |  | S r   )Zrepresent_dictrz   )rM  rL  rV   rV   rW   dict_representer  s    z%format_yaml.<locals>.dict_representerFg    eA)Zdefault_flow_styleZDumperwidth)rG   Zignore_aliasesr   Zadd_representerr   r   dump)rL  rN  rV   rV   rW   format_yaml  s    
rQ  c                 C   sh   | dkrdS | dkrdS z
t | W S  tk
rb   zt| W  Y S  tk
r\   |  Y  Y S X Y nX d S )Nr:  TfalseF)rw   
ValueErrorfloatr   rV   rV   rW   pythonify_default  s    
rU  )tre   c                 C   s:   t | trt| jS t| dkr$dS tj| dddd S )NTensorz
at::TensorF__placeholder__)mutabler5  r   )rr   r2   dynamic_typer0  r   r   Zargumenttype_typer9  )rV  rV   rV   rW   rZ    s    

   rZ  )r   re   c                 C   s2   dg}t j| kr|d t j| kr.|d |S )Nr7   rW  	namespace)r8   r   rx   r  )r   	method_ofrV   rV   rW   compute_method_of_yaml  s    



r]  c                 C   s   i }t | }g }tt| jj|D ]f\}\}}t|j|t j|dd	 d}|j
r|j
|d< | j r|j
|| jjj| j
< || q$||fS )NFrI  )rZ  r   r   
field_name)r   Zreturn_namesr?  ziprf   returnsrZ  r   return_typer9  r   r*  r   r;  rx   )r   name_to_field_namenamesr`  rB  r   r   retrV   rV   rW   compute_returns_yaml  s    *


re  )cpp_aschema_orderkwarg_only_setout_arg_setrb  re   c                C   sr   t | jtr:d dd| j| jdd}| jd k	r6| j|d< |S t | jtrNt n t | jtrnt	| j||||dS d S )Nzat::TensorOptionsFT)
annotationrZ  is_nullabler   r   
kwarg_onlyr   rg  rh  ri  rb  )
rr   r   r6   r   r   r   r4   rt   r#   compute_argument_yaml)rf  rg  rh  ri  rb  r   rV   rV   rW   compute_cpp_argument_yaml>  s*    

ro  )r   rg  rh  ri  rb  re   c             	   C   s   | j rt| j nd t| j| j | jtj| ddd d}| j	d k	r`t
t| j	| j|d< | j|krrd|d< | j|krd|d< d|d	< | j|kr|| j |d
< | j }|d k	r|jd k	rt|jdkr|j|d< |S )NrX  F)r5  r   )rj  rZ  rk  r   r   r   Trl  r   allocater^  boolsize)rj  r   rZ  r   rk  r   r   r6  r9  r   rU  Zdefault_exprZis_list_likerr  r0  )r   rg  rh  ri  rb  r   lrV   rV   rW   rn  ^  s&    	




 
rn  c                    s  t | \}tdd | jjjD  tdd | jjjD tj| ddd}|j } fdd|D }t	| j
 } fdd|D }d	d |D }tj| jjdd
 }| dd| d}	tdd |D otj| jk}
tdt| jfdt| jjjfdt| jjjfd| jfd| jd k	r4| jndfdd| j fd|fd|	fd|fdt| jfdd| jd krxdn| jfd|fd| jjjjfd|
fd | jfd!| jfd"d#d$| jfgS )%Nc                 s   s   | ]}|j V  qd S r   r  r   rV   rV   rW   r     s     z+compute_declaration_yaml.<locals>.<genexpr>c                 s   s   | ]}|j V  qd S r   r  r   rV   rV   rW   r     s     Fr   c              	      s   g | ]}t |d  dqS )Frm  )ro  )r   rf  rh  rb  ri  rV   rW   r     s   z,compute_declaration_yaml.<locals>.<listcomp>c              	      s   g | ]}t |d  dqS )Trm  )rn  r   rt  rV   rW   r     s   c              
   S   s0   g | ](}t j|d t d d d dD ]
}|jq qS )F)r   Zcpp_no_default_argsZfaithfulr   Zhas_tensor_options)r   r   r   r   )r   r   r   rV   rV   rW   r     s    rI  z (r   r   c                 s   s   | ]}t |jtV  qd S r   )rr   r   r6   r   rV   rV   rW   r     s     r   Zoperator_namer   r   category_overrider   Zschema_stringaten::r   schema_order_cpp_signatureschema_order_argumentsr\  )moderJ  python_moduler`  r   is_factory_methodZabstractro   )Zwith_gilF)
deprecatedFZhas_math_kernel) re  r   rf   r   Zflat_kwarg_onlyr;  r   r   r   rs   rx  r   returns_typer`  r9  r   anyr8   r   r   r   r   r   r   r   ru  r]  rz  r   Zis_abstractro   r   )r   r`  r%  Zcpp_argsr   Zschema_order_jit_argumentsrx  Zcpp_schema_order_typesZcpp_returnsrw  r{  rV   rt  rW   compute_declaration_yaml  sb      

r  c                 C   s0   | j s| jd k	o.| j tjkp.| j tjkS r   )r   r   rf   kindr3   
functionalr   r   rV   rV   rW   "has_autogenerated_composite_kernel  s    r  )r   r^   re   c              	      s   t  j}t  jj }t  j}ddd |D }d j t fdd|	 D t
jhko fdd|	 D t
jt
jhkt jpt d}| d	| d
| dt| dS )Nr   c                 s   s   | ]}|   V  qd S r   )Z
no_defaultZdecl_registration_declarationsr   rV   rV   rW   r     s     z4compute_registration_declarations.<locals>.<genexpr>rv  c                    s   h | ]\}}|  r|qS rV   r   r   r   r   r   rV   rW   	<setcomp>  s     
 z4compute_registration_declarations.<locals>.<setcomp>c                    s   h | ]\}}|  r|qS rV   r  r  r   rV   rW   r    s     
 )schemadispatchr   r8  r   z); // r   )
dispatcherr   rf   r}  r`  Z"cpp_type_registration_declarationsr   r   r   rz   r(   r   r   Zhas_composite_kernelr  jsondumps)r   r^   r   r}  r@  rA  Zcomment_datarV   r   rW   !compute_registration_declarations  s(    
	r  )"provided_op_registration_allowlistop_selection_yaml_pathre   c                 C   sd   | d k	r|d k	rt dd }| d k	r,t| }|d k	rDt|dd}n|d k	rXt|}nt }|S )NzhBoth provided_op_registration_allowlist and op_selection_yaml_path can NOT be provided at the same time.TF)rt   r   r>   Z&from_legacy_op_registration_allow_listZfrom_yaml_pathget_nop_selector)r  r  Zop_registration_allowlistr  rV   rV   rW   get_custom_build_selector  s&    	r  )r]   re   c                 C   s   t tttf tf ttttf  ddd}tt}| D ]b}|j	
 }|j}|tjkr~|j	 }||| kspt||| |< q8||| kst||| |< q8tt|| S )Ndre   c                 S   sf   g }t j| krJ| t j}| t jd }| tjd }|t|||d |  D ]}|| qR|S )N)view	view_copyview_inplace)	r9   Zaliasingr   Zaliasing_inplacer3   r  rx   r0   r>  )r  ri   r  r  r  rf   rV   rV   rW   maybe_create_view_group%  s    
	zEget_grouped_by_view_native_functions.<locals>.maybe_create_view_group)r   r   r9   r3   r.   r   r0   r   ru   rf   Zview_signatureZview_schema_kindZnon_aliasingr  rt   rs   r@   r>  )r]   r  Zgrouped_by_viewsr   r  Z	view_kindr  rV   rV   rW   $get_grouped_by_view_native_functions"  s    


r  c                 C   sB   t ttf ttttf  ddd}t| }tt|t|	 S )Nr  c                 S   sB   t | }|d kr8tdd |  D r,tt|  S |gS d S )Nc                 s   s   | ]}d |j kV  qdS )	generatedN)r   r   r   rV   rV   rW   r   Z  s     zJget_grouped_native_functions.<locals>.flatten_pre_group.<locals>.<genexpr>)r/   	from_dictr~  r>  rt   rs   )r  r   rV   rV   rW   flatten_pre_groupS  s
    
z7get_grouped_native_functions.<locals>.flatten_pre_group)
r   r3   r.   r
   r   r/   r=   rs   r@   r>  )r]   r  Zpre_grouped_native_functionsrV   rV   rW   get_grouped_native_functionsP  s    
r  )grouped_native_functionsr^   re   c              
   C   s   g }t t}d}| D ]}t }t }| D ]l\}}	|	|}
|
r^|
j}|| || nt}t|dkst	d| d| || 
t||	 q,q| D ]R\}}t|ddd}tt|}|
d|j d|| d|j d| q|S )	Nr   rL   z6Codegen only supports one namespace per operator, got z from r      namespace_strentity_nameZ	max_level	
        )r   rs   r   rz   r   r   r   r'   r   rt   extenddest#compute_native_function_declarationrE   r   fromkeysprologuer   epiloguesplit)r  r^   declarationsns_grouped_kernelsnewliner   Znative_function_namespacesdispatch_keysrn   backend_idxr   r[  kernels	ns_helperordered_kernelsrV   rV   rW    get_native_function_declarationsg  sN    



	r  )r   r  re   c                 C   s^   | | }|rPd|jksPtdt| tr.| jjn| jjj d|j d|j d|rZ|jS t	S )Nr   zThe kernel for function z with dispatch key z has a namespace z% and it's not ending with '::native'.)
r   r   rt   rr   r.   rf   r   r  rn   r'   )r   r  r   rV   rV   rW   get_kernel_namespace  s    
2r  )
fmr  rn   r  r  rocmr   skip_dispatcher_op_registrationgen_dispatch_helpersre   c        	            s  g }	t tt t t t}
d}tjtj|||d d}tjtj|||d d}tjtj|||d d}|D ]}t	|d
dd ||   || t|tr|jn|jj}||
 krt t|
< |
 | || qrD ]t dkrqtdd|
 D ]B}|
 | s>q(d| d	 d
||
 |  d7 q(|	| d f	dd| q|	S )Nr   r  r   class_method_namer  r   r  r   r   r   )r  z
TORCH_LIBRARY_IMPL(r   z, m) {
    
};zRegisterDispatchDefinitions.inic                	      s<   j jrtng   r&dnd  dS )Nr   )Zns_prologueZns_epiloguedispatch_helpersZdispatch_anonymous_definitionsZ"static_init_dispatch_registrationsZdeferred_dispatch_registrationsdispatch_namespaceZdispatch_namespaced_definitions)r  r  r  Zgen_registration_helpersr   rV   	Zanonymous_definitionsr  rn   r  Zkernel_namespaceZns_definitionsr  Zregistration_bodyr  rV   rW   rk     s    z1get_native_function_definitions.<locals>.<lambda>)r   rs   ru   r  RegisterDispatchKeyrF   ZNAMESPACED_DEFINITIONZANONYMOUS_DEFINITIONrK  r  r   r  rr   r.   r[  r  r   rE   r   Zsubstitute_with_templater  )r  r  rn   r  r  r  r   r  r  definitionsZregistrationsr  Zns_genZanonymous_genZreg_genr   r[  rV   r  rW   get_native_function_definitions  s    			 
r  )r  rn   r  r  r  r   re   c              
   C   s   g }t t}d}tj|tj||d d|d}	| D ].}
t|
|dd| }|| 	|	|
 q.|
 D ]`\}}t|dkr|qft|ddd	}tt|}|	d|j d|| d|j d
| qf|S )Nr   F)r  r  r  r   r  rJ  r   r   r  r  r  )r   rs   r  r  rF   NAMESPACED_DECLARATIONr  r   r   r  rz   r   rE   r   r  r  r   r  r  )r  rn   r  r  r  r   r  r  r  rf   r   r[  r  r  r  rV   rV   rW   get_namespaced_declaration  sR    		   	r  )r]   schema_selectorre   c                 C   s   t t}| D ]}||j | qd}g }d }| D ]L\}}ttt||}	|dkr^|	}q6|}d}
|d| d|
|	 d7 }q6||fS )Nr   Zatenr   z
TORCH_LIBRARY(z	, m) {
  r  )r   rs   r[  rx   rz   rD   r  r   )r]   r  Zns_native_functionsZnative_functionschema_registrationsaten_schema_registrationsZcustom_namespacer[  ri   Zschema_registrations_bodytabrV   rV   rW   (get_native_function_schema_registrations?  s(    r  )r]   r  structured_native_functionsstatic_dispatch_idxr  r^   cpu_fmcuda_fmfunctions_keysr  r  re   c              
      s  | dfdd dd D fddD | d
fdd | d	
fd
d | d
fdd t d| dfdd |	D ]ntr|n|}|krd d| ddfdd | dd 	fdd ~qd S )NzNativeMetaFunctions.hc                      s   g t tt dS )N)ZNativeMetaFunctions_includesZ NativeMetaFunctions_declarationsrs   rD   rD  rV   )r  rV   rW   rk   o  s
    z(gen_aggregated_headers.<locals>.<lambda>c                 S   s   g | ]}t j|jkr|qS rV   r8   r   r   r   fnrV   rV   rW   r   v  s     z*gen_aggregated_headers.<locals>.<listcomp>c                    s   g | ]}| kr|qS rV   rV   r  )method_native_functionsrV   rW   r   y  s     MethodOperators.hc                      s   g t tttjd dS )Nr  ZMethodOperators_includesZMethodOperators_declarationsrs   rD   r	  rF   r  rV   )r  r  rV   rW   rk   ~  s    zOperators.hc                      s    dgt tttjd dS )Nz!#include <ATen/MethodOperators.h>r  )ZOperators_includesZOperators_declarationsr  rV   )non_method_native_functionsr  rV   rW   rk     s    Functions.hc                      s   t dgttt  dS )Nz#include <ATen/Operators.h>)r   ZFunctions_includesZFunctions_declarations)r   rs   rD   r  rV   r]   r  rV   rW   rk     s    r  r^   zNativeFunctions.hc                      s   dg dS )Nz%#include <ATen/NativeMetaFunctions.h>)ZNativeFunctions_includesZNativeFunctions_declarationsrV   rV   )r  rV   rW   rk     s    r   Functions_inl.h>DispatchKeyFunctions.hc                      s   t  dS N)rn   Zinline_headersr   rV   rn   inl_headersrV   rW   rk     s    Functions_inl.hDispatchKeyFunctions_inl.hc                
      s$   g   t  dddS )NT)r  rn   r  r  r  r   )!DispatchKeyFunctions_inl_includesr   dispatch_namespaced_declarations)r   r  rV   )r^   rn   r  r  r  rV   rW   rk     s    )writer  r*   write_with_template)r]   r  r  r  r  r^   r  r  r  r  r  r  rV   )r^   r  rn   r  r  r  r]   r  r  r  r  r  rW   gen_aggregated_headers]  sZ    
	


r  )r]   r  r  r  r^   r  r  ops_fmr  r  r  re   c                    sd  t dd | D ]}|j | qt dd }|D ]}|j	|	 | q6 D ]\	|	 dd
fdd |	 dd	
fd	d |	g }d
d |D tdkr|	 ddfdd t||d|	 dd	fdd qXdD ](\ |  d fdd q|	D ]|krXqD	 g  D ]~\	|	g }t
ttj| tj||
dd dd|tdkrql	 |	 d ddfdd qltr|n|}d d| dd fd!d | d"d#fd$d ~qD|d%fd&d d S )'Nc                   S   s   g S r   rV   rV   rV   rV   rW   rk     rl   z*gen_per_operator_headers.<locals>.<lambda>c                   S   s   g S r   rV   rV   rV   rV   rW   rk     rl   z_ops.hz
Operator.hc                      s   dt tttjd iS )Nr  r  r  rV   )	functionsr  rV   rW   rk     s     z.hz
Function.hc                      s2   t tfdd d dt tt  dS )Nc                    s   t |  dS )Nr   )r   r  r  rV   rW   rk     s    z<gen_per_operator_headers.<locals>.<lambda>.<locals>.<lambda>r   _ops.h>)Zstatic_dispatch_ops_headersZoperator_includesZfunction_definitions)rs   rD   r  rV   )r  r   r  rV   rW   rk     s    

c                 S   s    g | ]}t |tr|jr|qS rV   )rr   r/   r   r  rV   rV   rW   r     s   
 z,gen_per_operator_headers.<locals>.<listcomp>r   z_meta.hzNativeMetaFunction.hc                      s   dt tt iS )NZmeta_function_declarationsr  rV   )structured_functionsrV   rW   rk   $  s      r  z	_native.hzNativeFunction.hc                      s   rd dng  dS )Nr   z_meta.h>)Zextra_includesZnative_function_declarationsrV   rV   )r  is_structuredr   rV   rW   rk   2  s    ))Z	Functionsr   )Z	OperatorsZ_ops)ZNativeMetaFunctionsZ_meta)ZNativeFunctionsZ_nativec                      s.     dfddt  D   dg iS )NZ	_includesc                    s   g | ]}d |   dqS )r   .h>rV   r   r   )suffixrV   rW   r   C  s   >gen_per_operator_headers.<locals>.<lambda>.<locals>.<listcomp>Z_declarations)sortedr   rV   )categoryfunctions_by_root_namer  rV   rW   rk   B  s     

 TFr  r   z_dispatch.hzDispatchKeyFunction.hc                      s
    dS )N)r  r  rV   rV   )r  r  rV   rW   rk   j  s    r   r  r  r  c                      s   t  dS r  r  rV   r  rV   rW   rk   v  s    r  r  c                      s   fddt  D g dS )Nc                    s   g | ]}d | d  dqS )r   r   r   rV   r  )r  rV   rW   r     s   r  )r  r  r  )r  rV   )dispatch_namesr  rV   rW   rk   ~  s    
r  c                      s   t dd   D g dS )Nc                 s   s0   | ](\}}t d d |D rd| dV  qdS )c                 s   s   | ]}t j|jkV  qd S r   r  r  rV   rV   rW   r     s     zGgen_per_operator_headers.<locals>.<lambda>.<locals>.<genexpr>.<genexpr>r   r  N)r~  )r   r   r  rV   rV   rW   r     s   z=gen_per_operator_headers.<locals>.<lambda>.<locals>.<genexpr>r  )r  rz   rV   )r  rV   rW   rk     s
    )r   r   rx   rz   r  rv   r   r  r  r   rs   r@   r  r  rF   r  r*   )r]   r  r  r  r^   r  r  r  r  r  r  r  Zgrouped_functions_by_root_namegroupZgrouped_functionsr  rV   )r  r  rn   r  r  r  r  r  r  r   r  r  r  rW   gen_per_operator_headers  s    

 

	
	
r  )r]   ra   r  r  r  r  r^   core_fmr  r  r  r  r  r  per_operator_headersre   c                    s   |r$t || ||	|
|||d nt||| ||	|||d |dfdd |dfdd |d fd	d |d
fdd tttf dfdd}|d| tttf dfdd}|d| d S )N)r]   r  r  r  r^   r  r  r  r  r  r  )r]   r  r  r  r  r^   r  r  r  r  r  zTensorBody.hc                      s2   t tttjd t tttjd dS )N)r
  r  )Ztensor_method_declarationsZtensor_method_definitions)rs   rD   r(  rF   r  r  rV   r  rV   rW   rk     s&    	zgen_headers.<locals>.<lambda>zRedispatchFunctions.hc                      s   dt tt  iS )NZfunction_redispatch_definitions)rs   rD   r+  rV   r]   rV   rW   rk     s
     
zRegistrationDeclarations.hc                      s   d fddD iS )NZregistration_declarationsc                    s   g | ]}t | qS rV   )r  r  r  rV   rW   r     s   z1gen_headers.<locals>.<lambda>.<locals>.<listcomp>rV   rV   )r^   r]   rV   rW   rk     s
     
zVmapGeneratedPlumbing.hc                      s   t  S r   r!   rV   r  rV   rW   rk     rl   re   c                     s   t  } t  } D ]F}|t|jjj ||jjjj |j D ]}| |j qDq|t ddddddddd	d
dg8 }ddd t|D ddd t| D dS )NandZand_eqZbitandZbitorZcomplnotZnot_eqorZor_eqxorZxor_eqz \
c                 S   s   g | ]}d | dqS )z_(aten, r   rV   r  rV   rV   rW   r     s     zBgen_headers.<locals>.gen_aten_interned_strings.<locals>.<listcomp>c                 S   s   g | ]}d | dqS )z_(attr, r   rV   r  rV   rV   rW   r     s     )Zaten_symbolsZattr_symbols)	r   r   r   rf   r   r   rx  r   r  )attrsrc  rf   r   r  rV   rW   gen_aten_interned_strings  s8    z.gen_headers.<locals>.gen_aten_interned_stringszaten_interned_strings.hc                      s   dd t iS )NZenum_of_valid_tagsz,
)r   r  rV   )ra   rV   rW   gen_tags_enum  s    z"gen_headers.<locals>.gen_tags_enumz
enum_tag.h)r  r  r  r   r   )r]   ra   r  r  r  r  r^   r  r  r  r  r  r  r  r  r  r  rV   )r^   r]   r  ra   rW   gen_headers  s^    
	
 
'r  )r]   r  r  view_groupsr  r  r^   r  r  
cpu_vec_fmr  r  r  r  force_schema_registrationr  r  re   c                    s  drd|D ]̉t r"|
n|}rJtt d
fddntt dfdd tt}
D ]*}t|tr|jn|jj}|| 	| qvt
 tjk}t|
d|d	|d	 d
dfdd D ]ډ		jjr tsq 	jjjjtjkr||ksBt|d d
d	fdd |	d d
d	fdd nRtjkrdrd|d dd	fdd ntd dq ~qtttt f dfdd}|d| }|rt }t|d\ |d  fd!d ttttf td"d#d$}|jd%|fd&dd't id(d)d*d'hd+ |d,d-d  |d.d/d  |d0fd1d ttttf tttt f d2fd3d4}tt }d5d6 t!d7d D }d8d6 t!d9d D }D ],}|jj|kr2|jj|kr2|	| q2|jd:|||d;d<d=d>d?d@hdA |dBfdCd |dDfdEd d S )FNz#include <c10/cuda/CUDAGuard.h>
#include <ATen/cuda/ATenCUDAGeneral.h>
#include <ATen/cuda/CUDADevice.h>
#include <ATen/cuda/CUDAContext.h>z#include <ATen/hip/impl/HIPGuardImplMasqueradingAsCUDA.h>
#include <ATen/hip/ATenHIPGeneral.h>
#include <ATen/hip/HIPDevice.h>
#include <ATen/hip/HIPContext.h>r  c                     s   g } D ]}d}  |r d}nDt|trJt fdd| D rJd}n|jrdtjtjfkrdd}|sjq| 	d|j
 d tjkr| 	d|j
 d kr| 	d|j
 d d	 qtt| S )
NFTc                 3   s   | ]}  |V  qd S r   r  r  r  rV   rW   r   T  s    z=gen_source_files.<locals>.operator_headers.<locals>.<genexpr>r   
_native.h>r  r   r   )r   rr   r/   r~  r  r   r(   Metar   rx   r   r  r   )headersr.  Zis_registered)r   rn   r  r  r  rV   rW   operator_headersH  s6    
z*gen_source_files.<locals>.operator_headersc                     s8   dg}  t jkr| d  kr4| d d | S )Nz!#include <ATen/NativeFunctions.h>z#include <ATen/Functions.h>r   r   )r(   r   rx   )r
  )rn   r  rV   rW   r  r  s    

T)	r  r  rn   r  r  r  r   r  r  ZRegisterz.cppzRegisterDispatchKey.cppc                      s*   t rnddt  ddS )Nr   )extra_cuda_headersZexternal_backend_headersZdispatch_headersops_headersr  dispatch_definitions)r*   r  Zgen_registration_headersrV   )r   r  rn   r  r  r  r  rV   rW   rk     s      z"gen_source_files.<locals>.<lambda>Z	UfuncCPU_zUfuncCPU.cppc                      s"   t t  tdS )N)meta_declarationnative_declarationnative_definitions)rD  r  r  Zcompute_ufunc_cpurV   )r^   rn   r.  rV   rW   rk     s     ZUfuncCPUKernel_zUfuncCPUKernel.cppc                      s   t  dS )N)r   r  )r  Zcompute_ufunc_cpu_kernelrV   )r.  r   rV   rW   rk     s    z%#include <ATen/native/cuda/Loops.cuh>z$#include <ATen/native/hip/Loops.cuh>Z
UfuncCUDA_z.cuzUfuncCUDA.cuc                      s&   t t  tdS )N)r   cuda_headersr  r  r  )rD  r  r  Zcompute_ufunc_cudarV   )r^   r  rn   r.  r   rV   rW   rk     s     zunrecognized z
 for ufuncc                     sL   fdd D } dd | D t tttj| t tttj| dS )Nc                    s   g | ]}t | r|qS rV   )rG  r  r  rV   rW   r     s    
 z@gen_source_files.<locals>.gen_backend_select.<locals>.<listcomp>c                 S   s   g | ]}d |j  dqS )r   r  r   r  rV   rV   rW   r     s    )r  Z!backend_select_method_definitionsZ%backend_select_function_registrations)rs   rD   rH  rF   r  rK  )Zrelevant_fns)r]   r  rV   rW   gen_backend_select  s&    

 
 z,gen_source_files.<locals>.gen_backend_selectzRegisterBackendSelect.cpp)r]   r  zRegisterSchema.cppc                      s   rg n rg ndS )N)r  r  rV   rV   )r  r  r  rV   rW   rk     s    )r  re   c                 S   s   | j S r   r  r  rV   rV   rW   key_func	  s    z"gen_source_files.<locals>.key_funczOperators.cppc                    s&   d| j  dgttj d| gdS )Nr   r  r  )r  r  )r   r	  rF   r  r  r  rV   rW   rk   	  s    r      r  r  )key_fnenv_callableZbase_env
num_shardssharded_keyszFunctions.cppc                   S   s   i S r   rV   rV   rV   rV   rW   rk   #	  rl   zTensorMethods.cppc                   S   s   i S r   rV   rV   rV   rV   rW   rk   %	  rl   zATenOpList.cppc                      s   dt tt iS )NZaten_ops)rs   rD   r,  rV   r  rV   rW   rk   )	  s     r-  c                    sB   t tttf tt ddd}|| t| t|  tj	 dS )Nr-  c                 S   s&  t | tr\d| jj dd| jj dg}| jd k	rX|d| jj dd| jj dg7 }|S t | trd| jj dd| jj dd| jj dd| jj dg}| jd k	r|d| jj dd| jj dg7 }| j	d k	r|d| j	j dd| j	j dg7 }|S d| j dd| j dgS d S )Nr   r  r  )
rr   r0   r  r   r  r/   r  r;  r   rY  )r.  r
  rV   rV   rW   gen_op_headers1	  s<    


zPgen_source_files.<locals>.functionalization_env_callable.<locals>.gen_op_headers)r  func_definitionsfunc_registrations)
r   r.   r/   r0   r   r   r   r   r(   r   )r.  r  )r^   r  rV   rW   functionalization_env_callable.	  s    (z8gen_source_files.<locals>.functionalization_env_callablec                 S   s   i | ]}|j j|qS rV   rf   r   r  rV   rV   rW   
<dictcomp>o	  s    z$gen_source_files.<locals>.<dictcomp>c                 S   s   t |  S r   rs   r  r.  rV   rV   rW   rk   q	  rl   c                 S   s   i | ]}|j j|qS rV   r   r  rV   rV   rW   r!  s	  s     c                 S   s   t |  S r   r"  r#  rV   rV   rW   rk   t	  rl   zRegisterFunctionalization.cpp   r  r  r  Zfunc_add_back_views_definitionsZ!func_add_back_views_registrations)r  r  r  r  zFunctionalInverses.hc                      s   dt t fddiS )NZview_inverse_declarationsc                    s
   t  | S r   )r    r#  r  rV   rW   rk   	  s    z4gen_source_files.<locals>.<lambda>.<locals>.<lambda>)rs   rD   rV   )r  r  rV   rW   rk   	  s     
zCompositeViewCopyKernels.cppc                      sD   dd D dd  D  t ttt tt t tt dS )Nc                 S   s:   g | ]2}d  dd |jdkr$|jgn
|j|jgD qS )r   c                 s   s   | ]}d |j  dV  qdS )r   r  Nr  r  rV   rV   rW   r   	  s   @gen_source_files.<locals>.<lambda>.<locals>.<listcomp>.<genexpr>N)r   r  r  r   r.  rV   rV   rW   r   	  s   
z6gen_source_files.<locals>.<lambda>.<locals>.<listcomp>c                 S   s,   g | ]$}d  dd |j|j|jfD qS )r   c                 s   s.   | ]&}|d k	rd|j krd|j dV  qd S )Nr  r   r  )r   r   r  rV   rV   rW   r   	  s    
r%  )r   r   rY  r  r&  rV   rV   rW   r   	  s   
)r  Z#CompositeViewCopyKernel_DefinitionsZ(GeneratedCompositeFunctional_DefinitionsZ!GeneratedCompositeOut_Definitions)rs   rD   r   r;   r<   rV   )r  r  rV   rW   rk   	  s.    	)"r*   r   r   r   rs   rr   r.   r[  r  rx   r   r(   r   r  r  r;  Zufunc_inner_loopr,   rf   r   CPUrt   CUDAr   r  r>   r  r  r   r/   r0   Zwrite_shardedr   r@   )r]   r  r  r  r  r  r^   r  r  r  r  r  r  r  r  r  r  r  Zns_grouped_native_functionsZgrouped_native_functionr[  r  r  r  r  r  Z
all_groupsZstructured_mapZview_mapr   rV   )r  r   r^   r  r  rn   r  r  r  r.  r  r   r]   r  r  r  r  r  r  r  r  r  rW   gen_source_files#  s   
 *



  

 
9
r)  )r  r]   re   c                    s   |  d fdd d S )NzDeclarations.yamlc                      s   t dd  D S )Nc                 S   s   g | ]}t |qS rV   )r  r  rV   rV   rW   r   	  s     z;gen_declarations_yaml.<locals>.<lambda>.<locals>.<listcomp>)rQ  rV   r  rV   rW   rk   	  rl   z'gen_declarations_yaml.<locals>.<lambda>)r  )r  r]   rV   r  rW   gen_declarations_yaml	  s    
r*  r  c                   C   s   t tj S )z
    If you're depending on torchgen out-of-tree, you can use the root to figure
    out the path to native_functions.yaml
    )pathlibPath__file__parentresolverV   rV   rV   rW   get_torchgen_root	  s    r0  c                     s  t jdd} | jddddd | jdd	d
d | jdddd | jdddd | jddddd | jdddd | jdddd | jdddd | jddd | jd dd!d | jd"dd#d | jd$dd%d | jd&dd'd | jd(tdd)d*d+gd)d*d+gd,d- |  tjj}tj	
jd.}tj	
jd/}d0d1lm} t }jsv|tj tj|krv||tj= t|||}t| }|j|j } t|}	d2d3 |	D }
t|}d4d3 |D }j d5}t|jd6d6d7 j d8}t|jd6d6d7 t|d9}td:}td:}td:}t|d9}tjtj tj!tj"tj#tj$tj%h}jrn|tj j&rfd;d3|D }g }j'rԇ fd<d3j'D }j'D ]$}t(|}||kr|| qd*j)krt*||	|
||| ||||||j+j,j-j.d= d)j)krHt/|||	|
|| ||||||j+j-d> d+j)kr`t0||d? j1rtj12 }|j3}|j4}|d@f|dAf|dBf|dCf|dDffD ]0\}}|| }|j5||  }|6|t| qd S )ENzGenerate ATen source files)descriptionz-sz--source-pathz!path to source directory for ATenzaten/src/ATen)helpr   z-oz--output-dependenciesz:output a list of dependencies into the given file and exit)r2  z	--dry-run
store_truez5run without writing any files (still updates outputs))actionr2  z--per-operator-headersz2generate separate headers per operator in ATen/opsz-dz--install_dirzoutput directoryzbuild/aten/src/ATenz--rocmz=reinterpret CUDA as ROCm/HIP and adjust filepaths accordinglyz--mpsz'Generate MPS registration code when setz--op_registration_whitelist*zfilter op registrations by the whitelist (if set); each item is `namespace`::`operator name` without overload name; e.g.: aten::empty aten::conv2d ...)nargsr2  z--op_selection_yaml_pathaD  Provide a path to the operator selection (for custom build) YAML that contains the information about the set of selected operators and their categories (training, ...). Each operator is either a full operator name with overload or just a bare operator name. The operator names also contain the namespace prefix (e.g. aten::)z--backend_whitelistzRfilter dispatch backend by the whitelist (if set), e.g.: CPU CUDA QuantizedCPU ...z--static_dispatch_backendz?generate static dispatch code for the specific backend (if set)z!--skip_dispatcher_op_registrationz0Avoid registering operators into the dispatcher.z--force_schema_registrationz}force it to generate schema-only registrations for all ops, includingthose that are not listed on --op_registration_whitelistz
--generater
  sourcesZdeclarations_yamlzGenerate only a subset of files)r   r6  choicesr   r2  znative/native_functions.yamlznative/tags.yamlr   )r  c                 S   s   g | ]}t |tr|qS rV   )rr   r/   r&  rV   rV   rW   r   Q
  s    
 zmain.<locals>.<listcomp>c                 S   s   g | ]}t |tr|qS rV   )rr   r0   r&  rV   rV   rW   r   W
  s   
z/coreT)parentsexist_okz/ops)optionsinstall_dirr;  c                    s&   g | ]}t |st| jkr|qS rV   )r+   r   backend_whitelist)r   r   r=  rV   rW   r   
  s    c                    s   g | ]} t | qS rV   )r(   parse)r   keyr  rV   rW   r   
  s   )r]   r  r  r  r  r  r^   r  r  r  r  r  r  r  r  r  r  )r]   ra   r  r  r  r  r^   r  r  r  r  r  r  r  r  )r]   r  r   Zcpu_vec_Zcore_Zcuda_Zops_)7argparseArgumentParseradd_argumentr   
parse_argsr  Zop_registration_whitelistr  osrc   r   source_pathtorchgen.modelr  r   Zmpsr   r(   ZMPSrp   r   r   r]   r^   r  r  r<  r+  r,  mkdirrC   r'  r(  r   r   r   r   r	  r>  Zstatic_dispatch_backendr?  generater)  r  r  r  r  r  r*  Zoutput_dependenciesr/  r   stemr.  Zwrite_outputs)parserr  Znative_yaml_pathr   r  rb   Zparsed_yamlra   r]   r  r  Z!native_functions_with_view_groupsr  Zcore_install_dirZops_install_dirr  r  r  r  r  r  r  r@  Zdp_keyZdepfile_pathZdepfile_nameZdepfile_stemr  r)  varnamerc   rV   )r^   r;  rW   main	  sx      	


	




rM  __main__)Nr_   F)r_   )N)rA  	functoolsr  rE  r+  collectionsr   r   r   Zdataclassesr   typingr   r   r   r	   r
   r   r   r   r   r   Ztyping_extensionsr   Ztorchgen.api.dispatcherapir  Ztorchgen.api.metar<  Ztorchgen.api.nativerJ  Ztorchgen.api.structuredr   Ztorchgen.destr  Ztorchgen.apir   Ztorchgen.api.translater   Ztorchgen.api.typesr   r   r   r   r   r   r   Ztorchgen.contextr   r   r   r   Z#torchgen.gen_functionalization_typer   r   r   r    Ztorchgen.gen_vmap_plumbingr"   rG  r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   Z#torchgen.native_function_generationr:   r;   r<   r=   Z!torchgen.selective_build.selectorr>   Ztorchgen.utilsr?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   r   r   r\   objectr   rq  r   r   	lru_cacher   r   ry   r   r   r   r   r   r   r   r   r   r  r	  r  r(  r+  r,  rD  rG  rH  rQ  rU  rZ  r]  re  ro  rn  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r)  r*  r,  r0  rM  rX   rV   rV   rV   rW   <module>   s  ,$	d0!   
.
 
#  
%


L`-|DD
!
"Y 
#
 /
0
 i4 
{
 C
 
   / 	 p
