U
    dw8                     @   s  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 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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/m0Z0m1Z1 ddee2e3dd	d
Z4ddeee2e-e dddZ5ddee2ee2edddZ6eeedddZ7ee2edddZ8e	edddZ9e.e	 edddZ:ddee3e.e3 d d!d"Z;d#d$d%d&d'd(d)d*Z<e3ee3d+d,d-Z=e/eee
f e1e3 e2e2e2e0e d.d/d0Z>ee2e2e1e3 e0e d1d2d3Z?d4S )5    )Argument	ArgumentsBaseTyBaseTypeFunctionSchemaListTypeNativeFunctionOptionalTypeReturnSelfArgumentTensorOptionsArgumentsType)ArgName	BaseCTypeBindingConstRefCType
NamedCTypeCTypeMutRefCType
ArrayCType	ListCTypeVectorCTypeArrayRefCTypeOptionalCType
TupleCTypeSpecialArgNameboolTscalarTtensorListTdimnameListTtensorTvoidTlongTBaseTypeToCppMappingintArrayRefToptionalIntArrayRefTtensorOptionsTsymIntArrayRefT)local)assert_never)OptionalSequenceUnionListSetF)faithful_name_for_out_overloads)funcr/   returnc                C   s@   t | jj}|  r|d7 }n|  r<|r4|d7 }n|d7 }|S )NZ_functionalZ_outfZ_out)strnameZis_functional_fn	is_out_fn)r0   r/   r3    r5   4/tmp/pip-unpacked-wheel-ua33x9lu/torchgen/api/cpp.pyr3   A   s    

r3   )remove_non_owning_ref_types)tbindsr7   r1   c                C   s   t | trR| jtjks"| jtjkr&d S |r>| jtjkr>tdt|t	t
| j S t | trt| j|d}|d krvd S t|t|jS t | trt| jdkr| jd k	stt|tt	t| jS d S ntdt|  d S )Nz1string ref->value conversion: not implemented yetr9   boolunrecognized type )
isinstancer   r3   r   TensorScalarr2   AssertionErrorr   r   r#   r	   valuetype_typeelemr   typer   sizer   r   repr)r8   r9   r7   rB   r5   r5   r6   rA   Q   s(    


rA   )r8   mutabler9   r7   r1   c                C   sv  t | ||d}|d k	r|S t| tr| jtjkrb|rNt sNt|t	t
tS t|tt
tS n,| jtjkrt|tt
tS td|  nt| trVt| jdkr|rt st|t	t
tS t|ttt
tS nTt| jdkrt|ttt
tS t| jtr6t| jjdkr6t|t
tS t| j||d}t|t|jS t| tr`t| jdkr|rt|tt
tS t|t
tS nt| jdkrt|t
tS t| jdkrt|tt
tS t| jdkrt|t
tS t| jdkrt|t
tS t| jd	kr@t|tttt
tS t| j||d}t|t|jS td
t |  d S )N)r9   r7   z&base type should have been value type r>   r?   intrF   r9   ZSymIntZDimnameTensor?r<   )!rA   r=   r   r3   r   r>   r(   !use_const_ref_for_mutable_tensorsr   r   r   r    r   r?   r   r@   r	   r2   rB   r   r   r%   argumenttype_typerC   r   r"   r$   r   r   r'   r   r   rE   )r8   rF   r9   r7   rrB   r5   r5   r6   rK   q   sj      
 
   rK   )ar9   r1   c                C   s   t | j| j|dS )NrH   )rK   rC   is_write)rM   r9   r5   r5   r6   argument_type   s    rO   )r8   rF   r1   c                C   s   t | dd}|d k	r|jS t| trv| jtjkr`|rVt rHt	t
tS tt
tS qtt
tS q| jtjkrt
tS nDt| tr|rtdt| jdd}| jd kstd|  t|S td|  d S )NZ__placeholder__r:   zTNative functions should never return a mutable tensor list. They should return void.FrF   z'fixed size list returns not supported: zunrecognized return type )rA   rC   r=   r   r3   r   r>   r(   rJ   r   r   r    r   r?   r   r   r@   returntype_typerB   rD   r   )r8   rF   rL   rB   r5   r5   r6   rQ      s*    



rQ   )rL   r1   c                 C   s   t | j| jdS )NrP   )rQ   rC   rN   rL   r5   r5   r6   return_type   s    rS   )rsr1   c                 C   sB   t | dkrttS t | dkr,t| d S tdd | D S d S )Nr      c                 S   s   g | ]}t |qS r5   )rS   ).0rL   r5   r5   r6   
<listcomp>   s     z returns_type.<locals>.<listcomp>)lenr   r!   rS   r   )rT   r5   r5   r6   returns_type   s
    rY   result)fallback_name)fr[   r1   c                   s   g }t | jjD ]\} | jjjjr:|dks4tdd}n| j rV| jjj| j}nf jrt	 fdd| j
 D }|r| j s j d}q j}n t| jjdkr|n
| | }|| q|S )Nr   z.illegal inplace function with multiple returnsselfc                 3   s   | ]} j |j kV  qd S )N)r3   )rV   rM   rR   r5   r6   	<genexpr>   s    zreturn_names.<locals>.<genexpr>Z_returnrU   )	enumerater0   returnsr3   Zinplacer@   r4   	argumentsoutanyZschema_order_argumentsrX   append)r\   r[   r`   ir3   Zname_conflictr5   rR   r6   return_names   s"    
 rf   falsetruec10::nulloptzat::Reduction::Mean{}zMemoryFormat::Contiguous	at::kLong)FalseTrueNoneZMeanz[]Zcontiguous_formatlong)dr8   r1   c                 C   sj  | dkrt |dkrdS t|tr|jtj krt| dkr| d dkr| d dkrd}d	}|d	 t| k r| | d
kr| | dkr|d7 }n|| | 7 }|d	7 }qZ| |d	  dkr|d7 }n|| ||d  7 }|d7 }qZd| dS t|tr
| dkrdS t| |jS t|t	r^| 
drB| drBd| d	d  d S |jd kr^td|  dt| | S )Nrn   rI   rj      r   ' rU   \"z\"ri   []{}z,Expected a list default '[...]' but found: ')r2   r=   r   r3   r   rX   r	   default_exprrB   r   
startswithendswithrD   
ValueErrorJIT_TO_CPP_DEFAULTget)rp   r8   sre   r5   r5   r6   r{     s6    $



r{   )rM   cpp_no_default_argsmethodfaithfulhas_tensor_optionsr1   c                   sR  t tttf tt d fdd}t| tr| jdkrHrHtj	}n| j}d }| j krt| j
d k	rtt| j
| j}tt| |d| j|| dgS t| tr$r|| j|| j || j || j S d }d ksttdd	 |  D rd
}n| jj
dkrd}ttdttd|| dgS n*t| trFr:g S || jS nt|  d S )N)rM   r1   c                    s   t |  dS )N)r   r   r   r   )argument)rM   r   r   r   r   r5   r6   sub_argumentE  s    zargument.<locals>.sub_argumentZmemory_formatr:   )Znctyper3   defaultr   optionsc                 s   s   | ]}|j d kV  qdS )rn   N)r   )rV   xr5   r5   r6   r^   m  s     zargument.<locals>.<genexpr>rj   ro   rk   )r,   r   r   r   r-   r   r=   r3   r   Z possibly_redundant_memory_formatr   r{   rC   rO   ZdtypeZlayoutZdeviceZ
pin_memoryr@   allr   r   r&   r   r)   )rM   r   r   r   r   r   r9   r   r5   r   r6   r   =  sZ    	

r   )ra   r   r   r   r1   c                   sR   g }r"|  j |  j n|  j |  j  fdd|D S )Nc              	      s:   g | ]2}t | jd k	dD ]}r0| n|q qS )N)r   r   r   r   )r   Ztensor_optionsZ
no_default)rV   rM   rL   ra   r   r   r   r5   r6   rW     s    zarguments.<locals>.<listcomp>)extendZnon_outrb   )ra   r   r   r   argsr5   r   r6   ra     s    ra   N)@Ztorchgen.modelr   r   r   r   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   r   r   r    r!   r"   r#   r$   r%   r&   r'   Ztorchgenr(   Ztorchgen.utilsr)   typingr*   r+   r,   r-   r.   r;   r2   r3   rA   rK   rO   rQ   rS   rY   rf   r   r{   r   ra   r5   r5   r5   r6   <module>   s^   8p  !   >	!	!,G   