a
    d#                     @   s   d dl Z d dlmZmZmZmZmZmZ ddlm	Z	 ddl
mZ ddlmZmZ ddlmZmZmZmZ G dd	 d	ZG d
d deZG dd dedZdd ZdS )    N)AnyCallableDictListOptionalSet   )	variablesunimplemented)
AttrSourceSource)dict_valuesidentityistypeodict_valuesc                   @   s    e Zd ZdZdd Zdd ZdS )MutableLocalz
    Marker used to indicate this (list, iter, etc) was constructed in
    local scope and can be mutated safely in analysis without leaking
    state.
    c                 C   s   t | S N)idself r   e/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/torch/_dynamo/variables/base.py__hash__   s    zMutableLocal.__hash__c                 C   s   | |u S r   r   )r   otherr   r   r   __eq__   s    zMutableLocal.__eq__N)__name__
__module____qualname____doc__r   r   r   r   r   r   r   
   s   r   c                   @   s   e Zd Zdd ZdS )HasPostInitc                 O   s,   t j| g|R i |}|j|i | |S r   )type__call____post_init__)clsargskwargsobjr   r   r   r"      s    zHasPostInit.__call__N)r   r   r   r"   r   r   r   r   r       s   r    c                       s|  e Zd ZdZdgZeeed   dddZdd Ze	dd	 Z
e	d
dd fed gd f dddZdd Zdd Zdd Zdd Z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ed(d)d*Zed d(d+d,Zd-d. Zd/d0 Zd1d2 Zd3d4 Z d5d6 Z!d7d8 Z"ed d(d9d:Z#d;d<d d=d>d?Z$d;d<d d=d@dAZ%dGe&e' e(e)e&e' dB fdCdDZ*dEdF Z+  Z,S )HVariableTrackerz
    Base class for tracked locals and stack values

    VariableTracker instances are immutable and should be copied in
    order to change them.
    valuevarsc                     s$   t    fdd|  d iS )zMCombine the guards from many VariableTracker into **kwargs for a new instancec                    sN   t | ttttfv r(| D ]}| qn"t| ts>J t|  | j	 d S r   )
r!   listtupler   r   
isinstancer(   typestrupdateguards)varir1   visitr   r   r5   0   s
    z(VariableTracker.propagate.<locals>.visitr1   )setr*   r   r4   r   	propagate+   s
    zVariableTracker.propagatec                 K   s$   t | j}|| | jf i |S )z)Shallow copy with some (optional) changes)dict__dict__r0   	__class__)r   r&   r%   r   r   r   clone=   s    

zVariableTracker.clonec                 C   s   |  t|S )z=Deeper (but not full) copy, leaving FX and user objects alone)applyr   )r$   r)   r   r   r   copyC   s    zVariableTracker.copyNc                 C   s   dS )NFr   )_r   r   r   <lambda>N       zVariableTracker.<lambda>)fnc           	         sV   du rt   t|}| v r* | d S t|tr|st |j}| D ]&}||jvrN||  ||< qN|jf i |}n|}nt	|t
r fdd|D }nt	|trt fdd|D }ndt	|tjrt fdd| D }n2t	|t rB fdd	t
| D }n|}||f |< |S )
z
        Walk this object and call fn on all the VariableTracker
        instances to produce a new VariableTracker with the results.
        Nr   c                    s   g | ]} | qS r   r<   .0vcacher$   rA   skip_fnr   r   
<listcomp>h   r@   z)VariableTracker.apply.<locals>.<listcomp>c                 3   s   | ]} | V  qd S r   rB   rC   rF   r   r   	<genexpr>j   r@   z(VariableTracker.apply.<locals>.<genexpr>c                 3   s   | ]} | V  qd S r   rB   rC   rF   r   r   rJ   l   s   c              	      s"   i | ]\}}| | qS r   rB   )rD   krE   rF   r   r   
<dictcomp>p   s   z)VariableTracker.apply.<locals>.<dictcomp>)r8   r   r.   r(   r9   keys_nonvar_fieldsr<   r;   r   r,   r-   collectionsOrderedDictitems)	r$   rA   r)   rG   rH   idxZupdated_dictkeyresultr   rF   r   r<   H   s<    








zVariableTracker.applyc                 C   s   | j t| j|hdS N)r1   )r;   r6   unionr1   )r   Zguardr   r   r   	add_guardz   s    zVariableTracker.add_guardc                 C   s0   |d u r| S t |tsJ | jt| j|dS rU   )r.   r6   r;   rV   r1   )r   r1   r   r   r   
add_guards}   s    zVariableTracker.add_guardsc                 G   sL   |r|  |j | S t|tr*| |jS t|ts8J | |dt S )Nr1   )add_optionsr.   r(   rX   r1   r8   getr6   )r   optionsZmorer   r   r   rY      s    
zVariableTracker.add_optionsc                 C   s   | j j dS )Nz())r:   r   r   r   r   r   __str__   s    zVariableTracker.__str__c                 C   s   t | S r   )strr   r   r   r   __repr__   s    zVariableTracker.__repr__c                 C   s   t |  dd S )Nz has no typeNotImplementedErrorr   r   r   r   python_type   s    zVariableTracker.python_typec                 C   s   t |  ddS )zFor constantsz is not a constantNr_   r   r   r   r   as_python_constant   s    z"VariableTracker.as_python_constantc                 C   s(   z|    W dS  ty"   Y dS 0 d S NTF)rb   r`   r   r   r   r   is_python_constant   s
    z"VariableTracker.is_python_constantc                 C   s   | S )z
        For specialized variables, return itself,
        For unspecialized variables, convert to constant variable and return.
        r   r   txr   r   r   as_specialized   s    zVariableTracker.as_specializedc                 C   s*   z|  d  W dS  ty$   Y dS 0 d S rc   )
make_guardr`   r   r   r   r   can_make_guard   s
    
zVariableTracker.can_make_guardc                 C   s   | j r| j |S t d S r   )sourcerh   r`   )r   rA   r   r   r   rh      s    zVariableTracker.make_guardc                    s<   j    fdd|pg D }|fdd|D  |S )Nc                    s   h | ]}|j  kr|qS r   name)rD   grk   r   r   	<setcomp>   r@   z1VariableTracker.replace_guards.<locals>.<setcomp>c                 3   s   | ]} j |V  qd S r   )rj   rh   )rD   rA   r   r   r   rJ      r@   z1VariableTracker.replace_guards.<locals>.<genexpr>)rj   rl   r0   )r   r1   fnsZ
new_guardsr   )rl   r   r   replace_guards   s    
zVariableTracker.replace_guards)rl   returnc                 C   s
   t  dS )z/getattr(self, name) returning a python constantNr_   r   rf   rl   r   r   r   const_getattr   s    zVariableTracker.const_getattrc                 C   sP   t | }| ||}tj|s(t | jr>t| j||d< tj|fi |S )z,getattr(self, name) returning a new variablerj   )	r(   r7   rs   r	   ConstantVariableZ
is_literalr`   rj   r   )r   rf   rl   r[   r)   r   r   r   var_getattr   s    
zVariableTracker.var_getattrc                 C   s(   z|    W dS  ty"   Y dS 0 d S rc   )as_proxyr`   r   r   r   r   is_proxy   s
    zVariableTracker.is_proxyc                 C   s   t t| d S r   )r`   r]   r   r   r   r   rv      s    zVariableTracker.as_proxyc                 C   s
   t  d S r   r_   )r   Zcodegenr   r   r   reconstruct   s    zVariableTracker.reconstructc                 C   s
   t  d S r   r_   re   r   r   r   unpack_var_sequence   s    z#VariableTracker.unpack_var_sequencec                 C   s*   z|  | W dS  ty$   Y dS 0 d S rc   )ry   r`   re   r   r   r   has_unpack_var_sequence   s
    
z'VariableTracker.has_unpack_var_sequencec                 C   s   t d|   d S )Nznum_parameters: r
   r   r   r   r   num_parameters   s    zVariableTracker.num_parametersc                 C   s   t dt|   d S )Nz	hasattr: )r   reprrr   r   r   r   call_hasattr   s    zVariableTracker.call_hasattrzList[VariableTracker]zDict[str, VariableTracker])r%   r&   rq   c                 C   s   t d|  d| d|  d S )Nzcall_function  r
   )r   rf   r%   r&   r   r   r   call_function   s    zVariableTracker.call_functionc              	   C   s   |dkr@|  |r@|s|rJ tjt| |fi t| S |dkrt|dkr|d  r|s| ||d 	 
| |d S td|  d| d| d| d S )N__len____getattr__   r   zcall_method r~   )rz   r	   rt   lenry   r(   r7   rd   ru   rb   rY   r   )r   rf   rl   r%   r&   r   r   r   call_method   s&    

zVariableTracker.call_method)r1   rj   mutable_localrecursively_containsc                    s,   t    |pt | _|| _|| _|| _d S r   )super__init__r6   r1   rj   r   r   )r   r1   rj   r   r   r:   r   r   r      s    
zVariableTracker.__init__c                    sH    j d u r6t  _  fdd}tj|  fddd d  j vsDJ d S )Nc                    s*    j | j  | jd ur& j | j | S r   )r   r0   r   addr2   r   r   r   aggregate_mutables  s    
z9VariableTracker.__post_init__.<locals>.aggregate_mutablesc                    s   |  uS r   r   r   r   r   r   r?     r@   z/VariableTracker.__post_init__.<locals>.<lambda>)rH   )r   r6   r(   r<   )r   r%   r&   r   r   r   r   r#     s    
zVariableTracker.__post_init__)NNNN)-r   r   r   r   rN   staticmethodr   r7   r;   classmethodr=   r   r<   rW   rX   rY   r\   r^   ra   rb   rd   rg   ri   rh   rp   r]   r   rs   ru   rw   rv   rx   ry   rz   r{   r}   r   r   r   r   r   r   r   r#   __classcell__r   r   r   r   r(       sh   
1
	    r(   )	metaclassc                  G   sD   t | dkr0| \}t|tr$t|S t|jS ndtt| S d S )Nr   r~   )	r   r.   r(   r]   r!   r   joinmapr/   )objsr'   r   r   r   r/      s    
r/   )rO   typingr   r   r   r   r   r    r	   excr   rj   r   r   utilsr   r   r   r   r   r!   r    r(   r/   r   r   r   r   <module>   s      