U
    §Ê¹jHE  ã                   @   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 d dl	m
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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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 dd	l8m9Z9 ej:j; <¡ �rJd d
lm=Z= ddl#m>Z>m?Z? d dl@mAZA G dd„ dƒZBG dd„ dƒZCdd„ ZDdd„ ZEdd„ ZFdd„ ZGdd„ ZHdd„ ZIdd„ ZJdd „ ZKd!d"„ ZLd#d$„ ZMe
ejN d%œd&d'„ZOd(d)„ ZPd*d+„ ZQdEd,d-„ZRdFd.d/„ZSd0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdddddd d"d$d-d/gZTdS )Gé    N)Údedent)ÚType)ÚAnyTypeÚ	AwaitTypeÚBoolTypeÚComplexTypeÚDeviceObjTypeÚDictTypeÚEnumTypeÚ	FloatTypeÚ
FutureTypeÚInterfaceTypeÚIntTypeÚListTypeÚNoneTypeÚ
NumberTypeÚOptionalTypeÚStreamObjTypeÚ
StringTypeÚ
TensorTypeÚ	TupleTypeÚ	UnionType)Úget_source_lines_and_fileé   )Ú_AwaitÚ_qualified_nameÚAnyÚBroadcastingList1ÚBroadcastingList2ÚBroadcastingList3ÚDictÚFutureÚis_awaitÚis_dictÚ	is_futureÚis_ignored_fnÚis_listÚis_optionalÚis_tupleÚis_unionÚListÚOptionalÚTupleÚUnioné   )Ú_get_script_class)ÚRRefType)Úis_rrefÚRRef)ÚOpOverloadPacketc                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚModulec                 C   s   || _ || _d S ©N)ÚnameÚmembers)Úselfr6   r7   © r9   úT/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/jit/annotations.pyÚ__init__E   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 )r7   ÚKeyErrorÚRuntimeErrorr6   ©r8   r6   r9   r9   r:   Ú__getattr__I   s    ÿþzModule.__getattr__N)Ú__name__Ú
__module__Ú__qualname__r;   r?   r9   r9   r9   r:   r4   D   s   r4   c                   @   sN   e Zd Zeddejiƒejeddeiƒeeee	e
eedœ
Zdd„ Zdd	„ Zd
S )ÚEvalEnvÚtorchÚTensorÚtypingr,   )
rD   rE   rF   r,   r*   r    r+   r-   r!   ÚAwaitc                 C   s    || _ tjj ¡ rt| jd< d S )Nr2   )ÚrcbrD   ÚdistributedÚrpcÚis_availabler2   Úenv)r8   rH   r9   r9   r:   r;   `   s    zEvalEnv.__init__c                 C   s4   || j kr| j | S | jd k	r(|  |¡S tt|d ƒS r5   )rL   rH   ÚgetattrÚbuiltinsr>   r9   r9   r:   Ú__getitem__e   s
    



zEvalEnv.__getitem__N)r@   rA   rB   r4   rD   rE   r,   r*   r    r+   r-   r!   r   rL   r;   rO   r9   r9   r9   r:   rC   R   s   örC   c           	      C   sª   t | tƒrt| j|ƒ}n
t| |ƒ}|d k	rJ|rJ|\}}|dd … }||f}|d kr¦d\}}z"td t| ƒd ¡ƒ}t|ƒ}W n tk
r�   Y nX |d k	r¦t	|||ƒ}|S )Nr.   )NNÚ r   )
Ú
isinstancer3   Útry_real_annotationsÚopr   Újoinr   Úget_type_lineÚ	TypeErrorÚparse_type_line)	ÚfnrH   ÚlocZ	is_methodÚ	signatureZparam_typesÚreturn_typeÚ	type_lineÚsourcer9   r9   r:   Úget_signaturem   s"    

r^   c                 C   s   t  | ¡pt  | ¡S r5   )ÚinspectÚ
isfunctionÚismethod©Zthe_callabler9   r9   r:   Úis_function_or_methodŠ   s    rc   c                 C   s6   t | ƒst| ƒr| j} t | ƒr.t | ¡jd k	S dS d S )NF)rc   ÚcallableÚ__call__r_   ÚgetfullargspecÚvarargsrb   r9   r9   r:   Ú	is_vararg�   s
    rh   c                 C   sl   t | tƒr| j} t| ƒs0t| ƒr0t| jƒr0| j} t| ƒrVt| ƒrJt | ¡} t 	| ¡j
S dd„ t|ƒD ƒS d S )Nc                 S   s   g | ]}t |ƒ‘qS r9   )Ústr)Ú.0Úir9   r9   r:   Ú
<listcomp>¯   s     z#get_param_names.<locals>.<listcomp>)rQ   r3   rS   rc   rd   re   r%   r_   Úunwraprf   ÚargsÚrange)rX   Zn_argsr9   r9   r:   Úget_param_namesœ   s    
ÿþý
rp   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rŒt	|jd tj
ƒrŒtjj |d|jd j› d�¡‚t|jƒdks¬t	|jd tjƒs¼tjj |d¡‚d S )NrP   r   r.   zCannot instantiate class 'z' in a script functionz$Expected a single top-level function)r   rT   r   ÚOSErrorrV   ÚastÚparseÚlenÚbodyrQ   ÚClassDefrD   ÚjitZfrontendZFrontendErrorr6   ÚFunctionDef)rX   rY   r]   Zpy_astr9   r9   r:   Úcheck_fn²   s"    
 þ  ÿry   c                 C   sD   t | ddd�}t |¡D ]}d|jkrtd| › d�ƒ‚qt|||ƒS )zKEvaluate statement as long as it does not contain any method/function callsrP   Úeval)ÚmodeÚCALLz/Type annotation should not contain calls, but 'z' does)ÚcompileÚdisÚget_instructionsÚopnamer=   rz   )ÚstmtÚglobrY   ÚbytecodeZinsnr9   r9   r:   Ú_eval_no_callÇ   s    

ÿr„   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 )z¼Parses 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 r9   )Úann_to_type©rj   Úann©rY   r9   r:   rl   ì   s     z#parse_type_line.<locals>.<listcomp>)	Úsplit_type_liner„   rC   Ú	NameErrorÚSyntaxErrorr=   rQ   Útupler…   )	r\   rH   rY   Zarg_ann_strZret_ann_strZarg_annÚeZret_annÚ	arg_typesr9   rˆ   r:   rW   Ò   s*    ÿþ
ÿþrW   c                    sn  d‰ |   d¡}dd„ t|ƒD ƒ}tt‡ fdd„|ƒƒ}t d¡‰tt‡fdd„|ƒƒ}t|ƒd	kr¶t d
¡‰tt‡fdd„|ƒƒ}t|ƒd	kr²t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 r9   r9   )rj   Úline_numÚliner9   r9   r:   rl   õ   s     z!get_type_line.<locals>.<listcomp>c                    s   ˆ | d kS ©Nr.   r9   ©r’   ©Útype_commentr9   r:   Ú<lambda>ö   ó    zget_type_line.<locals>.<lambda>z!# type:\ ignore(\[[a-zA-Z-]+\])?$c                    s   ˆ   | d ¡ S r“   ©Úsearchr”   )Útype_patternr9   r:   r—     r˜   r   z&#[	 ]*type[	 ]*(?!: ignore(\[.*\])?$):c                    s   ˆ   | d ¡S r“   r™   r”   )Úwrong_type_patternr9   r:   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.   r9   )rj   r’   r9   r9   r:   rl   %  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 r5   )Úfindrt   Ústrip)r’   Z	item_typer•   r9   r:   Úget_parameter_type)  s    z)get_type_line.<locals>.get_parameter_typez, z...)ÚsplitÚ	enumerateÚlistÚfilterÚrer}   rt   r=   ri   rž   ÚappendrT   ÚmapÚreplace)r]   ÚlinesZ
type_linesZwrong_type_linesZreturn_lineZparameter_type_linesr‘   r’   rŸ   ÚtypesZparameter_typesr9   )r–   r›   rœ   r:   rU   ð   s\    


ÿÿþýüÿ

þýÿ

rU   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   )rt   ÚindexÚ
ValueErrorr=   rž   )r\   Zstart_offsetZ	arrow_posr9   r9   r:   r‰   3  s    
ÿþr‰   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 r9   )Ú
annotation©rj   Úpr9   r9   r:   rl   Q  s    z(try_real_annotations.<locals>.<listcomp>c                 3   s   | ]}|ˆ j kV  qd S r5   )Úemptyr†   )Úsigr9   r:   Ú	<genexpr>T  s     z'try_real_annotations.<locals>.<genexpr>c                    s   g | ]}t |jˆ ƒ‘qS r9   )r…   r¬   r­   rˆ   r9   r:   rl   W  s     )r_   rZ   r«   Úreturn_annotationÚ
parametersÚvaluesÚallr…   )rX   rY   Z
all_annotsrŽ   r[   r9   )rY   r°   r:   rR   G  s    ÿrR   )r�   c                    sZ   t | ƒ}|std| j› d�ƒ‚dd„ |D ƒ}‡ fdd„|D ƒ}tj |¡}|sVt ¡ S |S )NzNo enum values defined for: 'ú'c                 S   s   h | ]}t |jƒ’qS r9   )ÚtypeÚvalue)rj   Úvr9   r9   r:   Ú	<setcomp>c  s     z&get_enum_value_type.<locals>.<setcomp>c                    s   g | ]}t |ˆ ƒ‘qS r9   ©Útry_ann_to_type)rj   Útrˆ   r9   r:   rl   d  s     z'get_enum_value_type.<locals>.<listcomp>)r¢   r«   Ú	__class__rD   Ú_CZunify_type_listr   Úget)r�   rY   Zenum_valuesr©   Zir_typesÚresr9   rˆ   r:   Ú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 )NTz¢TorchScript will treat type annotations of Tensor dtype-specific subtypes as if they are normal Tensors. dtype constraints are not enforced in compilation either.F)Ú
issubclassrD   rE   Z
LongTensorZDoubleTensorZFloatTensorZ	IntTensorZShortTensorZ
HalfTensorZ
CharTensorZ
ByteTensorZ
BoolTensorÚwarningsÚwarn)r‡   r9   r9   r:   Ú	is_tensorp  s(    ÷þÿrÆ   c                 C   s   d S r5   r9   )Zinpr9   r9   r:   Ú	_fake_rcbŒ  s    rÇ   c                    sL  | t jjkrt ¡ S | d kr$t ¡ S t  | ¡r>t| ƒr>t ¡ S t	| ƒr‚t
| jƒdkrj| jd dkrjtg ƒS t‡ fdd„| jD ƒƒS t| ƒr¦t| jd ˆ ƒ}|r¦t|ƒS t| ƒ�r(t| jd ˆ ƒ}t| jd ˆ ƒ}|d krötd| jd › dˆ  ¡ › �ƒ‚|d k�rtd| jd › dˆ  ¡ › �ƒ‚t||ƒS t| ƒ�r˜t| jd td ƒƒ�rT| jd }n
| jd }t|ˆ ƒ}d}|�s�t| t| ƒt|ƒtˆ ƒ¡ƒ‚t|ƒS t| ƒ�r.t| jƒttthk�rÀt  ¡ S g }	| jD ]Z}
|
d k�ræ|	 !t ¡ ¡ t|
ˆ ƒ}d}|�st| t| ƒt|ƒtˆ ƒ¡ƒ‚|	 !|¡ �qÊt"|	ƒS t#j$j% &¡ �rZt'| ƒ�rZt(t| jd ˆ ƒƒS t)| ƒ�rxt*t| jd ˆ ƒƒS t+| ƒ�r®t,| d	ƒ�ržt| jd ˆ ƒnt- ¡ }t.|ƒS | tk�rÀt/ ¡ S | tk�rÒt0 ¡ S | tk�rät1 ¡ S | t2k�röt3 ¡ S | t4k�rt5 ¡ S | t6k�rt- ¡ S | td ƒk�r0t ¡ S t  | ¡�rRt,| d
ƒ�rRt7| j8ƒS | t#j9k�rft: ¡ S | t#j;k�rzt< ¡ S | t#j=k�rŽt1 ¡ S t  | ¡�rît| t>j?ƒ�rît@| ƒd k�rÐt#jAjB C| ˆ ¡}| D¡ }ntE| ƒ}tF|tG| ˆ ƒtH| ƒƒS t  | ¡�r.t@| ƒ}|d k	�r|S t#jI J| ¡�r.t#jAjB C| ˆ ¡S |d k�r<tK}t#jL M| ˆ |¡S )Nr.   r   r9   c                    s   g | ]}t |ˆ ƒ‘qS r9   r»   )rj   Úarˆ   r9   r:   rl   ›  s     z#try_ann_to_type.<locals>.<listcomp>úUnknown type annotation: 'ú' at zWUnsupported annotation {} could not be resolved because {} could not be resolved. At
{}Ú__args__Ú__torch_script_interface__)Nr_   Ú	Signaturer¯   r   ZgetInferredr   rÀ   ÚisclassrÆ   r(   rt   rË   r   r&   r¼   r   r#   r«   Ú	highlightr	   r'   rÃ   r·   ÚAssertionErrorÚformatÚreprr   r)   ÚsetÚintÚfloatÚcomplexr   r¥   r   rD   rI   rJ   rK   r1   r0   r$   r   r"   Úhasattrr   r   r   r   r   ri   r   Úboolr   r   r   rÌ   Zdevicer   ZStreamr   ZdtypeÚenumÚEnumr/   rw   Ú_scriptZ_recursive_compile_classZqualified_namer   r
   rÂ   r¢   Ú_jit_internalZcan_compile_classrÇ   r¿   Z_resolve_type_from_object)r‡   rY   rH   Z	elem_typeÚkeyr¸   Z	containedZ
valid_typeÚmsgÚinnerrÈ   Z
maybe_typeZelementTypeZscripted_classr6   Zmaybe_script_classr9   rˆ   r:   r¼   �  sº    
ÿ
ÿ



$



$

ÿý









r¼   c                 C   s4   t | ||ƒ}|d k	r|S td| › d| ¡ › �ƒ‚d S )NrÉ   rÊ   )r¼   r«   rÏ   )r‡   rY   rH   Zthe_typer9   r9   r:   r…   û  s    r…   r   r*   r   r   r   r,   r(   r&   r    r#   r'   r)   r   r   r   r   r   r   r   r	   r   )N)N)Urr   rN   r~   rÙ   r_   r¤   rÄ   Útextwrapr   rF   r   rD   Ztorch._Cr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   Ztorch._sourcesr   rÜ   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   Ú_stater/   rI   rJ   rK   r0   r1   r2   Z
torch._opsr3   r4   rC   r^   rc   rh   rp   ry   r„   rW   rU   r‰   rR   rÚ   rÂ   rÆ   rÇ   r¼   r…   Ú__all__r9   r9   r9   r:   Ú<module>   s„   XXC
k
ß