U
    dr(                     @   s   d dl Zd dlmZ d dlZd dlZdd Zdd Zdd Zd	d
 Z	dd Z
dd Zd"ddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Ze ZdS )#    N)_find_builtinc                 C   s   |  do|  d S )N___)
startswith)name r   ;/tmp/pip-unpacked-wheel-ua33x9lu/torch/jit/supported_ops.py_hidden	   s    r	   c                 C   s   t | S N)str)typer   r   r   
_emit_type   s    r   c                 C   sN   d |jt|j}|j}|d k	r2d |t|}|dkrJd d|  |}|S )Nz{} : {}z{}={}r   z
{}{} )formatr   r   r   default_valuer   )indentiargvdefaultr   r   r   	_emit_arg   s    r   c                    s   d  fddt|D S )N,c                 3   s   | ]\}}t  ||V  qd S r
   )r   ).0r   r   r   r   r   	<genexpr>   s     z_emit_args.<locals>.<genexpr>)join	enumerate)r   	argumentsr   r   r   
_emit_args   s    r   c                 C   s
   t | jS r
   )r   r   )retr   r   r   	_emit_ret   s    r    c                 C   s2   t | dkrt| d S dddd | D S )N   r   z	Tuple[{}]z, c                 s   s   | ]}t |V  qd S r
   )r    )r   rr   r   r   r   !   s     z_emit_rets.<locals>.<genexpr>)lenr    r   r   )returnsr   r   r   
_emit_rets   s    r%      c                 C   sN   | d kr|}nd | |}d |tt|d | |j|d  t|j}|S )Nz{}.{}z{}({}) -> {}r!   )r   r   r#   r   r%   r$   )modr   schema	arg_startpaddingZqualified_name
schema_strr   r   r   _emit_schema#   s    r,   c               
   C   sd   dd } g }t tjD ]D}t|stjd| }|D ]"}| |r6|td||dd q6qd|fS )Nc                 S   sF   t | jdkrdS | jd }|jdkr*dS |jtjj sBdS dS )Nr   FselfT)	r#   r   r   r   ZisSubtypeOftorch_CZ
TensorTypeget)r(   r-   r   r   r   is_tensor_method.   s    

z)_get_tensor_ops.<locals>.is_tensor_methodzaten::Tensorr!   )r)   zSupported Tensor Methods)dirr.   r2   r	   r/   _jit_get_schemas_for_operatorappendr,   )r1   methodselemschemasr(   r   r   r   _get_tensor_ops-   s    
r9   c            
   	   C   s  g } t jj}|j}tt jjD ]}t||}t|rt|d rDqt	|}|sbt
d| dd|jkrnqz(t j|}|j}| t||| W q   Y qX qt jjjD ]^}|j}t|D ]J}tt||}|d k	rt j|}	|	D ]}t|s| t||| qqqd| fS )Nr   Module for 
 not foundztorch.nn.functionalzSupported PyTorch Functions)r.   nnZ
functional__name__r3   getattrinspect
isfunctionr	   	getmoduleRuntimeErrorjitscriptr(   r5   r,   	_builtinsZ_modules_containing_builtinsr   r/   r4   )
	functionsr'   r   r7   attrZattr_moduleZscriptedr(   builtinr8   r   r   r   _get_nn_functional_opsC   s8    


rI   c                  C   sr   g } t jjjD ]^\}}t|}t|ds,q|s2qt|jst|j	st|jrRqd|jkr^q| 
||f q| S )Nr=   ztorch._C)r.   rC   rE   Z_builtin_opsr?   rA   hasattrr	   r=   __qualname__r5   )builtinsfn_builtin_namer'   r   r   r   _get_builtins_helperm   s    


rO   c                 C   s(   t | }|std|  d|jdkS )Nr:   r;   math)r?   rA   rB   r=   )rM   r'   r   r   r   _is_math_fn   s    
rQ   c            	      C   s   g } t dd t }t|}|D ]b\}}t|}|sFtd| dt|}|d k	r tj	|}|D ]}| 
t|j|j| qfq d| fS )Nc                 S   s   t | d  S Nr   rQ   rM   r   r   r   <lambda>       z+_get_torchscript_builtins.<locals>.<lambda>r:   r;   zTorchScript Builtin Functions)filterrO   listr?   rA   rB   r   r.   r/   r4   r5   r,   r=   )	rF   rL   builtins_listrM   rN   r'   rH   r8   r(   r   r   r   _get_torchscript_builtins   s    
rZ   c            
      C   s   g } t dd t }t|}|D ]p\}}t|}|sFtd| dt|}|d k	r tj	|}|D ](}t
|j|j|}	d|	krqf| | qfq d| fS )Nc                 S   s   t | d S rR   rS   rT   r   r   r   rU      rV   z$_get_math_builtins.<locals>.<lambda>r:   r;   r2   z``math`` Module)rW   rO   rX   r?   rA   rB   r   r.   r/   r4   r,   r=   r5   )
rF   rL   rY   rM   rN   r'   rH   r8   r(   r+   r   r   r   _get_math_builtins   s"    

r[   c                  C   s  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g} dddd d!d"d#d$d%}d&d'd(d(d)d*d*d+d,}d-d.d/d0d1d2d3d4g}g }|D ]\}}| d5|| qg }g }| D ]~}d6|}	||kr|| }	tj|	}
|
D ]}| td ||d7d8 qt|
d7kr| d9 qd:||| }| | qd;|}d;|}d;|}t	|d<}t	|d<}t	|d<}d=|||}d>|fS )?Nprinttuplefloatcomplexintboolr   r>   rJ   
isinstancer#   hexoctroundhashminmaxabsalldivmodrX   ordchrbinrangezipr   sortedz
aten::Boolz	aten::Intzaten::Floatzaten::Complexz	prim::absz	prim::maxz	prim::minzfake::does_not_exist)ra   r`   r^   r_   ri   rh   rg   ro   zPrint any valuez]Lists cannot be converted to tuples with this method since their size is not statically knownz'Attribute name must be a literal stringzResult is staticzMArguments must be iterable. See :ref:`Iterables <jit_iterables>` for details.z-Can only be used as an iterator in a for loop)r\   r]   r>   rJ   rb   rp   r   ro   )r_   __complex__)r^   	__float__)r`   __int__)ra   __bool__)r   __str__)r#   __len__)rc   Z__hex__)rd   Z__oct__z"{}", "``{}``"zaten::{}r   )r*    z":any:`{}`", "{}"
	a  
The functions in the following table are supported but do not have a static schema

.. csv-table::
    :header: "Function", "Note"

{}

The following functions will use the corresponding magic method on :any:`TorchScript classes`

.. csv-table::
    :header: "Function", "Magic Method"

{}

These built-in functions use the schema

.. rst-class:: codeblock-height-limiter

::

{}
    zPython Built-in Functions)
r5   r   r.   r/   r4   r,   r#   r   textwrapr   )Zsupported_builtinsZ
op_renamesZschemaless_op_explanationsZmagic_methodsZmagic_methods_rowsrM   Zmagic_methodZschematized_opsZschemaless_opsZop_namer8   sZ	table_rowZschematized_ops_strZschemaless_ops_strZmagic_methods_rows_strsectionr   r   r   _get_global_builtins   s     



  r~   c                  C   s   dd } d}t ttttf}|D ]}| \}}|dddd dd}t|trnd	|dt
| |}nd		|dt
| | |}d
	|d | }||7 }q|S )Nc                 S   s   d ddd | D S )Nz1
.. rst-class:: codeblock-height-limiter

::

{}
rx   c                 s   s   | ]}d  |V  qdS )z    {}

N)r   )r   dr   r   r   r   .  s     z:_list_supported_ops.<locals>.emit_block.<locals>.<genexpr>)r   r   )Zdeclsr   r   r   
emit_block-  s    z'_list_supported_ops.<locals>.emit_blockrx   `-r   z	{}
{}
{}
~z{}
{}
{}z.. _{}:z

)r9   rI   rZ   r~   r[   replacelowerrb   r   r   r#   )r   bodyZop_gathering_fnsrM   headeritemsZlink_targetr}   r   r   r   _list_supported_ops,  s"    
 

r   )r   r&   )Z	torch.jitr.   Ztorch.jit._builtinsr   r?   r{   r	   r   r   r   r    r%   r,   r9   rI   rO   rQ   rZ   r[   r~   r   __doc__r   r   r   r   <module>   s&   	

*w