U
    dA@                     @   s:  d dl 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 m!Z!m"Z" edee	eZ#edee	eZ$ee	eZ%eee	eZ&ee	eZ'ee	eZ(G dd de)Z*dddeeee
f  eeee
f  e+e+ee d	d
dZ,dS )    )DictSequenceListNoReturnUnion)	ListCTypetensorListT	BaseCTypeBindingConstRefCTypeExprMutRefCTypeOptionalCType
NamedCTypeSpecialArgNametensorTmemoryFormatTtensorOptionsTscalarTypeTboolTdeviceTlayoutToptionalTensorRefTiTensorListRefTiOptTensorListRefTscalarToptionalScalarRefTVectorCTypelongTintArrayRefTscalar_topmath_toptionalIntArrayRefToptionsoutc                   @   s   e Zd ZdS )
UnsatErrorN)__name__
__module____qualname__ r)   r)   :/tmp/pip-unpacked-wheel-ua33x9lu/torchgen/api/translate.pyr%   G   s   r%   F)methodallow_expensive_conversions)bindingsgoalsr+   r,   returnc                   s  g }| D ]0}t |tr.|t|j|jd q|| qg |D ]&}t |tr^|j qB| qBi |D ]}|j|j< |j}t |trt |j	t
rt |j	j	trt|j	j	jdkrd|j d|j dt|j	j	jttt< |jtt
ttkr4d|j d|j d|j d	t|jtt< |jtttkrfd|j d
t|jtt< |jtt
ttkrd|j d|j dt|jtt< |jttkrd|j dt|jtt< |jttkr d|j dt|jtt< |jttt
ttkrrd|j dt|jtt< qr|rldtdttt< dtdttt< ttdfddtttd fddfddD S )N)exprtypez
at::Tensor(z.has_value() ? *z : at::Tensor())z((z.has_value() && (*z&).defined()) ? at::OptionalTensorRef(*z) : at::OptionalTensorRef())z).to<opmath_t>()z'.has_value() ? at::OptionalScalarRef(&(z%.value())) : at::OptionalScalarRef())zstatic_cast<opmath_t>()zat::ITensorListRef(zat::IOptTensorListRef(zconst_cast<Tensor&>(*this)selfgoalr/   c                    s>   d dd   D }td|   d| j d| dd S )N
c                 s   s.   | ]&\}}d |   d|j d| V  qdS )z   z; // N)cpp_typename).0ter)   r)   r*   	<genexpr>   s    z+translate.<locals>.unsat.<locals>.<genexpr>z&
Failed to synthesize the expression "r8   zI".
When I failed, the following bindings were available in the context:

z~

This probably means there is a missing rule in the rules of torchgen.api.translate.
Check this module for more information.
)joinitemsr%   r9   r:   )r6   Zctx_desc)ctxr)   r*   unsat   s    
ztranslate.<locals>.unsat)r6   directr/   c             	      s  t tdfdd}| kr$|  S t| jtrdzt | jt| jj|dW S  tk
rb   Y nX t| jtrzt | j| jj|dW S  tk
r   Y nX |r|  | t dt	t
tkr$|t tjt	t
t}tkr|S z|t}d| d| dW S  tk
r   | Y S X nh| t d	t
tkr|t d
t	t
t}|t dt	t
t}|t dt	t
t}|t dt	t
t}d| d| d| d| d	S | t d
t	t
tkr
z|t}d| dW S  tk
r   |t}	|	 d Y S X n| t dt	t
tkrdz|t}| dW S  tk
r^   |t}	|	 d Y S X n(| t dt	t
tkrz|t}| dW S  tk
r   |t}	|	 d Y S X n| t dt	t
tkrz|t}| dW S  tk
r   |t}	Y dS X n| jt
tkr,|t | jtS | jt
tkrL|t | jtS | jt
tkrl|t | jtS | jt
tkr|t | jtS  r| jtt
tkrt | jt
t}
||
}| dS | jt	tt
tkrt | jt
t}||}| d| dS | jt	t
tkrDt | jt
t}||}| d| dS | jt	t
tkrt | jt
t}||}| d| dS | jtt
t krt | jtt
t }||}d| dS |  d S ) Nr5   c                    s    | ddS )NTrC   r)   )r6   solver)   r*   direct_solve   s    z.translate.<locals>.solve.<locals>.direct_solverD   memory_formatz:c10::impl::check_tensor_options_and_extract_memory_format(z, r3   r#   dtype
pin_memorydevicelayoutzTensorOptions().dtype(z	).layout(z	).device(z).pinned_memory(zoptTypeMetaToScalarType(z.dtype_opt())z.scalar_type()z.layout_opt()z	.layout()z.device_opt()z	.device()z.pinned_memory_opt()zc10::nulloptz.vec()z".has_value() ? c10::make_optional(z->vec()) : c10::nulloptz) : c10::nulloptzconst_cast<Tensor&>()!r   str
isinstancer1   r   r:   r   elemr%   r   r	   r   r   Z possibly_redundant_memory_formatoptions_ctyper   r   r   r   r   out_tensor_ctyper   longVec_ctyper"   optionalLongVec_ctyper   optionalScalar_ctyper   optionalTensor_ctyper   r   r   r   )r6   rC   rG   rH   r#   rI   rJ   rK   rL   Z
out_tensorZintArrayRef_ctypeargnameZoptionalIntArrayRef_ctypeZoptionalScalarRef_ctypeZoptionalTensorRef_ctypeZconst_ref_tensor_ctyper,   rA   Zgoal_ctypesrF   rB   r)   r*   rF      s     



    
ztranslate.<locals>.solvec                    s   g | ]}t  |d d|qS )FrD   )r   )r;   grE   r)   r*   
<listcomp>~  s     ztranslate.<locals>.<listcomp>)rN   r
   appendr   r:   Znctyper0   r1   r   rO   r   r	   rM   r   r   r   r   r!   r   r    r   r   r   r   r   r   bool)r-   r.   r+   r,   Zbinding_exprsbrX   r<   r)   rW   r*   	translate\   s    


 
 r]   N)-typingr   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    r!   r"   rP   rQ   rR   rS   rT   rU   RuntimeErrorr%   r[   r]   r)   r)   r)   r*   <module>   s"   x;