U
    zh                     @   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 d dl	m
Z
 ddlmZmZ ddl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 dd
l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 Z'G dd de$Z(G dd de(Z)G dd de(Z*G dd de$Z+G dd de+Z,G dd de+Z-e.dddZ/e.dd d!Z0e1d"d#d$d%Z2G d&d' d'e(Z3G d(d) d)e(Z4e5dd*d+ Z6G d,d- d-e$Z7G d.d/ d/e$Z8dS )0    N)DictListOptional)is_fake   )polyfill	variables)create_call_functioncreate_call_methodcreate_instructioncreate_load_method)	skip_code)unimplemented)GuardBuilderinstall_guard)
AttrSourceGetItemSource)	dict_keysdict_valuesistypespecialize_symnode   )MutableLocalVariableTrackerConstantVariablec                 C   s   t | tjr"|  jjdd k	S t | tjrBtdd | j	D S t | tj
tjtjtjtjjtjtjtjjtjtjtjtjtjtjfS d S )Nexample_valuec                 s   s   | ]}t |V  qd S N)is_hashable.0e r"   O/var/www/html/venv/lib/python3.8/site-packages/torch/_dynamo/variables/dicts.py	<genexpr>'   s     zis_hashable.<locals>.<genexpr>)
isinstancer   TensorVariableas_proxynodemetagetTupleVariableallitemsBuiltinVariableZSymNodeVariabler   ZEnumVariableZuser_definedZUserDefinedClassVariableUserFunctionVariableZSkipFunctionVariablemiscZNumpyVariableNNModuleVariableUnspecializedNNModuleVariableZMethodWrapperVariableZTorchInGraphFunctionVariableZTypingVariableZFunctoolsPartialVariablexr"   r"   r#   r       s,    r   c                       s   e Zd ZdhejZG dd dZefeeef d fddZdd Z	d	d
 Z
dd Zdd Zdd Zdd Zdd ZedddZdddd fddZdd Z  ZS ) ConstDictVariableuser_clsc                   @   sH   e Zd ZdZdd Zedd Zdd Zedd	 Z	d e
d
ddZdS )z"ConstDictVariable._HashableTrackeraB  
        Auxiliary opaque internal class that wraps a VariableTracker and makes it hashable
        This should not be seen or touched by anything outside of ConstDictVariable and its children
        Note that it's also fine to put VTs into dictionaries and sets, but doing so does not take into account aliasing
        c                 C   s2   t |}t|s(tdt| d|  || _d S )NzDict key of type z. Key: )r   r   r   typevt)selfr8   r"   r"   r#   __init__K   s    z+ConstDictVariable._HashableTracker.__init__c                    s   t | jtjr"| j jjd }n~t | jtjrRtj	 t
 fdd| jjD }nNt | jtjrh| jjS t | jtjr~| jjS t | jtjr| j S | j }|S )Nr   c                 3   s   | ]} |j V  qd S r   )underlying_valuer   Hashabler"   r#   r$   Z   s     zFConstDictVariable._HashableTracker.underlying_value.<locals>.<genexpr>)r%   r8   r   r&   r'   r(   r)   r+   r5   _HashableTrackertupler-   r1   moduler2   valuer/   Zget_functionas_python_constant)r9   r4   r"   r<   r#   r;   T   s    

z3ConstDictVariable._HashableTracker.underlying_valuec                 C   s
   t | jS r   )hashr;   r9   r"   r"   r#   __hash__e   s    z+ConstDictVariable._HashableTracker.__hash__c                    sl   t | t |krdS t| trPtj t| t|koNt fddt| |D S t| r`| |kS | |kS d S )NFc                 3   s   | ]\}}  ||V  qd S r   )_eq_impl)r    uvr<   r"   r#   r$   o   s    z>ConstDictVariable._HashableTracker._eq_impl.<locals>.<genexpr>)	r7   r%   r?   r5   r>   lenr,   zipr   )abr"   r<   r#   rF   h   s    
z+ConstDictVariable._HashableTracker._eq_impl)otherreturnc                 C   sN   t j}t||s&t|s&tt|t||r@|| j|jS || j|S r   )	r5   r>   r%   r   
is_literalAssertionErrorr7   rF   r;   )r9   rM   r=   r"   r"   r#   __eq__w   s    
z)ConstDictVariable._HashableTracker.__eq__N)__name__
__module____qualname____doc__r:   propertyr;   rE   staticmethodrF   boolrQ   r"   r"   r"   r#   r>   D   s   	

r>   r-   c                    s`   t  jf | tj t fdd| D s2t fddfdd| D | _|| _d S )Nc                 3   s*   | ]"\}}t |t fo t |tV  qd S r   )r%   r   r    r4   rH   r<   r"   r#   r$      s   z-ConstDictVariable.__init__.<locals>.<genexpr>c                    s   t |  r| S  | S r   )r%   keyr<   r"   r#   make_hashable   s    z1ConstDictVariable.__init__.<locals>.make_hashablec                    s   i | ]\}} ||qS r"   r"   rZ   )r]   r"   r#   
<dictcomp>   s      z.ConstDictVariable.__init__.<locals>.<dictcomp>)superr:   r5   r>   r,   r-   rP   r6   )r9   r-   r6   kwargs	__class__)r=   r]   r#   r:      s    zConstDictVariable.__init__c                 C   s   dd | j   D S )Nc                 S   s    i | ]\}}|j  | qS r"   r8   r'   r    krH   r"   r"   r#   r^      s      z.ConstDictVariable.as_proxy.<locals>.<dictcomp>rY   rD   r"   r"   r#   r'      s    zConstDictVariable.as_proxyc                 C   s"   dd dd | j D  d S )N{, c                 s   s*   | ]"\}}|j   d |  V  qdS )z: Nr8   
debug_reprrd   r"   r"   r#   r$      s    z/ConstDictVariable.debug_repr.<locals>.<genexpr>})joinr-   rD   r"   r"   r#   ri      s    
zConstDictVariable.debug_reprc                 C   s   dd | j   D S )Nc                 S   s    i | ]\}}|j  | qS r"   r8   rB   rd   r"   r"   r#   r^      s    z8ConstDictVariable.as_python_constant.<locals>.<dictcomp>rY   rD   r"   r"   r#   rB      s    z$ConstDictVariable.as_python_constantc                 C   s   dd | j   D S )Nc                 S   s   i | ]\}}|j  |qS r"   rl   rd   r"   r"   r#   r^      s      z=ConstDictVariable.keys_as_python_constant.<locals>.<dictcomp>rY   rD   r"   r"   r#   keys_as_python_constant   s    z)ConstDictVariable.keys_as_python_constantc                 C   s   | j S r   )r6   rD   r"   r"   r#   python_type   s    zConstDictVariable.python_typec                 C   s*   t |tsttj}t|o(||| jkS r   )r%   r   rP   r5   r>   r   r-   )r9   r8   r=   r"   r"   r#   __contains__   s    zConstDictVariable.__contains__c                 C   s   | j tjkr(||td|dg | j D ]\}}||j || q2| j tjkr|tdt	| jdft
dd n|tdt	| jd d S )NTOrderedDict	BUILD_MAPargr   F)r6   collectionsrp   extend_outputcreate_load_python_modulecreate_load_attrr-   r8   r   rI   r	   append_output)r9   codegenr\   rA   r"   r"   r#   reconstruct   s"    


zConstDictVariable.reconstructrr   c                 C   s.   t |}|| jkr$td|j  | j| S )Nzdict KeyError: )r5   r>   r-   r   rA   )r9   rs   r\   r"   r"   r#   getitem_const   s    

zConstDictVariable.getitem_constList[VariableTracker]Dict[str, VariableTracker]r   argsr`   rN   c           
         s  ddl m}m m}m}m tj|o0t|d }|dkrXt	|dksJt
| |d S |dkr|sh|rlt
| jr|jj| j  fdd| j D S |dkr| jr|jj| j  |s|rt
t| S |d	kr| j r|jj| j  |s
|rt
t| S |d
krF|s,|r0t
| j| j t dS |dkrp|s\|r`t
 t	| jS |dkr|r| jr|st	|dkst
|jj|  |d | j|d <  d S |dkr|r| jr|jj|  | j|d   d S |dkrZt	|dkrZ|d | krZt	|dkrN d S |d S nv|dkr|r| jr|jj|  | j|d S |dkr|jj|  | j   d S |dkrnt	|dkrnt|d t||frn| jrn|jj|  t|d tr |d }	n||t |d }	| j!|	j  fdd| D }| j!|  d S |dkr|d | kr| |d S |dkrt	|dkr |d | kS t" #||||S d S )Nr   )r.   r   ListIteratorVariableListVariabler+   r   __getitem__r-   c                    s   g | ]\}} |j |gqS r"   r8   rd   )r+   r"   r#   
<listcomp>   s     z1ConstDictVariable.call_method.<locals>.<listcomp>keysvaluescopy)r-   mutable_local__len____setitem__r   __delitem__)popr*   )r   r   r   clearupdatec                    s    i | ]\}}  ||qS r"   )createrd   )r   r=   r"   r#   r^   *  s     z1ConstDictVariable.call_method.<locals>.<dictcomp>)r*   __getattr__ro   )$ r.   r   r   r   r+   r5   r>   r   rI   rP   r{   sourceoutputZguard_on_key_orderaddnamer-   DictKeys
DictValuescloner   r   r   r   Zside_effectsZmutationr   r   r   r%   Zcall_custom_dictdictr   r_   call_method)
r9   txr   r   r`   r.   r   r   Zarg_hashableZdict_vtra   )r   r=   r+   r#   r      s    




&





zConstDictVariable.call_methodc                 C   s   dd | j  D S )Nc                 S   s   g | ]
}|j qS r"   r   r    r4   r"   r"   r#   r   7  s     z9ConstDictVariable.unpack_var_sequence.<locals>.<listcomp>)r-   r   r9   r   r"   r"   r#   unpack_var_sequence6  s    z%ConstDictVariable.unpack_var_sequence)rR   rS   rT   r   Z_nonvar_fieldsr>   r   r   r:   r'   ri   rB   rm   rn   ro   rz   r{   r   r   __classcell__r"   r"   ra   r#   r5   >   s,   ?
	
dr5   c                       sX   e Zd Zd fdd	Z fddZ fddZedd	 Zd
ddd fddZ  Z	S )DefaultDictVariableNc                    s*   t  j||f| |tjks t|| _d S r   )r_   r:   rt   defaultdictrP   default_factory)r9   r-   r6   r   r`   ra   r"   r#   r:   ;  s    zDefaultDictVariable.__init__c                    s$   | j tttfkr| jsdS t  S )NF)r   listr?   r   r-   r_   is_python_constantrD   ra   r"   r#   r   @  s    z&DefaultDictVariable.is_python_constantc                    s   d| j   dt   dS )Nzdefaultdict(rg   ))r   ri   r_   rD   ra   r"   r#   ri   G  s    zDefaultDictVariable.debug_reprc                 C   s.   t | tjr| jtttfkS t | tjjS d S r   )	r%   r   r.   fnr   r?   r   Z	functionsZBaseUserFunctionVariablerr   r"   r"   r#   is_supported_argL  s    z$DefaultDictVariable.is_supported_argr|   r}   r   r~   c                    s   |dkr|t |dkst|d | kr2| |d S | jd krLt|d  q| j|g i }t |d|d |f| |S nt ||||S d S )Nr   r   r   r   )rI   rP   r{   r   KeyErrorcall_functionr_   r   )r9   r   r   r   r`   Zdefault_varra   r"   r#   r   S  s    
  
 zDefaultDictVariable.call_method)N)
rR   rS   rT   r:   r   ri   rW   r   r   r   r"   r"   ra   r#   r   :  s   

r   c                       s   e Zd ZdZee d fddZdd Zedd Z	e
d	d
 Zdd Zdd Zdd Zdd Zee eeef dd fddZedddZ  ZS )SetVariablez-We model a sets as dictonary with None valuesrY   c                    s$   t |t }t j|f| d S r   )r   fromkeysr   _default_valuer_   r:   )r9   r-   r`   ra   r"   r#   r:   o  s    zSetVariable.__init__c                 C   s0   | j s
dS dddd | j  D  d S d S )Nzset()rf   ,c                 s   s   | ]}|j  V  qd S r   rh   r    re   r"   r"   r#   r$   {  s     z)SetVariable.debug_repr.<locals>.<genexpr>rj   )r-   rk   r   rD   r"   r"   r#   ri   w  s    zSetVariable.debug_reprc                 C   s   t | j S r   )setr-   r   rD   r"   r"   r#   	set_items}  s    zSetVariable.set_itemsc                   C   s
   t d S r   r   r   r"   r"   r"   r#   r     s    zSetVariable._default_valuec                 C   s   dd | j D S )Nc                 S   s   h | ]}|j  qS r"   rc   r   r"   r"   r#   	<setcomp>  s     z'SetVariable.as_proxy.<locals>.<setcomp>r   rD   r"   r"   r#   r'     s    zSetVariable.as_proxyc                 C   s   t S r   )r   rD   r"   r"   r#   rn     s    zSetVariable.python_typec                 C   s   dd | j D S )Nc                 S   s   h | ]}|j  qS r"   rl   r   r"   r"   r#   r     s     z1SetVariable.as_python_constant.<locals>.<setcomp>r   rD   r"   r"   r#   rB     s    zSetVariable.as_python_constantc                 C   s2   | dd | jD  |tdt| jd d S )Nc                 S   s   g | ]
}|j qS r"   r   r   r"   r"   r#   r     s     z+SetVariable.reconstruct.<locals>.<listcomp>	BUILD_SETrr   )foreachr   rx   r   rI   r9   ry   r"   r"   r#   rz     s    zSetVariable.reconstructr   r~   c           	         sL  ddl m}m} |dkrF|r tt|dks0td}|d t f}n|dkr|rVt|r^t| j j	}t
 |||f| |S |dkr|rtt|dkstttj|| |d gi S |dkr:t|dkr:t|d t||fr:| jr:t|d ||frt|d |}n|d }t
 |d|f|S t
 ||||S )	Nr   )r   r+   r   r   r   r   
isdisjointr   )r   r   r+   rP   rI   r   r   r   r   r8   r_   r   r   r/   r   Zset_isdisjointr   r%   r   r   )	r9   r   r   r   r`   r   r+   resultrs   ra   r"   r#   r     sR     
 
zSetVariable.call_methodrr   c                 C   s   t dd S )NzIllegal to getitem on a set)RuntimeError)r9   rs   r"   r"   r#   r{     s    zSetVariable.getitem_const)rR   rS   rT   rU   r   r   r:   ri   rV   r   rW   r   r'   rn   rB   rz   r   strr   r{   r   r"   r"   ra   r#   r   l  s"   


0r   c                       s   e Zd ZU dZdZee ed< ed fddZ	e
dd Ze
d	d
 Zdd Zdd Zed eedf dd fddZ  ZS )DictViewzu
    Models _PyDictViewObject

    This is an "abstract" class. Subclasses will override kv and the items method
    Nkv)dv_dictc                    s4   t  jf | | jdkstt|ts*t|| _d S )N)r   r   )r_   r:   r   rP   r%   r5   r   )r9   r   r`   ra   r"   r#   r:     s    zDictView.__init__c                 C   s   t | jj| j S r   )getattrr   r-   r   rD   r"   r"   r#   
view_items  s    zDictView.view_itemsc                 C   s   t d S r   NotImplementedErrorrD   r"   r"   r#   view_items_vt  s    zDictView.view_items_vtc                    s     fddfdd j D S )Nc                    s    j dkr| jS | S )Nr   )r   r8   r3   rD   r"   r#   unwrap  s    z,DictView.unpack_var_sequence.<locals>.unwrapc                    s   g | ]} |qS r"   r"   r   )r   r"   r#   r     s     z0DictView.unpack_var_sequence.<locals>.<listcomp>r   r   r"   )r9   r   r#   r     s    zDictView.unpack_var_sequencec                 C   s(   || j  |t| jftd d S )Nr   )r   ru   r   r   r
   r   r"   r"   r#   rz     s    
zDictView.reconstructr   r~   c                    s,   |dkr| j ||||S t ||||S )Nr   r   r   r_   r9   r   r   r   r`   ra   r"   r#   r     s    zDictView.call_method)rR   rS   rT   rU   r   r   r   __annotations__r5   r:   rV   r   r   r   rz   r   r   r   r   r"   r"   ra   r#   r     s   



r   c                       sV   e Zd ZdZedd Zedd Zdd Zed e	e
df dd	 fd
dZ  ZS )r   r   c                 C   s
   t | jS r   )r   r   rD   r"   r"   r#   r     s    zDictKeys.set_itemsc                 C   s   dd | j D S )Nc                 S   s   g | ]
}|j qS r"   r   r   r"   r"   r#   r     s     z*DictKeys.view_items_vt.<locals>.<listcomp>r   rD   r"   r"   r#   r     s    zDictKeys.view_items_vtc                 C   s   t S r   )r   rD   r"   r"   r#   rn     s    zDictKeys.python_typer   r~   c                    s,   |dkr| j ||||S t ||||S )Nro   r   r   ra   r"   r#   r   
  s    zDictKeys.call_method)rR   rS   rT   r   rV   r   r   rn   r   r   r   r   r   r"   r"   ra   r#   r     s   


r   c                   @   s$   e Zd ZdZedd Zdd ZdS )r   r   c                 C   s
   t | jS r   )r   r   rD   r"   r"   r#   r     s    zDictValues.view_items_vtc                 C   s   t S r   )r   rD   r"   r"   r#   rn     s    zDictValues.python_typeN)rR   rS   rT   r   rV   r   rn   r"   r"   r"   r#   r     s   
r   )rN   c                 C   s    t jd}|d k	ot| |jS )Nztransformers.file_utils)sysmodulesr*   
issubclassModelOutputclsmodr"   r"   r#   _is_matching_transformers_cls"  s    r   c                 C   s    t jd}|d k	ot| |jS )Nzdiffusers.utils)r   r   r*   r   
BaseOutputr   r"   r"   r#   _is_matching_diffusers_cls'  s    r   r   r   rN   c              	   C   s   || j kst| j|rtdS t| jtr<| jdkr<tdS | jdkr| jrz8|jj	
| j}tt| j|tj tt||W S  tk
r   Y nX td| jj d| d| j d| j  dS )zXShared method between DataClassVariable and CustomizedDictVariable where items are attrsTNFzhasattr(rg   z)  )r-   hasattrr6   r   r   r   r   r   r   Zroot_txZget_example_valuer   r   
make_guardr   ZHASATTRr   r   rb   rR   )r9   r   r   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ddd fddZedd 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   z2ddl m}  | j D ]}t|rt|j qW n tk
rF   Y nX z2ddlm	} |j D ]}t|r`t|j q`W n tk
r   Y nX d S )Nr   )r   )r   )
Ztransformers.file_utilsr   __dict__r   callabler   __code__ImportErrorZdiffusers.utilsr   )r   objr   r"   r"   r#   _patch_onceN  s    zDataClassVariable._patch_oncec                 C   s   t | pt| S r   )r   r   r   r"   r"   r#   is_matching_clsc  s    z!DataClassVariable.is_matching_clsc                 C   s   |  t|S r   r   r7   r   r   r"   r"   r#   is_matching_objectg  s    z$DataClassVariable.is_matching_objectc           
      C   s  t   t|jj dd t|D }t|j	||}|
  t|j t|ks\ti }|D ]j}|j| }	t|}t|	tr|	||< qd| jrtj|	sttj|	||< qd|	d ksdtd|	 qdt|dkrt||d  tjstd | ||f|S )Nc                 S   s   g | ]
}|j qS r"   r   r    fr"   r"   r#   r   p  s     z,DataClassVariable.create.<locals>.<listcomp>zunexpected r   r   z&DataClassVariable iterator constructor)r   r   r   r:   r   dataclassesfieldsinspect	signaturebindapply_defaultsr   	argumentsr   rP   r   r   r%   r   include_noner   rO   rI   r&   r   )
r   r6   r   r`   optionsr   boundr-   r\   valr"   r"   r#   r   k  s&    



 zDataClassVariable.createc           
      C   s   t |}dd t|D }g }i }|D ]`}t||r(t||}|j|jt|j|d|}	|d k	sj| j	r~t
|}|	||< q(||	 q(| ||S )Nc                 S   s   g | ]
}|j qS r"   r   r   r"   r"   r#   r     s     z*DataClassVariable.wrap.<locals>.<listcomp>)r   r   )r7   r   r   r   r   rb   r   r   r   r   r   r   append)
r   builderr   r6   r   excludedr-   r\   r   varr"   r"   r#   wrap  s$    

 


zDataClassVariable.wrapc                    s$   t  j||f| | |s td S r   r_   r:   r   rP   r9   r-   r6   r   ra   r"   r#   r:     s    zDataClassVariable.__init__c                 C   s   t d S r   r   rD   r"   r"   r#   r'     s    zDataClassVariable.as_proxyc                 C   sR   | || jg |  }||  t| }| |t	||d d S )NT)
ru   _create_load_constr6   rm   r   r   r?   r   create_call_function_kwrI   )r9   ry   dr   r"   r"   r#   rz     s
    zDataClassVariable.reconstructr|   r}   r   r~   c                    s   |dkrX|st |dkst|d }| tkr:| |S | |dg i |d||S n4|dkr|sh|rlttt| j	
 S |dkrd}t ||||S )Nr   r   r   to_tuple__setattr__r   )rI   rP   rn   r   r{   r   r   r+   r   r-   r   r_   )r9   r   r   r   r`   r   ra   r"   r#   r     s"    
   zDataClassVariable.call_methodr   c                    s~   t |}|| kr$| |d|gi S | jsldd t| jD }||krltj || s\t	tj || S t
 || d S )Nr   c                 S   s   i | ]}|j |jqS r"   )r   defaultr   r"   r"   r#   r^     s      z1DataClassVariable.var_getattr.<locals>.<dictcomp>)r   r   r   r   r   r   r6   r   rO   rP   r_   var_getattr)r9   r   r   name_vtdefaultsra   r"   r#   r     s    
zDataClassVariable.var_getattr)rR   rS   rT   rU   r   rW   	functools	lru_cacher   r   classmethodr   r   r   r:   r'   rz   r   r   r   r   call_hasattrr   r"   r"   ra   r#   r   B  s,   	



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ddd fddZedd fddZeZ  ZS )CustomizedDictVariablec                 C   s8   t | tjr(| jtjjkr(t| ds(dS t| p6t| S )N__post_init__T)r   rt   rp   r:   r   r   r   r   r"   r"   r#   r     s    
z&CustomizedDictVariable.is_matching_clsc                 C   s   |  t|S r   r   r   r"   r"   r#   r     s    z)CustomizedDictVariable.is_matching_objectc                    s@  dD ]B}t ||rt||}t|s2td| t |drt|j qt|rt	|j
||}|  dd  i }t|st|r|j D ].\}	}
t|
tr|
jd ks|
d krq|
||	< qn|j} fdd| D }nP|sdd | D }n8t|d	kr*t|d
 tr*|s*|d
 j}ntd | ||f|S )N)r:   r  r   r   zexpect callable attr r   c                 S   s.   t | tr| S t| r"t| S td d S )Nz5expect VariableTracker or ConstantVariable.is_literal)r%   r   r   rO   r   r   r3   r"   r"   r#   make_var  s    


z/CustomizedDictVariable.create.<locals>.make_varc                    s    i | ]\}}t | |qS r"   r   rd   r  r"   r#   r^   
  s     z1CustomizedDictVariable.create.<locals>.<dictcomp>c                 S   s   i | ]\}}t ||qS r"   r   rd   r"   r"   r#   r^     s      r   r   z/custom dict init with args/kwargs unimplemented)r   r   r   rP   r   r   r   is_dataclassr   r   r   r   r   r   r   r-   r%   r   rA   rI   r5   r   )r   r6   r   r`   r   	attr_namer   r   Z
bound_argsre   rH   r-   r"   r	  r#   r     s8    






$zCustomizedDictVariable.createc                 C   s   t d S r   r   )r   r   r   r"   r"   r#   r     s    zCustomizedDictVariable.wrapc                    s$   t  j||f| | |s td S r   r   r   ra   r"   r#   r:     s    zCustomizedDictVariable.__init__c                 C   s   t d S r   r   rD   r"   r"   r#   r'   !  s    zCustomizedDictVariable.as_proxyc                 C   s   t | jpt| j}|rN||jdddd ||d ||d ||| jg |rv|tdd | 	 }|
|  t| }||t||d d S )NZtorchT)r   Z_dynamodisabler   F)r   r6   r   rx   Zcreate_load_globalrw   ru   r   r	   rm   r   r   r?   r   r   rI   )r9   ry   Zis_hf_model_outputr   r   r"   r"   r#   rz   &  s     z"CustomizedDictVariable.reconstructr|   r}   r   r~   c                    s   t | j|}| jd krd n
t| j|}t|drR|jttjfkrRt	 
||||S |dkr||tj||d| gt| |S td| d S )N__objclass__)r   r   r   r   )r   z.custom dict: call_method unimplemented name=%s)r   r6   r   r   r   r  r   rt   rp   r_   r   Zinline_user_function_returnr   r/   r   r   )r9   r   r   r   r`   r   r   ra   r"   r#   r   C  s    z"CustomizedDictVariable.call_methodr   c                    s6   t |}|| kr$| |d|gi S t || d S )Nr   )r   r   r   r_   r   )r9   r   r   r   ra   r"   r#   r   ]  s    
z"CustomizedDictVariable.var_getattr)rR   rS   rT   rW   r   r  r   r   r   r:   r'   rz   r   r   r   r   r  r   r"   r"   ra   r#   r    s"   


3
!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   )r9   rM   r"   r"   r#   !_dynamo_overriden_transformers_eqm  s    
zJ_install_PretrainedConfig_patch.<locals>._dynamo_overriden_transformers_eq)transformersZconfiguration_utilsPretrainedConfigrQ   )r  r  r"   r"   r#   _install_PretrainedConfig_patchf  s    r  c                       sX   e Zd ZdZedd Zedd Z fddZe	dd	d
dZ
e	dd	ddZ  ZS )HFPretrainedConfigVariablez/
    Hack for HuggingFace PretrainedConfig
    c                 C   s.   t jd}|d k	ot| |j}|r*t  |S )Nz transformers.configuration_utils)r   r   r*   r   r  r  )r   r   Zis_matchr"   r"   r#   r   |  s
    z*HFPretrainedConfigVariable.is_matching_clsc                 C   s   |  t|S r   r   r   r"   r"   r#   r     s    z-HFPretrainedConfigVariable.is_matching_objectc                    s*   t  jf | || _| t|s&td S r   )r_   r:   r   r   r7   rP   )r9   r   r`   ra   r"   r#   r:     s    z#HFPretrainedConfigVariable.__init__r   r   c                 C   s   ddl m} |t| j|S )Nr   r   )r   r   r   r   r   )r9   r   r   r   r"   r"   r#   r     s    z&HFPretrainedConfigVariable.var_getattrc                 C   s   t jt| j|S r   )r   r   r   r   r   )r9   r   r   r"   r"   r#   r    s    z'HFPretrainedConfigVariable.call_hasattr)rR   rS   rT   rU   rW   r   r  r   r:   r   r   r  r   r"   r"   ra   r#   r  w  s   
	
r  c                   @   s|   e Zd ZdZdd Zdd Zee ee	ef dddZ
ed	d
dZed	ddZdeee dddZed	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   s   t S r   )r   rD   r"   r"   r#   rn     s    z$PythonSysModulesVariable.python_typec                 C   s    | |td|dg d S )NTr   )ru   rv   r   rw   r   r"   r"   r#   rz     s
    
z$PythonSysModulesVariable.reconstruct)r   r`   c                 C   sn   |dkr| j |f||S |dkr4| j|f||S |dkrN| j|f||S td| d| d| d d S )Nr   r*   ro   zsys.modules.z(*z, **r   )call_getitemcall_getcall_containsr   r   r"   r"   r#   r     s    z$PythonSysModulesVariable.call_methodr[   c                 C   s8   |  }|tjk}t| tjtj|| d ||fS )N)r\   invert)	rB   r   r   r   r   r  partialr   ZDICT_CONTAINSr9   r   r\   re   has_keyr"   r"   r#   _contains_helper  s    
z)PythonSysModulesVariable._contains_helperc                 C   s   |  ||\}}tj|dS )NrA   )r  r   r   r  r"   r"   r#   r    s    z&PythonSysModulesVariable.call_containsN)r\   r   c                 C   sT   ddl m} | ||\}}|r<||t| j|tj| S |d k	rH|S tjd dS )Nr   VariableBuilderr  )	r   r  r  r   r   r   r   r   r   )r9   r   r\   r   r  re   r  r"   r"   r#   r    s    
z!PythonSysModulesVariable.call_getc                 C   s8   ddl m} | ||\}}||t| j|tj| S )Nr   r  )r   r  r  r   r   r   r   )r9   r   r\   r  re   r  r"   r"   r#   r    s    
z%PythonSysModulesVariable.call_getitem)N)rR   rS   rT   rU   rn   rz   r   r   r   r   r   r  r  r   r  r  r"   r"   r"   r#   r    s   	 

  r  )9rt   r   r  r   r   typingr   r   r   Ztorch._subclasses.fake_tensorr   r   r   r   Zbytecode_transformationr	   r
   r   r   Z
eval_framer   excr   Zguardsr   r   r   r   r   utilsr   r   r   r   baser   r   Zconstantr   r   r5   r   r   r   r   r   rX   r   r   r   r   r   r  r  r  r  r  r"   r"   r"   r#   <module>   sD    }2[4  
!