o
    I&i                     @   s8  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Zd dlm	Z	m
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mZ ddlmZmZmZ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$ ddl%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9m:Z: ddl;m<Z<m=Z=m>Z> ddl?m@Z@mAZAmBZBmCZCmDZDmEZE ddlFmGZGmHZHmIZI ddlJmKZK eLeMZNejOejPejQejRejSejTejUejVejWejXejYejZej[ej[ej\ej]ej^ej_ej`ejaejbejcejdejeejfejgiZhdd ZiG dd de5Zje jkdd ZldS )    N)defaultdictOrderedDict)DictList)	sym_floatsym_int   )configpolyfill	variables)AttributeMutationErrorunimplementedUnsupported	UserErrorUserErrorType)GuardBuilderinstall_guard)DummyModule)
AttrSourceGetItemSourceis_constant_source
TypeSource)build_checkpoint_variablecheck_constant_argscheck_numpy_ndarray_argscheck_unspec_python_argsextract_fake_example_valueget_fake_valueguard_if_dynis_utils_checkpointistypenumpy_operator_wrapperproxy_args_kwargstensortype_to_dtype   )MutableLocaltypestrVariableTracker)ConstantVariable)EventVariableStreamVariable)ConstDictVariableDefaultDictVariableSetVariable)BaseListVariableListIteratorVariableListVariableSizeVariableTupleIteratorVariableTupleVariable)FakeItemVariableSymNodeVariableUnspecializedPythonVariable)UserDefinedVariablec                    s&    fdd}t t|  d|  |_|S )zPCreate a BuiltinVariable.call_{name} method that inlines through polyfill.{name}c                    s   | t ||S N)Zinline_user_function_returnr   UserFunctionVariableselftxargskwargsfn JC:\wamp64\www\opt\env\Lib\site-packages\torch/_dynamo/variables/builtin.pycall_fnN   s   z$_polyfill_call_impl.<locals>.call_fncall_)getattrr
   __name__)namerC   rA   r?   rB   _polyfill_call_implK   s   
rH   c                       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 fd,d-Zd.d/ Zd0d1 Zd2d3 ZeZeZdd5d6Zd7d8 Zd9d: Z d;d< Z!d=d> Z"dd?d@Z#e#Z$e#Z%e#Z&e#Z'dAdB Z(dCdD Z)dEdF Z*edGdH Z+edIdJ Z,dKdL Z-dMdN Z.dOdP Z/dQdR Z0dSdT Z1dUdV Z2dWdX Z3dYdZ Z4d[d\ Z5d]d^ Z6d_d` Z7ddadbZ8	ddce9dde9fdedfZ:dce9dde9dge9fdhdiZ;dce9dde9fdjdkZ<dce9fdldmZ=dce9fdndoZ>dce9fdpdqZ?drds Z@dtdu ZAdvdw ZBdxdy ZCdzd{ ZDd|d} ZEd~d ZFdd ZGdd ZHeEZIeEZJeEZKeEZLeEZMeEZNeEZOeEZPeQdZReQdZS  ZTS )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 r8   )
isinstancetypemathsqrt.0xrA   rA   rB   	<genexpr>      " 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sumrK   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updaterL   __dict__valuesfnsrA   rA   rB   _constant_fold_functionsY   s   	
 !"#$%&'()*+,-./012346z(BuiltinVariable._constant_fold_functionsc                 C      | j |  v S r8   )r@   r   r;   rA   rA   rB   can_constant_fold_through      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t j t j!t j"t j#t j$t j%} | S r8   )&rf   rg   rh   ri   rj   r`   rk   rl   rm   rn   ro   rp   ltgtgeleneeqrq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   rA   rA   rB   _fx_graph_functions   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__)rf   rp   r~   rq   r   rk   ry   rn   r|   rm   r{   ro   r}   r`   rx   rs   r   rt   r   r   rA   rA   rB   _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 r8   )rJ   r7   call_method)r<   aboptionsforward_namereverse_namerA   rA   rB   user_defined_handler   s   
z=BuiltinVariable._binop_handlers.<locals>.user_defined_handlerc                 S   s   | | ||gi S r8   r   )r<   r   r   r   r   rA   rA   rB   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   r@   r   rA   rA   rB   dynamic_handler,  s   z8BuiltinVariable._binop_handlers.<locals>.dynamic_handlerc                 S       t |jt||  fi |S r8   )r3   itemslistunpack_var_sequencer<   r   r   r   rA   rA   rB   tuple_add_handlerI      z:BuiltinVariable._binop_handlers.<locals>.tuple_add_handlerc                 S   r   r8   )r1   r   r   r   r   rA   rA   rB   size_add_handlerL  r   z9BuiltinVariable._binop_handlers.<locals>.size_add_handlerc                 S   s    t t|| |j fi |S r8   )r3   r   r   r   r   rA   rA   rB   <lambda>a  s
    z1BuiltinVariable._binop_handlers.<locals>.<lambda>c                 S   s   t ||j|j fi |S r8   )rK   r   r   rA   rA   rB   r   g      c              	   S   s@   |j r|| s
d S | |tt|jt||  fi |S r8   )mutable_localhas_unpack_var_sequenceZreplace_allr0   r   r   r   r   rA   rA   rB   list_iadd_handlerl  s   z:BuiltinVariable._binop_handlers.<locals>.list_iadd_handlerc                 S   s"   |j d|j|  t d|S )N)r   r   rA   )	__class__r   as_python_constantr%   )r<   lstconstr   rA   rA   rB   expand_list_like  s   z9BuiltinVariable._binop_handlers.<locals>.expand_list_likec                        | |||S r8   rA   r   r   rA   rB   r         c                    r   r8   rA   r   r   rA   rB   r     r   )rI   r   r   appendr7   r'   r5   r1   r3   r(   r.   rf   rp   extendr0   r~   rk   )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_handlersrA   r   rB   _binop_handlers   s   	















zBuiltinVariable._binop_handlersc                 C   sJ   t  }| |vr
d S ||  D ]\\}}}t||r"t||r"|  S qd S r8   )rI   r   rJ   )r   r   r   handlersZtype1Ztype2handlerrA   rA   rB   _find_binop_handler  s   z#BuiltinVariable._find_binop_handlerc                 C   r   r8   )r@   r   r   rA   rA   rB   can_insert_in_graph  r   z#BuiltinVariable.can_insert_in_graphc                    s   t  jdi | || _d S )NrA   )super__init__r@   )r;   r@   r>   r   rA   rB   r     s   
zBuiltinVariable.__init__c                 C   s,   | j d u rd}n| j j}| jj d| dS )NNone())r@   rF   r   )r;   rG   rA   rA   rB   __str__  s   
zBuiltinVariable.__str__c                 C   s
   t | jS r8   )rK   r@   r   rA   rA   rB   python_type     
zBuiltinVariable.python_typec                 C   s   | j S r8   r?   r   rA   rA   rB   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 r8   )	rV   torchr[   Zint64rZ   Zfloat64r@   r   as_proxy)r;   ZDTYPEr   rA   rB   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)rp   )r@   rF   
__module__r<   	f_globalsZcreate_load_global)r;   ZcodegenrG   rA   rA   rB   reconstruct  s   zBuiltinVariable.reconstructc                 O   
   t ||S r8   )r   r;   r=   r>   rA   rA   rB   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 r8   )rJ   r   TensorVariablerO   irA   rA   rB   rQ     
    

z.BuiltinVariable.tensor_args.<locals>.<genexpr>c                 s   r   r8   )rJ   r   GetAttrVariabler   rA   rA   rB   rQ     r   )rU   	itertoolschainr   r   rA   rA   rB   tensor_args  s   zBuiltinVariable.tensor_argsc                 O   r   r8   )r   r   rA   rA   rB   unspec_python_args  r   z"BuiltinVariable.unspec_python_argsc                 C   s    dd | D dd |  D fS )Nc                 S      g | ]}|  qS rA   r   rN   rA   rA   rB   
<listcomp>      z=BuiltinVariable.unwrap_unspec_args_kwargs.<locals>.<listcomp>c                 S      i | ]	\}}||  qS rA   r   rO   kvrA   rA   rB   
<dictcomp>  s    z=BuiltinVariable.unwrap_unspec_args_kwargs.<locals>.<dictcomp>)r   )r=   r>   rA   rA   rB   unwrap_unspec_args_kwargs  s   z)BuiltinVariable.unwrap_unspec_args_kwargsr=   List[VariableTracker]r>   Dict[str, VariableTracker]returnr'   c              
      sx  ddl m} ddlm}m} dd |D }dd | D }t||}| j|i |}| j|i |}	| 	 o:|p:|	}
t
|ttfsDJ t
|tsKJ | jtju r[t
|d tjs[d	}|  ru|ru| jtju ryt
|d tryt
|d tjsuz| j}| jtv rt
|d tjrt| j |d |d g}}| jtju rt
|d trtj|d tjd|d g}}t||rtd
d |D s|jjdt| jgt ||R  }|tj!||W S |jjd|gt ||R  }tdd |D r|t"||W S | j|i |r-| #||\}}| j|i |}tdd t$%||& D }|t'||||dW S t(dd |D r?t||d W S | jtj)u rXt
|d tj'rX|d *||d< |||W S  t+yt   t,d|  d| d|  Y nw | jt-t.fv rt
|d ttjfrt
|d tjr|d /|dg i }n|d }| jt-u rt0nt1}|||jd||2 fi d}|S | jt3kr|rt
|d |rtjjt3|d jdS t4|dkrt4|dkrt56| j|d |d }|r|||d |d i }|d ur|S t7| d| jj8 d }|rGzt9:|j;|g|R i | W n t<yF } z|
s:t=>d|| d }W Y d }~nd }~ww |r{z||g|R i |}|d ur^|W S W n t?yz } z|
sl |@  W Y d }~nd }~ww |
rtj| A dd |D i dd | D S | jtBu rt4|dkrt
|d trtCtDjEdddtF G|||S )Nr$   )r9   )r   wrap_fx_proxy_clsc                 S   r   rA   Zrealize)rO   r  rA   rA   rB   r     r   z1BuiltinVariable.call_function.<locals>.<listcomp>c                 S   r  rA   r  r  rA   rA   rB   r        z1BuiltinVariable.call_function.<locals>.<dictcomp>r   Fc                 s   s    | ]
}t |tjkV  qd S r8   )rK   r   r   rO   argrA   rA   rB   rQ   "  s    
z0BuiltinVariable.call_function.<locals>.<genexpr>r   c                 s       | ]}t |tV  qd S r8   rJ   r4   r  rA   rA   rB   rQ   2      c                 s   "    | ]}t |tjr|jV  qd S r8   rJ   r   r6   need_unwraprN   rA   rA   rB   rQ   <      

)	raw_valuer  c                 s   r  r8   rJ   r5   rN   rA   rA   rB   rQ   I  r  zpartial tensor op:  itemr<   proxyvaluer   rD   z1incorrect arg count %s %s and no constant handlerc                 S   r   rA   r   rN   rA   rA   rB   r     r   c                 S   r  rA   r   r  rA   rA   rB   r    r  zgCalling round() on symbolic value is not supported. You can use floor() to implement this functionalityZdynamic_shape_roundZ	case_name)H r9   r   r   r
  r   r   r   r   r   rJ   r   tupledictr@   rf   rr   r   r   r   r+   IN_PLACE_DESUGARING_MAPr(   r5   r   selectcreater   rU   r   r   r!   r"   NumpyNdarrayVariabler4   r  r   r   r   r6   rT   rn   Zconvert_to_constantNotImplementedErrorr   r[   rZ   r   r   r   r   rc   r\   rI   r   rE   rF   inspect	signaturebind	TypeErrorlogwarningr   Zremove_from_statsr   rb   r   r   ZSTANDARD_LIBRARYr   r   )r;   r<   r=   r>   r9   r   r
  r   r   r   Zhas_constant_handlerr@   r  _args_kwargsr  r  r  Zfn_outZbinop_handlerresr   excresultr   rA   rB   r     s.  


	

	"
"	
zBuiltinVariable.call_functionc                    s>   | j tkr|dkrtj|tg|R i |S t ||||S )Nfromkeys)r@   r!  rI   call_custom_dict_fromkeysr   r   )r;   r<   rG   r=   r>   r   rA   rB   r     s   zBuiltinVariable.call_methodc                 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   )r\   r   r   _call_min_max_seq_call_min_max_binary)r;   r<   r=   r   rA   rA   rB   _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$   )r\   	functoolsreducepartialr6  )r;   r<   r   rA   rA   rB   r5    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	rSddl
m} |t|||jjd| jgt||gi R  dS | rt|tjrhdd l}t|j}nttj}| jtu rwd|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	st|t	r,|jjd| jgt||gi R  }t	!||d S d S )Nr$   r
  r   r  r   r^   r]   c                 s   s"    | ]}t |tjtjfV  qd S r8   )rJ   r   r6   r(   r   rA   rA   rB   rQ     s    
z7BuiltinVariable._call_min_max_binary.<locals>.<genexpr>c                 s   r  r8   r  )rO   valrA   rA   rB   rQ     r  c                 s   r  r8   r  rN   rA   rA   rB   rQ     r  )"r   rJ   r   r   r4   TorchVariabler   tensorr   r5   r   r
  rK   r   r   r@   r"   is_python_constantr%  numpyZNumpyVariableZclipclampr]   maximumr^   minimumrT   rU   Zfrom_tensor_variabler   r  r6   r$  )r;   r<   r   r   r
  npr@   r>   r2  Zraw_bZraw_resr  r  rA   rA   rB   r6    st   






z$BuiltinVariable._call_min_max_binaryr  c                 C   s*   t t||tdgi }||g i S )N__abs__)rI   rE   r   r(   r$  )r;   r<   r  Z
abs_methodrA   rA   rB   call_abs  s   zBuiltinVariable.call_absc                 G   sD   | j | s
| j| rt|S | j| r dd |D }t|S d S )Nc                 S   s   g | ]
}t jt|qS rA   )r   r(   r$  r   r  rA   rA   rB   r   &  s    z.BuiltinVariable.call_range.<locals>.<listcomp>)r   r   r   ZRangeVariable_dynamic_argsr;   r<   r=   rA   rA   rB   
call_range"  s   


zBuiltinVariable.call_rangec                 O   s(   t dd |D pt dd | D S )Nc                 s   r  r8   r  rN   rA   rA   rB   rQ   .  r  z0BuiltinVariable._dynamic_args.<locals>.<genexpr>)rU   r   r   rA   rA   rB   rH  -  s   zBuiltinVariable._dynamic_argsc                 G   s
   t |S r8   )r   ZSliceVariablerI  rA   rA   rB   
call_slice2  r   zBuiltinVariable.call_slicec                 O   s0   ddl m} |||jjd| jgt||R  S r   )r   r   r   r   r@   r"   )r;   r<   r=   r>   r   rA   rA   rB   
_dyn_proxy5  s   zBuiltinVariable._dyn_proxyc                 O   s  | j |i |r| j|g|R i |S t|tjr|S | jtkr$t}ntj	| j}|d u rA|tu r:|g t
 dS |g t
 dS ||r|jrft|jsft|tr]t|jtj n	t|jtj |tu rv|t||t
 dS |t||t
 dS d S )Nr   )rH  rL  rJ   r   IteratorVariabler@   setr-   r.   Zcls_forr%   r   sourcer   r2   r   Z
make_guardr   ZTUPLE_ITERATOR_LENZLIST_LENGTHr   r   )r;   r<   objr=   r>   clsrA   rA   rB   _call_iter_tuple_list?  sD   


z%BuiltinVariable._call_iter_tuple_listc                 C   s,   ddl m} t|tj|frtjdS d S )Nr$   )BaseUserFunctionVariableT)Z	functionsrT  rJ   r   UserDefinedClassVariabler(   r$  )r;   r<   r  rT  rA   rA   rB   call_callablep  s   
zBuiltinVariable.call_callablec                 O   s,   t |dkr
|d S td| d|  d S )Nr   r$   z$unsupported args to builtin cast(): r  )r\   r   )r;   _r=   r>   rA   rA   rB   	call_castx  s   zBuiltinVariable.call_castc                 O   s   t j|tg|R i |S r8   )rI   call_custom_dictr!  r:   rA   rA   rB   	call_dict~  s   zBuiltinVariable.call_dictc           	      O   s   |s]|si f}t |dksJ |d }t|tr t||t dS t|tjr.|j|t dS t|ttt	fr\| }|
| D ]}|
| \}}t|}|||i q>t||t dS n|sl|rltjt||t dS t|j d| d|  d S )Nr$   r   rM  )user_clsr   z(): r  )r\   rJ   r!  r+   r%   r   cloner0   r3   r/   r   get_keyr   r   rF   )	r<   r[  r=   r>   r  r   rP   r  r  rA   rA   rB   rY    s8   

z BuiltinVariable.call_custom_dictc                    s:  |t tthv s	J |r-|tu sJ t|dkr!t|dkr!d|v s#J g ||dR }t|dkr8ttdt|dkrHg |td R }t|dksPJ |\}}|turZt	nt
 t|t rm t |||t dS t|t	tttfr fdd|| D } t |||t dS t|j d	| d
|  d S )Nr$   r  r   z,fromkeys expected at least 1 argument, got 0r   rM  c                    s   g | ]}  |qS rA   )r]  rN   ZDictVariableTyperA   rB   r         z=BuiltinVariable.call_custom_dict_fromkeys.<locals>.<listcomp>z.fromkeys(): r  )r!  r   r   r\   popr   r*  r(   r$  r+   r,   rJ   r3  r%   r0   r3   r/   r   r   rF   )r<   r[  r=   r>   r  r  keysrA   r^  rB   r4    s<   $

	z)BuiltinVariable.call_custom_dict_fromkeysc                    s   |rt |dkrd|v sJ t fdd|D rL fdd|D |ddr>t dkr>tfd	dD s>ttd
dd t D }t|S d S )Nr$   strictc                 3       | ]}|  V  qd S r8   r   rN   r<   rA   rB   rQ     r  z+BuiltinVariable.call_zip.<locals>.<genexpr>c                    s   g | ]}|  qS rA   )r   r  re  rA   rB   r     r_  z,BuiltinVariable.call_zip.<locals>.<listcomp>Fr   c                 3   s$    | ]}t |t  d  kV  qdS )r   N)r\   )rO   u)unpackedrA   rB   rQ     rR   z3zip() has one argument of len differing from othersc                 S   s   g | ]	}t t|qS rA   )r   r3   r   )rO   r  rA   rA   rB   r     r  )r\   rT   r`  r   
ValueErrorzipr   r3   )r;   r<   r=   r>   r   rA   )r<   rg  rB   call_zip  s   
zBuiltinVariable.call_zipc                 G   s|   t |dkr	d}nt |dksJ t|d tjsJ |d  }|d |r<dd t|d ||D }t|S d S )Nr$   r   r   c                 S   s&   g | ]\}}t t j||gqS rA   )r   r3   r(   r$  )rO   idxvarrA   rA   rB   r     s    z2BuiltinVariable.call_enumerate.<locals>.<listcomp>)	r\   rJ   r   r(   r   r   	enumerater   r3   )r;   r<   r=   startr   rA   rA   rB   call_enumerate  s   
zBuiltinVariable.call_enumeratec                 O      |d  |d|dd  |S )Nr   __len__r$   r   r:   rA   rA   rB   call_len     zBuiltinVariable.call_lenc                 O   rp  )Nr   __getitem__r$   r   r:   rA   rA   rB   call_getitem  rs  zBuiltinVariable.call_getitemc                    s      }| }t tjr" jd ur" fdd}tj| |S t tjr9t j	t
jr9td  d|  t tjrQd|jjv rQtj|j| j	S zt||}W n tye   ||u }Y nw tj|S )Nc                    s6   fdd t |tu rt fdd|D S  |S )Nc                    s(   | t vrt  | S t |  } j|v S r8   )r#   
issubclassr   dtype)tyZdtypesr  rA   rB   
check_type  s   
zOBuiltinVariable.call_isinstance.<locals>._tensor_isinstance.<locals>.check_typec                 3   s    | ]} |V  qd S r8   rA   )rO   rx  rz  rA   rB   rQ         zNBuiltinVariable.call_isinstance.<locals>._tensor_isinstance.<locals>.<genexpr>)rK   r   rU   )Z
tensor_varZtensor_typery  r{  rB   _tensor_isinstance  s   z;BuiltinVariable.call_isinstance.<locals>._tensor_isinstancez&isinstance called on UserDefinedClass r  __instancecheck__)r   r   rJ   r   r   rw  r(   r$  UserDefinedObjectVariabler  typesMemberDescriptorTyper   r   r   r~  rv  r*  )r;   r<   r  Zisinstance_typeZarg_typer}  r=  rA   ry  rB   call_isinstance  s2   
zBuiltinVariable.call_isinstancec                 C   s    |  }|  }tt||S )z,Checks if first arg is subclass of right arg)r   r   r(   rv  )r;   r<   Zleft_tyZright_tyrA   rA   rB   call_issubclass  s   zBuiltinVariable.call_issubclassc                 C   s   t ||S r8   )r   ZSuperVariabler;   r<   r   r   rA   rA   rB   
call_super  s   zBuiltinVariable.call_superc                 C   s>   t |tjtjfr||\}}|S t |tjr|jd S d S )Nr   )rJ   r   r/   rN  Znext_variablesr.   r   )r;   r<   r  r=  Z	next_iterrA   rA   rB   	call_next!  s   
zBuiltinVariable.call_nextc                 C   s    |  r| }|||S d S r8   )r@  r   call_hasattr)r;   r<   rQ  attrrG   rA   rA   rB   r  *  s   zBuiltinVariable.call_hasattrc                    s2   | r fdd|D }t|S d S )Nc                    s   g | ]
}  |gi qS rA   )r   rN   r@   r<   rA   rB   r   1  r   z,BuiltinVariable.call_map.<locals>.<listcomp>)r   r   r   r3   )r;   r<   r@   seqr   rA   r  rB   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jt|S |	|rZ|
dtjd }|r:J |||d  }ttj|ttjt|tjdgi S d S )Nc                 s   s,    | ]}t |tjot |jttfV  qd S r8   )rJ   r   r(   r  r[   rZ   rN   rA   rA   rB   rQ   8  s    
z+BuiltinVariable.call_sum.<locals>.<genexpr>c                 S   s   g | ]}|j qS rA   r  rN   rA   rA   rB   r   ?  s    z,BuiltinVariable.call_sum.<locals>.<listcomp>rn  r   )rJ   r   r0   r3   rT   r   r(   r$  re   r   r`  r   r   rI   r9  r:  r   rf   rp   )r;   r<   r  r>   Znew_listrn  r   rA   rA   rB   call_sum4  s6   	


zBuiltinVariable.call_sumc                 C   s\   | |r,||}|d u r|d |dd  }}n|}|D ]}||||gi }q|S d S r8  )r   r   r   )r;   r<   functioniterableZinitializerr   r  elementrA   rA   rB   call_reduceQ  s   

zBuiltinVariable.call_reducerQ  name_varc                    s  ddl m} ddl m}m}m}m}	m}
m} ddlm	 m
 | }| s*td jj|rDz	jj||W S  tyC   Y nw |d ur]| ||}| dv sWJ | s]|S i }|jrmt|j||d< nd |d	krz4| }t|tr|j}d urfd
dt|D }n
 fdd|D }tj|fi |W S W n	 ty   Y nw t|tjr||S t|tjr$|dkr$rjj D ]G}|jj!kr|j"j#}|$ j%j&d j#}dd }|||r|d urdd |j'D }t(j)||j*d|j"_#nd |j"_#|j"j#  S qtd d S td d S t|tjtj+tjtj,tj-frSz||j.dW S  tyR   |||fi | Y S w t||	rtt/|j0|}|1|d urr|1||fi |S d S t||
rt/|j0|}t2|r|d< t3di |S |1|d ur|1||fi |S d ur|S   |S t||t4fr|j0j5| }t6j7rЈj89|j0|| |S t:||r|dv r|;t/|j<|S z||j.dW S  ty	   |||fi | Y S w )Nr   )trace_rulesr$   )r(   r   PythonModuleVariableTorchInGraphFunctionVariabler>  r9   SourcelessBuilderVariableBuilderznon-const getattr() name)TFrP  	__bases__c                    s$   g | ]\}} t ||qS rA   )r   )rO   r   r   )r  rP  r<   rA   rB   r     s    z0BuiltinVariable.call_getattr.<locals>.<listcomp>c                    s   g | ]}  |qS rA   rA   )rO   r   )r  r<   rA   rB   r     s    gradexample_valuec              
   S   sz   | d u s|d u r|| uS z| j |j krW dS |  | kr!W dS W dS  ty< } ztt| W Y d }~d S d }~ww )NTF)shapeZstrider*  r   rc   )oldnewterA   rA   rB   _grad_changed  s   z3BuiltinVariable.call_getattr.<locals>._grad_changedc                 S   s   g | ]}t |qS rA   )r[   rN   rA   rA   rB   r     s    )deviceztensor grad)rP  )rF   r   rA   )=r  r  r(   r   r  r  r>  r9   r   r  r  r   r@  r   r   side_effectsis_attribute_mutationZ	load_attrKeyErrorr  rP  r   rJ   rK   r  rm  r   r3   r&  NNModuleVariablevar_getattrr   Z	graphargsbaseZexampler  r   nodemetar  r   Zzerosr  ZNamedTupleVariablerU  r  r\  rE   r  lookupr   r   r   r   r	   Zreplay_record_enabledZexec_recorderZrecord_module_accessr    r$  r@   )r;   r<   rQ  r  defaultr  r(   r   r  r  r>  r9   rG   Zhasattr_varr   r  basesZ
tuple_argsZgraphargZold_gradZnew_gradr  Zgrad_shape_specializedmemberrA   )r  r  rP  r<   rB   call_getattr\  s    


#


zBuiltinVariable.call_getattrr=  c              	   C   s  ddl m} t|tjtj|fr||d||gi S |jj	|r|
 r| }t|tjrddlm} |dkr=td |dkrg }|jjD ]}	|	j|jkrT||	 qG|D ]	}	|jj|	 qWt|1 t  |||jjdtjjgt||gi R  }
W d    n1 sw   Y  W d    n1 sw   Y  d	d
 }|jd||
 fi  || jjd  |
S |jj||| |S t|tjrtdt |j!j"  d S t|tj#r?|j$ st%d|
 r8t|tjr8t&| j|}z
|'|| }W n t(y   d }Y nw t|tjr8t&| j|}t)*|j+d}||u r8|tj,j-j"u r8|S |.| d S t|tj/j0rf|j1rh|
 rjt|tj2rlt3|j4| |  t2d S d S d S d S d S )Nr$   )PlacementVariable__setattr__r   Zrequires_gradzmutating requires_grad can introduce a new leaf from non-leaf or vice versa in the middle of the graph, which aot_autograd does not currently know how to handle. datar   c                 S   s*   | j }|dkr|d }tjj| | | S r8  )_versionr   Z_CZ	_autogradZ_unsafe_set_version_counter)rP   versionrA   rA   rB   _lower_version_count_by_1(  s
   z?BuiltinVariable.call_setattr.<locals>._lower_version_count_by_1r  z#setattr(UserDefinedObjectVariable) z?Can't inplace modify module params/buffers inside HigherOrderOp)5distributedr  rJ   r   ZDataClassVariableZCustomizedDictVariabler   r   r  r  r@  r   r   r   r   r   Ztracked_fakesrP  r   removedynamo_disable_gradr   Zno_gradr   ZTensorset_r"   r   r  r  Z
store_attrr  rK   r  r  r  Zis_root_tracerr   r   r  AttributeErrorr'  getattr_staticmodule_typennModuleZconvert_to_unspecializeddictsZHFPretrainedConfigVariableZexportr(   setattrrQ  )r;   r<   rQ  r  r=  r  rG   r   	to_removetfr/  r  Zassigning_fake_valZgetattr_varZexisting_fake_attrZmod_setattrrA   rA   rB   call_setattr  s   
 

zBuiltinVariable.call_setattrc                 C   s   |  |||t S r8   )r  r   ZDeletedVariable)r;   r<   rQ  r  rA   rA   rB   call_delattrj  s   zBuiltinVariable.call_delattrc              
   C   sv   ddl m}m} z| }W n ty% } zttjt|ddd d }~ww |j	d u r1| ||S ||t
|j	|S )Nr$   r  Zunknown_python_typer  )r   r  r  r   r&  r   r   ZINVALID_INPUTrc   rP  r   )r;   r<   rQ  r  r  Zpy_typeerrorrA   rA   rB   	call_typem  s    
zBuiltinVariable.call_typec                 C   s*   | |rtt||}t|S d S r8   )r   r   reversedr   r   r3   )r;   r<   rQ  r   rA   rA   rB   call_reversed~  s   

zBuiltinVariable.call_reversedc                    s   | rSt|tjsUtdd |D rW|dd  |dtd	 }t
|dks0J  rBt| fdd|d	}nt|d
d |d	}t|S d S d S d S )Nc                 s       | ]}|  V  qd S r8   r@  rN   rA   rA   rB   rQ     r|  z.BuiltinVariable.call_sorted.<locals>.<genexpr>keyreverseFr   c                    s     | gi  S r8   )r   r   rP   r  r<   rA   rB   r     s    z-BuiltinVariable.call_sorted.<locals>.<lambda>)r  r  c                 S   s   |   S r8   r   r  rA   rA   rB   r     s    )r   rJ   r   r   rT   r   r`  r(   r$  r   r\   sortedr0   )r;   r<   rQ  r>   r  r   rA   r  rB   call_sorted  s4   


zBuiltinVariable.call_sortedc                    sB   t  fdd|D rg }|D ]
}||  qt|S d S )Nc                 3   rc  r8   rd  )rO   rQ  re  rA   rB   rQ     r  z-BuiltinVariable.call_chain.<locals>.<genexpr>)rT   r   r   r   r3   )r;   r<   r=   r   rQ  rA   re  rB   
call_chain  s   
zBuiltinVariable.call_chainc                 G   s\   | |r*tdd |D r,dd |D }||}ttj|g|R  }t|S d S d S )Nc                 s   r  r8   r  rN   rA   rA   rB   rQ     s    
z.BuiltinVariable.call_islice.<locals>.<genexpr>c                 S   r   rA   r   rN   rA   rA   rB   r     r   z/BuiltinVariable.call_islice.<locals>.<listcomp>)r   rT   r   r   r   islicer   r3   )r;   r<   r  r=   Z
const_argsr   rA   rA   rB   call_islice  s   

zBuiltinVariable.call_islicec                 C   s(   t |trtj|t| d dS d S )NZsym_num)rJ   r5   r$  rf   rh   r   r;   r<   r   rA   rA   rB   call_neg  s   
zBuiltinVariable.call_negc                 G   sT   t |dkr!t|d tjr!|d }|j|j}tjt	|S t
d|  d S )Nr   zcall_id with args )r\   rJ   r   r  r   get_submodule
module_keyr(   r$  idr   )r;   r<   r=   Znn_mod_variablero   rA   rA   rB   call_id  s
   zBuiltinVariable.call_idc                 C   s   t dt|  d S )Nzcopy.deepcopy )r   ra   )r;   r<   rP   rA   rA   rB   call_deepcopy  s   zBuiltinVariable.call_deepcopyc                    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 re|	 v retrI|jjn trY|jjn  S t|r|	 vrs|  t|s{|   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|st|rNdd	lm} tju rt|r tt  j!tt  j!kS |
 vr|  t|r<t|r<j"oj"d
ur<j"j"kr<z
t#$j"j" W n t%y;   |  Y nw t|rDn}|t|||S tt&sZtt&r{|
 vrd|  |j'd    fi }t&j||d
dS t|rt|r j(j(S tt)rtt)stt*rtt*rtj+u r j(j(S j,dkrttur̈ dS tt-rtt-r jj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  r9   )r1   )supported_const_comparison_opssupported_tensor_comparison_opsc                      s&   t dt  d dt  d S )Nzcomparison r  )r   r&   rA   )leftr   rightrA   rB   _unimplemented  s   &z3BuiltinVariable._comparison.<locals>._unimplementedc                 3   s    | ]
}t | fV  qd S r8   )rJ   rN   )r(   r  rA   rB   rQ     s
    
z.BuiltinVariable._comparison.<locals>.<genexpr>r<  Nr   r  is_F).r  r.   r(   r  r   r  r9   listsr1   r?  r  r  r@   rT   r   rJ   r   r  r  r   r$  r3   Zlist_comparerK   r-   Z_underlying_itemsr   r
  rf   r  r  r   r   r  sizer   Zbroadcast_shapesRuntimeErrorr5   r   r  r*   r)   r   rF   rI   )r;   r<   r  r  r.   r   r  r9   r1   r  r  r  r
  Z
tensor_clsr  rA   )r(   r  r  r   r  rB   _comparison  s    






zBuiltinVariable._comparisonc                 C   f   t |trt |trd S t |ttfr1t |ttfr1tj||jjdtjgt||gi R  d dS d S Nr   r  )	rJ   r(   r5   r$  r   r   rf   ru   r"   r  rA   rA   rB   	call_and_J     zBuiltinVariable.call_and_c                 C   r  r  )	rJ   r(   r5   r$  r   r   rf   rv   r"   r  rA   rA   rB   call_or_[  r  zBuiltinVariable.call_or_c                 C   sX   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   )rJ   r5   r$  r   r   rf   ri   r"   r0   r(   r\   r   r  rA   rA   rB   	call_not_l  s   


zBuiltinVariable.call_not_rT   rU   )r=   r  r>   r  r	  r'   )r  r'   r8   )UrF   r   __qualname__staticmethodr9  	lru_cacher   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r7  r5  r6  Zcall_minZcall_maxrG  rJ  rH  rK  rL  rS  Z	call_iterZ
call_tuple	call_listZcall_setrV  rX  rZ  rY  r4  rj  ro  rr  ru  r  r  r  r  r  r  r  r  r'   r  r  r  r  r  r  r  r  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_notrH   Zcall_allZcall_any__classcell__rA   rA   r   rB   rI   X   s    :*# 7

	
 @
U


,

$.	

 
{

 rI   c              	   c   sP    ddl m} t }|| d}z||  d V  W ||  d S ||  w )Nr$   )GradModeVariableF)r  r  r   Zis_grad_enabledr$  Zenterexit)r<   r  Z	org_valueZgmvrA   rA   rB   r    s   
r  )m
contextlibr9  r'  r   loggingrL   rf   r  collectionsr   r   typingr   r   r   r   r   r  r	   r
   r   r1  r   r   r   r   r   Zguardsr   r   Zreplay_recordr   rP  r   r   r   r   utilsr   r   r   r   r   r   r   r   r    r!   r"   r#   r  r%   r&   r'   Zconstantr(   Zctx_managerr)   r*   r  r+   r,   r-   r  r.   r/   r0   r1   r2   r3   r?  r4   r5   r6   Zuser_definedr7   	getLoggerrF   r+  r~   rp   r   rq   ry   rk   r{   rm   r|   rn   r}   ro   rz   r   rs   r   rt   rx   r`   r   ru   r   rv   r   rw   r"  rH   rI   contextmanagerr  rA   rA   rA   rB   <module>   sp    8 
            <