U
    •Ê¹jà¦ ã                   @   sÜ  d dl Z d dlZd dlZd dlZd dlZd dlmZmZmZ d dl	m
Z
 d dlmZmZmZmZmZmZmZmZmZ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(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. d dl/m0Z0m1Z1m2Z2m3Z3 d d	l4m5Z5m6Z6m7Z7m8Z8 d d
l9m:Z: d dl;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZS d dlTmUZUmVZVmWZWmXZX d dlYmZZZ d dl[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZc d dldmeZemfZf edƒZgG dd„ defƒZhi aii ajedddgƒZkd¤eleem eeeA  emenekdœdd„Zod¥elemeem dœdd„Zpejqdd�emeem dœd d!„ƒZrd¦ddd"œememeeeA  eneel ekd#œd$d%„ZseeH dd&œd'd(„Ztememd)œd*d+„Zuee= eeA d,œd-d.„ZveHe=eeA d/œd0d1„ZweHee= eem d/œd2d3„Zxee= eem d,œd4d5„Zyee)e+f e)emd6œd7d8„Zzee)e+f eHe=emd9œd:d;„Z{ee)e+f eHee= emd<œd=d>„Z|ee)e+f eHee= emd<œd?d@„Z}e
dAdB�G dCdD„ dDƒƒZ~e
dAdB�G dEdF„ dFƒƒZe
dAdB�G dGdH„ dHƒƒZ€e
dAdB�G dIdJ„ dJƒƒZ�e
dAdB�G dKdL„ dLƒƒZ‚e2eHemdMœdNdO„ƒZƒeIeem dPœdQdR„Z„eHeZendSœdTdU„Z…e
dAdB�G dVdW„ dWƒƒZ†elemdXœdYdZ„Z‡emeld)œd[d\„ZˆeQemd]œd^d_„Z‰eeR eem d`œdadb„ZŠeHeeeememf  eememf f dMœdcdd„Z‹e(eneem eem eememf eldeœdfdg„ZŒe<eneem eem eememf eldhœdidj„Z�e2eHeldMœdkdl„ƒZŽeHendMœdmdn„Z�e3eHeeAe=f emdoœdpdq„ƒZ�eeem  eem eZdrœdsdt„Z‘eeH eeeHeJf  duœdvdw„Z’eeH eeeHeIf  duœdxdy„Z“e"j”dzœeeeHeIf  eeAe=f eeeIeHf e=geem f eemeem f d{œd|d}„Z•eemeem f eem d~œdd€„Z–e"j”dzœeeeHeIf  eeAe=f eeeIeHf e=geem f eem d{œd�d‚„Z—eeHeIf e=emdƒœd„d…„Z˜e_eeeHeIf  eAe=eZeneneneneem d†œ
d‡dˆ„Z™eeeHeIf  eAe=eZeneneem d‰œdŠd‹„ZšeeH eZeeem emf dŒœd�dŽ„Z›eeH eeeHeIf  eeI ee= eZeeAe=f e_e_eeA eeA endd�œd�d‘„ZœeeH eeeHeIf  ee= eZeeAe=f e_e_e_eeA eeA endd’œd“d”„Z�eeH eem eeeHeIf  eeI ee= eZeeAe=f e_e_e_e_eeA eeA enendd•œd–d—„ZžeeH eeeHeIf  eeI eeJ eZee= eeAe=f e_e_e_e_eeA eeA enenenendd˜œd™dš„ZŸe_eeH dd›œdœd�„Z ej¡džœdŸd „Z¢ddžœd¡d¢„Z£e¤d£k�rØe£ƒ  dS )§é    N)ÚdefaultdictÚ
namedtupleÚOrderedDict)Ú	dataclass)ÚAnyÚCallableÚDictÚListÚLiteralÚOptionalÚSequenceÚSetÚTupleÚTypeVarÚUnion)Ú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_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_mappingZ
start_markÚline)ÚselfÚnoderM   Úmapping©Ú	__class__© úK/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torchgen/gen.pyrQ   †   s    zLineLoader.construct_mapping)F)Ú__name__Ú
__module__Ú__qualname__rQ   Ú__classcell__rX   rX   rV   rY   rL   …   s   rL   Ú
ParsedYamlÚnative_functionsÚbackend_indicesú<stdin>F)ÚesÚ
valid_tagsÚignore_keysÚpathÚskip_native_fns_genÚreturnc              
      sô   t | tƒst‚g }ttƒ}| D ]|}t | d¡tƒs:t|ƒ‚t||d ƒ‰| d¡‰ t‡ ‡fdd„ƒ�0 t	 
|ˆ||¡\}}	| |¡ t ||	¡ W 5 Q R X qt|ƒ tdd„ ƒ}
|s¾t||ƒ | ¡ D ]"\}}t|ddt|ƒ|d�|
|< qÆt||
ƒS )	NrO   Úfuncc                      s   dˆ› dˆ › �S ©Nzin z:
  rX   rX   ©ÚfuncsÚlocrX   rY   Ú<lambda>¢   ó    z*parse_native_yaml_struct.<locals>.<lambda>c                   S   s   t tjdddi d�S )NTF©Údispatch_keyZuse_out_as_primaryZexternalÚdevice_guardÚindex)r%   r)   Z	UndefinedrX   rX   rX   rY   rm   ©   s   ùTFro   )Ú
isinstanceÚlistÚAssertionErrorr   ÚdictÚgetÚintr/   rC   r0   Z	from_yamlÚappendr%   Z
grow_indexÚerror_check_native_functionsr<   Úitemsr,   r^   )rb   rc   rd   re   rf   ÚrsÚbsÚerh   ÚmÚindicesÚkÚvrX   rj   rY   Úparse_native_yaml_struct”   s4    

ÿ
úrƒ   )rb   re   rg   c              
      s¤   t | tƒst‚tƒ }| D ]†}t | d¡tƒs4t|ƒ‚t||d ƒ‰ | d¡‰t‡ ‡fdd„ƒ�: | ¡ }| 	d¡}| 	dd¡}|dksŠt‚| 
|¡ W 5 Q R X q|S )NrO   Útagc                      s   dˆ › dˆ› �S ri   rX   rX   ©rl   ÚtagsrX   rY   rm   É   rn   z(parse_tags_yaml_struct.<locals>.<lambda>ÚdescÚ )rs   rt   ru   Úsetrw   rx   r/   rC   ÚcopyÚpopÚadd)rb   re   r|   r~   Ze_iÚnamer‡   rX   r…   rY   Úparse_tags_yaml_structÂ   s    

rŽ   )Úmaxsize)re   rg   c              	   C   sB   | t kr:t| ƒ�$}tj|td�}t|| d�t | < W 5 Q R X t |  S )N©ÚLoader)re   )Ú_GLOBAL_PARSE_TAGS_YAML_CACHEÚopenÚyamlÚloadrL   rŽ   )re   Úfrb   rX   rX   rY   Úparse_tags_yamlÓ   s
    
r—   )rf   Úloaded_yaml)re   Útags_yaml_pathrd   rf   r˜   rg   c             	   C   s^   | t krVt|ƒ}|d kr<t| ƒ�}tj|td�}W 5 Q R X n|}t|||| |d�t | < t |  S )Nr�   )re   rf   )Ú_GLOBAL_PARSE_NATIVE_YAML_CACHEr—   r“   r”   r•   rL   rƒ   )re   r™   rd   rf   r˜   rc   r–   rb   rX   rX   rY   Úparse_native_yamlÞ   s    	
û
r›   )rk   rg   c                 C   s  i }t tƒ}| D ]$}|||jj< ||jjj  |¡ q| D ]Î}|jd k	rz||j }|jszt|jj› d|j› d|j› d�ƒ‚d|jkr:t	|jjƒdkr:t	|jjƒdkr:|jjj}|jjj
}|jsÐt|jj› d�ƒ‚t|jd|jƒ}t|| ƒd	ks:t|jj› d
|› d�ƒ‚q:d S )Nz0 is marked as a structured_delegate pointing to z, but zY is not marked as structured. Consider adding 'structured=True' to the delegated operatorZinplace_viewZresize_Z
resize_as_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   rt   rh   r�   ry   Ústructured_delegateÚ
structuredru   r†   ÚstrÚoverload_nameÚinplacer'   ÚbaseZdunder_methodÚlen)rk   Zfunc_mapZbase_func_mapr–   Zdelegate_funcÚ	base_namerŸ   Zout_of_place_base_namerX   rX   rY   rz   þ   s<    

ÿÿþý

ÿ  ÿÿrz   )Úsrg   c                 C   sl   |   dd¡} |   dd¡} |   dd¡} |   dd¡} |   d	d
¡} |   dd¡} |   dd¡} |   dd¡} d| › d�S )z1Convert a python string into a c++ string literalú\z\\ú"z\"úz\aúz\búz\fÚ
z\núz\vú	z\t)Úreplace©r¤   rX   rX   rY   Ú
cpp_string%  s    r¯   )Úbackendsrg   c                 C   s6   t | ƒdkrg S dd„ | D ƒtjtjtjtjg S d S )Nr   c                 S   s   g | ]
}|j ‘qS rX   )rp   )Ú.0ÚbackendrX   rX   rY   Ú
<listcomp>C  s     z(static_dispatch_keys.<locals>.<listcomp>)r¢   r)   ÚCompositeImplicitAutogradÚ%CompositeImplicitAutogradNestedTensorÚCompositeExplicitAutogradÚ&CompositeExplicitAutogradNonFunctional©r°   rX   rX   rY   Ústatic_dispatch_keys?  s    ür¹   )r–   Úbackend_indexrg   c                 C   sN   | j d k	s| | ¡r|jS | jr&tjS | jr2tjS | jr>tj	S | j
rJtjS d S ©N)rœ   Ú
has_kernelrp   Ú&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º   rX   rX   rY   Úget_static_dispatch_backendK  s    rÁ   c                 C   sZ   |d ks| j rd S g }|D ]4}t| |ƒ}|d k	r| d| j› d| ¡ › d�¡ qd |¡S )Nú#include <ATen/ops/Ú_ú_dispatch.h>rª   )Úmanual_kernel_registrationrÁ   ry   Ú	root_nameÚlowerÚjoin)r–   rº   Úoutputrr   rp   rX   rX   rY   Ústatic_dispatch_ops_header_  s    
ÿrÊ   c                 C   s   dd„ t | ƒD ƒS )Nc                 S   s   g | ]}d |› d�‘qS )ú#include <ATen/úFunctions.h>rX   )r±   rp   rX   rX   rY   r³   p  s   ÿz1static_dispatch_extra_headers.<locals>.<listcomp>)r¹   r¸   rX   rX   rY   Ústatic_dispatch_extra_headerso  s    þrÍ   )ÚsigÚcpp_sigrg   c                 C   sr   t t t t dœdd„}t|  ¡ ƒ}t| ¡ ƒ}|D ]}|jjtjkr4||ƒ} qTq4t||ƒ}d 	dd„ |D ƒ¡S )N)Úinput_bindingsrg   c                 S   sT   g }| D ]F}|j dkrDtttj|jjƒ|j |j|jd�}| 	|¡ q| 	|¡ q|S )NZmemory_format)Únctyper�   ÚdefaultÚargument)
r�   r   r   r   Ú possibly_redundant_memory_formatrÑ   ÚtyperÒ   rÓ   ry   )rÐ   Zoutput_bindingsZbindingZspl_mem_format_bindingrX   rX   rY   Úadd_spl_memory_format_binding~  s    
þù	z5translate_args.<locals>.add_spl_memory_format_bindingú, c                 s   s   | ]}|j V  qd S r»   ©Úexpr©r±   ÚarX   rX   rY   Ú	<genexpr>™  s     z!translate_args.<locals>.<genexpr>)
r	   r   rt   Ú	argumentsrÑ   r�   r   rÔ   r   rÈ   )rÎ   rÏ   rÖ   Zsrc_bindingsZgoal_bindingsÚargÚexprsrX   rX   rY   Útranslate_argsy  s    
rà   )rÎ   r–   rº   rg   c           
   	   C   sš   t j|ddd�}| jr(|j ¡ r(|j}n|j}|d k	s:t‚| ¡ }t	| |ƒ}| 
|¡}|rf|jrf|jnt}| dd¡}	d|	› d|j ¡ › d|› d|› d�	S )	NF©ÚmethodZfallback_bindingú::nativerˆ   úreturn ú::ú(ú);)r   Úfrom_native_functionÚsymintrh   Ú
has_symintÚsymint_signatureÚ	signatureru   r�   rà   Ú
get_kernelÚcpp_namespacer(   r­   rp   rÇ   )
rÎ   r–   rº   Úcpp_sigsrÏ   r�   rß   Úbackend_metadataZ	kernel_nsÚnsrX   rX   rY   Ú%generate_static_dispatch_backend_callœ  s(      ÿ

ÿÿýrò   )rÎ   r–   r`   rg   c              	   C   s(  t j|ddd�}| jr(|j ¡ r(|j}n|j}|d k	s:t‚| ¡ }t	| |ƒ}t
 dd¡}|jr‚d|› dtj ¡ › d|› d|› d�	S |jr¬d|› dtj ¡ › d|› d|› d�	S |jrÖd|› dtj ¡ › d|› d|› d�	S |j�rd|› dtj ¡ › d|› d|› d�	S d	|› d
d dd„ |D ƒ¡› d�S d S )NFrá   rã   rˆ   rä   rå   ræ   rç   z5TORCH_CHECK(false, "Static dispatch does not support z forr×   c                 S   s   g | ]}t |jƒ‘qS rX   )rž   rp   )r±   rr   rX   rX   rY   r³   Ï  s     z:generate_static_dispatch_fallback_call.<locals>.<listcomp>z ");)r   rè   ré   rh   rê   rë   rì   ru   r�   rà   r(   r­   r½   r)   r¶   rÇ   r¾   r·   r¿   r´   rÀ   rµ   rÈ   )rÎ   r–   r`   rï   rÏ   r�   rß   rñ   rX   rX   rY   Ú&generate_static_dispatch_fallback_callµ  s.      ÿ
$$$$ÿró   c                    sH  t |ƒdksˆ jrdS ‡ fdd„|D ƒ}t |ƒdkrDt| ˆ |d ƒS t |ƒdkr\t| ˆ |ƒS dd„ |  ¡ D ƒ}d |¡}ˆ jjj}g }g }|dk	rœ| d	¡ |dkr¶| d
|› d�¡ | dd |¡› d�¡ | d¡ g }	|D ]2}
|	 d|
j	› d�¡ |	 dt| ˆ |
ƒ› d�¡ qàt| ˆ |ƒ}d}d| |¡› d| |	¡› d|› d�S )a  
    For a given `NativeFunction`, find out the corresponding backend and dispatch to it. If more than one
    backends exsit, fallback to static dispatch by determining dispatch key from inputs.
    Arguments:
        sig: A CppSignature or DispatcherSignature for this native function we want to use.
        f: NativeFunction to generate static dispatch.
        backend_indices: All available backends.
    Return:
        C++ code to call backend-specific functions, e.g., "return at::cpu::add(self, other, scale);"
    r   rˆ   c                    s.   g | ]&}|  ˆ ¡s&ˆ jd k	r|jtkr|‘qS r»   )r¼   rœ   rp   r7   )r±   Úb©r–   rX   rY   r³   ä  s
   


ûz#static_dispatch.<locals>.<listcomp>rN   c                 S   s6   g | ].}t |jtƒs,t |jtƒr|jj ¡ r|j‘qS rX   )rs   rÓ   r6   r$   rÕ   Úis_tensor_liker�   rÚ   rX   rX   rY   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È   rh   Útensor_optionsry   rp   )rÎ   r–   r`   ÚkeysÚnative_tensor_argsÚtensor_argsZtensor_optsZstmtsZsubexprsZdispatch_coderr   ÚfallbackZ	connectorrX   rõ   rY   Ústatic_dispatchÒ  sN    
þ	þ

ÿ
ÿÿýûr   T)Úfrozenc                   @   s.   e Zd ZU eed< eeee dœdd„ƒZ	dS )ÚRegisterSchemaÚselector©r–   rg   c                 C   sN   | j  |¡sd S dd dd„ t|jƒD ƒ¡ d }dtt|jƒƒ› d|› d�S )NÚ{r×   c                 s   s   | ]}d |› �V  qdS )z	at::Tag::NrX   )r±   r„   rX   rX   rY   rÜ   &  s     z*RegisterSchema.__call__.<locals>.<genexpr>Ú}zm.def(z);
)r  Úis_native_function_selectedrÈ   Úsortedr†   r¯   rž   rh   )rS   r–   r†   rX   rX   rY   Ú__call__"  s    "zRegisterSchema.__call__N)
rZ   r[   r\   r@   Ú__annotations__r   r0   r   rž   r	  rX   rX   rX   rY   r    s   
r  c                   @   sB   e Zd ZU eejejf ed< ee	 ed< e
eedœdd„ƒZdS )ÚComputeOperatorsÚtargetÚstatic_dispatch_backend_indicesr  c                 C   sÐ  t  |j¡}|jj ¡ }| jtjkr‚d|› d| ¡ › d|jjj› d|jjj	› dt
t|jƒƒ› d|jddd	�› d
|jddd	�› d�S | jtjk�rÂd|› d|jjj› d|› d|jjj	› d|› dt
t|jƒƒ› d|j› d|› d|› d|› d|› d|› d�}dD ]Â}|�r(d dgdd„ | ¡ D ƒ ¡}d}nd dd„ | ¡ D ƒ¡}d}|}|› d |› �}	d!|› d"|› d#|› d$�}
|�s”t| jƒd%k�r”t||| jd&�}
|d'|j› d(|j|	|d	�› d)|
› d*�7 }qú|S t| jƒ d S )+Nz
struct TORCH_API z {
  using schema = z˜;
  using ptr_schema = schema*;
  // See Note [static constexpr char* members for windows NVCC]
  STATIC_CONSTEXPR_STR_INL_EXCEPT_WIN_CUDA(name, "aten::z>")
  STATIC_CONSTEXPR_STR_INL_EXCEPT_WIN_CUDA(overload_name, "z:")
  STATIC_CONSTEXPR_STR_INL_EXCEPT_WIN_CUDA(schema_str, z)
  static ÚcallF)r�   Úis_redispatching_fnz;
  static Z
redispatchTz;
};z+
STATIC_CONST_STR_OUT_OF_LINE_FOR_WIN_CUDA(z, name, "aten::z-")
STATIC_CONST_STR_OUT_OF_LINE_FOR_WIN_CUDA(z, overload_name, "z, schema_str, z)

// aten::z.
static C10_NOINLINE c10::TypedOperatorHandle<z::schema> create_zQ_typed_handle() {
  return c10::Dispatcher::singleton()
      .findSchemaOrThrow(z::name, z::overload_name)
      .typed<z::schema>();
}
)FTr×   ÚdispatchKeySetc                 S   s   g | ]
}|j ‘qS rX   ©r�   rÚ   rX   rX   rY   r³   m  s     z-ComputeOperators.__call__.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS rX   r  rÚ   rX   rX   rY   r³   q  s     rå   z
    static auto op = create_z_typed_handle();
    return op.ræ   rç   r   ©r`   ú

// aten::rª   ú {
    z
}
)r   Úfrom_schemarh   r�   Úunambiguous_namer  rH   ÚDECLARATIONrÕ   rŸ   r¯   rž   ÚdefnÚ
DEFINITIONrÈ   rÝ   r¢   r  r   rA   )rS   r–   rÎ   r�   Zdefnsr  Zdispatcher_exprs_strZmethod_baseZdispatcher_callÚmethod_nameZfn_bodyrX   rX   rY   r	  4  sž    ÿþûúùø	÷ÿÿÿþÿýûÿÿÿÿÿÿÿþþÿþ  ÿÿþýzComputeOperators.__call__N)rZ   r[   r\   r
   rH   r  r  r
  r	   r%   r   r0   rž   r	  rX   rX   rX   rY   r  /  s   
r  c                   @   s$   e Zd Zeeee dœdd„ƒZdS )ÚComputeFunctionr  c           
      C   sæ   t j|d|jd�}|j ¡ }d}| ¡ D ]¸}t |j¡}t| 	¡ | 	¡ ƒ}d 
dd„ |D ƒ¡}|jrjd}	nd}	tj|jkrª|d	|j› d
| ¡ › d|jj ¡ › d|› d�	7 }|r(|d|	› d|jdd�› d|jj ¡ › d|› d�	7 }q(|S )NFrá   rˆ   r×   c                 S   s   g | ]
}|j ‘qS rX   rØ   ©r±   r~   rX   rX   rY   r³   ž  s     z,ComputeFunction.__call__.<locals>.<listcomp>zc10::SymIntZ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)Zsuppress_symint_suffixz	);
  }
}
)r   rè   Úmanual_cpp_bindingrh   rê   Ú
signaturesr   r  r   rÝ   rÈ   ré   r:   ÚfunctionÚvariantsÚdeclr�   r  )
rS   r–   Ú	sig_grouprê   ÚresultrÎ   Ú
target_sigrß   Ú	exprs_strZ	intlike_trX   rX   rY   r	  ’  sF      ÿ
ÿþ
ýý
þ
ý
üüzComputeFunction.__call__N©rZ   r[   r\   r   r0   r   rž   r	  rX   rX   rX   rY   r  �  s   r  c                   @   sF   e Zd ZU eejejf ed< ee	 ed< e
eee dœdd„ƒZdS )ÚComputeTensorMethodr  r  r  c                 C   s  t j|jkrd S |j ¡ rt‚|jjjd k	s0t‚tj	|d|j
d�}| jtjkrvd}| ¡ D ]}|| ¡ › d�7 }qZ|S | jtjk	rŒt| jƒ d}| ¡ D ]n}t |j¡}t| ¡ | ¡ dd�}d dd„ |D ƒ¡}|d	|j› d
|jdd�› d|jj ¡ › d|› d�	7 }q˜|S )NTrá   rˆ   z const;
)râ   r×   c                 S   s   g | ]
}|j ‘qS rX   rØ   r  rX   rX   rY   r³   ß  s     z0ComputeTensorMethod.__call__.<locals>.<listcomp>r  r  zTensor::)Úprefixz const {
    return at::_ops::r  ú);
}
)r:   râ   r#  rh   Ú	is_out_fnru   rÝ   Zself_argr   rè   r   r  rH   r  r!  r$  r  rA   r   r  r   rÈ   r  r�   r  ©rS   r–   r%  r&  rÎ   r'  rß   r(  rX   rX   rY   r	  Å  s>      ÿ
ÿ
þ
ýýzComputeTensorMethod.__call__N)rZ   r[   r\   r
   rH   r  r  r
  r	   r%   r   r0   r   rž   r	  rX   rX   rX   rY   r*  À  s   
r*  c                   @   s$   e Zd Zeeee dœdd„ƒZdS )ÚComputeRedispatchFunctionr  c                 C   s”   t j|d|jd�}d}| ¡ D ]p}t |j¡}t| ¡ | ¡ ƒ}d 	dgdd„ |D ƒ ¡}|d|j› d	|j
d
d�› d|jj ¡ › d|› d�	7 }q|S )NFrá   rˆ   r×   r  c                 S   s   g | ]
}|j ‘qS rX   rØ   rÚ   rX   rX   rY   r³   ü  s     z6ComputeRedispatchFunction.__call__.<locals>.<listcomp>r  r  T)r  r  z::redispatch(r,  )r   rè   r   r!  r   r  rh   r   rÝ   rÈ   r$  r�   r  r.  rX   rX   rY   r	  ð  s(      ÿÿ
þ
ýýz"ComputeRedispatchFunction.__call__Nr)  rX   rX   rX   rY   r/  î  s   r/  r  c                 C   s   d| j jj› d| j jj› d�S )Nz{"aten::z", "z"},)rh   r�   rŸ   rõ   rX   rX   rY   Úcompute_aten_op  s    r0  ©Úgrg   c                 C   s¢  | j s
d S t| jƒ��‚ t | ¡}t  | ¡}d dd„ |D ƒ¡}| jj}|d krTd}d}| j rf| jjnd }|�rZ|j	 
¡ |jf•}dd„ |D ƒ}dd„ |D ƒ}	d d	d„ |	D ƒ¡}
d
|
› d�}dd„ |D ƒ}d dd„ |D ƒ¡}g }t|ƒD �]"\}}d |	d |… dg |	|d d …  ¡}d|› d�}|| jdd�}|› d|j› d|› d�}d|| j› d�}d|	| › d|› d�}g }| |› d�¡ t|ƒD ]F\}}||k�r¾| d|j› d�¡ n| d|j› d|j› d �¡ �q–| d!¡ d" |¡}| d#|› d$|› d%|› d&�¡ qìd" |¡}d dgt|	ƒ ¡}d'|› d(�}d)}d*|› d+|› d#|› d,�}nd-}d-}d.|› d/|› d0|› d1|› d1|› d2|› d3�W  5 Q R £ S Q R X d S )4Nr×   c                 s   s   | ]}|  ¡ V  qd S r»   )r$  rÚ   rX   rX   rY   rÜ     s     z4compute_meta_function_declaration.<locals>.<genexpr>zat::impl::MetaBaseÚvoidc                 S   s   g | ]}|D ]}|‘qqS rX   rX   )r±   Zreplace_listÚelemrX   rX   rY   r³   %  s      z5compute_meta_function_declaration.<locals>.<listcomp>c                 S   s   g | ]}|j  ¡ ‘qS rX   )r�   Úupper©r±   r4  rX   rX   rY   r³   (  s    c                 s   s   | ]}d |› d�V  qdS )zbool z = falseNrX   )r±   ÚparamrX   rX   rY   rÜ   +  s    z
template <ú>c                 S   s   g | ]}t j||jd �‘qS ))Úbinds)r�   Úargument_typer�   r6  rX   rX   rY   r³   1  s   ÿz;
c                 s   s&   | ]}|j d d�› d|j› �V  qdS )T©Z	strip_refú N)Úcpp_typer�   r6  rX   rX   rY   rÜ   6  s   ÿÚtruerN   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>;Zmeta_return_tyz
                zG
                struct TORCH_API precompute_out {
                    z;
            };rˆ   zstruct TORCH_API structured_z
 : public r  rú   z meta(z);
};
)r�   r   ÚoutÚmetar�   Zmeta_argumentsrÈ   Zstructured_inheritsÚprecomputedr­   ÚvaluesrŒ   Ú	enumerater=  ry   r¢   )r2  r�   ÚargsÚargs_strZparent_classZmeta_returnrA  Zprecomputed_valuesZprecomputed_elementsZprecomputed_template_parametersZprecomputed_template_params_strZprecompute_template_declZ#precomputed_elements_with_cpp_typesZprecomputed_elements_declZsetter_methodsÚir4  Zreturn_ty_templatesZ	return_tyZelem_cpp_tyrì   Z
assert_msgZassert_stmtZconstruction_stmtsÚjZconstruction_blockZsetter_methods_declZmeta_return_template_paramsZmeta_return_typedefZprecomputed_declrX   rX   rY   Ú!compute_meta_function_declaration  s¸    

ÿÿ
ÿþ
þ
ÿþÿÿ
ÿ

ÿþýÿ
ÿÿýü
ÿÿþýüürH  )r–   r  rg   c                 C   sB   t | jjjƒ}| d¡s"| d¡r&dS | jjjd kr8dS | | ¡S )NZ_likeZnew_F)rž   rh   r�   ÚendswithÚ
startswithrÝ   rû   r  )r–   r  r�   rX   rX   rY   Úneeds_backend_select�  s    rK  c                   @   sB   e Zd ZU eejejf ed< eed< e	e
ee dœdd„ƒZdS )ÚComputeBackendSelectr  r  r  c                 C   s4  t || jƒsd S t |j¡}t|jdd�}dd„ | ¡ D ƒ}t |j¡}|}| 	¡ }d}| j
tjk�r|r¢|jj ¡ szt‚d dd„ |D ƒ¡}	d	|› d
|	› d�}
n|jj ¡ r²t‚d|› d�}
d|j› d| |¡› d|
› d|jj ¡ › dd dd„ |D ƒ¡› d�S | j
tjk�r&d|jj› d|› d�S t| j
ƒ d S )NT©ré   c                 S   s(   g | ] }t |jtƒr|jj ¡ r|‘qS rX   )rs   rÓ   r$   rÕ   rö   rÚ   rX   rX   rY   r³   ¬  s    þz1ComputeBackendSelect.__call__.<locals>.<listcomp>z.c10::computeDispatchKey(dtype, layout, device)r×   c                 s   s   | ]}|j V  qd S r»   r  rÚ   rX   rX   rY   rÜ   À  s     z0ComputeBackendSelect.__call__.<locals>.<genexpr>z-DispatchKeySet _dk_set = c10::DispatchKeySet(z() | c10::detail::multi_dispatch_key_set(z³);
DispatchKeySet _dk_mask = c10::DispatchKeySet(DispatchKeySet::FULL_AFTER, DispatchKey::BackendSelect);
DispatchKeySet _dk = c10::impl::computeDispatchKeySet(_dk_set, _dk_mask);z)DispatchKeySet _dk = c10::DispatchKeySet(rç   z	// aten::z
C10_ALWAYS_INLINE
z {
  z
  return at::_ops::z::redispatch(
      _dk, c                 s   s   | ]}|j V  qd S r»   rØ   rÚ   rX   rX   rY   rÜ   Ð  s     r,  zm.impl("aten::z", TORCH_FN(z));)rK  r  Únativer�   rh   r   rÝ   r   r  rß   r  rH   r  Zhas_tensor_argru   rÈ   r  r  ÚREGISTRATIONrA   )rS   r–   r�   Z
native_sigrý   Zdispatcher_sigrÎ   Zdispatcher_exprsrp   rþ   Z
compute_dkrX   rX   rY   r	  £  sJ    þÿÿ

ÿÿýü
ûú	zComputeBackendSelect.__call__N)rZ   r[   r\   r
   rH   r  rO  r
  r@   r   r0   r   rž   r	  rX   rX   rX   rY   rL  ›  s   
rL  )Údatarg   c                 C   s:   dd„ t _tttdœdd„}t  t|¡ tj| dt dd�S )	Nc                 S   s   dS )NTrX   )rS   rP  rX   rX   rY   rm   â  rn   zformat_yaml.<locals>.<lambda>)ÚdumperrP  rg   c                 S   s   |   | ¡ ¡S r»   )Zrepresent_dictr{   )rQ  rP  rX   rX   rY   Údict_representerå  s    z%format_yaml.<locals>.dict_representerFg    eÍÍA)Zdefault_flow_styleZDumperÚwidth)rI   Zignore_aliasesr   Zadd_representerr   r”   Údump)rP  rR  rX   rX   rY   Úformat_yamlà  s    
rU  c                 C   sh   | dkrdS | dkrdS z
t | ƒW S  tk
rb   zt| ƒW  Y S  tk
r\   |  Y  Y S X Y nX d S )Nr>  TÚfalseF)rx   Ú
ValueErrorÚfloatr®   rX   rX   rY   Úpythonify_defaultó  s    
rY  )Útrg   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__)Úmutabler9  ré   )rs   r4   Údynamic_typer4  rž   r   Zargumenttype_typer=  )rZ  rX   rX   rY   r^    s    

   ÿr^  )r#  rg   c                 C   s2   dg}t j| kr| d¡ t j| kr.| d¡ |S )Nr9   r[  Ú	namespace)r:   râ   ry   r"  )r#  Ú	method_ofrX   rX   rY   Úcompute_method_of_yaml  s    



ra  c                 C   s”   i }t  | ¡}g }tt| jj|ƒƒD ]f\}\}}t|jƒ|t j|dd� 	¡ dœ}|j
r€|j
|d< | j ¡ r€|j
|| jjj| j
< | |¡ q$||fS )NFrM  )r^  r�   rÕ   Ú
field_name)r   Zreturn_namesrC  Úziprh   Úreturnsr^  rÕ   Úreturn_typer=  r�   r-  rÝ   r?  ry   )r–   Úname_to_field_nameÚnamesrd  rF  Úrr�   ÚretrX   rX   rY   Úcompute_returns_yaml#  s    *
ü

rj  )Úcpp_aÚschema_orderÚkwarg_only_setÚout_arg_setrf  rg   c                C   sr   t | jtƒr:d dd| j| jddœ}| jd k	r6| j|d< |S t | jtƒrNtƒ ‚n t | jtƒrnt	| j||||d�S d S )Nzat::TensorOptionsFT)Ú
annotationr^  Úis_nullabler�   rÕ   Ú
kwarg_onlyrÒ   ©rl  rm  rn  rf  )
rs   rÓ   r8   r�   rÕ   rÒ   r6   ru   r$   Úcompute_argument_yaml)rk  rl  rm  rn  rf  rÞ   rX   rX   rY   Úcompute_cpp_argument_yamlf  s*    ú

ûrt  )rÛ   rl  rm  rn  rf  rg   c             	   C   sà   | j rt| j ƒnd t| jƒ| j ¡ | jtj| ddd� ¡ dœ}| j	d k	rdt
tj| j	| jdd�ƒ|d< | j|krvd|d< | j|kr¨d|d	< d|d
< | j|kr¨|| j |d< | j ¡ }|d k	rÜ|jd k	rÜt|jƒdkrÜ|j|d< |S )Nr\  F)r9  ré   )ro  r^  rp  r�   rÕ   rM  rÒ   Trq  rÉ   Úallocaterb  ÚboolÚsize)ro  rž   r^  rÕ   rp  r�   r   r:  r=  rÒ   rY  Zdefault_exprZis_list_likerw  r4  )rÛ   rl  rm  rn  rf  rÞ   ÚlrX   rX   rY   rs  †  s*    	ú
ÿ



 
rs  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 ƒƒoÞtj| jk}
tdt
 | j¡fdt| jjjƒfdt| jjjƒfd| jfd| jd k	�r,| jndfdd| j› �fd|fd|	fd|fdt| jƒfdd| jd k�rpdn| jfd|fd| jjjjfd |
fd!| jfd"| jfd#d$d%| jfgƒS )&Nc                 S   s   h | ]
}|j ’qS rX   r  rÚ   rX   rX   rY   Ú	<setcomp>°  s     z+compute_declaration_yaml.<locals>.<setcomp>c                 S   s   h | ]
}|j ’qS rX   r  rÚ   rX   rX   rY   ry  ±  s     Frá   c              	      s   g | ]}t |d ˆ ˆˆd�‘qS )Frr  )rt  )r±   rk  ©rm  rf  rn  rX   rY   r³   ·  s   ùûz,compute_declaration_yaml.<locals>.<listcomp>c              	      s   g | ]}t |d ˆ ˆˆd�‘qS )Trr  )rs  rÚ   rz  rX   rY   r³   Ä  s   ùûc              
   S   s0   g | ](}t j|d tƒ d d d d�D ]
}|j‘q qS )F)râ   Zcpp_no_default_argsZfaithfulré   Zhas_tensor_options)r   rÓ   r‰   rÕ   )r±   rÛ   rh  rX   rX   rY   r³   Ï  s   ú þrM  z (r×   r÷   c                 s   s   | ]}t |jtƒV  qd S r»   )rs   rÓ   r8   rÚ   rX   rX   rY   rÜ   â  s     z+compute_declaration_yaml.<locals>.<genexpr>r�   Zoperator_namerŸ   rÅ   Úcategory_overriderˆ   Zschema_stringúaten::rÝ   Úschema_order_cpp_signatureÚschema_order_argumentsr`  )ÚmoderN  Úpython_modulerd  r    Úis_factory_methodZabstractrq   )Zwith_gilF)Ú
deprecatedFZhas_math_kernel)rj  rh   rÝ   Zflat_kwarg_onlyr?  r   rè   rì   rt   r~  r   Úreturns_typerd  r=  rÈ   Úanyr:   râ   r#  r   r�   rž   rŸ   rÅ   r{  ra  r€  r    Zis_abstractrq   r¿   )r–   rd  r%  Zcpp_argsrÝ   Zschema_order_jit_argumentsr~  Zcpp_schema_order_typesZcpp_returnsr}  r�  rX   rz  rY   Úcompute_declaration_yamlª  sb      ÿ
øøý
þþéÿr…  c                 C   s0   | j s| jd k	o.| j ¡ tjkp.| j ¡ tjkS r»   )r�   rœ   rh   Úkindr5   Ú
functionalr    rõ   rX   rX   rY   Ú"has_autogenerated_composite_kernel  s    ÿrˆ  )r–   r`   rg   c              	      sÂ   t  ˆ j¡}t  ˆ jj¡ ¡ }t  ˆ j¡}d dd„ |D ƒ¡}dˆ j› �t‡ fdd„| 	¡ D ƒt
jhkoˆ‡ fdd„| 	¡ D ƒt
jt
jhkƒtˆ jp˜tˆ ƒƒdœ}|› d	|› d
|› dt |¡› d�S )Nr×   c                 s   s   | ]}|  ¡  ¡ V  qd S r»   )Z
no_defaultZdecl_registration_declarationsrÚ   rX   rX   rY   rÜ     s     z4compute_registration_declarations.<locals>.<genexpr>r|  c                    s   h | ]\}}|  ˆ ¡r|’qS rX   ©r¼   ©r±   r�   r‚   rõ   rX   rY   ry    s     
 z4compute_registration_declarations.<locals>.<setcomp>c                    s   h | ]\}}|  ˆ ¡r|’qS rX   r‰  rŠ  rõ   rX   rY   ry    s     
 )ÚschemaÚdispatchrÒ   r<  ræ   z); // rª   )Ú
dispatcherr�   rh   rƒ  rd  Z"cpp_type_registration_declarationsrÝ   rÈ   rž   r{   r)   r´   rµ   Zhas_composite_kernelrˆ  ÚjsonÚdumps)r–   r`   r�   rƒ  rD  rE  Zcomment_datarX   rõ   rY   Ú!compute_registration_declarations
  s(    ÿ
ÿþÿý	ôr�  )Ú"provided_op_registration_allowlistÚop_selection_yaml_pathrg   c                 C   sd   | d k	r|d k	rt dƒ‚d }| d k	r,t| ƒ}|d k	rDt |dd¡}n|d k	rXt |¡}nt ¡ }|S )NzhBoth provided_op_registration_allowlist and op_selection_yaml_path can NOT be provided at the same time.TF)ru   r‰   r@   Z&from_legacy_op_registration_allow_listZfrom_yaml_pathÚget_nop_selector)r‘  r’  Zop_registration_allowlistr  rX   rX   rY   Úget_custom_build_selector-  s&    ÿþü	ýr”  )r_   rg   c                 C   s®   t tttf tf ttttf  dœdd„}ttƒ}| D ]b}|j	 
¡ }|j}|tjkr~|j	 ¡ }||| kspt‚||| |< q8||| ksŽt‚||| |< q8tt|| ¡ ƒƒS )N©Údrg   c                 S   sf   g }t j| krJ|  t j¡}|  t jd ¡}|  tjd ¡}| t|||d�¡ |  ¡ D ]}| |¡ qR|S )N)ÚviewÚ	view_copyÚview_inplace)	r;   Zaliasingr‹   Zaliasing_inplacer5   r‡  ry   r2   rB  )r–  rk   r—  r™  r˜  rh   rX   rX   rY   Úmaybe_create_view_groupO  s    
ýÿ	zEget_grouped_by_view_native_functions.<locals>.maybe_create_view_group)r   r   r;   r5   r0   r	   r2   r   rv   rh   Zview_signatureZview_schema_kindZnon_aliasingr†  ru   rt   rB   rB  )r_   rš  Zgrouped_by_viewsr–   r‹  Z	view_kindr†  rX   rX   rY   Ú$get_grouped_by_view_native_functionsL  s    þþ


r›  c                 C   sB   t ttf ttttf  dœdd„}t| ƒ}tt|t| 	¡ ƒƒƒS )Nr•  c                 S   sB   t  | ¡}|d kr8tdd„ |  ¡ D ƒƒr,t‚t|  ¡ ƒS |gS d S )Nc                 s   s   | ]}d |j kV  qdS )Ú	generatedN)r†   ©r±   r–   rX   rX   rY   rÜ   „  s     zJget_grouped_native_functions.<locals>.flatten_pre_group.<locals>.<genexpr>)r1   Ú	from_dictr„  rB  ru   rt   )r–  rh  rX   rX   rY   Úflatten_pre_group}  s
    
z7get_grouped_native_functions.<locals>.flatten_pre_group)
r   r5   r0   r   r   r1   r?   rt   rB   rB  )r_   rŸ  Zpre_grouped_native_functionsrX   rX   rY   Úget_grouped_native_functionsz  s    
þÿr   )Únative_function_decl_gen)Úgrouped_native_functionsr`   r¡  rg   c                 C   s–   t tƒ}| D ]„}tƒ }tƒ }| ¡ D ]j\}}| |¡}	|	rV|	j}
| |¡ | |
¡ nt}
t|ƒdkszt	d|› d|› �ƒ‚||
  
|||ƒ¡ q$q|S )NrN   z6Codegen only supports one namespace per operator, got z from )r   rt   r‰   r{   rí   rî   rŒ   r(   r¢   ru   Úextend)r¢  r`   r¡  Úns_grouped_kernelsr–   Znative_function_namespacesÚdispatch_keysrp   Úbackend_idxrð   r_  rX   rX   rY   Úget_ns_grouped_kernels�  s&    


ÿþÿr§  )r¤  rg   c              
   C   sh   g }d}|   ¡ D ]R\}}t|ddd�}tt |¡ƒ}| d|j› d| |¡› d|j› d� 	|¡¡ q|S )Nrª   rˆ   é   ©Únamespace_strZentity_nameZ	max_levelú	
        )
r{   rG   rt   r   Úfromkeysr£  ÚprologuerÈ   ÚepilogueÚsplit)r¤  ÚdeclarationsÚnewliner_  ÚkernelsÚ	ns_helperÚordered_kernelsrX   rX   rY   Ú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¢  r`   r¡  )r¤  )r§  rµ  )r¢  r`   r¡  r¤  rX   rX   rY   Ú get_native_function_declarationsÉ  s    ýÿr·  )r–   r¦  rg   c                 C   s^   |  | ¡}|rPd|jksPtdt| tƒr.| jjn| jjj› d|j› d|j› d�ƒ‚|rZ|jS t	S )Nrã   zThe kernel for function z with dispatch key z has a namespace z% and it's not ending with '::native'.)
rí   rî   ru   rs   r0   rh   r�   r‡  rp   r(   )r–   r¦  rð   rX   rX   rY   Úget_kernel_namespaceã  s    
2ÿÿr¸  )
Úfmr¢  rp   r¦  r  Úrocmré   Úskip_dispatcher_op_registrationÚgen_dispatch_helpersrg   c        	            s¢  g }	t tƒ‰t tƒ‰ t tƒ}
d}tjˆtj|||d ˆd�}tjˆtj|||d ˆd�}tjˆtj|||d ˆd�}|D ]‚}t	|ˆd� 
dd¡‰ˆˆ  ||ƒ¡ ˆ ˆ  ||ƒ¡ t|tƒr¾|jn|jj}||
ˆ krÞt tƒ|
ˆ< |
ˆ |  ||ƒ¡ qrˆD ]¢‰tˆˆ ƒdk�rqútˆd�‰d‰|
ˆ D ]B}|
ˆ | �s>�q(ˆd|› d	ˆ› d
| |
ˆ | ¡› d�7 ‰�q(|	 |  d‡ ‡‡‡‡‡‡‡‡f	dd„¡ |¡¡ qú|	S )Nrª   ©rº  ré   Úclass_method_namer»  ©r–   r¦  rã   rˆ   r   )rª  z
TORCH_LIBRARY_IMPL(r×   z, m) {
    ú
};zRegisterDispatchDefinitions.inic                	      s<   ˆj ˆjˆrt ˆ¡ng ˆ ˆ ˆr&dnˆdˆ ¡ ˆˆ dœS )Nrˆ   )Zns_prologueZns_epilogueÚdispatch_helpersZdispatch_anonymous_definitionsZ"static_init_dispatch_registrationsZdeferred_dispatch_registrationsÚdispatch_namespaceZdispatch_namespaced_definitions)r­  r®  ÚdestZgen_registration_helpersrÇ   rX   ©	Zanonymous_definitionsr¦  rp   r¼  Zkernel_namespaceZns_definitionsr³  Zregistration_bodyr»  rX   rY   rm   B  s    ÿÿÿòz1get_native_function_definitions.<locals>.<lambda>)r   rt   rv   rÃ  ÚRegisterDispatchKeyrH   ZNAMESPACED_DEFINITIONZANONYMOUS_DEFINITIONrO  r¸  r­   r£  rs   r0   r_  r‡  r¢   rG   rÈ   Zsubstitute_with_templater¯  )r¹  r¢  rp   r¦  r  rº  ré   r»  r¼  ÚdefinitionsZregistrationsr±  Zns_genZanonymous_genZreg_genr–   r_  rX   rÄ  rY   Úget_native_function_definitionsó  s”    ù	ù	ù	 ÿÿÿÿÿ
ÿÿþþîÿrÇ  )r¢  rp   r¦  r  rº  ré   rg   c              
   C   sÌ   g }t tƒ}d}tj|tj||d d|d�}	| D ].}
t|
|d� d| ¡ ¡}||  	|	|
ƒ¡ q.| 
¡ D ]`\}}t|ƒdkr|qft|ddd	�}tt |¡ƒ}| 	d|j› d| |¡› d|j› d
� |¡¡ qf|S )Nrª   F)rº  r¾  r»  ré   r¿  rN  r   rˆ   é   r©  r«  )r   rt   rÃ  rÅ  rH   ÚNAMESPACED_DECLARATIONr¸  r­   rÇ   r£  r{   r¢   rG   r   r¬  r­  rÈ   r®  r¯  )r¢  rp   r¦  r  rº  ré   r°  r¤  r±  rh   r–   r_  r²  r³  r´  rX   rX   rY   Úget_namespaced_declarationZ  sR    	ù	 ÿÿ  ÿÿþýûÿ	rÊ  )r_   Úschema_selectorrg   c              
   C   s¢   t tƒ}| D ]}||j  |¡ qd}g }d }| ¡ D ]b\}}ttt|ƒ|ƒƒ}	|dkr^|	}q6|}d}
|tkrrdnd}|d|› d|› d|
 |	¡› d	�7 }q6||fS )
Nrˆ   Zatenr¬   ZTORCH_LIBRARY_FRAGMENTZTORCH_LIBRARYrª   ræ   z	, m) {
  rÀ  )	r   rt   r_  ry   r{   rF   r  r*   rÈ   )r_   rË  Zns_native_functionsZnative_functionÚschema_registrationsÚaten_schema_registrationsÚcustom_namespacer_  rk   Zschema_registrations_bodyÚtabZtorch_library_macrorX   rX   rY   Ú(get_native_function_schema_registrationsŒ  s4    ÿÿýÿÿþrÐ  )r_   r¢  Ústructured_native_functionsÚstatic_dispatch_idxr  r`   Úcpu_fmÚcuda_fmÚfunctions_keysr¥  rº  rg   c              
      s  |  d‡fdd„¡ dd„ ˆD ƒ‰‡fdd„ˆD ƒ‰|  d‡‡
fdd„¡ |  d	‡‡
fd
d„¡ |  d‡‡
fdd„¡ tˆˆ d�‰|  d‡fdd„¡ |	D ]n‰tˆƒrª|n|}ˆ|k�rdˆ› d�‰| ˆ› d�d‡‡fdd„¡ | ˆ› d�d‡ ‡‡‡‡	fdd„¡ ~qšd S )NzNativeMetaFunctions.hc                      s   g t ttˆ ƒƒdœS )N)ZNativeMetaFunctions_includesZ NativeMetaFunctions_declarations©rt   rF   rH  rX   )rÑ  rX   rY   rm   Â  s
    ÿþz(gen_aggregated_headers.<locals>.<lambda>c                 S   s   g | ]}t j|jkr|‘qS rX   ©r:   râ   r#  ©r±   ÚfnrX   rX   rY   r³   É  s     z*gen_aggregated_headers.<locals>.<listcomp>c                    s   g | ]}|ˆ kr|‘qS rX   rX   rØ  )Úmethod_native_functionsrX   rY   r³   Ì  s     úMethodOperators.hc                      s   g t tttjˆd�ˆ ƒƒdœS )N©r  ©ZMethodOperators_includesZMethodOperators_declarations©rt   rF   r  rH   r  rX   )rÚ  rÒ  rX   rY   rm   Ñ  s    þûÿþzOperators.hc                      s    dgt tttjˆd�ˆ ƒƒdœS )Nz!#include <ATen/MethodOperators.h>rÜ  )ZOperators_includesZOperators_declarationsrÞ  rX   )Únon_method_native_functionsrÒ  rX   rY   rm   à  s    þûÿþúFunctions.hc                      s   t ˆƒdgtttƒ ˆ ƒƒdœS )Nz#include <ATen/Operators.h>)rÍ   ZFunctions_includesZFunctions_declarations)rÍ   rt   rF   r  rX   ©r_   rÒ  rX   rY   rm   ï  s    ÿþÿû)r¢  r`   zNativeFunctions.hc                      s   dgˆ dœS )Nz%#include <ATen/NativeMetaFunctions.h>)ZNativeFunctions_includesZNativeFunctions_declarationsrX   rX   )r°  rX   rY   rm     s    þrË   úFunctions_inl.h>úDispatchKeyFunctions.hc                      s   t ˆ ƒˆdœS ©N)rp   Zinline_headers©rž   rX   ©rp   Úinl_headersrX   rY   rm     s    þúFunctions_inl.húDispatchKeyFunctions_inl.hc                
      s$   g ˆ  ¡ tˆˆˆ ˆ ˆˆdd�dœS )NT)r¢  rp   r¦  r  rº  ré   )Ú!DispatchKeyFunctions_inl_includesrÂ  Ú dispatch_namespaced_declarations)rÇ   rÊ  rX   )r`   rp   r¢  rº  r  rX   rY   rm     s    úý)Úwriter·  r,   Úwrite_with_template)r_   r¢  rÑ  rÒ  r  r`   rÓ  rÔ  rÕ  r¥  rº  r¹  rX   )r`   r°  rp   r¢  rç  rÚ  r_   rß  rº  r  rÒ  rÑ  rY   Úgen_aggregated_headers°  sZ    
þ	ÿ
ÿþþþþ
þ
ýýrî  )r_   r¢  rÒ  r  r`   rÓ  rÔ  Úops_fmrÕ  r¥  rº  rg   c                    s`  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‰ˆrÜ| ˆ	› d�d‡fdd„¡ t||t	j
d�‰| ˆ	› d�d‡‡‡	fdd„¡ qPdD ](\‰ ‰| ˆ › d�‡ ‡‡fdd„¡ �q|	D �]‰ˆ|k�rT�q@ˆ ¡ ‰g ‰ˆ ¡ D ]~\‰	‰| ˆ	g ¡}ttt	j|ˆ tj||
dd dd�|ƒƒ‰tˆƒd
k�r¶�qhˆ ˆ	¡ | ˆ	› dˆ› d�d‡‡fdd„¡ �qhtˆƒ�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Þ  rX   )Ú	functionsrÒ  rX   rY   rm   H  s     þûÿÿz*gen_per_operator_headers.<locals>.<lambda>z.hz
Function.hc                      s2   t t‡fdd„ˆ ƒƒdˆ› d�t ttƒ ˆ ƒƒdœS )Nc                    s   t | ˆ d�S )N©rº   )rÊ   ©rÙ  ©rÒ  rX   rY   rm   [  s    ÿz<gen_per_operator_headers.<locals>.<lambda>.<locals>.<lambda>rÂ   ú_ops.h>)Zstatic_dispatch_ops_headersZoperator_includesZfunction_definitions)rt   rF   r  rX   )rð  r�   rÒ  rX   rY   rm   X  s    
üÿ
þÿöc                 S   s    g | ]}t |tƒr|jr|‘qS rX   )rs   r1   r�   rØ  rX   rX   rY   r³   l  s   
 þz,gen_per_operator_headers.<locals>.<listcomp>r   z_meta.hzNativeMetaFunction.hc                      s   dt ttˆ ƒƒiS )NZmeta_function_declarationsrÖ  rX   )Ústructured_functionsrX   rY   rm   w  s      ÿÿÿr¶  z	_native.hzNativeFunction.hc                      s   ˆrdˆ› d�ng ˆ dœS )NrÂ   z_meta.h>)Zextra_includesZnative_function_declarationsrX   rX   )r°  Úis_structuredr�   rX   rY   rm   ‡  s    ü))Z	Functionsrˆ   )Z	OperatorsZ_ops)ZNativeMetaFunctionsÚ_meta)ZNativeFunctionsZ_nativec                      s.   ˆ › d�‡fdd„t ˆ ¡ ƒD ƒˆ › d�g iS )NZ	_includesc                    s   g | ]}d |› ˆ › d�‘qS )rÂ   ú.h>rX   ©r±   r�   )ÚsuffixrX   rY   r³   ˜  s   ÿú>gen_per_operator_headers.<locals>.<lambda>.<locals>.<listcomp>Z_declarations)r  rü   rX   )ÚcategoryÚfunctions_by_root_namerú  rX   rY   rm   —  s     

þ ûTFr½  rÃ   z_dispatch.hzDispatchKeyFunction.hc                      s
   ˆˆ dœS )N)rÂ  rë  rX   rX   )r°  rÂ  rX   rY   rm   ¿  s    þrË   râ  rà  rã  c                      s   t ˆ ƒˆdœS rä  rå  rX   ræ  rX   rY   rm   Ë  s    þrè  ré  c                      s   ˆ‡fdd„t ˆ ƒD ƒg dœS )Nc                    s   g | ]}d |› dˆ › d�‘qS )rÂ   rÃ   rÄ   rX   rù  )rÂ  rX   rY   r³   Õ  s   ÿrû  )rÂ  rê  rë  )r  rX   )Údispatch_namesrÂ  rX   rY   rm   Ó  s    
þúrÛ  c                      s   t dd„ ˆ  ¡ D ƒƒg dœS )Nc                 s   s0   | ](\}}t d d„ |D ƒƒrd|› d�V  qdS )c                 s   s   | ]}t j|jkV  qd S r»   r×  rØ  rX   rX   rY   rÜ   ä  s     zGgen_per_operator_headers.<locals>.<lambda>.<locals>.<genexpr>.<genexpr>rÂ   rô  N)r„  )r±   r�   rð  rX   rX   rY   rÜ   á  s   þz=gen_per_operator_headers.<locals>.<lambda>.<locals>.<genexpr>rÝ  )r  r{   rX   )rý  rX   rY   rm   à  s
    þú)r   rt   rÆ   ry   r{   rí  rw   r¢   r·  rÃ  Ú#compute_native_function_declarationrì  rÇ   rB   rÅ  rH   rÉ  r,   )r_   r¢  rÒ  r  r`   rÓ  rÔ  rï  rÕ  r¥  rº  rÙ  Zgrouped_functions_by_root_nameÚgroupZgrouped_functionsr¹  rX   )rü  r°  rp   rþ  rÂ  rð  rý  rç  rö  r�   rÒ  rõ  rú  rY   Úgen_per_operator_headers)  s¶    þýýþ
ýýýþ

ù	öÿ
ý	ýý
þr  )r_   rc   r¢  rÑ  rÒ  r  r`   Úcore_fmrÓ  rÔ  rï  r¥  rÕ  rº  Úper_operator_headersrg   c                    sæ   |r$t ˆ|ˆ|ˆ ||	|
|||d� ntˆ||ˆ|ˆ ||	|||d� | d‡‡fdd„¡ | d‡fdd„¡ | d‡ ‡fd	d„¡ | d
‡fdd„¡ tttf dœ‡fdd„}| d|¡ tttf dœ‡fdd„}| d|¡ d S )N)r_   r¢  rÒ  r  r`   rÓ  rÔ  rï  r¥  rÕ  rº  )r_   r¢  rÑ  rÒ  r  r`   rÓ  rÔ  r¥  rÕ  rº  zTensorBody.hc                      s2   t tttjˆd�ˆ ƒƒt tttjˆd�ˆ ƒƒdœS )N)r  r  )Ztensor_method_declarationsZtensor_method_definitions)rt   rF   r*  rH   r  r  rX   rá  rX   rY   rm     s&    þûÿ	þûÿözgen_headers.<locals>.<lambda>zRedispatchFunctions.hc                      s   dt ttƒ ˆ ƒƒiS )NZfunction_redispatch_definitions)rt   rF   r/  rX   ©r_   rX   rY   rm   4  s
     
ÿÿzRegistrationDeclarations.hc                      s   d‡ fdd„ˆD ƒiS )NZregistration_declarationsc                    s   g | ]}t |ˆ ƒ‘qS rX   )r�  r�  r  rX   rY   r³   >  s   ÿz1gen_headers.<locals>.<lambda>.<locals>.<listcomp>rX   rX   )r`   r_   rX   rY   rm   =  s
     
þÿzVmapGeneratedPlumbing.hc                      s   t ˆ ƒS r»   r"   rX   r  rX   rY   rm   F  rn   ©rg   c                     s¨   t ƒ } t ƒ }ˆ D ]F}| t|jjjƒ¡ | |jjjj¡ |j ¡ D ]}|  |j¡ qDq|ddddddddd	d
dh8 }d dd„ t|ƒD ƒ¡d dd„ t| ƒD ƒ¡dœS )NÚandZand_eqZbitandZbitorZcomplÚnotZnot_eqÚorZor_eqÚxorZxor_eqz \
c                 S   s   g | ]}d |› d�‘qS )z_(aten, r÷   rX   rù  rX   rX   rY   r³   g  s     zBgen_headers.<locals>.gen_aten_interned_strings.<locals>.<listcomp>c                 S   s   g | ]}d |› d�‘qS )z_(attr, r÷   rX   rù  rX   rX   rY   r³   j  s     )Zaten_symbolsZattr_symbols)	r‰   rŒ   rž   rh   r�   r¡   r~  rÈ   r  )Úattrsrg  rh   rÞ   r  rX   rY   Úgen_aten_interned_stringsI  s6    õÿÿüz.gen_headers.<locals>.gen_aten_interned_stringszaten_interned_strings.hc                      s   dd  tˆ ƒ¡iS )NZenum_of_valid_tagsz,
)rÈ   r  rX   )rc   rX   rY   Úgen_tags_enump  s    z"gen_headers.<locals>.gen_tags_enumz
enum_tag.h)r  rî  rì  r   rž   )r_   rc   r¢  rÑ  rÒ  r  r`   r  rÓ  rÔ  rï  r¥  rÕ  rº  r  r  r  rX   )r`   r_   rÒ  rc   rY   Úgen_headersë  s^    õõþ
þ	þ
 
ÿ%r  )r_   r¢  rÑ  Úview_groupsr  rÒ  r`   r  rÓ  Ú
cpu_vec_fmrÔ  r¥  rÕ  rº  Úforce_schema_registrationr  r»  rg   c                    s²  d‰ˆrd‰|D �]Ì‰t ˆƒr"|
n|}ˆrJtt dœ‡‡‡‡‡
fdd„‰ntt dœ‡‡fdd„‰ˆˆ ‰ttƒ}ˆ
D ]*}t|tƒrŠ|jn|jj}||  	|¡ qvtˆƒ 
¡ ‰ˆtjk}t|ˆ
ˆˆˆˆdˆ|d�	‰| d	ˆ› d
�d‡‡‡‡‡‡‡fdd„¡ ˆD ]Ú‰	ˆ	jj�r tˆƒ�s�q ˆ	jjjj‰ˆtjk�r†||k�sBt‚| dˆ› d
�d‡‡‡	fdd„¡ |	 dˆ› d
�d‡	‡fdd„¡ nRˆtjk�rÈd‰ˆ�r d‰| dˆ› d�d‡‡‡‡	‡fdd„¡ ntdˆ› d�ƒ‚�q ~qtttt f dœ‡‡fdd„}| d|¡ ˆ}|�rt ¡ }tˆ|d�\‰ ‰| d ‡ ‡‡fd!d„¡ ttttf td"œd#d$„}|jd%ˆ|‡fd&d„d't ˆƒid(d)d*d'hd+� | d,d-d„ ¡ | d.d/d„ ¡ | d0‡fd1d„¡ ttttf tttt f d2œ‡‡fd3d4„}tˆƒtˆƒ }d5d6„ t!d7d„ ˆƒD ƒ}d8d6„ t!d9d„ ˆƒD ƒ}ˆD ],}|jj|k�r2|jj|k�r2| 	|¡ �q2|jd:|||d;d<d=d>d?d@hdA� | dB‡‡fdCd„¡ | dD‡‡‡fdEd„¡ d S )FNz‹#include <c10/cuda/CUDAGuard.h>
#include <ATen/cuda/ATenCUDAGeneral.h>
#include <ATen/cuda/CUDADevice.h>
#include <ATen/cuda/CUDAContext.h>zŸ#include <ATen/hip/impl/HIPGuardImplMasqueradingAsCUDA.h>
#include <ATen/hip/ATenHIPGeneral.h>
#include <ATen/hip/HIPDevice.h>
#include <ATen/hip/HIPContext.h>r  c                     sÌ   g } ˆD ]¶}d}ˆ   |¡r d}nDt|tƒrJt‡ fdd„| ¡ D ƒƒrJd}n|jrdˆtjtjfkrdd}|sjq|  	d|j
› d�¡ ˆtjkrœ|  	d|j
› d�¡ ˆˆkr|  	d|j
› dˆ› d	�¡ qtt| ƒƒS )
NFTc                 3   s   | ]}ˆ   |¡V  qd S r»   r‰  rØ  rñ  rX   rY   rÜ   §  s    z=gen_source_files.<locals>.operator_headers.<locals>.<genexpr>rÂ   ú
_native.h>rø  rÃ   rÄ   )r¼   rs   r1   r„  rð  r�   r)   ÚMetar·   ry   rÆ   r  r‰   )Úheadersr2  Zis_registered)rº   rp   rÂ  rÕ  r¢  rX   rY   Úoperator_headers›  s6    
ÿþÿÿÿz*gen_source_files.<locals>.operator_headersc                     s8   dg} ˆ t jkr|  d¡ ˆ ˆkr4|  dˆ ›d�¡ | S )Nz!#include <ATen/NativeFunctions.h>z#include <ATen/Functions.h>rË   rÌ   )r)   r·   ry   )r  )rp   rÕ  rX   rY   r  Å  s    

T)	r¹  r¢  rp   r¦  r  rº  ré   r»  r¼  ZRegisterz.cppzRegisterDispatchKey.cppc                      s*   t ˆƒrˆnddt ˆ ˆˆ¡ˆƒ dˆdœS )Nrˆ   )Úextra_cuda_headersZexternal_backend_headersZdispatch_headersÚops_headersrÁ  Údispatch_definitions)r,   rÃ  Zgen_registration_headersrX   )rº   r  rp   r  r  r  rº  rX   rY   rm   í  s    ÿ  ÿöz"gen_source_files.<locals>.<lambda>Z	UfuncCPU_zUfuncCPU.cppc                      s"   t ˆƒt ˆˆ ˆ ¡t ˆ¡dœS )N)Úmeta_declarationÚnative_declarationÚnative_definitions)rH  rÃ  rÿ  Zcompute_ufunc_cpurX   )r`   rp   r2  rX   rY   rm   	  s     ÿûZUfuncCPUKernel_zUfuncCPUKernel.cppc                      s   ˆt  ˆ ¡dœS )N)r�   r  )rÃ  Zcompute_ufunc_cpu_kernelrX   )r2  r�   rX   rY   rm   	  s    þz%#include <ATen/native/cuda/Loops.cuh>z$#include <ATen/native/hip/Loops.cuh>Z
UfuncCUDA_z.cuzUfuncCUDA.cuc                      s&   ˆˆt ˆƒt ˆˆ ˆ ¡t ˆ¡dœS )N)r�   Úcuda_headersr  r  r  )rH  rÃ  rÿ  Zcompute_ufunc_cudarX   )r`   r  rp   r2  r�   rX   rY   rm   	  s     ÿùzunrecognized z
 for ufuncc                     sL   ‡fdd„ˆ D ƒ} dd„ | D ƒt tttjˆƒ| ƒƒt tttjˆƒ| ƒƒdœS )Nc                    s   g | ]}t |ˆ ƒr|‘qS rX   )rK  rØ  ©r  rX   rY   r³   ,	  s    
 z@gen_source_files.<locals>.gen_backend_select.<locals>.<listcomp>c                 S   s   g | ]}d |j › d�‘qS )rÂ   rô  ©rÆ   rØ  rX   rX   rY   r³   0	  s    )r  Z!backend_select_method_definitionsZ%backend_select_function_registrations)rt   rF   rL  rH   r  rO  )Zrelevant_fns)r_   r  rX   rY   Úgen_backend_select+	  s&    
ÿÿ
 ÿÿ
 ÿÿ÷z,gen_source_files.<locals>.gen_backend_selectzRegisterBackendSelect.cpp)r_   rË  zRegisterSchema.cppc                      s   ˆrg nˆ ˆrg nˆdœS )N)rÍ  rÌ  rX   rX   )rÍ  rÌ  r»  rX   rY   rm   M	  s    ÿÿú)rÙ  rg   c                 S   s   | j S r»   r  rò  rX   rX   rY   Úkey_funcW	  s    z"gen_source_files.<locals>.key_funczOperators.cppc                    s&   d| j › d�gttjˆ d�| ƒgdœS )NrÂ   rø  rÜ  )r  rÆ  )rÆ   r  rH   r  rò  ró  rX   rY   rm   `	  s    þýÿþrÍ   é   r  rÆ  )Úkey_fnÚenv_callableZbase_envÚ
num_shardsÚsharded_keyszFunctions.cppc                   S   s   i S r»   rX   rX   rX   rX   rY   rm   v	  rn   zTensorMethods.cppc                   S   s   i S r»   rX   rX   rX   rX   rY   rm   x	  rn   zATenOpList.cppc                      s   dt ttˆ ƒƒiS )NZaten_ops)rt   rF   r0  rX   r  rX   rY   rm   |	  s     ÿr1  c                    sB   t tttf tt dœdd„}|| ƒtˆ| ƒtˆ| ˆ tj	 ƒdœS )Nr1  c                 S   s&  t | tƒr\d| jj› d�d| jj› d�g}| jd k	rX|d| jj› d�d| jj› d�g7 }|S t | tƒ�rd| jj› d�d| jj› d�d| jj› d�d| jj› d�g}| jd k	rÒ|d| jj› d�d| jj› d�g7 }| j	d k	�r|d| j	j› d�d| j	j› d�g7 }|S d| j› d�d| j› d�gS d S )NrÂ   r  rô  )
rs   r2   r—  rÆ   r˜  r1   r‡  r?  r    r]  )r2  r  rX   rX   rY   Úgen_op_headers„	  s<    
þ
þü
þþþzPgen_source_files.<locals>.functionalization_env_callable.<locals>.gen_op_headers)r  Úfunc_definitionsÚfunc_registrations)
r   r0   r1   r2   r	   rž   r   r   r)   r´   )r2  r%  )r`   r  rX   rY   Úfunctionalization_env_callable�	  s    þ(þýúz8gen_source_files.<locals>.functionalization_env_callablec                 S   s   i | ]}|j j|“qS rX   ©rh   r�   r�  rX   rX   rY   Ú
<dictcomp>Â	  s   ÿ z$gen_source_files.<locals>.<dictcomp>c                 S   s   t |  ¡ ƒS r»   ©rt   rð  ©r2  rX   rX   rY   rm   Ä	  rn   c                 S   s   i | ]}|j j|“qS rX   r)  r�  rX   rX   rY   r*  Æ	  s     c                 S   s   t |  ¡ ƒS r»   r+  r,  rX   rX   rY   rm   Ç	  rn   zRegisterFunctionalization.cppr¨  r  r&  r'  Zfunc_add_back_views_definitionsZ!func_add_back_views_registrations)r!  r"  r#  r$  zFunctionalInverses.hc                      s   dt t‡ fdd„ˆƒƒiS )NZview_inverse_declarationsc                    s
   t ˆ | ƒS r»   )r    r,  r  rX   rY   rm   á	  s    ÿz4gen_source_files.<locals>.<lambda>.<locals>.<lambda>)rt   rF   rX   )r  r  rX   rY   rm   Þ	  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 | ]2}d   dd„ |jdk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�  rX   rX   rY   rÜ   þ	  s   ûú@gen_source_files.<locals>.<lambda>.<locals>.<listcomp>.<genexpr>N)rÈ   r˜  r—  ©r±   r2  rX   rX   rY   r³   ý	  s   ö
ùz6gen_source_files.<locals>.<lambda>.<locals>.<listcomp>c                 S   s,   g | ]$}d   dd„ |j|j|jfD ƒ¡‘qS )rª   c                 s   s.   | ]&}|d k	rd|j krd|j› d�V  qd S )Nrœ  rÂ   rô  )r†   rÆ   r�  rX   rX   rY   rÜ   
  s    
þr-  )rÈ   r    r]  r‡  r.  rX   rX   rY   r³   

  s   û
þ)r  Z#CompositeViewCopyKernel_DefinitionsZ(GeneratedCompositeFunctional_DefinitionsZ!GeneratedCompositeOut_Definitions)rt   rF   r!   r)   r·   r=   r>   rX   )r`   rÑ  r  rX   rY   rm   ü	  s<    õúóÿÿúÿ
þÿþÿÚ)"r,   r	   rž   r   rt   rs   r0   r_  r‡  ry   rÇ   r)   rµ   rÇ  rí  r?  Zufunc_inner_loopr.   rh   r�   ÚCPUru   ÚCUDAr   rì  r@   r“  rÐ  r   r1   r2   Zwrite_shardedrÍ   rB   )r_   r¢  rÑ  r  r  rÒ  r`   r  rÓ  r  rÔ  r¥  rÕ  rº  r  r  r»  r¹  Zns_grouped_native_functionsZgrouped_native_functionr_  r¼  r  rË  r  r(  Z
all_groupsZstructured_mapZview_mapr–   rX   )rÍ  rº   r`   r  r  rp   rÂ  r  rÕ  r2  r¢  r�   r_   r  r  rº  rÌ  r  r»  rÒ  rÑ  r  rY   Úgen_source_filesv  s   
 *ÿýÿ÷
ý
ý
ý
ý  ÿýþþ

 ÿÿýí
þþ9ÿþ
þÿûúþþr1  )rÓ  r_   rg   c                    s   |   d‡ fdd„¡ d S )NzDeclarations.yamlc                      s   t dd„ ˆ D ƒƒS )Nc                 S   s   g | ]}t |ƒ‘qS rX   )r…  r�  rX   rX   rY   r³   1
  s     z;gen_declarations_yaml.<locals>.<lambda>.<locals>.<listcomp>)rU  rX   r  rX   rY   rm   1
  rn   z'gen_declarations_yaml.<locals>.<lambda>)rì  )rÓ  r_   rX   r  rY   Úgen_declarations_yaml,
  s    
þr2  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ÚresolverX   rX   rX   rY   Úget_torchgen_root5
  s    r8  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� | 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d,d-dd.d� | jd/tdd0d1d2gd0d1d2gd3d4� |  ¡ ‰tˆjˆjƒ}tj	 
ˆjd5¡}tj	 
ˆjd6¡}d7d8lm} tƒ }ˆj�s„| tj¡ tj|k�r„|| tj¡= t|||ƒ}t| }|j|j }‰ t|ƒ}	d9d:„ |	D ƒ}
t|ƒ}d;d:„ |D ƒ}ˆj› d<�}t |¡jd=d=d>� ˆj› d?�}t |¡jd=d=d>� tˆ|d@�}tˆdA�}tˆdA�}tˆdA�}tˆ|d@�}tjtj tj!tj"tj#tj$tj%h}ˆj�r|| tj¡ ˆj&�r–‡fdBd:„|D ƒ}g }ˆj'�râ‡ fdCd:„ˆj'D ƒ}ˆj'D ]$}t (|¡}||k�r¼| |¡ �q¼d1ˆj)k�r t*||	|
|||ˆ ||||||ˆj+ˆj,ˆj-ˆj.dD� d0ˆj)k�rVt/|||	|
||ˆ ||||||ˆj+ˆj-dE� d2ˆj)k�rnt0||dF� ˆj1�ræt ˆj1¡ 2¡ }|j3}|j4}|dGf|dHf|dIf|dJf|dKffD ]0\}}|| }|j5||  }| 6|t|ƒ¡ �q´d S )LNzGenerate ATen source files)Údescriptionz-sz--source-pathz!path to source directory for ATenzaten/src/ATen)ÚhelprÒ   z-oz--output-dependenciesz:output a list of dependencies into the given file and exit)r:  z	--dry-runÚ
store_truez5run without writing any files (still updates outputs))Úactionr:  z--per-operator-headersz2generate separate headers per operator in ATen/opsz-dz--install-dirz--install_dirzoutput directoryzbuild/aten/src/ATenz--rocmz=reinterpret CUDA as ROCm/HIP and adjust filepaths accordinglyz--mpsz'Generate MPS registration code when setz--op-registration-whitelistz--op_registration_whitelistÚ*z–filter op registrations by the whitelist (if set); each item is `namespace`::`operator name` without overload name; e.g.: aten::empty aten::conv2d ...)Únargsr:  z--op-selection-yaml-pathz--op_selection_yaml_pathaD  Provide a path to the operator selection (for custom build) YAML that contains the information about the set of selected operators and their categories (training, ...). Each operator is either a full operator name with overload or just a bare operator name. The operator names also contain the namespace prefix (e.g. aten::)z--backend-whitelistz--backend_whitelistzRfilter dispatch backend by the whitelist (if set), e.g.: CPU CUDA QuantizedCPU ...z--static-dispatch-backendz--static_dispatch_backendz?generate static dispatch code for the specific backend (if set)z!--skip-dispatcher-op-registrationz!--skip_dispatcher_op_registrationz0Avoid registering operators into the dispatcher.z--force-schema-registrationz--force_schema_registrationz}force it to generate schema-only registrations for all ops, includingthose that are not listed on --op-registration-whitelistz
--generater  ÚsourcesZdeclarations_yamlzGenerate only a subset of files)rÕ   r>  ÚchoicesrÒ   r:  znative/native_functions.yamlznative/tags.yamlr   )r¥  c                 S   s   g | ]}t |tƒr|‘qS rX   )rs   r1   r.  rX   rX   rY   r³   ¹
  s    
 zmain.<locals>.<listcomp>c                 S   s   g | ]}t |tƒr|‘qS rX   )rs   r2   r.  rX   rX   rY   r³   ¿
  s   
þz/coreT)ÚparentsÚexist_okz/ops)ÚoptionsÚinstall_dir©rC  c                    s&   g | ]}t |ƒst|ƒˆ jkr|‘qS rX   )r-   rž   Úbackend_whitelist)r±   r�   rE  rX   rY   r³   é
  s    þc                    s   g | ]}ˆ t  |¡ ‘qS rX   )r)   Úparse)r±   Úkeyr  rX   rY   r³   ñ
  s   ÿ)r_   r¢  rÑ  r  r  rÒ  r`   r  rÓ  r  rÔ  r¥  rÕ  rº  r  r  r»  )r_   rc   r¢  rÑ  rÒ  r  r`   r  rÓ  rÔ  rï  r¥  rÕ  rº  r  )r_   rÓ  rˆ   Zcpu_vec_Zcore_Zcuda_Zops_)7ÚargparseÚArgumentParserÚadd_argumentrž   Ú
parse_argsr”  Zop_registration_whitelistr’  Úosre   rÈ   Úsource_pathÚtorchgen.modelr¥  r‰   ZmpsrŒ   r)   ZMPSrr   r›   r’   r_   r`   r   r›  rD  r3  r4  ÚmkdirrE   r/  r0  r´   rµ   r¶   r·   r  rF  Zstatic_dispatch_backendrG  Úgenerater1  rº  r  r  r»  r  r2  Zoutput_dependenciesr7  r�   Ústemr6  Zwrite_outputs)Úparserr  Znative_yaml_pathr™   r¥  rd   Zparsed_yamlrc   r_   r¢  rÑ  Z!native_functions_with_view_groupsr  Zcore_install_dirZops_install_dirr  rÓ  r  rÔ  rï  rÕ  rÒ  rH  Zdp_keyZdepfile_pathZdepfile_nameZdepfile_stemr¹  r+  Úvarnamere   rX   )r`   rC  rY   Úmain=
  s†   üýýýûýýüý	üüüüú	þþÿÿþ


ù	
þ
þ


ïñûrU  Ú__main__)Nra   F)ra   )N)¥rI  Ú	functoolsrŽ  rM  r3  Úcollectionsr   r   r   Údataclassesr   Útypingr   r   r   r	   r
   r   r   r   r   r   r   r”   Ztorchgen.api.dispatcherÚapir�  Ztorchgen.api.metar@  Ztorchgen.api.nativerN  Ztorchgen.api.structuredr�   Ztorchgen.destrÃ  Ztorchgen.apir   Ztorchgen.api.translater   Ztorchgen.api.typesr   r   r   r   r   r   r   Ztorchgen.contextr   r   r   r   Z#torchgen.gen_functionalization_typer   r   r    r!   Ztorchgen.gen_vmap_plumbingr#   rO  r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   Z#torchgen.native_function_generationr<   r=   r>   r?   Z!torchgen.selective_build.selectorr@   Ztorchgen.utilsrA   rB   rC   rD   rE   rF   rG   rH   Ztorchgen.yaml_utilsrI   rJ   rK   rL   rš   r’   r^   Úobjectrž   rv  rƒ   rŽ   Ú	lru_cacher—   r›   rz   r¯   r¹   rÁ   rÊ   rÍ   rà   rò   ró   r   r  r  r  r*  r/  r0  rH  rK  rL  rU  rY  r^  ra  rj  rt  rs  r…  rˆ  r�  r”  r›  r   rÿ  r§  rµ  r·  r¸  rÇ  rÊ  rÐ  rî  r  r  r1  r2  r4  r8  rU  rZ   rX   rX   rX   rY   Ú<module>   s  4$	h(
!   û
ú.
 ýú
ù ' þ þ
ý$
ü
ü
üL`/-|DþD
ù!
ù$Y 
þ#
ý þ/þú
ÿùý"ú
ÿù
 þõiø4ü&
ó{
ó E
ï 
í   : þ	 z
