U
    9%ed/                     @   s   d dl Z d dlm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 ddlmZmZ dd	lmZmZmZmZ G d
d deZG dd dZG dd deZdd ZedddZG dd deZG dd dedZdd ZdS )    N)Enum)AnyCallableDictListOptionalSet   )	variables)current_scope_idunimplemented)
AttrSourceSource)dict_valuesidentityistypeodict_valuesc                   @   s   e Zd ZdZdZdZdS )MutableLocalSourcez
    If the VariableTracker.mutable_local represents a Variable that:
    - already existed that Dynamo began tracking while introspection (Existing)
    - is a new variable that is created during Dynamo introspection (Local)
    r      N)__name__
__module____qualname____doc__ExistingLocal r   r   [/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torch/_dynamo/variables/base.pyr      s   r   c                   @   s   e Zd ZdZedddZdS )MutableLocalBasez/
    Base class for Variable.mutable_local
    )typc                 C   s8   |t jkrd| _n"|t jkr&t | _ntd|  d S )Nr   z Unsupported MutableLocalSource: )r   r   scoper   r   r   )selfr   r   r   r   __init__   s
    


zMutableLocalBase.__init__N)r   r   r   r   r   r"   r   r   r   r   r      s   r   c                       s0   e Zd ZdZ fddZdd Zdd Z  Z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                    s   t  tj d S N)superr"   r   r   r!   	__class__r   r   r"   C   s    zMutableLocal.__init__c                 C   s   t | S r$   )idr&   r   r   r   __hash__F   s    zMutableLocal.__hash__c                 C   s   | |kS r$   r   )r!   otherr   r   r   __eq__I   s    zMutableLocal.__eq__)r   r   r   r   r"   r*   r,   __classcell__r   r   r'   r   r#   <   s   r#   c                 C   s   | dkS )Nr   r   )scope_idr   r   r   _is_top_level_scopeM   s    r/   )mc                 C   s   t  }t|rdS | j|kS )NT)r   r/   r    )r0   r.   r   r   r   is_side_effect_safeQ   s    r1   c                   @   s   e Zd Zdd ZdS )HasPostInitc                 O   s"   t j| f||}|j|| |S r$   )type__call____post_init__)clsargskwargsobjr   r   r   r4   _   s    zHasPostInit.__call__N)r   r   r   r4   r   r   r   r   r2   ^   s   r2   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 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d0d1 Zd2d3 Zd4d5 Z d6d7 Z!d8d9 Z"ed d)d:d;Z#d<d=d d>d?d@Z$d<d=d d>dAdBZ%dLe&e' e(e)e&e' dC fdDdEZ*dFdG Z+dHdI Z,dJdK Z-  Z.S )M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kr(| D ]}| qn"t| ts>tt|  	| j
 d S r$   )r3   listtupler   r   
isinstancer:   AssertionErrortypestrupdateguards)varirD   visitr   r   rH   u   s
    z(VariableTracker.propagate.<locals>.visitrD   )setr<   r   rG   r   	propagatep   s     zVariableTracker.propagatec                 K   s    t | j}|| | jf |S )z)Shallow copy with some (optional) changes)dict__dict__rC   r(   )r!   r8   r7   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   )r6   r;   r   r   r   copy   s    zVariableTracker.copyNc                 C   s   dS )NFr   )_r   r   r   <lambda>       zVariableTracker.<lambda>F)fnc           
         sj   dkrt   t|}| kr* | d S t|tr|st |j}| D ]&}||jkrN||  ||< qN|jf |}	dkr|		  n|}	nt
|trȇ fdd|D }	nt
|trt fdd|D }	nht
|tjr&t fdd| D }	n4t
|t rV 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   Fc              	      s   g | ]} | qS r   rN   .0vcacher6   rS   skip_fnupdate_containsr   r   
<listcomp>   s     z)VariableTracker.apply.<locals>.<listcomp>c                 3   s    | ]} | V  qd S r$   rT   rU   rX   r   r   	<genexpr>   s    z(VariableTracker.apply.<locals>.<genexpr>c                 3   s    | ]} | V  qd S r$   rT   rU   rX   r   r   r]      s    c              
      s$   i | ]\}}| | qS r   rT   )rV   krW   rX   r   r   
<dictcomp>   s    z)VariableTracker.apply.<locals>.<dictcomp>)rK   r)   r@   r:   rL   keys_nonvar_fieldsrN   rM   _update_containsr   r>   r?   collectionsOrderedDictitems)
r6   rS   r;   rY   rZ   r[   idxZupdated_dictkeyresultr   rX   r   rN      sJ    


   







zVariableTracker.applyc                 C   s   | j t| j|hdS N)rD   )rM   rI   unionrD   )r!   guardr   r   r   	add_guard   s    zVariableTracker.add_guardc                 C   s0   |d kr| S t |tst| jt| j|dS ri   )r@   rI   rA   rM   rj   rD   )r!   rD   r   r   r   
add_guards   s    zVariableTracker.add_guardsc                 G   sL   |r|  |j | S t|tr*| |jS t|ts8t| |dt S )NrD   )	add_optionsr@   r:   rm   rD   rK   rA   getrI   )r!   optionsmorer   r   r   rn      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 constantNru   r&   r   r   r   as_python_constant   s    z"VariableTracker.as_python_constantc                 C   s*   z|    W dS  tk
r$   Y dS X d S NTF)rx   rv   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k
r&   Y dS X d S ry   )
make_guardrv   r&   r   r   r   can_make_guard   s
    
zVariableTracker.can_make_guardc                 C   s   | j r| j |S t d S r$   )sourcer~   rv   )r!   rS   r   r   r   r~      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)rV   gr   r   r   	<setcomp>   s     
 z1VariableTracker.replace_guards.<locals>.<setcomp>c                 3   s   | ]} j |V  qd S r$   )r   r~   )rV   rS   r&   r   r   r]      s     z1VariableTracker.replace_guards.<locals>.<genexpr>)r   r   rC   )r!   rD   fnsZ
new_guardsr   )r   r!   r   replace_guards   s    
zVariableTracker.replace_guards)r   returnc                 C   s
   t  dS )z/getattr(self, name) returning a python constantNru   r!   r|   r   r   r   r   const_getattr  s    zVariableTracker.const_getattrc                 C   sL   t | }| ||}tj|s(t | jr>t| j||d< tj|f|S )z,getattr(self, name) returning a new variabler   )	r:   rJ   r   r
   ConstantVariableZ
is_literalrv   r   r   )r!   r|   r   rp   r;   r   r   r   var_getattr  s    
zVariableTracker.var_getattrc                 C   s*   z|    W dS  tk
r$   Y dS X d S ry   )as_proxyrv   r&   r   r   r   is_proxy  s
    zVariableTracker.is_proxyc                 C   s   t t| d S r$   )rv   rs   r&   r   r   r   r     s    zVariableTracker.as_proxyc                 C   s
   t  d S r$   ru   )r!   Zcodegenr   r   r   reconstruct  s    zVariableTracker.reconstructc                 C   s
   t  d S r$   ru   r{   r   r   r   unpack_var_sequence  s    z#VariableTracker.unpack_var_sequencec                 C   s,   z|  | W dS  tk
r&   Y dS X d S ry   )r   rv   r{   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   reprr   r   r   r   call_hasattr,  s    zVariableTracker.call_hasattrzList[VariableTracker]zDict[str, VariableTracker])r7   r8   r   c                 C   s   t d|  d| d|  d S )Nzcall_function  r   )r!   r|   r7   r8   r   r   r   call_function/  s    zVariableTracker.call_functionc              	   C   s   |dkr<|  |r<|s|rttjt| |f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   r   zcall_method r   )r   rA   r
   r   lenr   r:   rJ   rz   r   rx   rn   r   )r!   r|   r   r7   r8   r   r   r   call_method4  s(    

 zVariableTracker.call_method)rD   r   mutable_localrecursively_containsc                    s,   t    |pt | _|| _|| _|| _d S r$   )r%   r"   rI   rD   r   r   r   )r!   rD   r   r   r   r'   r   r   r"   K  s    
zVariableTracker.__init__c                    s>    j d kr,t  _ tj j  fddd d  j ks:td S )Nc                    s   |  k	S r$   r   rE   r&   r   r   rQ   _  rR   z/VariableTracker.__post_init__.<locals>.<lambda>)rZ   )r   rI   r:   rN   _aggregate_mutablesrA   )r!   r7   r8   r   r&   r   r5   Z  s    
  
zVariableTracker.__post_init__c                 C   s*   | j |j  |jd k	r&| j |j |S r$   )r   rC   r   add)r!   rE   r   r   r   r   d  s    
z#VariableTracker._aggregate_mutablesc                    s6   t   _tj j  fdddd d  jks2td S )Nc                    s   |  k	S r$   r   r   r&   r   r   rQ   r  rR   z2VariableTracker._update_contains.<locals>.<lambda>T)rZ   r[   )rI   r   r:   rN   r   rA   r&   r   r&   r   rb   l  s    
z VariableTracker._update_contains)NNNN)/r   r   r   r   ra   staticmethodr   rJ   rM   classmethodrO   r   rN   rl   rm   rn   rr   rt   rw   rx   rz   r}   r   r~   r   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#   r"   r5   r   rb   r-   r   r   r'   r   r:   e   sp   
7 	    
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:   rs   r3   r   joinmaprB   )Zobjsr9   r   r   r   rB   y  s    
rB   ) rc   enumr   typingr   r   r   r   r   r    r
   r   excr   r   r   r   utilsr   r   r   r   r   r   r#   r/   r1   r3   r2   r:   rB   r   r   r   r   <module>   s"    %  