
    sg3W                       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/ddZ0	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ1	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ2	 d	 	 	 	 	 	 	 	 	 ddZ3e4dk(  r e0        yy)     )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_indicesc                	   t        d |      D ci c]  }|j                  j                  | c}t        |       5 }t	        j
                  |t              }d d d        t        t              sJ g d}|j                  dd       J d       |j                  dd       }|j                  dd       J d       |j                  d	d
      }t        |t              s
J d|        |j                  dd
      }t        |t              s
J d|        |j                  dg       }	|	g }	t        |	t              sJ d|	 dt        |	       d       |j                  dg       }
|
g }
t        |
t              sJ d|	 dt        |	       d       t        |
      }|j                  dg       }t        |t              s
J d|        |j                  dg       }|	j                  |       |j                  di        |j                  di        t        |j!                               dk(  s;J |  ddj#                  |j!                                ddj#                  |              	 	 	 	 	 	 	 	 	 	 	 	 d%fd}d }t        |	      dkD  rDt%        fd      5  t'        j(                        }d d d         ||	||||      }||vsJ |||<   d }t        |      dkD  rGt%        fd       5  t'        j(                  d!       }d d d         ||||||      }||vsJ |||<   |D ]X  }t        |t*              rS|g n$||   j-                  |      fD cg c]  }|| c}}|g n$||   j-                  |      fD cg c]  }|| c}}n|g n?|j/                         D cg c]  }||   j-                  |       c}D cg c]  }|| c}}|g n?|j/                         D cg c]  }||   j-                  |       c}D cg c]  }|| c}}|D cg c]  }||	 }}|D cg c]  }||	 }}t        |      dk(  r#t        |      dk(  r3J d"|d   j0                   d#|d   j0                   d$        t3        ||||      S c c}w # 1 sw Y   ?xY w# 1 sw Y   xY w# 1 sw Y   xY wc c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )&Nc                Z    t        | t              r| gS t        | j                               S N)
isinstancer   list	functionsfs    M/var/www/html/venv/lib/python3.12/site-packages/torchgen/gen_backend_stubs.py<lambda>z$parse_backend_yaml.<locals>.<lambda>/   s     Z>:qc Q[[]@S     )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 )r4   z)expected "symint" to be a list, but got: r0   z+expected "autograd" to be a list, but got: r1   r2   r3   r   z contains unexpected keys: z, z). Only the following keys are supported: c                   i }| D ]c  }t        j                  |      }|v s
J d|        t        j                  |   j                        }||v r|dz  }t        |d
      }	|	||<   e t        ||d||      S )Nz Found an invalid operator name: _symintF)kernel
structuredr   T)dispatch_keyr5   externalr6   index)r   parse
dispatchernamefuncr   r   )backend_ops
symint_opsr<   r5   use_device_guardmetadataopop_namekernel_namemr   native_functions_maps             r)   create_backend_indexz0parse_backend_yaml.<locals>.create_backend_index{   s     9; 	"B"((,G//<1';</ %//*>w*G*L*LMKZy("uMA !"HW	" %1)
 	
r+   c                     d  dS )NzFThe provided value for "backend" must be a valid DispatchKey, but got . r-   s   r)   r*   z$parse_backend_yaml.<locals>.<lambda>   s    \]d\eefg r+   )r5   rE   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.rO   rP   s   r)   r*   z$parse_backend_yaml.<locals>.<lambda>   s     OOViWtv r+   AutogradzCurrently, 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".)rC   z	list[str]rD   zset[str]r<   r   r5   boolrE   rS   returnr   )r   rB   rA   openyamlloadr   r$   dictpoprS   r%   typesetextendlenkeysjoinr   r   r?   r   
get_kernelr&   r:   r   )backend_yaml_pathgrouped_native_functionsr    r(   yaml_values
valid_keysr   r5   rE   r/   r4   
symint_setsupported_autogradr1   rL   r   backend_idxr   autograd_idxgrJ   forward_kernelsbackward_kernelsr-   r   rK   s                          @@@r)   parse_backend_yamlrl   '   sH    S$
@ 	
Q@ 
	  6Aii*56k4(((J ooi.GH HHt4JOOOT:M$T&TT$ %)=uED g	QRdQefg  #~u=$ _	KL\K]^_  R0I	4 ^	5i[
4PY?J[[\]^  __Xr*F~ [	29+ZYGXXYZ[  VJ$R8D J	45G4HIJ 
 ??>26L\" OOL"% OOHb! 	K1$@
	7		+BRBRBT8U7V W((,		*(='>@@$


 "

 !
 
 

> '+K
9~g
 	5 &++G4K	5
 +1-
 /111'2$'+L
"v
 	C ',,xy-ABL		C ,1-
 ?222(4%% 4wa( &  .k:EEaHI}    '  .l;FFqIJ}   &  "# (4??B }    '  "# (5@@C }   '6G1GG'7I!1=AII A%-=)>!)C	w =>Nq>Q>X>X=YYuw	wCc4wl \:}o O@6 6P	5 	5"	C 	C* HIsd   RRR%-R2R? S%S	S)S	SS#S-S"5S"R"%R/2R<c                   	 t        |      5 }|j                         }d d d        |g }||   j                  g|g n||   j                  gz   }
t        t        t        d |
                  }| D cg c]B  }|j                  j                  |j                         v r|j                  j                  |vr|D }}t        t              }|D ]-  }|||j                  j                        j                  |       / d| d}t        t        j                  |      D cg c]  \  }}|j!                  d      s| c}}      }d}|j#                         D ]Y  \  }}t%        |      }||   }||k7  sdd}dj'                  |D cg c]
  } ||       c}      }|d| d	| d
| d| d| dz  }[ |dk(  sJ |       y # 1 sw Y   xY w# t        $ r}	t        d|       |	d }	~	ww xY wc c}w c c}}w c c}w )Nz2Unable to read from the specified impl_path file: c                l    | j                         D cg c]  \  }}||j                  f c}}S c c}}w r#   )itemsr:   )r>   rH   rF   s      r)   r*   z*error_on_missing_kernels.<locals>.<lambda>  s/    HM3D7HWhoo.  s   0z(.*)z::\s*([\w\d]*)\(: c                    t        |       5  t        j                  | j                        j	                         cd d d        S # 1 sw Y   y xY wr#   )r   r	   from_schemarB   declr'   s    r)   create_declz-error_on_missing_kernels.<locals>.create_decl?  s>    ,Q/ J.::166BGGIJ J Js   -AA
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   rT   str)rU   readOSErrorAssertionErrorr>   rX   r%   r   rB   rA   r^   r   appendr   refindallendswithro   r]   r_   )native_functionsr    r   r   r   kernel_defn_file_pathr1   r(   backend_defnseindicesexpected_backend_op_namesexpected_backend_native_funcs#expected_backend_kernel_name_countsnative_fkernel_defn_regexxy!actual_backend_kernel_name_countsmissing_kernels_err_msgexpected_namefuncsexpected_overload_countactual_overload_countru   expected_schemas_strs                             r)   error_on_missing_kernelsr      sw   '( 	%AFFHM	% {+112")F)L)L(MG
 :> 		
	: ";66;;388::FFKK|+ 	
;! ; LWL' 2 +%hmm&8&89	

&
  
|+;<(/ **%6F	
A::c? 	

)% ! C I I K u"%e* A- P"&;;J $(99e-Lk!n-L#M # ,0{K`Ja b%& '  ( #  #b(A*AA(Q	% 	% @AV@WX
	.;.	
" .Ms@   G G G 2AG- G2
G8
 G
G 	G*G%%G*c                 x   t        j                  d      } | j                  dddd       | j                  dd	d
d       | j                  ddt        dd       | j                  ddt        d d       | j                         }t        |j                  |j                  |j                  |j                         y )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   defaultr   z--impl-pathz--impl_pathz9path to the source C++ file containing kernel definitions)argparseArgumentParseradd_argumentrS   rw   
parse_argsrunsource_yaml
output_dirdry_run	impl_path)parseroptionss     r)   mainr   M  s    $$1NOF
P	   nnCUV
[tUAS   H   !GW//'BSBSTr+   c                   	
 J d
t        t        t        fd|                  	t        t        t        fd|                  t        |      | j	                   dd	
fd       y )NzAAutogenerated file by gen_backend_stubs.py. Do not edit directly!c                6    t        j                  |          S r#   dest#compute_native_function_declaration)r(   backend_dispatch_keyr    s    r)   r*   z4gen_dispatchkey_nativefunc_headers.<locals>.<lambda>z  s    $BB';< r+   c                >    g S t        j                  |          S r#   r   )r(   autograd_dispatch_keyr    s    r)   r*   z4gen_dispatchkey_nativefunc_headers.<locals>.<lambda>  s.    (0  =='<= r+   NativeFunctions.hzDispatchKeyNativeFunctions.hc                 F    j                   j                   z   dS )N)generated_commentnamespace_prologuer   namespace_epiloguedispatch_declarationsBackendNamer   )prologueepilogue)autograd_declarationsbackend_declarationsr   backend_namer   r   	ns_helpers   r)   r*   z4gen_dispatchkey_nativefunc_headers.<locals>.<lambda>  s1    !2"+"4"4$"+"4"4%9<Q%Q'/
 r+   )sortedr[   r   r   write_with_template)fmr   r   r    rb   r   r   r   r   r   r   r   s    ` ` ```@@@@r)   "gen_dispatchkey_nativefunc_headersr   e  s     !!!K  " )		
	 #
 )		
  .I
  12&	
 	
r+   c                   	 | d| dg}|rdj                  d |D              ndj                  d |D              J |   t        t        t        j                  t
        j                  dd d                  }dt        d	
      dd|rt        d      }|j                  |      nt        d      }|j                  |
|       j                  d dd 	fd       y )N/r   rv   c              3  (   K   | ]
  }d | d  yw)z
#include <>NrO   .0hs     r)   	<genexpr>z/gen_dispatcher_registrations.<locals>.<genexpr>       0Tq:aS1B0T   c              3  (   K   | ]
  }d | d  yw)z
#include ""NrO   r   s     r)   r   z/gen_dispatcher_registrations.<locals>.<genexpr>  r   r   FTrocmr4   class_method_nameskip_dispatcher_op_registrationat)namespace_strrq   zPTORCH_LIBRARY_IMPL(aten, $dispatch_key, m) {
    $dispatch_registrations_body
};)r<   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   r<   r   Registerz.cppzRegisterDispatchKey.cppc                     d	sdndj                         t        j                   	d      j                  d 
fd      j	                        dS )Nrq   z#include <ATen/Functions.h>F)per_operator_headersr   zRegisterDispatchDefinitions.inic                     j                   j                  t        j                         j	                         dt        t        t        j                   t        j                  dd d                  dS )Nrq   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lowerr%   r   RegisterDispatchKeyr   ANONYMOUS_DEFINITION)backend_indexr   r   r<   rb   r   selectorr   s   r)   r*   z@gen_dispatcher_registrations.<locals>.<lambda>.<locals>.<lambda>  s    #,#5#5#,#5#5:\7V(,(E(Em(T*6*<*<*>796:! 44 - & ; ; (%*'+5?L@E 57 r+   )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   r<   external_backend_headers_strr   rb   newliner   r   r   r   s   r)   r*   z.gen_dispatcher_registrations.<locals>.<lambda>  si    "$(D' 9'"."4"4"6 $ = =4Hu! %'$?$?1 %2 eGnI%
 r+   )r_   r%   r   r   r   r   REGISTRATIONr   r
   
substituter   )r   r   r   r    rb   r   r<   r   build_in_treer   r   eager_registrationheadersr   static_templatedeferred_templater   r   r   r   r   r   s   ` ` ` `` `      @@@@@@r)   gen_dispatcher_registrationsr     sS     ,a,-->?G '+yy0TG0T'T$'+yy0TG0T'T$!!!#L1M"&$$##%/L05 %	
# Gd3I&(#)+&&
 .=-G-G%(C .H .
*
 )
 +<*F*F%%(C +G +
' 
<.%!%	
 %	
)r+   c                   t        t              j                  j                  j                         }t        j
                  j                  |d      dfd} ||      }t        j
                  j                  |d      }t        j
                  j                  |d      }t        ||      }	|	j                  |	j                  }}
t        |
      }t        | ||      }|j                  }|j                  }|j                  }|j                  }|j                  }t!        j"                         }|y |||   j%                         }|J |t'        |
|||||       t)        |||||||       ||gn||gD ]  }t+        ||||||||        y )Nzaten/src/ATen/templatesc                     t        |       S )N)install_dirtemplate_dirr   )r   )r   r   r   s    r)   make_file_managerzrun.<locals>.make_file_manager  s    #,
 	
r+   z*aten/src/ATen/native/native_functions.yamlzaten/src/ATen/native/tags.yaml)r   rw   rT   r   )r   __file__parentabsoluteospathr_   r   r   r    r   rl   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    rb   parsed_backend_yamlr   r   r   r   r   r<   r   s     `                 @r)   r   r     s    >((//88:L77<<.GHL

 
:	&Bww||B WW\\,0PQN#$4nEK$$## &  <<LM,- &11K&33L'55M$//J)99O002H
 %[1LLN
!!! 	
 '
  &-K3N
 	%$		

r+   __main__)ra   rw   rb   /Sequence[NativeFunction | NativeFunctionsGroup]r    dict[DispatchKey, BackendIndex]rT   r   r#   )r   zSequence[NativeFunction]r    r  r   r   r   DispatchKey | Noner   rw   r   rw   r1   zlist[OperatorName] | NonerT   None)rT   r  )rq   )r   r   r   rw   r   rw   r    r  rb   r  r   r   r   r  r   rw   rT   r  )FFrq   T)r   r   r   rw   r   rw   r    r  rb   r  r   r   r<   r   r   r   r   rS   r   rS   r   rw   r   rS   rT   r  )
r   rw   r   rw   r   rS   r   z
str | NonerT   r  )5
__future__r   r   r   r|   collectionsr   r   r   pathlibr   typingr   rV   torchgen.api.dispatcherapir@   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   rl   r   r   r   r   r   __name__rO   r+   r)   <module>r     sQ   "  	 	 8 8    , ,  2 / 4 H  ? S S *
  U NNMN 5N 	Np /3RB.RB4RB RB %	RB
 RB RB ,RB 
RBjU@ 666 6 5	6
 N6 &6 .6 6 
6F  !&#ooo o 5	o
 No &o o o o o o o 
of OSO
O
"%O
04O
AKO
	O
d zF r+   