U
    <c>                  	   @   sL  d dl mZmZmZmZm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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'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2 d dl3m4Z4 ddde+e5e5e6dd	d
Z7ddde2e	e5e5ee dddZ8ddde2e5e	e5e5edddZ9dde'e	e5edddZ:dde2e5e5edddZ;dde/e5edddZ<ddee/ e5edddZ=dd e-e6ee6 d!d"d#Z>d$d%d&d'd(d)d*d+Z?e6e2e6d,d-d.Z@ddee'e1e0f ee6 e5e5e5e5ee d/d0d1ZAdde(e5e5e5ee6 ee d2d3d4ZBd5S )6    )ListOptionalSequenceSetUnion)local)ArgName
ArrayCTypeArrayRefCType	BaseCTypeBaseTypeToCppMappingBindingboolTConstRefCTypeCTypedimnameListTintArrayRefTiTensorListRefT	ListCTypelongTMutRefCType
NamedCTypeOptionalCTypeoptionalIntArrayRefToptionalSymIntArrayRefTscalarTSpecialArgNamesymIntArrayRefTSymIntTtensorListTtensorOptionsTtensorT
TupleCTypeVectorCTypevoidT)Argument	ArgumentsBaseTyBaseTypeFunctionSchemaListTypeNativeFunctionOptionalTypeReturnSelfArgumentTensorOptionsArgumentsType)assert_neverF)faithful_name_for_out_overloadssymint_overload)funcr2   r3   returnc                C   s:   t | jj}|r|d7 }|  r6|r.|d7 }n|d7 }|S )NZ_symintZ_outfZ_out)strname	is_out_fn)r4   r2   r3   r7    r9   4/tmp/pip-unpacked-wheel-gikjz4vx/torchgen/api/cpp.pyr7   E   s    
r7   )remove_non_owning_ref_typessymint)tbindsr;   r<   r5   c                C   s  t | tr~| jtjks"| jtjkr&d S t| dkrR|rDt|tt	S t|tt
S |rj| jtjkrjtdt|tt| j S t | trt| j||d}|d krd 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 )NSymIntz1string ref->value conversion: not implemented yetr>   r<   boolunrecognized type )
isinstancer(   r7   r'   TensorScalarr6   r   r   r   r   AssertionErrorr   r,   valuetype_typeelemr   typer*   sizer	   r   repr)r=   r>   r;   r<   rH   r9   r9   r:   rG   Z   s0    

rG   )r=   mutabler>   r;   r<   r5   c                C   s   t | |||d}|d k	r|S t| tr| jtjkrd|rPt sPt|t	t
tS t|tt
tS n,| jtjkrt|tt
tS td|  nt| trt| jdkr|rt st|t	t
tS t|ttt
tS nt| jdkr
t|ttt
tS t| jtr8t| jjdkr8t|t
tS t| jtrzt| jjdkrz|rlt|t
tS t|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 t| jdkrB|r |rt|tt
tS t|tt
tS n"|r4t|t
tS t|t
tS t| jdkr~t rnt|tt
tS t|t
t S njt| jdkrt|t!t
tS t| jdkrt|t
t"S t| jd	krt|tt#tt
tS t| j|||d}t|t!|jS td
t$|  d S )N)r>   r<   r;   z&base type should have been value type rD   rE   intr?   )rL   r>   r<   ZDimnameTensor?rB   )%rG   rC   r(   r7   r'   rD   r   !use_const_ref_for_mutable_tensorsr   r   r   r!   r   rE   r   rF   r,   r6   rH   r   r*   r   r   argumenttype_typerI   r#   r   r   r   r   Zuse_ilistref_for_tensor_listsr   r   r
   r   r   rK   )r=   rL   r>   r;   r<   rrH   r9   r9   r:   rP      s    	
 
   
 rP   r<   )ar>   r<   r5   c                C   s   t | j| j||dS )N)rL   r<   r>   )rP   rI   is_write)rS   r>   r<   r9   r9   r:   argument_type   s    rU   )r=   rL   r<   r5   c                C   s   t | d|d}|d k	r|jS t| trx| jtjkrb|rXt rJt	t
tS tt
tS qvt
tS q| jtjkrt
tS nFt| 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rL   r<   z'fixed size list returns not supported: zunrecognized return type )rG   rI   rC   r(   r7   r'   rD   r   rO   r   r   r!   r   rE   r   r*   rF   returntype_typerH   rJ   r#   )r=   rL   r<   rQ   rH   r9   r9   r:   rW      s*    



rW   )rQ   r<   r5   c                C   s   t | j| j|dS )NrV   )rW   rI   rT   )rQ   r<   r9   r9   r:   return_type  s    rX   )rsr<   r5   c                   sJ   t | dkrttS t | dkr0t| d  dS t fdd| D S d S )Nr      rR   c                    s   g | ]}t | d qS )rR   )rX   ).0rQ   rR   r9   r:   
<listcomp>  s     z returns_type.<locals>.<listcomp>)lenr   r$   rX   r"   )rY   r<   r9   rR   r:   returns_type	  s
    r^   result)fallback_name)fr`   r5   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)r7   )r[   rS   rQ   r9   r:   	<genexpr>"  s    zreturn_names.<locals>.<genexpr>Z_returnrZ   )	enumerater4   returnsr7   ZinplacerF   r8   	argumentsoutanyZschema_order_argumentsr]   append)ra   r`   rf   ir7   Zname_conflictr9   rc   r:   return_names  s"    
 rl   falsetruec10::nulloptzat::Reduction::Mean{}zMemoryFormat::Contiguous	at::kLong)FalseTrueNoneZMeanz[]Zcontiguous_formatlong)dr=   r5   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 )Nrt   rN   rp      r   ' rZ   \"z\"ro   []{}z,Expected a list default '[...]' but found: ')r6   rC   r(   r7   r'   r]   r,   default_exprrH   r*   
startswithendswithrJ   
ValueErrorJIT_TO_CPP_DEFAULTget)rv   r=   srk   r9   r9   r:   r   =  s6    $



r   )rS   cpp_no_default_argsmethodfaithfulr<   has_tensor_optionsr5   c          	         sV  t tttf tt d fdd}t| tr| jdkrJrJtj	}n| j}d }| j krv| j
d k	rvt| 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rJr>g S || jS nt|  d S )N)rS   r5   c                    s   t |  dS )N)r   r   r   r<   r   )argument)rS   r   r   r   r   r<   r9   r:   sub_argumentq  s    zargument.<locals>.sub_argumentZmemory_formatr@   )Znctyper7   defaultr   optionsc                 s   s   | ]}|j d kV  qdS )rt   N)r   )r[   xr9   r9   r:   rd     s     zargument.<locals>.<genexpr>rp   ru   rq   )r   r%   r/   r.   r   r   rC   r7   r   Z possibly_redundant_memory_formatr   r   rI   rU   ZdtypeZlayoutZdeviceZ
pin_memoryrF   allr   r   r    r   r1   )	rS   r   r   r   r<   r   r   r>   r   r9   r   r:   r   h  sZ    

r   )rg   r   r<   r   r   r5   c                   sT   g }r"|  j |  j n|  j |  j  fdd|D S )Nc              
      s<   g | ]4}t | jd k	dD ]}r2| n|q"qS )N)r   r<   r   r   r   )r   Ztensor_optionsZ
no_default)r[   rS   rQ   rg   r   r   r   r<   r9   r:   r\     s    zarguments.<locals>.<listcomp>)extendZnon_outrh   )rg   r   r<   r   r   argsr9   r   r:   rg     s    rg   N)Ctypingr   r   r   r   r   Ztorchgenr   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!   r"   r#   r$   Ztorchgen.modelr%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   Ztorchgen.utilsr1   rA   r6   r7   rG   rP   rU   rW   rX   r^   rl   r   r   r   rg   r9   r9   r9   r:   <module>   s   |8.W	!	!1L