o
    0h                     @  s  d dl mZ d dlZd dlZd dlmZ d dl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)m*Z* d dl+m,Z,m-Z- d dl.m/Z/ ddl0m1Z1 ddl2m3Z3 erd dl4m5Z5m6Z6 g dZ7dd e7D Z8g dZ9edddZ:dddZ;dd"d#Z<dd$d%Z=dd&d'Z>dd(d)Z?dd*d+Z@dd,d-ZAdd.d/ZBdd0d1ZCdd2d3ZDd4d5dd=d>ZEddCdDZFd4d5ddKdLZGddMdNZHddOdPZId4d5ddSdTZJdUdUdVdd[d\ZKdd^d_ZLedd`daZMddcddZNddfdgZOddidjZPedkZQedlZRedmZSednZTd4d5ddodpZUddrdsZVedtZWd4d5ddydzZXdd|d}ZYdd~dZZd4d5dddZ[d4d5dddZ\d4d5dddZ]dS )    )annotationsN)defaultdict)Callable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)IterableSequence)S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__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_updatec                 C  s   g | ]}t d | dqS )^$)recompile).0pattern rg   c/var/www/vscode/kcb/lib/python3.10/site-packages/torchgen/packaged/autograd/gen_python_functions.py
<listcomp>   s    ri   )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!)fr   returnboolc                 C  sd   d| j v rd| j vrdS t| j}tD ]
}||r dS qt| j}tD ]	}||kr/ dS q&dS )N	generated	view_copyFT)tagsr   namefuncSKIP_PYTHON_BINDINGSmatchstrSKIP_PYTHON_BINDINGS_SIGNATURES)rj   rp   
skip_regexr   rf   rg   rg   rh   should_generate_py_binding   s   

rw   rp   r   rt   c                 C  s
   d|  S )NTHPVariable_rg   rp   rg   rg   rh   get_pycname      
rz   	overloads+Sequence[PythonSignatureNativeFunctionPair]c                 C  s   t | dko| d j dkS )Nr%   r   )lenr   arguments_count)r|   rg   rg   rh   is_noarg   s   r   c                 C     | j d u o
tj| jv S N)python_moduler!   methodvariantsrj   rg   rg   rh   is_py_variable_method      r   c                 C  r   r   )r   r!   functionr   r   rg   rg   rh   is_py_torch_function   r   r   c                 C  
   | j dkS )Nnnr   r   rg   rg   rh   is_py_nn_function   r{   r   c                 C  r   )Nfftr   r   rg   rg   rh   is_py_fft_function   r{   r   c                 C  r   )Nlinalgr   r   rg   rg   rh   is_py_linalg_function   r{   r   c                 C  r   )Nnestedr   r   rg   rg   rh   is_py_nested_function   r{   r   c                 C  r   )Nsparser   r   rg   rg   rh   is_py_sparse_function   r{   r   c                 C  r   )Nspecialr   r   rg   rg   rh   is_py_special_function   r{   r   Tsymintoutnative_yaml_pathtags_yaml_pathdeprecated_yaml_pathtemplate_pathr   Nonec             
     s>  t | |dd}t||j}ttt|}t||dd}t||td dd|d t||dd}	t	||	t
dddd	|d
 t||	tddd|d t||	tddd|d t||	tddd|d t||	tdddd t||	tddd|d t||	tddd|d t||	dd d t||	dd d t| d! fdd}
|d |
 d S )"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                 S     dS NTrg   fnrg   rg   rh   <lambda>q      zgen.<locals>.<lambda>zpython_return_types.cppc                 S  r   r   rg   r   rg   rg   rh   r   t  r   zpython_return_types.hrk   dict[str, str]c                     s   dd dd t D iS )Nenum_of_valid_tags c                 S  s   g | ]}d | d| dqS )z	
.value("z", at::Tag::)rg   )re   tagrg   rg   rh   ri   }  s    z.gen.<locals>.gen_tags_enum.<locals>.<listcomp>)joinsortedrg   
valid_tagsrg   rh   gen_tags_enumy  s
   zgen.<locals>.gen_tags_enumzpython_enum_tag.cpp)rk   r   )r"   r   native_functionslistfilterrw   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)r   r   r   r   r   r   fmr   methods	functionsr   rg   r   rh   gen	  s   	


	
	r   pairspred Callable[[NativeFunction], bool]?dict[BaseOperatorName, list[PythonSignatureNativeFunctionPair]]c                 C  s6   t t}| D ]}||jr||jjjj | q|S r   )r   r   r   rq   rp   append)r   r   groupedpairrg   rg   rh   group_filter_overloads  s   
r   r   r"   module
str | Nonefilenamer   c          
   
     s   g g g g t ||}t| tdD ]1}|| }	t|||	||d t|||	|d t||	|d d|j	 d q
   fdd dS )	+Generates Python bindings to ATen functionskeyr   r   #include <ATen/ops/.h>c                     s$   dd   d   dS )N@generated from /)generated_commentops_headerspy_forwards
py_methodspy_method_defstemplate_dir_for_commentsrg   r   r   r   r   r   r   rg   rh   r     s   z(create_python_bindings.<locals>.<lambda>N)r   r   keysrt   r   method_impl
method_defextendforward_declsbasewrite_with_template)
r   r   r   r   r   r   r   r   rp   r|   rg   r   rh   r     s$   
r   c           	        s   g g t ||}t| tdD ]$}|| }t|\}}|s#dnd| |s/dnd| q   fdd dS )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    dd   d   dS )Nr   r   r   )r   py_return_typespy_return_types_registrationsr   rg   r   r   py_return_types_definitionr   rg   rh   r     s   z4create_python_return_type_bindings.<locals>.<lambda>N)r   r   r   rt   1generate_return_type_definition_and_registrationsr   r   r   )	r   r   r   r   r   rp   r|   definitionsregistrationsrg   r   rh   r     s&   

r   c                   sj   g t ||}t| tdD ]}|| }t|}|sdnd| q   fdd dS )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   dd   d   dS )Nr   r   r   )r   py_return_types_declarationsr   rg   r   r   r   rg   rh   r     s
   z;create_python_return_type_bindings_header.<locals>.<lambda>N)r   r   r   rt   !generate_return_type_declarationsr   r   r   )r   r   r   r   r   rp   r|   declarationsrg   r   rh   r     s   

r   r   intc             	     sb   t ||}ddd}	d fdd	}
| j|| d
dd|   d|  i|	|
|h dd dS )r   kv@tuple[BaseOperatorName, list[PythonSignatureNativeFunctionPair]]rk   rt   c                 S  s
   | d j S )Nr   )r   )r   rg   rg   rh   key_func  s   
z0create_python_bindings_sharded.<locals>.key_funcdict[str, list[str]]c              	     sN   | \}}d|j  dgtt|| dt|| dgt|| dgdS )Nr   r   r   r   )r   r   r   r   )r   r   r   r   r   )r   rp   fn_pairsr   r   r   rg   rh   env_func  s   z0create_python_bindings_sharded.<locals>.env_funcr   r   r   r   >   r   r   r   r   )base_envkey_fnenv_callabler   sharded_keysN)r   r   rk   rt   )r   r   rk   r   )r   write_shardeditemsr   )r   r   r   r   r   r   r   r   r   r   r  rg   r   rh   r     s   


r   F)skip_deprecatedpyir   list[NativeFunction]r  r	  c                  sB   t d fdd}tt|| }t|| d}|r|S || S )	Nrj   r   rk   r   c                   s   t t|  d| dS )Nr   r	  r   r   )r   r   r   r  rg   rh   gen_signature_pairs8  s   z,load_signatures.<locals>.gen_signature_pairsr  )rj   r   rk   r   )r   r   mapload_deprecated_signatures)r   r   r   r  r	  r  r   
deprecatedrg   r  rh   r   0  s   r   'list[PythonSignatureNativeFunctionPair]c                  s  t t}| D ]}||jj | qg }t|}tj|td}W d    n1 s*w   Y  |D ]}	t	
|	d t|	d \}
 |
drO|
dd}
dt
didd	 jjD  D ]}|v sr|v srJ d
| qad fdd}d}||
 D ]3}||jjsqd}t|jj||d}|tt|j|j|j|j|j|jt |jd	|jd q|sJ d|
 dt q1|S )N)Loaderrp   aten_outr   1Scalarc                 S  s   i | ]}|j |qS rg   ry   re   arg   rg   rh   
<dictcomp>i      z.load_deprecated_signatures.<locals>.<dictcomp>z*deprecation definiton: Unrecognized value aten_schemar   rk   rl   c                   s   rt | jj| jj}n| jj}t|D ]9\}}|t k rF | }|v r.| }d }n
| }|j}|j	}||jksB||j	krE dS q|j
d u rN dS qtjt| jkoftdd tj| jD S )NFc                 s  s    | ]	\}}||kV  qd S r   rg   )re   r  brg   rg   rh   	<genexpr>  s    
zKload_deprecated_signatures.<locals>.is_schema_compatible.<locals>.<genexpr>)	itertoolschain	argumentsr   flat_non_outflat_all	enumerater~   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_namerg   rh   is_schema_compatibleq  s.   
z8load_deprecated_signatures.<locals>.is_schema_compatibleFT)category_overrider   r	  )	rp   
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   rk   rl   )r   r   r   rp   r   openyamlloadr$   r   parser#   endswithreplacer    r   r"  r   rq   r   r7  r   r   r8  r9  r:  r;  r   tupler'  rt   )r   r   r   r	  r   r   resultsrj   deprecated_defsr  	aten_namerp   r6  any_schema_found
python_sigrg   r0  rh   r  F  sj   


 r  c                 C  s(   t | j}t| jj}d|g| S )N_)r   rp   rq   r   r'  r   )rj   rp   
fieldnamesrg   rg   rh   gen_structseq_typename_key  s   rL   tuple[list[str], dict[str, str]]c                 C  s   i }g }| D ]<}t |jjj}|sqt|jj}t|j}||}|du rBd|s,dnt| }|||< |	d| d| d q||fS )zr
    Generate block of named tuple type def inits, and add typeref snippets
    to declarations that use them
    N
NamedTupler   zstatic PyTypeObject* z = generated::get__structseq();
r   r   rq   r'  r   rp   rL  getr~   r   )r|   	typenamestypedefsoverloadrK  rp   tn_keytypenamerg   rg   rh   emit_structseq_call  s,   	

rW  tuple[list[str], list[str]]c           
      C  s   i }g }g }| D ]h}t |jjj}|sqddd |D }t|jj}t|j}||}	|	du rp| d|s:dnt	| }	|	||< |
d| d| d	|	 d
| dt	| d|	 d|	 d|	 d |
d| d| d q||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                 s  s    | ]	}d | dV  qdS ){"z", ""}Nrg   )re   r   rg   rg   rh   r    s    zDgenerate_return_type_definition_and_registrations.<locals>.<genexpr>NrN  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   rq   r'  r   r   rp   rL  rQ  r~   r   )
r|   rR  r   r   rT  rK  fieldsrp   rU  rV  rg   rg   rh   r     sN   


r   	list[str]c                 C  s   i }g }| D ];}t |jjj}|sqt|jj}t|j}||}|du rA| d|s.dnt| }|||< |	d| d q|S )z
    Generate block of function declarations in `python_return_types.h` to initialize
    and return named tuple for a native function.
    NrN  r   r[  rO  rP  )r|   rR  r   rT  rK  rp   rU  rV  rg   rg   rh   r     s"   	

r   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                C  sH  t | }t|}t|\}}dg}	|	|7 }	|	|rdgng 7 }	|r"g ndgdg }
tdd |D r3dnd}t||d	}t|d
k}g }g }t|D ],\}}|jj|d	}|	t
t| d t|||d	}|	|srtj||dn| qI|r{t}n|rt}nt}|j| ||	tdd |D ||t| |||d||
|rdd
S dd
S )z?
    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                 s  s    | ]}t |jV  qd S r   )r'   r   re   org   rg   rh   r        zmethod_impl.<locals>.<genexpr>truefalser   r%   ,)overload_indexbodyc                 s  s    | ]}|j  V  qd S r   )r   r   ra  rg   rg   rh   r    rc  )rp   r   noargr   self_nullptr)
rp   pycnamemethod_headermax_args
signatures	traceablecheck_has_torch_functiondispatchmethod_footerrj  )rz   r   rW  r(  group_overloadsr~   r#  r   signature_strr   r   rt   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)rp   r   r|   r   r   rl  ri  structseq_initsstructseq_typenamesrm  rs  rp  grouped_overloadsis_singletonro  rr  rg  rT  r   dispatch_bodytemplaterg   rg   rh   r     sf   r   ri  c                C  s`   |r|r
d|  dS dS |rdnd}|r dddd	d
ddd| nd}d| d| d|p,d dS )NzMif(check_has_torch_function(self_)) {
  return handle_torch_function(self_, "z");
}
r   rj  rk  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.Tensorrg   )rp   r   ri  r   rj  	namespacerg   rg   rh   r}    s8   
r}  zRif (_r.isNone(${out_idx})) {
  ${call_dispatch}
} else {
  ${call_dispatch_out}
}
rT  r   r  r   c             	   C  sT   | j dur tj| j t| j| j||dt| j| j ||ddS t| j| j||d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.
    Nr   )out_idxcall_dispatchcall_dispatch_out)outplacePY_VARIABLE_OUTrx  r   
output_idxemit_single_dispatchr   )rT  r  r   rg   rg   rh   rv    s    
rv  tuple[str, ...]c                C  s4   |rdS t | }t|rd| dfS d| dfS )Nrg   zstatic PyObject * z#(PyObject* self_, PyObject* args);
z5(PyObject* self_, PyObject* args, PyObject* kwargs);
)rz   r   )rp   r|   r   rl  rg   rg   rh   r     s   r   c                C  sh   t | }| jrd| d}t|r|rdnd}nd| d}d}|dkr(|d7 }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_STATICrZ  z", rY  z, nullptr},)rz   dunder_methodr   )rp   r   r|   r   rl  flagsrg   rg   rh   r   <  s   
r   Sequence[PythonSignatureGroup]c          	        s`  i }i  | D ]C}|j jd|d}|jj r0| v r+td|jj d | jj d| |< q||v rEtd|jj d|| jj d|||< q  D ]P\}}||vrg }| D ]'}t|jjjjt|jjjjkr|jj s|j j	s|
|j jd|d qZ|j j|d}td| d| d	d
dd |D  qN fdd| D }t||dS )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                 s  s    | ]}d | V  qdS )z- Nrg   )re   	candidaterg   rg   rh   r    rc  z"group_overloads.<locals>.<genexpr>c                   s$   g | ]\}}t j| |d qS ))
functionalr   )r   
from_pairsrQ  )re   sigr   	outplacesrg   rh   ri     s    z#group_overloads.<locals>.<listcomp>)r   ru  r   rq   	is_out_fnRuntimeErrorr  rt   rp   r  r   r   sort_overloads)	r|   r   basesrT  r  r   
candidatesout_sigr   rg   r  rh   rt  _  sb   





rt  r  c                  s  ddddfdd}t  fddd ttt D ]\}}t D ]\}}||j|jr8| | q&qs@t S t }ttfddt	|}t	|D ]"}	||	 }
t 
 D ]}| }||
 |sv|= || qaqU fdd|D S )Nt1r    t2rk   rl   c                 S  s   t | dkrt |dkpbt | dkot |dkpbdt | v o#dt |vpbt | dko5t |dkp5t |dkpbt | d	koDt |d
dkpbt | dkoPt |dkpbt | dks]t | dkobt |dkS )Nr  TensorzScalar?zTensor?Dimnamezint[]r   zint?zTensor[]z[]zSymInt[]SymInt)rt   find)r  r  rg   rg   rh   is_arg_smaller  s*   


	

z&sort_overloads.<locals>.is_arg_smallers1r   s2c                   sl   | j dd|j dd}}t|t|krdS tdd t||D }t fddt||D }|o5| S )z-Returns True if s1 < s2 in the partial order.T)r  Fc                 s  s     | ]\}}|j |j kV  qd S r   )r$  re   arg1arg2rg   rg   rh   r    s    z5sort_overloads.<locals>.is_smaller.<locals>.<genexpr>c                 3  s6    | ]\}}t |jt |jkp |j|jV  qd S r   )rt   r$  r  r  rg   rh   r    s
     
)r   r~   r(  r)  )r  r  args1args2equalsmaller_or_equalr  rg   rh   
is_smaller  s   
z"sort_overloads.<locals>.is_smallerc                   s   | j j dS )Nr   )r   ru  xr   rg   rh   r     s    z sort_overloads.<locals>.<lambda>r   c                   s   |  vS r   rg   r  )larger_thanrg   rh   r     s    c                   s   g | ]} | qS rg   rg   )re   r  )r  rg   rh   ri     r  z"sort_overloads.<locals>.<listcomp>)r  r    r  r    rk   rl   )r  r   r  r   rk   rl   )r   r   setr#  r   addr   r~   r   ranger   discardr   )r  r   r  i1	overload1i2	overload2N
sorted_idsidxr*  jlargerrg   )r  r  r  r   rh   r    s6   


r  psr   c                  s   t d fdd}||S )	z:
    Emit dispatch code for a single native function.
    rj   r   rk   rt   c                   s  t  trd j }nd| j }t| j}ddd t | dD }t| }t	| }dt
|  d}t | d}t | d}d|j}	d|j}
 jo`t|  p` jo`d	|v }|rld
|d	 j dnd}|dkr| jjj}t| jjdr| j tjkr|d urt|jjsJ d}nd}| d|	 d| d| d| d| d| d| d|
 d| d| dS t| }|d ur| dnd}| d|	 d| d| d| d| d| d| d| d|
 d| dS )Nz// [deprecated] aten::z	// aten::rY  c                 s  s"    | ]}|j  d |j V  qdS ) N)type_strrp   r  rg   rg   rh   r  2  s    
z3emit_single_dispatch.<locals>.go.<locals>.<genexpr>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;
r_  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   r<  rq   r   rp   r   r
   r   r	   r   r   r   initsexprsr;  r   r   exprr   self_argrt   
startswithkindr   inplacer&   argumentr$  rQ  rL  )rj   schema_commentrp   lambda_formalslambda_returndispatch_calleedispatch_argsparser_outputslambda_arg_exprsr  lambda_argsneed_set_requires_gradset_requires_gradr  return_stmtrV  structseq_typerefr  r  r   rg   rh   go(  s   




z emit_single_dispatch.<locals>.goNrj   r   rk   rt   r   )r  rj   r  r   r  rg   r  rh   r    s   Sr  )rj   r   rk   rl   )rp   r   rk   rt   )r|   r}   rk   rl   )r   rt   r   rt   r   rt   r   rt   r   rt   r   rl   rk   r   )r   r}   r   r   rk   r   )r   r"   r   r}   r   r   r   r   r   rt   r   rl   r   rl   rk   r   )
r   r"   r   r}   r   r   r   rt   rk   r   )r   r"   r   r}   r   r   r   r   r   rt   r   rl   r   r   r   rl   rk   r   )r   r
  r   rt   r   rl   r  rl   r	  rl   rk   r}   )
r   r}   r   rt   r   rl   r	  rl   rk   r  r  )r|   r}   rk   rM  )r|   r}   rk   rX  )r|   r}   rk   r]  )rp   r   r   r   r|   r}   r   rl   r   rl   rk   rt   )
rp   r   r   r   ri  rl   r   rl   rk   rt   )rT  r   r  r   r   rl   rk   rt   )rp   r   r|   r}   r   rl   rk   r  )
rp   r   r   r   r|   r}   r   rl   rk   rt   )r|   r}   r   rl   rk   r  )r  r  r   rl   rk   r  )
r  r   rj   r   r  r   r   rl   rk   rt   )^
__future__r   r  rc   collectionsr   typingr   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    r!   torchgen.utilsr"   r#   torchgen.yaml_utilsr$   gen_inplace_or_view_typer&   gen_trace_typer'   collections.abcr(   r)   _SKIP_PYTHON_BINDINGSrr   ru   rw   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  rL  rW  r   r   r{  rw  rz  ry  r   r}  r  rv  r   r   rt  r  r  rg   rg   rg   rh   <module>   s   !@$	V










|
)
')3
v


3&	
E$
(
$g]