U
    zh.X                     @   s  d dl Z d dlZd dlmZmZmZmZmZ d dl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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eZ"G dd de"Z#G dd de"Z$G dd dZ%dS )    N)AnyDictListOptionalUnion   )utils	variables)create_call_functioncreate_call_methodcreate_instructioncreate_load_method)	PyCodegen)unimplemented)GlobalSourceLocalSourceSource)nn_module_new
object_new)is_side_effect_safeMutableLocalBaseMutableLocalSourceVariableTrackerc                       s*   e Zd ZdZdeed fddZ  ZS )MutableSideEffectsz
    VariableTracker.mutable_local marker to indicate a list passed as
    an input that if we mutate we need to re-apply those mutations after
    the graph runs.
    F)sourceis_modifiedc                    s   t  tj || _|| _d S N)super__init__r   Existingr   r   )selfr   r   	__class__ L/var/www/html/venv/lib/python3.8/site-packages/torch/_dynamo/side_effects.pyr   "   s    zMutableSideEffects.__init__)F)__name__
__module____qualname____doc__r   boolr   __classcell__r#   r#   r!   r$   r      s   r   c                       s,   e Zd ZdZeee d fddZ  ZS )AttributeMutationzM
    VariableTracker.mutable_local marker to track changes to attributes
    )typr   c                    s   t  | || _d S r   )r   r   r   )r    r,   r   r!   r#   r$   r   -   s    zAttributeMutation.__init__)	r%   r&   r'   r(   r   r   r   r   r*   r#   r#   r!   r$   r+   (   s   r+   c                       s"   e Zd Zed fddZ  ZS )AttributeMutationExisting)r   c                    s   t  tj| || _d S r   )r   r   r   r   r   )r    r   r!   r#   r$   r   3   s    z"AttributeMutationExisting.__init__)r%   r&   r'   r   r   r*   r#   r#   r!   r$   r-   2   s   r-   c                       s,   e Zd Zee ee d fddZ  ZS )AttributeMutationNew)r   
cls_sourcec                    s   t  tj| || _d S r   )r   r   r   ZLocalr/   )r    r   r/   r!   r#   r$   r   9   s    zAttributeMutationNew.__init__)r%   r&   r'   r   r   r   r*   r#   r#   r!   r$   r.   8   s   r.   c                       s  e Zd ZU dZeeef ed< eeee	ef f ed< e
e ed< dW fdd	Zeedd	d
Zd ee	 dddZdd Zdd Zdd Zdd Zee	edddZdXddZdd Zdd Zee	dd d!Zee	ed"d#d$Zed%d& Zd'd( Zd)d* Zd+d, Z d-d. Z!e"feed/d0d1Z#e#Z$eed/d2d3Z%e&eed4d5d6Z'd7d8 Z(e&ed9d:d;Z)e&ed9d<d=Z*d>d? Z+d@dA Z,dBdC Z-dDdE Z.dFdG Z/e0dHdIdJZ1dKdL Z2dMdN Z3dOdP Z4e0dHdQdRZ5dSdT Z6dUdV Z7  Z8S )YSideEffectszp
    Track side effects (list mutation, setattr, etc) that need to be
    applied after an FX graph is run.
    id_to_variablestore_attr_mutations	keepaliveNc                    s@   t    |pi | _|pi | _|p$g | _|p.g | _|p8i | _d S r   )r   r   r1   r2   r3   save_for_backwardtensor_hooks)r    r1   r2   r3   r4   r5   r!   r#   r$   r   H   s    




zSideEffects.__init__)otherreturnc                 C   s>   t |tst| j|jko<| j|jko<| j|jko<| j|jkS r   )
isinstancer0   AssertionErrorr1   r2   r4   r5   )r    r6   r#   r#   r$   __eq__W   s    


zSideEffects.__eq__c                 C   s   | j |j kr<| j  }|j  }||kr8d| d| S dS | j|jkrx| j }|j }||krtd| d| S dS | j|jkrdS | j|jkrdS d S d S )Nzid_to_variable keys: z != zid_to_variable: unknown diffzstore_attr_mutations keys: z"store_attr_mutations: unknown diffr4   r5   )r1   keysr2   r4   r5   )r    r6   Zsk_itvZok_itvZsk_samZok_samr#   r#   r$   diffa   s"    



zSideEffects.diffc                 C   s4   | j t| jdd | j D t| j| j| jdS )zCreate a shallow copyc                 S   s   i | ]\}}|t |qS r#   )dict.0kvr#   r#   r$   
<dictcomp>{   s     z%SideEffects.clone.<locals>.<dictcomp>)r1   r2   r3   r4   r5   )	r"   r=   r1   r2   itemslistr3   r4   r5   r    r#   r#   r$   clonew   s    zSideEffects.clonec                 C   s   t || jkS r   )idr1   r    itemr#   r#   r$   __contains__   s    zSideEffects.__contains__c                 C   s   | j t| S r   )r1   rG   rH   r#   r#   r$   __getitem__   s    zSideEffects.__getitem__c                 C   s0   ddl m} t||rdS t|js,td d S )Nr   )AutogradFunctionContextVariableTzOHigherOrderOperator: Mutating a variable not in the current scope (SideEffects))Ztorch._dynamo.variables.miscrL   r8   r   mutable_localr   )r    rI   rL   r#   r#   r$   check_allowed_side_effect   s    

z%SideEffects.check_allowed_side_effect)rI   namevaluec                 C   sD   |  |st| | |j| jkr0i | j|j< || j|j |< d S r   )is_attribute_mutationr9   rN   rM   r2   )r    rI   rO   rP   r#   r#   r$   
store_attr   s
    
zSideEffects.store_attrFc                 C   s:   |  |st| j|j | }|s6t|tjr6td |S )Nzread deleted attribute)rQ   r9   r2   rM   r8   r	   DeletedVariabler   )r    rI   rO   Z
deleted_okresultr#   r#   r$   	load_attr   s
    zSideEffects.load_attrc                 C   s2   t |tjstt |tjs t| |d| d S Ncell_contents)r8   r	   NewCellVariabler9   r   rR   )r    cellvarrP   r#   r#   r$   
store_cell   s    zSideEffects.store_cellc                 C   s   t |tjst| |dS rV   )r8   r	   rX   r9   rU   )r    rY   r#   r#   r$   	load_cell   s    zSideEffects.load_cell)gvarrO   c                 C   s   t |tjst| ||S r   )r8   r	   r   r9   rU   )r    r\   rO   r#   r#   r$   load_global   s    zSideEffects.load_global)r\   rO   rP   c                 C   s2   t |tjstt |tjs t| ||| d S r   )r8   r	   r   r9   rR   )r    r\   rO   rP   r#   r#   r$   store_global   s    zSideEffects.store_globalc                 C   s   t | dd tjkS )N__getattribute__)inspectgetattr_staticobjectr_   )clsr#   r#   r$   "cls_supports_mutation_side_effects   s    z.SideEffects.cls_supports_mutation_side_effectsc                 C   s   t |jtS r   )r8   rM   r+   rH   r#   r#   r$   rQ      s    z!SideEffects.is_attribute_mutationc                 C   s   |  |ot| j|jS r   )rQ   r)   r2   getrM   rH   r#   r#   r$   has_pending_mutation   s    z SideEffects.has_pending_mutationc                 C   s   |  |o|| j|jdkS )Nr#   )rQ   r2   re   rM   )r    rI   rO   r#   r#   r$   has_pending_mutation_of_attr   s
    z(SideEffects.has_pending_mutation_of_attrc                 C   s.   t |jtrdS | |r&|j| jkS |jjS NT)r8   rM   r.   rQ   r2   r   rH   r#   r#   r$   r      s
    
zSideEffects.is_modified)rI   variablec                 C   s8   |j dk	st||j |_|| jt|< | j| |S )z*Start tracking a new variable for mutationN)r   r9   rM   r1   rG   r3   append)r    rI   ri   mutable_clsr#   r#   r$   
_track_obj   s
    zSideEffects._track_objc                 C   s   | j ||tdS )N)rk   )rl   r-   )r    rI   ri   r#   r#   r$   track_object_existing   s    z!SideEffects.track_object_existing)r/   user_clsvariable_clsc              	   C   s   |t jjjkr2tjdd t j }W 5 Q R X n t|t jj	rJt
|}nt|}||fdtd |i|}|| jt|< | j| |S )NT)recordrM   )torchZautogradfunctionZFunctionCtxwarningscatch_warningsFunction
issubclassnnModuler   r   r.   r1   rG   r3   rj   )r    r/   rn   ro   optionsobjri   r#   r#   r$   track_object_new   s     
zSideEffects.track_object_newc                 C   s6   t  }tjtd d d}|| jt|< | j| |S N)rM   )rb   r	   rX   r.   r1   rG   r3   rj   )r    rz   ri   r#   r#   r$   track_cell_new   s    zSideEffects.track_cell_new)r   rI   c                 C   s.   t jt|d}|| jt|< | j| |S r|   )r	   rX   r-   r1   rG   r3   rj   r    r   rI   ri   r#   r#   r$   track_cell_existing  s    zSideEffects.track_cell_existingc                 C   s.   t jt|d}|| jt|< | j| |S r|   )r	   NewGlobalVariabler-   r1   rG   r3   rj   r~   r#   r#   r$   track_global_existing  s    z!SideEffects.track_global_existingc                 C   s$   t |tjst| j||f d S r   )r8   r	   rL   r9   r4   rj   )r    ctxargsr#   r#   r$   track_save_for_backward  s    z#SideEffects.track_save_for_backwardc                 C   sD   |j D ]8}t|}|j| }|| jkrt|tjr| || qd S r   )r3   rG   r1   r8   r	   TensorVariablerm   )r    r6   Z
other_itemZother_idZother_variabler#   r#   r$   1track_tensor_variables_from_runahead_side_effects  s    

 z=SideEffects.track_tensor_variables_from_runahead_side_effectsc                    s   t  d tdfdd}tttf d fdd t||j|jf | j D ]}t	|j
tsXt|| qX| j D ]\}t|| q fdd| j D | _ fdd| j D | _d S )	Nvarc                    s&   t | jtr"| jk	r" | j d S r   )r8   rM   r.   addr   )live_new_objectsskip_objr#   r$   visit,  s
    
z0SideEffects.prune_dead_object_new.<locals>.visitc                    s*   t | tr| kS t | tr& | jS dS rh   )r8   r.   r   rM   r   )is_liver   r#   r$   r   3  s
    


z2SideEffects.prune_dead_object_new.<locals>.is_livec                    s   i | ]\}} |r||qS r#   r#   r>   r   r#   r$   rB   B  s      z5SideEffects.prune_dead_object_new.<locals>.<dictcomp>c                    s   i | ]\}} |r||qS r#   r#   r>   r   r#   r$   rB   E  s      )setr   r   r   r   stackZsymbolic_localsr1   valuesr8   rM   r.   r2   rC   )r    txr   r   Zsetattrsr#   )r   r   r   r$   prune_dead_object_new(  s     

z!SideEffects.prune_dead_object_newc                 C   s*   |  | t|jtr&t|jjd|_d S rh   )rN   r8   rM   r   r   )r    r   r#   r#   r$   mutationI  s    
zSideEffects.mutationc                    s    fdd j  D S )Nc                    s   g | ]}  |r|qS r#   )r   )r?   r   rE   r#   r$   
<listcomp>O  s     
 z2SideEffects._get_modified_vars.<locals>.<listcomp>)r1   r   rE   r#   rE   r$   _get_modified_varsN  s    zSideEffects._get_modified_vars)cgc                 C   s  |   D ]<}t|jttfrrt|tjrr|tj	d |
tdd || t|jtrpt|j| |j_qt|jtrt|tjrtd d| j|ji krt|tjst|tj	d n|tj	d ||jj |
tdd || t|j| |j_q||jkr|j|d ks0t||jj || q| jD ]N\}}||j |d	 |D ]}|| qn|
tt|td
f qNd S )NZ	make_cellr   Tz'AutogradFunctionContextVariable escaped__call_nn_module_initr   r   r   r4   POP_TOP)r   r8   rM   r-   r.   r	   rX   load_import_fromr   r%   extend_outputr
   	add_cacher   Ztempvarsr   rL   r   r2   re   ZUnspecializedNNModuleVariabler9   r/   r4   load_methodr   lenr   )r    r   r   r   r   argr#   r#   r$   codegen_save_tempvarsQ  sP     

 




z!SideEffects.codegen_save_tempvarsc                 C   s   t |tjstt |tjs tt |tjr2|js6tttj	|sFtt
| j }|| jkrh|d7 }qT||||f| j|< |jrt||_d S )Nr   )r8   r	   r   r9   r   ZRemovableHandleVariablerM   hasattrrq   ZTensorr   r5   r;   idx)r    tensorhookhandlerO   r   r#   r#   r$   register_hook{  s    



zSideEffects.register_hookc                 C   s   | j |= d S r   )r5   )r    r   r#   r#   r$   remove_hook  s    zSideEffects.remove_hookc                 C   sf   | j  D ]V\}}}}|js$td|| |||g || |tdd || q
d S )Nz4Hooks on non input tensors NYI - should not get herer   T)r5   r   r   r9   r   Zcreate_load_attrr
   r   )r    r   r   r   r   rO   r#   r#   r$   codegen_hooks  s    #zSideEffects.codegen_hooksc              	   C   s  g }|   D ]}t|tjrl||dd ||jj ||d |d tdddg |	tdg qt|tj
r|jjd |jjd ||jj |tdg ||dd ||jj |tdg |	td	td
ftdtd
f q| |r| j|ji  D ]h\}}t|tjr||jj| || t|jjtsdt|	td|dg q"|dkrq"t|tjrt|jtrtt|dd |r|jj| ||jj |	td|dg nt|tjrT| rT|dd |d ||jj |t| || |	tdtd
f n6|jj| || ||jj |	td|dg q"qt|tj rt!|j"D ]4}|t#j$d ||jj |%dd |&  qqtt'|qt(|D ]}|| qd S )NF)Zallow_cacheBUILD_SLICE   )r   STORE_SUBSCRclearupdater   r   r   STORE_GLOBAL)argvalr   rP   DELETE_ATTRbuiltinsrb   __setattr__   
STORE_ATTRZ	iter_nextT))r   r8   r	   ZListVariablerM   r   r   Zcreate_load_constr   rj   ZConstDictVariabler   outputZupdate_co_namesr   r   rQ   r2   re   rC   r   r   r9   rS   r-   r   getattrZUserDefinedObjectVariableZneeds_slow_setattrr   r   ZConstantVariableZTupleIteratorVariablerangeindexr   r%   Zcall_functionZpop_toptypereversed)r    r   suffixesr   rO   rP   _suffixr#   r#   r$   codegen_update_mutated  s    
 
 

z"SideEffects.codegen_update_mutatedc                 C   s*   t t| j| j p&| jp&| jp&| j S r   )anymapr   r1   r   r5   r4   rE   r#   r#   r$   is_empty  s    zSideEffects.is_emptyc                 C   s   | j   | j  d S r   )r3   r   r1   rE   r#   r#   r$   r     s    
zSideEffects.clear)NNNNN)F)9r%   r&   r'   r(   r   intr   __annotations__r   strr   r   r   rb   r)   r:   r   r<   rF   rJ   rK   rN   rR   rU   rZ   r[   r]   r^   staticmethodrd   rQ   rf   rg   r   r   rl   Ztrack_mutablerm   r   r{   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r*   r#   r#   r!   r$   r0   >   sp   
     


	!*2Wr0   )&r`   rs   typingr   r   r   r   r   Ztorch.nnrq    r   r	   Zbytecode_transformationr
   r   r   r   Zcodegenr   excr   r   r   r   r   r   r   Zvariables.baser   r   r   r   r   r+   r-   r.   r0   r#   r#   r#   r$   <module>   s   
