o
    h;                    @  sd  U d dl m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m	Z	m
Z
 d dl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 d dl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l0m1Z1m2Z2m3Z3m4Z4 d dl5m6Z6m7Z7 d dl8m9Z9m:Z:m;Z;m<Z< d dl=m>Z> d dl?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZY d dlZm[Z[m\Z\m]Z]m^Z^ d dl_m`Z` d dlambZbmcZcmdZdmeZemfZfmgZgmhZh d dlimjZjmkZk er&d dllmmZm edZnG dd dekZoe	dddgZpi aqderd< i asderd< dd&d'Zt		(	)ddd4d5Zuddd6d7Zvejwdd8d9Zx	dd)dd:dd>d?ZyddCdDZzddFdGZ{ddKdLZ|ddRdSZ}ddUdVZ~ddXdYZdd^d_Zdd`daZddbdcZddddeZedfdgG dhdi diZedfdgG djdk dkZedfdgG dldm dmZedfdgG dndo doZedfdgG dpdq dqZe3ddrdsZddvdwZd dzd{ZedfdgG d|d} d}ZdddZdddZdddZdddZdddZdddZdddZe3dddZd	ddZe4d
ddZdddZdddZdddZe#jddddZdddZe#jddddZdddZdddÄZdddńZdddɄZdddӄZdddքZdddڄZdddZdddZdddZdddZedkre  dS dS (      )annotationsN)defaultdict
namedtupleOrderedDict)	dataclassfield)Path)AnyCallableLiteralTYPE_CHECKINGTypeVar)assert_never)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_aoti_c_shim_files*gen_static_dispatch_backend_call_signature) gen_functionalization_definition"gen_functionalization_registration.gen_functionalization_view_inverse_declarationGenCompositeViewCopyKernelgen_all_vmap_plumbing)ArgumentBackendIndexBackendMetadataBaseOperatorNameDEFAULT_KERNEL_NAMESPACEdispatch_device_mapDispatchKeyFRAGMENT_NAMESPACESFunctionSchemais_cuda_dispatch_keyis_generic_dispatch_keyis_ufunc_dispatch_keyis_xpu_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)	concatMapcontextFileManagermake_file_managermapMaybeNamespaceHelperTarget)
YamlDumper
YamlLoader)Sequence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noderO   mapping	__class__ R/home/www/facesmatcher.com/frenv_anti/lib/python3.10/site-packages/torchgen/gen.pyrS      s   zLineLoader.construct_mapping)F)__name__
__module____qualname__rS   __classcell__rZ   rZ   rX   r[   rN      s    rN   
ParsedYamlnative_functionsbackend_indiceszdict[str, ParsedYaml]_GLOBAL_PARSE_NATIVE_YAML_CACHEzdict[str, set[str]]_GLOBAL_PARSE_TAGS_YAML_CACHEdispatch_keyr*   
device_fmsdict[str, FileManager]
default_fmrE   returnc                   s(   | t fddt D d|}|S )Nc                 3  s     | ]\}}| r|V  qd S NrZ   ).0checkdevicere   rZ   r[   	<genexpr>   s    
z1file_manager_from_dispatch_key.<locals>.<genexpr> )getnextr)   items)re   rf   rh   fmrZ   rn   r[   file_manager_from_dispatch_key   s   
ru   <stdin>Fesobject
valid_tagsset[str]ignore_keysset[DispatchKey] | Nonepathstrskip_native_fns_genboolc              	     s>  t | tsJ g }tt}| D ]_}t |tsJ d| t |dts)J |t||d |d  d us@J d| t fdd t	|||\}}	|
| t||	 W d    n1 siw   Y  qt| tdd }
|st|| | D ]\}}t|dd	t|pt||d
|
|< qt||
S )Nzexpected to be dict: rQ   funczmissed 'func' in c                     s   d d  S Nzin z:
  rZ   rZ   funcslocrZ   r[   <lambda>       z*parse_native_yaml_struct.<locals>.<lambda>c                   S  s   t tjdddi dS )NTFre   Zuse_out_as_primaryZexternaldevice_guardindex)r%   r*   Z	UndefinedrZ   rZ   rZ   r[   r      s    TFr   )
isinstancelistr   dictrq   intr1   rD   r2   Z	from_yamlappendr%   Z
grow_indexerror_check_native_functionsr>   rs   r-   r0   r`   )rw   ry   r{   r}   r   rsbser   mindiceskvrZ   r   r[   parse_native_yaml_struct   s<   



r   c              	     s   t | tsJ t }| D ]M}t |dtsJ |t||d  |dt fdd" | }|d}|dd}|dksEJ |	| W d    n1 sTw   Y  q|S )NrQ   tagc                     s   d  d S r   rZ   rZ   r   tagsrZ   r[   r      r   z(parse_tags_yaml_struct.<locals>.<lambda>descrp   )
r   r   setrq   r   r1   rD   copypopadd)rw   r}   r   r   Ze_inamer   rZ   r   r[   parse_tags_yaml_struct   s   

r   c                 C  s\   | t vr*t| }tj|td}t|| dt | < W d    t |  S 1 s%w   Y  t |  S )NLoader)r}   )rd   openyamlloadrN   r   )r}   frw   rZ   rZ   r[   parse_tags_yaml   s   

r   )r   loaded_yamltags_yaml_pathr   object | Nonec                C  sr   | t vr5t|}|d u r(t| }tj|td}W d    n1 s"w   Y  n|}t|||| |dt | < t |  S )Nr   )r}   r   )rc   r   r   r   r   rN   r   )r}   r   r{   r   r   ry   r   rw   rZ   rZ   r[   parse_native_yaml   s    	

r   r   Sequence[NativeFunction]Nonec           
      C  s  i }t t}| D ]}|||jj< ||jjj | q| D ]}|jd urS||j}|d us?J |jj d|j d|j d|jsSJ |jj d|j d|j dtt	j
}h d}|jjjD ] }|j|v rt|jj|jf|vrtd|j d|jj dqad	|jv rt|jjd
krt|jjdkrt|jjjdkr|jjj}|jsJ |jj dt|jd|j}	t||	 dksJ |jj d| dqd S )Nz0 is marked as a structured_delegate pointing to z, but z is missing.zY is not marked as structured. Consider adding 'structured=True' to the delegated operator>   )zrandom_.fromfrom)Zuniform_r   )Z!_has_compatible_shallow_copy_typer   zArgument name 'z' in function 'z' is a reserved Python keyword.Zinplace_viewZresize_Z
resize_as_Zset_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   r   r   r   r   structured_delegaterq   
structuredr   keywordkwlist	argumentsZflat_allr~   AssertionErrorr   inplacer'   baseZdunder_methodlen)
r   Zfunc_mapZbase_func_mapr   Zdelegate_funcZPYTHON_RESERVED_KEYWORDSZEXCLUSION_LISTarg	base_nameZout_of_place_base_namerZ   rZ   r[   r     sj   





	


r   sc                 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   rZ   rZ   r[   
cpp_stringP  s   r   backendslist[BackendIndex]list[DispatchKey]c                 C  s2   t | dkrg S dd | D tjtjtjtjg S )Nr   c                 S     g | ]}|j qS rZ   rn   )rk   backendrZ   rZ   r[   
<listcomp>n      z(static_dispatch_keys.<locals>.<listcomp>)r   r*   CompositeImplicitAutograd%CompositeImplicitAutogradNestedTensorCompositeExplicitAutograd&CompositeExplicitAutogradNonFunctionalr   rZ   rZ   r[   static_dispatch_keysj  s   r   r   r2   backend_indexr%   DispatchKey | Nonec                 C  sN   | j d us
|| r|jS | jrtjS | jrtjS | jrtj	S | j
r%tjS d S rj   )r   
has_kernelre   &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   rZ   rZ   r[   get_static_dispatch_backendv  s   r   
str | Nonec                 C  sZ   |d u s| j r	d S g }|D ]}t| |}|d ur'|d| j d|  d qd|S )N#include <ATen/ops/__dispatch.h>r   )manual_kernel_registrationr   r   	root_namelowerjoin)r   r   outputr   re   rZ   rZ   r[   static_dispatch_ops_header  s   

r   	list[str]c                 C  s   dd t | D S )Nc                 S     g | ]}d | dqS )#include <ATen/Functions.h>rZ   )rk   re   rZ   rZ   r[   r     s    
z1static_dispatch_extra_headers.<locals>.<listcomp>)r   r   rZ   rZ   r[   static_dispatch_extra_headers  s   r   sig"CppSignature | DispatcherSignaturecpp_sigr   c                 C  sd   d	dd}t |  }t | }|D ]}|jjtjkr"||} q#qt||}ddd |D S )
Ninput_bindingslist[Binding]ri   c                 S  sT   g }| D ]#}|j dkr"t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   r   )r   Zoutput_bindingsZbindingZspl_mem_format_bindingrZ   rZ   r[   add_spl_memory_format_binding  s   
	z5translate_args.<locals>.add_spl_memory_format_binding, c                 s      | ]}|j V  qd S rj   exprrk   arZ   rZ   r[   ro         z!translate_args.<locals>.<genexpr>)r   r   ri   r   )r   r   r   r   r   r   r   r   )r   r   r   Zsrc_bindingsZgoal_bindingsr   exprsrZ   rZ   r[   translate_args  s   

r   c           	   	   C  sj   t | |}| }t| |}||}|r|jr|jnt}|dd}d| d|j  d| d| d	S )N::nativerp   return ::();)	r   r   r   
get_kernelcpp_namespacer(   r   re   r   )	r   r   r   r   r   r   backend_metadataZ	kernel_nsnsrZ   rZ   r[   %generate_static_dispatch_backend_call  s   


$r	  c              	   C  s"  t j|ddd}| jr|j r|j}n|j}|d usJ | }t| |}t	
dd}|jrAd| dtj  d| d| d	S |jrVd| dtj  d| d| d	S |jrkd| dtj  d| d| d	S |jrd| dtj  d| d| d	S d	| d
ddd |D  dS )NFmethodZfallback_bindingr   rp   r  r  r  r  z5TORCH_CHECK(false, "Static dispatch does not support z forr   c                 S  s   g | ]}t |jqS rZ   )r~   re   )rk   r   rZ   rZ   r[   r     s    z:generate_static_dispatch_fallback_call.<locals>.<listcomp>z ");)r   from_native_functionsymintr   
has_symintZsymint_signature	signaturer   r   r(   r   r   r*   r   r   r   r   r   r   r   r   r   )r   r   rb   Zcpp_sigsr   r   r   r  rZ   rZ   r[   &generate_static_dispatch_fallback_call  s*   
$$$$r  c                   sH  t |dks	 jrdS  fdd|D }t |dkr"t|  |d S t |dkr.t|  |S dd |  D }d|} jjj}g }g }|durN|d	 |dkr[|d
| d |dd| d |d g }	|D ]}
|	d|
j	 d |	dt|  |
 d qpt|  |}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 exist, 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   rp   c                   s.   g | ]}|  s jd ur|jtv r|qS rj   )r   r   re   r9   )rk   br   rZ   r[   r     s    z#static_dispatch.<locals>.<listcomp>rP   c                 S  s6   g | ]}t |jtst |jtr|jj r|jqS rZ   )r   r   r8   r$   r   is_tensor_liker   r   rZ   rZ   r[   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   r   tensor_optionsr   re   )r   r   rb   keysnative_tensor_argstensor_argsZtensor_optsZstmtsZsubexprsZdispatch_coder   fallbackZ	connectorrZ   r  r[   static_dispatch  sN   
	


r  T)frozenc                   @  s6   e Zd ZU ded< eedZded< edd
dZdS )RegisterSchemarB   selector)default_factoryzdict[str, int]
known_tagsr   r2   ri   r   c                 C  s   | j |sd S dddd t|jD  d }|dkr(dtt|j dS d	}|| jvrBt	| j}|| j|< d
| d| d}| dtt|j d| j|  dS )N{r   c                 s  s    | ]}d | V  qdS )z	at::Tag::NrZ   )rk   r   rZ   rZ   r[   ro   K      z*RegisterSchema.__call__.<locals>.<genexpr>}z{}zm.def(z, {});
rp   z const std::vector<at::Tag> tags_z = ;
z, tags_z);
)
r   is_native_function_selectedr   sortedr   r   r~   r   r"  r   )rU   r   r   Z
maybe_tagsidxrZ   rZ   r[   __call__G  s   "


&zRegisterSchema.__call__Nr   r2   ri   r   )	r\   r]   r^   __annotations__r   r   r"  r   r*  rZ   rZ   rZ   r[   r  B  s
   
 r  c                   @  ,   e Zd ZU ded< ded< edd	d
ZdS )ComputeOperators.Literal[Target.DECLARATION, Target.DEFINITION]targetr   static_dispatch_backend_indicesr   r2   ri   r~   c                 C  s  t |j}|jj }| jtju rAd| 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u rd|j d| d| d| d| d| d}dD ]^}|rud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 const char* name = "aten::z3";
  static constexpr const char* overload_name = "z/";
  static constexpr const char* schema_str = z;
  static callF)r   is_redispatching_fnZ
redispatchTz;
};

// 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  r   rZ   r   r   rZ   rZ   r[   r     r   z-ComputeOperators.__call__.<locals>.<listcomp>c                 S  r   rZ   r6  r   rZ   rZ   r[   r     r   r  z
    static auto op = create_z_typed_handle();
    return op.r  r  r   rb   r    {
    z
}
)r   from_schemar   r   unambiguous_namer0  rI   DECLARATIONr   overload_namer   r~   defn
DEFINITIONr   r   r   r1  r  r   )rU   r   r   r   Zdefnsr3  Zdispatcher_exprs_strZmethod_baseZdispatcher_callmethod_nameZfn_bodyrZ   rZ   r[   r*  `  s   	zComputeOperators.__call__Nr   r2   ri   r~   r\   r]   r^   r,  r   r*  rZ   rZ   rZ   r[   r.  [  
   
 r.  c                   @     e Zd ZedddZdS )	ComputeFunctionr   r2   ri   r   c           
      C  s   t j|d|jd}|j }d}| D ]\}t|j}t|	 |	 }d
dd |D }|jr5d}	nd}	tj|jv rU|d	|j d
|  d|jj  d| d	7 }|rp|d|	 d|jdd d|jj  d| d	7 }q|S )NFr
  rp   r   c                 S  r   rZ   r   rk   r   rZ   rZ   r[   r     r   z,ComputeFunction.__call__.<locals>.<listcomp>zc10::SymIntZint64_tr4  
inline  {
    return at::_ops::::call(z);
}zZ
namespace symint {
  template <typename T, typename = std::enable_if_t<std::is_same_v<T, z>>>
  T)Zsuppress_symint_suffixz	);
  }
}
)r   r  manual_cpp_bindingr   r  
signaturesr   r9  r   r   r   r  r<   functionvariantsdeclr   r:  )
rU   r   	sig_groupr  resultr   
target_sigr   	exprs_strZ	intlike_trZ   rZ   r[   r*    sD   





zComputeFunction.__call__Nr+  r\   r]   r^   r   r*  rZ   rZ   rZ   r[   rD        rD  c                   @  r-  )ComputeTensorMethodr/  r0  r   r1  r   r2   ri   r   c                 C  s  t j|jvrd S |j rJ |jjjd usJ tj|d|j	d}| j
tju r;d}| D ]}||  d7 }q-|S | j
tjurFt| j
 d}| D ]7}t|j}t| | dd}ddd |D }|d	|j d
|jdd d|jj  d| d	7 }qL|S )NTr
  rp   z const;
)r  r   c                 S  r   rZ   r   rE  rZ   rZ   r[   r     r   z0ComputeTensorMethod.__call__.<locals>.<listcomp>r4  rF  zTensor::)prefixz const {
    return at::_ops::rH  );
}
)r<   r  rL  r   	is_out_fnr   Zself_argr   r  rI  r0  rI   r;  rJ  rM  r>  r   r   r9  r   r   r=  r   r:  rU   r   rN  rO  r   rP  r   rQ  rZ   rZ   r[   r*    s:   


zComputeTensorMethod.__call__Nr+  rA  rZ   rZ   rZ   r[   rT    rB  rT  c                   @  rC  )	ComputeRedispatchFunctionr   r2   ri   r   c                 C  s   t j|d|jd}d}| D ]8}t|j}t| | }d	dgdd |D  }|d|j d	|j
d
d d|jj  d| d	7 }q|S )NFr
  rp   r   r5  c                 S  r   rZ   r   r   rZ   rZ   r[   r   $  r   z6ComputeRedispatchFunction.__call__.<locals>.<listcomp>r4  rF  T)r3  rG  z::redispatch(rV  )r   r  rI  rJ  r   r9  r   r   r   r   rM  r   r:  rX  rZ   rZ   r[   r*    s$   

z"ComputeRedispatchFunction.__call__Nr+  rR  rZ   rZ   rZ   r[   rY    rS  rY  c                 C  s   d| j jj d| j jj dS )Nz{"aten::z", "z"},)r   r   r<  r  rZ   rZ   r[   compute_aten_op5  s   rZ  gr3   c                 C  s  | j sd S t| j> t| }t | }ddd |D }| jj}|d u r*d}d}| j r3| jjnd }|r)g |j	
 |j}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 ]!\}}||kr|d|j d q|d|j d|j d  q|d! d"|}|d#| d$| d%| d& qwd"|}ddgt|	 }d'| d(}d)}d*| d+| d#| d,}nd-}d-}d.| d/| d0| d1| d1| d2| d3W  d    S 1 sMw   Y  d S )4Nr   c                 s  s    | ]}|  V  qd S rj   )rM  r   rZ   rZ   r[   ro   A  s    z4compute_meta_function_declaration.<locals>.<genexpr>zat::impl::MetaBasevoidc                 S  s   g | ]	}|D ]}|qqS rZ   rZ   )rk   Zreplace_listelemrZ   rZ   r[   r   M  s
    z5compute_meta_function_declaration.<locals>.<listcomp>c                 S  s   g | ]}|j  qS rZ   )r   upperrk   r]  rZ   rZ   r[   r   P      
c                 s  s    | ]	}d | dV  qdS )zbool z = falseNrZ   )rk   paramrZ   rZ   r[   ro   S  s    
z
template <>c                 S  s   g | ]
}t j||jd qS ))binds)r   argument_typer   r_  rZ   rZ   r[   r   Y      r&  c                 s  s(    | ]}|j d d d|j V  qdS )TZ	strip_ref N)cpp_typer   r_  rZ   rZ   r[   ro   ^  s
    
truerP   zprecompute_out<Trf  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;
            };rp   zstruct TORCH_API structured_z
 : public r8  r  z meta(z);
};
)r   r   outmetar   Zmeta_argumentsr   Zstructured_inheritsprecomputedr   valuesr   	enumeraterh  r   r   )r[  r   argsargs_strZparent_classZmeta_returnrl  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ir]  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_declrZ   rZ   r[   !compute_meta_function_declaration;  s   








&rs  r   rB   c                 C  sB   t | jjj}|ds|drdS | jjjd u rdS || S )NZ_likeZnew_F)r~   r   r   endswith
startswithr   r  r'  )r   r   r   rZ   rZ   r[   needs_backend_select  s   
rv  c                   @  r-  )ComputeBackendSelectz/Literal[Target.DEFINITION, Target.REGISTRATION]r0  rB   r   r   r2   ri   r   c                 C  s0  t || jsd S t|j}t|jdd}dd | D }t|j}|}|	 }d}| j
tju r|rP|jj s<J ddd |D }	d	| d
|	 d}
n|jj rXJ d| d}
d|j d|| d|
 d|jj  dddd |D  dS | j
tju rd|jj d| dS t| j
 d S )NTr  c                 S  s(   g | ]}t |jtr|jj r|qS rZ   )r   r   r$   r   r  r   rZ   rZ   r[   r     s    

z1ComputeBackendSelect.__call__.<locals>.<listcomp>z.c10::computeDispatchKey(dtype, layout, device)r   c                 s  r   rj   r6  r   rZ   rZ   r[   ro     r   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  r   rj   r   r   rZ   rZ   r[   ro     r   rV  zm.impl("aten::z", TORCH_FN(z));)rv  r   nativer   r   r   r   r   r9  r   r0  rI   r>  Zhas_tensor_argr   r=  r:  REGISTRATIONr   )rU   r   r   Z
native_sigr  Zdispatcher_sigr   Zdispatcher_exprsre   r  Z
compute_dkrZ   rZ   r[   r*    sJ   


	zComputeBackendSelect.__call__Nr+  rA  rZ   rZ   rZ   r[   rw    s
   
 rw  datac                 C  s2   dd t _ddd}t t| tj| d	t d
dS )Nc                 S  s   dS )NTrZ   )rU   r{  rZ   rZ   r[   r   
  s    zformat_yaml.<locals>.<lambda>dumperr	   r{  ri   c                 S  s   |  | S rj   )Zrepresent_dictrs   )r|  r{  rZ   rZ   r[   dict_representer  s   z%format_yaml.<locals>.dict_representerFg    eA)Zdefault_flow_styleZDumperwidth)r|  r	   r{  r	   ri   r	   )rJ   Zignore_aliasesZadd_representerr   r   dump)r{  r}  rZ   rZ   r[   format_yaml  s   

r  c                 C  s\   | dkrdS | dkrdS zt | W S  ty-   zt| W  Y S  ty,   |  Y  Y S w w )Nri  TfalseF)r   
ValueErrorfloatr   rZ   rZ   r[   pythonify_default  s   
r  tr;   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__)mutablerc  r  )r   r6   dynamic_typer]  r~   r   Zargumenttype_typerh  )r  rZ   rZ   r[   r  3  s   

r  rL  set[Variant]c                 C  s2   dg}t j| v r|d t j| v r|d |S )Nr;   r  	namespace)r<   r  r   rK  )rL  	method_ofrZ   rZ   r[   compute_method_of_yaml@  s   



r  +tuple[list[dict[str, str]], dict[str, str]]c                 C  s   i }t | }g }tt| jj|D ]3\}\}}t|j|t j|dd	 d}|j
r@|j
|d< | j r@|j
|| jjj| j
< || q||fS )NFrx  )r  r   r   
field_name)r   Zreturn_namesrn  zipr   returnsr  r   return_typerh  r   rW  r   rj  r   )r   name_to_field_namenamesr  rq  rr   retrZ   rZ   r[   compute_returns_yamlK  s   *


r  cpp_ar   schema_orderkwarg_only_setout_arg_setr  dict[str, str]c                C  sn   t | jtrd dd| j| jdd}| jd ur| j|d< |S t | jtr%tt | jtr5t	| j||||dS d S )Nzat::TensorOptionsFT)
annotationr  is_nullabler   r   
kwarg_onlyr   r  r  r  r  )
r   r   r:   r   r   r   r8   r   r$   compute_argument_yaml)r  r  r  r  r  r   rZ   rZ   r[   compute_cpp_argument_yaml  s,   

r  r   r$   c             	   C  s   | j rt| j nd t| j| j | jtj| ddd d}| j	d ur2t
tj| j	| jdd|d< | j|v r;d|d< | j|v rTd|d	< d|d
< | j|v rT|| j |d< | j }|d urn|jd urnt|jdkrn|j|d< |S )Nr  F)rc  r  )r  r  r  r   r   rx  r   Tr  r   allocater  r   size)r  r~   r  r   r  r   r   rd  rh  r   r  Zdefault_exprZis_list_liker  r]  )r   r  r  r  r  r   lrZ   rZ   r[   r    s*   	




 
r  c                   s  t | \}dd | jjjD  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 ootj| jv}
tdt
| jfdt| jjjfdt| jjjfd| jfd| jd ur| jndfdd| j fd|fd|	fd|fdt| jfdd| jd u rd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     h | ]}|j qS rZ   r6  r   rZ   rZ   r[   	<setcomp>  r   z+compute_declaration_yaml.<locals>.<setcomp>c                 S  r  rZ   r6  r   rZ   rZ   r[   r    r   Fr
  c              	        g | ]}t |d  dqS )Fr  )r  )rk   r  r  r  r  rZ   r[   r         z,compute_declaration_yaml.<locals>.<listcomp>c              	     r  )Tr  )r  r   r  rZ   r[   r     r  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   )rk   r   r  rZ   rZ   r[   r     s    rx  z (r   r  c                 s  s    | ]	}t |jtV  qd S rj   )r   r   r:   r   rZ   rZ   r[   ro   
      z+compute_declaration_yaml.<locals>.<genexpr>r   Zoperator_namer<  r   category_overriderp   Zschema_stringaten::r   schema_order_cpp_signatureschema_order_argumentsr  )modery  python_moduler  r   is_factory_methodabstractr   )Zwith_gilF)
deprecatedFZhas_math_kernel)r  r   r   Zflat_kwarg_onlyrj  r   r  r  r   r  r   returns_typer  rh  r   anyr<   r  rL  r   r   r~   r<  r   r  r  r  r   Zis_abstractr   r   )r   r  rN  Zcpp_argsr   Zschema_order_jit_argumentsr  Zcpp_schema_order_typesZcpp_returnsr  r  rZ   r  r[   compute_declaration_yaml  s^   

r  c                 C  s0   | j s| jd uo| j tjkp| j tjkS rj   )r   r   r   kindr7   
functionalr   r  rZ   rZ   r[   "has_autogenerated_composite_kernel,  s   r  dict[DispatchKey, BackendIndex]c              	     s   t  j}t  jj }t  j}ddd |D }d j t fdd|	 D t
jhkoD fdd|	 D t
jt
jhkt jpLt d}| d	| d
| dt| dS )Nr   c                 s  s    | ]	}|   V  qd S rj   )Z
no_defaultrM  r   rZ   rZ   r[   ro   9  r  z4compute_registration_declarations.<locals>.<genexpr>r  c                      h | ]\}}|  r|qS rZ   r   rk   r   r   r  rZ   r[   r  >      z4compute_registration_declarations.<locals>.<setcomp>c                   r  rZ   r  r  r  rZ   r[   r  @  r  )schemadispatchr   rg  r  z); // r   )
dispatcherr   r   r  r  rh  r   r   r~   rs   r*   r   r   Zhas_composite_kernelr  jsondumps)r   rb   r   r  ro  rp  Zcomment_datarZ   r  r[   !compute_registration_declarations2  s$   
	"r  "provided_op_registration_allowlistlist[str] | Noneop_selection_yaml_pathc                 C  sh   | d ur|d urJ dd }| d urt | }|d ur#t|dd}|S |d ur.t|}|S t }|S )NzhBoth provided_op_registration_allowlist and op_selection_yaml_path can NOT be provided at the same time.TF)r   rB   Z&from_legacy_op_registration_allow_listZfrom_yaml_pathget_nop_selector)r  r  Zop_registration_allowlistr   rZ   rZ   r[   get_custom_build_selectorS  s*   	

r  3Sequence[NativeFunction | NativeFunctionsViewGroup]c                 C  s   ddd}t t}| D ]<}|j }|j}|tjkr.|j }||| vs'J ||| |< q||| vsAJ | d||   ||| |< qt	t
|| S )	Nd1dict[ViewSchemaKind | SchemaKind, NativeFunction]ri   /list[NativeFunction | NativeFunctionsViewGroup]c                 S  s\   g }t j| v r%| t j}| t jd }| tjd }|t|||d || 	  |S )N)view	view_copyview_inplace)
r=   Zaliasingr   Zaliasing_inplacer7   r  r   r4   extendrm  )r  r   r  r  r  rZ   rZ   r[   maybe_create_view_groupu  s   
	zEget_grouped_by_view_native_functions.<locals>.maybe_create_view_groupz already in )r  r  ri   r  )r   r   r   Zview_signatureZview_schema_kindr=   Znon_aliasingr  r  r   rC   rm  )ra   r  Zgrouped_by_viewsr   r  Z	view_kindr  rZ   rZ   r[   $get_grouped_by_view_native_functionsr  s   



r  /Sequence[NativeFunction | NativeFunctionsGroup]c                 C  s(   ddd}t | }tt|t| S )Nr   dict[SchemaKind, NativeFunction]ri   r  c                 S  s>   t | }|d u rtdd |  D rJ t|  S |gS )Nc                 s  s    | ]}d |j v V  qdS )	generatedN)r   rk   r   rZ   rZ   r[   ro     r$  zJget_grouped_native_functions.<locals>.flatten_pre_group.<locals>.<genexpr>)r3   	from_dictr  rm  r   )r  r  rZ   rZ   r[   flatten_pre_group  s
   
z7get_grouped_native_functions.<locals>.flatten_pre_group)r  r  ri   r  )rA   r   rC   rm  )ra   r  Zpre_grouped_native_functionsrZ   rZ   r[   get_grouped_native_functions  s
   
r  )native_function_decl_gengrouped_native_functionsr  JCallable[[NativeFunctionsGroup | NativeFunction, BackendIndex], list[str]]dict[str, list[str]]c                 C  s   t t}| D ]B}t }t }| D ]5\}}||}	|	r+|	j}
|| ||
 nt}
t|dks=J d| d| ||
 	||| qq|S )NrP   z6Codegen only supports one namespace per operator, got z from )
r   r   r   rs   r  r  r   r(   r   r  )r  rb   r  ns_grouped_kernelsr   Znative_function_namespacesdispatch_keysre   backend_idxr  r  rZ   rZ   r[   get_ns_grouped_kernels  s&   

r  r  c              
   C  sh   g }d}|   D ])\}}t|ddd}tt|}|d|j d|| d|j d	| q|S )Nr   rp      namespace_strentity_nameZ	max_level	
        )
rs   rH   r   r   fromkeysr  prologuer   epiloguesplit)r  declarationsnewliner  kernels	ns_helperordered_kernelsrZ   rZ   r[   8get_native_function_declarations_from_ns_grouped_kernels  s(   r  c                 C  s   t | ||d}t|dS )a  
    Generate kernel declarations, in `NativeFunction(s).h`.
    :param grouped_native_functions: a sequence of `NativeFunction` or `NativeFunctionGroup`.
    :param backend_indices: kernel collections grouped by dispatch key.
    :param native_function_decl_gen: callable to generate kernel declaration for each `NativeFunction`.
    :return: a list of string, from the string with all declarations, grouped by namespaces, split by newline.
    r  rb   r  )r  )r  r  )r  rb   r  r  rZ   rZ   r[    get_native_function_declarations  s   r  %NativeFunction | NativeFunctionsGroupr  c                 C  s^   | | }|r(d|jv s(J dt| tr| jjn| jjj d|j d|j d|r-|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  r   r2   r   r   r  re   r(   )r   r  r  rZ   rZ   r[   get_kernel_namespace  s   
 r  rt   rocmr  skip_dispatcher_op_registrationgen_dispatch_helpersc        	           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 ]A}t	||d
dd ||   || t|tr_|jn|jj}||
 vrot t|
< |
 | || q9D ]Kt dkrq}tdd|
 D ]}|
 | sqd| d	 d
||
 |  d7 q|	| d fdd| q}|	S )Nr   r  r  class_method_namer  r   r  r   rp   r   )r  z
TORCH_LIBRARY_IMPL(r   z, m) {
    z
}zRegisterDispatchDefinitions.inic                     s,   j j  rdnd  dS )Nrp   )Zns_prologueZns_epilogueZdispatch_anonymous_definitionsZ"static_init_dispatch_registrationsZdeferred_dispatch_registrationsdispatch_namespaceZdispatch_namespaced_definitions)r  r  r   rZ   Zanonymous_definitionsre   Zkernel_namespaceZns_definitionsr  Zregistration_bodyr  rZ   r[   r   g  s   z1get_native_function_definitions.<locals>.<lambda>)r   r   r   destRegisterDispatchKeyrI   ZNAMESPACED_DEFINITIONZANONYMOUS_DEFINITIONrz  r  r   r  r   r2   r  r  r   rH   r   Zsubstitute_with_templater  )rt   r  re   r  r   r  r  r  r  definitionsZregistrationsr  Zns_genZanonymous_genZreg_genr   r  rZ   r  r[   get_native_function_definitions  s   			
r  c              
   C  s   g }t t}d}tj|tj||d d|d}	| D ]}
t|
|dd| }|| 	|	|
 q|
 D ]0\}}t|dkr>q3t|ddd	}tt|}|	d|j d|| d|j d
| q3|S )Nr   F)r  r  r  r  r  ry  r   rp      r  r  )r   r   r  r   rI   NAMESPACED_DECLARATIONr  r   r   r  rs   r   rH   r   r  r  r   r  r  )r  re   r  r   r  r  r  r  r  r   r   r  r  r  r  rZ   rZ   r[   get_namespaced_declaration|  sJ   		r  schema_selectortuple[list[str], str]c              
   C  s   t t}| D ]
}||j | qd}g }d }| D ]1\}}ttt||}	|dkr/|	}q|}d}
|tv r9dnd}|d| d| d|
|	 d	7 }q||fS )
Nrp   Zatenr   ZTORCH_LIBRARY_FRAGMENTZTORCH_LIBRARYr   r  z	, m) {
  z
};)	r   r   r  r   rs   rG   r  r+   r   )ra   r  Zns_native_functionsZnative_functionschema_registrationsaten_schema_registrationscustom_namespacer  r   Zschema_registrations_bodytabZtorch_library_macrorZ   rZ   r[   (get_native_function_schema_registrations  s4   r  structured_native_functionsSequence[NativeFunctionsGroup]static_dispatch_idxcpu_fmfunctions_keysset[DispatchKey]r  Sequence[DispatchKey]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 ]4t||}|v rd d| ddfdd | dd 	fdd ~qMd S )NzNativeMetaFunctions.hc                     s   g t tt dS )N)ZNativeMetaFunctions_includesZ NativeMetaFunctions_declarationsr   rG   rs  rZ   )r  rZ   r[   r     s
   z(gen_aggregated_headers.<locals>.<lambda>c                 S  s   g | ]
}t j|jv r|qS rZ   r<   r  rL  rk   fnrZ   rZ   r[   r     s
    z*gen_aggregated_headers.<locals>.<listcomp>c                   s   g | ]}| vr|qS rZ   rZ   r  )method_native_functionsrZ   r[   r     s
    MethodOperators.hc                     s   g t tttjd dS )Nr1  ZMethodOperators_includesZMethodOperators_declarationsr   rG   r.  rI   r;  rZ   )r  r  rZ   r[   r     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  rZ   )non_method_native_functionsr  rZ   r[   r      s   Functions.hc                     s   t dgttt  dS )Nz#include <ATen/Operators.h>)r   ZFunctions_includesZFunctions_declarations)r   r   rG   rD  rZ   ra   r  rZ   r[   r     s   )r  rb   zNativeFunctions.hc                     s   dg dS )Nz%#include <ATen/NativeMetaFunctions.h>)ZNativeFunctions_includesZNativeFunctions_declarationsrZ   rZ   )r  rZ   r[   r   "  s   r   Functions_inl.h>DispatchKeyFunctions.hc                        t  dS N)re   Zinline_headersr~   rZ   re   inl_headersrZ   r[   r   0     Functions_inl.hDispatchKeyFunctions_inl.hc                
     s$   g   t  dddS )NT)r  re   r  r   r  r  )!DispatchKeyFunctions_inl_includesr   dispatch_namespaced_declarations)r   r  rZ   )rb   re   r  r  r   rZ   r[   r   8  s   )writer  ru   write_with_template)ra   r  r  r  r   rb   r  rf   r  r  r  rt   rZ   )rb   r  re   r  r&  r  ra   r  r  r   r  r  r[   gen_aggregated_headers  s\   
	

r.  ops_fmc                   sJ  t t| D ]
}|j | qt t}|D ]}|j	|	 | q D ]^\	|	 dd
fdd |	 dd	
fdd |	g }dd	 |D td
krn|	 ddfdd t||t	j
d|	 dd	fdd q(dD ]\ |  d fdd q|	D ]y|vrq g  D ]<\	|	g }ttt	j| tj||
dd dd|td
krq	 |	 d ddfdd qt||}d d| ddfdd | d d!fd"d ~q|d#fd$d d S )%Nz_ops.hz
Operator.hc                     s   dt tttjd iS )Nr  r  r  rZ   )	functionsr  rZ   r[   r   h  s   z*gen_per_operator_headers.<locals>.<lambda>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  rZ   r[   r   {  s    z<gen_per_operator_headers.<locals>.<lambda>.<locals>.<lambda>r   _ops.h>)Zstatic_dispatch_ops_headersZoperator_includesZfunction_definitions)r   rG   rD  rZ   )r0  r   r  rZ   r[   r   x  s   

c                 S  s    g | ]}t |tr|jr|qS rZ   )r   r3   r   r  rZ   rZ   r[   r     s    z,gen_per_operator_headers.<locals>.<listcomp>r   z_meta.hzNativeMetaFunction.hc                        dt tt iS )NZmeta_function_declarationsr  rZ   )structured_functionsrZ   r[   r     s   r  z	_native.hzNativeFunction.hc                     s    rd d dS g  dS )Nr   z_meta.h>)Zextra_includesZnative_function_declarationsrZ   rZ   )r  is_structuredr   rZ   r[   r     s   ))Z	Functionsrp   )Z	OperatorsZ_ops)ZNativeMetaFunctions_meta)ZNativeFunctions_nativec                     s.     dfddt  D   dg iS )NZ	_includesc                   s   g | ]
}d |   dqS )r   .h>rZ   rk   r   )suffixrZ   r[   r     re  >gen_per_operator_headers.<locals>.<lambda>.<locals>.<listcomp>Z_declarations)r(  r  rZ   )categoryfunctions_by_root_namer<  rZ   r[   r     s
   

TFr  r   z_dispatch.hzDispatchKeyFunction.hc                     s
    dS )N)r  r+  rZ   rZ   )r  r  rZ   r[   r     s   r   r   r  r!  c                     r"  r#  r$  rZ   r%  rZ   r[   r     r'  r(  r)  c                     s   fddt  D g dS )Nc                   s   g | ]}d | d  dqS )r   r   r   rZ   r;  )r  rZ   r[   r     s    r=  )r  r*  r+  )r(  rZ   )dispatch_namesr  rZ   r[   r     s   
r  c                     s   t dd   D g dS )Nc                 s  s2    | ]\}}t d d |D rd| dV  qdS )c                 s  s    | ]	}t j|jv V  qd S rj   r  r  rZ   rZ   r[   ro     r  zGgen_per_operator_headers.<locals>.<lambda>.<locals>.<genexpr>.<genexpr>r   r4  N)r  )rk   r   r0  rZ   rZ   r[   ro     s    

z=gen_per_operator_headers.<locals>.<lambda>.<locals>.<genexpr>r  )r(  rs   rZ   )r?  rZ   r[   r      s
   )r   r   r   r   rs   r-  rq   r   r  r  #compute_native_function_declarationr,  r   rC   r   rI   r  ru   )ra   r  r  r   rb   r  rf   r/  r  r  r  r  Zgrouped_functions_by_root_namegroupZgrouped_functionsrt   rZ   )r>  r  re   r@  r  r0  r?  r&  r7  r   r  r6  r<  r[   gen_per_operator_headersI  s   
	
	
rC  core_fmper_operator_headersc                   s   |rt || ||	|
|||d nt||| ||	|||d |dfdd |dfdd |d fd	d |d
fdd dfdd}|d| dfdd}|d| d S )N)ra   r  r  r   rb   r  rf   r/  r  r  r  )ra   r  r  r  r   rb   r  rf   r  r  r  zTensorBody.hc                     s2   t tttjd t tttjd dS )N)r0  r1  )Ztensor_method_declarationsZtensor_method_definitions)r   rG   rT  rI   r;  r>  rZ   r  rZ   r[   r   <  s&   	zgen_headers.<locals>.<lambda>zRedispatchFunctions.hc                     s   dt tt  iS )NZfunction_redispatch_definitions)r   rG   rY  rZ   ra   rZ   r[   r   T  s   
zRegistrationDeclarations.hc                     s   d fddD iS )NZregistration_declarationsc                   s   g | ]}t | qS rZ   )r  r  r7  rZ   r[   r   ^      z1gen_headers.<locals>.<lambda>.<locals>.<listcomp>rZ   rZ   )rb   ra   rZ   r[   r   ]  s   zVmapGeneratedPlumbing.hc                     s   t  S rj   r"   rZ   rF  rZ   r[   r   f  s    ri   r  c                    s   t  } t  } D ]"}|t|jjj ||jjjj | dd |j D  q|h d8 }ddd t	|D ddd t	| D dS )	Nc                 s  r   rj   r6  )rk   r   rZ   rZ   r[   ro   r  r   zAgen_headers.<locals>.gen_aten_interned_strings.<locals>.<genexpr>>   ZbitorxorandorZcomplZand_eqZxor_eqZnot_eqZbitandZor_eqnotz \
c                 S  r   )z_(aten, r  rZ   r;  rZ   rZ   r[   r         zBgen_headers.<locals>.gen_aten_interned_strings.<locals>.<listcomp>c                 S  r   )z_(attr, r  rZ   r;  rZ   rZ   r[   r     rL  )Zaten_symbolsZattr_symbols)
r   r   r~   r   r   r   updater  r   r(  )attrsr  r   rF  rZ   r[   gen_aten_interned_stringsi  s   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(  rZ   )ry   rZ   r[   gen_tags_enum  s   z"gen_headers.<locals>.gen_tags_enumz
enum_tag.h)ri   r  )rC  r.  r,  )ra   ry   r  r  r  r   rb   rD  r  rf   r/  r  r  r  rE  rO  rP  rZ   )rb   ra   r  ry   r[   gen_headers  s\   
	
$rQ  view_groups"Sequence[NativeFunctionsViewGroup]aoti_fm
cpu_vec_fmforce_schema_registrationupdate_aoti_c_shimaoti_backendsextend_aoti_c_shimc           !        s  d}rd}|D ]t ||
|rdM
fdd}ndMfdd} tt}
D ]}t|tr:|jn|jj}|| | q0t	 t
jk	trW|nddt|| 	rhtng d	}dN	fdd}jd dd
dd |t
jkrdnd|dhd D ]djjrtsqjjjjt
ju rԈ|
u sJ d ddfdd |	d ddfdd qt
ju rdrdd  d!d"fd#d qtd$ d%qt|||||d& dOfd'd(}|
d)| }|r t }t|d*\ |
d+ fd,d dPd0d1}|
jd2|fd3dd4t id5h d6d7 |
d8t! |d9t! |d:fd;d dQfd=d>}tt } d?d@ t"dAd D dBd@ t"dCd D | #fdDdED  |
jdF| ||dh dGdH |
dIfdJd |
dKfdLd d S )RNz#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>ri   r   c                    s   g } D ][}d}  |rd}n"t|tr%t fdd| D r%d}n|jr2tjtjfv r2d}|s5q| 	d|j
 d tjkrN| 	d|j
 d v r_| 	d|j
 d d	 qtt| S )
NFTc                 3  s    | ]}  |V  qd S rj   r  r  r1  rZ   r[   ro     s    

z=gen_source_files.<locals>.operator_headers.<locals>.<genexpr>r   
_native.h>r:  r   r   )r   r   r3   r  r0  r   r*   Metar   r   r   r(  r   )headersr[  Zis_registered)r   re   r  r  r  rZ   r[   operator_headers  s8   
z*gen_source_files.<locals>.operator_headersc                    s8   dg}  t jkr| d  v r| d d | S )Nz!#include <ATen/NativeFunctions.h>z#include <ATen/Functions.h>r   r   )r*   r   r   )r\  )re   r  rZ   r[   r]    s   

rp   )extra_cuda_headersZexternal_backend_headersZdispatch_headersops_headersZdispatch_helpersgnfr  r  c                   s    dt | g dd	iS )Ndispatch_definitionsT)	rt   r  re   r  r   r  r  r  r  )r  )r`  )r   re   rt   r  r  r   r  rZ   r[   "register_dispatch_key_env_callable	  s   z<gen_source_files.<locals>.register_dispatch_key_env_callableZRegisterz.cppzRegisterDispatchKey.cppc                 S     | j S rj   r   )xrZ   rZ   r[   r   '	  s    z"gen_source_files.<locals>.<lambda>r  rP   ra  )key_fnenv_callable
num_shardsbase_envsharded_keysZ	UfuncCPU_zUfuncCPU.cppc                     s"   t t  tdS )N)meta_declarationnative_declarationnative_definitions)rs  r  rA  Zcompute_ufunc_cpurZ   )rb   re   r[  rZ   r[   r   7	  s   ZUfuncCPUKernel_zUfuncCPUKernel.cppc                     s   t  dS )N)r   rm  )r  Zcompute_ufunc_cpu_kernelrZ   )r[  r   rZ   r[   r   B	  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_headersrk  rl  rm  )rs  r  rA  Zcompute_ufunc_cudarZ   )rb   rn  re   r[  r   rZ   r[   r   N	  s   zunrecognized z
 for ufunc)rT  rX  ra   rb   r  r^  rW  rY  c                    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 rZ   )rv  r  r   rZ   r[   r   j	  
    
z@gen_source_files.<locals>.gen_backend_select.<locals>.<listcomp>c                 S  s   g | ]	}d |j  dqS )r   r4  rd  r  rZ   rZ   r[   r   n	  s    )r_  Z!backend_select_method_definitionsZ%backend_select_function_registrations)r   rG   rw  rI   r>  rz  )Zrelevant_fns)ra   r   rZ   r[   gen_backend_selecti	  s"   
z,gen_source_files.<locals>.gen_backend_selectzRegisterBackendSelect.cpp)ra   r  zRegisterSchema.cppc                     s   rg n rg dS dS )N)r	  r  rZ   rZ   )r	  r  r  rZ   r[   r   	  s   r  @NativeFunction | NativeFunctionsGroup | NativeFunctionsViewGroupr~   c                 S  rc  rj   rd  r2  rZ   rZ   r[   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.  rI   r>  r2  r3  rZ   r[   r   	  s   r      >   r   r]  r  )rf  rg  ri  rh  rj  zFunctions.cppzTensorMethods.cppzATenOpList.cppc                     r5  )NZaten_ops)r   rG   rZ  rZ   rF  rZ   r[   r   	  s   r[  c                   s.   ddd}|| t | t|  tj dS )	Nr[  rr  ri   r   c                 S  s  t | tr.d| jj dd| jj dg}| jd ur,|d| jj dd| jj dg7 }|S t | trd| jj dd| jj dd| jj dd| jj dg}| jd urh|d| jj dd| jj dg7 }| j	d ur|d| j	j dd| j	j dg7 }|S d| j dd| j dgS )Nr   rZ  r4  )
r   r4   r  r   r  r3   r  rj  r   r  )r[  r\  rZ   rZ   r[   gen_op_headers	  s<   




zPgen_source_files.<locals>.functionalization_env_callable.<locals>.gen_op_headers)r_  func_definitionsfunc_registrations)r[  rr  ri   r   )r   r   r*   r   )r[  ru  )rb   r   rZ   r[   functionalization_env_callable	  s   
(z8gen_source_files.<locals>.functionalization_env_callablec                 S     i | ]}|j j|qS rZ   r   r   r  rZ   rZ   r[   
<dictcomp> 
  rG  z$gen_source_files.<locals>.<dictcomp>c                 S     t |  S rj   r   r0  r[  rZ   rZ   r[   r   
      c                 S  ry  rZ   rz  r  rZ   rZ   r[   r{  
  r`  c                 S  r|  rj   r}  r~  rZ   rZ   r[   r   
  r  c                 3  s,    | ]}|j j vr|j jvr|V  qd S rj   rz  r  )structured_mapview_maprZ   r[   ro   
  s    


z#gen_source_files.<locals>.<genexpr>zRegisterFunctionalization.cpp>   rv  Zfunc_add_back_views_definitionsrw  Z!func_add_back_views_registrationsr_  )rf  rg  rh  rj  zFunctionalInverses.hc                     s   dt t fddiS )NZview_inverse_declarationsc                   s
   t  | S rj   )r    r~  ro  rZ   r[   r   !
  s    z4gen_source_files.<locals>.<lambda>.<locals>.<lambda>)r   rG   rZ   )r   rR  rZ   r[   r   
  s   
zCompositeViewCopyKernels.cppc                     sN   dd D dd D  t tt tj t ttt ttdS )Nc                 S  s:   g | ]}d  dd |jdu r|jgn|j|jgD qS )r   c                 s  s&    | ]}d |j  d|j  dV  qdS )r   _ops.h>
#include <ATen/ops/rZ  Nrd  r  rZ   rZ   r[   ro   >
  s    

@gen_source_files.<locals>.<lambda>.<locals>.<listcomp>.<genexpr>N)r   r  r  rk   r[  rZ   rZ   r[   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  s8    | ]}|d urd|j vrd|j d|j dV  qd S )Nr  r   r  rZ  )r   r   r  rZ   rZ   r[   ro   K
  s    

r  )r   r   r  r  r  rZ   rZ   r[   r   J
  s    
)r_  Z#CompositeViewCopyKernel_DefinitionsZ(GeneratedCompositeFunctional_DefinitionsZ!GeneratedCompositeOut_Definitions)r   rG   r!   r*   r   r?   r@   rZ   )rb   r  rR  rZ   r[   r   <
  s<   
)ri   r   )r`  r  ri   r  )ri   r  )r  rr  ri   r~   )r[  rr  ri   r  )$ru   r   r   r   r2   r  r  r   r~   r   r*   r   r-   r  Zgen_registration_headersZgen_registration_helpersZwrite_sharded_with_templateCPUrj  Zufunc_inner_loopr/   r   r   r-  CUDAr   r   r,  rB   r  r  Zwrite_shardedr   r   rC   r  )!ra   r  r  rR  r   r  rb   rT  rD  rU  r  rf   r  r  r  rV  rE  r  rW  rX  rY  r^  r]  Zns_grouped_native_functionsZgrouped_native_functionr  Zregister_dispatch_key_base_envrb  rq  r  rs  rx  Z
all_groupsrZ   )r	  r   rb   rn  re   r  rt   r  r[  r  r  r   ra   r  r  r   r  r  r  r  rR  r  r[   gen_source_files  s  *









9
r  c                   s   |  d fdd d S )NzDeclarations.yamlc                     s   t dd  D S )Nc                 S  s   g | ]}t |qS rZ   )r  r  rZ   rZ   r[   r   s
  s    z;gen_declarations_yaml.<locals>.<lambda>.<locals>.<listcomp>)r  rZ   rF  rZ   r[   r   s
  r   z'gen_declarations_yaml.<locals>.<lambda>)r,  )r  ra   rZ   rF  r[   gen_declarations_yamln
  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
    )r   __file__parentresolverZ   rZ   rZ   r[   get_torchgen_rootw
  s   r  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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 | jd#d$d%d&d' | jd(d)d*d | jd+d,d%d-d' | jd.d/d%d0d' | jd1d2dd3d | jd4d5dd6d | jd7td%g d8g d8d9d: | jd;dd<d | jd=dd>d |  tjj}tj	
jd?}tj	
jd@}dAdBlm} tjtjtjtjtjtjtjtjh}tjtjh}t }jsjr|tj |tj n|tj tj|v r||tj= jsjr%|tj |tj n|tj tj|v r8||tj= jsO|tj tj|v rO||tj= j r\fdCdD|D }t!|||}t"| }	|j#|j$}
 t%|
}dEdD |D }t&|
}dFdD |D }j' dG}t(|j)dHdHdI j' dJ}t(|j)dHdHdI j* }t(|j)dHdHdI t+|dK}t+dL}t+dL}t+dL}t+|dK}t+|dK}dM|i}jrt+dL|dN< g }j,r fdOdDj,D }j,D ]}t-|}||vr|| qdPj.v rTt/doi dQ|
dR|dS|dT|dU|dV|dW dX|dY|dZ|d[|d\|d]|d^|d_j0d`j1daj2dbj3dcjdd|dej4 dfj.v rot5|
|	|||| ||||||j0j2dg dhj.v r{t6|
|di j7rt(j78 }|j9}|j:}|djf|dkf|dlf|dmfgdndD |; D  D ]\}} | | }!|j<| |  }"|=|!t|" qd S d S )pNz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)r  z	--dry-run
store_truez5run without writing any files (still updates outputs))actionr  z--per-operator-headersz2generate separate headers per operator in ATen/opsz-dz--install-dirz--install_dirzoutput directoryzbuild/aten/src/ATenz--aoti-install-dirz--aoti_install_dirz%output directory for AOTInductor shimz(torch/csrc/inductor/aoti_torch/generatedz--rocmz=reinterpret CUDA as ROCm/HIP and adjust filepaths accordinglyz--mpsz'Generate MPS registration code when setz--xpuz'Generate XPU registration code when setz--mtiaz(Generate MTIA registration code when setz--op-registration-whitelistz--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 ...)nargsr  z--op-selection-yaml-pathz--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-whitelistz--backend_whitelistzRfilter dispatch backend by the whitelist (if set), e.g.: CPU CUDA QuantizedCPU ...z--static-dispatch-backendz--static_dispatch_backendz?generate static dispatch code for the specific backend (if set)z!--skip-dispatcher-op-registrationz!--skip_dispatcher_op_registrationz0Avoid registering operators into the dispatcher.z--force-schema-registrationz--force_schema_registrationz}force it to generate schema-only registrations for all ops, includingthose that are not listed on --op-registration-whitelistz
--generate)r\  sourcesdeclarations_yamlzGenerate only a subset of files)r   r  choicesr   r  z--update-aoti-c-shimzUpdate AOTInductor C shim after adding an entry to inductor_fallback_ops in torchgen/aoti/fallback_ops.py. WARNING: Do not use this unless you are sure what you are doing!!!z--extend-aoti-c-shima  This Flag indicates the generation of c shims for out-of-tree ATen ops,which is an extension to the In-tree ATen op c shims. This flag needs to be combined with---source-path=<out-of-tree native_functions.yaml>--aoti-install-dir=<in-tree aoti_install_dir>/extend   default is torch/csrc/inductor/aoti_torch/generated/extendWARNING: Do not use this unless you are sure what you are doing!!!znative/native_functions.yamlznative/tags.yamlr   )r  c                   s&   g | ]}t |st| jv r|qS rZ   )r.   r~   backend_whitelist)rk   r   optionsrZ   r[   r   9  s    zmain.<locals>.<listcomp>c                 S     g | ]	}t |tr|qS rZ   )r   r3   r  rZ   rZ   r[   r   H  rp  c                 S  r  rZ   )r   r4   r  rZ   rZ   r[   r   N  s    z/coreT)parentsexist_okz/ops)r  install_dirr  cudaxpuc                   s   g | ]	} t | qS rZ   )r*   parse)rk   keyr7  rZ   r[   r   r  s    r  ra   r  r  rR  r   r  rb   rT  rD  rU  r  rf   r  r  r  rV  rE  r  rW  rX  rY  r\  )ra   ry   r  r  r  r   rb   rD  r  rf   r/  r  r  r  rE  r  )ra   r  rp   Zcpu_vec_Zcore_Zops_c                 S  s   g | ]\}}|| d fqS )r   rZ   )rk   rm   Z	device_fmrZ   rZ   r[   r     r  rZ   )>argparseArgumentParseradd_argumentr~   
parse_argsr  Zop_registration_whitelistr  osr}   r   source_pathtorchgen.modelr  r*   r  r  r   r   r   r   r[  ZMTIAr   ZmpsrW  r   ZMPSr   r  ZXPUZmtiar  r   rd   ra   rb   r  r  r  r   mkdiraoti_install_dirrF   Zstatic_dispatch_backendr  generater  r  rV  rE  r  rY  rQ  r  Zoutput_dependenciesr  r   stemrs   r  Zwrite_outputs)#parserr   Znative_yaml_pathr   r  r  rX  r{   Zparsed_yamlry   ra   r  r  Z!native_functions_with_view_groupsrR  Zcore_install_dirZops_install_dirr  rD  r  rU  Zcuda_fmr/  rT  rf   r  r  Zdp_keyZdepfile_pathZdepfile_nameZdepfile_stemrt   rU  varnamer}   rZ   )rb   r  r[   main
  s  		








	
r  __main__)re   r*   rf   rg   rh   rE   ri   rE   )Nrv   F)rw   rx   ry   rz   r{   r|   r}   r~   r   r   ri   r`   )rv   )rw   rx   r}   r~   ri   rz   )r}   r~   ri   rz   rj   )r}   r~   r   r~   r{   r|   r   r   r   r   ri   r`   )r   r   ri   r   )r   r~   ri   r~   )r   r   ri   r   )r   r2   r   r%   ri   r   )r   r2   r   r   ri   r   )r   r   ri   r   )r   r   r   r   ri   r~   )r   r   r   r2   r   r%   ri   r~   )r   r   r   r2   rb   r   ri   r~   r@  )r[  r3   ri   r   )r   r2   r   rB   ri   r   )r{  rx   ri   r~   )r   r~   ri   rx   )r  r;   ri   r~   )rL  r  ri   r   )r   r2   ri   r  )r  r   r  r   r  rz   r  rz   r  r  ri   rx   )r   r$   r  r   r  rz   r  rz   r  r  ri   rx   )r   r2   ri   rx   )r   r2   ri   r   )r   r2   rb   r  ri   r~   )r  r  r  r   ri   rB   )ra   r   ri   r  )ra   r   ri   r  )r  r  rb   r  r  r  ri   r  )r  r  ri   r   )r  r  rb   r  r  r  ri   r   )r   r  r  r%   ri   r~   )rt   rE   r  r  re   r*   r  r%   r   rB   r  r   r  r   r  r   r  r   ri   r   )r  r  re   r*   r  r%   r   rB   r  r   r  r   ri   r   )ra   r   r  rB   ri   r  )ra   r   r  r  r  r  r  r   r   rB   rb   r  r  rE   rf   rg   r  r  r  r  r  r   ri   r   )ra   r   r  r  r  r   r   rB   rb   r  r  rE   rf   rg   r/  rE   r  r  r  r  r  r   ri   r   ) ra   r   ry   rz   r  r  r  r  r  r   r   rB   rb   r  rD  rE   r  rE   rf   rg   r/  rE   r  r  r  r  r  r   rE  r   ri   r   ),ra   r   r  r  r  r  rR  rS  r   rB   r  r   rb   r  rT  rE   rD  rE   rU  rE   r  rE   rf   rg   r  r  r  r  r  r   rV  r   rE  r   r  r   rW  r   rX  r  rY  r   ri   r   )r  rE   ra   r   ri   r   )ri   r   )ri   r   )
__future__r   r  	functoolsr  r   r  collectionsr   r   r   dataclassesr   r   pathlibr   typingr	   r
   r   r   r   Ztyping_extensionsr   r   Ztorchgen.api.dispatcherapir  Ztorchgen.api.metark  Ztorchgen.api.nativery  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_aoti_c_shimr   r   Z#torchgen.gen_functionalization_typer   r   r    r!   Ztorchgen.gen_vmap_plumbingr#   r  r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   Z#torchgen.native_function_generationr>   r?   r@   rA   Z!torchgen.selective_build.selectorrB   Ztorchgen.utilsrC   rD   rE   rF   rG   rH   rI   Ztorchgen.yaml_utilsrJ   rK   collections.abcrL   rM   rN   r`   rc   r,  rd   ru   r   r   cacher   r   r   r   r   r   r   r   r   r	  r  r  r  r.  rD  rT  rY  rZ  rs  rv  rw  r  r  r  r  r  r  r  r  r  r  r  r  r  rA  r  r  r  r  r  r  r  r.  rC  rQ  r  r  r  r  r\   rZ   rZ   rZ   r[   <module>   s    $	p$	!	
0
 
<






#

L\/-
|DC $Y / d0$y C    \	  
=
