
    PhX                        d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	m
Z
mZmZ d dlZd dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlm Z  d dl!m"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.m/Z/m0Z0 d dl1m2Z2 ddl3m4Z4 g dZ5e5D  cg c]  } ejm                  d|  d       c} Z7g dZ8e"de+de9fd       Z:de)de;fdZ<de
e   de9fdZ=de+de9fdZ>de+de9fdZ?de+de9fdZ@de+de9fdZAde+de9fdZBde+de9fdZCde+de9fdZDde+de9fd ZEd!d"d#e;d$e;d%e;d&e;d'e;d(e9ddfd)ZFd*e
e   d+ee+ge9f   dee)ee   f   fd,ZGd!d"d-e/d*e
e   d+ee+ge9f   d.e	e;   d/e;d0e9d(e9ddfd1ZHd-e/d*e
e   d+ee+ge9f   d/e;ddf
d2ZId-e/d*e
e   d+ee+ge9f   d/e;ddf
d3ZJd!d"d-e/d*e
e   d+ee+ge9f   d.e	e;   d/e;d0e9d4eKd(e9ddfd5ZLd6d6d7d8ee+   d&e;d0e9d9e9d:e9de
e   fd;ZMd*e
e   d&e;d0e9d:e9dee   f
d<ZNe"de+de;fd=       ZOde
e   deee;   ee;e;f   f   fd>ZPde
e   deee;   ee;   f   fd?ZQde
e   dee;   fd@ZR e dA      ZS e dB      ZT e dC      ZU e dD      ZVd!d"de)d.e	e;   de
e   d0e9d(e9de;fdEZWde)d.e	e;   dFe9d0e9de;f
dGZX e dH      ZYd!d"dIedJee;e;f   d(e9de;fdKZZde)de
e   d0e9dee;dLf   fdMZ[de)d.e	e;   de
e   d0e9de;f
dNZ\d!d"de
e   d(e9de
e   fdOZ]d!d"dPe
e   d(e9de
e   fdQZ^d!d"dRede+dJee;e;f   d(e9de;f
dSZ_yc c} w )T    N)defaultdict)CallableDictIterableListOptionalSequenceSetTuple)cpp)arg_parser_output_exprscpp_dispatch_exprscpp_dispatch_targetdispatch_lambda_argsdispatch_lambda_exprsdispatch_lambda_return_strhas_tensor_optionsnamedtuple_fieldnamesPythonSignaturePythonSignatureDeprecatedPythonSignatureGroup!PythonSignatureNativeFunctionPair	signaturesignature_from_schema)CodeTemplate)with_native_function)
cpp_stringparse_native_yamlparse_tags_yaml)ArgumentBaseOperatorNameFunctionSchemaNativeFunctionTypeVariant)FileManagersplit_name_params)
YamlLoader   )should_trace)Oalias
contiguousis_cuda	is_sparseis_sparse_csrsizestride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_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^$)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!)freturnc                    d| j                   v rd| j                   vryt        j                  | j                        }t        D ]  }|j                  |      s y t        | j                        }t        D ]	  }||k(  s	 y y)N	generated	view_copyFT)tagsr   namefuncSKIP_PYTHON_BINDINGSmatchstrSKIP_PYTHON_BINDINGS_SIGNATURES)r`   rf   
skip_regexr   patterns        zC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torchgen/packaged/autograd/gen_python_functions.pyshould_generate_py_bindingro      st     affAFF!:88AFFD*
D! + AFFI2i 3     rf   c                     d|  S )NTHPVariable_ )rf   s    rn   get_pycnamert      s    $  rp   	overloadsc                 b    t        |       dk(  xr  | d   j                  j                         dk(  S )Nr)   r   )lenr   arguments_count)ru   s    rn   is_noargry      s.    y>QP9Q<#9#9#I#I#Kq#PPrp   c                 Z    | j                   d u xr t        j                  | j                  v S N)python_moduler%   methodvariantsr`   s    rn   is_py_variable_methodr      s#    ??d"Cw~~'CCrp   c                 Z    | j                   d u xr t        j                  | j                  v S r{   )r|   r%   functionr~   r   s    rn   is_py_torch_functionr      s%    ??d"Ew'7'71::'EErp   c                      | j                   dk(  S )Nnnr|   r   s    rn   is_py_nn_functionr      s    ??d""rp   c                      | j                   dk(  S )Nfftr   r   s    rn   is_py_fft_functionr      s    ??e##rp   c                      | j                   dk(  S )Nlinalgr   r   s    rn   is_py_linalg_functionr          ??h&&rp   c                      | j                   dk(  S )Nnestedr   r   s    rn   is_py_nested_functionr      r   rp   c                      | j                   dk(  S )Nsparser   r   s    rn   is_py_sparse_functionr      r   rp   c                      | j                   dk(  S )Nspecialr   r   s    rn   is_py_special_functionr      s    ??i''rp   Tsymintoutnative_yaml_pathtags_yaml_pathdeprecated_yaml_pathtemplate_pathr   c          
         t        | |d      }t        ||      j                  }t        t	        t
        |            }t        ||d      }t        ||t        d dd|       t        ||d      }	t        ||	t        dddd	|
       t        ||	t        ddd|       t        ||	t        ddd|       t        ||	t        ddd|       t        ||	t        ddd       t        ||	t        ddd|       t        ||	t         ddd|       t#        ||	d d       t%        ||	d d       t'        |      dt(        t*        t*        f   ffd}
|j-                  d|
       y )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                      yNTrs   fns    rn   <lambda>zgen.<locals>.<lambda>e      $rp   zpython_return_types.cppc                      yr   rs   r   s    rn   r   zgen.<locals>.<lambda>h  r   rp   zpython_return_types.hra   c                  p    ddj                  t              D  cg c]  } d|  d|  d c}       iS c c} w )Nenum_of_valid_tags z	
.value("z", at::Tag::))joinsorted)tag
valid_tagss    rn   gen_tags_enumzgen.<locals>.gen_tags_enumm  sJ     EKJEWXEWcz#l3%q9EWX
 	
 Ys   3
zpython_enum_tag.cpp)r&   r   native_functionslistfilterro   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   r   rj   write)r   r   r   r   r   r   fmr   methods	functionsr   r   s              @rn   genr      s    
=%	PB(.  F#=?OPQ.0DTRG
%   02FuUI"
$	 
! 
" 
% 
% 
% 
& '
I(A .
I(? !0J
4S> 
 HH"M2rp   pairspredc                     t        t              }| D ]Q  } ||j                        s||j                  j                  j                  j                     j                  |       S |S r{   )r   r   r   rg   rf   append)r   r   groupedpairs       rn   group_filter_overloadsr   y  sY     	D  DMM&&++00188>  Nrp   r   modulefilenamer}   c          
         
 g g 
g g t        ||      }t        |j                         t              D ]  }||   }	j	                  t        |||	||             j	                  t        |||	|             j                  t        ||	|             
j	                  d|j                   d         j                   
fd       y)+Generates Python bindings to ATen functionskeyr   r   #include <ATen/ops/.h>c                  B    ddj                          d  z   dS )N@generated from /)generated_commentops_headerspy_forwards
py_methodspy_method_defstemplate_dir_for_comments)r   r   r   r   r   r   s   rn   r   z(create_python_bindings.<locals>.<lambda>  s7    !$ < < >?q
K"L&&$,
rp   N)r   r   keysrj   r   method_impl
method_defextendforward_declsbasewrite_with_template)r   r   r   r   r   r}   r   r   rf   ru   r   r   r   r   s   `   `     @@@@rn   r   r     s     JK "NK$UD1Gw||~3/DM	fivN	
 	jvyPQ=yHI03?@ 0 	
 	
rp   c                 \   	
 g 	g 
t        ||      }t        |j                         t              D ]]  }||   }t	        |      \  }}	j                  |sdndj                  |             
j                  |sdndj                  |             _  j                   	
fd       y)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                  >    ddj                          d  z   dS )Nr   r   r   )r   py_return_typespy_return_types_registrationsr   )r   r   py_return_types_definitionr   s   rn   r   z4create_python_return_type_bindings.<locals>.<lambda>  s1    !$ < < >?q
K"L9-J	
rp   N)r   r   r   rj   1generate_return_type_definition_and_registrationsr   r   r   )r   r   r   r   r   rf   ru   definitionsregistrationsr   r   s   `  `     @@rn   r   r     s     -//1!$UD1Gw||~3/DM	%V&
"] 	#))!Btyy'=	
 	&,,#B=)A	
 0 	
	rp   c                     g t        ||      }t        |j                         t              D ]6  }||   }t	        |      }j                  |sdndj                  |             8  j                   fd       y)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                  <    ddj                          d  z   dS )Nr   r   r   )r   py_return_types_declarationsr   )r   r   r   s   rn   r   z;create_python_return_type_bindings_header.<locals>.<lambda>  s.    !$ < < >?q
K"L,H
rp   N)r   r   r   rj   !generate_return_type_declarationsr   r   r   )	r   r   r   r   r   rf   ru   declarationsr   s	   `  `    @rn   r   r     sz     /1 $UD1Gw||~3/DM	8C$++"B		,(?	
 0 	
rp   r   c          
      d   t        ||      }dt        t        t        t           f   dt
        fd}	dt        t        t        t           f   dt        t
        t        t
           f   ffd}
| j                  ||j                         ddd| j                          d| z   i|	|
|h d	
       y)r   kvra   c                      | d   j                   S )Nr   )r   )r   s    rn   key_funcz0create_python_bindings_sharded.<locals>.key_func  s     !uzzrp   c           	          | \  }}d|j                    dgt        t        ||            t        ||      gt	        ||      gdS )Nr   r   r   r   )r   r   r   r   )r   r   r   r   r   )r   rf   fn_pairsr}   r   r   s      rn   env_funcz0create_python_bindings_sharded.<locals>.env_func	  sd     h1$))C@AdHV LMD&(6&Q  *$PQ
 	
rp   r   r   r   r   >   r   r   r   r   )base_envkey_fnenv_callabler   sharded_keysN)
r   r   r!   r   r   rj   r   write_shardeditemsr   )r   r   r   r   r   r}   r   r   r   r   r   s      ` ` `   rn   r   r     s     %UD1G"D)J$KKL	

"D)J$KKL
	c49n	
  < < >?q
K"L
 S  rp   F)skip_deprecatedpyir   r  r  c                    t         dt        dt        ffd       }t        t	        ||             }t        ||      }|r|S ||z   S )Nr`   ra   c                 6    t        t        |       |       S )Nr}   r  r   r   )r   r   )r`   r}   r  s    rn   gen_signature_pairsz,load_signatures.<locals>.gen_signature_pairs,  s    0&c:
 	
rp   r  )r   r#   r   r   mapload_deprecated_signatures)r   r   r}   r  r  r  r   
deprecateds     ` `   rn   r   r   $  sc     
~ 
2S 
 
 (*:;<E+#FJ $5;);;rp   c                   t        t              }| D ]*  }||j                  j                     j	                  |       , g }t        |      5 }t        j                  |t              }d d d        D ]  }	t        j                  |	d         t        |	d         \  }
|
j                  d      r|
j                  dd      }
dt        j                  d      ij                  j                   D ci c]  }|j                  | c}D ]  }|v r|v rJ d|         d	t        d
t"        ffd}d}||
   D ]  } ||j$                  j&                        s d}t)        |j$                  j*                  ||      }|j	                  t-        t/        |j                  |j0                  |j2                  |j4                  |j6                  |j8                  t;              |j<                  	      |j$                                |rJ d|
 dt?                       |S # 1 sw Y   xY wc c}w )N)Loaderrf   aten_outr   1Scalarz*deprecation definiton: Unrecognized value aten_schemara   c                 h   	r?t        j                  | j                  j                  | j                  j                        }n| j                  j
                  }t        |      D ]p  \  }}|t              k  rO|   }|
v r
|   }d }n|   }|j                  }|j                  }||j                  k7  s||j                  k7  sa y|j                  p y t        j                        t        | j                        k(  xr0 t        d t        j                  | j                        D              S )NFc              3   ,   K   | ]  \  }}||k(    y wr{   rs   ).0abs      rn   	<genexpr>zKload_deprecated_signatures.<locals>.is_schema_compatible.<locals>.<genexpr>  s      K#K41aQ#Ks   )	itertoolschain	argumentsr   flat_non_outflat_all	enumeraterw   type
annotationdefaultreturnsallzip)r  r   iargarg_nameschema_typeschema_annotation
schema_arg	call_argsis_outknown_constantsschemaschema_args_by_names           rn   is_schema_compatiblez8load_deprecated_signatures.<locals>.is_schema_compatiblee  s    %OO))--{/D/D/Q/Q	 (11::	#I.3s9~%(|H?2&5h&?,0)%8%B
&0oo,6,A,A)"chh.2Cs~~2U${{*$ /" v~~&#k.A.A*BB s K#&v~~{7J7J#KK H rp   FT)category_overrider}   r  )	rf   
input_argsinput_kwargsoutput_argstensor_options_argsr}   deprecated_schemadeprecated_args_exprsr'  r  zNo native function with name z matched signature:
  ) r   r   r   rf   r   openyamlloadr(   r"   parser'   endswithreplacer$   r   r"  boolr   rg   r   r6  r   r   r7  r8  r9  r:  r}   tupler'  rj   )r   r   r}   r  r   r   resultsr`   deprecated_defsr  	aten_namer  rf   r5  any_schema_found
python_sigr0  r1  r2  r3  r4  s                   @@@@@rn   r  r  :  sN    CNdBSG##$++D1  8:G	"	#q))Aj9 
$ &
%%j&890F1CD	9##F+!))&"5I
 H%
 392B2B2K2KL2KQqvvqy2KLD++t/FC;D6BCF 	'		 	@ !I&D'(:(:;#."&--"A"A	J NN17'__#-#8#8%/%<%<$.$:$:,6,J,J)00*0.3I.> * 2 2
 "]] ': 	[*9+5LSQW[MZ	[e &j Nq 
$	# Ms   H18H>1H;c                     t        j                  | j                        }t        | j                  j                        }dj                  |g|z         S )N_)r   rf   rg   r   r'  r   )r`   rf   
fieldnamess      rn   gen_namedtuple_typename_keyrM    s<    88AFFD&qvv~~6J88TFZ'((rp   c                 z   i }g }| D ]  }t        |j                  j                  j                        }|s/t	        j
                  |j                  j                        }t        |j                        }|j                  |      }|d|sdn
t        |       }|||<   |j                  d| d| d        ||fS )zr
    Generate block of named tuple type def inits, and add typeref snippets
    to declarations that use them
    
NamedTupler   zstatic PyTypeObject* z = generated::get__namedtuple();
r   r   rg   r'  r   rf   rM  getrw   r   )ru   	typenamestypedefsoverloadrL  rf   tn_keytypenames           rn   emit_namedtuple_callrX    s     	  H*8+<+<+A+A+I+IJ
xx))../,X->->?==(#hBCM#JKH (IfOOZ1$~I   Yrp   c                    i }g }g }| D ]  }t        |j                  j                  j                        }|s/dj	                  d |D              }t        j                  |j                  j                        }t        |j                        }|j                  |      }	|	| d|sdn
t        |       }	|	||<   |j                  d| d| d|	 d| d	t        |       d
|	 d|	 d|	 d       |j                  d| d| d        ||fS )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   (   K   | ]
  }d | d  yw){"z", ""}Nrs   )r  r   s     rn   r  zDgenerate_return_type_definition_and_registrations.<locals>.<genexpr>  s     BzSG,zs   rO  r   PyTypeObject* get_zJ_namedtuple() {
    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_namedtuple());)r   r   rg   r'  r   r   rf   rM  rR  rw   r   )
ru   rS  r   r   rU  rL  fieldsrf   rV  rW  s
             rn   r   r     s^    	   K!M*8+<+<+A+A+I+IJ
BzBBxx))../,X->->?==(zK"SEU)VWH (If& <<B8 D!
 #@@DvEdehisetdu v$$,: .		
  J     6tf<NtfTcd= D %%rp   c                 t   i }g }| D ]  }t        |j                  j                  j                        }|s/t	        j
                  |j                  j                        }t        |j                        }|j                  |      }|| d|sdn
t        |       }|||<   |j                  d| d        |S )z
    Generate block of function declarations in `python_return_types.h` to initialize
    and return named tuple for a native function.
    rO  r   r]  rP  rQ  )ru   rS  r   rU  rL  rf   rV  rW  s           rn   r   r   	  s     	  !L*8+<+<+A+A+I+IJ
xx))../,X->->?==(&
\2s<?P"QR  !)If"4TF. IJ   rp   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                   t        |       }t        |      }t        |      \  }}dg}	|	|z  }	|	|rdgng z  }	|rg ndgdgz   }
t        d |D              rdnd}t	        ||      }t        |      d	k(  }g }g }t        |      D ]  \  }}|j                  j                  |      }|j                  t        t        |             d
       t        |||      }|j                  |st        j                  ||      n|        |rt        }n|rt         }nt"        }|j                  | ||	t%        d |D              ||t'        | |||      ||
|rd
      S d
      S )z?
    Generate a python binding for all overloads of an op.
    HANDLE_TH_ERRORSz/const Tensor& self = THPVariable_Unpack(self_);zPy_RETURN_NONE;END_HANDLE_TH_ERRORSc              3   F   K   | ]  }t        |j                          y wr{   )r*   r   r  os     rn   r  zmethod_impl.<locals>.<genexpr>  s     J	1l1::6	s   !truefalser   r)   ,)overload_indexbodyc              3   P   K   | ]  }|j                   j                            y wr{   )r   rx   rd  s     rn   r  zmethod_impl.<locals>.<genexpr>  s     FIqQ[[002Is   $&)rf   r   noargr}   self_nullptr)
rf   pycnamemethod_headermax_args
signatures	traceablecheck_has_torch_functiondispatchmethod_footerrm  )rt   ry   rX  r(  group_overloadsrw   r#  r   signature_strr   r   rj   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)rf   r   ru   r}   r   ro  rl  namedtuple_initsnamedtuple_typenamesrp  rv  rs  grouped_overloadsis_singletonrr  ru  ri  rU  r   dispatch_bodytemplates                        rn   r   r   u  s    $GYE-A)-L**'(M%%M?E	:;2M !R'8&9>T=UUMJ	JJPWI8G&9 ()Q.LJH$-.?$@ &&44F4C	ZI78:;**6
 	   ''-M (  	
 %A ,	7-#FIFF!=	"
 #g    &/   rp   rl  c                f    |r	|rd|  dS y|rdnd}|rdddd	d
ddd|   nd}d| d| d|xs d dS )NzMif(check_has_torch_function(self_)) {
  return handle_torch_function(self_, "z");
}
r   rm  rn  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.Tensorrs   )rf   r   rl  r}   rm  	namespaces         rn   r  r    s     ((,v .  G9E  268>>>@	
 	   $$)7*:9+SIaSaHb c rp   zRif (_r.isNone(${out_idx})) {
  ${call_dispatch}
} else {
  ${call_dispatch_out}
}
rU  r  c          
      D   | j                   rt        j                  | j                  j	                         t        | j                  | j                  ||      t        | j                  | j                   ||            S t        | j                  | j                  ||      S )a0  
    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   )rU  r  r   s      rn   ry  ry    s     $))&&113.""HMM3GPV 3""!!$	 * 
 	
 $/CF
 	
rp   .c                P    |ryt        |       }t        |      rd| dfS d| dfS )Nrs   zstatic PyObject * z#(PyObject* self_, PyObject* args);
z5(PyObject* self_, PyObject* args, PyObject* kwargs);
)rt   ry   )rf   ru   r}   ro  s       rn   r   r     sX     $G	) 
 	
) 
 	
rp   c                    t        |       }| j                  rd| d}t        |      r|rdnd}nd| d}d}|dk(  r|dz  }d	|  d
| d| dS )z$
    Generate method def entry.
    zTypeError_to_NotImplemented_<>METH_NOARGSzMETH_VARARGS | METH_KEYWORDSzcastPyCFunctionWithKeywords(r   r   z | METH_STATICr\  z", rZ  z, NULL},)rt   dunder_methodry   )rf   r   ru   r}   ro  flagss         rn   r   r   2  sx     $G1'!<	!'-K0	;.!!c'"UG955rp   c          
         i }i }| D ]  }|j                   j                  d|      }|j                  j                  j	                         rG||v r=t        d|j                  j                   d||   j                  j                   d      |||<   ||v r=t        d|j                  j                   d||   j                  j                   d      |||<    |j                         D ])  \  }}||vsg }| D ]  }t        |j                  j                  j                  j                        t        |j                  j                  j                  j                        k(  sk|j                  j                  j	                         r|j                   j                  r|j                  |j                   j                  d|              |j                   j                  |      }t        d| d| d	d
j                  d |D              z          |j                         D 	cg c]+  \  }}	t        j                  |	|j                  |            - }
}}	t        |
|      S c c}	}w )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   &   K   | ]	  }d |   yw)z- Nrs   )r  	candidates     rn   r  z"group_overloads.<locals>.<genexpr>  s     Ijb,js   )
functionalr   )r   rx  r   rg   	is_out_fnRuntimeErrorr  rj   rf   r  r   r   r   
from_pairsrR  sort_overloads)ru   r   bases	outplacesrU  sigr   
candidatesout_sigr   r   s              rn   rw  rw  U  s~    ;=E>@I   ..D.P!!++-i"?@Q@Q@V@V?W X//8~/F/F/K/K.LAO  &IcNe|"?@Q@Q@V@V?W X//4Sz/B/B/G/G.HK  "E#J " OO%Se$&J%))..338893<<,,116678$--22<<>$..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   *0I*r  c                   dt         dt         dt        fddt        dt        dt        ffd}t        | fd	      } t	        t
              t        |       D ]J  \  }}t        |       D ]7  \  }} ||j                  |j                        s$|   j                  |       9 L st        |       S t        |       }t        t        fd
t        |                  }t        |      D ]R  }	||	   }
t        j                               D ]/  }|   }|j                  |
       |r|= |j                  |       1 T |D cg c]  }| |   	 c}S c c}w )Nt1t2ra   c                    t        |       dk(  xr t        |      dk(  xs t        |       dk(  xr t        |      dk(  xs dt        |       v xr dt        |      vxs t        |       dk(  xr t        |      dk(  xs t        |      dk(  xs} t        |       d	k(  xr t        |      j                  d
      dk7  xsN t        |       dk(  xr t        |      dk(  xs. t        |       dk(  xs t        |       dk(  xr t        |      dk(  S )Nr  TensorzScalar?zTensor?Dimnamezint[]intzint?zTensor[]z[]zSymInt[]SymInt)rj   find)r  r  s     rn   is_arg_smallerz&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	
rp   s1s2c                     | j                  d      |j                  d      }}t        |      t        |      k7  ryt        d t        ||      D              }t        fdt        ||      D              }|xr | S )z-Returns True if s1 < s2 in the partial order.T)r  Fc              3   T   K   | ]   \  }}|j                   |j                   k(   " y wr{   )r$  )r  arg1arg2s      rn   r  z5sort_overloads.<locals>.is_smaller.<locals>.<genexpr>  s$     O=NztTDII*=Ns   &(c              3      K   | ]Q  \  }}t        |j                        t        |j                        k(  xs  |j                  |j                         S y wr{   )rj   r$  )r  r  r  r  s      rn   r  z5sort_overloads.<locals>.is_smaller.<locals>.<genexpr>  sI      
/
d 		Nc$))n,Ttyy$))0TT/s   AA)r   rw   r(  r)  )r  r  args1args2equalsmaller_or_equalr  s         rn   
is_smallerz"sort_overloads.<locals>.is_smaller  s}    |||6RV8Wuu:U# OS=NOO 
!%/
 
  -I-rp   c                 <    | j                   j                        S )Nr   )r   rx  )xr   s    rn   r   z sort_overloads.<locals>.<lambda>  s    )B)B&)B)Qrp   r   c                     | vS r{   rs   )r  larger_thans    rn   r   z sort_overloads.<locals>.<lambda>  s
    !;2Frp   )r$   rC  r   r   r   setr#  r   addr   rw   r   ranger   discardr   )r  r   r  i1	overload1i2	overload2N
sorted_idsidxr*  jlargerr  r  r  s    `            @@rn   r  r    sV   

4 
T 
d 
:. .O . .  Q
 (33'7K"#45I&'89MB	)--y/B/BCB##B' : 6
 %&& 	A (Fa!QRJQxsO((*+A ^FNN1N!!!$ ,  +55*Qa *555s   Epsc                R     t         dt        dt        f fd       } ||      S )z:
    Emit dispatch code for a single native function.
    r`   ra   c                 p   t        t              rdj                   }nd| j                   }j                  rdnd}t        j                  | j                        }dj                  d t        |       D              }t        |       }t        |       }dj                  t        |             }t        |       }t        |       }	d	j                  |	j                        }
dj                  |	j                        }j                   xr  t#        |        xs j$                  xr d
|v }|rd|d
   j&                   dnd}|dk(  r | d	|
 d| d| d| d| d| d| d| d| dS j)                  t+        |             }|| dnd}| d	|
 d| d| d| d| d| d| d| d| d| dS )Nz// [deprecated] aten::z	// aten::z[deprecated] r   rZ  c              3   R   K   | ]  }|j                    d |j                    ! yw) N)type_strrf   )r  r  s     rn   r  z3emit_single_dispatch.<locals>.go.<locals>.<genexpr>*  s(      #
.Xqzzl!AFF8$.Xs   %'r   )python_signaturer   requires_gradz.set_requires_grad(r   voidz
auto dispatch_z = [](z) -> z, {
  pybind11::gil_scoped_release no_gil;
  (z);
};
dispatch_z;
Py_RETURN_NONE;
z3 {
  pybind11::gil_scoped_release no_gil;
  return z);
};
return wrap(	dispatch_z);
)
isinstancer   r;  rg   r  r   rf   r   r   r   r   r   r   r   initsexprsr:  r   r}   exprrR  rM  )r`   schema_commentr  rf   lambda_formalslambda_returndispatch_calleedispatch_argsparser_outputslambda_arg_exprsr  lambda_argsneed_set_requires_gradset_requires_gradrW  namedtuple_typerefr  r  r   s                   rn   goz emit_single_dispatch.<locals>.go  sI    b345b6J6J5KLN(1N(*_2
 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"   fF>*% ?1]O $

qQ01 2	 	 ,//0KA0NOH4<4HH:Rb   fF>*% ?

	!M? + 	$qQ?P>Q R rp   )r   r#   rj   )r  r`   r  r   r  s   ` `` rn   r  r    s5     @n @ @ @D a5Lrp   )`r  recollectionsr   typingr   r   r   r   r   r	   r
   r   r>  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%   torchgen.utilsr&   r'   torchgen.yaml_utilsr(   gen_trace_typer*   _SKIP_PYTHON_BINDINGScompilerh   rk   rC  ro   rj   rt   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r  rM  rX  r   r   r~  rz  r}  r|  r   r  r  ry  r   r   rw  r  r  )rm   s   0rn   <module>r     s  D  	 # Q Q Q     " 0 1 G G  : * (P f 0E/DGBJJ!G9A/D 	#  . T  *!& !3 !Q!BC Q QD^ D DFN Ft F# #D #$. $T $'^ ' ''^ ' ''^ ' '(n ( ($ y3	y3y3 y3 	y3
 y3 y3 
y3x
56

N#T)
*
 

D!BC
CD
* &&56& N#T)
*& SM	&
 & & & 
&R$$56$ N#T)
*$ 	$
 
$N56 N#T)
* 	
 
R ++56+ N#T)
*+ SM	+
 + + + + 
+f "<>*<< 	<
 < 
< /0<,l56ll 	l
 
l 

+,ll )> )c ) )9:
49d38n$%>0&9:0&
49d3i 0&f9:	#YL * 2    (4( $* )
 * D
DSMD 9:D
 D D 	DN 
 $,SM =A KO  H  	
"
sCx.
 	

 	
P


9:
 	

 38_
>6
6SM6 9:6
 6 	6H OS629:62GK62"#62N JNN6 45N6BFN6"#N6z NNN sCx.N
 N 	N[#s   K: