o
    ki,                    @  sn  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 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l/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5m6Z6 d dl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z= d dl>m?Z? d dl@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZ d dl[m\Z\m]Z]m^Z^m_Z_ d dl`maZa d dlbmcZcmdZdmeZemfZfmgZgmhZhmiZi d dljmkZkmlZl er*d dlmmnZnmoZo edZpG dd delZqe	dddgZri asdetd< i audetd< dd&d'Zv		(	)ddd4d5Zwddd6d7Zxejydd8d9Zz	dd)dd:dd>d?Z{ddCdDZ|ddFdGZ}ddKdLZ~ddRdSZddUdVZddXdYZdd^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Ze2ddrdsZd dvdw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Ze2d	ddZd
ddZe3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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,gen_functionalization_view_meta_classes_decl,gen_functionalization_view_meta_classes_impl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)Callable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_mapping
start_markline)selfnoderQ   mapping	__class__ V/var/www/addictedbytheproject.nl/epg/venv/lib/python3.10/site-packages/torchgen/gen.pyrU      s   zLineLoader.construct_mapping)F)__name__
__module____qualname__rU   __classcell__r]   r]   r[   r^   rP      s    rP   
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_fmrF   returnc                   s(   | t fddt D d|}|S )Nc                 3  s     | ]\}}| r|V  qd S Nr]   ).0checkdevicerh   r]   r^   	<genexpr>   s    
z1file_manager_from_dispatch_key.<locals>.<genexpr> )getnextr*   items)rh   ri   rk   fmr]   rq   r^   file_manager_from_dispatch_key   s   
rx   <stdin>Fesobject
valid_tagsset[str]ignore_keysset[DispatchKey] | Nonepathstrskip_native_fns_genboolc              	     sR  t | tstdt|  g }tt}| D ]b}t |ts$td| t |dts3td| t||d |d  d u rJtd| t	 fdd t
|||\}}	|| t||	 W d    n1 ssw   Y  qt| td	d }
|st|| | D ]\}}t|d
dt|pt||d|
|< qt||
S )N$Expected 'es' to be a list, but got zExpected to be dict: rS   Expected '__line__' to be int: 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rh   use_out_as_primaryexternaldevice_guardindex)r&   r+   	Undefinedr]   r]   r]   r^   r      s    TFr   )
isinstancelistAssertionErrortyper   dictrt   intr2   rE   r3   	from_yamlappendr&   
grow_indexerror_check_native_functionsr?   rv   r.   r1   rc   )rz   r|   r~   r   r   rsbser   mindiceskvr]   r   r^   parse_native_yaml_struct   sD   





r   c              	     s   t | tstdt|  t }| D ]V}t |dts$td| t||d  |dt fdd( |	 }|
d}|
dd}|dkrUtd	| d
|| W d    n1 sdw   Y  q|S )Nr   rS   r   tagc                     s   d  d S r   r]   r]   r   tagsr]   r^   r      r   z(parse_tags_yaml_struct.<locals>.<lambda>descrs   zTag 'z#' must have a non-empty description)r   r   r   r   setrt   r   r2   rE   copypopadd)rz   r   r   r   e_inamer   r]   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   )rg   openyamlloadrP   r   )r   frz   r]   r]   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   )rf   r   r   r   r   rP   r   )r   r   r~   r   r   r|   r   rz   r]   r]   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 r?t|jj d|j d|j d|jsSt|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st|jj dt|jd|j}	t||	 dkrt|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uniform_r   !_has_compatible_shallow_copy_typer   zArgument name 'z' in function 'z' is a reserved Python keyword.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   r   r   r   structured_delegatert   r   
structuredr   keywordkwlist	argumentsflat_allr   r   inplacer(   basedunder_methodlen)
r   func_mapbase_func_mapr   delegate_funcPYTHON_RESERVED_KEYWORDSEXCLUSION_LISTarg	base_nameout_of_place_base_namer]   r]   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   r]   r]   r^   
cpp_string]  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 r]   rq   )rn   backendr]   r]   r^   
<listcomp>{      z(static_dispatch_keys.<locals>.<listcomp>)r   r+   CompositeImplicitAutograd%CompositeImplicitAutogradNestedTensorCompositeExplicitAutograd&CompositeExplicitAutogradNonFunctionalr   r]   r]   r^   static_dispatch_keysw  s   r   r   r3   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 rm   )r   
has_kernelrh   &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_backend  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   rh   r]   r]   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>r]   )rn   rh   r]   r]   r^   r     s    
z1static_dispatch_extra_headers.<locals>.<listcomp>)r   r   r]   r]   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"||} nqt||}ddd |D S )
Ninput_bindingslist[Binding]rl   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  r   r  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 rm   exprrn   ar]   r]   r^   rr         z!translate_args.<locals>.<genexpr>)r  r  rl   r  )r   r   r  r   r   r  r   r  )r	  r  r  src_bindingsgoal_bindingsr   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::nativers   return ::();)	r   r   r!  
get_kernelcpp_namespacer)   r   rh   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 rtd| }t	| |}t
dd}|jrCd| dtj  d| d| d		S |jrXd| dtj  d| d| d		S |jrmd| 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_bindingzExpected cpp_sig to be non-Noner"  rs   r#  r$  r%  r&  z5TORCH_CHECK(false, "Static dispatch does not support z forr  c                 S  s   g | ]}t |jqS r]   )r   rh   )rn   r   r]   r]   r^   r     s    z:generate_static_dispatch_fallback_call.<locals>.<listcomp>z ");)r   from_native_functionsymintr   
has_symintsymint_signature	signaturer   r   r!  r)   r   r   r+   r   r   r   r   r   r   r   r   r  )r	  r   re   cpp_sigsr  r   r   r+  r]   r]   r^   &generate_static_dispatch_fallback_call  s,   
$$$$r6  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   rs   c                   s.   g | ]}|  s jd ur|jtv r|qS rm   )r   r   rh   r:   )rn   br   r]   r^   r     s    

z#static_dispatch.<locals>.<listcomp>rR   c                 S  s6   g | ]}t |jtst |jtr|jj r|jqS r]   )r   r  r9   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,  r6  r   r  r   tensor_optionsr   rh   )r	  r   re   keysnative_tensor_argstensor_argstensor_optsstmtssubexprsdispatch_coder   fallback	connectorr]   r8  r^   static_dispatch  sN   
	


rH  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 )RegisterSchemarC   selector)default_factoryzdict[str, int]
known_tagsr   r3   rl   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::Nr]   )rn   r   r]   r]   r^   rr   Y      z*RegisterSchema.__call__.<locals>.<genexpr>}z{}zm.def(z, {});
rs   z const std::vector<at::Tag> tags_z = ;
z, tags_z);
)
rK  is_native_function_selectedr  sortedr   r   r   r   rM  r   )rX   r   r   
maybe_tagsidxr]   r]   r^   __call__U  s   "


&zRegisterSchema.__call__Nr   r3   rl   r   )	r_   r`   ra   __annotations__r   r   rM  r   rV  r]   r]   r]   r^   rJ  P  s
   
 rJ  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   r3   rl   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_fn
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   r]   r   r  r]   r]   r^   r     r   z-ComputeOperators.__call__.<locals>.<listcomp>c                 S  r   r]   rc  r  r]   r]   r^   r     r   r$  z
    static auto op = create_z_typed_handle();
    return op.r%  r&  r   re   r    {
    z
}
)r   from_schemar   r   unambiguous_namer\  rJ   DECLARATIONr   overload_namer   r   defn
DEFINITIONr  r   r   r]  rH  r   )rX   r   r	  r   defnsr_  dispatcher_exprs_strmethod_basedispatcher_callmethod_namefn_bodyr]   r]   r^   rV  n  s   	zComputeOperators.__call__Nr   r3   rl   r   r_   r`   ra   rX  r   rV  r]   r]   r]   r^   rZ  i  
   
 rZ  c                   @     e Zd ZedddZdS )	ComputeFunctionr   r3   rl   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-  rs   r  c                 S  r   r]   r  rn   r   r]   r]   r^   r     r   z,ComputeFunction.__call__.<locals>.<listcomp>zc10::SymIntint64_tra  
inline  {
    return at::_ops::::call(z);
}zZ
namespace symint {
  template <typename T, typename = std::enable_if_t<std::is_same_v<T, z>>>
  T)suppress_symint_suffixz	);
  }
}
)r   r0  manual_cpp_bindingr   r2  
signaturesr   rf  r   r   r  r1  r=   functionvariantsdeclr   rg  )
rX   r   	sig_groupr2  resultr	  
target_sigr   	exprs_str	intlike_tr]   r]   r^   rV    sD   





zComputeFunction.__call__NrW  r_   r`   ra   r   rV  r]   r]   r]   r^   rv        rv  c                   @  rY  )ComputeTensorMethodr[  r\  r   r]  r   r3   rl   r   c                 C  s$  t j|jvrd S |j rtd|j |jjjd u r$td|j tj	|d|j
d}| jtju rGd}| D ]}||  d7 }q9|S | jtjurRt| 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 }qX|S )Nz*Method variant cannot be an out function: z#Method variant must have self_arg: Tr-  rs   z const;
)r.  r  c                 S  r   r]   r  rw  r]   r]   r^   r     r   z0ComputeTensorMethod.__call__.<locals>.<listcomp>ra  ry  zTensor::)prefixz const {
    return at::_ops::r{  );
}
)r=   r.  r  r   	is_out_fnr   r   self_argr   r0  r}  r\  rJ   rh  r~  r  rk  r   r   rf  r   r  rj  r   rg  rX   r   r  r  r	  r  r   r  r]   r]   r^   rV    s>   



zComputeTensorMethod.__call__NrW  rs  r]   r]   r]   r^   r    rt  r  c                   @  ru  )	ComputeRedispatchFunctionr   r3   rl   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-  rs   r  rb  c                 S  r   r]   r  r  r]   r]   r^   r   4  r   z6ComputeRedispatchFunction.__call__.<locals>.<listcomp>ra  ry  T)r_  rz  z::redispatch(r  )r   r0  r}  r~  r   rf  r   r   r   r  r  r   rg  r  r]   r]   r^   rV  (  s$   

z"ComputeRedispatchFunction.__call__NrW  r  r]   r]   r]   r^   r  &  r  r  c                 C  s   d| j jj d| j jj dS )Nz{"aten::z", "z"},)r   r   ri  r8  r]   r]   r^   compute_aten_opE  s   r  gr4   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 rm   )r  r  r]   r]   r^   rr   Q  s    z4compute_meta_function_declaration.<locals>.<genexpr>zat::impl::MetaBasevoidc                 S  s   g | ]	}|D ]}|qqS r]   r]   )rn   replace_listelemr]   r]   r^   r   ]  s
    z5compute_meta_function_declaration.<locals>.<listcomp>c                 S  s   g | ]}|j  qS r]   )r   upperrn   r  r]   r]   r^   r   `      
c                 s  s    | ]	}d | dV  qdS )zbool z = falseNr]   )rn   paramr]   r]   r^   rr   c  s    
z
template <>c                 S  s   g | ]
}t j||jd qS ))binds)r   argument_typer   r  r]   r]   r^   r   i      rQ  c                 s  s(    | ]}|j d d d|j V  qdS )T	strip_ref N)cpp_typer   r  r]   r]   r^   rr   n  s
    
truerR   zprecompute_out<Tr  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;
            };rs   zstruct TORCH_API structured_z
 : public re  r=  z meta(z);
};
)r   r   outmetar   meta_argumentsr  structured_inheritsprecomputedr   valuesr   	enumerater  r   r   )r  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ir  return_ty_templates	return_tyelem_cpp_tyr4  
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_declarationK  s   








&r  rK  rC   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   r   r   endswith
startswithr   r>  rR  )r   rK  r   r]   r]   r^   needs_backend_select  s   
r  c                   @  rY  )ComputeBackendSelectz/Literal[Target.DEFINITION, Target.REGISTRATION]r\  rC   rK  r   r3   rl   r   c                 C  sH  t || jsd S t|j}t|jdd}dd | D }t|j}|}|	 }d}| j
tju r|rV|jj sBtd|j ddd	 |D }	d
| d|	 d}
n|jj rdtd|j 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r1  c                 S  s(   g | ]}t |jtr|jj r|qS r]   )r   r  r%   r   r9  r  r]   r]   r^   r     s    

z1ComputeBackendSelect.__call__.<locals>.<listcomp>z.c10::computeDispatchKey(dtype, layout, device)z'Expected function to have tensor args: r  c                 s  r  rm   rc  r  r]   r]   r^   rr     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+Expected function to not have tensor args: z)DispatchKeySet _dk = c10::DispatchKeySet(r&  z	// aten::z
C10_ALWAYS_INLINE
z {
  z
  return at::_ops::z::redispatch(
      _dk, c                 s  r  rm   r  r  r]   r]   r^   rr     r  r  zm.impl("aten::z", TORCH_FN(z));)r  rK  nativer   r   r   r   r   rf  r   r\  rJ   rk  has_tensor_argr   r  rj  rg  REGISTRATIONr   )rX   r   r   
native_sigr@  dispatcher_sigr	  dispatcher_exprsrh   rA  
compute_dkr]   r]   r^   rV    sV   




	zComputeBackendSelect.__call__NrW  rs  r]   r]   r]   r^   r    s
   
 r  datac                 C  s2   dd t _ddd}t t| tj| d	t d
dS )Nc                 S  s   dS )NTr]   )rX   r  r]   r]   r^   r      s    zformat_yaml.<locals>.<lambda>dumperr	   r  rl   c                 S  s   |  | S rm   )represent_dictrv   )r  r  r]   r]   r^   dict_representer#  s   z%format_yaml.<locals>.dict_representerFg    eA)default_flow_styleDumperwidth)r  r	   r  r	   rl   r	   )rK   ignore_aliases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 )Nr  TfalseF)r   
ValueErrorfloatr   r]   r]   r^   pythonify_default1  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__)mutabler  r1  )r   r7   dynamic_typer  r   r   argumenttype_typer  )r  r]   r]   r^   r  I  s   

r  r  set[Variant]c                 C  s2   dg}t j| v r|d t j| v r|d |S )Nr<   r  	namespace)r=   r.  r   r  )r  	method_ofr]   r]   r^   compute_method_of_yamlV  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 )NFr  )r  r   r   
field_name)r   return_namesr  zipr   returnsr  r   return_typer  r   r  r   r  r   )r   name_to_field_namenamesr  r  rr   retr]   r]   r^   compute_returns_yamla  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  r9   r   r%   compute_argument_yaml)r  r  r  r  r  r   r]   r]   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)r  r1  )r  r  r  r   r   r  r  Tr  r  allocater  r   size)r  r   r  r   r  r   r   r  r  r  r  default_expris_list_liker  r  )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]   rc  r  r]   r]   r^   	<setcomp>  r   z+compute_declaration_yaml.<locals>.<setcomp>c                 S  r  r]   rc  r  r]   r]   r^   r    r   Fr-  c              	        g | ]}t |d  dqS )Fr  )r   )rn   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faithfulr1  has_tensor_options)r   r  r   r   )rn   r  r  r]   r]   r^   r     s    r  z (r  r:  c                 s  s    | ]	}t |jtV  qd S rm   )r   r  r;   r  r]   r]   r^   rr          z+compute_declaration_yaml.<locals>.<genexpr>r   operator_nameri  r   category_overriders   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  r   r   flat_kwarg_onlyr  r   r0  r4  r   r  r   returns_typer  r  r  anyr=   r.  r  r   r   r   ri  r   r  r  r  r   is_abstractr   r   )r   r  r  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 rm   )r   r   r   kindr8   
functionalr   r8  r]   r]   r^   "has_autogenerated_composite_kernelB  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 rm   )
no_defaultr  r  r]   r]   r^   rr   O  r  z4compute_registration_declarations.<locals>.<genexpr>r  c                      h | ]\}}|  r|qS r]   r   rn   r   r   r8  r]   r^   r  T      z4compute_registration_declarations.<locals>.<setcomp>c                   r*  r]   r+  r,  r8  r]   r^   r  V  r-  )schemadispatchr  r  r%  z); // r   )
dispatcherr   r   r  r  r  r   r  r   rv   r+   r   r   has_composite_kernelr'  jsondumps)r   re   r   r  r  r  comment_datar]   r8  r^   !compute_registration_declarationsH  s$   
	"r5  "provided_op_registration_allowlistlist[str] | Noneop_selection_yaml_pathc                 C  sh   | d ur|d urt 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   r   rC   &from_legacy_op_registration_allow_listfrom_yaml_pathget_nop_selector)r6  r8  op_registration_allowlistrK  r]   r]   r^   get_custom_build_selectori  s(   

r=  3Sequence[NativeFunction | NativeFunctionsViewGroup]c                 C  s   d
dd}t t}| D ]H}|j }|j}|tjkr:|j }||| v r3td| d|| 	  ||| |< q||| v rMt| d	|| 	  ||| |< qt
t|| S )Nd1dict[ViewSchemaKind | SchemaKind, NativeFunction]rl   /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>   aliasingr   aliasing_inplacer8   r&  r   r5   extendr  )r?  r   rB  rD  rC  r]   r]   r^   maybe_create_view_group  s   
	zEget_grouped_by_view_native_functions.<locals>.maybe_create_view_groupzDuplicate schema kind z in z already in )r?  r@  rl   rA  )r   r   r   view_signatureview_schema_kindr>   non_aliasingr%  r   r?  r   rD   r  )rd   rH  grouped_by_viewsr   r.  	view_kindr%  r]   r]   r^   $get_grouped_by_view_native_functions  s&   



rN  /Sequence[NativeFunction | NativeFunctionsGroup]c                 C  s(   ddd}t | }tt|t| S )Nr?   dict[SchemaKind, NativeFunction]rl   rO  c                 S  sP   t | }|d u r%tdd |  D rtdt|   t|  S |gS )Nc                 s  s    | ]}d |j v V  qdS )	generatedN)r   rn   r   r]   r]   r^   rr     rO  zJget_grouped_native_functions.<locals>.flatten_pre_group.<locals>.<genexpr>zVGenerated NativeFunctions should have been grouped into NativeFunctionsGroup objects: )r4   	from_dictr  r  r   r   )r?  r  r]   r]   r^   flatten_pre_group  s   

z7get_grouped_native_functions.<locals>.flatten_pre_group)r?  rP  rl   rO  )rB   r   rD   r  )rd   rT  pre_grouped_native_functionsr]   r]   r^   get_grouped_native_functions  s
   
rV  )native_function_decl_gengrouped_native_functionsrW  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r=t	d| d| ||
 
||| qq|S )NrR   z6Codegen only supports one namespace per operator, got z from )r   r   r   rv   r'  r(  r   r)   r   r   rG  )rX  re   rW  ns_grouped_kernelsr   native_function_namespacesdispatch_keysrh   backend_idxr)  r  r]   r]   r^   get_ns_grouped_kernels  s0   

r_  r[  c              
   C  sh   g }d}|   D ])\}}t|ddd}tt|}|d|j d|| d|j d	| q|S )Nr   rs      namespace_strentity_name	max_level	
        )
rv   rI   r   r   fromkeysrG  prologuer  epiloguesplit)r[  declarationsnewliner  kernels	ns_helperordered_kernelsr]   r]   r^   8get_native_function_declarations_from_ns_grouped_kernels  s(   ro  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.
    rX  re   rW  )r[  )r_  ro  )rX  re   rW  r[  r]   r]   r^    get_native_function_declarations  s   rq  %NativeFunction | NativeFunctionsGroupr^  c                 C  sb   | | }|r*d|jvr*t| tr| jjn| jjj}td| 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   r3   r   r   r&  r   rh   r)   )r   r^  r)  	func_namer]   r]   r^   get_kernel_namespace(  s   
rt  rw   rocmr1  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   ru  r1  class_method_namerv  r   r^  r"  rs   r   )rb  z
TORCH_LIBRARY_IMPL(r  z, m) {
    z
}zRegisterDispatchDefinitions.inic                     s,   j j  rdnd  dS )Nrs   )ns_prologuens_epiloguedispatch_anonymous_definitions"static_init_dispatch_registrationsdeferred_dispatch_registrationsdispatch_namespacedispatch_namespaced_definitions)rg  rh  r   r]   anonymous_definitionsrh   kernel_namespacens_definitionsrm  registration_bodyrv  r]   r^   r     s   z1get_native_function_definitions.<locals>.<lambda>)r   r   r   destRegisterDispatchKeyrJ   NAMESPACED_DEFINITIONANONYMOUS_DEFINITIONr  rt  r   rG  r   r3   r  r&  r   rI   r  substitute_with_templateri  )rw   rX  rh   r^  rK  ru  r1  rv  rw  definitionsregistrationsrk  ns_genanonymous_genreg_genr   r  r]   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)ru  ry  rv  r1  rz  r  r   rs      ra  re  )r   r   r  r  rJ   NAMESPACED_DECLARATIONrt  r   r   rG  rv   r   rI   r   rf  rg  r  rh  ri  )rX  rh   r^  rK  ru  r1  rj  r[  rk  r   r   r  rl  rm  rn  r]   r]   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 )
Nrs   atenr   TORCH_LIBRARY_FRAGMENTTORCH_LIBRARYr   r%  z	, m) {
  z
};)	r   r   r  r   rv   rH   rJ  r,   r  )rd   r  ns_native_functionsnative_functionschema_registrationsaten_schema_registrationscustom_namespacer  r   schema_registrations_bodytabtorch_library_macror]   r]   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)NativeMetaFunctions_includes NativeMetaFunctions_declarationsr   rH   r  r]   )r  r]   r^   r     s
   z(gen_aggregated_headers.<locals>.<lambda>c                 S  s   g | ]
}t j|jv r|qS r]   r=   r.  r  rn   fnr]   r]   r^   r     s    z*gen_aggregated_headers.<locals>.<listcomp>c                      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r]  MethodOperators_includesMethodOperators_declarationsr   rH   rZ  rJ   rh  r]   )r  r  r]   r^   r     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_functionsr  r]   r^   r   $  s   Functions.hc                     s   t dgttt  dS )Nz#include <ATen/Operators.h>)r  Functions_includesFunctions_declarations)r  r   rH   rv  r]   rd   r  r]   r^   r   3  s   )rX  re   zNativeFunctions.hc                     s   dg dS )Nz%#include <ATen/NativeMetaFunctions.h>)NativeFunctions_includesNativeFunctions_declarationsr]   r]   )rj  r]   r^   r   F  s   r  Functions_inl.h>DispatchKeyFunctions.hc                        t  dS N)rh   inline_headersr   r]   rh   inl_headersr]   r^   r   T     Functions_inl.hDispatchKeyFunctions_inl.hc                
     s$   g   t  dddS )NT)rX  rh   r^  rK  ru  r1  )!DispatchKeyFunctions_inl_includesr   dispatch_namespaced_declarations)r   r  r]   )re   rh   rX  ru  rK  r]   r^   r   \  s   )writerq  rx   write_with_template)rd   rX  r  r  rK  re   r  ri   r  r]  ru  rw   r]   )re   rj  rh   rX  r  r  rd   r  ru  rK  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 )Nrj  r  r  r]   )	functionsr  r]   r^   r     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  r]   r^   r     s    z<gen_per_operator_headers.<locals>.<lambda>.<locals>.<lambda>r   _ops.h>)static_dispatch_ops_headersoperator_includesfunction_definitions)r   rH   rv  r]   )r  r   r  r]   r^   r     s   

c                 S  s    g | ]}t |tr|jr|qS r]   )r   r4   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^   r     s   rp  z	_native.hzNativeFunction.hc                     s    rd d dS g  dS )Nr   z_meta.h>)extra_includesnative_function_declarationsr]   r]   )rj  is_structuredr   r]   r^   r     s   ))	Functionsrs   )	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]   rn   r   )suffixr]   r^   r     r  >gen_per_operator_headers.<locals>.<lambda>.<locals>.<listcomp>_declarations)rS  r?  r]   )categoryfunctions_by_root_namer  r]   r^   r     s
   

TFrx  r   z_dispatch.hzDispatchKeyFunction.hc                     s
    dS )N)r  r  r]   r]   )rj  r  r]   r^   r     s   r  r  r  r  c                     r  r  r  r]   r  r]   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   r]   r  )r  r]   r^   r     s    r  )r  r  r  )rS  r]   )dispatch_namesr  r]   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 rm   r  r  r]   r]   r^   rr   (  r  zGgen_per_operator_headers.<locals>.<lambda>.<locals>.<genexpr>.<genexpr>r   r  N)r  )rn   r   r  r]   r]   r^   rr   %  s    

z=gen_per_operator_headers.<locals>.<lambda>.<locals>.<genexpr>r  )rS  rv   r]   )r  r]   r^   r   $  s
   )r   r   r   r   rv   r  rt   r   rq  r  #compute_native_function_declarationr  r   rD   r  rJ   r  rx   )rd   rX  r  rK  re   r  ri   r  r  r]  ru  r  grouped_functions_by_root_namegroupgrouped_functionsrw   r]   )r  rj  rh   r  r  r  r  r  r  r   r  r  r  r^   gen_per_operator_headersm  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fdd}|d| dfdd}|d| d S )N)rd   rX  r  rK  re   r  ri   r  r]  r  ru  )rd   rX  r  r  rK  re   r  ri   r]  r  ru  zTensorBody.hc                     s2   t tttjd t tttjd dS )N)r\  r]  )tensor_method_declarationstensor_method_definitions)r   rH   r  rJ   rh  rk  r]   r  r]   r^   r   `  s&   	zgen_headers.<locals>.<lambda>zRedispatchFunctions.hc                     s   dt tt  iS )Nfunction_redispatch_definitions)r   rH   r  r]   rd   r]   r^   r   x  s   
zRegistrationDeclarations.hc                     s   d fddD iS )Nregistration_declarationsc                   s   g | ]}t | qS r]   )r5  rR  rd  r]   r^   r         z1gen_headers.<locals>.<lambda>.<locals>.<listcomp>r]   r]   )re   rd   r]   r^   r     s   zVmapGeneratedPlumbing.hc                     s   t  S rm   r#   r]   r  r]   r^   r     s    rl   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  rm   rc  )rn   r   r]   r]   r^   rr     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         zBgen_headers.<locals>.gen_aten_interned_strings.<locals>.<listcomp>c                 S  r  )z_(attr, r:  r]   r  r]   r]   r^   r     r  )aten_symbolsattr_symbols)
r   r   r   r   r   r   updater  r  rS  )attrsr  r   r  r]   r^   gen_aten_interned_strings  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  rS  r]   )r|   r]   r^   gen_tags_enum  s   z"gen_headers.<locals>.gen_tags_enumz
enum_tag.h)rl   r  )r  r  r  )rd   r|   rX  r  r  rK  re   r  r  ri   r  r]  r  ru  r  r  r  r]   )re   rd   r  r|   r^   gen_headers/  s\   
	
$r  view_groups"Sequence[NativeFunctionsViewGroup]aoti_fm
cpu_vec_fmforce_schema_registrationupdate_aoti_c_shimaoti_backendsset[DispatchKey | None]extend_aoti_c_shimc           !        s  d}rd}|D ]t ||
|rdTfdd}ndT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	}dU	fdd}jd dddd |t
jkrdnd|dhd D ]fjjrtsqjjjjt
ju rֈ|
urtd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' dVfd(d)}|
d*| }|r"t }t|d+\ |
d, fd-d dWd1d2}|
jd3|fd4dd5t id6h d7d8 |
d9t! |d:t! |d;fd<d dXd>d?
dY
fd@dA}tt } dBdC t"dDd D dEdC t"dFd D | #fdGdHD  |
jdI| ||dh dJdK |
dLfdMd |
dNfdOd |
dP
fdQd |
dRfdSd d S )ZNz#include <c10/cuda/CUDAGuard.h>
#include <ATen/cuda/ATenCUDAGeneral.h>
#include <ATen/cuda/CUDADevice.h>
#include <ATen/cuda/CUDAContext.h>z#include <c10/hip/HIPGuard.h>
#include <ATen/hip/ATenHIPGeneral.h>
#include <ATen/hip/HIPDevice.h>
#include <ATen/hip/HIPContext.h>rl   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 rm   r+  r  r  r]   r^   rr     s    

z=gen_source_files.<locals>.operator_headers.<locals>.<genexpr>r   
_native.h>r  r   r   )r   r   r4   r  r  r   r+   Metar   r   r   rS  r   )headersr  is_registered)r   rh   r  r  rX  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  )rh   r  r]   r^   r  	  s   

rs   )extra_cuda_headersexternal_backend_headersdispatch_headersops_headersdispatch_helpersgnfrr  rZ  c                   s    dt | g dd	iS )Ndispatch_definitionsT)	rw   rX  rh   r^  rK  ru  r1  rv  rw  )r  )r$  )r   rh   rw   rw  ru  rK  rv  r]   r^   "register_dispatch_key_env_callable6	  s   z<gen_source_files.<locals>.register_dispatch_key_env_callableRegisterz.cppzRegisterDispatchKey.cppc                 S     | j S rm   r   )xr]   r]   r^   r   K	  s    z"gen_source_files.<locals>.<lambda>r`  rR   r%  )key_fnenv_callable
num_shardsbase_envsharded_keysz,Expected fm to be cpu_fm for DispatchKey.CPU	UfuncCPU_zUfuncCPU.cppc                     s"   t t  tdS )N)meta_declarationnative_declarationnative_definitions)r  r  r  compute_ufunc_cpur]   )re   rh   r  r]   r^   r   \	  s   UfuncCPUKernel_zUfuncCPUKernel.cppc                     s   t  dS )N)r   r3  )r  compute_ufunc_cpu_kernelr]   )r  r   r]   r^   r   g	  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_headersr1  r2  r3  )r  r  r  compute_ufunc_cudar]   )re   r8  rh   r  r   r]   r^   r   s	  s   zunrecognized z
 for ufunc)r  r  rd   re   r  r  r  r  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  rK  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   rH   r  rJ   rk  r  )relevant_fns)rd   rK  r]   r^   gen_backend_select	  s"   
z,gen_source_files.<locals>.gen_backend_selectzRegisterBackendSelect.cpp)rd   r  zRegisterSchema.cppc                     s   rg n rg dS dS )N)r  r  r]   r]   )r  r  rv  r]   r^   r   	  s   r  @NativeFunction | NativeFunctionsGroup | NativeFunctionsViewGroupr   c                 S  r(  rm   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   rZ  rJ   rk  r  r  r]   r^   r   	  s   r     >   r  r  r  )r+  r,  r.  r-  r/  zFunctions.cppzTensorMethods.cppzATenOpList.cppc                     r  )Naten_ops)r   rH   r  r]   r  r]   r^   r   	  s   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   r  r  )
r   r5   rB  r   rC  r4   r&  r  r   r  )r  r  r]   r]   r^   gen_op_headers	  s<   




z(gen_source_files.<locals>.gen_op_headersc                   s$   | t | t|  tj dS )N)r"  func_definitionsfunc_registrations)r   r   r+   r   r  )re   rD  rK  r]   r^   functionalization_env_callable
  s   z8gen_source_files.<locals>.functionalization_env_callablec                 S     i | ]}|j j|qS r]   r   r   rR  r]   r]   r^   
<dictcomp>%
  r  z$gen_source_files.<locals>.<dictcomp>c                 S     t |  S rm   r   r  rG  r]   r]   r^   r   '
      c                 S  rI  r]   rJ  rR  r]   r]   r^   rK  )
  r  c                 S  rL  rm   rM  rG  r]   r]   r^   r   *
  rN  c                 3  s,    | ]}|j j vr|j jvr|V  qd S rm   rJ  rR  )structured_mapview_mapr]   r^   rr   ,
  s    z#gen_source_files.<locals>.<genexpr>zRegisterFunctionalization.cpp>   r"  rE  rF  func_add_back_views_definitions!func_add_back_views_registrations)r+  r,  r-  r/  zFunctionalInverses.hc                        dt t fddiS )Nview_inverse_declarationsc                   
   t  | S rm   )r   rG  r:  r]   r^   r   F
  s    4gen_source_files.<locals>.<lambda>.<locals>.<lambda>)r   rH   r]   rK  r  r]   r^   r   C
  s   
zViewMetaClasses.hc                     rS  )Nview_meta_declarationsc                   rU  rm   )r    rG  r:  r]   r^   r   T
     
 rV  r   rD   r]   rW  r]   r^   r   Q
  s   
zViewMetaClasses.cppc                     s&   t tfddt t dS )Nc                   rU  rm   )r!   rG  r:  r]   r^   r   `
  rY  rV  )view_meta_implementations
op_headersrZ  r]   )rD  rK  r  r]   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/r  Nr)  rR  r]   r]   r^   rr   |
  s    

@gen_source_files.<locals>.<lambda>.<locals>.<listcomp>.<genexpr>N)r  rC  rB  rn   r  r]   r]   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 )NrQ  r   r]  r  )r   r   rR  r]   r]   r^   rr   
  s    
r^  )r  r   r  r&  r_  r]   r]   r^   r   
  s    
)r"  #CompositeViewCopyKernel_Definitions(GeneratedCompositeFunctional_Definitions!GeneratedCompositeOut_Definitions)r   rH   r"   r+   r   r@   rA   r]   )re   r  r  r]   r^   r   z
  s<   
)rl   r  )r$  rr  rl   rZ  )rl   rZ  )r  r@  rl   r   )r  r@  rl   r  )r  r@  rl   rZ  )$rx   r   r   r   r3   r  r&  r   r   r   r+   r   r.   r  gen_registration_headersgen_registration_helperswrite_sharded_with_templateCPUr  ufunc_inner_loopr0   r   r   r   r  CUDAr   r  rC   r;  r  write_shardedr  r   rD   rG  )!rd   rX  r  r  rK  r  re   r  r  r  r  ri   r]  r  ru  r  r  rv  r  r  r  r  r  ns_grouped_native_functionsgrouped_native_functionr  register_dispatch_key_base_envr&  r?  r  rA  rH  
all_groupsr]   )r  r   re   r8  rh   r  rw   r  r  rw  rD  rX  r   rd   ru  r  rK  rv  r  rO  r  r  rP  r^   gen_source_files  s2  *










'
rn  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$  rR  r]   r]   r^   r   
  s    z;gen_declarations_yaml.<locals>.<lambda>.<locals>.<listcomp>)r  r]   r  r]   r^   r   
  r   z'gen_declarations_yaml.<locals>.<lambda>)r  )r  rd   r]   r  r^   gen_declarations_yaml
  s   
ro  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resolver]   r]   r]   r^   get_torchgen_root
  s   rs  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d h}t }tjtjtjh jsjr|  |tj n|   fdCdD|D |d d < js jr-|tj  |tj  n|tj  tj |v r@||!tj = j"sW|tj tj|v rW||!tj= j#rdfdEdD|D }t$|||}t%| }	|j&|j'}
t(|
}dFdD |D }t)|
}dGdD |D }j* dH}t+|j,dIdIdJ j* dK}t+|j,dIdIdJ j- }t+|j,dIdIdJ t.|dL}t.dM}t.dM}t.dM}t.|dL}t.|dL}dN|i}jrt.dM|dO< g }j/rfdPdDj/D }j/D ]}t0|}||vr
|| qdQj1v r\t2dpi dR|
dS|dT|dU|dV|dW|dXdY|dZ|d[|d\|d]|d^|d_|d`j3daj4dbj5dcj6ddjde|dfj7 dgj1v rwt8|
|	||||||||||j3j5dh dij1v rt9|
|dj j:rt+j:; }|j<}|j=}|dkf|dlf|dmf|dnfgdodD |> D  D ]\}} | | }!|j?| |  }"|@|!t|" qd S d S )qNz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)ru  z	--dry-run
store_truez5run without writing any files (still updates outputs))actionru  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 ...)nargsru  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   ry  choicesr  ru  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                   r  r]   r]   rn   r   )MPS_KEYSr]   r^   r   g  r  zmain.<locals>.<listcomp>c                   s&   g | ]}t |st| jv r|qS r]   )r/   r   backend_whitelistr}  optionsr]   r^   r   y  s    c                 S     g | ]	}t |tr|qS r]   )r   r4   r_  r]   r]   r^   r     r;  c                 S  r  r]   )r   r5   r_  r]   r]   r^   r     s    z/coreT)parentsexist_okz/ops)r  install_dirr  cudaxpuc                   s   g | ]	} t | qS r]   )r+   parse)rn   keyrd  r]   r^   r     s    rz  rd   rX  r  r  rK  r  re   r  r  r  r  ri   r]  r  ru  r  r  rv  r  r  r  r  )rd   r|   rX  r  r  rK  re   r  r  ri   r  r]  r  ru  r  r{  )rd   r  rs   cpu_vec_core_ops_c                 S  s   g | ]\}}|| d fqS )r   r]   )rn   rp   	device_fmr]   r]   r^   r     r-  r]   )AargparseArgumentParseradd_argumentr   
parse_argsr=  op_registration_whitelistr8  osr   r  source_pathtorchgen.modelr]  r+   rf  rh  r   r   r   r   r  MTIAr   MPS	SparseMPSSparseCsrMPSmpsr  r  r   r  XPUr   mtiar  r   rg   rd   re   rV  rN  r  r   mkdiraoti_install_dirrG   static_dispatch_backendr  generatern  ru  r  r  rv  r  r  ro  output_dependenciesrr  r   stemrv   rq  write_outputs)#parserrK  native_yaml_pathr   r]  r  r  r~   parsed_yamlr|   rd   rX  r  !native_functions_with_view_groupsr  core_install_dirops_install_dirr  r  r  r  cuda_fmr  r  ri   r  r  dp_keydepfile_pathdepfile_namedepfile_stemrw   r  varnamer   r]   )r~  re   r  r^   main
  s  			










	
r  __main__)rh   r+   ri   rj   rk   rF   rl   rF   )Nry   F)rz   r{   r|   r}   r~   r   r   r   r   r   rl   rc   )ry   )rz   r{   r   r   rl   r}   )r   r   rl   r}   rm   )r   r   r   r   r~   r   r   r   r   r   rl   rc   )r   r   rl   r   )r   r   rl   r   )r   r   rl   r   )r   r3   r   r&   rl   r   )r   r3   r   r   rl   r   )r   r   rl   r  )r	  r
  r  r   rl   r   )r	  r
  r   r3   r   r&   rl   r   )r	  r
  r   r3   re   r   rl   r   rr  )r  r4   rl   r   )r   r3   rK  rC   rl   r   )r  r{   rl   r   )r   r   rl   r{   )r  r<   rl   r   )r  r  rl   r  )r   r3   rl   r  )r  r   r  r   r  r}   r  r}   r  r  rl   r{   )r  r%   r  r   r  r}   r  r}   r  r  rl   r{   )r   r3   rl   r{   )r   r3   rl   r   )r   r3   re   r(  rl   r   )r6  r7  r8  r   rl   rC   )rd   r   rl   r>  )rd   r   rl   rO  )rX  rO  re   r(  rW  rY  rl   rZ  )r[  rZ  rl   r  )rX  rO  re   r(  rW  rY  rl   r  )r   rr  r^  r&   rl   r   )rw   rF   rX  rO  rh   r+   r^  r&   rK  rC   ru  r   r1  r   rv  r   rw  r   rl   r  )rX  rO  rh   r+   r^  r&   rK  rC   ru  r   r1  r   rl   r  )rd   r   r  rC   rl   r  )rd   r   rX  rO  r  r  r  r   rK  rC   re   r(  r  rF   ri   rj   r  r  r]  r  ru  r   rl   r   )rd   r   rX  rO  r  r   rK  rC   re   r(  r  rF   ri   rj   r  rF   r  r  r]  r  ru  r   rl   r   ) rd   r   r|   r}   rX  rO  r  r  r  r   rK  rC   re   r(  r  rF   r  rF   ri   rj   r  rF   r]  r  r  r  ru  r   r  r   rl   r   ),rd   r   rX  rO  r  r  r  r  rK  rC   r  r   re   r(  r  rF   r  rF   r  rF   r  rF   ri   rj   r]  r  r  r  ru  r   r  r   r  r   rv  r   r  r   r  r  r  r   rl   r   )r  rF   rd   r   rl   r   )rl   r   )rl   r   )
__future__r   r  	functoolsr2  r   r  collectionsr   r   r   dataclassesr   r   pathlibr   typingr	   r
   r   r   typing_extensionsr   r   torchgen.api.dispatcherapir0  torchgen.api.metar  torchgen.api.nativer  torchgen.api.structuredr   torchgen.destr  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   #torchgen.gen_functionalization_typer   r   r   r    r!   r"   torchgen.gen_vmap_plumbingr$   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=   r>   #torchgen.native_function_generationr?   r@   rA   rB   !torchgen.selective_build.selectorrC   torchgen.utilsrD   rE   rF   rG   rH   rI   rJ   torchgen.yaml_utilsrK   rL   collections.abcrM   rN   rO   rP   rc   rf   rX  rg   rx   r   r   cacher   r   r   r   r   r   r  r  r!  r,  r6  rH  rJ  rZ  rv  r  r  r  r  r  r  r  r  r  r  r  r   r  r$  r'  r5  r=  rN  rV  r  r_  ro  rq  rt  r  r  r  r  r  r  rn  ro  rs  r  r_   r]   r]   r]   r^   <module>   s    $	 p$	!	
4
 
@






#

L\//|JC $Y 3  d0$y C    v	  
?
