
    ΅i0                       S SK Jr  S SKrS SKrS SKJr  S SKJr  S SKrS SK	J
r
  S SKJrJrJrJrJrJrJrJrJrJrJrJrJrJr  S SKJr  S SKJr  S S	KJrJ r J!r!  S S
K"J#r#J$r$J%r%J&r&J'r'J(r(J)r)  S SK*J+r+J,r,  S SK-J.r.  SSK/J0r0  SSK1J2r2  \(       a
  S SK3J4r4J5r5J6r6  / SQr7\7 V s/ s H  n \Rq                  SU  S35      PM     sn r9/ SQr:\S=S j5       r;S>S jr<S?S jr=S=S jr>S=S jr?S=S jr@S=S jrAS=S jrBS=S jrCS=S jrDS=S jrES S!.             S@S" jjrF      SAS# jrGS S!.               SBS$ jjrH          SCS% jrI          SCS& jrJS S!.                 SDS' jjrKS(S(S).           SES* jjrL          SFS+ jrM\SGS, j5       rN    SHS- jrO    SIS. jrP    SJS/ jrQ\" S05      rR\" S15      rS\" S25      rT\" S35      rUS S!.           SKS4 jjrV          SLS5 jrW\" S65      rXS S!.       SMS7 jjrY        SNS8 jrZ          SOS9 jr[S S!.     SPS: jjr\S S!.     SQS; jjr]S S!.         SRS< jjr^gs  sn f )S    )annotationsN)defaultdict)TYPE_CHECKING)cpp)arg_parser_output_exprscpp_dispatch_exprscpp_dispatch_targetdispatch_lambda_argsdispatch_lambda_exprsdispatch_lambda_return_strhas_tensor_optionsPythonSignaturePythonSignatureDeprecatedPythonSignatureGroup!PythonSignatureNativeFunctionPair	signaturesignature_from_schemastructseq_fieldnames)CodeTemplatewith_native_function)
cpp_stringparse_native_yamlparse_tags_yaml)ArgumentBaseOperatorNameFunctionSchemaNativeFunction
SchemaKindTypeVariant)FileManagersplit_name_params)
YamlLoader   )is_tensor_list_type)should_trace)CallableIterableSequence)Talias
contiguousis_cuda	is_sparseis_sparse_csrsizestridesym_is_contiguoussym_size
sym_stridesym_storage_offset	sym_numelz.*_backwardz#.*_backward_(out|input|weight|bias)z
.*_forwardz.*_forward_outz.*_jvp_unsafe_viewtensorz2_?sparse_(coo|compressed|csr|csc|bsr|bsc)_tensor.*z_range.*_sparse_add_outz_sparse_div.*z_sparse_mul.*z_sparse_sub.*_sparse_dense_add_outindex	index_outunique_dim_consecutivez	_cumsum.*z
_cumprod.*z_sum.*z_prod.*z_th_.*z_thnn_.*zrange.*z_solve.*z
_inverse.*z_cholesky.*z_triangular_solve.*z_qr.*z_svd.*sliceitem_local_scalar_denseto_to_copy_to_copy_out_reshape_copy_reshape_copy_outcopy_sparse_to_sparse_copy__foreach_copynumpy_Tmatrix_HmTmHznonzero(_(out|numpy))?set_dataz.*_overrideabledatais_leaf	output_nr_versionrequires_grad_retains_gradset_
_fw_primal)fake_quantize_per_tensor_affine_cachemask*fake_quantize_per_channel_affine_cachemask!_new_zeros_with_same_feature_meta_has_same_storage_numel_reshape_aliasreplace_copyzfill.Tensorzfill.Scalarzlift.*normal_functionalnbytesitemsize_batch_norm_with_update_batch_norm_with_update_out_batch_norm_no_update^$)z?add.Scalar(Tensor self, Scalar other, Scalar alpha=1) -> TensorzHadd_.Scalar(Tensor(a!) self, Scalar other, Scalar alpha=1) -> Tensor(a!)z?sub.Scalar(Tensor self, Scalar other, Scalar alpha=1) -> TensorzHsub_.Scalar(Tensor(a!) self, Scalar other, Scalar alpha=1) -> Tensor(a!)z/mul.Scalar(Tensor self, Scalar other) -> Tensorz8mul_.Scalar(Tensor(a!) self, Scalar other) -> Tensor(a!)z/div.Scalar(Tensor self, Scalar other) -> Tensorz8div_.Scalar(Tensor(a!) self, Scalar other) -> Tensor(a!)c                "   SU R                   ;   a  SU R                   ;  a  g[        R                  " U R                  5      n[         H  nUR                  U5      (       d  M    g   [        U R                  5      n[         H
  nXC:X  d  M
    g   g)N	generated	view_copyFT)tagsr   namefuncSKIP_PYTHON_BINDINGSmatchstrSKIP_PYTHON_BINDINGS_SIGNATURES)fri   
skip_regexr   patterns        i/home/james-whalen/.local/lib/python3.13/site-packages/torchgen/packaged/autograd/gen_python_functions.pyshould_generate_py_bindingrs      su     affAFF!:88AFFD*
D!! + AFFI2 3     c                    SU  3$ )NTHPVariable_ )ri   s    rr   get_pycnamerx      s    $  rt   c                l    [        U 5      S:H  =(       a     U S   R                  R                  5       S:H  $ )Nr%   r   )lenr   arguments_count)	overloadss    rr   is_noargr}      s.    y>QP9Q<#9#9#I#I#Kq#PPrt   c                f    U R                   S L =(       a    [        R                  U R                  ;   $ N)python_moduler!   methodvariantsro   s    rr   is_py_variable_methodr      s#    ??d"Cw~~'CCrt   c                f    U R                   S L =(       a    [        R                  U R                  ;   $ r   )r   r!   functionr   r   s    rr   is_py_torch_functionr      s%    ??d"Ew'7'71::'EErt   c                     U R                   S:H  $ )Nnnr   r   s    rr   is_py_nn_functionr      s    ??d""rt   c                     U R                   S:H  $ )Nfftr   r   s    rr   is_py_fft_functionr      s    ??e##rt   c                     U R                   S:H  $ )Nlinalgr   r   s    rr   is_py_linalg_functionr          ??h&&rt   c                     U R                   S:H  $ )Nnestedr   r   s    rr   is_py_nested_functionr      r   rt   c                     U R                   S:H  $ )Nsparser   r   s    rr   is_py_sparse_functionr      r   rt   c                     U R                   S:H  $ )Nspecialr   r   s    rr   is_py_special_functionr      s    ??i''rt   Tsymintc               P  ^ [        XSS9n[        X5      R                  n[        [	        [
        U5      5      n[        XsSS9n[        UU[        S SSUS9  [        XsSS9n	[        UU	[        SSSS	US
9  [        UU	[        SSSUS9  [        UU	[        SSSUS9  [        UU	[        SSSUS9  [        UU	[        SSSS9  [        UU	[        SSSUS9  [        UU	[         SSSUS9  [#        XiS S5        [%        XiS S5        ['        U5      mSU4S jjn
UR)                  SU
5        g )NF)install_dirtemplate_dirdry_runTr   zpython_variable_methods.cppr   r   torchzpython_torch_functions.cpp   )r   
num_shardsr   torch.nnzpython_nn_functions.cpp	torch.fftzpython_fft_functions.cpptorch.linalgzpython_linalg_functions.cpptorch.nestedzpython_nested_functions.cpptorch.sparsezpython_sparse_functions.cpptorch.specialzpython_special_functions.cppc                    gNTrw   fns    rr   <lambda>gen.<locals>.<lambda>r      $rt   zpython_return_types.cppc                    gr   rw   r   s    rr   r   r   u  r   rt   zpython_return_types.hc                 v   > SSR                  [        T5       V s/ s H  n SU  SU  S3PM     sn 5      0$ s  sn f )Nenum_of_valid_tags z	
.value("z", at::Tag::))joinsorted)tag
valid_tagss    rr   gen_tags_enumgen.<locals>.gen_tags_enumz  sJ     EKJEWXEWcz#l3%q9EWX
 	
 Ys   6
zpython_enum_tag.cpp)returndict[str, str])r"   r   native_functionslistfilterrs   load_signaturescreate_python_bindingsr   create_python_bindings_shardedr   r   r   r   r   r   r   "create_python_return_type_bindings)create_python_return_type_bindings_headerr   write)outnative_yaml_pathtags_yaml_pathdeprecated_yaml_pathtemplate_pathr   fmr   methods	functionsr   r   s              @rr   genr   
  s    
%	PB(  F#=?OPQ.TRG
%   0uUI"
$	 
! 
" 
% 
% 
% 
& '
(A .
(? !0J
 HH"M2rt   c                    [        [        5      nU  HW  nU" UR                  5      (       d  M  X#R                  R                  R                  R                     R                  U5        MY     U$ r   )r   r   r   rj   ri   append)pairspredgroupedpairs       rr   group_filter_overloadsr     sZ    
 	D  MM&&++00188>  Nrt   c                 ^ ^^
^^^ / m/ m
/ m/ m[        X5      n[        UR                  5       [        S9 Hr  nXx   n	TR	                  [        XXUS95        TR	                  [        XXS95        TR                  [        XUS95        T
R	                  SUR                   S35        Mt     T R                  TTUU U
UUU4S j5        g)+Generates Python bindings to ATen functionskeyr   r   #include <ATen/ops/.h>c                 B   > SSTR                  5        ST  3-   TTTTS.$ )N@generated from /)generated_commentops_headerspy_forwards
py_methodspy_method_defstemplate_dir_for_comments)filenamer   r   r   r   r   s   rr   r   (create_python_bindings.<locals>.<lambda>  s7    !$ < < >?q
K"L&&$,
rt   N)r   r   keysrm   r   method_impl
method_defextendforward_declsbasewrite_with_template)r   r   r   moduler   r   r   r   ri   r|   r   r   r   r   s   `   `     @@@@rr   r   r     s     JK "NK$U1Gw||~3/M	ivN	
 	jyPQ=HI03?@ 0 	
 	
rt   c                j  ^ ^^	^
 / m	/ m
[        X5      n[        UR                  5       [        S9 Hf  nXE   n[	        U5      u  pxT	R                  U(       d  SOSR                  U5      5        T
R                  U(       d  SOSR                  U5      5        Mh     T R                  TTUU U	U
4S j5        g)z
Generate function to initialize and return named tuple for native functions
which returns named tuple and registration invocations in `python_return_types.cpp`.
r   r   
c                 >   > SSTR                  5        ST  3-   TTS.$ )Nr   r   r   )r   py_return_typespy_return_types_registrationsr   )r   r   py_return_types_definitionr   s   rr   r   4create_python_return_type_bindings.<locals>.<lambda>  s1    !$ < < >?q
K"L9-J	
rt   N)r   r   r   rm   1generate_return_type_definition_and_registrationsr   r   r   )r   r   r   r   r   ri   r|   definitionsregistrationsr   r   s   `  `     @@rr   r   r     s     -//1!$U1Gw||~3/M	%V&
" 	#))!Btyy'=	
 	&,,#B=)A	
 0 	
	rt   c                  ^ ^^ / m[        X5      n[        UR                  5       [        S9 H;  nXE   n[	        U5      nTR                  U(       d  SOSR                  U5      5        M=     T R                  TTUU U4S j5        g)z
Generate function to initialize and return named tuple for native functions
which returns named tuple and relevant entry for the map in `python_return_types.cpp`.
r   r   r   c                 <   > SSTR                  5        ST  3-   TS.$ )Nr   r   r   )r   py_return_types_declarationsr   )r   r   r  s   rr   r   ;create_python_return_type_bindings_header.<locals>.<lambda>  s.    !$ < < >?q
K"L,H
rt   N)r   r   r   rm   !generate_return_type_declarationsr   r   r   )	r   r   r   r   r   ri   r|   declarationsr  s	   `  `    @rr   r   r     sv     /1 $U1Gw||~3/M	8C$++"B		,(?	
 0 	
rt   c          
        ^^^ [        X5      n    S
S jn	    SUUU4S jjn
U R                  UUR                  5       SSSU R                  5        SU 3-   0U	U
U1 SkS9  g	)r   c                     U S   R                   $ )Nr   )r   )kvs    rr   key_func0create_python_bindings_sharded.<locals>.key_func  s     !uzzrt   c           
        > U u  pSUR                    S3/[        [        XTS95      [        UTUTTS9/[	        UTUTS9/S.$ )Nr   r   r   r   )r   r   r   r   )r   r   r   r   r   )r  ri   fn_pairsr   r   r   s      rr   env_func0create_python_bindings_sharded.<locals>.env_func  s`     1$))C@AdV LMD&(6&Q  *$PQ
 	
rt   r   r   r   r   >   r   r   r   r   )base_envkey_fnenv_callabler   sharded_keysN)r  @tuple[BaseOperatorName, list[PythonSignatureNativeFunctionPair]]r   rm   )r  r  r   zdict[str, list[str]])r   write_shardeditemsr   )r   r   r   r   r   r   r   r   r   r  r  s      ` ` `   rr   r   r     s     %U1GL	

L
	
 
  < < >?q
K"L
 S  rt   F)skip_deprecatedpyic                  ^^ [         SUU4S jj5       n[        [        XP5      5      n[        XaTTS9nU(       a  U$ Xg-   $ )Nc                *   > [        [        U TTS9U S9$ )Nr   r  r   r   )r   r   )ro   r   r  s    rr   gen_signature_pairs,load_signatures.<locals>.gen_signature_pairs9  s    0&c:
 	
rt   r  )ro   r   r   r   )r   r   mapload_deprecated_signatures)r   r   r   r  r  r  r   
deprecateds     ` `   rr   r   r   1  sL     
 
 (;<E+FJ $5;);;rt   c                 ^^^^^ [        [        5      nU  H*  nXER                  R                     R	                  U5        M,     / n[        U5       n[        R                  " U[        S9nS S S 5        W GH  n	[        R                  " U	S   5      m[        U	S   5      u  n
mU
R                  S5      mT(       a  U
R                  SS5      n
S[        R                  " S5      0mTR                  R                    Vs0 s H  oR                  U_M     snmT H  nUT;   a  M  UT;   a  M   SU 35       e       SUUUUU4S	 jjnS
nXJ    H  nU" UR"                  R$                  5      (       d  M&  Sn['        TUR"                  R(                  UUS9nUR	                  [+        [-        UR                  UR.                  UR0                  UR2                  UR4                  UR6                  T[9        T5      UR:                  S9	UR"                  S95        M     U(       a  GM   SU
 S[=        T5       35       e   U$ ! , (       d  f       GN= fs  snf )N)Loaderri   aten_outr   1Scalarz+deprecation definition: Unrecognized value c                  > T	(       a@  [         R                  " U R                  R                  U R                  R                  5      nOU R                  R
                  n[        U5       Hu  u  p#U[        T5      :  aR  TU   nUT
;   a  T
U   nS nOTU   nUR                  nUR                  nXSR                  :w  d  XcR                  :w  a    gMf  UR                  b  Mu    g   [        TR                  5      [        U R                  5      :H  =(       a0    [        S [        TR                  U R                  5       5       5      $ )NFc              3  .   #    U  H  u  pX:H  v   M     g 7fr   rw   ).0abs      rr   	<genexpr>Kload_deprecated_signatures.<locals>.is_schema_compatible.<locals>.<genexpr>  s      K#K41#K   )	itertoolschain	argumentsr   flat_non_outflat_all	enumeraterz   type
annotationdefaultreturnsallzip)aten_schemar0  iargarg_nameschema_typeschema_annotation
schema_arg	call_argsis_outknown_constantsschemaschema_args_by_names           rr   is_schema_compatible8load_deprecated_signatures.<locals>.is_schema_compatibler  s    %OO))--{/D/D/Q/Q	 (11::	#I.s9~%(|H?2&5h&?,0)%8%B
&0oo,6,A,A)"hh.2C~~2U$ 3V {{*$ /" v~~&#k.A.A*BB s K#&v~~{7J7J#KK H rt   FT)category_overrider   r  )	ri   
input_argsinput_kwargsoutput_argstensor_options_argsr   deprecated_schemadeprecated_args_exprsr7  r  zNo native function with name z matched signature:
  )r:  r   r   bool)r   r   r   ri   r   openyamlloadr$   r   parser#   endswithreplacer    r0  r2  r   rj   r   rH  r   r   rI  rJ  rK  rL  r   tupler7  rm   )r   r   r   r  r   r   resultsro   deprecated_defsr  	aten_namer)  ri   rF  any_schema_found
python_sigrA  rB  rC  rD  rE  s                   @@@@@rr   r  r  G  sJ    CNdBSG##$++D1  8:G	"	#q))Aj9 
$ &
%%j&890F1CD	9##F+!))&"5I
 H%
 392B2B2K2KL2KQvvqy2KLD..$/2I =dVDI 	'		 	@ !&D'(:(:;;#."&--"A"A	J NN17'__#-#8#8%/%<%<$.$:$:,6,J,J)00*0.3I.> * 2 2
 "]] '8   	
+I;6McRXk][	
c &j Nq 
$	# Ms   H?>I?
Ic                    [         R                  " U R                  5      n[        U R                  R                  5      nSR                  U/U-   5      $ )N_)r   ri   rj   r   r7  r   )ro   ri   
fieldnamess      rr   gen_structseq_typename_keyr_    s<    88AFFD%affnn5J88TFZ'((rt   c                   0 n/ nU  H  n[        UR                  R                  R                  5      nU(       d  M5  [        R
                  " UR                  R                  5      n[        UR                  5      nUR                  U5      nUb  M  SU(       d  SO
[        U5       3nXqU'   UR                  SU SU S35        M     X!4$ )zf
Generate block of named tuple type def inits, and add typeref snippets
to declarations that use them

NamedTupler   zstatic PyTypeObject* z = generated::get__structseq();
r   r   rj   r7  r   ri   r_  getrz   r   )r|   	typenamestypedefsoverloadr^  ri   tn_keytypenames           rr   emit_structseq_callrj    s     	  H)(*;*;*@*@*H*HI
xx))../+H,=,=>==(#hBCM#JKH (fOOZ1$}H   rt   c                8   0 n/ n/ nU  GH  n[        UR                  R                  R                  5      nU(       d  M6  SR	                  S U 5       5      n[
        R                  " UR                  R                  5      n[        UR                  5      nUR                  U5      n	U	b  M  U SU(       d  SO
[        U5       3n	XU'   UR                  SU SU SU	 SU S	[        U5       S
U	 SU	 SU	 S35        UR                  SU SU S35        GM     X#4$ )z
Generate block of function in `python_return_types.cpp` to initialize
and return named tuple for a native function which returns named tuple
and registration invocations in same file.
, c              3  .   #    U  H  nS U S3v   M     g7f){"z", ""}Nrw   )r(  r   s     rr   r+  Dgenerate_return_type_definition_and_registrations.<locals>.<genexpr>  s     BzSG,zr-  ra  r   PyTypeObject* get_zI_structseq() {
    static PyStructSequence_Field NamedTuple_fields[] = { z(,  {nullptr} };
    static PyTypeObject zh;
    static bool is_initialized = false;
    static PyStructSequence_Desc desc = { "torch.return_types.z", nullptr, NamedTuple_fields, zB };
    if (!is_initialized) {
        PyStructSequence_InitType(&z, &desc);
        zm.tp_repr = (reprfunc)torch::utils::returned_structseq_repr;
        is_initialized = true;
    }
    return &z;
}
z$addReturnType(return_types_module, "z", generated::get_z_structseq());)r   r   rj   r7  r   r   ri   r_  rd  rz   r   )
r|   re  r   r   rg  r^  fieldsri   rh  ri  s
             rr   r   r     sZ    	   K!M)(*;*;*@*@*H*HI
BzBBxx))../+H,=,=>==(zK"SEU)VWH (f& <<B8 D!
 #@@DvEdehisetdu v$$,: .		
  J     6tf<NtfTbc= D %%rt   c                   0 n/ nU  H  n[        UR                  R                  R                  5      nU(       d  M5  [        R
                  " UR                  R                  5      n[        UR                  5      nUR                  U5      nUb  M  U SU(       d  SO
[        U5       3nXqU'   UR                  SU S35        M     U$ )z
Generate block of function declarations in `python_return_types.h` to initialize
and return named tuple for a native function.
ra  r   rp  rb  rc  )r|   re  r  rg  r^  ri   rh  ri  s           rr   r  r    s     	  !L)(*;*;*@*@*H*HI
xx))../+H,=,=>==(&
\2s<?P"QR  !)f"4TF- HI   rt   a  \
// ${name}
static PyObject * ${pycname}(PyObject* self_, PyObject* args, PyObject* kwargs)
{
  ${method_header}
  static PythonArgParser parser({
    ${signatures}
  }, /*traceable=*/${traceable});

  ParsedArgs<${max_args}> parsed_args;
  auto _r = parser.parse(${self_}, args, kwargs, parsed_args);
  ${check_has_torch_function}
  switch (_r.idx) {
    ${dispatch}
  }
  ${method_footer}
}

z&case ${overload_index}: {
  ${body}
}
ao  // ${name}
static PyObject * ${pycname}(PyObject* self_, PyObject* args, PyObject* kwargs)
{
  ${method_header}
  static PythonArgParser parser({
    ${signatures}
  }, /*traceable=*/${traceable});

  ParsedArgs<${max_args}> parsed_args;
  auto _r = parser.parse(${self_}, args, kwargs, parsed_args);
  ${check_has_torch_function}
  ${dispatch}
  ${method_footer}
}

z// ${name}
static PyObject * ${pycname}(PyObject* self_, PyObject* args)
{
  ${method_header}
  ${check_has_torch_function}
  ${dispatch}
  ${method_footer}
}

c                  [        U 5      n[        U5      n[        U5      u  pxS/n	X-  n	U	U(       a  S/O/ -  n	U(       a  / OS/S/-   n
[        S U 5       5      (       a  SOSn[	        X$S9n[        U5      S	:H  n/ n/ n[        U5       H{  u  nnUR                  R                  US9nUR                  [        [        U5      5       S
35        [        UXS9nUR                  U(       d  [        R                  UUS9OU5        M}     U(       a  [        nOU(       a  [         nO["        nUR                  U UU	[%        S U 5       5      UU['        U UUUS9UU
U(       a  SS9
$ SS9
$ )z7
Generate a python binding for all overloads of an op.
HANDLE_TH_ERRORSz/const Tensor& self = THPVariable_Unpack(self_);Py_RETURN_NONE;END_HANDLE_TH_ERRORSc              3  L   #    U  H  n[        UR                  5      v   M     g 7fr   )r'   r   r(  os     rr   r+  method_impl.<locals>.<genexpr>  s     J	1l1::66	s   "$truefalser   r%   ,)overload_indexbodyc              3  T   #    U  H  oR                   R                  5       v   M      g 7fr   )r   r{   rx  s     rr   r+  rz    s     FIq[[0022Is   &()ri   r   noargr   self_nullptr)
ri   pycnamemethod_headermax_args
signatures	traceablecheck_has_torch_functiondispatchmethod_footerr  )rx   r}   rj  r8  group_overloadsrz   r3  r   signature_strr   r   rm   emit_dispatch_casePY_VARIABLE_CASE
substitutePY_VARIABLE_METHOD_NOARGS$PY_VARIABLE_METHOD_VARARGS_SINGLETONPY_VARIABLE_METHOD_VARARGSmaxgen_has_torch_function_check)ri   r   r|   r   r   r  r  structseq_initsstructseq_typenamesr  r  r  grouped_overloadsis_singletonr  r  r~  rg  r   dispatch_bodytemplates                        rr   r   r     s    $GYE+>y+I(O'(M$M?E	:;2M !R'8&9>T=UUMJ	JJJPWI8G9 ()Q.LJH$-.?$@ &&44F4C	ZI78:;*85HX   ''-M (  	
	 %A ,	7-#FIFF!=	"
 #g    &/   rt   c                   U(       a  U(       a  SU  S3$ gU(       a  SOSnU(       a  SSSS	S
SSS.U   OSnSU SU SU=(       d    S S3$ )NzMif(check_has_torch_function(self_)) {
  return handle_torch_function(self_, "z");
}
r   r  r  THPVariableFunctionsModuleTHPNNVariableFunctionsModuleTHPFFTVariableFunctionsModule THPLinalgVariableFunctionsModule THPNestedVariableFunctionsModule THPSparseVariableFunctionsModule!THPSpecialVariableFunctionsModule)r   r   r   r   r   r   r   THPVariableClasszAif(_r.has_torch_function()) {
  return handle_torch_function(_r, z, args, kwargs, z, "ztorch.Tensorrw   )ri   r   r  r   r  	namespaces         rr   r  r    s     ((,v .  G9E  268>>>@	
 	   $$)7*:9+SIaSaHb c rt   zRif (_r.isNone(${out_idx})) {
  ${call_dispatch}
} else {
  ${call_dispatch_out}
}
c               *   U R                   bh  [        R                  U R                  R	                  5       [        U R                  U R                  XS9[        U R                  U R                   UUS9S9$ [        U R                  U R                  XS9$ )a  
Emit dispatch code for a single parsed signature. This corresponds to either
a single native function, or a pair that differ only in output params. In the
latter case, a single python signature is used for both and dispatching
switches on the presence/absence of passed output args.
r   )out_idxcall_dispatchcall_dispatch_out)outplacePY_VARIABLE_OUTr  r   
output_idxemit_single_dispatchr   )rg  r  r   s      rr   r  r    s     $))&&113.""HMM3F 3""!!#	 * 
 	
 $/B
 	
rt   c               d    U(       a  g[        U 5      n[        U5      (       a  SU S34$ SU S34$ )Nrw   zstatic PyObject * z#(PyObject* self_, PyObject* args);
z5(PyObject* self_, PyObject* args, PyObject* kwargs);
)rx   r}   )ri   r|   r   r  s       rr   r   r     s[     $G	) 
 	
) 
 	
rt   c                   [        U 5      nU R                  (       a  SU S3n[        U5      (       a  U(       a  SOSnOSU S3nSnUS:X  a  US-  nS	U  S
U SU S3$ )z
Generate method def entry.
zTypeError_to_NotImplemented_<>METH_NOARGSzMETH_VARARGS | METH_KEYWORDSzcastPyCFunctionWithKeywords(r   r   z | METH_STATICrn  z", rl  z, nullptr},)rx   dunder_methodr}   )ri   r   r|   r   r  flagss         rr   r   r   =  s{     $G1'!<	!'-K0	;.!!c'"UG<88rt   c          
        0 n0 nU  H  nUR                   R                  SUS9nUR                  R                  R	                  5       (       aG  XS;   a<  [        SUR                  R                   SX5   R                  R                   S35      eXCU'   M  XR;   a<  [        SUR                  R                   SX%   R                  R                   S35      eXBU'   M     UR                  5        GH4  u  pVXR;  d  M  / nU  H  n[        UR                  R                  R                  R                  5      [        UR                  R                  R                  R                  5      :X  d  Mm  UR                  R                  R	                  5       (       a  M  UR                   R                  (       a  M  UR                  UR                   R                  SUS95        M     UR                   R                  US9n[        SU SU S	3S
R                  S U 5       5      -   5      e   UR                  5        VV	s/ s H)  u  pY[        R                  " U	UR                  U5      S9PM+     n
nn	[        XS9$ s  sn	nf )NT)skip_outputsr   z(Found duplicated function definition:
- z.
Existing definition:
- .r   z4While identifying overloads, we found an out schema z] without a corresponding non-out variant. We expected the non-out variant to have schema: 
- zy
Please check that you spelled the schema correctly in native_functions.yaml. We discovered the following candidate(s): 
r   c              3  ,   #    U  H
  nS U 3v   M     g7f)z- Nrw   )r(  	candidates     rr   r+  "group_overloads.<locals>.<genexpr>  s     Ijb,js   )
functionalr   )r   r  r   rj   	is_out_fnRuntimeErrorr  rm   ri   r  r   r   r   
from_pairsrd  sort_overloads)r|   r   bases	outplacesrg  sigr   
candidatesout_sigr   r   s              rr   r  r  `  ss    ;=E>@I   ..D.P!!++--"?@Q@Q@V@V?W X//8~/F/F/K/K.LAO  &cN|"?@Q@Q@V@V?W X//4z/B/B/G/G.HK  "#J " OO%$&J%))..338893<<,,116678$--22<<>>$..999%% **88)-f 9  & mm111@GFwi PGGJe Lcc ))IjIIJ ! &8 
 'IC	 	''c"	
 '   '11s   90I5c                 ^^^ SS jmSU4S jjn[        U U4S jS9n [        [        5      m[        U 5       HQ  u  p4[        U 5       H=  u  pVU" UR                  UR                  5      (       d  M)  TU   R                  U5        M?     MS     T(       d  [        U 5      $ [        U 5      n[        [        U4S j[        U5      5      5      n[        U5       HZ  n	X   n
[        TR                  5       5       H6  nTU   nUR                  U
5        U(       a  M"  TU	 UR                  U5        M8     M\     U Vs/ s H  oU   PM	     sn$ s  snf )Nc                   [        U 5      S:H  =(       a    [        U5      S:H  =(       Gd/    [        U 5      S:H  =(       a    [        U5      S:H  =(       Gd    S[        U 5      ;   =(       a    S[        U5      ;  =(       d    [        U 5      S:H  =(       a#    [        U5      S:H  =(       d    [        U5      S:H  =(       d    [        U 5      S	:H  =(       a    [        U5      R                  S
5      S:g  =(       db    [        U 5      S:H  =(       a    [        U5      S:H  =(       d8    [        U 5      S:H  =(       d    [        U 5      S:H  =(       a    [        U5      S:H  $ )Nr%  TensorzScalar?zTensor?Dimnamezint[]intzint?zTensor[]z[]zSymInt[]SymInt)rm   find)t1t2s     rr   is_arg_smaller&sort_overloads.<locals>.is_arg_smaller  s)   Gx $B8#$ $2w)# %B9$$ $ CG# )R($ Gw 8RE!6SW%6$ Gz! )BT"b($$ Gz! #B7"'$. W 4CGu$4 $B8#3	
rt   c                  > U R                  SS9UR                  SS9p2[        U5      [        U5      :w  a  g[        S [        X#5       5       5      n[        U4S j[        X#5       5       5      nU=(       a    U(       + $ )z-Returns True if s1 < s2 in the partial order.T)r  Fc              3  X   #    U  H   u  pUR                   UR                   :H  v   M"     g 7fr   )r4  )r(  arg1arg2s      rr   r+  5sort_overloads.<locals>.is_smaller.<locals>.<genexpr>  s!     O=NztDII*=Ns   (*c              3     >#    U  HV  u  p[        UR                  5      [        UR                  5      :H  =(       d    T" UR                  UR                  5      v   MX     g 7fr   )rm   r4  )r(  r  r  r  s      rr   r+  r    sF      
/
 		Nc$))n,Ttyy$))0TT/s   AA!)r0  rz   r8  r9  )s1s2args1args2equalsmaller_or_equalr  s         rr   
is_smaller"sort_overloads.<locals>.is_smaller  sw    |||6RV8Wuu:U# OS=NOO 
!%/
 
  -I-rt   c                6   > U R                   R                  TS9$ )Nr   )r   r  )xr   s    rr   r    sort_overloads.<locals>.<lambda>  s    )B)B&)B)Qrt   r   c                   > U T;  $ r   rw   )r  larger_thans    rr   r   r    s
    !;2Frt   )r  r    r  r    r   rO  )r  r   r  r   r   rO  )r   r   setr3  r   addr   rz   r   ranger   discardr   )r  r   r  i1	overload1i2	overload2N
sorted_idsidxr;  jlargerr  r  r  s    `            @@rr   r  r    s(   

:.  Q
 (33'7K"#45&'89MB)--y/B/BCCB##B' : 6
 %&& 	A (Fa!QRJQxO((*+A ^FNN16N!!!$ ,  +55*Qa *555s   :Ec               >   ^ ^^ [         SU UU4S jj5       nU" U5      $ )z2
Emit dispatch code for a single native function.
c                  > [        T[        5      (       a  STR                   3nOSU R                   3n[        R
                  " U R                  5      nSR                  S [        TU TS9 5       5      n[        U 5      n[        U 5      nSR                  [        U TS95      n[        TU TS9n[        TU TS9nSR                  UR                  5      n	SR                  UR                  5      n
TR                  =(       a/    [!        U 5      (       + =(       d    TR"                  =(       a    SU;   nU(       a  S	US   R$                   S
3OSnUS:X  a  U R                  R&                  R(                  n[+        U R                  R
                  5      R-                  S5      (       aX  U R                  R/                  5       [0        R2                  :X  a,  Ub$  [5        UR6                  R8                  5      (       d   eSnOSnU SU	 SU SU SU SU SU SU SU
 S
U SU S3$ TR;                  [=        U 5      5      nUb  U S3OSnU SU	 SU SU SU SU SU SU SU SU
 S
U S3$ )Nz// [deprecated] aten::z	// aten::rl  c              3  V   #    U  H  oR                    S UR                   3v   M!     g7f) N)type_strri   )r(  r)  s     rr   r+  3emit_single_dispatch.<locals>.go.<locals>.<genexpr>3  s%      #
.Xzzl!AFF8$.Xs   ')r   )python_signaturer   requires_gradz.set_requires_grad(r   r   void	_foreach_z\PyObject* self_tensorlist = _r.args[0];
Py_INCREF(self_tensorlist);
return self_tensorlist;
ru  z
auto dispatch_z = [](z) -> z, {
  pybind11::gil_scoped_release no_gil;
  (z);
};
dispatch_z;
z3 {
  pybind11::gil_scoped_release no_gil;
  return z);
};
return wrap(	dispatch_z);
)
isinstancer   rM  rj   r   ri   r   r
   r   r	   r   r   r   initsexprsrL  r   r   exprr0  self_argrm   
startswithkindr   inplacer&   argumentr4  rd  r_  )ro   schema_commentri   lambda_formalslambda_returndispatch_calleedispatch_argsparser_outputslambda_arg_exprsr  lambda_argsneed_set_requires_gradset_requires_gradr   return_stmtri  structseq_typerefpsr  r   s                    rr   go emit_single_dispatch.<locals>.go)  s    b3445b6J6J5KLN(1N xx #
.B2qQW.X#
 
 315 .a0		"4Q"LM 1QvF0QvF		*001ii 0 6 67 "$!7!7 "
"1%% C		A.@ 	 & "."A"F"F!GqI 	 F" vv''00H AFFKK ++K88FFKKMZ%7%77  +0C%%**1 1  
 0   fF>*% ?1]O $

qQ01 2 	 	 +../I!/LMH3;3G8*BR   fF>*% ?

	!M? +ya}A>O=P Q rt   ro   r   r   rm   r   )r  ro   r  r   r  s   ` `` rr   r  r    s+     Q Q Qf a5Lrt   )ro   r   r   rO  )ri   r   r   rm   )r|   +Sequence[PythonSignatureNativeFunctionPair]r   rO  )r   rm   r   rm   r   rm   r   rm   r   rm   r   rO  r   None)r   r  r    Callable[[NativeFunction], bool]r   z?dict[BaseOperatorName, list[PythonSignatureNativeFunctionPair]])r   r"   r   r  r   r  r   
str | Noner   rm   r   rO  r   rO  r   r  )
r   r"   r   r  r   r  r   rm   r   r  )r   r"   r   r  r   r  r   r  r   rm   r   rO  r   r  r   rO  r   r  )r   zlist[NativeFunction]r   rm   r   rO  r  rO  r  rO  r   r  )
r   r  r   rm   r   rO  r  rO  r   z'list[PythonSignatureNativeFunctionPair]r  )r|   r  r   z tuple[list[str], dict[str, str]])r|   r  r   ztuple[list[str], list[str]])r|   r  r   z	list[str])ri   r   r   r  r|   r  r   rO  r   rO  r   rm   )
ri   r   r   r  r  rO  r   rO  r   rm   )rg  r   r  r   r   rO  r   rm   )ri   r   r|   r  r   rO  r   ztuple[str, ...])
ri   r   r   r  r|   r  r   rO  r   rm   )r|   r  r   rO  r   Sequence[PythonSignatureGroup])r  r  r   rO  r   r  )
r  r   ro   r   r  r   r   rO  r   rm   )_
__future__r   r.  recollectionsr   typingr   rQ  torchgen.apir   torchgen.api.pythonr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   torchgen.code_templater   torchgen.contextr   torchgen.genr   r   r   torchgen.modelr   r   r   r   r   r    r!   torchgen.utilsr"   r#   torchgen.yaml_utilsr$   gen_inplace_or_view_typer&   gen_trace_typer'   collections.abcr(   r)   r*   _SKIP_PYTHON_BINDINGScompilerk   rn   rs   rx   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r_  rj  r   r  r  r  r  r  r   r  r  r  r   r   r  r  r  )rq   s   0rr   <module>r+     sI  D #  	 #         0 1 G G   : * 9 ( <<U p 0E/DGBJJ!G9A/D 	#   *!QDF#$'''($ y3	y3y3 y3 	y3
 y3 y3 
y3x
6

*
 E
* &&6& +& 	&
 & & & 
&R$$6$ +$ 	$
 
$N6 + 	
 
R ++6+ ++ 	+
 + + + + 
+f "<*<< 	<
 < 
< 1<,l6ll 	l
 
l -ll ) ):%>0&:0& 0&f:L * 2    (4( $* )
 * B
BB ;B
 B B 	BJ 
 $. :> HL  H  	
"
'
 	

 	
P


:
 	

 
>9
99 ;9
 9 	9H OS62:62GK62#62N JNN65N6BFN6#N6z ___ (_
 _ 	_W#s    I"