U
    dp@                     @   s$  d dl Z d dlZd dlZd dlZd dlZd dlZd dl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 ddl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/ d dl0m1Z1 d d	l2m3Z3 d d
l4m5Z5 ej6j78 r>ddlm9Z9m:Z: d dlm;Z; d dl<m=Z= G dd de>Z?G dd de>Z@dd ZAdd ZBdd ZCdd ZDdd ZEdd ZFdd ZGd d! ZHd"d# ZIe5ejJ d$d%d&ZKd'd( ZLd)d* ZMd+d, ZNd-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAddddddd!d#d*d,gZOdS )B    N   )ListTupleis_tupleis_listDictis_dictOptionalis_optional_qualified_nameAnyFuture	is_futureis_ignored_fnUnionis_union)BroadcastingList1BroadcastingList2BroadcastingList3   )_get_script_class)
TensorType	TupleType	FloatTypeIntTypeComplexTypeListType
StringTypeDictTypeBoolTypeOptionalTypeInterfaceTypeAnyTypeNoneTypeDeviceObjTypeStreamObjType
FutureTypeEnumType	UnionType
NumberType)dedent)get_source_lines_and_file)Type)RRefis_rref)RRefType)OpOverloadPacketc                   @   s   e Zd Zdd Zdd ZdS )Modulec                 C   s   || _ || _d S N)namemembers)selfr3   r4    r6   9/tmp/pip-unpacked-wheel-ua33x9lu/torch/jit/annotations.py__init__   s    zModule.__init__c                 C   s>   z| j | W S  tk
r8   td| j d| d Y nX d S )NzModule z has no member called )r4   KeyErrorRuntimeErrorr3   r5   r3   r6   r6   r7   __getattr__!   s    zModule.__getattr__N)__name__
__module____qualname__r8   r<   r6   r6   r6   r7   r1      s   r1   c                
   @   sL   e Zd Zeddejiejeddeieeee	e
ed	Zdd Zdd	 Zd
S )EvalEnvtorchTensortypingr   )	rA   rB   rC   r   r   r   r	   r   r   c                 C   s    || _ tjj rt| jd< d S )Nr-   )rcbrA   distributedrpcis_availabler-   env)r5   rD   r6   r6   r7   r8   5   s    zEvalEnv.__init__c                 C   s4   || j kr| j | S | jd k	r(| |S tt|d S r2   )rH   rD   getattrbuiltinsr;   r6   r6   r7   __getitem__:   s
    



zEvalEnv.__getitem__N)r=   r>   r?   r1   rA   rB   r   r   r   r	   r   r   rH   r8   rK   r6   r6   r6   r7   r@   (   s   r@   c           	      C   s   t | trt| j|}n
t| |}|d k	rJ|rJ|\}}|dd  }||f}|d krd\}}z"tdt| d }t|}W n tk
r   Y nX |d k	rt	|||}|S )Nr   )NN r   )

isinstancer0   try_real_annotationsopr*   joinr+   get_type_line	TypeErrorparse_type_line)	fnrD   locZ	is_method	signatureZparam_typesreturn_type	type_linesourcer6   r6   r7   get_signatureA   s"    

rZ   c                 C   s   t | pt | S r2   )inspect
isfunctionismethodZthe_callabler6   r6   r7   is_function_or_method^   s    r_   c                 C   s8   t | st| dr| j} t | r0t| jd k	S dS d S )N__call__F)r_   hasattrr`   r[   getfullargspecvarargsr^   r6   r6   r7   	is_varargd   s
    rd   c                 C   sn   t | tr| j} t| s2t| dr2t| jr2| j} t| rXt| rLt| } t	| j
S dd t|D S d S )Nr`   c                 S   s   g | ]}t |qS r6   )str).0ir6   r6   r7   
<listcomp>   s     z#get_param_names.<locals>.<listcomp>)rM   r0   rO   r_   ra   r`   r   r[   unwraprb   argsrange)rT   Zn_argsr6   r6   r7   get_param_namesp   s    

rl   c              	   C   s   zt dt| d }W n ttfk
r4   Y d S X |d krBd S t|}t|jdkrt	|jd tj
rtjj|d|jd j dt|jdkst	|jd tjstjj|dd S )NrL   r   r   zCannot instantiate class 'z' in a script functionz$Expected a single top-level function)r*   rP   r+   rR   IOErrorastparselenbodyrM   ZClassDefrA   jitZfrontendZFrontendErrorr3   ZFunctionDef)rT   rU   rY   Zpy_astr6   r6   r7   check_fn   s    
   rs   c           	   
      s   t | \}}zt|i t|}W n0 ttfk
rP } ztd|W 5 d}~X Y nX t|tsb|f}zt|i t|}W n0 ttfk
r } ztd|W 5 d}~X Y nX  fdd|D }|t| fS )zParses a type annotation specified as a comment.

    Example inputs:
        # type: (Tensor, torch.Tensor) -> Tuple[Tensor]
        # type: (Tensor, Tuple[Tensor, Tensor]) -> Tensor
    z6Failed to parse the argument list of a type annotationNz4Failed to parse the return type of a type annotationc                    s   g | ]}t | qS r6   )ann_to_typerf   annrU   r6   r7   rh      s     z#parse_type_line.<locals>.<listcomp>)	split_type_lineevalr@   	NameErrorSyntaxErrorr:   rM   tuplert   )	rX   rD   rU   Zarg_ann_strZret_ann_strZarg_anneZret_ann	arg_typesr6   rw   r7   rS      s    
rS   c                    sn  d |  d}dd t|D }tt fdd|}tdttfdd|}t|d	krtd
ttfdd|}t|d	krtdt|d	 d	  d d d dS t|dkr|d	 d 	 S d}g }|D ]4\}}d|kr ||f} qqވ |kr|
| q|dkr>tdddd |D  d  fdd}t||}	d|	}
|d d|
S )zETries to find the line containing a comment with the type annotation.# type:
c                 S   s   g | ]\}}||fqS r6   r6   )rf   line_numliner6   r6   r7   rh      s     z!get_type_line.<locals>.<listcomp>c                    s    | d kS Nr   r6   r   type_commentr6   r7   <lambda>       zget_type_line.<locals>.<lambda>z!# type:\ ignore(\[[a-zA-Z-]+\])?$c                    s     | d  S r   searchr   )type_patternr6   r7   r      r   r   z&#[	 ]*type[	 ]*(?!: ignore(\[.*\])?$):c                    s     | d S r   r   r   )wrong_type_patternr6   r7   r      r   zThe annotation prefix in line z* is probably invalid.
It must be '# type:'zl
See PEP 484 (https://www.python.org/dev/peps/pep-0484/#suggested-syntax-for-python-2-7-and-straddling-code)z
for examplesNr   z# type: (...) -> z_Return type line '# type: (...) -> ...' not found on multiline type annotation
for type lines:
c                 S   s   g | ]}|d  qS )r   r6   )rf   r   r6   r6   r7   rh      s     zl
(See PEP 484 https://www.python.org/dev/peps/pep-0484/#suggested-syntax-for-python-2-7-and-straddling-code)c                    s"   | |   t  d  }| S r2   )findrp   strip)r   Z	item_typer   r6   r7   get_parameter_type   s    z)get_type_line.<locals>.get_parameter_typez, z...)split	enumeratelistfilterrecompilerp   r:   re   r   appendrP   mapreplace)rY   linesZ
type_linesZwrong_type_linesZreturn_lineZparameter_type_linesr   r   r   typesZparameter_typesr6   )r   r   r   r7   rQ      sT    






rQ   c                 C   sZ   t d}z| d}W n tk
r4   tddY nX | ||  | |d d  fS )a  Splits the comment with the type annotation into parts for argument and return types.

    For example, for an input of:
        # type: (Tensor, torch.Tensor) -> Tuple[Tensor, Tensor]

    This function will return:
        ("(Tensor, torch.Tensor)", "Tuple[Tensor, Tensor]")

    r   z->z3Syntax error in type annotation (cound't find `->`)Nr   )rp   index
ValueErrorr:   r   )rX   Zstart_offsetZ	arrow_posr6   r6   r7   rx      s    
rx   c                    s   zt | W n tk
r$   Y dS X jgdd j D  }tfdd|D r\dS  fddj D }tj }||fS )z:Tries to use the Py3.5+ annotation syntax to get the type.Nc                 S   s   g | ]
}|j qS r6   )
annotationrf   pr6   r6   r7   rh     s     z(try_real_annotations.<locals>.<listcomp>c                 3   s   | ]}| j kV  qd S r2   )emptyru   )sigr6   r7   	<genexpr>  s     z'try_real_annotations.<locals>.<genexpr>c                    s   g | ]}t |j qS r6   )rt   r   r   rw   r6   r7   rh     s   )r[   rV   r   return_annotation
parametersvaluesallrt   )rT   rU   Z
all_annotsr~   rW   r6   )rU   r   r7   rN      s    
rN   )r}   c                    sJ   t | }|std| j ddd |D } fdd|D }tj|S )NzNo enum values defined for: ''c                 S   s   h | ]}t |jqS r6   )typevalue)rf   vr6   r6   r7   	<setcomp>  s     z&get_enum_value_type.<locals>.<setcomp>c                    s   g | ]}t | qS r6   try_ann_to_type)rf   trw   r6   r7   rh     s     z'get_enum_value_type.<locals>.<listcomp>)r   r   	__class__rA   _CZunify_type_list)r}   rU   Zenum_valuesr   Zir_typesr6   rw   r7   get_enum_value_type  s    r   c                 C   sP   t | tjrdS t | tjtjtjtjtjtjtj	tj
tjf	rLtd dS dS )NTzTorchScript will treat type annotations of Tensor dtype-specific subtypes as if they are normal Tensors. dtype constraints are not enforced in compilation either.F)
issubclassrA   rB   Z
LongTensorZDoubleTensorZFloatTensorZ	IntTensorZShortTensorZ
HalfTensorZ
CharTensorZ
ByteTensorZ
BoolTensorwarningswarn)rv   r6   r6   r7   	is_tensor!  s        
r   c                    s  | t jjkrt S | d kr$t S t | r>t| r>t S t	| rt
| jdkrj| jd dkrjtg S t fdd| jD S t| rt| jd  }|rt|S t| r(t| jd  }t| jd  }|d krtd| jd  d   |d krtd| jd  d   t||S t| rt| jd td rT| jd }n
| jd }t| }d}|st|t| t|t|S t| r&t| jttttgkrt  S g }| jD ]T}	|	d kr|!t  t|	 }
d}|
st|t| t|
|!|
 qt"|S t#j$j%& rRt'| rRt(t| jd  S t)| rpt*t| jd  S | tkrt+ S | tkrt, S | tkrt- S | t.krt/ S | t0krt1 S | t2krt3 S | td krt S t | rt4| d	rt5| j6S | t#j7kr(t8 S | t#j9kr<t: S | t#j;krPt- S t | rt| t<j=rt>| d krt#j?j@A|  }|B }ntC| }tD|tE|  tF| S t | rt>| }|d k	r|S t#jGH| rt#j?j@A|  S d
d }t#jIJ|  |S )Nr   r   r6   c                    s   g | ]}t | qS r6   r   )rf   arw   r6   r7   rh   <  s     z#try_ann_to_type.<locals>.<listcomp>Unknown type annotation: '' at zQUnsupported annotation {} could not be resolved because {} could not be resolved.__torch_script_interface__c                 S   s   d S r2   r6   )keyr6   r6   r7   fake_rcb  s    z!try_ann_to_type.<locals>.fake_rcb)Kr[   	Signaturer   r   ZgetInferredr#   getisclassr   r   rp   __args__r   r   r   r   r   r   	highlightr   r
   r   r   AssertionErrorformatreprr    r   setintfloatcomplexr)   r   r(   rA   rE   rF   rG   r.   r/   r   r&   r   r   r   re   r   boolr   r   r"   ra   r!   r   Zdevicer$   ZStreamr%   ZdtypeenumEnumr   rr   _scriptZ_recursive_compile_classZqualified_namer   r'   r   r   _jit_internalZcan_compile_classr   Z_resolve_type_from_object)rv   rU   Z	elem_typer   r   Z	containedZ
valid_typemsginnerr   Z
maybe_typeZscripted_classr3   Zmaybe_script_classr   r6   rw   r7   r   1  s    



















r   c                 C   s2   t | |}|d k	r|S td|  d|  d S )Nr   r   )r   r   r   )rv   rU   Zthe_typer6   r6   r7   rt     s    
rt   r   r   r   r   r   r   r   r   r   r   r
   r   r   r   r   r   r   r   r   r   r"   )Prn   r   r[   r   rJ   rA   r   r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   _stater   Ztorch._Cr   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   textwrapr*   Ztorch._sourcesr+   rC   r,   rE   rF   rG   r-   r.   r/   Z
torch._opsr0   objectr1   r@   rZ   r_   rd   rl   rs   rS   rQ   rx   rN   r   r   r   r   rt   __all__r6   r6   r6   r7   <module>   s   DT>`