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Zd dlmZm	Z	 d dl
Z
d dl
mZmZ ddlmZmZ ddlmZ ddlmZmZmZmZmZ ddlmZ dd	lmZ dd
l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, ddl-m.Z.m/Z/m0Z0 ddl1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z= ddl>m?Z?m@Z@mAZA ddlBmCZC eDeEZFG dd de0ZGdS )    N)DictList)	sym_floatsym_int   )config	variables)
is_allowed)AttributeMutationErrorunimplementedUnsupported	UserErrorUserErrorType)GuardBuilder)DummyModule)
AttrSourceis_constant_sourceSuperSource
TypeSource)build_checkpoint_variablecheck_constant_argscheck_numpy_ndarray_argscheck_unspec_python_argsget_fake_valueguard_if_dynis_utils_checkpointistypenumpy_operator_wrapperproxy_args_kwargsspecialize_args_kwargs   )MutableLocaltypestrVariableTracker)ConstantVariableEnumVariable)ConstDictVariable)BaseListVariableListIteratorVariableListVariableSetVariableSizeVariableTupleIteratorVariableTupleVariable)FakeItemVariableSymNodeVariableUnspecializedPythonVariable)UserDefinedVariablec                       s  e Zd Zeeddd Zdd Zeeddd Zeeddd	 Z	eedd
d Z
edd Zdd Z fddZdd Zdd Zdd Z fddZdd Zdd Zdd Zd d! Zed"d# Zd$d%d&d' fd(d)Zd*d+ Zd,d- Zd.d/ ZeZeZd0d1 Zd2d3 Zd4d5 Zd6d7 Z dyd8d9Z!e!Z"e!Z#e!Z$e!Z%ed:d; Z&d<d= Z'ed>d? Z(d@dA Z)dBdC Z*dDdE Z+dFdG Z,dHdI Z-dJdK Z.dLdM Z/dNdO Z0dPdQ Z1dRdS Z2dTdU Z3dVdW Z4dzdXdYZ5d{e6e6dZd[d\Z7e6e6e6d]d^d_Z8e6e6dZd`daZ9e6dbdcddZ:e6dbdedfZ;e6dbdgdhZ<didj Z=dkdl Z>dmdn Z?dodp Z@dqdr ZAdsdt ZBdudv ZCdwdx ZDeAZEeAZFeAZGeAZHeAZIeAZJeAZKeAZL  ZMS )|BuiltinVariableNc               4   C   s   t ttttttttt	t
tttttttjtttjtjtjtjtjtjtjtjtjtjtjtjtj tj!tj"tj#tj$tj%tj&tj'tj(tj)tj*tj+tj,tj-tj.tj/tj0tj1tj2tj3h4} | 4dd t5j67 D  | S )Nc                 s   s"   | ]}t |ttjr|V  qd S N)
isinstancetypemathsqrt.0x r;   ^/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torch/_dynamo/variables/builtin.py	<genexpr>r   s      z;BuiltinVariable._constant_fold_functions.<locals>.<genexpr>)8absallanyboolcallablechrdivmodfloatintlenmaxminordpowreprroundstrformatsumr5   operatorposnegnot_invertmulmatmulfloordivtruedivmodaddsubgetitemlshiftrshiftand_or_xoripowimulimatmul	ifloordivitruedivimodiaddisubilshiftirshiftiandixoriorindexupdater6   __dict__valuesfnsr;   r;   r<   _constant_fold_functions9   sn    6z(BuiltinVariable._constant_fold_functionsc                 C   s   | j |  kS r3   )fnrv   selfr;   r;   r<   can_constant_fold_throughu   s    z)BuiltinVariable.can_constant_fold_throughc                  C   s   t jt jt jt jt jt jt jt jt j	t j
t jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt jt jh} | S r3   ) rQ   rR   rS   rT   rU   rK   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rt   r;   r;   r<   _fx_graph_functionsx   sB    !z#BuiltinVariable._fx_graph_functionsc                  C   s   t jdddgt jft jdddgt jft jddd	gt jft jd
ddgt jft j	dddgt j
ft jdddgt jftdddgt jft jdddgt jft jdddgt jft jdddgt jfi
} | S )N__add____radd____iadd____sub____rsub____isub____mul____rmul____imul____truediv____rtruediv____itruediv____floordiv____rfloordiv____ifloordiv____mod____rmod____imod____pow____rpow____ipow__
__lshift____rlshift____ilshift__
__rshift____rrshift____irshift__)rQ   r[   ri   r\   rj   rV   rd   rY   rg   rX   rf   rZ   rh   rK   rc   r^   rk   r_   rl   rt   r;   r;   r<   _binops   s<          zBuiltinVariable._binopsc                     s  i } t   D ]\}\}}g | |< g | |< |\}}}||fdd}| | ttf|f | | ttf|f |fdd}| | ttf|f | | ttf|f |fdd}	| | ttf|	f | | ttf|	f | | ttf|	f | | ttf|	f qdd }
d	d
 }ttf|fttf|
ftt	f|
ft	tfdd ft
t
fdd fg}| tj | dd }ttf|fttf|
ftt	f|
fg}| tj | dd  tt	f ftt	f ft	tf fddft	tf fddfg}| tj | | S )Nc                 S   s2   t |tr|| ||gi S || ||gi S d S r3   )r4   r1   call_method)txaboptionsforward_namereverse_namer;   r;   r<   user_defined_handler   s    
z=BuiltinVariable._binop_handlers.<locals>.user_defined_handlerc                 S   s   | | ||gi S r3   r   )r   r   r   r   r   r;   r;   r<   user_defined_inplace_handler   s    zEBuiltinVariable._binop_handlers.<locals>.user_defined_inplace_handlerc                 S   s4   ddl m} || | jjd|ft||gi  f|S Nr    )wrap_fx_proxycall_function)builderr   outputcreate_proxyr   )r   r   r   r   rw   r   r;   r;   r<   dynamic_handler  s     z8BuiltinVariable._binop_handlers.<locals>.dynamic_handlerc                 S   s   t |jt||  f|S r3   )r-   itemslistunpack_var_sequencer   r   r   r   r;   r;   r<   tuple_add_handler#  s    z:BuiltinVariable._binop_handlers.<locals>.tuple_add_handlerc                 S   s   t |jt||  f|S r3   )r+   r   r   r   r   r;   r;   r<   size_add_handler&  s    z9BuiltinVariable._binop_handlers.<locals>.size_add_handlerc                 S   s   t t|| |j f|S r3   )r-   r   r   r   r   r;   r;   r<   <lambda>;  s   z1BuiltinVariable._binop_handlers.<locals>.<lambda>c                 S   s   t ||j|j f|S r3   )r5   r   r   r;   r;   r<   r   A      c              	   S   sD   |j r|| sd S | |tt|jt||  fddi|S )NZregen_guardsF)mutable_localhas_unpack_var_sequencereplace_allr)   r   r   r   r   r;   r;   r<   list_iadd_handlerF  s    z:BuiltinVariable._binop_handlers.<locals>.list_iadd_handlerc                 S   s"   |j f |j|  t d|S )N)r   r   )	__class__r   as_python_constantr!   )r   lstconstr   r;   r;   r<   expand_list_likee  s    z9BuiltinVariable._binop_handlers.<locals>.expand_list_likec                    s    | |||S r3   r;   r   r   r;   r<   r   q  r   c                    s    | |||S r3   r;   r   r   r;   r<   r   u  r   )r2   r   r   appendr1   r#   r/   r+   r-   r$   r'   rQ   r[   extendr)   ri   rV   )Zop_handlersopZmagic_method_namesZin_place_opr   r   Zinplace_namer   r   r   r   r   Zlist_like_addition_handlersr   Zlist_like_iadd_handlersZlist_like_expansion_handlersr;   r   r<   _binop_handlers   s    	















zBuiltinVariable._binop_handlersc                 C   sJ   t  }| |krd S ||  D ](\\}}}t||rt||r|  S qd S r3   )r2   r   r4   )r   r   r   handlersZtype1Ztype2handlerr;   r;   r<   _find_binop_handler|  s    
z#BuiltinVariable._find_binop_handlerc                 C   s   | j |  kS r3   )rw   r{   rx   r;   r;   r<   can_insert_in_graph  s    z#BuiltinVariable.can_insert_in_graphc                    s   t  jf | || _d S r3   )super__init__rw   )ry   rw   kwargsr   r;   r<   r     s    zBuiltinVariable.__init__c                 C   s,   | j d krd}n| j j}| jj d| dS )NNone())rw   __name__r   )ry   namer;   r;   r<   __str__  s    
zBuiltinVariable.__str__c                 C   s
   t | jS r3   )r5   rw   rx   r;   r;   r<   python_type  s    zBuiltinVariable.python_typec                 C   s   | j S r3   )rw   rx   r;   r;   r<   r     s    z"BuiltinVariable.as_python_constantc                    s4   t tj ttjttji}| j|kr*|| j S t  S r3   )	rA   torchrF   Zint64rE   Zfloat64rw   r   as_proxy)ry   ZDTYPEr   r;   r<   r     s       

zBuiltinVariable.as_proxyc                 C   s>   | j j}| j jdkst||jjks,td|j|dddgS )Nbuiltinszshadowed globalFT)r[   )rw   r   
__module__AssertionErrorr   	f_globalsZcreate_load_global)ry   Zcodegenr   r;   r;   r<   reconstruct  s    zBuiltinVariable.reconstructc                 O   s
   t ||S r3   )r   ry   argsr   r;   r;   r<   constant_args  s    zBuiltinVariable.constant_argsc                 O   s>   t dd t|| D o<t dd t|| D  S )Nc                 s   s   | ]}t |tjV  qd S r3   )r4   r   TensorVariabler9   ir;   r;   r<   r=     s   z.BuiltinVariable.tensor_args.<locals>.<genexpr>c                 s   s   | ]}t |tjV  qd S r3   )r4   r   GetAttrVariabler   r;   r;   r<   r=     s   )r@   	itertoolschainrs   r   r;   r;   r<   tensor_args  s    zBuiltinVariable.tensor_argsc                 O   s
   t ||S r3   )r   r   r;   r;   r<   unspec_python_args  s    z"BuiltinVariable.unspec_python_argsc                 C   s   g }i }| D ].}t |tjfr,||j q||  q|D ]:\}}t |tjfrh|||ji q@||| i q@||fS r3   )r4   r   r0   r   	raw_valuer   rq   )r   r   Zunwrapped_argsZunwrapped_kwargsr:   kvr;   r;   r<   unwrap_unspec_args_kwargs  s"    z)BuiltinVariable.unwrap_unspec_args_kwargszList[VariableTracker]zDict[str, VariableTracker]r#   )r   r   returnc              
      s   ddl m}m} t||}| j||}| j||}t| || }	| 	 oR|pR|}
t
|ttfsftt
|tstt| jtjkrt
|d tjsd}t|||\}}|  r|r| jtjkrt
|d trt
|d tjsz| j}| jtjkr"t
|d tjr"tj|d |d g }}| jtjkr`t
|d tr`tj|d td|d g }}t||rtdd |D s|jj dt!| jft"|| }|tj#||f|	W S |jj d|ft"|| }tdd |D r|t$||f|	W S | j||rX| %||\}}| j||}td	d t&'|| D }|t(||f||d
|	W S t)dd |D rtj*||d f|	W S | jtj+krt
|d tj(r|d ,||d< |||f|	W S W n0 t-k
r   t.d|  d| d|  Y nX | jt/t0fkrZt
|d trZ| jt/kr&t1nt2}|f ||j d||d 3 fi d|	}|S t4|dkrt4|dkrt56| j|d |d }|r|||d |d |	}|d k	r|S t7| d| jj8 d }|r.zt9:|j;|f|| W n< t<k
r, } z|
st=>d|| d }W 5 d }~X Y nX |rz*||f||}|d k	r\|?|	W S W n4 t@k
r } z|
sz |A  W 5 d }~X Y nX |
rt|||\}}tj| B dd |D dd |C D f|	S | jtDkrt4|dkrt
|d trtEtFjGdtH I|||S )Nr    )r   wrap_fx_proxy_clsr   Fc                 s   s   | ]}t |tjkV  qd S r3   )r5   r   r   r9   argr;   r;   r<   r=     s    z0BuiltinVariable.call_function.<locals>.<genexpr>r   c                 s   s   | ]}t |tV  qd S r3   r4   r.   r   r;   r;   r<   r=     s     c                 s   s    | ]}t |tjr|jV  qd S r3   r4   r   r0   need_unwrapr8   r;   r;   r<   r=   #  s   )r   r   c                 s   s   | ]}t |tV  qd S r3   r4   r/   r8   r;   r;   r<   r=   1  s     zpartial tensor op:  r   proxyr   Zcall_z1incorrect arg count %s %s and no constant handlerc                 S   s   g | ]}|  qS r;   r   r8   r;   r;   r<   
<listcomp>x  s     z1BuiltinVariable.call_function.<locals>.<listcomp>c                 S   s   i | ]\}}||  qS r;   r   )r9   r   r   r;   r;   r<   
<dictcomp>y  s      z1BuiltinVariable.call_function.<locals>.<dictcomp>zgCalling round() on symbolic value is not supported. You can use floor() to implement this functionality)Jr   r   r   r   r   r   r#   	propagaters   rz   r4   r   tupler   dictrw   rQ   r]   r   r   r   r   r&   ri   r$   r[   r/   r   selectr   r@   r   r   r   r   NumpyNdarrayVariabler.   r   r   r   r0   r?   createrY   Zconvert_to_constantNotImplementedErrorr   rF   rE   r   r   r   rG   r2   r   getattrr   inspect	signaturebind	TypeErrorlogwarningadd_optionsr   Zremove_from_statsr   r   rM   r   r   ZSTANDARD_LIBRARYr   r   )ry   r   r   r   r   r   r   r   r   r   Zhas_constant_handlerrw   r   _args_kwargsr   r   Zfn_outZbinop_handlerresr   excresultr   r;   r<   r     s:   
 
	 
     
  

zBuiltinVariable.call_functionc                 G   sr   t |dkr4|d |r4|d |}| ||S t |dkrV| ||d |d S t |dkrn| ||S d S )Nr    r   r   )rG   r   r   _call_min_max_seq_call_min_max_binaryry   r   r   r   r;   r;   r<   _call_min_max  s    zBuiltinVariable._call_min_maxc                 C   s:   t |dkstt |dkr$|d S tt| j||S Nr   r    )rG   r   	functoolsreducepartialr  )ry   r   r   r;   r;   r<   r    s    z!BuiltinVariable._call_min_max_seqc                 C   s  |  ||r0t|tjs$|| }}t|tjs4tt|trVttj	||gi }t|t
sjt|t
rddlm} |t|f||jjd| jft||gi  dt| ||gS | rt|tjrdd l}t|j}nttj}| jtkrd|ind|i}|	||g|}njt|tjrVdd l}t|jt|ji| j }t|}n ttjttji| j }t|}|	|||gi }tdd	 ||fD r*td
d	 ||fD rtj |S | r|! }	n|j"}	| jtkrt|j"|	}
nt|j"|	}
tdd	 ||fD }tj# ||
|S |S nt|tj$rt|tj$r| jtkrlt$t|j%|j%S t$t|j%|j%S nbt|t
st|t
r|jjd| jft||gi  }t
&||d S t'dt(| dt(|  d S )Nr    r   r   r   r   rI   rH   c                 s   s    | ]}t |tjtjfV  qd S r3   )r4   r   r0   r$   r   r;   r;   r<   r=     s   z7BuiltinVariable._call_min_max_binary.<locals>.<genexpr>c                 s   s   | ]}t |tV  qd S r3   r   )r9   valr;   r;   r<   r=     s     c                 s   s    | ]}t |tjr|jV  qd S r3   r   r8   r;   r;   r<   r=     s   z unsupported min / max over args z, ))r   r4   r   r   r   r.   TorchVariabler   tensorr   r/   r   r   r5   r   r   rw   r   r#   r   is_python_constantr   numpyZNumpyVariableZclipclamprH   maximumrI   minimumr?   r@   Zfrom_tensor_variabler   r   r0   r$   valuer   r   rN   )ry   r   r   r   r   nprw   r   r  Zraw_bZraw_resr   r   r;   r;   r<   r    s    







    z$BuiltinVariable._call_min_max_binaryc                 G   sT   | j | s| j| r.t||i \}}t|S | j| rPdd |D }t|S d S )Nc                 S   s   g | ]}t t|qS r;   )r   r$   r   r   r;   r;   r<   r     s     z.BuiltinVariable.call_range.<locals>.<listcomp>)r   r   r   r   ZRangeVariable_dynamic_args)ry   r   r   _r;   r;   r<   
call_range  s    


zBuiltinVariable.call_rangec                 O   s(   t dd |D p&t dd | D S )Nc                 s   s   | ]}t |tV  qd S r3   r   r8   r;   r;   r<   r=     s     z0BuiltinVariable._dynamic_args.<locals>.<genexpr>)r@   rs   r   r;   r;   r<   r    s    zBuiltinVariable._dynamic_argsc                 G   s
   t |S r3   )r   ZSliceVariable)ry   r   r   r;   r;   r<   
call_slice	  s    zBuiltinVariable.call_slicec                 O   sD   ddl m} t| || }|||jjd| jft|| f|S r   )	r   r   r#   r   rs   r   r   rw   r   )ry   r   r   r   r   r   r;   r;   r<   
_dyn_proxy  s     zBuiltinVariable._dyn_proxyc                 O   s  | j ||r| j|f||S tj| j}|d kr\|tkrL||g t dS |g t dS n||r t	 }|j
rt|j
st|tr||j
tj n||j
tj |tkr||t||t |d| |S |t||t |d| |S d S )Nr   )r   guards)r  r  r   r'   Zcls_forrw   r*   r!   r   setsourcer   r4   r,   r[   Z
make_guardr   ZTUPLE_ITERATOR_LENZLIST_LENGTHr   r   r   )ry   r   objr   r   clsr   r;   r;   r<   _call_iter_tuple_list  sL    
  z%BuiltinVariable._call_iter_tuple_listc                    s>   |d kp<t |tp<t |tttfo<t fdd| D S )Nc                 3   s4   | ],}t |ttfo*t | d  ttfV  qdS )r   N)r4   r)   r-   r   r$   r%   r8   r   r;   r<   r=   P  s    z=BuiltinVariable.is_supported_call_dict_arg.<locals>.<genexpr>)r4   r&   r)   r-   r(   r?   r   )r   r   r;   r&  r<   is_supported_call_dict_argB  s    z*BuiltinVariable.is_supported_call_dict_argc                 C   s0   ddl m} t|tj|fr,td|S d S )Nr    )BaseUserFunctionVariableT)Z	functionsr(  r4   r   UserDefinedClassVariabler$   r   )ry   r   r   r(  r;   r;   r<   call_callableZ  s     zBuiltinVariable.call_callablec                 K   s   |d kst |tr4t|d k	r |ni |t d|S t |tjrV|j|t d|S t |ttt	fr| }|
| D ]2}|
| d  }|
| d }|||i qvt||t d|S tdd S )Nr  user_clsr   r   r    z!call_dict_helper with illegal arg)r4   r   r&   r!   r   r   cloner)   r-   r(   r   r   rq   r   )r   r,  r   r   r   r:   r   r   r;   r;   r<   call_dict_helperb  sF         z BuiltinVariable.call_dict_helperc                 O   s,   t |dkr|d S td| d|  d S )Nr   r    z$unsupported args to builtin cast(): r   )rG   r   )ry   r  r   r   r;   r;   r<   	call_cast  s    zBuiltinVariable.call_castc                 O   s~   |s|s|  |td S |sHt|dkrH| ||d rH|  |t|d S |sf|rftjt|tt dS td| d|  d S )Nr    r   r+  zdict(): r   )r.  r   rG   r'  r   r&   r!   r   ry   r   r   r   r;   r;   r<   	call_dict  s     
  zBuiltinVariable.call_dictc                    sX   t | | tfdd|D rT fddtfdd|D  D }tj|f S d S )Nc                 3   s   | ]}|  V  qd S r3   r   r8   r&  r;   r<   r=     s     z+BuiltinVariable.call_zip.<locals>.<genexpr>c                    s   g | ]}t jt|f qS r;   )r   r-   r   )r9   itemr   r;   r<   r     s   z,BuiltinVariable.call_zip.<locals>.<listcomp>c                    s   g | ]}|  qS r;   )r   r   r&  r;   r<   r     s     )r#   r   r?   zipr   r-   r	  r;   )r   r   r<   call_zip  s    
zBuiltinVariable.call_zipc                    s   t | | t|dkrd}n0t|dks.tt|d tjsBt|d  }|d |r fddt	|d 
||D }tj|f S d S )Nr    r   r   c                    s,   g | ]$\}}t jt j|f |gf qS r;   )r   r-   r$   )r9   idxvarr4  r;   r<   r     s   z2BuiltinVariable.call_enumerate.<locals>.<listcomp>)r#   r   rG   r   r4   r   r$   r   r   	enumerater   r-   )ry   r   r   startr   r;   r4  r<   call_enumerate  s    
zBuiltinVariable.call_enumeratec                 O   s   |d  |d|dd  |S )Nr   __len__r    r   r0  r;   r;   r<   call_len  s    zBuiltinVariable.call_lenc                 O   s8   | j ||rt|||\}}|d |d|dd  |S )Nr   __getitem__r    )r   r   r   r0  r;   r;   r<   call_getitem  s    zBuiltinVariable.call_getitemc                 C   s   |  }| }t|tjr6|jd k	r6t||S t|tjrdt|j	t
jrdtd| d|  t|tjrd|jjkrt|j||j	S zt||}W n tk
r   ||k}Y nX t|S )Nz&isinstance called on UserDefinedClass r   __instancecheck__)r   r   r4   r   r   Zdtyper$   call_isinstanceUserDefinedObjectVariabler  typesMemberDescriptorTyper   r   rr   r@  
issubclassr   )ry   r   r   Zisinstance_typeZarg_typer  r;   r;   r<   rA    s.     

zBuiltinVariable.call_isinstancec                 C   s8   |j d ks|j d krd nt|j |j d}tj|||dS )N)r5   baser"  )r"  r   r   ZSuperVariable)ry   r   r   r   r"  r;   r;   r<   
call_super  s    zBuiltinVariable.call_superc                 C   sJ   t |tjr(| \}}||| |S t |tjrF|jd | |S d S )Nr   )r4   r   r(   Znext_variablesr   r'   r   r   )ry   r   r   r  Z	next_iterr;   r;   r<   	call_next  s    zBuiltinVariable.call_nextc                 C   s*   |  r&| }|||| ||S d S r3   )r  r   call_hasattrr   )ry   r   r#  attrr   r;   r;   r<   rJ    s    zBuiltinVariable.call_hasattrc                    s<   | r8 fdd|D }t||  |S d S )Nc                    s   g | ]}  |gi qS r;   )r   r8   rw   r   r;   r<   r     s     z,BuiltinVariable.call_map.<locals>.<listcomp>)r   r   r   r-   r   )ry   r   rw   seqr   r;   rL  r<   call_map  s    
zBuiltinVariable.call_mapc              	   K   s   t |tjtjfrHtdd |jD rH|sHdd |jD }tt|S ||r|	dtd
 }|rpt|||d  }ttj|ttjt|td| |gi S d S )Nc                 s   s*   | ]"}t |tjo t |jttfV  qd S r3   )r4   r   r$   r  rF   rE   r8   r;   r;   r<   r=     s   z+BuiltinVariable.call_sum.<locals>.<genexpr>c                 S   s   g | ]
}|j qS r;   )r  r8   r;   r;   r<   r     s     z,BuiltinVariable.call_sum.<locals>.<listcomp>r:  r   )r4   r   r)   r-   r?   r   r$   rP   r   popr   r   r   r2   r  r  r   rQ   r[   r   )ry   r   rM  r   Znew_listr:  r   r;   r;   r<   call_sum  s2    	
 
zBuiltinVariable.call_sumc                 C   s\   | |rX||}|d kr4|d |dd   }}n|}|D ]}||||gi }q<|S d S r  )r   r   r   )ry   r   functioniterableZinitializerr   r  elementr;   r;   r<   call_reduce  s    

zBuiltinVariable.call_reduce)r#  name_varc                 C   s&  ddl m}m}m}m}m}	 ddlm}
 t	| ||}|d }|
 }| sVtd |jj|rz|jj|||W S  tk
r   Y nX |d k	r| |||}||j |
 dkst|
 s||S |jrt|j|}||d< nd }t|tjr||||S t|tjr|dkr|r||jjD ]4}|j|j kr<|j!j"}|
||||  S q<td	 ntd	 nt|tjtj#tjtj$tj%frz|||j&|d
|W S  t'k
r   |||f| Y S X n4t||rft(|j)|}t*|r"||d< t+f |S t,|r8||f|S |-|rP||f|S |
||||S nt||t.fr|j)j/| }t0j1r|j23|j)|| |
||||S t4||	r|dkr|t(|j5|ft	|S z|||j&|d
|W S  t'k
r    |||f| Y S X d S )Nr    )r$   r   PythonModuleVariabler  UserFunctionVariableVariableBuilderr   znon-const getattr() name)TFr"  gradztensor gradrG  )r   r   )6 r$   r   rV  r  rW  r   rY  r#   r   r   r  r   r   side_effectsis_attribute_mutationZ	load_attrr   KeyErrorrJ  rq   r   r   Z
add_guardsr"  r   r4   r   NNModuleVariablevar_getattrr   Z	graphargsrF  ZexamplerZ  ZNamedTupleVariabler)  rB  r-  r   r   r  r   r   r	   Z
is_literalr   rr   r   Zreplay_record_enabledZexec_recorderZrecord_module_accessr   rw   )ry   r   r#  rU  defaultr$   r   rV  r  rW  rY  r   r   r   Zhasattr_varr"  ZgraphargZexample_valuememberr;   r;   r<   call_getattr  s    







zBuiltinVariable.call_getattr)r#  rU  r  c                 C   st  ddl m} t|tj|fr0||d||gi S |jj|rj|	 rj|jj
|| | || ||S t|tjrtdt|jj  nt|tjrp|j std|	 rft|tjrft| j|}z||| }W n tk
r   d }Y nX t|tjrft| j|}tjj|||jdd}	t|j d}
|	|krf|
t!j"j#jkrf|S |$| d S )Nr    )PlacementVariable__setattr__z#setattr(UserDefinedObjectVariable) z?Can't inplace modify module params/buffers inside HigherOrderOpT)r"  Z	is_tensor)%distributedrd  r4   r   ZDataClassVariabler   r   r\  r]  r  Z
store_attrr   r   rB  r   r5   r  re  r_  Zis_root_tracerr
   r   r   r   noder`  AttributeErrorr   Zwrap_to_fake_tensor_and_recordr"  r   getattr_staticmodule_typer   nnModuleZconvert_to_unspecialized)ry   r   r#  rU  r  rd  Zassigning_fake_valZgetattr_varZexisting_attrZexisting_fake_attrZmod_setattrr;   r;   r<   call_setattr~  sV    
 
   zBuiltinVariable.call_setattrc                 C   s   |  |||t S r3   )rm  r   ZDeletedVariable)ry   r   r#  rU  r;   r;   r<   call_delattr  s    zBuiltinVariable.call_delattr)r#  c                 C   s   ddl m} z| }W n tk
r0   d }Y nX t|tjrNt|| |S |d k	rx|j	rx||t
|j	|| |S ttjdd S )Nr    rX  zJCan't call type() on generated custom object. Please use __class__ instead)r   rY  r   r   r   r   r-   r2   r   r"  r   r   r   ZANTI_PATTERN)ry   r   r#  rY  Zpy_typer;   r;   r<   	call_type  s     
 zBuiltinVariable.call_typec                 C   s6   | |r2tt||}tj|ft| |S d S r3   )r   r   reversedr   r   r-   r#   r   )ry   r   r#  r   r;   r;   r<   call_reversed  s    

zBuiltinVariable.call_reversedc                    s   | rt|tjstdd |D r|dd  |dtd }t	|dks^t
 rt| fdd|d	}nt|d
d |d	}tj|ft| |S d S )Nc                 s   s   | ]}|  V  qd S r3   r  r8   r;   r;   r<   r=     s     z.BuiltinVariable.call_sorted.<locals>.<genexpr>keyreverseFr   c                    s     | gi  S r3   )r   r   r:   rQ  r   r;   r<   r     s     z-BuiltinVariable.call_sorted.<locals>.<lambda>)rs  rt  c                 S   s   |   S r3   r   ru  r;   r;   r<   r     r   )r   r4   r   r   r?   r   rO  r$   r   rG   r   sortedr)   r#   r   )ry   r   r#  r   rt  r   r;   rv  r<   call_sorted  s0    
 zBuiltinVariable.call_sortedc                    sR   t  fdd|D rNg }|D ]}||  qtj|ftj| f| S d S )Nc                 3   s   | ]}|  V  qd S r3   r2  )r9   r#  r&  r;   r<   r=     s     z-BuiltinVariable.call_chain.<locals>.<genexpr>)r?   r   r   r   r-   r#   r   )ry   r   r   r   r#  r;   r&  r<   
call_chain  s    zBuiltinVariable.call_chainc                 G   sh   | |rdtdd |D rddd |D }||}ttj|f| }tj|ftj	| |f| S d S )Nc                 s   s   | ]}|  V  qd S r3   rr  r8   r;   r;   r<   r=     s    z.BuiltinVariable.call_islice.<locals>.<genexpr>c                 S   s   g | ]}|  qS r;   r   r8   r;   r;   r<   r     s     z/BuiltinVariable.call_islice.<locals>.<listcomp>)
r   r?   r   r   r   islicer   r-   r#   r   )ry   r   rR  r   Z
const_argsr   r;   r;   r<   call_islice  s    
zBuiltinVariable.call_islicec                 C   s(   t |tr$tj|t| d dS d S )NZsym_num)r4   r/   r   rQ   rS   r   ry   r   r   r;   r;   r<   call_neg  s    
zBuiltinVariable.call_negc                 G   sR   t |dkr@t|d tjr@|d }|j|j}tt|S t	d|  d S )Nr   zcall_id with args )
rG   r4   r   r_  r   get_submodule
module_keyr$   idr   )ry   r   r   Znn_mod_variablerZ   r;   r;   r<   call_id  s
    zBuiltinVariable.call_idc                    s  ddl m}m mm}m}m} ddlm} ddl	m
}	m}
 | jfdd}t fddfD rȈ|	 krtr|jjn tr|jjn  S t|r|	 kr|  t|s|   jjS t|tfr8tt|fr8||S t|rlttks\|  ||S ttrttks|   jjS t|rdd	lm} |
 kr|  |t|  S ttsttr6|
 kr|  tj|  d
dS t r`t r` jjS t|rt|r jjS jdkrttk	r dS |  d
S )z
        Used to implement comparison operators for different types.
        For example, list1 < list2 is implemented differently from tensor1 < tensor2
        r    )r'   r$   r_  r   rB  rW  )r+   )supported_const_comparison_opssupported_tensor_comparison_opsc                      s&   t dt  d dt  d S )Nzcomparison r   )r   r"   r;   )leftr   rightr;   r<   _unimplemented(  s    z3BuiltinVariable._comparison.<locals>._unimplementedc                 3   s   | ]}t | fV  qd S r3   )r4   r8   )r$   r_  r;   r<   r=   ,  s   z.BuiltinVariable._comparison.<locals>.<genexpr>r  Nr|  is_F) r[  r'   r$   r_  r   rB  rW  listsr+   r  r  r  rw   r?   rs   r4   r   r  r  r   r-   Zlist_comparer5   r*   Z_underlying_itemsr   r   r   r/   r   r  r   )ry   r   r  r  r'   r   rB  rW  r+   r  r  r  r   r;   )r$   r_  r  r   r  r<   _comparison  s     
	
  zBuiltinVariable._comparisonc                 C   sL   t |ttfrHt |ttfrHtj||jjdtjft||gi  d dS d S Nr   r|  )	r4   r/   r$   r   r   r   rQ   r`   r   ry   r   r   r   r;   r;   r<   	call_and_}  s      zBuiltinVariable.call_and_c                 C   sL   t |ttfrHt |ttfrHtj||jjdtjft||gi  d dS d S r  )	r4   r/   r$   r   r   r   rQ   ra   r   r  r;   r;   r<   call_or_  s      zBuiltinVariable.call_or_c                 C   s\   t |tr4tj||jjdtjft|gi  d dS t |trXt	t
|jdk| |S d S )Nr   r|  r   )r4   r/   r   r   r   rQ   rT   r   r)   r$   rG   r   r   r}  r;   r;   r<   	call_not_  s    
 

zBuiltinVariable.call_not_)N)N)N)Nr   r   __qualname__staticmethodr  	lru_cacherv   rz   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
  r  r  Zcall_minZcall_maxr  r  r  r  r%  Z	call_iterZ
call_tuple	call_listZcall_setr'  r*  r.  r/  r1  r6  r;  r=  r?  rA  rH  rI  rJ  rN  rP  rT  r#   rc  rm  rn  ro  rq  rx  ry  r{  r~  r  r  r  r  r  Zcall_eqZcall_gtZcall_ltZcall_geZcall_leZcall_neZcall_is_Zcall_is_not__classcell__r;   r;   r   r<   r2   8   s   :$# 8

	
  5
_

%

	
  g  3	
jr2   )Hr  r   r   loggingr6   rQ   rC  typingr   r   r   r   r   r[  r   r   Zallowed_functionsr	   r  r
   r   r   r   r   r   r   Zreplay_recordr   r"  r   r   r   r   utilsr   r   r   r   r   r   r   r   r   r   r   rF  r!   r"   r#   Zconstantr$   r%   Zdictsr&   r  r'   r(   r)   r*   r+   r,   r-   r  r.   r/   r0   Zuser_definedr1   	getLoggerr   r   r2   r;   r;   r;   r<   <module>   s0   4$	
