
    Χg3W                       d dl m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 d dlZd dlmc 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g d          Z-d>dZ.	 d?d@d#Z/dAd$Z0	 dBdCd,Z1	 	 	 	 dDdEd7Z2	 d?dFd<Z3e4d=k    r e0             dS dS )G    )annotationsN)Counterdefaultdict
namedtuple)Path)Sequence)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strgrouped_native_functions/Sequence[NativeFunction | NativeFunctionsGroup]r    dict[DispatchKey, BackendIndex]returnc                :
   d t          d |          D             t          |           5 }t          j        |t                    }d d d            n# 1 swxY w Y   t          |t                    sJ g d}|                    dd           
J d            |                    dd           }|                    dd           
J d	            |                    d
d          }t          |t                    sJ d|             |                    dd          }t          |t                    sJ d|             |                    dg           }	|	g }	t          |	t                    sJ d|	 dt          |	           d            |                    dg           }
|
g }
t          |
t                    sJ d|	 dt          |	           d            t          |
          }|                    dg           }t          |t                    sJ d|             |                    dg           }|	                    |           |                    di            |                    di            t          |                                          dk    sJJ |  dd                    |                                           dd                    |                       d8fd(}d t          |	          dk    rYt!          fd)          5  t#          j                  d d d            n# 1 swxY w Y    ||	|||*          }vsJ |<   d t          |          dk    r\t!          fd+          5  t#          j        d,           d d d            n# 1 swxY w Y    |||||*          }vsJ |<   |D ]0}t          |t&                    rUg n%d-                              |          fD             }g n%d.                              |          fD             }n^g n*d/ fd0|                                D             D             }g n*d1 fd2|                                D             D             }d3 |D             }d4 |D             }t          |          dk    s:t          |          dk    s'J d5|d         j         d6|d         j         d7            2t/          |          S )9Nc                (    i | ]}|j         j        |S  )funcname.0fs     V/var/www/html/ai-engine/env/lib/python3.11/site-packages/torchgen/gen_backend_stubs.py
<dictcomp>z&parse_backend_yaml.<locals>.<dictcomp>,   s4     @ @ @ 	
Q@ @ @    c                t    t          | t                    r| gn t          |                                           S N)
isinstancer   list	functionsr.   s    r/   <lambda>z$parse_backend_yaml.<locals>.<lambda>/   s+    Z>::SqccQ[[]]@S@S r1   )Loader)
backendr   r   extra_headers	supportedautogradfull_codegen
non_nativeir_gensymintr:   z&You must provide a value for "backend"r   r   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: r<   z,expected "supported" to be a list, but got: z
 (of type )rA   z)expected "symint" to be a list, but got: r=   z+expected "autograd" to be a list, but got: r>   r?   r@   r   z contains unexpected keys: z, z). Only the following keys are supported: backend_ops	list[str]
symint_opsset[str]dispatch_keyr   booluse_device_guardr&   r   c                  i }| D ]f}t          j        |          }|v sJ d|             t          j        |         j                  }||v r|dz  }t          |d
          }	|	||<   gt          ||d||          S )Nz Found an invalid operator name: _symintF)kernel
structuredr   T)rI   rB   externalrC   index)r   parse
dispatcherr+   r*   r   r   )rE   rG   rI   rB   rK   metadataopop_namekernel_namemr   native_functions_maps             r/   create_backend_indexz0parse_backend_yaml.<locals>.create_backend_index{   s     9; 	" 	"B"(,,G////;';; 0// %/*>w*G*LMMKZy("uM  A !"HW%1)
 
 
 	
r1   c                     d  dS )NzFThe provided value for "backend" must be a valid DispatchKey, but got .r)   r:   s   r/   r8   z$parse_backend_yaml.<locals>.<lambda>   s    g]dggg r1   )rB   rK   c                     d  dS )NzThe "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]   s   r/   r8   z$parse_backend_yaml.<locals>.<lambda>   s      vOVv v v r1   Autogradc                    g | ]}||S r3   r)   r-   rX   s     r/   
<listcomp>z&parse_backend_yaml.<locals>.<listcomp>   %       } $}}r1   c                    g | ]}||S r3   r)   ra   s     r/   rb   z&parse_backend_yaml.<locals>.<listcomp>   rc   r1   c                    g | ]}||S r3   r)   ra   s     r/   rb   z&parse_backend_yaml.<locals>.<listcomp>   )        } 
 %}}r1   c                F    g | ]}                              |          S r)   
get_kernel)r-   r.   r    r   s     r/   rb   z&parse_backend_yaml.<locals>.<listcomp>   s<        (4??BB  r1   c                    g | ]}||S r3   r)   ra   s     r/   rb   z&parse_backend_yaml.<locals>.<listcomp>   rf   r1   c                F    g | ]}                              |          S r)   rh   )r-   r.   r   r    s     r/   rb   z&parse_backend_yaml.<locals>.<listcomp>   s<        (5@@CC  r1   c                    g | ]}||S r3   r)   r,   s     r/   rb   z&parse_backend_yaml.<locals>.<listcomp>   s    GGG1r1   c                    g | ]}||S r3   r)   r,   s     r/   rb   z&parse_backend_yaml.<locals>.<listcomp>   s    III!1=A===r1   zCurrently, 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".)rE   rF   rG   rH   rI   r   rB   rJ   rK   rJ   r&   r   )r   openyamlloadr   r4   dictpoprJ   r5   typesetextendlenkeysjoinr   r   rR   r   ri   r6   rN   r   )r!   r#   r    r.   yaml_values
valid_keysr   rB   rK   r<   rA   
symint_setsupported_autogradr>   rZ   backend_idxautograd_idxgforward_kernelsbackward_kernelsr   r:   r   r   rY   s     `                 @@@@@r/   parse_backend_yamlr   '   s&   
@ @SS$
 
@ @ @ 
	 	  6Ai*5556 6 6 6 6 6 6 6 6 6 6 6 6 6 6k4(((((  J ooi..G Ht44JOOOT::M$$&T$$$ %)=uEED  g gfRdffg g g #~u==$  _ _^L\^^_ _ _ R00I	4  ^ ^]i]]4PY??]]]^ ^ ^ __Xr**F~  [ [Z9ZZYZZZ[ [ [ VJ$R88D  J JI5GIIJ J J
 ??>266L\""" OOL"%%% OOHb!!! 	K1$$$
 @ @		+BRBRBTBT8U8U @ @(,		*(=(=@ @ 	%$$
 
 
 
 
 
 
> '+K
9~~gggg
 
 	5 	5 &+G44K	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5
 +*1-
 
 
 /1111'2$'+L
""v v v v
 
 	C 	C ',-A-A-ABBL		C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C ,+1-
 
 
 ?2222(4%% 4w 4wa(( +	 &  -k:EEaHHI     '  -l;FFqIIJ    &      !"       '      !"      HGoGGGII'7III  A%%-=)>)>!)C)C)Cww w>Nq>Q>Xw w w *D)C)C
 \:}o  s5   AA AL??MMN00N47N4native_functionsSequence[NativeFunction]r   r   r   DispatchKey | Noner   kernel_defn_file_pathr>   list[OperatorName] | NoneNonec                   	 t          |          5 }|                                }d d d            n# 1 swxY w Y   n%# t          $ r}	t          d|           |	d }	~	ww xY wg ||         j        g|g n||         j        gz   }
t          t          t          d |
                              fd| D             }t          t                    }|D ]-}||j	        j
                                              |           .d| d}t          d t          j        ||          D                       }d}|                                D ]\\  }}t!          |          }||         }||k    r:ddd                    fd|D                       }|d| d| d| d| d| dz  }]|dk    s
J |            d S )Nz2Unable to read from the specified impl_path file: c                >    d |                                  D             S )Nc                &    g | ]\  }}||j         fS r)   )rN   )r-   rV   rT   s      r/   rb   z>error_on_missing_kernels.<locals>.<lambda>.<locals>.<listcomp>  s0       3D7HWho.  r1   )items)rQ   s    r/   r8   z*error_on_missing_kernels.<locals>.<lambda>  s(      HM   r1   c                p    g | ]2}|j         j                                        v r|j         j        v0|3S r)   )r*   r+   rw   )r-   r.   expected_backend_op_namesr>   s     r/   rb   z,error_on_missing_kernels.<locals>.<listcomp>  sP     ; ; ;6;388::::FK|++ 	
 ,++r1   z(.*)z::\s*([\w\d]*)\(c                B    g | ]\  }}|                     d           |S ):)endswith)r-   xys      r/   rb   z,error_on_missing_kernels.<locals>.<listcomp>2  s<     	
 	
 	
A::c??	
	
 	
 	
r1    r.   r   r&   r"   c                    t          |           5  t          j        | j                                                  cd d d            S # 1 swxY w Y   d S r3   )r   r	   from_schemar*   declr7   s    r/   create_declz-error_on_missing_kernels.<locals>.create_decl?  s    ,Q// J J.:16BBGGIIJ J J J J J J J J J J J J J J J J Js   +AAA
c                &    g | ]} |          S r)   r)   )r-   r.   r   s     r/   rb   z,error_on_missing_kernels.<locals>.<listcomp>C  s!    -L-L-Lkk!nn-L-L-Lr1   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

)r.   r   r&   r"   )rn   readOSErrorAssertionErrorrQ   rq   r5   r   r   r*   r+   appendr   refindallr   rv   rx   )r   r    r   r   r   r   r>   r.   backend_defnseindicesexpected_backend_native_funcs#expected_backend_kernel_name_countsnative_fkernel_defn_regex!actual_backend_kernel_name_countsmissing_kernels_err_msgexpected_namefuncsexpected_overload_countactual_overload_countexpected_schemas_strr   r   s         `               @@r/   error_on_missing_kernelsr      s    '(( 	%AFFHHM	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%   XAVXX
 
	
 {+12")F)L(MG
 :>  	 	
 	
	: 	:; ; ; ; ;!; ; ;! LWL L' 2  +%hm&89	

&




 =
<<<(/
	
 	
*%6FF	
 	
 	

) 
)% ! C I I K K  u"%e** A- P"&;;;J J J J $(99-L-L-L-Le-L-L-L#M#M # (( (1>( (K`( (%( ( ( ( ( # #b(((*A(((((s2   A 5A 9A 9A 
A#AA#c                    t          j        d          } |                     dddd           |                     dd	d
d           |                     ddt          dd           |                     ddt          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)rs   defaultr   z--impl-pathz--impl_pathz9path to the source C++ file containing kernel definitions)argparseArgumentParseradd_argumentrJ   r"   
parse_argsrunsource_yaml
output_dirdry_run	impl_path)parseroptionss     r/   mainr   M  s    $1NOOOF
P	     nnCUVVV
[tUAS     H     !!GW/'BSTTTTTr1   r   fmr   r   backend_dispatch_keyautograd_dispatch_keybackend_namec                @  	
 J d
t          t          t          fd|                              	t          t          t          fd|                              t          |          |                      dd	
fd           d S )NzAAutogenerated file by gen_backend_stubs.py. Do not edit directly!c                :    t          j        |                    S r3   dest#compute_native_function_declaration)r.   r   r    s    r/   r8   z4gen_dispatchkey_nativefunc_headers.<locals>.<lambda>z  s    $B';<  r1   c                B    g nt          j        |                    S r3   r   )r.   r   r    s    r/   r8   z4gen_dispatchkey_nativefunc_headers.<locals>.<lambda>  s0    (0 "='<=  r1   NativeFunctions.hzDispatchKeyNativeFunctions.hc                 2    j         j         z   dS )N)generated_commentnamespace_prologuer   namespace_epiloguedispatch_declarationsBackendNamer   )prologueepilogue)autograd_declarationsbackend_declarationsr   r   r   r   	ns_helpers   r/   r8   z4gen_dispatchkey_nativefunc_headers.<locals>.<lambda>  s0    !2"+"4$"+"4%9<Q%Q'/
 
 r1   )sortedrt   r   r   write_with_template)r   r   r   r    r#   r   r   r   r   r   r   r   s    ` ` ```@@@@r/   "gen_dispatchkey_nativefunc_headersr   e  s'    !!!K  "     )	 	
 	
	 	 #    
 ) 		
 		
   ..I222&	
 	
 	
 	
 	
 	
 	
 	
 	
 	
    r1   FTr   rI   selectorr   build_in_treerJ   per_operator_headerseager_registrationc                j   	 | d| dg}|r d                     d |D                       nd                     d |D                       J |         t          t          t          j        t
          j        dd d                              }dt          d	
          dd|r't          d          }|	                    |          n't          d          }|	                    |
|           
                    d dd 	fd           d S )N/r   r   c              3  "   K   | ]
}d | dV  dS )z
#include <>Nr)   r-   hs     r/   	<genexpr>z/gen_dispatcher_registrations.<locals>.<genexpr>  .      0T0Tq1Ba1B1B1B0T0T0T0T0T0Tr1   c              3  "   K   | ]
}d | dV  dS )z
#include ""Nr)   r   s     r/   r   z/gen_dispatcher_registrations.<locals>.<genexpr>  r   r1   FTrocmrA   class_method_nameskip_dispatcher_op_registrationat)namespace_strr   zPTORCH_LIBRARY_IMPL(aten, $dispatch_key, m) {
    $dispatch_registrations_body
};)rI   dispatch_registrations_bodyzTORCH_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   rI   r   Registerz.cppzRegisterDispatchKey.cppc                     d	sdnd                                 t          j         	d                              d 
fd                                        dS )Nr   z#include <ATen/Functions.h>F)r   r   zRegisterDispatchDefinitions.inic                     j         j        t          j                                                   dt          t          t          j         t          j	        dd d                              dS )Nr   FTr   )ns_prologuens_epilogue"static_init_dispatch_registrationsdeferred_dispatch_registrationsdispatch_helpersdispatch_namespacedispatch_namespaced_definitionsdispatch_anonymous_definitions)
r   r   r   gen_registration_helperslowerr5   r   RegisterDispatchKeyr   ANONYMOUS_DEFINITION)backend_indexr   r   rI   r#   r   r   r   s   r/   r8   z@gen_dispatcher_registrations.<locals>.<lambda>.<locals>.<lambda>  s    #,#5#,#5:\7V(,(Em(T(T*6*<*<*>*>796:! 4 - & ; (%*'+5?/@E   5 7 7  r1   )extra_cuda_headersexternal_backend_headersops_headersr   r   dispatch_headersdispatch_definitions)r   r   gen_registration_headerssubstitute_with_templatesplit)r   r   r   rI   external_backend_headers_strr   r#   newliner   r   r   r   s   r/   r8   z.gen_dispatcher_registrations.<locals>.<lambda>  s    "$(D'88'"."4"4"6"6 $ =4Hu! ! ! %'$?$?1          % %2 eGnnI%
 %
 r1   )rx   r5   r   r   r   r   REGISTRATIONr   r
   
substituter   )r   r   r   r    r#   r   rI   r   r   r   r   r   headersr   static_templatedeferred_templater   r   r  r  r   r   s   ` ` ` `` `      @@@@@@r/   gen_dispatcher_registrationsr    s     ??,???G  U'+yy0T0TG0T0T0T'T'T$$'+yy0T0TG0T0T0T'T'T$!!!#L1M"&$#%//05   %	
 	
# # Gd333I&(#)+& 
&
 
 .=-G-G%(C .H .
 .
**
 )
 
 +<*F*F%%(C +G +
 +
' %<%%%!%	
 %	
 %	
 %	
 %	
 %	
 %	
 %	
 %	
 %	
 %	
 %	
 %	
 %	
 %	
) ) ) ) )r1   r   r   r   
str | Nonec                   t          t                    j        j                                        }t          j                            |d          d	fd} ||          }t          j                            |d          }t          j                            |d          }t          ||          }	|	j        |	j	        }}
t          |
          }t          | ||          }|j        }|j        }|j        }|j        }|j	        }t!          j                    }|d S |||                                         }|J |t'          |
|||||           t)          |||||||           ||gn||gD ]}t+          ||||||||           d S )
Nzaten/src/ATen/templatesinstall_dirr"   r&   r   c                (    t          |           S )N)r  template_dirr   )r   )r  r   r  s    r/   make_file_managerzrun.<locals>.make_file_manager  s!    #,
 
 
 	
r1   z*aten/src/ATen/native/native_functions.yamlzaten/src/ATen/native/tags.yaml)r  r"   r&   r   )r   __file__parentabsoluteospathrx   r   r   r    r   r   r   r   r   r   r   get_nop_selectornative_function_class_namer   r   r  )r   r   r   r   pytorch_rootr  r   native_yaml_pathtags_yaml_pathparsed_yamlr   r    r#   parsed_backend_yamlr   r   r   r   r   rI   r  s     `                 @r/   r   r     s    >>(/88::L7<<.GHHL
 
 
 
 
 
 

 
	:	&	&Bw||B  W\\,0PQQN#$4nEEK$# &  <<LMM,-  &1K&3L'5M$/J)9O022H
 %[1LLNN
!!! 	
 	
 	
 '
    &-K3N
 
 	%$		
 		
 		
 		

 
r1   __main__)r!   r"   r#   r$   r    r%   r&   r   r3   )r   r   r    r%   r   r   r   r   r   r"   r   r"   r>   r   r&   r   )r&   r   )r   )r   r   r   r"   r   r"   r    r%   r#   r$   r   r   r   r   r   r"   r&   r   )FFr   T)r   r   r   r"   r   r"   r    r%   r#   r$   r   r   rI   r   r   r   r   rJ   r   rJ   r   r"   r   rJ   r&   r   )
r   r"   r   r"   r   rJ   r   r  r&   r   )5
__future__r   r   r  r   collectionsr   r   r   pathlibr   typingr   ro   torchgen.api.dispatcherapirS   torchgen.destr   torchgen.api.typesr	   torchgen.code_templater
   torchgen.contextr   torchgen.genr   r   torchgen.modelr   r   r   r   r   r   !torchgen.selective_build.selectorr   torchgen.utilsr   r   r   r   r   torchgen.yaml_utilsr   r   r   r   r   r   r  r   __name__r)   r1   r/   <module>r1     s   " " " " " "  				 				 8 8 8 8 8 8 8 8 8 8              , , , , , , , , ,       2 2 2 2 2 2 / / / / / / 4 4 4 4 4 4 H H H H H H H H                ? > > > > > S S S S S S S S S S S S S S * * * * * *
  ZUUU  N N N Np /3RB RB RB RB RBjU U U U@ 6 6 6 6 6F  !&#o o o o of OSO
 O
 O
 O
 O
d zDFFFFF r1   