U
    Mh                  S   @   s  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-m.Z. d d
l/m0Z0m1Z1 d dl2m3Z3 ddl4m5Z5 ddl6m7Z7 dddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dagSZ8dbdc e8D Z9dddedfdgdhdidjdkgZ:e"e+e;dldmdnZ<e)e=dodpdqZ>e
e e;drdsdtZ?e+e;dldudvZ@e+e;dldwdxZAe+e;dldydzZBe+e;dld{d|ZCe+e;dld}d~ZDe+e;dlddZEe+e;dlddZFe+e;dlddZGdde=e=e=e=e=e;ddddZHe
e ee+ge;f ee)ee f dddZIdde0e
e ee+ge;f e	e= e=e;e;ddddZJe0e
e ee+ge;f e=ddddZKe0e
e ee+ge;f e=ddddZLdde0e
e ee+ge;f e	e= e=e;eMe;dd	ddZNdddee+ e=e;e;e;e
e dddZOe
e e=e;e;ee dddZPe"e+e=dlddZQe
e eee= ee=e=f f drddZRe
e eee= ee= f drddZSe
e ee= drddZTe dZUe dZVe dZWe dZXdde)e	e= e
e e;e;e=dddZYe)e	e= e;e;e=dddZZe dZ[ddeee=e=f e;e=dddZ\e)e
e e;ee=df dddZ]e)e	e= e
e e;e=dddZ^dde
e e;e
e dddZ_dde
e e;e
e dddZ`ddee+ee=e=f e;e=dÜddńZadS )    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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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_viewZ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itemZ_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_nr_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_metaZ_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@   a/var/www/html/venv/lib/python3.8/site-packages/torchgen/packaged/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!)freturnc                 C   sd   d| j krd| j krdS t| j}tD ]}||r( dS q(t| j}tD ]}||krL dS qLdS )N	generatedZ	view_copyFT)tagsr   namefuncSKIP_PYTHON_BINDINGSmatchstrSKIP_PYTHON_BINDINGS_SIGNATURES)rD   rH   Z
skip_regexr   r?   r@   r@   rA   should_generate_py_binding   s    

rN   )rH   rE   c                 C   s
   d|  S )NZTHPVariable_r@   rH   r@   r@   rA   get_pycname   s    rP   )	overloadsrE   c                 C   s   t | dko| d j dkS )Nr)   r   )lenr   arguments_count)rQ   r@   r@   rA   is_noarg   s    rT   c                 C   s   | j d kotj| jkS N)python_moduler%   methodvariantsrD   r@   r@   rA   is_py_variable_method   s    rZ   c                 C   s   | j d kotj| jkS rU   )rV   r%   functionrX   rY   r@   r@   rA   is_py_torch_function   s    r\   c                 C   s
   | j dkS )NnnrV   rY   r@   r@   rA   is_py_nn_function   s    r_   c                 C   s
   | j dkS )NZfftr^   rY   r@   r@   rA   is_py_fft_function   s    r`   c                 C   s
   | j dkS )NZlinalgr^   rY   r@   r@   rA   is_py_linalg_function   s    ra   c                 C   s
   | j dkS )Nnestedr^   rY   r@   r@   rA   is_py_nested_function   s    rc   c                 C   s
   | j dkS )Nsparser^   rY   r@   r@   rA   is_py_sparse_function   s    re   c                 C   s
   | j dkS )Nspecialr^   rY   r@   r@   rA   is_py_special_function   s    rg   Tsymint)outnative_yaml_pathtags_yaml_pathdeprecated_yaml_pathtemplate_pathri   rE   c             
      sJ  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| tttf d fdd}
|d|
 d S ) NF)Zinstall_dirZtemplate_dirdry_runTrW   zpython_variable_methods.cpprW   ri   torchzpython_torch_functions.cpp   )rW   
num_shardsri   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   s   dS NTr@   fnr@   r@   rA   <lambda>l      zgen.<locals>.<lambda>zpython_return_types.cppc                 S   s   dS r{   r@   r|   r@   r@   rA   r~   o  r   zpython_return_types.h)rE   c                      s   dd dd t D iS )NZenum_of_valid_tags c                 S   s   g | ]}d | d| dqS )z	
.value("z", at::Tag::)r@   )r>   tagr@   r@   rA   rB   x  s     z.gen.<locals>.gen_tags_enum.<locals>.<listcomp>)joinsortedr@   
valid_tagsr@   rA   gen_tags_enumt  s
    zgen.<locals>.gen_tags_enumzpython_enum_tag.cpp)r&   r   native_functionslistfilterrN   load_signaturescreate_python_bindingsrZ   create_python_bindings_shardedr\   r_   r`   ra   rc   re   rg   "create_python_return_type_bindings)create_python_return_type_bindings_headerr   r   rL   write)rj   rk   rl   rm   rn   ri   fmr   methodsZ	functionsr   r@   r   rA   gen  s    	 


	
      	r   )pairspredrE   c                 C   s6   t t}| D ]$}||jr||jjjj | q|S rU   )r   r   r[   rI   rH   append)r   r   groupedpairr@   r@   rA   group_filter_overloads  s    
r   )r   r   r   modulefilenamerW   ri   rE   c          
   
      s   g g g g t ||}t| tdD ]b}|| }	t|||	||d t|||	|d t||	|d d|j	 d q*
   fdd dS )	+Generates Python bindings to ATen functionskeyrq   rp   #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   keysrL   r   method_impl
method_defextendforward_declsbasewrite_with_template)
r   r   r   r   r   rW   ri   r   rH   rQ   r@   r   rA   r     s$    
r   )r   r   r   r   rE   c           	         s   g g t ||}t| tdD ]H}|| }t|\}}|sFd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   rL   1generate_return_type_definition_and_registrationsr   r   r   )	r   r   r   r   r   rH   rQ   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   rL   !generate_return_type_declarationsr   r   r   )r   r   r   r   r   rH   rQ   declarationsr@   r   rA   r     s    

r   )	r   r   r   r   r   rW   rt   ri   rE   c                   s   t ||}tttt f tddd}	tttt f tttt f d fdd}
| j|| ddd| 	  d	|  i|	|
|d
dddhd dS )r   )kvrE   c                 S   s
   | d j S )Nr   )r   )r   r@   r@   rA   key_func  s    z0create_python_bindings_sharded.<locals>.key_funcc              	      sN   | \}}d|j  dgtt|| dt|| dgt|| dgdS )Nr   r   rp   rq   )r   r   r   r   )r   r   r   r   r   )r   rH   Zfn_pairsrW   r   ri   r@   rA   env_func  s    z0create_python_bindings_sharded.<locals>.env_funcr   r   r   r   r   r   r   r   )Zbase_envZkey_fnZenv_callablert   Zsharded_keysN)
r   r
   r    r   r   rL   r   Zwrite_shardeditemsr   )r   r   r   r   r   rW   rt   ri   r   r   r   r@   r   rA   r     s(    
 
r   F)skip_deprecatedpyi)r   rm   rW   r   r   rE   c                   sH   t ttd fdd}tt|| }t|| d}|r@|S || S )NrC   c                    s   t t|  d| dS )NrW   r   r   r[   )r   r   rY   r   r@   rA   gen_signature_pairs3  s    z,load_signatures.<locals>.gen_signature_pairsr   )r   r"   r   r   mapload_deprecated_signatures)r   rm   rW   r   r   r   r   
deprecatedr@   r   rA   r   +  s       r   )r   rm   rW   r   rE   c                   s  t t}| D ]}||jj | qg }t|}tj|td}W 5 Q R X |D ]2}	t	
|	d t|	d \}
 |
dr|
dd}
dt
didd	 jjD  D ]"}|ks|kstd
| qt	td fdd}d}||
 D ]h}||jjsqd}t|jj||d}|tt|j|j|j|j|j|jt |jd	|jd q|sNtd|
 dt  qN|S )N)LoaderrH   ZatenZ_outr   1Scalarc                 S   s   i | ]}|j |qS r@   rO   r>   ar@   r@   rA   
<dictcomp>d  s      z.load_deprecated_signatures.<locals>.<dictcomp>z*deprecation definiton: Unrecognized value )aten_schemarE   c                    s   rt | jj| jj}n| jj}t|D ]r\}}|t k r | }|kr\| }d }n| }|j}|j	}||jks||j	kr dS q*|j
d kr* dS q*tjt| jkotdd tj| jD S )NFc                 s   s   | ]\}}||kV  qd S rU   r@   )r>   r   br@   r@   rA   	<genexpr>  s    zKload_deprecated_signatures.<locals>.is_schema_compatible.<locals>.<genexpr>)	itertoolschain	argumentsrj   Zflat_non_outflat_all	enumeraterR   type
annotationdefaultreturnsallzip)r   r   iargarg_nameZschema_typeZschema_annotationZ
schema_argZ	call_argsZis_outZknown_constantsZschemaZschema_args_by_namer@   rA   is_schema_compatiblel  s,     
z8load_deprecated_signatures.<locals>.is_schema_compatibleFT)category_overriderW   r   )	rH   
input_argsinput_kwargsoutput_argstensor_options_argsrW   deprecated_schemaZdeprecated_args_exprsr   r   zNo native function with name z matched signature:
  )!r   r   r   rH   r   openyamlloadr(   r!   parser'   endswithreplacer$   r   r   AssertionErrorboolr[   rI   r   r   r   r   r   r   r   r   rW   tupler   rL   )r   rm   rW   r   r   r   resultsrD   Zdeprecated_defsr   Z	aten_namerH   r   Zany_schema_foundZ
python_sigr@   r   rA   r   A  st    


  r   c                 C   s(   t | j}t| jj}d|g| S )N_)r   rH   rI   r   r   r   )rD   rH   
fieldnamesr@   r@   rA   gen_structseq_typename_key  s    r   c                 C   s   i }g }| D ]x}t |jjj}|s$qt|jj}t|j}||}|dkrd|sXd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[   rI   r   r   rH   r   getrR   r   )rQ   	typenamesZtypedefsoverloadr   rH   tn_keytypenamer@   r@   rA   emit_structseq_call  s*    	

r   c           
      C   s   i }g }g }| D ]}t |jjj}|s(qddd |D }t|jj}t|j}||}	|	dkr| d|std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[   rI   r   r   r   rH   r   r   rR   r   )
rQ   r   r   r   r   r   fieldsrH   r   r   r@   r@   rA   r     sL    


r   c                 C   s   i }g }| D ]v}t |jjj}|s$qt|jj}t|j}||}|dkr| 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   )rQ   r   r   r   r   rH   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}
}

)rH   r   rQ   rW   ri   rE   c                C   sH  t | }t|}t|\}}dg}	|	|7 }	|	|r6dgng 7 }	|rDg ndgdg }
tdd |D rfdnd}t||d	}t|d
k}g }g }t|D ]X\}}|jj|d	}|	t
t| d t|||d	}|	|stj||dn| q|rt}n|rt}nt}|j| ||	tdd |D ||t| |||d||
|r@dn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 rU   )r+   r[   r>   or@   r@   rA   r     s     zmethod_impl.<locals>.<genexpr>truefalserh   r)   ,)overload_indexbodyc                 s   s   | ]}|j  V  qd S rU   )r   rS   r  r@   r@   rA   r     s     )rH   r   noargrW   self_nullptr)
rH   pycnamemethod_headerZmax_args
signatures	traceableZcheck_has_torch_functiondispatchmethod_footerr  )rP   rT   r   r   group_overloadsrR   r   r   signature_strr   r   rL   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)rH   r   rQ   rW   ri   r  r  Zstructseq_initsstructseq_typenamesr  r  r  grouped_overloadsZis_singletonr  r  r	  r   r   Zdispatch_bodytemplater@   r@   rA   r   |  sf      r   )rH   r   r  rW   rE   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|pXd 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)rr   ru   rv   rw   rx   ry   rz   ZTHPVariableClasszAif(_r.has_torch_function()) {
  return handle_torch_function(_r, z, args, kwargs, z, "ztorch.Tensorr@   )rH   r   r  rW   r  	namespacer@   r@   rA   r    s8    
r  zRif (_r.isNone(${out_idx})) {
  ${call_dispatch}
} else {
  ${call_dispatch_out}
}
)r   r  ri   rE   c             	   C   sX   | j dk	r@tj| j t| j| j||dt| j| j ||ddS t| j| j||dS 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.
    Nrh   )Zout_idxZcall_dispatchZcall_dispatch_out)ZoutplacePY_VARIABLE_OUTr  r   Z
output_idxemit_single_dispatchr   )r   r  ri   r@   r@   rA   r    s,    
      r  .)rH   rQ   rW   rE   c                C   s8   |rdS t | }t|r&d| dfS d| dfS d S )Nr@   zstatic PyObject * z#(PyObject* self_, PyObject* args);
z5(PyObject* self_, PyObject* args, PyObject* kwargs);
)rP   rT   )rH   rQ   rW   r  r@   r@   rA   r     s    r   )rH   r   rQ   rW   rE   c                C   sh   t | }| jrd| d}t|r0|r*dnd}nd| d}d}|dkrP|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   rr   z | METH_STATICr   z", r   z, NULL},)rP   Zdunder_methodrT   )rH   r   rQ   rW   r  flagsr@   r@   rA   r   7  s    
r   )rQ   ri   rE   c          	         s`  i }i  | D ]}|j jd|d}|jj r`| krVtd|jj d | jj d| |< q||krtd|jj d|| jj d|||< q  D ]\}}||krg }| D ]N}t|jjjjt|jjjjkr|jj s|j j	s|
|j jd|d q|j j|d}td| d| d	d
dd |D  q fdd| D }t||dS )NT)skip_outputsri   z(Found duplicated function definition:
- z.
Existing definition:
- .rh   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     s     z"group_overloads.<locals>.<genexpr>c                    s$   g | ]\}}t j| |d qS ))Z
functionalrj   )r   Z
from_pairsr   )r>   sigr   Z	outplacesr@   rA   rB     s
   z#group_overloads.<locals>.<listcomp>)r   r  r[   rI   Z	is_out_fnRuntimeErrorr   rL   rH   r   r   r   sort_overloads)	rQ   ri   basesr   r)  rj   
candidatesZout_sigr   r@   r*  rA   r  Z  sV    


 
r  )r  ri   rE   c                   s  t t tdddtttdfdd}t fddd	 ttt D ]6\}}t D ]$\}}||j|jr\| | q\qLst	 S t
 }t	tfd
dt|}t|D ]D}	||	 }
t D ]*}| }||
 |s҈|= || qq fdd|D S )N)t1t2rE   c                 S   s   t | dkrt |dkpt | dkr0t |dkpdt | krHdt |kpt | dkrlt |dkpt |dkpt | d	krt |d
dkpt | dkrt |dkpt | dkst | dkot |dkS )Nr   ZTensorzScalar?zTensor?ZDimnamezint[]intzint?zTensor[]z[]zSymInt[]ZSymInt)rL   find)r/  r0  r@   r@   rA   is_arg_smaller  s*    


	

z&sort_overloads.<locals>.is_arg_smaller)s1s2rE   c                    sl   | j dd|j dd }}t|t|kr.dS tdd t||D }t fddt||D }|oj| S )z-Returns True if s1 < s2 in the partial order.T)r&  Fc                 s   s   | ]\}}|j |j kV  qd S rU   )r   r>   Zarg1Zarg2r@   r@   rA   r     s     z5sort_overloads.<locals>.is_smaller.<locals>.<genexpr>c                 3   s4   | ],\}}t |jt |jkp* |j|jV  qd S rU   )rL   r   r7  r4  r@   rA   r     s   )r   rR   r   r   )r5  r6  Zargs1Zargs2equalZsmaller_or_equalr8  r@   rA   
is_smaller  s    z"sort_overloads.<locals>.is_smallerc                    s   | j j dS )Nrh   )r   r  xrh   r@   rA   r~     r   z sort_overloads.<locals>.<lambda>r   c                    s   |  kS rU   r@   r;  )larger_thanr@   rA   r~     r   c                    s   g | ]} | qS r@   r@   )r>   r<  )r  r@   rA   rB     s     z"sort_overloads.<locals>.<listcomp>)r$   r   r   r   r   setr   r   addr   rR   r   ranger   discardr   )r  ri   r:  i1Z	overload1i2Z	overload2NZ
sorted_idsidxr   jZlargerr@   )r  r4  r=  ri   rA   r,    s0     

r,  )psrD   r  ri   rE   c                   s$   t ttd fdd}||S )z:
    Emit dispatch code for a single native function.
    rC   c                    s   t  trd j }nd| j } jr.dnd}t| j}ddd t | dD }t	| }t
| }dt|  d	}t | d}t | d}	d
|	j}
d|	j} jot|  pΈ jod|k}|rd|d j dnd}|dkr| jjj}t| jjdrF| j tjkrF|d k	r<t|jjs@td}nd}| d
|
 d| d| d| d| d| d| d| d| d| d
S t | }|d k	r| dnd}| d
|
 d| d| d| d| d| d| d| d| d| dS d S )Nz// [deprecated] aten::z	// aten::z[deprecated] r   r   c                 s   s    | ]}|j  d |j V  qdS ) N)Ztype_strrH   r   r@   r@   rA   r   /  s    z3emit_single_dispatch.<locals>.go.<locals>.<genexpr>rh   )Zpython_signaturer   Zrequires_gradz.set_requires_grad(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   rI   r   r   rH   r   r   r   r   r   r   r   initsZexprsr   r   rW   exprr   self_argrL   
startswithkindr#   Zinplacer*   argumentr   r   r   r   )rD   Zschema_commentr   rH   Zlambda_formalsZlambda_returnZdispatch_calleeZdispatch_argsZparser_outputsZlambda_arg_exprsrL  Zlambda_argsZneed_set_requires_gradZset_requires_gradrN  Zreturn_stmtr   Zstructseq_typerefrG  r  ri   r@   rA   go#  s    





z emit_single_dispatch.<locals>.go)r   r"   rL   )rG  rD   r  ri   rS  r@   rR  rA   r#    s    Ur#  )br   r<   collectionsr   typingr   r   r   r   r   r   r	   r
   r   Ztorchgen.apir   Ztorchgen.api.pythonr   r   r   r   r   r   r   r   r   r   r   r   r   r   Ztorchgen.code_templater   Ztorchgen.contextr   Ztorchgen.genr   r   r   Ztorchgen.modelr   r    r!   r"   r#   r$   r%   Ztorchgen.utilsr&   r'   Ztorchgen.yaml_utilsr(   Zgen_inplace_or_view_typer*   Zgen_trace_typer+   Z_SKIP_PYTHON_BINDINGSrJ   rM   r   rN   rL   rP   rT   rZ   r\   r_   r`   ra   rc   re   rg   r   r   r   r   r   r1  r   r   r   r   r   r   r   r  r  r  r  r   r  r"  r  r   r   r  r,  r#  r@   r@   r@   rA   <module>"   s  (@$	V}*()3v 4&	F   $
)
 $ g ]
