U
    d                     @   s   d dl mZmZmZmZmZmZmZmZ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mZmZ d dlmZ d dlmZ d dlm Z m!Z! e	e"eedddZ#eeed	d
dZ$e eeef e!e dddZ%ee!e dddZ&ee!e dddZ'ee!e dddZ(dS )    )	ArgumentBaseTyBaseTypeListTypeNativeFunctionsGroupOptionalTypeSelfArgumentTensorOptionsArgumentsType)ArgName	BaseCTypeBindingArrayRefCTypeConstRefCTypeOptionalCType
NamedCTypetensorTscalarTintArrayRefTdimnameListToptionalTensorRefToptionalScalarRefToptionalIntArrayRefTiTensorListRefTiOptTensorListRefT)cpp)assert_never)UnionList)tmutablebindsreturnc                C   s  t j| |d}|d k	r|S t| trr| jtjkrBt|tt	t
S | jtjkr`t|tt	tS td|  nPt| tr| jttjkrt|t	tS | jttjkrt|t	tS t| jtrt| jjdkrt|t	tS t| j||d}t|t|jS t| tr| jttjkr0t|t	tS | jtttjkrTt|t	tS t| jdkrrt|t	tS t| jdkrt|t	tS t| j||d}t|t|jS tdt|  d S )Nr!   z&base type should have been value type intr    r!   ZDimnamezunrecognized type )r   Zvaluetype_type
isinstancer   namer   ZTensorr   r   r   r   ZScalarr   AssertionErrorr   elemr   r   r   strr   argumenttype_typer   typer   r   r   r   r   repr)r   r    r!   rr)    r/   ;/tmp/pip-unpacked-wheel-ua33x9lu/torchgen/api/structured.pyr+   ,   s<    
r+   )ar!   r"   c                C   s   t | j| j|dS )Nr%   )r+   r,   Zis_write)r1   r!   r/   r/   r0   argument_typeT   s    r2   )r1   r"   c                 C   s\   t | tr(tt| | jd| jd | dgS t | tr<t| jS t | trPtdnt	|  d S )Nr#   )Znctyper'   defaultargumentz2structured kernels don't support TensorOptions yet)
r&   r   r   r2   r'   r   r4   r	   r(   r   )r1   r/   r/   r0   r4   ^   s    




r4   )gr"   c                 C   s   g }| j jrg }| j jjjD ]J}t|tr\|j| j jjkr\| j jj|j D ]}|	| qJq|	| q|
| |
| j jj n|
| j jjj |
| j jjj  dd |D S )Nc                 S   s   g | ]}t |D ]}|qqS r/   r4   .0argr.   r/   r/   r0   
<listcomp>   s     
  z"impl_arguments.<locals>.<listcomp>)outZprecomputedfunc	argumentsnon_outr&   r   r'   replaceappendextendadd)r5   argsZnon_out_args_replacedr1   replacementr/   r/   r0   impl_argumentsp   s    
rE   c                 C   s$   g }| | jjjj dd |D S )Nc                 S   s   g | ]}t |D ]}|qqS r/   r6   r7   r/   r/   r0   r:      s     
  z"meta_arguments.<locals>.<listcomp>)rA   Z
functionalr<   r=   r>   r5   rC   r/   r/   r0   meta_arguments   s    rG   c                 C   s$   g }| | jjjj dd |D S )Nc                 S   s   g | ]}t |D ]}|qqS r/   r6   r7   r/   r/   r0   r:      s     
  z!out_arguments.<locals>.<listcomp>)rA   r;   r<   r=   rF   r/   r/   r0   out_arguments   s    rH   N))Ztorchgen.modelr   r   r   r   r   r   r   r	   r
   Ztorchgen.api.typesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ztorchgen.apir   Ztorchgen.utilsr   typingr   r   boolr+   r2   r4   rE   rG   rH   r/   r/   r/   r0   <module>   s   ,H	(
