o
    ,iU                 (   @   sT
  U 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mZ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  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) d dl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d d	l2m3Z3m4Z4m5Z5m6Z6 d d
l7m8Z8m9Z9m:Z:m;Z; d dl<m=Z=m>Z>m?Z?m@Z@ d dlAmBZB d dlCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[ d dl\m]Z]m^Z^m_Z_m`Z` d dlambZb d dlcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZk d dllmmZmmnZn edZoG dd denZpedddgZqi areeseqf etd< i aueesees f etd< 			ddevdees deeeI  desd ewd!eqfd"d#Zxddevdesd!ees fd$d%Zyejzdd&desd!ees fd'd(Z{	dddd)desd*esdeeeI  d ewd+eev d!eqfd,d-Z|d.eeP d!dfd/d0Z}d1esd!esfd2d3Z~d4eeE d!eeI fd5d6Zd7ePd8eEd!eeI fd9d:Zd7ePd8eeE d!ees fd;d<Zd4eeE d!ees fd=d>Zd?ee,e.f d@e,d!esfdAdBZd?ee,e.f d7ePd8eEd!esfdCdDZd?ee,e.f d7ePdeeE d!esfdEdFZd?ee,e.f d7ePdeeE d!esfdGdHZe
dIdJG dKdL dLZe
dIdJG dMdN dNZe
dIdJG dOdP dPZe
dIdJG dQdR dRZe
dIdJG dSdT dTZe5d7ePd!esfdUdVZdWeQd!ees fdXdYZd7ePdZebd!ewfd[d\Ze
dIdJG d]d^ d^Zd_evd!esfd`daZd1esd!evfdbdcZddeYd!esfdedfZdgeeZ d!ees fdhdiZd7ePd!eeeesesf  eesesf f fdjdkZdle+dmewdnees doees dpeesesf d!evfdqdrZdseDdmewdnees doees dpeesesf d!evfdtduZe5d7ePd!evfdvdwZd7ePd!ewfdxdyZe6d7ePdeeIeEf d!esfdzd{Zd|eees  d}ees d!ebfd~dZdeeP d!eeePeRf  fddZdeeP d!eeePeQf  fddZe#jddeeePeQf  deeIeEf deeeQePf eEgees f d!eesees f fddZdeesees f d!ees fddZe#jddeeePeQf  deeIeEf deeeQePf eEgees f d!ees fddZd7eePeQf deEd!esfddZdegdeeePeQf  deIdeEdZebdewdewdewdewd!ees fddZdeeePeQf  deIdeEdZebdewdewd!ees fddZdeeP debd!eees esf fddZdeeP deeePeQf  deeQ deeE dZebdeeIeEf degdegdeeI deeI dewd!dfddZdeeP deeePeQf  deeE dZebdeeIeEf degdegdegdeeI deeI dewd!dfddZdeeP dees deeePeQf  deeQ deeE dZebdeeIeEf degdegdegdegdeeI deeI dewdewd!df ddZdeeP deeePeQf  deeQ deeR dZebdeeE deeIeEf degdegdegdegdegdeeI deeI dewdewdewdewdewd!df(ddZdegdeeP d!dfddZd!ejfddZdddZedkr(e  dS dS )    N)defaultdict
namedtupleOrderedDict)	dataclassfield)AnyCallableDictListLiteralOptionalSequenceSetTupleTypeVarUnion)inductor_fallback_ops)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*gen_static_dispatch_backend_call_signatureget_fallback_op_nameget_header_for_aoti) gen_functionalization_definition"gen_functionalization_registration.gen_functionalization_view_inverse_declarationGenCompositeViewCopyKernelgen_all_vmap_plumbing)ArgumentBackendIndexBackendMetadataBaseOperatorNameDEFAULT_KERNEL_NAMESPACEDispatchKeyFRAGMENT_NAMESPACES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_mapping
start_markline)selfnoderS   mapping	__class__ J/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torchgen/gen.pyrW      s   zLineLoader.construct_mapping)F)__name__
__module____qualname__rW   __classcell__r_   r_   r]   r`   rR      s    rR   
ParsedYamlnative_functionsbackend_indices_GLOBAL_PARSE_NATIVE_YAML_CACHE_GLOBAL_PARSE_TAGS_YAML_CACHE<stdin>Fes
valid_tagsignore_keyspathskip_native_fns_genreturnc              	      s6  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||d
|
|< qt||
S )Nzexpected to be dict: rU   funczmissed 'func' in c                      s   d d  S Nzin z:
  r_   r_   funcslocr_   r`   <lambda>       z*parse_native_yaml_struct.<locals>.<lambda>c                   S   s   t tjdddi dS )NTFdispatch_keyuse_out_as_primaryexternaldevice_guardindex)r+   r/   	Undefinedr_   r_   r_   r`   rv      s    TFrx   )
isinstancelistr   dictgetintr5   rI   r6   	from_yamlappendr+   
grow_indexerror_check_native_functionsrB   itemsr2   re   )rk   rl   rm   rn   ro   rsbserq   mindiceskvr_   rs   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 )NrU   tagc                      s   d  d S rr   r_   r_   ru   tagsr_   r`   rv      rw   z(parse_tags_yaml_struct.<locals>.<lambda>desc )
r   r   setr   r   r5   rI   copypopadd)rk   rn   r   r   e_inamer   r_   r   r`   parse_tags_yaml_struct   s   

r   )maxsizec                 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)rn   )ri   openyamlloadrR   r   )rn   frk   r_   r_   r`   parse_tags_yaml   s   

r   )ro   loaded_yamltags_yaml_pathr   c                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   )rn   ro   )rh   r   r   r   r   rR   r   )rn   r   rm   ro   r   rl   r   rk   r_   r_   r`   parse_native_yaml   s    	

r   rt   c                 C   sB  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d|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inplace_viewresize_
resize_as_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   rq   r   r   structured_delegater   
structuredr   strinplacer-   basedunder_methodlen)rt   func_mapbase_func_mapr   delegate_func	base_nameout_of_place_base_namer_   r_   r`   r   	  sP   







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   r_   r_   r`   
cpp_string4  s   r   backendsc                 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 r_   )ry   ).0backendr_   r_   r`   
<listcomp>R      z(static_dispatch_keys.<locals>.<listcomp>)r   r/   CompositeImplicitAutograd%CompositeImplicitAutogradNestedTensorCompositeExplicitAutograd&CompositeExplicitAutogradNonFunctionalr   r_   r_   r`   static_dispatch_keysN  s   r   r   backend_indexc                 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 N)r   
has_kernelry   &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   r_   r_   r`   get_static_dispatch_backendZ  s   r   c                 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}   ry   r_   r_   r`   static_dispatch_ops_headern  s   

r   c                 C   s   dd t | D S )Nc                 S      g | ]}d | dqS )#include <ATen/Functions.h>r_   )r   ry   r_   r_   r`   r     s    
z1static_dispatch_extra_headers.<locals>.<listcomp>)r   r   r_   r_   r`   static_dispatch_extra_headers~  s   r   sigcpp_sigc                 C   st   dt t dt t fdd}t|  }t| }|D ]}|jjtjkr*||} nqt||}d	dd |D S )Ninput_bindingsrp   c                 S   sT   g }| D ]#}|j dkr"tttj|jj|j |j|jd}|	| q|	| q|S )Nmemory_format)nctyper   defaultargument)
r   r   r   r    possibly_redundant_memory_formatr   typer   r   r   )r   output_bindingsbindingspl_mem_format_bindingr_   r_   r`   add_spl_memory_format_binding  s   
	z5translate_args.<locals>.add_spl_memory_format_binding, c                 s       | ]}|j V  qd S r   exprr   ar_   r_   r`   	<genexpr>      z!translate_args.<locals>.<genexpr>)
r
   r   r   	argumentsr   r   r   r   r   r   )r   r   r   src_bindingsgoal_bindingsargexprsr_   r_   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::nativer   return ::();)	r!   r   r   
get_kernelcpp_namespacer.   r   ry   r   )	r   r   r   r   r   r   backend_metadata	kernel_nsnsr_   r_   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methodfallback_bindingr   r   r  r  r  r  z5TORCH_CHECK(false, "Static dispatch does not support z forr   c                 S   s   g | ]}t |jqS r_   )r   ry   )r   r}   r_   r_   r`   r     s    z:generate_static_dispatch_fallback_call.<locals>.<listcomp>z ");)r   from_native_functionsymintrq   
has_symintsymint_signature	signaturer   r   r.   r   r   r/   r   r   r   r   r   r   r   r   r   )r   r   rg   cpp_sigsr   r   r   r	  r_   r_   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 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 ur|jtv r|qS r   )r   r   ry   r=   )r   br   r_   r`   r     s    

z#static_dispatch.<locals>.<listcomp>rT   c                 S   s6   g | ]}t |jtst |jtr|jj r|jqS r_   )r   r   r<   r*   r   is_tensor_liker   r   r_   r_   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   rq   tensor_optionsr   ry   )r   r   rg   keysnative_tensor_argstensor_argstensor_optsstmtssubexprsdispatch_coder}   fallback	connectorr_   r  r`   static_dispatch  sN   
	


r&  T)frozenc                   @   sJ   e Zd ZU eed< eedZee	e
f ed< ededee	 fddZdS )	RegisterSchemaselector)default_factory
known_tagsr   rp   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::Nr_   )r   r   r_   r_   r`   r   /      z*RegisterSchema.__call__.<locals>.<genexpr>}z{}zm.def(z, {});
r   z const std::vector<at::Tag> tags_z = ;
z, tags_z);
)
r)  is_native_function_selectedr   sortedr   r   r   rq   r+  r   )rZ   r   r   
maybe_tagsidxr_   r_   r`   __call__+  s   "


&zRegisterSchema.__call__N)ra   rb   rc   rF   __annotations__r   r   r+  r	   r   r   r   r6   r   r4  r_   r_   r_   r`   r(  &  s
   
 r(  c                   @   sD   e Zd ZU eejejf ed< ee	 ed< e
dedefddZdS )ComputeOperatorstargetstatic_dispatch_backend_indicesr   rp   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| d|jjj d| d|jjj	 d| dt
t|j d|j d| d| d| d| d| d}dD ]^}|rd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 
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   r   r_   r   r   r_   r_   r`   r   }  r   z-ComputeOperators.__call__.<locals>.<listcomp>c                 S   r   r_   r=  r   r_   r_   r`   r     r   r  z
    static auto op = create_z_typed_handle();
    return op.r  r  r   rg   

// aten::r    {
    z
}
)r   from_schemarq   r   unambiguous_namer7  rN   DECLARATIONr   overload_namer   r   defn
DEFINITIONr   r   r   r8  r&  rG   )rZ   r   r   r   defnsr:  dispatcher_exprs_strmethod_basedispatcher_callmethod_namefn_bodyr_   r_   r`   r4  D  s   		zComputeOperators.__call__N)ra   rb   rc   r   rN   rC  rF  r5  r
   r+   r   r6   r   r4  r_   r_   r_   r`   r6  ?  s
   
 r6  c                   @   &   e Zd Zededee fddZdS )ComputeFunctionr   rp   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  r   r   c                 S   r   r_   r   r   r   r_   r_   r`   r     r   z,ComputeFunction.__call__.<locals>.<listcomp>zc10::SymIntint64_tr?  
inline  {
    return at::_ops::::call(z);
}zX
namespace symint {
  template <typename T, typename = std::enable_if_t<std::is_same<T, z>::value>>
  T)suppress_symint_suffixz	);
  }
}
)r   r  manual_cpp_bindingrq   r  
signaturesr   rA  r   r   r   r  r@   functionvariantsdeclr   rB  )
rZ   r   	sig_groupr  resultr   
target_sigr   	exprs_str	intlike_tr_   r_   r`   r4    sD   





zComputeFunction.__call__Nra   rb   rc   r   r6   r   r   r4  r_   r_   r_   r`   rN        rN  c                   @   sH   e Zd ZU eejejf ed< ee	 ed< e
dedee fddZdS )ComputeTensorMethodr7  r8  r   rp   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  r   z const;
)r  r   c                 S   r   r_   r   rO  r_   r_   r`   r     r   z0ComputeTensorMethod.__call__.<locals>.<listcomp>r?  rQ  zTensor::)prefixz const {
    return at::_ops::rS  );
}
)r@   r  rX  rq   	is_out_fnr   self_argr   r  rU  r7  rN   rC  rV  rY  rF  rG   r   rA  r   r   rE  r   rB  rZ   r   rZ  r[  r   r\  r   r]  r_   r_   r`   r4    s:   


zComputeTensorMethod.__call__N)ra   rb   rc   r   rN   rC  rF  r5  r
   r+   r   r6   r   r   r4  r_   r_   r_   r`   ra    s
   
 ra  c                   @   rM  )ComputeRedispatchFunctionr   rp   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  r   r   r<  c                 S   r   r_   r   r   r_   r_   r`   r     r   z6ComputeRedispatchFunction.__call__.<locals>.<listcomp>r?  rQ  T)r:  rR  z::redispatch(rc  )r   r  rU  rV  r   rA  rq   r   r   r   rY  r   rB  rf  r_   r_   r`   r4     s$   

z"ComputeRedispatchFunction.__call__Nr_  r_   r_   r_   r`   rg    r`  rg  c                 C   s   d| j jj d| j jj dS )Nz{"aten::z", "z"},)rq   r   rD  r  r_   r_   r`   compute_aten_op  s   rh  gc                 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 r   )rY  r   r_   r_   r`   r   )  s    z4compute_meta_function_declaration.<locals>.<genexpr>zat::impl::MetaBasevoidc                 S   s   g | ]	}|D ]}|qqS r_   r_   )r   replace_listelemr_   r_   r`   r   5  s
    z5compute_meta_function_declaration.<locals>.<listcomp>c                 S   s   g | ]}|j  qS r_   )r   upperr   rl  r_   r_   r`   r   8      
c                 s   s    | ]	}d | dV  qdS )zbool z = falseNr_   )r   paramr_   r_   r`   r   ;  s    
z
template <>c                 S   s   g | ]
}t j||jd qS ))binds)r   argument_typer   rn  r_   r_   r`   r   A      r/  c                 s   s(    | ]}|j d d d|j V  qdS )T	strip_ref N)cpp_typer   rn  r_   r_   r`   r   F  s
    
truerT   zprecompute_out<Tru  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>;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   meta_argumentsr   structured_inheritsprecomputedr   valuesr   	enumeraterx  r   r   )ri  r   argsargs_strparent_classmeta_returnr  precomputed_valuesprecomputed_elementsprecomputed_template_parametersprecomputed_template_params_strprecompute_template_decl#precomputed_elements_with_cpp_typesprecomputed_elements_declsetter_methodsirl  return_ty_templates	return_tyelem_cpp_tyr  
assert_msgassert_stmtconstruction_stmtsjconstruction_blocksetter_methods_declmeta_return_template_paramsmeta_return_typedefprecomputed_declr_   r_   r`   !compute_meta_function_declaration#  s   








&r  r)  c                 C   sB   t | jjj}|ds|drdS | jjjd u rdS || S )N_likenew_F)r   rq   r   endswith
startswithr   r  r0  )r   r)  r   r_   r_   r`   needs_backend_select  s   
r  c                   @   sD   e Zd ZU eejejf ed< eed< e	de
dee fddZdS )ComputeBackendSelectr7  r)  r   rp   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 r_   )r   r   r*   r   r  r   r_   r_   r`   r     s    

z1ComputeBackendSelect.__call__.<locals>.<listcomp>z.c10::computeDispatchKey(dtype, layout, device)r   c                 s   r   r   r=  r   r_   r_   r`   r     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   r   r   r   r_   r_   r`   r     r   rc  zm.impl("aten::z", TORCH_FN(z));)r  r)  nativer   rq   r   r   r   rA  r   r7  rN   rF  has_tensor_argr   rE  rB  REGISTRATIONrG   )rZ   r   r   
native_sigr  dispatcher_sigr   dispatcher_exprsry   r  
compute_dkr_   r_   r`   r4    sJ   


	zComputeBackendSelect.__call__N)ra   rb   rc   r   rN   rF  r  r5  rF   r   r6   r   r   r4  r_   r_   r_   r`   r    s
   
 r  datac                 C   s>   dd t _dtdtdtfdd}t t| tj| dt d	d
S )Nc                 S   s   dS )NTr_   )rZ   r  r_   r_   r`   rv         zformat_yaml.<locals>.<lambda>dumperr  rp   c                 S   s   |  | S r   )represent_dictr   )r  r  r_   r_   r`   dict_representer  s   z%format_yaml.<locals>.dict_representerFg    eA)default_flow_styleDumperwidth)rO   ignore_aliasesr   add_representerr   r   dump)r  r  r_   r_   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 )Nry  TfalseF)r   
ValueErrorfloatr   r_   r_   r`   pythonify_default  s   
r  tc                 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__)mutablerr  r  )r   r:   dynamic_typerl  r   r   argumenttype_typerx  )r  r_   r_   r`   r    s   

r  rX  c                 C   s2   dg}t j| v r|d t j| v r|d |S )Nr?   r  	namespace)r@   r  r   rW  )rX  	method_ofr_   r_   r`   compute_method_of_yaml(  s   



r  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 )NFr  )r  r   r   
field_name)r   return_namesr  ziprq   returnsr  r   return_typerx  r   rd  r   r{  r   )r   name_to_field_namenamesr  r  rr   retr_   r_   r`   compute_returns_yaml3  s   *


r  cpp_aschema_orderkwarg_only_setout_arg_setr  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   r<   AssertionErrorr*   compute_argument_yaml)r  r  r  r  r  r   r_   r_   r`   compute_cpp_argument_yamlv  s,   

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)rr  r  )r  r  r  r   r   r  r   Tr  r   allocater  boolsize)r  r   r  r   r  r   r   rs  rx  r   r  default_expris_list_liker  rl  )r   r  r  r  r  r   lr_   r_   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 r_   r=  r   r_   r_   r`   	<setcomp>  r   z+compute_declaration_yaml.<locals>.<setcomp>c                 S   r  r_   r=  r   r_   r_   r`   r    r   Fr  c              	         g | ]}t |d  dqS )Fr  )r  )r   r  r  r  r  r_   r`   r         z,compute_declaration_yaml.<locals>.<listcomp>c              	      r  )Tr  )r  r   r  r_   r`   r     r  c              
   S   s0   g | ]}t j|d t d d d dD ]}|jqqS )F)r  cpp_no_default_argsfaithfulr  has_tensor_options)r   r   r   r   )r   r   r  r_   r_   r`   r     s    r  z (r   r  c                 s   s    | ]	}t |jtV  qd S r   )r   r   r>   r   r_   r_   r`   r         z+compute_declaration_yaml.<locals>.<genexpr>r   operator_namerD  r   category_overrider   schema_stringaten::r   schema_order_cpp_signatureschema_order_argumentsr  )moder  python_moduler  r   is_factory_methodabstractr|   )with_gilF)
deprecatedFhas_math_kernel)r  rq   r   flat_kwarg_onlyr{  r   r  r  r   r  r   returns_typer  rx  r   anyr@   r  rX  r   r   r   rD  r   r  r  r  r   is_abstractr|   r   )r   r  rZ  cpp_argsr   schema_order_jit_argumentsr  cpp_schema_order_typescpp_returnsr  r  r_   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 r   )r   r   rq   kindr;   
functionalr   r  r_   r_   r`   "has_autogenerated_composite_kernel  s   r  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 r   )
no_defaultdecl_registration_declarationsr   r_   r_   r`   r   #  r  z4compute_registration_declarations.<locals>.<genexpr>r  c                       h | ]\}}|  r|qS r_   r   r   r   r   r  r_   r`   r  (      z4compute_registration_declarations.<locals>.<setcomp>c                    r  r_   r  r  r  r_   r`   r  *  r  )schemadispatchr   rw  r  z); // r   )
dispatcherr   rq   r  r  "cpp_type_registration_declarationsr   r   r   r   r/   r   r   has_composite_kernelr  jsondumps)r   rg   r   r  r  r  comment_datar_   r  r`   !compute_registration_declarations  s,   
	"r  "provided_op_registration_allowlist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   rF   &from_legacy_op_registration_allow_listfrom_yaml_pathget_nop_selector)r  r  op_registration_allowlistr)  r_   r_   r`   get_custom_build_selector=  s&   


r  c                 C   s   dt tttf tf dttttf  fdd}tt}| D ]<}|j	
 }|j}|tjkr@|j	 }||| vs9J ||| |< q||| vsSJ | d||   ||| |< qtt|| S )Ndrp   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)
rA   aliasingr   aliasing_inplacer;   r  r   r8   extendr  )r  rt   r  r  r  r_   r_   r`   maybe_create_view_group_  s   
	zEget_grouped_by_view_native_functions.<locals>.maybe_create_view_groupz already in )r	   r   rA   r;   r6   r
   r8   r   r   rq   view_signatureview_schema_kindnon_aliasingr  r  r   rH   r  )rf   r  grouped_by_viewsr   r  	view_kindr  r_   r_   r`   $get_grouped_by_view_native_functions\  s&   



r#  c                 C   sD   dt ttf dttttf  fdd}t| }tt|t|	 S )Nr  rp   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   r   r   r_   r_   r`   r     r-  zJget_grouped_native_functions.<locals>.flatten_pre_group.<locals>.<genexpr>)r7   	from_dictr  r  r   )r  r  r_   r_   r`   flatten_pre_group  s
   
z7get_grouped_native_functions.<locals>.flatten_pre_group)
r	   r;   r6   r   r   r7   rE   r   rH   r  )rf   r'  pre_grouped_native_functionsr_   r_   r`   get_grouped_native_functions  s   

r)  )native_function_decl_gengrouped_native_functionsr*  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 )NrT   z6Codegen only supports one namespace per operator, got z from )
r   r   r   r   r  r  r   r.   r   r  )r+  rg   r*  ns_grouped_kernelsr   native_function_namespacesdispatch_keysry   backend_idxr  r  r_   r_   r`   get_ns_grouped_kernels  s&   

r0  r,  c              
   C   sh   g }d}|   D ])\}}t|ddd}tt|}|d|j d|| d|j d	| q|S )Nr   r      namespace_strentity_name	max_level	
        )
r   rM   r   r   fromkeysr  prologuer   epiloguesplit)r,  declarationsnewliner  kernels	ns_helperordered_kernelsr_   r_   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+  rg   r*  )r,  )r0  r@  )r+  rg   r*  r,  r_   r_   r`    get_native_function_declarations  s   rB  r/  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   r6   rq   r   r  ry   r.   )r   r/  r  r_   r_   r`   get_kernel_namespace  s   
 rC  fmry   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 ]Mt dkrq}tdd|
 D ]}|
 | sqd| d	 d
||
 |  d7 q|	| d f	dd| q}|	S )Nr   rE  r  class_method_namerF  r   r/  r   r   r   )r3  z
TORCH_LIBRARY_IMPL(r   z, m) {
    
};zRegisterDispatchDefinitions.inic                	      s<   j jrtng   rdnd  dS )Nr   )ns_prologuens_epiloguedispatch_helpersdispatch_anonymous_definitions"static_init_dispatch_registrationsdeferred_dispatch_registrationsdispatch_namespacedispatch_namespaced_definitions)r8  r9  destgen_registration_helpersr   r_   	anonymous_definitionsr/  ry   rG  kernel_namespacens_definitionsr>  registration_bodyrF  r_   r`   rv   S  s   z1get_native_function_definitions.<locals>.<lambda>)r   r   r   rT  RegisterDispatchKeyrN   NAMESPACED_DEFINITIONANONYMOUS_DEFINITIONr  rC  r   r  r   r6   r  r  r   rM   r   substitute_with_templater:  )rD  r+  ry   r/  r)  rE  r  rF  rG  definitionsregistrationsr<  ns_genanonymous_genreg_genr   r  r_   rV  r`   get_native_function_definitions  s   			
rd  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)rE  rI  rF  r  rJ  r  r   r      r2  r6  )r   r   rT  r[  rN   NAMESPACED_DECLARATIONrC  r   r   r  r   r   rM   r   r7  r8  r   r9  r:  )r+  ry   r/  r)  rE  r  r;  r,  r<  rq   r   r  r=  r>  r?  r_   r_   r`   get_namespaced_declarationk  sN   			rg  schema_selectorc              
   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 )
Nr   atenr   TORCH_LIBRARY_FRAGMENTTORCH_LIBRARYr   r  z	, m) {
  rK  )	r   r   r  r   r   rL   r(  r0   r   )rf   rh  ns_native_functionsnative_functionschema_registrationsaten_schema_registrationscustom_namespacer  rt   schema_registrations_bodytabtorch_library_macror_   r_   r`   (get_native_function_schema_registrations  s4   rt  structured_native_functionsstatic_dispatch_idxcpu_fmcuda_fmfunctions_keysr.  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 ]6trU|n|}|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)NativeMetaFunctions_includes NativeMetaFunctions_declarationsr   rL   r  r_   )ru  r_   r`   rv     s
   z(gen_aggregated_headers.<locals>.<lambda>c                 S   s   g | ]
}t j|jv r|qS r_   r@   r  rX  r   fnr_   r_   r`   r     s    z*gen_aggregated_headers.<locals>.<listcomp>c                    s   g | ]}| vr|qS r_   r_   r~  )method_native_functionsr_   r`   r     s    MethodOperators.hc                      s   g t tttjd dS )Nr8  MethodOperators_includesMethodOperators_declarationsr   rL   r6  rN   rC  r_   )r  rv  r_   r`   rv     s   zOperators.hc                      s    dgt tttjd dS )Nz!#include <ATen/MethodOperators.h>r  )Operators_includesOperators_declarationsr  r_   )non_method_native_functionsrv  r_   r`   rv     s   Functions.hc                      s   t dgttt  dS )Nz#include <ATen/Operators.h>)r   Functions_includesFunctions_declarations)r   r   rL   rN  r_   rf   rv  r_   r`   rv      s   )r+  rg   zNativeFunctions.hc                      s   dg dS )Nz%#include <ATen/NativeMetaFunctions.h>)NativeFunctions_includesNativeFunctions_declarationsr_   r_   )r;  r_   r`   rv     s   r   Functions_inl.h>DispatchKeyFunctions.hc                         t  dS N)ry   inline_headersr   r_   ry   inl_headersr_   r`   rv   !     Functions_inl.hDispatchKeyFunctions_inl.hc                
      s$   g   t  dddS )NT)r+  ry   r/  r)  rE  r  )!DispatchKeyFunctions_inl_includesrR   dispatch_namespaced_declarations)r   rg  r_   )rg   ry   r+  rE  r)  r_   r`   rv   )  s   )writerB  r2   write_with_template)rf   r+  ru  rv  r)  rg   rw  rx  ry  r.  rE  rD  r_   )rg   r;  ry   r+  r  r  rf   r  rE  r)  rv  ru  r`   gen_aggregated_headers  s\   
	

r  ops_fmc                    sN  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 ]{|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r|n|}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  r_   )	functionsrv  r_   r`   rv   Y  s   z*gen_per_operator_headers.<locals>.<lambda>.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  rv  r_   r`   rv   l  s    z<gen_per_operator_headers.<locals>.<lambda>.<locals>.<lambda>r   _ops.h>)static_dispatch_ops_headersoperator_includesfunction_definitions)r   rL   rN  r_   )r  r   rv  r_   r`   rv   i  s   

c                 S   s    g | ]}t |tr|jr|qS r_   )r   r7   r   r~  r_   r_   r`   r   }  s    z,gen_per_operator_headers.<locals>.<listcomp>r   z_meta.hzNativeMetaFunction.hc                         dt tt iS )Nmeta_function_declarationsr|  r_   )structured_functionsr_   r`   rv     s   rA  z	_native.hzNativeFunction.hc                      s    rd d dS g  dS )Nr   z_meta.h>)extra_includesnative_function_declarationsr_   r_   )r;  is_structuredr   r_   r`   rv     s   ))	Functionsr   )	Operators_ops)NativeMetaFunctions_meta)NativeFunctions_nativec                      s.     dfddt  D   dg iS )N	_includesc                    s   g | ]
}d |   dqS )r   .h>r_   r   r   )suffixr_   r`   r     rt  >gen_per_operator_headers.<locals>.<lambda>.<locals>.<listcomp>_declarations)r1  r  r_   )categoryfunctions_by_root_namer  r_   r`   rv     s
   

TFrH  r   z_dispatch.hzDispatchKeyFunction.hc                      s
    dS )N)rR  r  r_   r_   )r;  rR  r_   r`   rv     s   r   r  r  r  c                      r  r  r  r_   r  r_   r`   rv     r  r  r  c                      s   fddt  D g dS )Nc                    s   g | ]}d | d  dqS )r   r   r   r_   r  )rR  r_   r`   r     s    r  )rR  r  r  )r1  r_   )dispatch_namesrR  r_   r`   rv     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 r   r}  r~  r_   r_   r`   r     r  zGgen_per_operator_headers.<locals>.<lambda>.<locals>.<genexpr>.<genexpr>r   r  N)r  )r   r   r  r_   r_   r`   r     s    

z=gen_per_operator_headers.<locals>.<lambda>.<locals>.<genexpr>r  )r1  r   r_   )r  r_   r`   rv     s
   )r   r   r   r   r   r  r   r   rB  rT  #compute_native_function_declarationr  r   rH   r[  rN   rf  r2   )rf   r+  rv  r)  rg   rw  rx  r  ry  r.  rE  r  grouped_functions_by_root_namegroupgrouped_functionsrD  r_   )r  r;  ry   r  rR  r  r  r  r  r   rv  r  r  r`   gen_per_operator_headers:  s   
	
	
r  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tttf ffdd}|d| dtttf ffdd}|d| d S )N)rf   r+  rv  r)  rg   rw  rx  r  r.  ry  rE  )rf   r+  ru  rv  r)  rg   rw  rx  r.  ry  rE  zTensorBody.hc                      s2   t tttjd t tttjd dS )N)r7  r8  )tensor_method_declarationstensor_method_definitions)r   rL   ra  rN   rC  rF  r_   r  r_   r`   rv   -  s&   	zgen_headers.<locals>.<lambda>zRedispatchFunctions.hc                      s   dt tt  iS )Nfunction_redispatch_definitions)r   rL   rg  r_   rf   r_   r`   rv   E  s   
zRegistrationDeclarations.hc                      s   d fddD iS )Nregistration_declarationsc                    s   g | ]}t | qS r_   )r  r%  r>  r_   r`   r   O      z1gen_headers.<locals>.<lambda>.<locals>.<listcomp>r_   r_   )rg   rf   r_   r`   rv   N  s   zVmapGeneratedPlumbing.hc                      s   t  S r   r(   r_   r  r_   r`   rv   W  s    rp   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   r   r=  )r   r   r_   r_   r`   r   c  r   zAgen_headers.<locals>.gen_aten_interned_strings.<locals>.<genexpr>>   orandnotxorbitorcomplor_eqand_eqbitandnot_eqxor_eqz \
c                 S   r   )z_(aten, r  r_   r  r_   r_   r`   r   w      zBgen_headers.<locals>.gen_aten_interned_strings.<locals>.<listcomp>c                 S   r   )z_(attr, r  r_   r  r_   r_   r`   r   z  r  )aten_symbolsattr_symbols)
r   r   r   rq   r   r   updater  r   r1  )attrsr  rq   r  r_   r`   gen_aten_interned_stringsZ  s   z.gen_headers.<locals>.gen_aten_interned_stringszaten_interned_strings.hc                      s   dd t iS )Nenum_of_valid_tagsz,
)r   r1  r_   )rl   r_   r`   gen_tags_enum  s   z"gen_headers.<locals>.gen_tags_enumz
enum_tag.h)r  r  r  r	   r   )rf   rl   r+  ru  rv  r)  rg   r  rw  rx  r  r.  ry  rE  r  r  r  r_   )rg   rf   rv  rl   r`   gen_headers  s\   
	
$r  view_groupsaoti_fm
cpu_vec_fmforce_schema_registrationupdate_aoti_c_shimc           '         s:  drd|D ]t r|n|	}r%dtt f
fddndtt f
fdd tt}D ]}t|trE|jn|jj}|| 	| q;t
 tjk}t|d|d	|d	 d
dfd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t D ]}| D ]}|jd ur||j<  nqqtjtjfv rt }D ]}t|}|tv r|||< qtdd t| D 	d
  d}t	dd d!|rL| |fd"d nBz*t!t"j#$|j%|}|& }|kseJ d#W d    n	1 spw   Y  W n t'y   t(t"j#$|j%| d$ Y nw dtf	fd%d&t rnd | d
  d
	fd'd ~qdt)ttt f ffd(d)}|	 d*| } |rt*+ } t,| d+\ |	 d, fd-d d.t-tt.t/f dtfd/d0}!|	j0d1|!fd2dd3t1id4h d5d6 |	 d7t | d8t | d9fd:d d;t-tt.t/f dt)ttt f ffd<d=}"tt }#d>d? t2d@d D }$dAd? t2dBd D }%D ]}&|&jj|$vru|&jj|%vru|#	|& q`|	j0dC|#|!|"dDh dEdF |	 dGfdHd |	 dIfdJd d S )KNz#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>rp   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 r   r  r~  r  r_   r`   r     s    

z=gen_source_files.<locals>.operator_headers.<locals>.<genexpr>r   
_native.h>r  r   r   )r   r   r7   r  r  r   r/   Metar   r   r   r1  r   )headersri  is_registered)r   ry   rR  ry  r+  r_   r`   operator_headers  s6   
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  )ry   ry  r_   r`   r    s   

T)	rD  r+  ry   r/  r)  rE  r  rF  rG  Registerz.cppzRegisterDispatchKey.cppc                      s*   t rnddt  ddS )Nr   )extra_cuda_headersexternal_backend_headersdispatch_headersops_headersrN  dispatch_definitions)r2   rT  gen_registration_headersr_   )r   r  ry   r  r  r  rE  r_   r`   rv     s   z"gen_source_files.<locals>.<lambda>	UfuncCPU_zUfuncCPU.cppc                      s"   t t  tdS )N)meta_declarationnative_declarationnative_definitions)r  rT  r  compute_ufunc_cpur_   )rg   ry   ri  r_   r`   rv   	  s   UfuncCPUKernel_zUfuncCPUKernel.cppc                      s   t  dS )N)r   r  )rT  compute_ufunc_cpu_kernelr_   )ri  r   r_   r`   rv   !	  s   z%#include <ATen/native/cuda/Loops.cuh>z$#include <ATen/native/hip/Loops.cuh>
UfuncCUDA_z.cuzUfuncCUDA.cuc                      s&   t t  tdS )N)r   cuda_headersr  r  r  )r  rT  r  compute_ufunc_cudar_   )rg   r  ry   ri  r   r_   r`   rv   -	  s   zunrecognized z
 for ufuncc                 s   s    | ]\}}|V  qd S r   r_   )r   r   valuer_   r_   r`   r   G	  s    
z#gen_source_files.<locals>.<genexpr>c_shim_r  r   headerincludesc                      s    S r   r_   r_   )
new_headerr_   r`   rv   X	  r  a  

WARNING: The generated AOTInductor C shim header files have unexpectedly changed. This
indicates an AOTInductor fallback operator ABI backward compatibility breakage!!!
Only in a limited number of situations, this is allowed:

1. You added a fallback op to the inductor_fallback_ops list in torchgen/aoti/fallback_ops.py.
If that's the case, run `python torchgen/gen.py --update-aoti-c-shim` to update the existing
C shim header files.

2. You added a new default argument to an existing fallback op. This is clearly a BC breaking
change in the AOTInductor land. In this case, you need to keep a manual copy of that existing
fallback op in a file, e.g. torch/csrc/inductor/aoti_torch/c/shim.h, bump up the version
number of that fallback op in the newly generated C shim files, and update the cpp wrapper
codegen to generate the correct cpp call for this op. Contact AOTInductor team for assistance.

                        z
 not foundc                     s@   g } D ]}t | }|d ur| | qdtt| S )Nr   )r#   r   r   r1  r   )r  rq   r  )rg   ry   fallback_native_functionsstructured_func_group_dictr_   r`   headers_for_aotiy	  s   
z*gen_source_files.<locals>.headers_for_aotic                      s   t  d d  dS )NFr   r  )r    r_   )rg   ry   extra_headersr  r  r  r_   r`   rv   	  s    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 r_   )r  r~  r)  r_   r`   r   	  
    
z@gen_source_files.<locals>.gen_backend_select.<locals>.<listcomp>c                 S   s   g | ]	}d |j  dqS )r   r  r   r~  r_   r_   r`   r   	  s    )r  !backend_select_method_definitions%backend_select_function_registrations)r   rL   r  rN   rF  r  )relevant_fns)rf   r)  r_   r`   gen_backend_select	  s"   
z,gen_source_files.<locals>.gen_backend_selectzRegisterBackendSelect.cpp)rf   rh  zRegisterSchema.cppc                      s   rg n rg dS dS )N)ro  rn  r_   r_   )ro  rn  rF  r_   r`   rv   	  s   r  c                 S   s   | j S r   r  r  r_   r_   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   r6  rN   rF  r  r  r_   r`   rv   	  s   r      >   r_  r  r   )key_fnenv_callablebase_env
num_shardssharded_keyszFunctions.cppzTensorMethods.cppzATenOpList.cppc                      r  )Naten_ops)r   rL   rh  r_   r  r_   r`   rv   	  s   ri  c                    sD   dt tttf dtt fdd}|| t| t|  tj	 dS )Nri  rp   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   r  r  )
r   r8   r  r   r  r7   r  r{  r   r  )ri  r  r_   r_   r`   gen_op_headers	  s<   




zPgen_source_files.<locals>.functionalization_env_callable.<locals>.gen_op_headers)r  func_definitionsfunc_registrations)
r   r6   r7   r8   r
   r   r$   r%   r/   r   )ri  r  )rg   r)  r_   r`   functionalization_env_callable	  s    
(z8gen_source_files.<locals>.functionalization_env_callablec                 S      i | ]}|j j|qS r_   rq   r   r%  r_   r_   r`   
<dictcomp>-
  r  z$gen_source_files.<locals>.<dictcomp>c                 S      t |  S r   r   r  ri  r_   r_   r`   rv   /
      c                 S   r  r_   r  r%  r_   r_   r`   r  1
  ro  c                 S   r  r   r  r  r_   r_   r`   rv   2
  r  zRegisterFunctionalization.cppr1  >   r  r  r  func_add_back_views_definitions!func_add_back_views_registrations)r  r  r  r  zFunctionalInverses.hc                      s   dt t fddiS )Nview_inverse_declarationsc                    s
   t  | S r   )r&   r  r  r_   r`   rv   L
  s    z4gen_source_files.<locals>.<lambda>.<locals>.<lambda>)r   rL   r_   )r)  r  r_   r`   rv   I
  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   z_ops.h>
#include <ATen/ops/r  Nr  r%  r_   r_   r`   r   i
  s    

@gen_source_files.<locals>.<lambda>.<locals>.<listcomp>.<genexpr>N)r   r  r  r   ri  r_   r_   r`   r   h
  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   s0    | ]}|d urd|j vrd|j dV  qd S )Nr$  r   r  )r   r   r%  r_   r_   r`   r   v
  s    r#  )r   r   r  r  r$  r_   r_   r`   r   u
  s    
)r  #CompositeViewCopyKernel_Definitions(GeneratedCompositeFunctional_Definitions!GeneratedCompositeOut_Definitions)r   rL   r'   r/   r   rC   rD   r_   )rg   ru  r  r_   r`   rv   g
  s<   
)3r2   r
   r   r   r   r   r6   r  r  r   r   r/   r   rd  r  r{  ufunc_inner_loopr4   rq   r   CPUCUDAr  r   r  r   r"   r   tupler1  r   r    r  r   osrn   r   install_dirreadFileNotFoundErrorprintr	   rF   r  rt  r   r7   r8   write_shardedr   rH   )'rf   r+  ru  r  r)  rv  rg   r  r  rw  r  rx  r.  ry  rE  r  r  rF  r  rD  ns_grouped_native_functionsgrouped_native_functionr  rG  
func_grouprq   	fallbacksop_nameheader_file_nameold_file
old_headerr  rh  r  r  
all_groupsstructured_mapview_mapr   r_   )ro  r   rg   r  r  ry   rR  r  r  r  ry  ri  r+  r  r   rf   r  r  r  rE  rn  r)  rF  rv  r  ru  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 r_   )r  r%  r_   r_   r`   r   
  s    z;gen_declarations_yaml.<locals>.<lambda>.<locals>.<listcomp>)r  r_   r  r_   r`   rv   
  r   z'gen_declarations_yaml.<locals>.<lambda>)r  )rw  rf   r_   r  r`   gen_declarations_yaml
  s   
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resolver_   r_   r_   r`   get_torchgen_root
  s   rD  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"d# | jd$d%d&d | jd'd(d!d)d# | jd*d+d!d,d# | jd-d.dd/d | jd0d1dd2d | jd3td!g d4g d4d5d6 | jd7dd8d |  tjj}tj	
jd9}tj	
jd:}d;d<lm} t }js|tj tj|v r||tj= t|||}t| }|j|j} t|}	d=d> |	D }
t|}d?d> |D }j d@}t|jdAdAdB j dC}t|jdAdAdB j }t|jdAdAdB t|dD}tdE}tdE}tdE}t|dD}t|dD}tj tj!tj"tj#tj$tj%tj&h}jr_|tj j'rlfdFd>|D }g }j(r fdGd>j(D }j(D ]}t)|}||vr|| qdHj*v rt+dei dI|dJ|	dK|
dL|dM|dN|dO dP|dQ|dR|dS|dT|dU|dV|dWj,dXj-dYj.dZj/d[j0 d\j*v rt1|||	|
|| ||||||j,j.d] d^j*v rt2||d_ j3r>tj34 }|j5}|j6}|d`f|daf|dbf|dcf|ddffD ]\}}|| }|j7||  } |8|t|  q%d S d S )fNz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)rF  z	--dry-run
store_truez5run without writing any files (still updates outputs))actionrF  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--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 ...)nargsrF  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   rJ  choicesr   rF  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native/native_functions.yamlznative/tags.yamlr   )r.  c                 S      g | ]	}t |tr|qS r_   )r   r7   r$  r_   r_   r`   r   0  r  zmain.<locals>.<listcomp>c                 S   rN  r_   )r   r8   r$  r_   r_   r`   r   6  s    z/coreT)parentsexist_okz/ops)optionsr-  rQ  c                    s&   g | ]}t |st| jv r|qS r_   )r3   r   backend_whitelist)r   r   rR  r_   r`   r   c  s    c                    s   g | ]	} t | qS r_   )r/   parse)r   keyr>  r_   r`   r   k  s    rK  rf   r+  ru  r  r)  rv  rg   r  r  rw  r  rx  r.  ry  rE  r  r  rF  r  r  )rf   rl   r+  ru  rv  r)  rg   r  rw  rx  r  r.  ry  rE  r  rL  )rf   rw  r   cpu_vec_core_cuda_ops_r_   )9argparseArgumentParseradd_argumentr   
parse_argsr  op_registration_whitelistr  r,  rn   r   source_pathtorchgen.modelr.  r   mpsr   r/   MPSr}   r   ri   rf   rg   r)  r#  r-  r?  r@  mkdiraoti_install_dirrK   r)  r*  r   r   r   r   r  rS  static_dispatch_backendrT  generater=  rE  r  r  rF  r  r  r>  output_dependenciesrC  r   stemrB  write_outputs)!parserr)  native_yaml_pathr   r.  rm   parsed_yamlrl   rf   r+  ru  !native_functions_with_view_groupsr  core_install_dirops_install_dirrd  r  rw  r  rx  r  r  ry  rv  rU  dp_keydepfile_pathdepfile_namedepfile_stemrD  rb  varnamern   r_   )rg   rQ  r`   main
  s  	



	





	
ru  __main__)Nrj   F)rj   r   )rp   N)rZ  	functoolsr  r,  r?  collectionsr   r   r   dataclassesr   r   typingr   r   r	   r
   r   r   r   r   r   r   r   r   torchgen.api.dispatcherapir  torchgen.api.metar|  torchgen.api.nativer  torchgen.api.structuredr   torchgen.destrT  torchgen.aoti.fallback_opsr   torchgen.apir   torchgen.api.translater   torchgen.api.typesr   r   r   r   r   r   r   torchgen.contextr   r   r   r   torchgen.gen_aoti_c_shimr    r!   r"   r#   #torchgen.gen_functionalization_typer$   r%   r&   r'   torchgen.gen_vmap_plumbingr)   r`  r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   #torchgen.native_function_generationrB   rC   rD   rE   !torchgen.selective_build.selectorrF   torchgen.utilsrG   rH   rI   rJ   rK   rL   rM   rN   torchgen.yaml_utilsrO   rP   rQ   rR   re   rh   r   r5  ri   objectr  r   r   	lru_cacher   r   r   r   r   r   r   r   r   r
  r  r&  r(  r6  rN  ra  rg  rh  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r#  r)  r  r0  r@  rB  rC  rd  rg  rt  r  r  r  r=  r>  r@  rD  ru  ra   r_   r_   r_   r`   <module>   sL  
 4$	h(
!	

0


 +




#





L`/-|D
C

 

$Y
"


/



"



	

g
2
$
	

y
	

 C
	

 
	

    
	
  

