a
    d<                     @   s   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 ddl	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 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G dd deZdS )    N)DictList   )	variables)create_instruction)	skip_code)unimplemented)
AttrSourceGlobalWeakRefSource)global_key_nameistensor   )MutableLocalVariableTrackerConstantVariable)TensorVariablec                       s   e Zd Zd f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dd ZeedddZedd Zedd Z  ZS ) ConstDictVariableNc                    s@   t  jf d|i| | jt| d  || _|| _d S )Nrecursively_containsguards)	super__init__r   updater   	propagatevaluesitemsuser_cls)selfr   r   r   kwargs	__class__ f/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/torch/_dynamo/variables/dicts.pyr      s    zConstDictVariable.__init__c                 C   s   dd | j   D S )Nc                 S   s   i | ]\}}||  qS r!   )as_proxy.0kvr!   r!   r"   
<dictcomp>       z.ConstDictVariable.as_proxy.<locals>.<dictcomp>r   r   r!   r!   r"   r#      s    zConstDictVariable.as_proxyc                 C   s   dd | j   D S )Nc                 S   s   i | ]\}}||  qS r!   )as_python_constantr$   r!   r!   r"   r(      r)   z8ConstDictVariable.as_python_constant.<locals>.<dictcomp>r*   r+   r!   r!   r"   r,      s    z$ConstDictVariable.as_python_constantc                 C   s   | j S N)r   r+   r!   r!   r"   python_type    s    zConstDictVariable.python_typec                 C   sp   | j   D ]R\}}t|r>||jt|ddtddg n||| || j |  q
tdt| j gS )NT)addCALL_FUNCTIONr   	BUILD_MAP)	r   r   extend_outputZcreate_load_globalr   r   Zappend_outputcreate_load_constlen)r   codegenkeyvaluer!   r!   r"   reconstruct#   s    zConstDictVariable.reconstruct)argc                 C   s   | j t| | |S r-   )r   r   get_keyadd_options)r   r9   r!   r!   r"   getitem_const2   s    zConstDictVariable.getitem_constList[VariableTracker]Dict[str, VariableTracker]r   argsr   returnc                    s  ddl m}m  t| || | j}|dkr>| |d S |dkrx|sN|rRJ   fdd| D fi S |dkr|s|rJ  fd	d| D fi S |d
kr|s|rJ  t	| fi S |dkr| s| rJ |t
| jfi S |dkr|rt|d r| jr|sHt
|dksLJ t|d }t|rtt|| t|}|d ||< | j|d j}	|d jd ur|	|d j | | j||	fi S |dv r*|r*t|d r*t|d | jvr*t
|dkr*|d S |dkr|rt|d r| jrt|}|t|d }
| | j|d fi  |
S |dkr|rt|d tr| jrt|}||d j | j|d j}	| j|fd|	i}
| |
S |dv r`|r`t|d r`t|d | jv r`| jt|d  }
|
S |dkr|rt|d r|t|d | jv fi S t |||S d S )Nr   )r   TupleVariable__getitem__r   r   c                    s4   g | ],\}} t j|fi |gfi qS r!   r   _key_to_varr$   rB   optionstxr!   r"   
<listcomp>G   s   	z1ConstDictVariable.call_method.<locals>.<listcomp>keysc                    s    g | ]}t j|fi  qS r!   rD   r%   r&   rG   rH   r!   r"   rI   Z   s   r   __len____setitem__r   )popgetrO   r   r   )rP   __getattr____contains__) r   rB   r   r   r   r   r<   rJ   listr4   r   is_valid_keymutable_localr:   r   store_dict_keyr   collectionsOrderedDictr   unionr/   replace_allmodifedr;   rO   
isinstancer   r   call_method)r   rH   namer@   r   r   valr&   Znewvalnew_rec_containsresultr   rF   r"   r^   5   s    	







zConstDictVariable.call_methodc                 K   s   | j f ||d|S )z#a copy of self with different items)r   r   )clone)r   r   r   rG   r!   r!   r"   r\      s
    zConstDictVariable.modifedc                    s.   t | g | j} fdd| D }|S )Nc                    s    g | ]}t j|fi  qS r!   rD   rK   rL   r!   r"   rI      r)   z9ConstDictVariable.unpack_var_sequence.<locals>.<listcomp>)r   r   r   rJ   )r   rH   r`   rb   r!   rL   r"   unpack_var_sequence   s    z%ConstDictVariable.unpack_var_sequencec                 C   s&   t |tr|jd ur|jS | S d S r-   )r]   r   specialized_valuer,   )clsr9   r!   r!   r"   r:      s    zConstDictVariable.get_keyc                 C   s   |  pt|to|jd uS r-   )Zis_python_constantr]   r   re   )rf   r6   r!   r!   r"   rU      s    
zConstDictVariable.is_valid_keyc                 K   sL   ddl m} t|r*||tt||S t|s8J t|fi |S d S )Nr   )VariableBuilder)builderrg   r   r
   r   r   
is_literal)rf   rH   r6   rG   rg   r!   r!   r"   rE      s
    zConstDictVariable._key_to_var)N)__name__
__module____qualname__r   r#   r,   r.   r8   r   r<   r^   r\   rd   classmethodr:   rU   rE   __classcell__r!   r!   r   r"   r      s&    
r   c                       s4   e Zd Zd
 fdd	Zdddd fdd	Z  ZS )DefaultDictVariableNc                    s.   t  j||fi | |tju s$J || _d S r-   )r   r   rX   defaultdictdefault_factory)r   r   r   rq   r   r   r!   r"   r      s    zDefaultDictVariable.__init__r=   r>   r   r?   c                    sR  ddl m}m} t| || }|dkr<t|d }|| jv rR| 	|d S | j
d u rht| nt|r|t|| t| j}	| j
tu r|g t d}
nF| j
tu r|g t d}
n,| j
tu rti tt d}
ntd| j
  |
|	|< | j|
j}|
jd ur||
j || | j|	|fi | |
S nt ||||S d S )Nr   )ListVariablerB   rC   r   )rV   z#defaultdict with default_factory = )rS   rr   rB   r   r   r   r   r:   r   r<   rq   KeyErrorr   rW   r   rX   rY   rT   r   tupledictr   r   rZ   rV   r/   r[   r\   r   r^   )r   rH   r_   r@   r   rr   rB   rG   r&   new_valZdefault_varra   r   r!   r"   r^      sB    






zDefaultDictVariable.call_method)N)rj   rk   rl   r   r^   rn   r!   r!   r   r"   ro      s
   	ro   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  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   s2   ddl m}  | j D ]}t|rt|j qd S )Nr   ModelOutput)transformers.file_utilsry   __dict__r   callabler   __code__)ry   objr!   r!   r"   _patch_once  s    zDataClassVariable._patch_oncec                 C   s2   zddl m} t| |W S  ty,   Y dS 0 d S )Nr   rx   F)rz   ry   
issubclassImportError)rf   ry   r!   r!   r"   is_matching_cls(  s
    z!DataClassVariable.is_matching_clsc                 C   s   |  t|S r-   r   typerf   r~   r!   r!   r"   is_matching_object1  s    z$DataClassVariable.is_matching_objectc           
      C   s  t   t|jj dd t|D }t|j	|i |}|
  t|j t|ks`J t }|D ]^}|j| }	t|	tr|	||< ql| jrtj|	sJ t|	||< ql|	d u slJ d|	 qlt|dkrt||d  tjstd | ||fi |S )Nc                 S   s   g | ]
}|j qS r!   r_   r%   fr!   r!   r"   rI   :  r)   z,DataClassVariable.create.<locals>.<listcomp>zunexpected r   r   z&DataClassVariable iterator constructor)rw   r   r   r   r}   dataclassesfieldsinspect	signaturebindapply_defaultsset	argumentsrJ   rX   rY   r]   r   include_noner   r   ri   r4   r   r   )
rf   r   r@   r   rG   rJ   boundr   r6   r`   r!   r!   r"   create5  s$    


 zDataClassVariable.createc           
      C   s   t |}dd t|D }g }t }|D ]V}t||r,t||}|j|jt	|j
|d|}	|d usn| jrx|	||< q,||	 q,| ||fi t|| S )Nc                 S   s   g | ]
}|j qS r!   r   r   r!   r!   r"   rI   S  r)   z*DataClassVariable.wrap.<locals>.<listcomp>)rH   source)r   r   r   rX   rY   hasattrgetattrr    rH   r	   r   r   appendr   r   r   )
rf   rh   r~   r   rJ   Zexcludedr   r6   r`   varr!   r!   r"   wrapP  s(    


zDataClassVariable.wrapc                    s(   t  j||fi | | |s$J d S r-   )r   r   r   )r   r   r   rG   r   r!   r"   r   f  s    zDataClassVariable.__init__c                 C   s
   t  d S r-   )NotImplementedErrorr+   r!   r!   r"   r#   j  s    zDataClassVariable.as_proxyc                 C   sR   | || jg t| j }|D ]}|| j|  q&||tdt|gS )NCALL_FUNCTION_KW)	r2   Z_create_load_constr   rt   r   rJ   r3   r   r4   )r   r5   rJ   r6   r!   r!   r"   r8   m  s    zDataClassVariable.reconstructr=   r>   r   r?   c                    s   t | || }|dkrx|s*t|dks.J |d  }t|trT| j| |S | 	|dg i 	|d|||S n<|dkr|s|rJ t
jt| j fi |S |dkrd}t 	||||S )NrC   r   r   Zto_tuple__setattr__rN   )r   r   r   r4   r,   r]   strr   r;   r^   r   rB   rT   r   )r   rH   r_   r@   r   rG   indexr   r!   r"   r^   w  s$    
zDataClassVariable.call_methodr_   rA   c                    s   || j v r"| |dt|gi S | jsndd t| jD }||v rntj|| sZJ t|| 	| S t
 || d S )NrC   c                 S   s   i | ]}|j |jqS r!   )r_   defaultr   r!   r!   r"   r(     r)   z1DataClassVariable.var_getattr.<locals>.<dictcomp>)r   r^   r   r   r   r   r   r   ri   r;   r   var_getattr)r   rH   r_   defaultsr   r!   r"   r     s    
zDataClassVariable.var_getattr)rj   rk   rl   __doc__r   staticmethod	functools	lru_cacher   r   rm   r   r   r   r   r#   r8   r^   r   r   rn   r!   r!   r   r"   rw     s*   	



rw   c                       sH   e Zd ZdZedd Zedd Z fddZe	dd	d
dZ
  ZS )HFPretrainedConfigVariablez/
    Hack for HuggingFace PretrainedConfig
    c                 C   s2   zddl m} t| |W S  ty,   Y dS 0 d S )Nr   )PretrainedConfigF)Z transformers.configuration_utilsr   r   r   )rf   r   r!   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 i | || _| t|s*J d S r-   )r   r   r~   r   r   )r   r~   r   r   r!   r"   r     s    z#HFPretrainedConfigVariable.__init__r   r   c                 C   s   ddl m} |t| j|S )Nr   r   )rS   r   r   r~   )r   rH   r_   r   r!   r!   r"   r     s    z&HFPretrainedConfigVariable.var_getattr)rj   rk   rl   r   r   r   rm   r   r   r   r   rn   r!   r!   r   r"   r     s   

r   ) rX   r   r   r   typingr   r   rS   r   Zbytecode_transformationr   Z
eval_framer   excr   r   r	   r
   utilsr   r   baser   r   Zconstantr   Ztensorr   r   ro   rw   r   r!   r!   r!   r"   <module>   s&    K7 