o
    h                     @   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{ fd*d+Zd,d- Zd.d/ Zd0d1 ZeZeZd2d3 Zd4d5 Zd6d7 Zd8d9 Z d|d:d;Z!e!Z"e!Z#e!Z$e!Z%ed<d= Z&d>d? Z'ed@dA Z(dBdC Z)dDdE Z*dFdG Z+dHdI Z,dJdK Z-dLdM Z.dNdO Z/dPdQ Z0dRdS Z1dTdU Z2dVdW Z3dXdY Z4d|dZd[Z5	d|d\e6d]e6fd^d_Z7d\e6d]e6d`e6fdadbZ8d\e6d]e6fdcddZ9d\e6fdedfZ:d\e6fdgdhZ;d\e6fdidjZ<dkdl Z=dmdn Z>dodp Z?dqdr Z@dsdt ZAdudv ZBdwdx ZCdydz ZDeAZEeAZFeAZGeAZHeAZIeAZJeAZKeAZL  ZMS )}BuiltinVariableNc                  C   s4  h 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j0tj1tj2tj3} | 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;   U/var/www/html/ai/venv/lib/python3.10/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   s   	
 !"#$%&'()*+,-./012346z(BuiltinVariable._constant_fold_functionsc                 C      | j |  v S r3   )fnrv   selfr;   r;   r<   can_constant_fold_throughu      z)BuiltinVariable.can_constant_fold_throughc                  C   s   h 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} | 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   s   	
!z#BuiltinVariable._fx_graph_functionsc                  C   s   t jg dt jft jg dt jft jg dt jft jg dt jft j	g dt j
ft jg dt jftg dt jft jg dt jft jg dt jft jg d	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   s0   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   s.   t |tr|| ||gi S || ||gi 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   s:   ddl m} || | jjd|gt||gi R  fi |S Nr    )wrap_fx_proxycall_function)builderr   outputcreate_proxyr   )r   r   r   r   rx   r   r;   r;   r<   dynamic_handler  s   z8BuiltinVariable._binop_handlers.<locals>.dynamic_handlerc                 S       t |jt||  fi |S r3   )r-   itemslistunpack_var_sequencer   r   r   r   r;   r;   r<   tuple_add_handler#      z:BuiltinVariable._binop_handlers.<locals>.tuple_add_handlerc                 S   r   r3   )r+   r   r   r   r   r;   r;   r<   size_add_handler&  r   z9BuiltinVariable._binop_handlers.<locals>.size_add_handlerc                 S   s    t t|| |j fi |S r3   )r-   r   r   r   r   r;   r;   r<   <lambda>;  s
    z1BuiltinVariable._binop_handlers.<locals>.<lambda>c                 S   s   t ||j|j fi |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 )N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 d|j|  t d|S )N)r   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 r3   r;   r   r   r;   r<   r   q      c                    r   r3   r;   r   r   r;   r<   r   u  r   )r2   r   r   appendr1   r#   r/   r+   r-   r$   r'   rQ   r[   extendr)   ri   rV   )op_handlersopmagic_method_namesin_place_opr   r   inplace_namer   r   r   r   r   list_like_addition_handlersr   list_like_iadd_handlerslist_like_expansion_handlersr;   r   r<   _binop_handlers   s   	















zBuiltinVariable._binop_handlersc                 C   sJ   t  }| |vr
d S ||  D ]\\}}}t||r"t||r"|  S qd S r3   )r2   r   r4   )r   r   r   handlerstype1type2handlerr;   r;   r<   _find_binop_handler|  s   z#BuiltinVariable._find_binop_handlerc                 C   rw   r3   )rx   r}   ry   r;   r;   r<   can_insert_in_graph  r|   z#BuiltinVariable.can_insert_in_graphc                    s   t  jdi | || _d S )Nr;   )super__init__rx   )rz   rx   kwargsr   r;   r<   r     s   
zBuiltinVariable.__init__c                 C   s,   | j d u rd}n| j j}| jj d| dS )NNone())rx   __name__r   )rz   namer;   r;   r<   __str__  s   
zBuiltinVariable.__str__c                 C   s
   t | jS r3   )r5   rx   ry   r;   r;   r<   python_type     
zBuiltinVariable.python_typec                 C   s   | j S r3   )rx   ry   r;   r;   r<   r     s   z"BuiltinVariable.as_python_constantc                    s4   t tj ttjttji}| j|v r|| j S t  S r3   )	rA   torchrF   int64rE   float64rx   r   as_proxy)rz   DTYPEr   r;   r<   r     s   


zBuiltinVariable.as_proxyc                 C   s>   | j j}| j jdksJ ||jjvsJ d|j|dddgS )Nbuiltinszshadowed globalFT)r[   )rx   r   
__module__r   	f_globalscreate_load_global)rz   codegenr   r;   r;   r<   reconstruct  s   zBuiltinVariable.reconstructc                 O   
   t ||S r3   )r   rz   argsr   r;   r;   r<   constant_args  r   zBuiltinVariable.constant_argsc                 O   s>   t dd t|| D ot dd t|| D  S )Nc                 s       | ]	}t |tjV  qd S r3   )r4   r   TensorVariabler9   ir;   r;   r<   r=     
    

z.BuiltinVariable.tensor_args.<locals>.<genexpr>c                 s   r   r3   )r4   r   GetAttrVariabler   r;   r;   r<   r=     r   )r@   	itertoolschainrs   r   r;   r;   r<   tensor_args  s   zBuiltinVariable.tensor_argsc                 O   r   r3   )r   r   r;   r;   r<   unspec_python_args  r   z"BuiltinVariable.unspec_python_argsc                 C   s   g }i }| D ]}t |tjfr||j q||  q|D ]\}}t |tjfr4|||ji q ||| i q ||fS r3   )r4   r   r0   r   	raw_valuer   rq   )r   r   unwrapped_argsunwrapped_kwargsr:   kvr;   r;   r<   unwrap_unspec_args_kwargs  s"   z)BuiltinVariable.unwrap_unspec_args_kwargsr   List[VariableTracker]r   Dict[str, VariableTracker]returnr#   c              
      sF  ddl m}m} t||}| j|i |}| j|i |}t| || }	| 	 o-|p-|}
t
|ttfs7J t
|ts>J | jtju rVt
|d tjsVd}t|||\}}|  r|r| jtju rtt
|d trtt
|d tjsz| j}| jtju rt
|d tjrtj|d |d g}}| jtju rt
|d trtj|d td|d g}}t||rtdd |D s|jjdt | jgt!||R  }|tj"||fi |	W S |jjd|gt!||R  }tdd |D r|t#||fi |	W S | j|i |r2| $||\}}| j|i |}td	d t%&|| D }|t'||f||d
|	W S t(dd |D rHtj)||d fi |	W S | jtj*u rat
|d tj'ra|d +||d< |||fi |	W S  t,y   t-d|  d| d|  Y nw | jt.t/fv rt
|d tr| jt.u rt0nt1}|d||jd||d 2 fi d|	}|S t3|dkrt3|dkrt45| j|d |d }|r|||d |d |	}|d ur|S t6| d| jj7 d }|r"zt89|j:|g|R i | W n t;y! } z|
st<=d|| d }W Y d }~nd }~ww |rYz||g|R i |}|d ur<|>|	W S W n t?yX } z|
sJ |@  W Y d }~nd }~ww |
rt|||\}}tj| A dd |D i dd |B D fi |	S | jtCu rt3|dkrt
|d trtDtEjFdtG H|||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       | ]}t |tV  qd S r3   r4   r.   r  r;   r;   r<   r=         c                 s   "    | ]}t |tjr|jV  qd S r3   r4   r   r0   need_unwrapr8   r;   r;   r<   r=   #      

)r   r	  c                 s   r  r3   r4   r/   r8   r;   r;   r<   r=   1  r  zpartial tensor op:  r   proxyr   call_z1incorrect arg count %s %s and no constant handlerc                 S      g | ]}|  qS r;   r   r8   r;   r;   r<   
<listcomp>x      z1BuiltinVariable.call_function.<locals>.<listcomp>c                 S   s   i | ]	\}}||  qS r;   r  )r9   r   r   r;   r;   r<   
<dictcomp>y      z1BuiltinVariable.call_function.<locals>.<dictcomp>zgCalling round() on symbolic value is not supported. You can use floor() to implement this functionalityr;   )Ir   r   r  r   r   r   r#   	propagaters   r{   r4   r   tupledictrx   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   convert_to_constantNotImplementedErrorr   rF   rE   r   r   r   rG   r2   r   getattrr   inspect	signaturebind	TypeErrorlogwarningadd_optionsr   remove_from_statsr   r   rM   r   r   STANDARD_LIBRARYr   r   )rz   r   r   r   r   r  r   r   r   r   has_constant_handlerrx   r  _args_kwargsr   r	  fn_outbinop_handlerresr   excresultr   r;   r<   r     s8  



 

"	
zBuiltinVariable.call_functionc                 G   sr   t |dkr|d |r|d |}| ||S t |dkr+| ||d |d S t |dkr7| ||S d S )Nr    r   r   )rG   r   r   _call_min_max_seq_call_min_max_binaryrz   r   r   r   r;   r;   r<   _call_min_max  s   zBuiltinVariable._call_min_maxc                 C   s:   t |dksJ t |dkr|d S tt| j||S Nr   r    )rG   	functoolsreducepartialr2  )rz   r   r   r;   r;   r<   r1    s   z!BuiltinVariable._call_min_max_seqc                 C   s  |  ||rt|tjs||}}t|tjsJ t|tr+ttj||gi }t|t	s5t|t	r]ddl
m} |t|f||jjd| jgt||gi R  dt| ||gS | rt|tjrrdd l}t|j}nttj}| jtu rd|ind|i}|||g|}n4t|tjrd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u rt|j!|	}
nt|j!|	}
tdd	 ||fD }tj"||
|S |S t|tj#r:t|tj#r:| jtu r0t#t|j$|j$S t#t|j$|j$S t|t	sFt|t	r^|jjd| jgt||gi R  }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   r  r3   r  )r9   valr;   r;   r<   r=     r  c                 s   r  r3   r  r8   r;   r;   r<   r=     r
  z unsupported min / max over args z, )(r   r4   r   r   r.   TorchVariabler   tensorr   r/   r   r  r5   r   r   rx   r   r#   r  is_python_constantr  numpyNumpyVariableclipclamprH   maximumrI   minimumr?   r@   from_tensor_variabler   r   r0   r$   valuer  r   rN   )rz   r   r   r   r  nprx   r   r0  raw_braw_resr	  r  r;   r;   r<   r2    s   






 z$BuiltinVariable._call_min_max_binaryc                 G   sT   | j | s
| j| rt||i \}}t|S | j| r(dd |D }t|S d S )Nc                 S   s   g | ]	}t t|qS r;   )r   r$   r   r  r;   r;   r<   r    r  z.BuiltinVariable.call_range.<locals>.<listcomp>)r   r   r   r   RangeVariable_dynamic_args)rz   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   r  r3   r  r8   r;   r;   r<   r=     r  z0BuiltinVariable._dynamic_args.<locals>.<genexpr>)r@   rs   r   r;   r;   r<   rJ    s   zBuiltinVariable._dynamic_argsc                 G   s
   t |S r3   )r   SliceVariable)rz   r   r   r;   r;   r<   
call_slice	  r   zBuiltinVariable.call_slicec                 O   sJ   ddl m} t| || }|||jjd| jgt||R  fi |S r   )	r   r   r#   r  rs   r   r   rx   r   )rz   r   r   r   r   r   r;   r;   r<   
_dyn_proxy  s   zBuiltinVariable._dyn_proxyc                 O   s
  | j |i |r| j|g|R i |S tj| j}|d u r2|tu r+||g t dS |g t dS ||rt	 }|j
r\t|j
s\t|trR||j
tj n
||j
tj |tu rr||t||t |d| |S |t||t |d| |S d S )Nr   )r   guards)rJ  rO  r   r'   cls_forrx   r*   r!   r   setsourcer   r4   r,   r[   
make_guardr   TUPLE_ITERATOR_LENLIST_LENGTHr   r   r%  )rz   r   objr   r   clsrQ  r;   r;   r<   _call_iter_tuple_list  sJ   

z%BuiltinVariable._call_iter_tuple_listc                    s>   |d u pt |tpt |tttfot fdd| D S )Nc                 3   s6    | ]}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)	functionsr]  r4   r   UserDefinedClassVariabler$   r%  )rz   r   r  r]  r;   r;   r<   call_callableZ  s   
zBuiltinVariable.call_callablec                 K   s   |d u s	t |trt|d ur|ni |t d|S t |tjr+|j|t d|S t |ttt	fr`| }|
| D ]}|
| d  }|
| d }|||i q;t||t d|S td)NrP  user_clsr   r   r    z!call_dict_helper with illegal arg)r4   r  r&   r!   r%  r   cloner)   r-   r(   r   r   rq   AssertionError)r   rb  r  r   r   r:   r   r   r;   r;   r<   call_dict_helperb  s<   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   )rz   rK  r   r   r;   r;   r<   	call_cast  s   zBuiltinVariable.call_castc                 O   s~   |s|s|  |td S |s$t|dkr$| ||d r$|  |t|d S |s3|r3tjt|tt dS td| d|  d S )Nr    r   ra  zdict(): r  )re  r  rG   r\  r   r&   r!   r   rz   r   r   r   r;   r;   r<   	call_dict  s   zBuiltinVariable.call_dictc                    s\   t | | tfdd|D r, fddtfdd|D  D }tj|fi  S d S )Nc                 3       | ]}|  V  qd S r3   r   r8   r[  r;   r<   r=     r  z+BuiltinVariable.call_zip.<locals>.<genexpr>c                    s"   g | ]}t jt|fi  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-   r3  r;   )r   r   r<   call_zip  s   
zBuiltinVariable.call_zipc                    s   t | | t|dkrd}nt|dksJ t|d tjs!J |d  }|d |rH fddt|d 	||D }tj
|fi  S d S )Nr    r   r   c                    s4   g | ]\}}t jt j|fi  |gfi  qS r;   )r   r-   r$   )r9   idxvarrl  r;   r<   r    s    z2BuiltinVariable.call_enumerate.<locals>.<listcomp>)r#   r  rG   r4   r   r$   r   r   	enumerater   r-   )rz   r   r   startr   r;   rl  r<   call_enumerate  s   
zBuiltinVariable.call_enumeratec                 O   s   |d  |d|dd  |S )Nr   __len__r    r   rg  r;   r;   r<   call_len  s   zBuiltinVariable.call_lenc                 O   s<   | j |i |rt|||\}}|d |d|dd  |S )Nr   __getitem__r    )r   r   r   rg  r;   r;   r<   call_getitem  s   zBuiltinVariable.call_getitemc                 C   s   |  }| }t|tjr|jd urt||S t|tjr2t|j	t
jr2td| d|  t|tjrId|jjv rIt|j||j	S zt||}W n ty]   ||u }Y nw t|S )Nz&isinstance called on UserDefinedClass r  __instancecheck__)r   r   r4   r   r   dtyper$   call_isinstanceUserDefinedObjectVariablerE  typesMemberDescriptorTyper   r   rr   rx  
issubclassr"  )rz   r   r  isinstance_typearg_typer:  r;   r;   r<   rz    s,   

zBuiltinVariable.call_isinstancec                 C   s8   |j d u s
|j d u rd nt|j |j d}tj|||dS )N)r5   baserT  )rT  r   r   SuperVariable)rz   r   r   r   rT  r;   r;   r<   
call_super  s
   zBuiltinVariable.call_superc                 C   sJ   t |tjr| \}}||| |S t |tjr#|jd | |S d S )Nr   )r4   r   r(   next_variablesr   r'   r   r%  )rz   r   r  r:  	next_iterr;   r;   r<   	call_next  s   zBuiltinVariable.call_nextc                 C   s*   |  r| }|||| ||S d S r3   )r=  r   call_hasattrr%  )rz   r   rX  attrr   r;   r;   r<   r    s   zBuiltinVariable.call_hasattrc                    s<   | r fdd|D }t||  |S d S )Nc                    s   g | ]
}  |gi qS r;   )r   r8   rx   r   r;   r<   r    r   z,BuiltinVariable.call_map.<locals>.<listcomp>)r   r   r   r-   r%  )rz   r   rx   seqr   r;   r  r<   call_map  s   
zBuiltinVariable.call_mapc              	   K   s   t |tjtjfr$tdd |jD r$|s$dd |jD }tt|S ||r[|	dtd
 }|r8J |||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$   rE  rF   rE   r8   r;   r;   r<   r=     s    
z+BuiltinVariable.call_sum.<locals>.<genexpr>c                 S   s   g | ]}|j qS r;   )rE  r8   r;   r;   r<   r    s    z,BuiltinVariable.call_sum.<locals>.<listcomp>rr  r   )r4   r   r)   r-   r?   r   r$   rP   r   popr   r   r2   r6  r7  r   rQ   r[   r%  )rz   r   r  r   new_listrr  r   r;   r;   r<   call_sum  s6   	


zBuiltinVariable.call_sumc                 C   s\   | |r,||}|d u r|d |dd  }}n|}|D ]}||||gi }q|S d S r5  )r   r   r   )rz   r   functioniterableinitializerr   rE  elementr;   r;   r<   call_reduce  s   

zBuiltinVariable.call_reducerX  name_varc                 C   s   ddl m}m}m}m}m}	 ddlm}
 t	| ||}|d }|
 }| s+td |jj|rHz|jj|||W S  tyG   Y nw |d urj| |||}||j |
 dv saJ |
 sj||S |jrxt|j|}||d< nd }t|tjr||||S t|tjr|dkr|r|jjD ]}|j|jkr|j j!}|
||||  S qtd	 d S td	 d S t|tjtj"tjtj#tj$frz|||j%|d
|W S  t&y   |||fi | Y S w t||r/t'|j(|}t)|r
||d< t*di |S t+|r||fi |S |,|r%||fi |S |
||||S t||t-frT|j(j.| }t/j0rJ|j12|j(|| |
||||S t3||	rn|dv rn|t'|j4|fi t	|S z|||j%|d
|W S  t&y   |||fi | Y S w )Nr    )r$   r   PythonModuleVariabler;  UserFunctionVariableVariableBuilderrQ  znon-const getattr() name)TFrT  gradztensor gradr  )r   r   r;   )5 r$   r   r  r;  r  r   r  r#   r  r   r=  r   r   side_effectsis_attribute_mutation	load_attrr%  KeyErrorr  rq   rQ  
add_guardsrT  r   r4   r   NNModuleVariablevar_getattrr   	graphargsr  exampler  NamedTupleVariabler_  r{  rc  r  r  rE  r   r   r	   
is_literalr   rr   r   replay_record_enabledexec_recorderrecord_module_accessr   rx   )rz   r   rX  r  defaultr$   r   r  r;  r  r  r   rQ  r   hasattr_varrT  graphargexample_valuememberr;   r;   r<   call_getattr  s   





zBuiltinVariable.call_getattrr:  c                 C   sj  ddl m} t|tj|fr||d||gi S |jj|r5|	 r5|jj
|| | || ||S t|tjrHtdt|jj  d S t|tjr|j sWtd|	 rt|tjrt| j|}z
||| }W n ty~   d }Y nw t|tjrt| j|}tjj|||jdd}	t|j d}
|	|u r|
t!j"j#ju r|S |$| d S d S )Nr    )PlacementVariable__setattr__z#setattr(UserDefinedObjectVariable) z?Can't inplace modify module params/buffers inside HigherOrderOpT)rT  	is_tensor)%distributedr  r4   r   DataClassVariabler   r   r  r  r=  
store_attrr   r%  r{  r   r5   rE  r  r  is_root_tracerr
   r   r   r   noder  AttributeErrorr   wrap_to_fake_tensor_and_recordrT  r  getattr_staticmodule_typer   nnModuleconvert_to_unspecialized)rz   r   rX  r  r:  r  assigning_fake_valgetattr_varexisting_attrexisting_fake_attrmod_setattrr;   r;   r<   call_setattr~  sN   


zBuiltinVariable.call_setattrc                 C   s   |  |||t S r3   )r  r   DeletedVariable)rz   r   rX  r  r;   r;   r<   call_delattr  s   zBuiltinVariable.call_delattrc                 C   s   ddl m} z| }W n ty   d }Y nw t|tjr&t|| |S |d ur;|j	r;||t
|j	|| |S ttjd)Nr    r  zJCan't call type() on generated custom object. Please use __class__ instead)r   r  r   r  r   r   r-   r2   r%  rT  r   r   r   ANTI_PATTERN)rz   r   rX  r  py_typer;   r;   r<   	call_type  s    zBuiltinVariable.call_typec                 C   s:   | |rtt||}tj|fi t| |S d S r3   )r   r   reversedr   r   r-   r#   r  )rz   r   rX  r   r;   r;   r<   call_reversed  s   

zBuiltinVariable.call_reversedc                    s   | rZt|tjs\tdd |D r^|dd  |dtd }t	|dks/J  rAt
| fdd|d	}nt
|d
d |d	}tj|fi t| |S d S d S d S )Nc                 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:   r  r   r;   r<   r     s    z-BuiltinVariable.call_sorted.<locals>.<lambda>)r  r  c                 S   s   |   S r3   r  r  r;   r;   r<   r     s    )r   r4   r   r   r?   r   r  r$   r   rG   sortedr)   r#   r  )rz   r   rX  r   r  r   r;   r  r<   call_sorted  s4   
zBuiltinVariable.call_sortedc                    sX   t  fdd|D r*g }|D ]
}||  qtj|fi tj| g|R  S d S )Nc                 3   ri  r3   rj  )r9   rX  r[  r;   r<   r=     r  z-BuiltinVariable.call_chain.<locals>.<genexpr>)r?   r   r   r   r-   r#   r  )rz   r   r   r   rX  r;   r[  r<   
call_chain  s   zBuiltinVariable.call_chainc                 G   st   | |r6tdd |D r8dd |D }||}ttj|g|R  }tj|fi tj	| |g|R  S d S d S )Nc                 s   r  r3   r  r8   r;   r;   r<   r=     s    
z.BuiltinVariable.call_islice.<locals>.<genexpr>c                 S   r  r;   r  r8   r;   r;   r<   r    r  z/BuiltinVariable.call_islice.<locals>.<listcomp>)
r   r?   r   r   r   islicer   r-   r#   r  )rz   r   r  r   
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sym_num)r4   r/   r  rQ   rS   r   rz   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   )rz   r   r   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 rd|	 v rdtrI|jjn trY|jjn  S t|r|	 vrr|  t|sz|   jjS t|tfrtt|fr||S t|rttks|  ||S ttrttks|   jjS t|rdd	lm} |
 vr|  |t|  S ttsttr|
 vr|  tj|  d
dS t r&t r& jjS t|r;t|r; jjS jdkrNtturN 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   r{  r  )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>r9  Nr  is_F) r  r'   r$   r  r   r{  r  listsr+   r<  r  r  rx   r?   rs   r4   r   r  r  r   r-   list_comparer5   r*   _underlying_itemsr   r  r   r/   r  rE  r   )rz   r   r  r  r'   r   r{  r  r+   r  r  r  r  r;   )r$   r  r  r   r  r<   _comparison  s    





zBuiltinVariable._comparisonc                 C   N   t |ttfr%t |ttfr%tj||jjdtjgt||gi R  d dS d S Nr   r  )	r4   r/   r$   r  r   r   rQ   r`   r   rz   r   r   r   r;   r;   r<   	call_and_}     zBuiltinVariable.call_and_c                 C   r  r  )	r4   r/   r$   r  r   r   rQ   ra   r   r  r;   r;   r<   call_or_  r  zBuiltinVariable.call_or_c                 C   s^   t |trtj||jjdtjgt|gi R  d dS t |tr-t	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_)r   r   r   r   r   r#   r3   )Nr   r   __qualname__staticmethodr6  	lru_cacherv   r{   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r4  r1  r2  call_mincall_maxrL  rJ  rN  rO  rZ  	call_iter
call_tuple	call_listcall_setr\  r`  re  rf  rh  rn  rs  ru  rw  rz  r  r  r  r  r  r  r#   r  r  r  r  r  r  r  r  r  r  r  r  r  r  call_eqcall_gtcall_ltcall_gecall_lecall_necall_is_call_is_not__classcell__r;   r;   r   r<   r2   8   s    :$# 8

	
 5
_

%

	

f
3	
jr2   )Hr6  r  r   loggingr6   rQ   r|  typingr   r   r   r   r   r  r   r   allowed_functionsr	   r/  r
   r   r   r   r   rQ  r   replay_recordr   rT  r   r   r   r   utilsr   r   r   r   r   r   r   r   r   r   r   r  r!   r"   r#   constantr$   r%   dictsr&   r  r'   r(   r)   r*   r+   r,   r-   r<  r.   r/   r0   user_definedr1   	getLoggerr   r#  r2   r;   r;   r;   r<   <module>   s2    4$	
