U
    •Ê¹jfW  ã                   @   s&  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
mZmZmZmZ d dlZd dlm  mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZ d dlmZm Z m!Z!m"Z"m#Z#m$Z$ d d	l%m&Z& d d
l'm(Z(m)Z)m*Z*m+Z+m,Z, d dl-m.Z. eddddddgƒZ/e0eee"e#f  e	e!ef e/dœdd„Z1d)ee" e	e!ef e!ee! e0e0ee
e$  ddœdd„Z2ddœdd„Z3d*e*e0e0e	e!ef eee"e#f  e!ee! e0ddœ	dd„Z4d+e*e0e0e	e!ef eee"e#f  e!e!d!e5e5e0e5dd"œd#d$„Z6d,e0e0e5ee0 dd%œd&d'„Z7e8d(k�r"e3ƒ  dS )-é    N)ÚCounterÚdefaultdictÚ
namedtuple)ÚDictÚListÚOptionalÚSequenceÚSetÚUnion)ÚDispatcherSignature)ÚCodeTemplate)Únative_function_manager)Úget_grouped_native_functionsÚparse_native_yaml)ÚBackendIndexÚBackendMetadataÚDispatchKeyÚNativeFunctionÚNativeFunctionsGroupÚOperatorName)ÚSelectiveBuilder)Ú	concatMapÚcontextÚFileManagerÚNamespaceHelperÚTarget)Ú
YamlLoaderÚParsedExternalYamlÚbackend_keyÚautograd_keyÚ
class_nameÚcpp_namespaceÚbackend_indices)Úbackend_yaml_pathÚgrouped_native_functionsr"   Úreturnc              
      s$  dd„ t dd„ |ƒD ƒ‰t| ƒ�}tj|td�}W 5 Q R X t|tƒsHt‚dddd	d
dddddg
}| dd ¡‰ˆd k	s|tdƒ‚| dd ¡}| dd ¡‰ˆd k	s¤tdƒ‚| dd¡}t|t	ƒsÈtd|› �ƒ‚| dd¡}t|t	ƒsìtd|› �ƒ‚| d
g ¡}	|	d k�rg }	t|	t
ƒ�s,td|	› dt|	ƒ› d�ƒ‚| dg ¡}
|
d k�rFg }
t|
t
ƒ�sltd|	› dt|	ƒ› d�ƒ‚t|
ƒ}| dg ¡}t|t
ƒ�sštd|› �ƒ‚| dg ¡}|	 |¡ | di ¡}| di ¡}t| ¡ ƒdk�st| › dd | ¡ ¡› dd |¡› �ƒ‚tt tt tt	t	td œ‡‡fd!d"„}d ‰t|	ƒdk�rˆt‡fd#d„ƒ� t ˆ¡‰W 5 Q R X ||	|ˆ||d$�}ˆˆk�s€t‚|ˆˆ< d ‰ t|ƒdk�rît‡fd%d„ƒ� t d&ˆ› �¡‰ W 5 Q R X |||ˆ ||d$�}ˆ ˆk�sæt‚|ˆˆ < |D �]}t|tƒ�rVˆd k�rg nd'd(„ ˆˆ  |¡fD ƒ}ˆ d k�r:g nd)d(„ ˆˆ   |¡fD ƒ}n`ˆd k�rdg n d*d(„ ‡‡fd+d(„| ¡ D ƒD ƒ}ˆ d k�r”g n d,d(„ ‡ ‡fd-d(„| ¡ D ƒD ƒ}d.d(„ |D ƒ}d/d(„ |D ƒ}t|ƒdk�sòt|ƒdk�sòtd0|d j› d1|d j› d2�ƒ‚�qòtˆˆ |ˆˆƒS )3Nc                 S   s   i | ]}|j j|“qS © )ÚfuncÚname©Ú.0Úfr&   r&   úY/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torchgen/gen_backend_stubs.pyÚ
<dictcomp>*   s   ÿ z&parse_backend_yaml.<locals>.<dictcomp>c                 S   s   t | tƒr| gS t|  ¡ ƒS ©N)Ú
isinstancer   ÚlistÚ	functions©r+   r&   r&   r,   Ú<lambda>-   ó    z$parse_backend_yaml.<locals>.<lambda>)ÚLoaderÚbackendr    r!   Úextra_headersÚ	supportedZautogradÚfull_codegenÚ
non_nativeZir_genÚsymintz&You must provide a value for "backend"z,You must provide a value for "cpp_namespace"Úuse_out_as_primaryFzHYou must provide either True or False for use_out_as_primary. Provided: Údevice_guardzBYou must provide either True or False for device_guard. Provided: z,expected "supported" to be a list, but got: z
 (of type ú)z)expected "symint" to be a list, but got: z+expected "autograd" to be a list, but got: r   z contains unexpected keys: z, z). Only the following keys are supported: )Úbackend_opsÚ
symint_opsÚdispatch_keyr<   Úuse_device_guardr%   c          
         sv   i }| D ]Z}t  |¡}|ˆks,td|› �ƒ‚t ˆ| j¡}||krL|d7 }t|dˆ d�}	|	||< qt||d||d�S )Nz Found an invalid operator name: Z_symintF)ÚkernelZ
structuredr!   T)rA   r<   Zexternalr=   Úindex)r   ÚparseÚAssertionErrorÚ
dispatcherr(   r'   r   r   )
r?   r@   rA   r<   rB   ÚmetadataÚopÚop_nameZkernel_nameÚm)r!   Únative_functions_mapr&   r,   Úcreate_backend_indexy   s.    
ÿþ  ÿ
ûz0parse_backend_yaml.<locals>.create_backend_indexc                      s   dˆ › d�S )NzFThe provided value for "backend" must be a valid DispatchKey, but got Ú.r&   r&   ©r6   r&   r,   r3   ›   r4   )r<   rB   c                      s   dˆ › d�S )Nz The "autograd" key was specified, which indicates that you would like to override the behavior of autograd for some operators on your backend. However "Autogradz" is not a valid DispatchKey.r&   r&   rO   r&   r,   r3   ¬   s   ÿZAutogradc                 S   s   g | ]}|d k	r|‘qS r.   r&   ©r*   rK   r&   r&   r,   Ú
<listcomp>À   s   þz&parse_backend_yaml.<locals>.<listcomp>c                 S   s   g | ]}|d k	r|‘qS r.   r&   rP   r&   r&   r,   rQ   É   s   þc                 S   s   g | ]}|d k	r|‘qS r.   r&   rP   r&   r&   r,   rQ   Ó   s   ûc                    s   g | ]}ˆ ˆ   |¡‘qS r&   ©Ú
get_kernelr)   )r"   r   r&   r,   rQ   Õ   s   ÿc                 S   s   g | ]}|d k	r|‘qS r.   r&   rP   r&   r&   r,   rQ   ß   s   ûc                    s   g | ]}ˆˆ    |¡‘qS r&   rR   r)   )r   r"   r&   r,   rQ   á   s   ÿc                 S   s   g | ]}|d k	r|‘qS r.   r&   r)   r&   r&   r,   rQ   é   s      c                 S   s   g | ]}|d k	r|‘qS r.   r&   r)   r&   r&   r,   rQ   ê   s      zÊCurrently, all variants of an op must either be registered to a backend key, or to a backend's autograd key. They cannot be mix and matched. If this is something you need, feel free to create an issue! z" is listed under "supported", but z is listed under "autograd".)r   ÚopenÚyamlÚloadr   r/   ÚdictrF   ÚpopÚboolr0   ÚtypeÚsetÚextendÚlenÚkeysÚjoinr   Ústrr	   r   r   r   rE   r   rS   r1   rC   r   )r#   r$   r"   r+   Zyaml_valuesZ
valid_keysr    r<   rB   r8   r;   Z
symint_setZsupported_autogradr9   r:   Ú_rM   Zbackend_idxZautograd_idxÚgZforward_kernelsZbackward_kernelsr&   )r   r6   r"   r   r!   rL   r,   Úparse_backend_yaml%   sB   þþ
ö ÿþ ÿþ
 ÿþ
 ÿþ ÿþ
ÿÿþù
ÿû
ÿû
ÿþýÿþýÿþþýÿþþý
ÿ
ÿþþþ    ÿrc   )Únative_functionsr"   r   r   r    Úkernel_defn_file_pathr9   r%   c                    s”  z t |ƒ�}| ¡ }W 5 Q R X W n2 tk
rR }	 ztd|› �ƒ|	‚W 5 d }	~	X Y nX ˆd kr`g ‰|| jg|d krvg n
|| jg }
tttdd„ |
ƒƒƒ‰‡‡fdd„| D ƒ}ttƒ}|D ]}|ˆ|j	j
   |¡ qºd|› d�}tdd„ t ||¡D ƒƒ}d	}| ¡ D ]t\}}t|ƒ}|| }||k�rttd
œdd„‰ d ‡ fdd„|D ƒ¡}|d|› d|› d|› d|› d|› d�7 }�q|d	k�s�t|ƒ‚d S )Nz2Unable to read from the specified impl_path file: c                 S   s   dd„ |   ¡ D ƒS )Nc                 S   s   g | ]\}}||j f‘qS r&   )rC   )r*   rJ   rH   r&   r&   r,   rQ     s    z>error_on_missing_kernels.<locals>.<lambda>.<locals>.<listcomp>)Úitems)rD   r&   r&   r,   r3     s   ÿz*error_on_missing_kernels.<locals>.<lambda>c                    s,   g | ]$}|j jˆ  ¡ kr|j jˆkr|‘qS r&   )r'   r(   r^   r)   )Úexpected_backend_op_namesr9   r&   r,   rQ     s   ýz,error_on_missing_kernels.<locals>.<listcomp>z(.*)z::\s*([\w\d]*)\(c                 S   s   g | ]\}}|  d ¡s|‘qS )ú:)Úendswith)r*   ÚxÚyr&   r&   r,   rQ   0  s   
þÚ )r+   r%   c              
   S   s0   t | ƒ� t | j¡ ¡ W  5 Q R £ S Q R X d S r.   )r   r   Zfrom_schemar'   Údeclr2   r&   r&   r,   Úcreate_decl=  s    
z-error_on_missing_kernels.<locals>.create_declÚ
c                    s   g | ]}ˆ |ƒ‘qS r&   r&   r)   )rn   r&   r,   rQ   A  s     z$ is missing a kernel definition for z. We found z( kernel(s) with that name,
but expected zH kernel(s). The expected function schemas for the missing operator are:
z

)rT   ÚreadÚOSErrorrF   rD   rW   r0   r   r   r'   r(   Úappendr   ÚreÚfindallrf   r]   r   r`   r_   )rd   r"   r   r   r    re   r9   r+   Zbackend_defnsÚeÚindicesZexpected_backend_native_funcsZ#expected_backend_kernel_name_countsZnative_fZkernel_defn_regexZ!actual_backend_kernel_name_countsZmissing_kernels_err_msgZexpected_nameÚfuncsZexpected_overload_countZactual_overload_countZexpected_schemas_strr&   )rn   rg   r9   r,   Úerror_on_missing_kernelsö   sv    	
ÿþ
ÿüÿÿ
þÿ
ÿþ
þû
ÿÿÿþýrx   )r%   c                  C   sz   t jdd�} | jddddd� | jdd	d
dd� | jddtddd� | jddtd dd� |  ¡ }t|j|j|j	|j
ƒ d S )NzGenerate backend stub files)Údescriptionz-sz--source-yamlz--source_yamlzApath to source yaml file containing operator external definitions)Úhelpz-oz--output-dirz--output_dirzoutput directoryz	--dry-runz	--dry_runF)rZ   Údefaultrz   z--impl-pathz--impl_pathz9path to the source C++ file containing kernel definitions)ÚargparseÚArgumentParserÚadd_argumentrY   r`   Ú
parse_argsÚrunÚsource_yamlÚ
output_dirÚdry_runÚ	impl_path)ÚparserÚoptionsr&   r&   r,   ÚmainK  s0    ü    ÿûr‡   rl   )	Úfmr    r!   r"   r$   Úbackend_dispatch_keyÚautograd_dispatch_keyÚbackend_namer%   c                    s|   ˆd k	st ‚d‰ttt‡‡fdd„|ƒƒƒ‰ttt‡‡fdd„|ƒƒƒ‰ t|ƒ‰|  ˆ› d�d‡ ‡‡‡‡‡‡fdd„¡ d S )NzAAutogenerated file by gen_backend_stubs.py. Do not edit directly!c                    s   t  | ˆˆ  ¡S r.   ©ÚdestZ#compute_native_function_declarationr2   )r‰   r"   r&   r,   r3   x  s    ÿz4gen_dispatchkey_nativefunc_headers.<locals>.<lambda>c                    s   ˆ d krg S t  | ˆˆ  ¡S r.   rŒ   r2   )rŠ   r"   r&   r,   r3   ‚  s    ÿ ÿúNativeFunctions.hzDispatchKeyNativeFunctions.hc                      s   ˆˆj ˆˆjˆˆ  ˆˆdœS )N)Úgenerated_commentZnamespace_prologuer    Znamespace_epilogueZdispatch_declarationsZBackendNamer   )ÚprologueÚepiloguer&   )Úautograd_declarationsÚbackend_declarationsr‰   r‹   r    r�   Ú	ns_helperr&   r,   r3   �  s    ù)rF   Úsortedr[   r   r   Úwrite_with_template)rˆ   r    r!   r"   r$   r‰   rŠ   r‹   r&   )	r’   rŠ   r“   r‰   r"   r‹   r    r�   r”   r,   Ú"gen_dispatchkey_nativefunc_headersc  s2    
ÿüÿÿ
úÿÿýr—   FTr   )rˆ   r‚   r    r"   r$   r‰   rA   ÚselectorÚbuild_in_treeÚper_operator_headersr‹   Úeager_registrationr%   c                    sü   |› d|› d�g}|r,d  dd„ |D ƒ¡‰nd  dd„ |D ƒ¡‰ˆd k	sLt‚|ˆ ‰ tttjˆ tjˆ
ddˆ› dd	�ˆƒƒ}d‰td
d�‰d‰d‰|r¬t	dƒ}|j
ˆ|d�‰nt	dƒ}|j
|
ˆ|d�‰ˆ dˆ› d�d‡ ‡‡‡‡‡‡‡‡‡	‡
‡fdd„¡ d S )Nú/rŽ   ro   c                 s   s   | ]}d |› d�V  qdS )z
#include <ú>Nr&   ©r*   Úhr&   r&   r,   Ú	<genexpr>¯  s     z/gen_dispatcher_registrations.<locals>.<genexpr>c                 s   s   | ]}d |› d�V  qdS )z
#include "ú"Nr&   rž   r&   r&   r,   r    ±  s     FT©Úrocmr;   Zclass_method_nameZskip_dispatcher_op_registrationÚat)Znamespace_strrl   zPTORCH_LIBRARY_IMPL(aten, $dispatch_key, m) {
    $dispatch_registrations_body
};)rA   Údispatch_registrations_bodyzõTORCH_API void Register${backend_name}${dispatch_key}NativeFunctions();
TORCH_API void Register${backend_name}${dispatch_key}NativeFunctions() {
    static auto m = MAKE_TORCH_LIBRARY_IMPL(aten, $dispatch_key);
    $dispatch_registrations_body
})r‹   rA   r¥   ZRegisterz.cppzRegisterDispatchKey.cppc                      sP   dˆˆ	sdndˆˆ  ¡ tjˆ ˆ	dd�ˆ d‡ ‡‡‡‡‡‡
‡fdd„¡ ˆ¡dœS )	Nrl   z#include <ATen/Functions.h>F)rš   r£   zRegisterDispatchDefinitions.inic                      sF   ˆj ˆjˆˆt ˆ ¡ˆ ¡ dtttjˆ tj	ˆddˆ› dd�ˆƒƒdœS )Nrl   FTr¢   )Zns_prologueZns_epilogueÚ"static_init_dispatch_registrationsÚdeferred_dispatch_registrationsZdispatch_helpersÚdispatch_namespaceZdispatch_namespaced_definitionsZdispatch_anonymous_definitions)
r�   r‘   r�   Zgen_registration_helpersÚlowerr0   r   ÚRegisterDispatchKeyr   ZANONYMOUS_DEFINITIONr&   )Úbackend_indexr    r§   rA   r$   r”   r˜   r¦   r&   r,   r3   ò  s,    ù	öÿøz@gen_dispatcher_registrations.<locals>.<lambda>.<locals>.<lambda>)Zextra_cuda_headersZexternal_backend_headersZops_headersr   r¨   Zdispatch_headersZdispatch_definitions)r©   r�   Zgen_registration_headersZsubstitute_with_templateÚsplitr&   ©r«   r    r§   rA   Zexternal_backend_headers_strrˆ   r$   Únewliner”   rš   r˜   r¦   r&   r,   r3   å  s&    ÿ  ÿþçõz.gen_dispatcher_registrations.<locals>.<lambda>)r_   rF   r0   r   r�   rª   r   ZREGISTRATIONr   r   Ú
substituter–   )rˆ   r‚   r    r"   r$   r‰   rA   r˜   r™   rš   r‹   r›   Úheadersr¥   Zstatic_templateZdeferred_templater&   r­   r,   Úgen_dispatcher_registrationsœ  s\    ÿù	öÿ
ÿþÿý
 ýr±   )r�   r‚   rƒ   r„   r%   c              
      s@  t  t¡jj ¡ }tj |d¡‰tt	dœ‡ ‡fdd„}||ƒ}tj |d¡}tj |d¡}t
||ƒ}	|	j|	j }
}t|
ƒ}t| ||ƒ}|j}|j}|j}|j}|j}t ¡ }|d kr¸d S |d krÌ||  ¡ }|d k	sØt‚|d k	ròt|
|||||ƒ t|||||||ƒ |d k�r|gn||gD ]}t||||||||ƒ �qd S )Nzaten/src/ATen/templates)Úinstall_dirr%   c                    s   t | ˆˆ d�S )N)r²   Útemplate_dirrƒ   )r   )r²   ©rƒ   r³   r&   r,   Úmake_file_manager  s
      ÿzrun.<locals>.make_file_managerz*aten/src/ATen/native/native_functions.yamlzaten/src/ATen/native/tags.yaml)ÚpathlibÚPathÚ__file__ÚparentÚabsoluteÚosÚpathr_   r`   r   r   rd   r"   r   rc   r   r   r!   r    r   Zget_nop_selectorZnative_function_class_namerF   rx   r—   r±   )r�   r‚   rƒ   r„   Zpytorch_rootrµ   rˆ   Znative_yaml_pathZtags_yaml_pathZparsed_yamlrd   r"   r$   Zparsed_backend_yamlr   r   r!   r    r˜   rA   r&   r´   r,   r€     sx     ÿ
þ  ÿú	ùÿør€   Ú__main__)N)rl   )FFrl   T)N)9r|   r»   r¶   rs   Úcollectionsr   r   r   Útypingr   r   r   r   r	   r
   rU   Ztorchgen.api.dispatcherÚapirG   Ztorchgen.destr�   Ztorchgen.api.typesr   Ztorchgen.code_templater   Ztorchgen.contextr   Ztorchgen.genr   r   Ztorchgen.modelr   r   r   r   r   r   Z!torchgen.selective_build.selectorr   Ztorchgen.utilsr   r   r   r   r   Ztorchgen.yaml_utilsr   r   r`   rc   rx   r‡   r—   rY   r±   r€   Ú__name__r&   r&   r&   r,   Ú<module>   sž     þ
ü Y ù

øU  ø
÷C    ó
òs ÿ   þR
