o
    8} i                     @  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
contiguousZis_cudaZ	is_sparseZis_sparse_csrsizeZstrideZsym_sizeZ
sym_strideZsym_storage_offsetZ	sym_numelz.*_backwardz#.*_backward_(out|input|weight|bias)z
.*_forwardz.*_forward_outz.*_jvpZ_unsafe_viewtensorz2_?sparse_(coo|compressed|csr|csc|bsr|bsc)_tensor.*z_range.*Z_sparse_add_outz_sparse_div.*z_sparse_mul.*z_sparse_sub.*Z_sparse_dense_add_outindexZ	index_outZ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toZ_to_copyZ_to_copy_outZ_reshape_copyZ_reshape_copy_outZcopy_sparse_to_sparse_Zcopy_Z_foreach_copyZnumpy_TZmatrix_HZmTZmHznonzero(_(out|numpy))?set_dataz.*_overrideabledataZis_leafZ	output_nrZ_versionZrequires_grad_Zretains_gradset_Z
_fw_primalZ)fake_quantize_per_tensor_affine_cachemaskZ*fake_quantize_per_channel_affine_cachemaskZ!_new_zeros_with_same_feature_meta_has_same_storage_numelZ_reshape_aliasZreplace_copyzfill.Tensorzfill.Scalarzlift.*Znormal_functionalnbytesitemsizeZ_batch_norm_with_updateZ_batch_norm_with_update_outZ_batch_norm_no_updatec                 C  s   g | ]}t d | dqS )^$)recompile).0pattern r@   E/home/app/PyTorch/test/pytorch/tools/autograd/gen_python_functions.py
<listcomp>   s    rB   )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)rC   rI   Z
skip_regexr   r?   r@   r@   rA   should_generate_py_binding   s   

rO   rI   r   rM   c                 C  s
   d|  S )NZTHPVariable_r@   rI   r@   r@   rA   get_pycname      
rQ   	overloads+Sequence[PythonSignatureNativeFunctionPair]c                 C  s   t | dko| d j dkS )Nr%   r   )lenr   arguments_count)rS   r@   r@   rA   is_noarg   s   rW   c                 C     | j d u o
tj| jv S N)python_moduler!   methodvariantsrC   r@   r@   rA   is_py_variable_method      r^   c                 C  rX   rY   )rZ   r!   functionr\   r]   r@   r@   rA   is_py_torch_function   r_   ra   c                 C  
   | j dkS )NnnrZ   r]   r@   r@   rA   is_py_nn_function   rR   re   c                 C  rb   )NZfftrd   r]   r@   r@   rA   is_py_fft_function   rR   rf   c                 C  rb   )NZlinalgrd   r]   r@   r@   rA   is_py_linalg_function   rR   rg   c                 C  rb   )Nnestedrd   r]   r@   r@   rA   is_py_nested_function   rR   ri   c                 C  rb   )NZsparserd   r]   r@   r@   rA   is_py_sparse_function   rR   rj   c                 C  rb   )NZspecialrd   r]   r@   r@   rA   is_py_special_function   rR   rk   Tsymintoutnative_yaml_pathtags_yaml_pathdeprecated_yaml_pathtemplate_pathrm   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[   rm   torchzpython_torch_functions.cpp   )r[   
num_shardsrm   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 NTr@   fnr@   r@   rA   <lambda>q      zgen.<locals>.<lambda>zpython_return_types.cppc                 S  r   r   r@   r   r@   r@   rA   r   t  r   zpython_return_types.hrD   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::)r@   )r>   tagr@   r@   rA   rB   }  s    z.gen.<locals>.gen_tags_enum.<locals>.<listcomp>)joinsortedr@   
valid_tagsr@   rA   gen_tags_enumy  s
   zgen.<locals>.gen_tags_enumzpython_enum_tag.cpp)rD   r   )r"   r   native_functionslistfilterrO   load_signaturescreate_python_bindingsr^   create_python_bindings_shardedra   re   rf   rg   ri   rj   rk   "create_python_return_type_bindings)create_python_return_type_bindings_headerr   write)rn   ro   rp   rq   rr   rm   fmr   methods	functionsr   r@   r   rA   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 rY   )r   r   r`   rJ   rI   append)r   r   groupedpairr@   r@   rA   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keyrx   rw   #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_commentsr@   r   r   r   r   r   r   r@   rA   r     s   z(create_python_bindings.<locals>.<lambda>N)r   r   keysrM   r   method_impl
method_defextendforward_declsbasewrite_with_template)
r   r   r   r   r   r[   rm   r   rI   rS   r@   r   rA   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   Zpy_return_typespy_return_types_registrationsr   r@   r   r   Zpy_return_types_definitionr   r@   rA   r     s   z4create_python_return_type_bindings.<locals>.<lambda>N)r   r   r   rM   1generate_return_type_definition_and_registrationsr   r   r   )	r   r   r   r   r   rI   rS   definitionsregistrationsr@   r   rA   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   r@   r   r   r   r@   rA   r     s
   z;create_python_return_type_bindings_header.<locals>.<lambda>N)r   r   r   rM   !generate_return_type_declarationsr   r   r   )r   r   r   r   r   rI   rS   declarationsr@   r   rA   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]]rD   rM   c                 S  s
   | d j S )Nr   )r   )r   r@   r@   rA   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   rw   rx   )r   r   r   r   )r   r   r   r   r   )r   rI   Zfn_pairsr[   r   rm   r@   rA   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   rD   rM   )r   r   rD   r   )r   write_shardeditemsr   )r   r   r   r   r   r[   r{   rm   r   r   r   r@   r   rA   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 )	NrC   r   rD   r   c                   s   t t|  d| dS )Nr[   r   r   r`   )r   r   r]   r   r@   rA   gen_signature_pairs8  s   z,load_signatures.<locals>.gen_signature_pairsr   )rC   r   rD   r   )r   r   mapload_deprecated_signatures)r   rq   r[   r   r   r   r   
deprecatedr@   r   rA   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)LoaderrI   aten_outr   1Scalarc                 S  s   i | ]}|j |qS r@   rP   r>   ar@   r@   rA   
<dictcomp>i      z.load_deprecated_signatures.<locals>.<dictcomp>z*deprecation definiton: Unrecognized value aten_schemar   rD   rE   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 rY   r@   )r>   r   br@   r@   rA   	<genexpr>  s    
zKload_deprecated_signatures.<locals>.is_schema_compatible.<locals>.<genexpr>)	itertoolschain	argumentsrn   flat_non_outflat_all	enumeraterU   type
annotationdefaultreturnsallzip)r   r   iargZarg_nameZschema_typeZschema_annotationZ
schema_argZ	call_argsis_outZknown_constantsschemaZschema_args_by_namer@   rA   is_schema_compatibleq  s.   
z8load_deprecated_signatures.<locals>.is_schema_compatibleFT)category_overrider[   r   )	rI   
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   rD   rE   )r   r   r   rI   r   openyamlloadr$   r   parser#   endswithreplacer    r   r   r`   rJ   r   r   r   r   r  r  r  r  r[   tupler   rM   )r   rq   r[   r   r   r   resultsrC   Zdeprecated_defsr   	aten_namerI   r   Zany_schema_foundZ
python_sigr@   r   rA   r   F  sj   


 r   c                 C  s(   t | j}t| jj}d|g| S )N_)r   rI   rJ   r   r   r   )rC   rI   
fieldnamesr@   r@   rA   gen_structseq_typename_key  s   r   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`   rJ   r   r   rI   r  getrU   r   )rS   	typenamesZtypedefsoverloadr  rI   tn_keytypenamer@   r@   rA   emit_structseq_call  s,   	

r  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", ""}Nr@   )r>   r   r@   r@   rA   r     s    zDgenerate_return_type_definition_and_registrations.<locals>.<genexpr>Nr  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   r   r   r   rI   r  r  rU   r   )
rS   r  r   r   r  r  fieldsrI   r  r  r@   r@   rA   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.
    Nr  r   r   r  r  )rS   r  r   r  r  rI   r  r  r@   r@   rA   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.
    ZHANDLE_TH_ERRORSz/const Tensor& self = THPVariable_Unpack(self_);Py_RETURN_NONE;ZEND_HANDLE_TH_ERRORSc                 s  s    | ]}t |jV  qd S rY   )r'   r`   r>   or@   r@   rA   r         zmethod_impl.<locals>.<genexpr>truefalserl   r%   ,)overload_indexbodyc                 s  s    | ]}|j  V  qd S rY   )r   rV   r$  r@   r@   rA   r     r&  )rI   r   noargr[   self_nullptr)
rI   pycnamemethod_headerZmax_args
signatures	traceableZcheck_has_torch_functiondispatchmethod_footerr-  )rQ   rW   r  r   group_overloadsrU   r   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   rS   r[   rm   r/  r,  Zstructseq_initsstructseq_typenamesr0  r4  r2  grouped_overloadsZis_singletonr1  r3  r*  r  r   Zdispatch_bodytemplater@   r@   rA   r     sf   r   r,  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   r-  r.  ZTHPVariableFunctionsModuleZTHPNNVariableFunctionsModuleZTHPFFTVariableFunctionsModuleZ THPLinalgVariableFunctionsModuleZ THPNestedVariableFunctionsModuleZ THPSparseVariableFunctionsModuleZ!THPSpecialVariableFunctionsModule)ry   r|   r}   r~   r   r   r   ZTHPVariableClasszAif(_r.has_torch_function()) {
  return handle_torch_function(_r, z, args, kwargs, z, "ztorch.Tensorr@   )rI   r   r,  r[   r-  	namespacer@   r@   rA   r>    s8   
r>  zRif (_r.isNone(${out_idx})) {
  ${call_dispatch}
} else {
  ${call_dispatch_out}
}
r  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.
    Nrl   )Zout_idxZcall_dispatchZcall_dispatch_out)outplacePY_VARIABLE_OUTr9  r   
output_idxemit_single_dispatchr   )r  r?  rm   r@   r@   rA   r7    s    
r7  tuple[str, ...]c                C  s4   |rdS t | }t|rd| dfS d| dfS )Nr@   zstatic PyObject * z#(PyObject* self_, PyObject* args);
z5(PyObject* self_, PyObject* args, PyObject* kwargs);
)rQ   rW   )rI   rS   r[   r/  r@   r@   rA   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_<>ZMETH_NOARGSzMETH_VARARGS | METH_KEYWORDSzcastPyCFunctionWithKeywords(r   ry   z | METH_STATICr  z", r  z, nullptr},)rQ   dunder_methodrW   )rI   r   rS   r[   r/  flagsr@   r@   rA   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_outputsrm   z(Found duplicated function definition:
- z.
Existing definition:
- .rl   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- Nr@   )r>   	candidater@   r@   rA   r     r&  z"group_overloads.<locals>.<genexpr>c                   s$   g | ]\}}t j| |d qS ))
functionalrn   )r   
from_pairsr  )r>   sigr   Z	outplacesr@   rA   rB     s    z#group_overloads.<locals>.<listcomp>)r   r6  r`   rJ   	is_out_fnRuntimeErrorr   rM   rI   r   r   r   sort_overloads)	rS   rm   basesr  rQ  rn   Z
candidatesout_sigr   r@   rR  rA   r5  _  sb   





r5  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    t2rD   rE   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)rM   find)rX  rY  r@   r@   rA   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)rL  Fc                 s  s     | ]\}}|j |j kV  qd S rY   )r   r>   Zarg1Zarg2r@   r@   rA   r     s    z5sort_overloads.<locals>.is_smaller.<locals>.<genexpr>c                 3  s6    | ]\}}t |jt |jkp |j|jV  qd S rY   )rM   r   rb  r_  r@   rA   r     s
     
)r   rU   r   r   )r`  ra  Zargs1Zargs2equalZsmaller_or_equalrc  r@   rA   
is_smaller  s   
z"sort_overloads.<locals>.is_smallerc                   s   | j j dS )Nrl   )r   r6  xrl   r@   rA   r     s    z sort_overloads.<locals>.<lambda>r   c                   s   |  vS rY   r@   rf  )larger_thanr@   rA   r     s    c                   s   g | ]} | qS r@   r@   )r>   rg  )r@  r@   rA   rB     r   z"sort_overloads.<locals>.<listcomp>)rX  r    rY  r    rD   rE   )r`  r   ra  r   rD   rE   )r   r   setr   r   addr   rU   r   ranger   discardr   )r@  rm   re  Zi1Z	overload1Zi2Z	overload2NZ
sorted_idsidxr   jZlargerr@   )r@  r_  rh  rm   rA   rU    s6   


rU  psr   c                  s   t d fdd}||S )	z:
    Emit dispatch code for a single native function.
    rC   r   rD   rM   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::r  c                 s  s"    | ]}|j  d |j V  qdS ) N)type_strrI   r   r@   r@   rA   r   2  s    
z3emit_single_dispatch.<locals>.go.<locals>.<genexpr>rl   )python_signaturer   requires_gradz.set_requires_grad(r   r   voidZ	_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(Z	dispatch_z);
)
isinstancer   r  rJ   r   rI   r   r
   r   r	   r   r   r   initsexprsr  r   r[   exprr   self_argrM   
startswithkindr   inplacer&   argumentr   r  r  )rC   Zschema_commentrI   Zlambda_formalsZlambda_returnZdispatch_calleeZdispatch_argsZparser_outputsZlambda_arg_exprsrx  lambda_argsZneed_set_requires_gradZset_requires_gradr{  Zreturn_stmtr  Zstructseq_typerefrp  r?  rm   r@   rA   go(  s   




z emit_single_dispatch.<locals>.goNrC   r   rD   rM   r   )rp  rC   r?  rm   r  r@   r  rA   rF    s   SrF  )rC   r   rD   rE   )rI   r   rD   rM   )rS   rT   rD   rE   )rn   rM   ro   rM   rp   rM   rq   rM   rr   rM   rm   rE   rD   rs   )r   rT   r   r   rD   r   )r   r"   r   rT   r   r   r   r   r   rM   r[   rE   rm   rE   rD   rs   )
r   r"   r   rT   r   r   r   rM   rD   rs   )r   r"   r   rT   r   r   r   r   r   rM   r[   rE   r{   r   rm   rE   rD   rs   )r   r   rq   rM   r[   rE   r   rE   r   rE   rD   rT   )
r   rT   rq   rM   r[   rE   r   rE   rD   r   r  )rS   rT   rD   r  )rS   rT   rD   r  )rS   rT   rD   r"  )rI   r   r   r   rS   rT   r[   rE   rm   rE   rD   rM   )
rI   r   r   r   r,  rE   r[   rE   rD   rM   )r  r   r?  r   rm   rE   rD   rM   )rI   r   rS   rT   r[   rE   rD   rG  )
rI   r   r   r   rS   rT   r[   rE   rD   rM   )rS   rT   rm   rE   rD   rK  )r@  rK  rm   rE   rD   rK  )
rp  r   rC   r   r?  r   rm   rE   rD   rM   )^
__future__r   r   r<   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$   Zgen_inplace_or_view_typer&   Zgen_trace_typer'   collections.abcr(   r)   Z_SKIP_PYTHON_BINDINGSrK   rN   rO   rQ   rW   r^   ra   re   rf   rg   ri   rj   rk   r   r   r   r   r   r   r   r   r  r  r   r   r<  r8  r;  r:  r   r>  rD  r7  r   r   r5  rU  rF  r@   r@   r@   rA   <module>   s   !@$	V










|
)
')3
v


3&	
E$
(
$g]