
    '}hfW                        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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e0deee"e#f      de	e!ef   de/fdZ1	 d.dee"   de	e!ef   de!dee!   de0de0dee
e$      ddfdZ2d/dZ3	 d0de*de0de0de	e!ef   deee"e#f      de!dee!   de0ddfd Z4	 	 	 	 d1de*d!e0de0de	e!ef   deee"e#f      de!d"e!d#d$d%e5d&e5de0d'e5ddfd(Z6	 d.d)e0d!e0d*e5d+ee0   ddf
d,Z7e8d-k(  r e3        yy)2    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                 
   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t$        t&           dt(        t&           dt*        d	t        d t        d!t,        ffd"}d }t        |	      dkD  rDt/        fd#      5  t+        j0                        }d d d         ||	||||$      }||vsJ |||<   d }t        |      dkD  rGt/        fd%      5  t+        j0                  d&       }d d d         ||||||$      }||vsJ |||<   |D ]X  }t        |t2              rS|g n$||   j5                  |      fD cg c]  }|| c}}|g n$||   j5                  |      fD cg c]  }|| c}}n|g n?|j7                         D cg c]  }||   j5                  |       c}D cg c]  }|| c}}|g n?|j7                         D cg c]  }||   j5                  |       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   j8                   d(|d   j8                   d)        t;        ||||      S c c}w # 1 sw Y   ex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    Y/var/www/html/test/engine/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symintr3   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: r5   z,expected "supported" to be a list, but got: z
 (of type )r:   z)expected "symint" to be a list, but got: r6   z+expected "autograd" to be a list, but got: r7   r8   r9   r   z contains unexpected keys: z, z). Only the following keys are supported: backend_ops
symint_opsdispatch_keyuse_device_guardr&   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)r@   r;   externalr<   index)r   parse
dispatchernamefuncr   r   )r>   r?   r@   r;   rA   metadataopop_namekernel_namemr"   native_functions_maps             r/   create_backend_indexz0parse_backend_yaml.<locals>.create_backend_indexy   s     9; 	"B"((,G//<1';</ %//*>w*G*L*LMKZy("uMA !"HW	" %1)
 	
r1   c                      d  dS )NzFThe provided value for "backend" must be a valid DispatchKey, but got . r3   s   r/   r0   z$parse_backend_yaml.<locals>.<lambda>   s    \]d\eefg r1   )r;   rA   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.rU   rV   s   r/   r0   z$parse_backend_yaml.<locals>.<lambda>   s     OOViWtv r1   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".)r   rK   rJ   openyamlloadr   r*   dictpopboolr+   typesetextendlenkeysjoinr   strr
   r   r   r   rH   r   
get_kernelr,   rD   r   )r$   r%   r#   r.   yaml_values
valid_keysr!   r;   rA   r5   r:   
symint_setsupported_autogradr7   r8   _rR   r   backend_idxr    autograd_idxgrP   forward_kernelsbackward_kernelsr3   r"   rQ   s                            @@@r/   parse_backend_yamlrq   %   sT    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\" r2J 	"%A 	K1$@
	7		+BRBRBT8U7V W((,		*(='>@@$
#Y
H
 "

 !
 
 

> *.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   R9R>?SS=S%&S*S/+S4S9/S>T	TTT>SSS"native_functionsr   r    r!   kernel_defn_file_pathr7   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 ]e  \  }}t%        |      }||   }||k7  sdt&        dt(        fd	}d
j+                  |D cg c]
  } ||       c}      }|d
| d| d| d| d| dz  }g |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)   )itemsrD   )rG   rN   rL   s      r/   r0   z*error_on_missing_kernels.<locals>.<lambda>  s/    HM3D7HWhoo.  s   0z(.*)z::\s*([\w\d]*)\(: r.   r&   c                     t        |       5  t        j                  | j                        j	                         cd d d        S # 1 sw Y   y xY wr)   )r   r   from_schemarK   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

)rY   readOSErrorAssertionErrorrG   r\   r+   r   rK   rJ   rc   r   appendr   refindallendswithrv   rb   r   re   rd   )rr   r#   r   r    r!   rs   r7   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_countr|   expected_schemas_strs                             r/   error_on_missing_kernelsr      s   '( 	%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~ J# 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G9 G>
H
GG 	G6"G11G6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)r_   defaultr   z--impl-pathz--impl_pathz9path to the source C++ file containing kernel definitions)argparseArgumentParseradd_argumentr^   re   
parse_argsrunsource_yaml
output_dirdry_run	impl_path)parseroptionss     r/   mainr   K  s    $$1NOF
P	   nnCUV
[tUAS   H   !GW//'BSBSTr1   fmr"   backend_dispatch_keyautograd_dispatch_keybackend_namec                    	
 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.   r   r#   s    r/   r0   z4gen_dispatchkey_nativefunc_headers.<locals>.<lambda>x  s    $BB';< r1   c                 >    g S t        j                  |          S r)   r   )r.   r   r#   s    r/   r0   z4gen_dispatchkey_nativefunc_headers.<locals>.<lambda>  s.    (0  =='<= r1   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   r   r!   r   	ns_helpers   r/   r0   z4gen_dispatchkey_nativefunc_headers.<locals>.<lambda>  s1    !2"+"4"4$"+"4"4%9<Q%Q'/
 r1   )sortedr`   r   r   write_with_template)r   r!   r"   r#   r%   r   r   r   r   r   r   r   s    ` ` ```@@@@r/   "gen_dispatchkey_nativefunc_headersr   c  s     !!!K  " )		
	 #
 )		
  .I
  12&	
 	
r1   r   r@   selectorr   build_in_treeper_operator_headerseager_registrationc                    	 | 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   r}   c              3   (   K   | ]
  }d | d  yw)z
#include <>NrU   .0hs     r/   	<genexpr>z/gen_dispatcher_registrations.<locals>.<genexpr>       0Tq:aS1B0T   c              3   (   K   | ]
  }d | d  yw)z
#include ""NrU   r   s     r/   r   z/gen_dispatcher_registrations.<locals>.<genexpr>  r   r   FTrocmr:   class_method_nameskip_dispatcher_op_registrationat)namespace_strrx   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 )Nrx   z#include <ATen/Functions.h>F)r   r   zRegisterDispatchDefinitions.inic                      j                   j                  t        j                         j	                         dt        t        t        j                   t        j                  dd d                  dS )Nrx   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@   r%   r   r   r   s   r/   r0   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 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   r@   external_backend_headers_strr   r%   newliner   r   r   r   s   r/   r0   z.gen_dispatcher_registrations.<locals>.<lambda>  si    "$(D' 9'"."4"4"6 $ = =4Hu! %'$?$?1 %2 eGnI%
 r1   )rd   r+   r   r   r   r   REGISTRATIONr   r   
substituter   )r   r   r!   r#   r%   r   r@   r   r   r   r   r   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 +
' 
<.%!%	
 %	
)r1   r   r   r   c                 J   t        j                  t              j                  j                  j	                         }t
        j                  j                  |d      dt        dt        f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 ]  }t1        ||||||||        y )Nzaten/src/ATen/templatesinstall_dirr&   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)pathlibPath__file__parentabsoluteospathrd   re   r   r   rr   r#   r   rq   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_yamlrr   r#   r%   parsed_backend_yamlr   r    r"   r!   r   r@   r   s     `                 @r/   r   r     s    <<)0077@@BL77<<.GHL
s 
{ 

 
:	&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
 	%$		

r1   __main__r)   )r&   N)rx   )FFrx   T)9r   r  r   r   collectionsr   r   r   typingr   r   r   r	   r
   r   rZ   torchgen.api.dispatcherapirI   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   re   rq   r   r   r   r^   r   r   __name__rU   r1   r/   <module>r     s    	  	 8 8 = =  , ,  2 / 4 H  ? S S *
  U NN&u^=Q-Q'RSN +|34N 	Np 26RB~.RB+|34RB RB ;'	RB
 RB RB 4-.RB 
RBjU@ 666 6 +|34	6
 'u^=Q-Q'RS6 &6 $K06 6 
6F  !&#ooo o +|34	o
 'u^=Q-Q'RSo &o o !o o o o o 
of RVO
O
"%O
04O
AI#O
	O
d zF r1   