o
    I&iy                     @   s  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mZm	Z	 d dl
Z
d dlZ
ddlmZ ddlmZmZ ddlmZ ddlmZ ddlmZmZmZ dd	lmZmZmZ dd
l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( G dd de$Z)G dd de)Z*G dd de$Z+de,fddZ-de,fddZ.de/ddfddZ0G dd de)Z1G d d! d!e)Z2e3dd"d# Z4G d$d% d%e$Z5G d&d' d'e$Z6dS )(    N)AnyDictListOptional   )	variables)create_call_functioncreate_instruction)	skip_code)unimplemented)GuardBuilderinstall_guardmake_dupe_guard)
AttrSourceGetItemSourceGlobalWeakRefSource)global_key_nameistensoristypeiter_contains   )MutableLocalVariableTrackerConstantVariableTensorVariablec                       s   e Zd Z fddZdd Zdd Zdd Zd	d
 ZdefddZ							d  fddZ
dd Zdd ZedefddZedd Zedd Z  ZS )!ConstDictVariablec                    s8   t  jdi | tdd |D rJ || _|| _d S )Nc                 s       | ]}t |tV  qd S N
isinstancer   .0x r%   HC:\wamp64\www\opt\env\Lib\site-packages\torch/_dynamo/variables/dicts.py	<genexpr>       z-ConstDictVariable.__init__.<locals>.<genexpr>r%   )super__init__anyitemsuser_cls)selfr,   r-   kwargs	__class__r%   r&   r*      s   
zConstDictVariable.__init__c                 C      dd | j   D S )Nc                 S      i | ]	\}}||  qS r%   as_proxyr#   kvr%   r%   r&   
<dictcomp>!       z.ConstDictVariable.as_proxy.<locals>.<dictcomp>r,   r.   r%   r%   r&   r5          zConstDictVariable.as_proxyc                 C   r2   )Nc                 S   r3   r%   as_python_constantr6   r%   r%   r&   r9   $   r:   z8ConstDictVariable.as_python_constant.<locals>.<dictcomp>r;   r<   r%   r%   r&   r?   #   r=   z$ConstDictVariable.as_python_constantc                 C   s   | j S r   )r-   r<   r%   r%   r&   python_type&      zConstDictVariable.python_typec                 C   s   | j tju r||td|dg | j D ]+}t|r5|	|j
t|ddd |tdd n|	|| || j|  q| j tju rZtdt| jdgtddS tdt| jdgS )	NTOrderedDict)addr   F	BUILD_MAPargr   )r-   collectionsrB   extend_outputcreate_load_python_modulecreate_load_attrr,   keysr   Zappend_outputZcreate_load_globalr   r   Zcreate_load_constr	   len)r.   codegenkeyr%   r%   r&   reconstruct)   s(   
zConstDictVariable.reconstructrF   c                 C   s   | j t| S r   )r,   r   get_keyr.   rF   r%   r%   r&   getitem_constF      zConstDictVariable.getitem_constargsList[VariableTracker]r/   Dict[str, VariableTracker]returnr   c                    s   ddl m}m}m}m  | j}|dkr"t|dksJ | |d S |dkr:|s*|r,J   fdd| D S |dkrT|sB|rDJ tfd	d|	 D t
 d
S |dkrf|s\|r^J  t| S |dkr{|sn|rpJ | j| j t
 dS |dkr|s|rJ |t| jS |dkr|rt|d r| jr|st|dksJ t|d }	t|	rt|	|	 t|}
|d |
|	< | | |
S |dv rt|dkr|st|d rt|d | jvr|d S |dkrt|dkr|st|d rt|d | jvr|d S |dkrA|rAt|d rA| jrAt|}
|
t|d }| | |
 |S |dkrut|dkrut|d tru| jrut|}
|
|d j |
| | |
}| |S |dkrt|dkrt|d | |fr| jrt|}
|d D ]}|\}	}t|	sJ ||
t|	< q|
| | |
}| |S |dv r|rt|d rt|d | jv r| jt|d  S |dkr|rt|d r|t|d | jv S t |||S )Nr   )r   ListIteratorVariableListVariableTupleVariable__getitem__r   r,   c                    s&   g | ]\}} t ||gd qS )r;   r   _key_to_varr6   rZ   txr%   r&   
<listcomp>_   s    
z1ConstDictVariable.call_method.<locals>.<listcomp>rK   c                       g | ]}t  |qS r%   r\   r#   r7   r_   r%   r&   r`   o   s    )r,   mutable_localvaluescopyrd   __len____setitem__r   )popgetrk   rj   update)rk   __getattr____contains__) r   rX   rY   rZ   r,   rL   rR   SetVariablerK   r   listre   modifedrf   creater   is_valid_keyrd   rP   r   store_global_weakrefr   dictreplace_allrj   r!   rl   unpack_var_sequencer)   call_method)r.   r_   namerT   r/   r   rX   rY   valr7   Znewvalresultr$   r8   r0   r^   r&   ry   I   s   








	


 zConstDictVariable.call_methodc                 K   s   | j dd|i|S )z#a copy of self with different itemsr,   Nr%   )clone)r.   r,   optionsr%   r%   r&   rr      s   zConstDictVariable.modifedc                    s    | j } fdd| D }|S )Nc                    ra   r%   r\   rb   rc   r%   r&   r`      s    z9ConstDictVariable.unpack_var_sequence.<locals>.<listcomp>)r,   rK   )r.   r_   r{   r|   r%   rc   r&   rx      s   z%ConstDictVariable.unpack_var_sequencec                 C   s"   t |tr|jd ur|jS | S r   )r!   r   specialized_valuer?   )clsrF   r%   r%   r&   rP      s   zConstDictVariable.get_keyc                 C   s4   |  pt|to|jd upt|to| tju S r   )is_python_constantr!   r   r   r   r@   torchZdtype)r   rN   r%   r%   r&   rt      s
   zConstDictVariable.is_valid_keyc                 K   sJ   ddl m} t|r||tt||S t|sJ tj|fi |S Nr   VariableBuilder)builderr   r   r   r   r   
is_literalrs   )r   r_   rN   r~   r   r%   r%   r&   r]      s
   zConstDictVariable._key_to_varrT   rU   r/   rV   rW   r   )__name__
__module____qualname__r*   r5   r?   r@   rO   r   rR   ry   rr   rx   classmethodrP   rt   r]   __classcell__r%   r%   r0   r&   r      s.     
r   c                       sP   e Zd Zd fdd	Z fddZedd Z				
			d fddZ  ZS )DefaultDictVariableNc                    s.   t  j||fi | |tju sJ || _d S r   )r)   r*   rG   defaultdictdefault_factory)r.   r,   r-   r   r/   r0   r%   r&   r*     s   
zDefaultDictVariable.__init__c                    s$   | j tttfvr| jsdS t  S NF)r   rq   tuplerv   r,   r)   r   r<   r0   r%   r&   r     s   
z&DefaultDictVariable.is_python_constantc                 C   s*   t | tjr| jtttfv S t | tjjS r   )	r!   r   ZBuiltinVariablefnrq   r   rv   Z	functionsZBaseUserFunctionVariablerE   r%   r%   r&   is_supported_arg  s   z$DefaultDictVariable.is_supported_argrT   rU   r/   rV   rW   r   c                    s   |dkrIt |d }|| jv r| |d S | jd u r!t| t|r-|t|| t	| j}| j
|g i }|||< || | | |S t ||||S )Nr[   r   )r   rP   r,   rR   r   KeyErrorr   ru   r   rv   call_functionrw   rr   r)   ry   )r.   r_   rz   rT   r/   r7   new_valZdefault_varr0   r%   r&   ry     s   



zDefaultDictVariable.call_methodr   r   )	r   r   r   r*   r   staticmethodr   ry   r   r%   r%   r0   r&   r     s    
r   c                       s   e Zd ZejG dd dZdee f fddZdd Z	dd	 Z
d
d Zdd Zedd Zdd Zdee deeef ddf fddZdefddZdd Zdd Z  ZS )rp   c                   @   s>   e Zd ZU eed< eed< defddZdede	fddZ
d	S )
zSetVariable.SetElementvtunderlying_valuerW   c                 C   
   t | jS r   )hashr   r<   r%   r%   r&   __hash__6     
zSetVariable.SetElement.__hash__otherc                 C   s6   t |tjsdS t | jtjr| j|ju S | j|jkS r   )r!   rp   
SetElementr   r   r   r   r.   r   r%   r%   r&   __eq__9  s
   zSetVariable.SetElement.__eq__N)r   r   r   r   __annotations__r   intr   objectboolr   r%   r%   r%   r&   r   1  s
   
 r   r,   c                    sJ   t  jdi | t|tsJ tdd |D sJ g | _| | d S )Nc                 s   r   r   r    r"   r%   r%   r&   r'   I  r(   z'SetVariable.__init__.<locals>.<genexpr>r%   )r)   r*   r!   rq   allr,   _add)r.   r,   r/   r0   r%   r&   r*   A  s
   zSetVariable.__init__c                 C   s   dd | j D S )Nc                 S      g | ]}|  qS r%   r4   r"   r%   r%   r&   r`   O      z(SetVariable.as_proxy.<locals>.<listcomp>r;   r<   r%   r%   r&   r5   N  rS   zSetVariable.as_proxyc                 C      t S r   )setr<   r%   r%   r&   r@   Q     zSetVariable.python_typec                 C   s6   | dd || j tdt| jdgtdd S )Nbuiltinsr   	BUILD_SETrE   r   T)Zload_import_fromZforeachr,   r	   rL   r   r.   rM   r%   r%   r&   rO   T  s   zSetVariable.reconstructc                 C   s   ddl m} ddlm} ddlm} t||sJ t||r5| jj	
d}|d u r/td t||S t|trAt||jS t||rNt|| S tdt| d d S )	Nr   )r   )MethodWrapperVariabler   Zexample_valuez:Cannot check Tensor object identity without its fake valuez
Sets with z NYI)baser   miscr   tensorr   r!   r5   nodemetark   r   rp   r   r   valuer?   type)r.   r   r   r   r   Zfake_tensorr%   r%   r&   _as_set_element\  s    


zSetVariable._as_set_elementc                 C   s6   t  }| jD ]}||vsJ d|| | q|S )Nz%Items modeling set invariant violated)r   r,   rC   r   )r.   underlying_itemsZcurrent_itemr%   r%   r&   _underlying_itemsq  s   

zSetVariable._underlying_itemsc                 C   s   | j }t|ttfr|}n|g}|D ]9}| |}||vr*|| | j|j q|D ]}t	|t	|krJt
|jj|jj}|rJt|jj| q,q| jS r   )r   r!   rq   r   r   rC   r,   appendr   r   r   sourcer   
make_guard)r.   itemr   Zitems_to_addZitem_to_addZset_elementeZalias_guardr%   r%   r&   r   {  s&   

zSetVariable._addrT   r/   rW   r   c                    s   |dkr&|r&| j r&|rJ |d }t| || j d}|| | td S |dkrH| j rH|r1J |r5J t| j}| }|| t| |S |dkrTtt	| jS |dkrot	|dks`J |rdJ t
| j|d |dd	S t ||||S )
NrC   r   rg   rj   rh   rn   r   T)Zcheck_tensor_identity)rd   rp   r   rw   r   rs   rq   r,   rj   rL   r   r)   ry   )r.   r_   rz   rT   r/   r   r|   r,   r0   r%   r&   ry     s4   


zSetVariable.call_methodrF   c                 C   s   t d)NzIllegal to getitem on a set)RuntimeErrorrQ   r%   r%   r&   rR     s   zSetVariable.getitem_constc                 C   s   |   dd | jD S )Nc                 S   r   r%   r>   r"   r%   r%   r&   r`     r   z2SetVariable.as_python_constant.<locals>.<listcomp>)r@   r,   r<   r%   r%   r&   r?     s   zSetVariable.as_python_constantc                 C   r   r   )rq   r,   )r.   r_   r%   r%   r&   rx     r   zSetVariable.unpack_var_sequence)r   r   r   dataclasses	dataclassr   r   r   r*   r5   r@   rO   r   propertyr   r   r   strry   rR   r?   rx   r   r%   r%   r0   r&   rp   0  s.    
	
&rp   rW   c                 C       t jd}|d uot| |jS )Nztransformers.file_utils)sysmodulesrk   
issubclassModelOutputr   modr%   r%   r&   _is_matching_transformers_cls     r   c                 C   r   )Nzdiffusers.utils)r   r   rk   r   
BaseOutputr   r%   r%   r&   _is_matching_diffusers_cls  r   r   rz   r   c              	   C   s   || j v st| j|rtdS t| jtr| jdu rtdS | jdu rL| jrLz|jj	
| j}tt| j|tj tt||W S  tyK   Y nw td| jj d| d| j d| j  dS )zXShared method between DataClassVariable and CustomizedDictVariable where items are attrsTNFzhasattr(z, z)  )r,   hasattrr-   r   r   rd   r   r   outputZroot_txZget_example_valuer   r   r   r   ZHASATTRr   r   r1   r   )r.   r_   rz   Zexampler%   r%   r&   _call_hasattr_customobj  s"   "r   c                       s   e Zd ZdZdZeeddd Zedd Z	e
dd	 Ze
d
d Ze
dd Z fddZdd Zdd Z						d fddZdeddf fddZeZ  ZS ) DataClassVariablez
    This is a bit of a hack to deal with
    transformers.file_utils.ModelOutput() from huggingface.

    ModelOutput causes trouble because it a a mix of a dataclass and a
    OrderedDict and it calls super() methods implemented in C.
    FNc                  C   s   zddl m}  | j D ]}t|rt|j qW n	 ty"   Y nw zddlm	} |j D ]}t|r:t|j q/W d S  tyG   Y d S w )Nr   )r   )r   )
Ztransformers.file_utilsr   __dict__re   callabler
   __code__ImportErrorZdiffusers.utilsr   )r   objr   r%   r%   r&   _patch_once  s(   

zDataClassVariable._patch_oncec                 C   s   t | pt| S r   )r   r   r   r%   r%   r&   is_matching_cls  s   z!DataClassVariable.is_matching_clsc                 C      |  t|S r   r   r   r   r   r%   r%   r&   is_matching_object     z$DataClassVariable.is_matching_objectc           
      C   s  t   t|jj dd t|D }t|j	|i |}|
  t|j t|ks0J i }|D ]0}|j| }	t|	trE|	||< q4| jrYtj|	sPJ tj|	||< q4|	d u sdJ d|	 q4t|dkryt||d  tjsytd | ||fi |S )Nc                 S      g | ]}|j qS r%   rz   r#   fr%   r%   r&   r`         z,DataClassVariable.create.<locals>.<listcomp>zunexpected r   r   z&DataClassVariable iterator constructor)r   r   r
   r*   r   r   fieldsinspect	signaturebindapply_defaultsr   	argumentsrK   r!   r   include_noner   r   r   rs   rL   r   r   )
r   r-   rT   r/   r~   rK   boundr,   rN   r{   r%   r%   r&   rs     s$   


 zDataClassVariable.createc           
      C   s   t |}dd t|D }g }i }|D ]+}t||r?t||}|j|jt|j|d|}	|d us5| j	r:|	||< q|
|	 q| ||S )Nc                 S   r   r%   r   r   r%   r%   r&   r`   *  r   z*DataClassVariable.wrap.<locals>.<listcomp>)r_   r   )r   r   r   r   getattrr1   r_   r   r   r   r   )
r   r   r   r-   rK   excludedr,   rN   r{   varr%   r%   r&   wrap'  s"   




zDataClassVariable.wrapc                    (   t  j||fi | | |sJ d S r   r)   r*   r   r.   r,   r-   r~   r0   r%   r&   r*   ;     zDataClassVariable.__init__c                 C      t  r   NotImplementedErrorr<   r%   r%   r&   r5   ?  rA   zDataClassVariable.as_proxyc                 C   L   | || jg t| j }|D ]	}|| j|  q|t||dS NTrH   Z_create_load_constr-   r   r,   rK   Zcreate_call_function_kwrL   r.   rM   rK   rN   r%   r%   r&   rO   B  
   zDataClassVariable.reconstructrT   rU   r/   rV   rW   r   c                    s   |dkr,|st |dksJ |d  }t|tr| j| S | |dg i |d||S |dkr@|s4|r6J tt| j	 S |dkrFd}t
 ||||S )Nr[   r   r   to_tuple__setattr__ri   )rL   r?   r!   r   r,   ry   r   rZ   rq   re   r)   )r.   r_   rz   rT   r/   indexr0   r%   r&   ry   I  s   

zDataClassVariable.call_methodrz   c                    s~   || j v r| |dtj|gi S | js6dd t| jD }||v r6tj	|| s.J tj|| S t
 || d S )Nr[   c                 S   s   i | ]}|j |jqS r%   )rz   defaultr   r%   r%   r&   r9   f  s    z1DataClassVariable.var_getattr.<locals>.<dictcomp>)r,   ry   r   r   rs   r   r   r   r-   r   r)   var_getattr)r.   r_   rz   defaultsr0   r%   r&   r  `  s   
zDataClassVariable.var_getattrr   )r   r   r   __doc__r   r   	functools	lru_cacher   r   r   r   rs   r   r*   r5   rO   ry   r   r  r   call_hasattrr   r%   r%   r0   r&   r     s4    	



r   c                       s   e Zd Zedd Zedd Zedd Zedd Z fd	d
Z	dd Z
dd Z						d fddZdeddf fddZeZ  ZS )CustomizedDictVariablec                 C   s8   t | tjr| jtjju rt| dsdS t| pt| S )N__post_init__T)r   rG   rB   r*   r   r   r   r   r%   r%   r&   r   p  s   
z&CustomizedDictVariable.is_matching_clsc                 C   r   r   r   r   r%   r%   r&   r   ~  r   z)CustomizedDictVariable.is_matching_objectc                 C   s,  dD ]!}t ||r#t||}t|sJ d| t |dr#t|j q|s+|s+i }n8t|rCt|j	|i |}|
  |j}n |sJt|}nt|dkr_t|d tr_|s_|d j}ntd i }	| D ]#}
||
 }t|try||	|
< qitj|rtj||	|
< qitd qi| |	|fi |S )N)r*   r  r  ri   zexpect callable attr r   r   r   z/custom dict init with args/kwargs unimplementedz5expect VariableTracker or ConstantVariable.is_literal)r   r   r   r
   r   r   is_dataclassr   r   r   r   r   rv   rL   r!   r   r,   r   rK   r   r   r   r   rs   )r   r-   rT   r/   r~   Z	attr_namer   	raw_itemsr   r,   rN   r{   r%   r%   r&   rs     s6   








zCustomizedDictVariable.createc                 C   r   r   r   )r   r   r   r%   r%   r&   r     s   zCustomizedDictVariable.wrapc                    r   r   r   r   r0   r%   r&   r*     r   zCustomizedDictVariable.__init__c                 C   r   r   r   r<   r%   r%   r&   r5     rA   zCustomizedDictVariable.as_proxyc                 C   r   r   r   r   r%   r%   r&   rO     r   z"CustomizedDictVariable.reconstructrT   rU   r/   rV   rW   r   c                    s   t | j|}| jd u rd nt| j|}t|dr)|jttjfv r)t	 
||||S |dv r>|tj||d| gt| |S td| d S )N__objclass__)r[   r   ri   r  )r   z.custom dict: call_method unimplemented name=%s)r   r-   r   r   r   r  rv   rG   rB   r)   ry   Zinline_user_function_returnr   ZUserFunctionVariablerq   r   )r.   r_   rz   rT   r/   r   r   r0   r%   r&   ry     s   z"CustomizedDictVariable.call_methodrz   c                    s6   || j v r| |dtj|gi S t || d S )Nr[   )r,   ry   r   r   rs   r)   r  r.   r_   rz   r0   r%   r&   r    s
   
z"CustomizedDictVariable.var_getattrr   )r   r   r   r   r   r   r   rs   r   r*   r5   rO   ry   r   r  r   r	  r   r%   r%   r0   r&   r
  o  s*    


'
r
  c                  C   s   dd l } dd }|| jj_d S )Nr   c                 S   s   t |dsdS | j|jkS )Nr   F)r   r   r   r%   r%   r&   !_dynamo_overriden_transformers_eq  s   
zJ_install_PretrainedConfig_patch.<locals>._dynamo_overriden_transformers_eq)transformersZconfiguration_utilsPretrainedConfigr   )r  r  r%   r%   r&   _install_PretrainedConfig_patch  s   r  c                       s\   e Zd ZdZedd Zedd Z fddZde	d	d
fddZ
de	d	d
fddZ  ZS )HFPretrainedConfigVariablez/
    Hack for HuggingFace PretrainedConfig
    c                 C   s.   t jd}|d uot| |j}|rt  |S )Nz transformers.configuration_utils)r   r   rk   r   r  r  )r   r   Zis_matchr%   r%   r&   r     s
   z*HFPretrainedConfigVariable.is_matching_clsc                 C   r   r   r   r   r%   r%   r&   r     r   z-HFPretrainedConfigVariable.is_matching_objectc                    s.   t  jdi | || _| t|sJ d S )Nr%   )r)   r*   r   r   r   )r.   r   r/   r0   r%   r&   r*     s   z#HFPretrainedConfigVariable.__init__rz   rW   r   c                 C   s   ddl m} |t| j|S )Nr   r   )ro   r   rs   r   r   )r.   r_   rz   r   r%   r%   r&   r    s   z&HFPretrainedConfigVariable.var_getattrc                 C   s   t jt| j|S r   )r   r   rs   r   r   r  r%   r%   r&   r	    r=   z'HFPretrainedConfigVariable.call_hasattr)r   r   r   r  r   r   r   r   r*   r   r  r	  r   r%   r%   r0   r&   r    s    
	
r  c                   @   s   e Zd ZdZdd Zedd Zdee de	e
ef fdd	Zd
efddZd
efddZ	dd
edee fddZd
efddZdS )PythonSysModulesVariablezSpecial case for sys.modules.

    Without this we will guard on the exact set of modules imported in the
    lifetime of the python program.
    c                 C   r   r   )rv   r<   r%   r%   r&   r@     r   z$PythonSysModulesVariable.python_typec                 C   s    | |td|dg d S )NTr   )rH   rI   r   rJ   r   r%   r%   r&   rO      s
   
z$PythonSysModulesVariable.reconstructrT   r/   c                 C   s   ddl m} |dkr| j|g|R i |S |dkr&| j|g|R i |S |dkr6| j|g|R i |S ||| jtj}|||||S )Nr   r   r[   rk   rn   )	r   r   call_getitemcall_getcall_containsr   r   r   ry   )r.   r_   rz   rT   r/   r   Z	real_dictr%   r%   r&   ry   )  s   z$PythonSysModulesVariable.call_methodrN   c                 C   s:   t |}|tjv }t| tjtj	|| d ||fS )N)rN   invert)
r   rP   r   r   r   r   r  partialr   ZDICT_CONTAINSr.   r_   rN   r7   has_keyr%   r%   r&   _contains_helper9  s   

z)PythonSysModulesVariable._contains_helperc                 C   s   |  ||\}}tj|dS )Nr   )r  r   rs   r  r%   r%   r&   r  C  s   z&PythonSysModulesVariable.call_containsNr  c                 C   sT   ddl m} | ||\}}|r||t| j|tj| S |d ur$|S tjd dS )Nr   r   r  )	r   r   r  r   r   r   r   r   rs   )r.   r_   rN   r  r   r7   r  r%   r%   r&   r  G  s   
z!PythonSysModulesVariable.call_getc                 C   s8   ddl m} | ||\}}||t| j|tj| S r   )r   r   r  r   r   r   r   )r.   r_   rN   r   r7   r  r%   r%   r&   r  Y  s   
z%PythonSysModulesVariable.call_getitemr   )r   r   r   r  r@   r   rO   r   r   r   r   ry   r  r  r   r  r  r%   r%   r%   r&   r    s&    




r  )7rG   r   r  r   r   typingr   r   r   r   r   Ztorch.fxro   r   Zbytecode_transformationr   r	   Z
eval_framer
   excr   Zguardsr   r   r   r   r   r   r   utilsr   r   r   r   r   r   r   Zconstantr   r   r   r   r   rp   r   r   r   r   r   r   r
  r  r  r  r  r%   r%   r%   r&   <module>   sB     j/  u
!