U
    ªÊ¹jd/  ã                   @   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/bwave/python/venv/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¢ˆ|ƒs˜t |jƒ}| ¡ D ]&}||jkrNˆ ˆ|| ˆ ˆ¡||< qNˆ|jf |Žƒ}	ˆdkr |	 	¡  nˆ|ƒ}	n¸t
|tƒrÈ‡ ‡‡‡‡fdd„|D ƒ}	n’t
|tƒròt‡ ‡‡‡‡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   Z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r€t|ƒ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"    %  