U
    9%e~                     @   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mZ d dlm	Z	 d dl
mZmZ d dlZd dl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-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< d dl=m>Z>m?Z?m@Z@mAZA d dlBmCZCmDZDmEZEmFZG d d	lHmIZI d d
lJmKZKmLZL dZMzd dlNZNdZMW n eOk
r   Y nX dZPdhZQeRejSejT ejU ZVdd ZWe jXde j$de jde jde j;de j-de jde jYde jZde j[de jde jdiZ\e jXde j$de jde jde j;d e j-d!e jd"e jYd#e jZd$e j[d%e jd&e jd'iZ]e\^e j_d(e j`d)e jad*e jbd+e jcd,i e]^e j_d-e j`d.e jad/e jbd0e jcd1i e\^e jdd2i G d3d4 d4eeZfG d5d6 d6efZgG d7d8 d8egZhG d9d: d:efZid;d< Zjd=d> Zkd?d@ ZldAdB ZmdCdD ZndcdEdFZodGdH ZpG dIdJ dJZqdKdL ZrdddMdNZsdOZtdedPdQZudfdRdSZvdTdU ZwdVdW ZxdXdY ZyG dZd[ d[eqZzG d\d] d]eqZ{G d^d_ d_eqZ|e| Z}e{ Z~ez ZdgdadbZdS )h    N)
namedtuple)dedent)ListTuple)_jit_internal),ApplyAssertAssign	Attribute	AugAssignBinOpBreakClassDefConstContinueDeclDefDeleteDictCompDictLiteralDotsEmptyTypeAnnotationExprStmtFalseLiteralForIdentIfListCompListLiteralNoneLiteralParamPassPropertyRaiseReturnSelect	SliceExprStarredStmtStringLiteral	Subscript	TernaryIfTrueLiteralTupleLiteralUnaryOpVarWhileWithWithItem)_is_drop_fnFunctionModifiersis_static_fnshould_drop)get_source_lines_and_filemake_source_context	parse_def	ParsedDef)DATACLASS_MAGIC_METHODS)get_qualified_namemonkeytype_traceFTZ__jitprintc                 C   s   |  tp| tkS N)
startswith_reserved_prefix_reserved_namesname rE   Q/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torch/jit/frontend.pyis_reserved_name[   s    rG   zfunction definitionsz	for loopszdel statementszclass definitionszwith statementszraise statementsZ
assertionszimport statementszglobal variableszbreak statementszcontinue statementsdeffordelclasswithraiseassertimportfromglobalbreakcontinuezasync function definitionszasync for loopszasync with statementsz
try blocksznonlocal variablesz	async defz	async forz
async withtrynonlocalzannotated assignmentsc                   @   s   e Zd Zdd Zdd ZdS )FrontendErrorc                 C   s    || _ || _tj| j | _d S r?   )source_rangemsgtorch_CErrorReporterror_report)selfrW   rX   rE   rE   rF   __init__   s    zFrontendError.__init__c                 C   s   | j | j   S r?   )rX   r\   whatlstrip)r]   rE   rE   rF   __str__   s    zFrontendError.__str__N)__name__
__module____qualname__r^   ra   rE   rE   rE   rF   rV      s   rV   c                   @   s   e Zd ZdS )NotSupportedErrorNrb   rc   rd   rE   rE   rE   rF   re      s   re   c                       s   e Zd Zd fdd	Z  ZS )UnsupportedNodeError c           	         sl   t |}tt|d}||j|j|j| }t||j}| d|rP|d nd d}t	 
|| d S )N rh   zaren't supported)typelennode_start_tokensget
make_rangelineno
col_offsetpretty_node_namesrb   superr^   )	r]   ctxZoffending_nodereasonZ	node_typeZ	range_lenrW   Zfeature_namerX   	__class__rE   rF   r^      s    zUnsupportedNodeError.__init__)rh   )rb   rc   rd   r^   __classcell__rE   rE   ru   rF   rg      s   rg   c                   @   s   e Zd ZdS )FrontendTypeErrorNrf   rE   rE   rE   rF   rx      s   rx   c                    s    fdd|D }t |S )Nc                    s   g | ]}t  |qS rE   )build_withitem).0irs   rE   rF   
<listcomp>   s     z#build_withitems.<locals>.<listcomp>)list)rs   itemsrE   r|   rF   build_withitems   s    r   c                    s     fdd|D }t td |S )Nc                    s   g | ]}t  |qS rE   )
build_stmt)rz   sr|   rE   rF   r}      s     zbuild_stmts.<locals>.<listcomp>)r~   filter)rs   ZstmtsrE   r|   rF   build_stmts   s    r   c              	   C   s   t j| dd d}t| dg }g }|D ]}|d |kr&t|d js&t|d jd|d  d|d	}|d jrt|d jd|d  d
|d	nd}|t|	 t
|	 |d || q&|S )aj  
    Get a list of Property objects representing the properties of a class.

    Args:
        cls:  The class to get properties of.
        self_name: The name of the class that the properties should belong to.
    Returns:
        A list of Property objects corresponding to the properties of cls. Property
        here refers to the subclass of TreeView.
    c                 S   s
   t | tS r?   )
isinstancepropertymrE   rE   rF   <lambda>       z&get_class_properties.<locals>.<lambda>	predicateZ__jit_unused_properties__r      ___getter)	self_name_setterN)inspect
getmembersgetattrr6   fgetget_jit_deffsetappendr"   ranger   )clsr   propsZunused_properties
propertiespropgettersetterrE   rE   rF   get_class_properties   s$      "r   c                    sT   g   fdd}|j D ]6}t|tjr6|tj| qt|tjr|tj| q S )Nc                    s.   z  | | W n tk
r(   Y nX d S r?   )r   re   )Zbuilderentryassignsrs   rE   rF   maybe_build_assign   s    z-get_class_assigns.<locals>.maybe_build_assign)bodyr   astr	   StmtBuilderbuild_Assign	AnnAssignbuild_AnnAssign)rs   Zcls_astr   r   rE   r   rF   get_class_assigns   s    
r   c                    sV  t j  fddd} fddt tjj \}}}d|}t|}t	
|}|jd }	t|	t	jsptt rdd	 |	jD }
t|D ]P\}\}}t|}|r||
kr| }||f||< t |}tj||j qfd
d|D }t }t|ddd t|ddd  }t||||d}t||	}t||	|||S )Nc                    s8   t | st | o6t | j o6| j jko6t|  S r?   )r   ismethod
isfunctionr5   rb   __dict__r3   r   r   rE   rF   r      s
   
z#get_jit_class_def.<locals>.<lambda>r   c                    s   t | ot| dd  kS )N__self__)r   r   r   )fnr   rE   rF   is_classmethod  s    z)get_jit_class_def.<locals>.is_classmethodrh   r   c                 S   s(   h | ] }t |tjr|jtkr|jqS rE   )r   r   FunctionDefrD   r;   rz   methodrE   rE   rF   	<setcomp>  s   
z$get_jit_class_def.<locals>.<setcomp>c                    s$   g | ]\}}t || |d qS ))r   r   )r   )rz   rD   obj)r   r   rE   rF   r}   +  s   z%get_jit_class_def.<locals>.<listcomp>
r   F)r   r   r7   rY   rZ   r[   Z
call_stackjoinr   r   parser   r   r   AssertionErrordataclassesis_dataclass	enumerater;   rm   r   r   loadercachesourcer   rk   splitr8   r   build_class_def)r   r   methodssourcelinesfile_linenofilenamer   Z
dedent_srcZpy_astZ	class_astZ	overridesr{   rD   _Zsynthesizer_fn
parsed_deffuncZmethod_defsr   Zleading_whitespace_lenrs   r   rE   )r   r   r   rF   get_jit_class_def   sR    
 








    
r   c                 C   s`  t | tst| n| }tjj|j}|jj	d }|rl|j
j
d j}t| d| j	d }|j	d| t| rtd}	t|	j	dkst |	j	d tjstd|j d|j |	j	d }
|
j	|_	d |j
_|j
_|j
j
|j
j D ]}|
j
j
d j|_qt| rd|_d|_tjj }d}trJt | tsJt| }||}t |j!|||||dS )	af  
    Build a JIT AST (TreeView) from the given function.

    Args:
        fn: A function object to compile or a pre-parsed ParsedDef object
        def_name: The name to give to the resulting AST object. This is not
            always the same as `fn.__name__`, for example:
                def _forward(self):
                    ...
                forward = _forward
            In this case, the `__name__` attribute of the function object is "_forward",
            but we want the result AST to have the name "forward".
        self_name: If this function is a method, what the type name of `self` is.
    r    = zLdef unused_fn(self: Any):
	raise RuntimeError("Cannot call @unused methods")r   z&Expected a single top-level function: :N)r   pdt_arg_types)"r   
_ParsedDefr9   rY   jitannotationsZget_type_liner   r   r   argsargr   insertr6   rk   r   RuntimeErrorr   r   kwargvararg
kwonlyargs
annotationr3   returnsZtype_comment_scriptZ_get_type_trace_dbr=   r<   Zget_args_types	build_defrs   )r   def_namer   r   r   	type_lineZfn_defZarg_nameZassign_stmtZunused_fn_defZ
unused_defr   Ztype_trace_dbr   qualnamerE   rE   rF   r   <  sN    
 


r   c                 C   sz   t | jd jtjrv| jd jj}t |tjrv|j}|j}|dkrvt |tjrv|jdkrvt |jtj	rv|jj
dkrvdS dS )Nr   Z_IgnoreContextManagerr   rY   TF)r   r   context_exprr   Callr   r
   attrvalueNameid)stmtfunction	attr_nameZ
attr_valuerE   rE   rF   #is_torch_jit_ignore_context_manager  s    
 r   c                   @   s   e Zd Zdd ZdS )Builderc                 C   s0   t | d|jj d }|d kr&t|||||S )NZbuild_)r   rv   rb   rg   )r]   rs   noder   rE   rE   rF   __call__  s    
zBuilder.__call__N)rb   rc   rd   r   rE   rE   rE   rF   r     s   r   c                 C   s:   |  |j|j|jtd }tt||dd |D ||S )NrK   c                 S   s   g | ]}t |qS rE   )r(   r   rE   rE   rF   r}     s     z#build_class_def.<locals>.<listcomp>)rn   ro   rp   rk   r   r   )rs   py_defr   r   r   r   rrE   rE   rF   r     s         r   c                 C   s   |j }| |j|j|jtd }t| |j||}d }	t|dd d k	rRt| |j	}	t
|||	}
|d k	}|d k	rtj|}tj|
||}
tt|||
t| |S )NrH   r   )r   rn   ro   rp   rk   build_param_listr   r   
build_exprr   r   rY   rZ   Zparse_type_commentZmerge_type_from_type_commentr   r   r   )rs   r   r   r   r   r   r   r   Z
param_listreturn_typedeclZ	is_methodZtype_comment_declrE   rE   rF   r     s    r   zfCompiled functions can't take variable number of arguments or use keyword-only arguments with defaultsc           
         s
  |j d k	r<|j } |j|jd |jt|j }t|t|jd k	rx|j} |j|jd |jt|j }t|tt|j	dkr|j	D ]$}|d k	rt
 | }t|tqfdd|jD }fdd|jD } fdd|D }	|	 fdd|D 7 }	|	S )Nr   r   c                    s0   g | ](}| r&t  |j r& |j nd fqS r?   boolr   rz   r   r   rE   rF   r}     s   z$build_param_list.<locals>.<listcomp>c                    s0   g | ](}| r&t  |j r& |j nd fqS r?   r   r   r   rE   rF   r}     s   c              	      s"   g | ]\}}t  |d |dqS )F
kwarg_onlypdt_arg_typebuild_paramrz   r   Zarg_typers   r   rE   rF   r}     s   c              	      s"   g | ]\}}t  |d |dqS )Tr   r   r   r   rE   rF   r}     s   )r   rn   ro   rp   rk   r   re   _vararg_kwarg_errr   kw_defaultsr   r   r   r   )
rs   Zpy_argsr   r   exprZ	ctx_ranger   Zarg_and_typesZarg_and_types_kwonlyargsresultrE   )rs   r   r   rF   r     sD    
  

  


	

r   c                 C   s   |j }| |j|j|jt| }t|dd d k	r@t| |j}n<|rTtt	||}n(|d k	rt|dkrttt	||}nt
|}t|t	|||S )Nr   r]   )r   rn   ro   rp   rk   r   r   r   r/   r   r   r    )rs   py_argr   r   r   rD   r   Zannotation_exprrE   rE   rF   r     s    r   c                    sX  t dddg t dddg fdd}dd }d	d
 }dd }||jd jj\}}d|| | }d| }	|	dddd |D  d 7 }	||\}
}|	|
d 7 }	t|	jd }|j|_t|jd }|j| dt	
| }|d| d| 7 }t| ||}d| d|| d }t|dkr@|d | }n|}t|jd }|S )N	InputTyperD   ann
OutputTypec                    sf   g }g }| D ]P}|j }|jj}|d\}}|dkrD| || |dkr||| q||fS )Nr   Zinpout)r   r   r   r   )r   inputsoutputsr   var_nameZvar_annZvar_decl_typer  r  rE   rF   process_ins_outs  s    z6build_ignore_context_manager.<locals>.process_ins_outsc                 S   s    t dd| j}| d|j S )Nz[^a-zA-Z0-9_]r   )resubr   ro   )rs   r   r   rE   rE   rF   create_unique_name_ext  s    z<build_ignore_context_manager.<locals>.create_unique_name_extc                 S   s   d}d}t | dkr|d7 }t | dkrDd| d j }|| d j7 }t | dkrd}|dd	d
d | D  d 7 }|d	dd | D 7 }||fS )Nrh   zreturn r   z -> Noner   z -> z	 -> Tuple[, c                 S   s   g | ]
}|j qS rE   )r  rz   varrE   rE   rF   r}   !  s     zObuild_ignore_context_manager.<locals>.build_return_ann_stmt.<locals>.<listcomp>]c                 S   s   g | ]
}|j qS rE   rC   r  rE   rE   rF   r}   "  s     )rk   r  rD   r   )r  Zreturn_type_annZreturn_statement_strrE   rE   rF   build_return_ann_stmt  s     z;build_ignore_context_manager.<locals>.build_return_ann_stmtc                 S   s   d dd | D S )Nr  c                 S   s   g | ]
}|j qS rE   rC   r   rE   rE   rF   r}   &  s     zDbuild_ignore_context_manager.<locals>.build_args.<locals>.<listcomp>)r   )r   rE   rE   rF   
build_args%  s    z0build_ignore_context_manager.<locals>.build_argsr   Zfunc_ignore_z
def (r  c                 S   s   g | ]}|j d  |j qS )z :)rD   r  r  rE   rE   rF   r}   .  s     z0build_ignore_context_manager.<locals>.<listcomp>)z: passz@torch.jit.ignore
z
globals()["z"] = ztorch.jit.frontend.r   )r   r   r   keywordsr   r   r   r   r   
astunparseZunparseexecrk   )rs   r   r  r  r  r  r  r  Zignore_function_nameZignore_function_strZ
return_annZreturn_stmtZignore_functionZignore_func_strZassign_str_lhsZassign_str_rhsZ
assign_str
assign_astrE   r
  rF   build_ignore_context_manager  s:    r  c                 C   s*   | d kri S t | }dd |j D S )Nc                 S   s&   i | ]\}}|j tjjk	r||j qS rE   )defaultr   	Parameterempty)rz   kvrE   rE   rF   
<dictcomp>Y  s    z$get_default_args.<locals>.<dictcomp>)r   	signature
parametersr   )r   r#  rE   rE   rF   get_default_argsS  s    
r%  c                    s(   t j  fddd}dd |D }|S )aC  
    Get default arguments for all methods in a class (except for static methods).

    Args:
        cls: type - The class type to inspect for default arguments.
    Returns:
        A Dict[str, Dict[str, Any]] which maps each method name to a Dict[str, Any]
        that maps each argument name to its default value.
    c                    s.   t | st | o,t | j o,| j jkS r?   )r   r   r   r5   rb   r   r   r   rE   rF   r   n  s   z,get_default_args_for_class.<locals>.<lambda>r   c                 S   s   i | ]\}}|t |qS rE   )r%  )rz   method_nameZmethod_implrE   rE   rF   r"  u  s    z.get_default_args_for_class.<locals>.<dictcomp>)r   r   )r   r   defaultsrE   r   rF   get_default_args_for_class`  s    
	r(  c                   @   s   e Zd Zedd ZdS )WithItemBuilderc                 C   sX   |j j}|j j}|tttj  }|j}| |||}t	|t
| |j |rRt
| |nd S r?   )r   ro   rp   rk   rq   r   r1   Zoptional_varsrn   r2   r   )rs   itemro   startendZop_varsr   rE   rE   rF   ry   ~  s    
zWithItemBuilder.build_withitemN)rb   rc   rd   staticmethodry   rE   rE   rE   rF   r)  }  s   r)  c                   @   s  e Zd Zejdejdejdejdejdej	dej
dejdejd	ejd
ejdiZedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zed d! Zed"d# Zed$d% Zed&d' Zed(d) Zed*d+ Z d,S )-r   +-*/%|&^<<>>**c                 C   s(   |j }|jjdkrd S tt| |S d S )NStr)r   rv   rb   r   r   )rs   r   r   rE   rE   rF   
build_Expr  s    zStmtBuilder.build_Exprc                    s*   t  |j} fdd|jD }t||S )Nc                    s   g | ]}t  |qS rE   r   )rz   xr|   rE   rF   r}     s     z,StmtBuilder.build_Assign.<locals>.<listcomp>)r   r   targetsr	   )rs   r   rhslhsrE   r|   rF   r     s    zStmtBuilder.build_Assignc                 C   s   |j d krt| |ddt|jtjkr|jj jdkr| jdkr|j}|t	d|jj
  }t|jdr~|t	d|jj 7 }| |j||}td| j d	| t| |j }t| |j}t| |j}t|g||S )
Nzwithout assigned value)rt   r]   r^   zself.r   z: zKType annotations on instance attributes must be declared in __init__, not 'z': )r   rg   rj   targetr   r
   r   funcnamerp   rk   r   hasattrr   rn   ro   
ValueErrorr   r	   )rs   r   r+  r,  srr>  r?  Zthe_typerE   rE   rF   r     s(    
zStmtBuilder.build_AnnAssignc                    s6     |j|j|jtd }t| fdd|jD S )NrJ   c                    s   g | ]}t  |qS rE   r;  )rz   r@  r|   rE   rF   r}     s     z,StmtBuilder.build_Delete.<locals>.<listcomp>)rn   ro   rp   rk   r   r=  rs   r   r   rE   r|   rF   build_Delete  s    zStmtBuilder.build_Deletec                 C   s<   |  |j|j|jtd }t||jd kr.d n
t| |jS )Nreturn)rn   ro   rp   rk   r$   r   r   rE  rE   rE   rF   build_Return  s      zStmtBuilder.build_Returnc                 C   s2   |  |j|j|jtd }t| |j}t||S )NrM   )rn   ro   rp   rk   r   excr#   )rs   r   r   r   rE   rE   rF   build_Raise  s    zStmtBuilder.build_Raisec                 C   sN   |  |j|j|jtd }t| |j}|jd k	r>t| |jnd }t|||S )NrN   )rn   ro   rp   rk   r   testrX   r   )rs   r   r   rK  rX   rE   rE   rF   build_Assert  s      zStmtBuilder.build_Assertc                 C   sf   t | |j}t | |j}t|j}|tjkr8tj| }n"tt| |	 j
dddd|j t|||S )N=)r   )offsetsz*unsupported kind of augmented assignment: )r   r@  r   rj   opr   augassign_mapre   find_beforer   r+  rb   r   )rs   r   r?  r>  rP  op_tokenrE   rE   rF   build_AugAssign  s    

zStmtBuilder.build_AugAssignc                 C   sH   |j rtd d| |j|j|jtd }t|t| |jt	| |j
S )Nz-else branches of while loops aren't supportedwhile)orelsere   rn   ro   rp   rk   r0   r   rK  r   r   rE  rE   rE   rF   build_While  s     zStmtBuilder.build_Whilec                 C   sV   |  |j|j|jtd }|jr,t|dt|t| |jgt| |j	gt
| |jS )NrI   z+else branches of for loops aren't supported)rn   ro   rp   rk   rV  re   r   r   r@  iterr   r   rE  rE   rE   rF   	build_For  s    

zStmtBuilder.build_Forc                 C   sB   |  |j|j|jtd }t|t| |jt| |jt| |j	S )Nif)
rn   ro   rp   rk   r   r   rK  r   r   rV  rE  rE   rE   rF   build_If  s    


zStmtBuilder.build_Ifc                    sZ     |j|j|jtd }|jr,t|d fdd|jD }ttt	t
|d|g S )Nr>   z?print statements with non-default destinations aren't supportedc                    s   g | ]}t  |qS rE   r;  )rz   valr|   rE   rF   r}     s     z+StmtBuilder.build_Print.<locals>.<listcomp>)rn   ro   rp   rk   destre   valuesr   r   r/   r   )rs   r   r   r   rE   r|   rF   build_Print  s     zStmtBuilder.build_Printc                 C   s$   |  |j|j|jtd }t|S )Npass)rn   ro   rp   rk   r!   rE  rE   rE   rF   
build_Pass  s    zStmtBuilder.build_Passc                 C   s$   |  |j|j|jtd }t|S )NrR   )rn   ro   rp   rk   r   rE  rE   rE   rF   build_Break!  s    zStmtBuilder.build_Breakc                 C   s$   |  |j|j|jtd }t|S )NrS   )rn   ro   rp   rk   r   rE  rE   rE   rF   build_Continue&  s      zStmtBuilder.build_Continuec                 C   s`   |  |j|j|jtd }t|rDts0tdt| |}t| |S t	|t
| |jt| |jS )NrL   ztorch.jit._IgnoreContextManager requires installing Python library `astunparse`,                                   please install it in your Python environment)rn   ro   rp   rk   r   _IS_ASTUNPARSE_INSTALLEDr   r  r   r1   r   r   r   r   )rs   r   r   r  rE   rE   rF   
build_With-  s    

zStmtBuilder.build_WithN)!rb   rc   rd   r   AddSubMultDivModBitOrBitAndBitXorLShiftRShiftPowrQ  r-  r:  r   r   rF  rH  rJ  rL  rT  rW  rY  r[  r_  ra  rb  rc  re  rE   rE   rE   rF   r     sn              
	










	
	


r   c                   @   s  e Zd Zejdejdejdejdejdej	dej
dejdejd	ejd
ejdejdiZdeej< ejdejdejdiZejdejdiZejdejdejdejdejdejdejdej dej!dej"di
Z#e$dd Z%e$dd Z&e$d d! Z'e$d"d# Z(e$d$d% Z)e$d&d' Z*e$d(d) Z+e$d*d+ Z,e$d,d- Z-e$d.d/ Z.e$d0d1 Z/e$d2d3 Z0e$d4d5 Z1e$d6d7 Z2e$d8d9 Z3e$d:d; Z4e$d<d= Z5e$d>d? Z6e$d@dA Z7e$dBdC Z8e$dDdE Z9e$dFdG Z:dHS )IExprBuilderr.  r/  r0  r1  r8  r2  z//r4  r5  r3  r6  r7  @not~andorz==z!=z<=<z>=>iszis notinznot inc                    sv   t | |j}| jd  fdd}| jd }||tjkrJ|d7 }q2|t|j	 }| 
||}t|t||j	S )Nzutf-8c                    s   t  |  S r?   )chr)indexr   rE   rF   get_charm  s    z-ExprBuilder.build_Attribute.<locals>.get_charr   )r   r   r   encoder   r,  string
whitespacerk   r   make_raw_ranger%   r   )rs   r   baser~  	start_posend_posZ
name_rangerE   r}  rF   build_Attributef  s    
zExprBuilder.build_Attributec                    s   t  |j} fdd|jD }t|drP|jrPt  |j}|t| |g7 }g }|jD ]@}t  |j}|j	s~t
| d|tt| |j	| qZt|||S )Nc                    s   g | ]}t  |qS rE   r;  )rz   r  r|   rE   rF   r}   z  s     z*ExprBuilder.build_Call.<locals>.<listcomp>starargsz&keyword-arg expansion is not supported)r   r   r   rB  r  r'   r   r  r   r   re   r   r
   r   r   )rs   r   r   r   Zstararg_exprkwargskwZkw_exprrE   r|   rF   
build_Callw  s    
 zExprBuilder.build_Callc                 C   s    |  |j|j|jd }t|S )N   )rn   ro   rp   r   rs   r   r   rE   rE   rF   build_Ellipsis  s      zExprBuilder.build_Ellipsisc                 C   s   |  |j|j|jt|j }|jtr8t|dt |jdkrJt|S |jdkr\t	|S |jdkrnt
|S |jdkrt|S tt||jS )Nz=names of variables used in JIT-ed functions can't start with TrueFalseNoneEllipsis)rn   ro   rp   rk   r   r@   rA   re   r,   r   r   r   r/   r   r  rE   rE   rF   
build_Name  s"    



zExprBuilder.build_Namec                 C   s   |  |j|j|jtt|j }|jdkr4t|S |jdkrFt|S |jd krXt|S |jt	krjt
|S tdt|j d S )NTFz!Name constant value unsupported: )rn   ro   rp   rk   strr   r,   r   r   r  r   rC  r  rE   rE   rF   build_NameConstant  s      



zExprBuilder.build_NameConstantc                 C   s   t | |j}t | |j}t|j}|tjkrT| jsT| |	 j
|	 j}t|dtj|}|d kr| |	 j
|	 j}t|d|j t|||S )NzDivision of ints in TorchScript uses Python 3 true division semantics. Please put `from __future__ import division` at the top of your filezunsupported binary operator: )r   leftrightrj   rP  r   ri  Zuses_true_divisionr  r   r,  r+  rV   rq  	binop_maprm   re   rb   r   )rs   r   r?  r>  rP  	err_rangerS  rE   rE   rF   build_BinOp  s"    
 zExprBuilder.build_BinOpc                 C   sf   t | |j}t|j}tj|}|d kr>t| d|j	 | 
|j|j|jt| }t|||S )Nzunsupported unary operator: )r   operandrj   rP  rq  unop_maprm   re   r   rb   rn   ro   rp   rk   r.   )rs   r   sub_exprrP  rS  r   rE   rE   rF   build_UnaryOp  s    
   zExprBuilder.build_UnaryOpc                    s   t |jdk r$tdtt |j  fdd|jD }t|j}tj|}|d kr 	|d 
 j|d 
 j}t|d|j |d }|dd  D ]}t|||}q|S )N   z.expected at least 2 values in BoolOp, but got c                    s   g | ]}t  |qS rE   r;  )rz   r  r|   rE   rF   r}     s     z,ExprBuilder.build_BoolOp.<locals>.<listcomp>r   r   zunsupported boolean operator: )rk   r^  r   r  rj   rP  rq  
boolop_maprm   r  r   r,  r+  re   rb   r   )rs   r   	sub_exprsrP  rS  r  r?  r>  rE   r|   rF   build_BoolOp  s(    
  zExprBuilder.build_BoolOpc                 C   s$   t t| |jt| |jt| |jS r?   )r+   r   rK  r   rV  rs   r   rE   rE   rF   build_IfExp  s
    


zExprBuilder.build_IfExpc                    s    fdd|j gt|j D }d }t||j|dd  D ]\}}}t|}tj|} 	|
 j|
 j}	|d krt|	d|j |tjkrtd||}
t|	d|
}nt|||}|d kr|}q:td||}q:|S )Nc                    s   g | ]}t  |qS rE   r;  rz   er|   rE   rF   r}     s     z-ExprBuilder.build_Compare.<locals>.<listcomp>r   z!unsupported comparison operator: rz  rs  ru  )r  r~   ZcomparatorszipZopsrj   rq  	cmpop_maprm   r  r   r,  r+  re   rb   r   NotInr   r.   )rs   r   Zoperandsr  r?  Zop_r>  rP  rS  r   Zin_exprZcmp_exprrE   r|   rF   build_Compare  s&       
zExprBuilder.build_Comparec           	         s  dd dd   fdd}t |j}t|j}|tjkrt|jjtjrfdd|jjjD }|s	|j
|jjj|jjjd	 }t|g }|| t||S t|t |jjgS n |tjkrt|||jgS |tjkrt||||jS tjd
kr|tjkrg }|jjD ]8}t|tjrL||| n|t | q&|s	|j
|jj|jjd	 }t|g }|| t||S t|t |jgS t| dd S )Nc                 S   s`   |j d k	rt| |j nd }|jd k	r0t| |jnd }|jd k	rJt| |jnd }t| |||S r?   )lowerr   upperstepr&   r   )rs   r  Z
slice_exprr  r  r  rE   rE   rF   build_SliceExpr  s    z4ExprBuilder.build_Subscript.<locals>.build_SliceExprc                 S   s(   t |jtjrt| dt| |jS )Nz9slicing multiple dimensions with tuples not supported yet)r   r   r   r   re   r   r   )rs   r  
index_exprrE   rE   rF   build_Index#  s    z0ExprBuilder.build_Subscript.<locals>.build_Indexc                    s   g }|j D ]|}t|}|tjkr4| | || q
|tjkrR|| || q
|tjkrp|t|  q
t	| d| dq
|S )Nz!slicing multiple dimensions with z not supported)
Zdimsrj   r   Indexr   Slicer  r   r   re   )rs   r  Zextslicer  r   sub_type)r  r  rE   rF   build_ExtSlice+  s    




z3ExprBuilder.build_Subscript.<locals>.build_ExtSlicec                    s   g | ]}t  |qS rE   r;  )rz   r  r|   rE   rF   r}   B  s    z/ExprBuilder.build_Subscript.<locals>.<listcomp>r  )r  	   zellipsis is not supported)r   r   rj   slicer   r  r   r   eltsrn   ro   rp   r-   r   r*   r  ExtSlicesysversion_infore   r   )	rs   r   r  r  r  indicesr   tupr  rE   )r  r  rs   rF   build_Subscript  sT    






  



zExprBuilder.build_Subscriptc                    s.   t  |j|j|jd  fdd|jD S )Nr   c                    s   g | ]}t  |qS rE   r;  r  r|   rE   rF   r}   t  s     z*ExprBuilder.build_List.<locals>.<listcomp>)r   rn   ro   rp   r  r  rE   r|   rF   
build_Listp  s    zExprBuilder.build_Listc                    s.   t  |j|j|jd  fdd|jD S )Nr   c                    s   g | ]}t  |qS rE   r;  r  r|   rE   rF   r}   {  s     z+ExprBuilder.build_Tuple.<locals>.<listcomp>)r-   rn   ro   rp   r  r  rE   r|   rF   build_Tuplew  s    zExprBuilder.build_Tuplec                    s^     |j|j|jd }|jr2|jd s2t|dt| fdd|jD  fdd|jD S )Nr   r   z1Dict expansion (e.g. `{**dict}`) is not supportedc                    s   g | ]}t  |qS rE   r;  r  r|   rE   rF   r}     s     z*ExprBuilder.build_Dict.<locals>.<listcomp>c                    s   g | ]}t  |qS rE   r;  r  r|   rE   rF   r}     s     )rn   ro   rp   keysre   r   r^  )rs   r   r   rE   r|   rF   
build_Dict~  s     zExprBuilder.build_Dictc                 C   s0   t |j}| |j|j|jt| }t||S r?   )r  nrn   ro   rp   rk   r   rs   r   r   r   rE   rE   rF   	build_Num  s    
zExprBuilder.build_Numc                 C   s   |j }|d kst|tr$t| |S t|tttfr@t| |S t|t	rVt
| |S t|ttrpt| |S | |j|j|jtt	| }t|dd S )Nz Unknown Constant expression type)r   r   r   rq  r  intfloatcomplexr  r  	build_Strrj   r  r  rn   ro   rp   rk   rV   )rs   r   r   Zerror_rangerE   rE   rF   build_Constant  s    
  zExprBuilder.build_Constantc                 C   s4   t |j}| |j|j|jt| d }t||S Nr   )r  r   rn   ro   rp   rk   r)   r  rE   rE   rF   r    s    
  zExprBuilder.build_Strc                 C   s   d}g }|j D ]}| |j|j|jd }t|tjrz|jdkrJt|d|j	d k	r^t|d|d7 }|
t| |j qt|tjr||j7 }qt|dq| |j|j|jd }ttt||t|d|g S )	Nrh   r   rN  z%Don't support conversion in JoinedStrz%Don't support formatting in JoinedStrz{}zUnsupported value in JoinedStrformat)r^  rn   ro   rp   r   r   FormattedValue
conversionre   format_specr   r   r   r9  r   r   r%   r)   r   )rs   r   r   r   r   r   rE   rE   rF   build_JoinedStr  s     




zExprBuilder.build_JoinedStrc                 C   s   |  |j|j|j}t|jdkr,t|dt|jd jdkrJt|dt| |j}t| |jd j	}t| |jd j
}t||||S Nr   z.Only a single generator is currently supportedr   z'Comprehension ifs are not supported yet)rn   ro   rp   rk   
generatorsre   ifsr   eltr@  rX  r   )rs   r   r   Zelt_exprtarget_expr	iter_exprrE   rE   rF   build_ListComp  s    

zExprBuilder.build_ListCompc                 C   s   t | |S r?   )rq  r  )rs   r   rE   rE   rF   build_GeneratorExp  s    zExprBuilder.build_GeneratorExpc                 C   s   |  |j|j|j}t|jdkr,t|dt|jd jdkrJt|dt| |j}t| |j	}t| |jd j
}t| |jd j}t|||||S r  )rn   ro   rp   rk   r  re   r  r   keyr   r@  rX  r   )rs   r   r   Zkey_exprZ
value_exprr  r  rE   rE   rF   build_DictComp  s    

zExprBuilder.build_DictCompc                 C   s*   |  |j|j|jd }t|t| |jS r  )rn   ro   rp   r'   r   r   r  rE   rE   rF   build_Starred  s    zExprBuilder.build_StarredN);rb   rc   rd   r   rf  rg  rh  ri  rp  rj  FloorDivrl  rm  rk  rn  ro  r  MatMultNotUSubInvertr  AndOrr  EqNotEqLtELtGtEGtIsIsNotInr  r  r-  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rE   rE   rE   rF   rq  <  s               
               










`









rq  r   r   c                 C   s8   | j d | |}| ||d  |t| |d  S )Nr   r   )r   rindexr  rk   )rs   possubstrrO  new_posrE   rE   rF   rR    s    rR  )NF)NN)N)N)r  )r   r   r   r  r  r  collectionsr   textwrapr   typingr   r   rY   Ztorch.jit.annotationsr   Ztorch._C._jit_tree_viewsr   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#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   Ztorch._jit_internalr3   r4   r5   r6   Ztorch._sourcesr7   r8   r9   r:   r   Ztorch.jit._dataclass_implsr;   Ztorch.jit._monkeytype_configr<   r=   rd  r  ImportErrorrA   rB   setascii_lowercaseascii_uppercasedigitsZ_identifier_charsrG   r   Import
ImportFromGlobalrq   rl   updateAsyncFunctionDefAsyncFor	AsyncWithTryNonlocalr   	ExceptionrV   re   rg   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r%  r(  r)  r   rq  r   r   ry   rR  rE   rE   rE   rF   <module>   s  .                             
     
 "A
C	

4
V 0   2