o
    I&iW                     @   s   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 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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)	PyCodegen)unimplemented)LocalSourceSource)nn_module_new
object_new)is_side_effect_safeMutableLocalBaseMutableLocalSourceVariableTrackerc                       s,   e Zd ZdZddedef 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__ EC:\wamp64\www\opt\env\Lib\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dedee f 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def fddZ  ZS )AttributeMutationExistingr   c                    s   t  tj| || _d S r   )r   r   r   r   r   )r   r   r   r!   r"   r   0      
z"AttributeMutationExisting.__init__)r$   r%   r&   r   r   r)   r!   r!   r   r"   r,   /   s    r,   c                       s.   e Zd Zdee dee f fddZ  ZS )AttributeMutationNewr   
cls_sourcec                    s   t  tj| || _d S r   )r   r   r   ZLocalr/   )r   r   r/   r   r!   r"   r   6   r-   zAttributeMutationNew.__init__)r$   r%   r&   r   r   r   r)   r!   r!   r   r"   r.   5   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< 					d[ fdd	Zded	efd
dZdd d	ee	 fddZdd Zddd fddZdd Zdd Zdd Zdede	defddZd\d d!Zd"d# Zd$d% Zd&ede	fd'd(Zd&ede	defd)d*Zed+d, Zd-d. Zd/d0 Z d1d2 Z!e"fd3e#ded4efd5d6Z$e$Z%e$Z&d3e#ded4efd7d8Z'd9e#d:ed;efd<d=Z(d>d? Z)d3e#defd@dAZ*d3e#defdBdCZ+dDdE Z,dFdG Z-dHdI Z.dJdK Z/dLe0fdMdNZ1dOdP Z2dQdR Z3dSdT Z4dLe0fdUdVZ5dWdX Z6dYdZ Z7  Z8S )]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 | _|pi | _d S r   )r   r   r1   r2   r3   save_for_backwardtensor_hooks)r   r1   r2   r3   r4   r5   r   r!   r"   r   E   s   




zSideEffects.__init__otherreturnc                 C   s>   t |tsJ | j|jko| j|jko| j|jko| j|jkS r   )
isinstancer0   r1   r2   r4   r5   )r   r6   r!   r!   r"   __eq__T   s   


zSideEffects.__eq__c                 C   s   | j |j kr| j  }|j  }||krd| d| S dS | j|jkr<| j }|j }||kr:d| d| S dS | j|jkrDd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   )r1   keysr2   r4   )r   r6   Zsk_itvZok_itvZsk_samZok_samr!   r!   r"   diff^   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>v   s    z%SideEffects.clone.<locals>.<dictcomp>)r1   r2   r3   r4   r5   )	r    r<   r1   r2   itemslistr3   r4   r5   r   r!   r!   r"   cloner   s   zSideEffects.clonec                 C   s   dS )NFr!   )_r!   r!   r"   <lambda>~   s    zSideEffects.<lambda>c                    sv    d u rt    fdd| j D | _ fdd| j D | _t| j | _t| j | _d S )Nc              	      "   i | ]\}}|t | qS r!   r   applyr=   cachefnskip_fnr!   r"   rA          z%SideEffects.apply.<locals>.<dictcomp>c              	      rH   r!   rI   r=   rK   r!   r"   rA      rO   )r<   r1   rB   r2   r   rJ   r4   r5   )r   rM   rL   rN   r!   rK   r"   rJ   ~   s   
zSideEffects.applyc                 C   s   t || jv S r   )idr1   r   itemr!   r!   r"   __contains__      zSideEffects.__contains__c                 C   s   | j t| S r   )r1   rP   rQ   r!   r!   r"   __getitem__   rT   zSideEffects.__getitem__c                 C   s4   ddl m} t||rdS t|jstd d S d S )Nr   )AutogradFunctionContextVariableTzOHigherOrderOperator: Mutating a variable not in the current scope (SideEffects))Ztorch._dynamo.variables.miscrV   r8   r   mutable_localr   )r   rR   rV   r!   r!   r"   check_allowed_side_effect   s   

z%SideEffects.check_allowed_side_effectrR   namevaluec                 C   sD   |  |sJ | | |j| jvri | j|j< || j|j |< d S r   )is_attribute_mutationrX   rW   r2   )r   rR   rY   rZ   r!   r!   r"   
store_attr   s
   
zSideEffects.store_attrFc                 C   s:   |  |sJ | j|j | }|st|tjrtd |S )Nzread deleted attribute)r[   r2   rW   r8   r	   DeletedVariabler   )r   rR   rY   Z
deleted_okresultr!   r!   r"   	load_attr   s
   zSideEffects.load_attrc                 C   s2   t |tjsJ t |tjsJ | |d| d S Ncell_contents)r8   r	   NewCellVariabler   r\   )r   cellvarrZ   r!   r!   r"   
store_cell      zSideEffects.store_cellc                 C   s   t |tjsJ | |dS r`   )r8   r	   rb   r_   )r   rc   r!   r!   r"   	load_cell      zSideEffects.load_cellgvarc                 C   s   t |tjsJ | ||S r   )r8   r	   r   r_   )r   rh   rY   r!   r!   r"   load_global   rg   zSideEffects.load_globalc                 C   s2   t |tjsJ t |tjsJ | ||| d S r   )r8   r	   r   r\   )r   rh   rY   rZ   r!   r!   r"   store_global   re   zSideEffects.store_globalc                 C   s   t | dd tjtjjjfv S )N__setattr__)inspectgetattr_staticobjectrk   torchnnModule)clsr!   r!   r"   "cls_supports_mutation_side_effects   s   z.SideEffects.cls_supports_mutation_side_effectsc                 C   s   t |jtS r   )r8   rW   r*   rQ   r!   r!   r"   r[         z!SideEffects.is_attribute_mutationc                 C   s   |  |ot| j|jS r   )r[   r(   r2   getrW   rQ   r!   r!   r"   has_pending_mutation   s   z SideEffects.has_pending_mutationc                 C   s.   t |jtrdS | |r|j| jv S |jjS NT)r8   rW   r.   r[   r2   r   rQ   r!   r!   r"   r      s
   
zSideEffects.is_modifiedr   variablec                 C   s0   |j |||d}|| jt|< | j| |S )z*Start tracking a new variable for mutation)rW   r   )rE   r1   rP   r3   append)r   r   rR   rx   mutable_clsr!   r!   r"   
_track_obj   s   zSideEffects._track_objc                 C   s   | j |||tdS )N)rz   )r{   r,   r   r   rR   rx   r!   r!   r"   track_object_existing   s   z!SideEffects.track_object_existingr/   user_clsvariable_clsc                 C   sr   |t jjju rt j }nt|t jjrt|}nt	|}||fdt
d |i|}|| jt|< | j| |S )NrW   )ro   ZautogradfunctionZFunctionCtxFunction
issubclassrp   rq   r   r   r.   r1   rP   r3   ry   )r   r/   r~   r   optionsobjrx   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rW   )rn   r	   rb   r.   r1   rP   r3   ry   )r   r   rx   r!   r!   r"   track_cell_new  s   zSideEffects.track_cell_newc                 C   .   t jt|d}|| jt|< | j| |S r   )r	   rb   r,   r1   rP   r3   ry   r|   r!   r!   r"   track_cell_existing     zSideEffects.track_cell_existingc                 C   r   r   )r	   NewGlobalVariabler,   r1   rP   r3   ry   r|   r!   r!   r"   track_global_existing  r   z!SideEffects.track_global_existingc                 C   s$   t |tjsJ | j||f d S r   )r8   r	   rV   r4   ry   )r   ctxargsr!   r!   r"   track_save_for_backward"  s   z#SideEffects.track_save_for_backwardc                    s   t  d dtffdd}dtttf f fdd t||j|jf | j D ]}t	|j
ts:t|| q,| j D ]
\}t|| q@ fdd| j D | _ fdd| j D | _d S )	Nvarc                    s&   t | jtr| jur | j | S r   )r8   rW   r.   addr   )live_new_objectsskip_objr!   r"   visit*  s
   

z0SideEffects.prune_dead_object_new.<locals>.visitc                    s*   t | tr	| v S t | tr | jS dS rw   )r8   r.   r   rW   r   )is_liver   r!   r"   r   2  s
   


z2SideEffects.prune_dead_object_new.<locals>.is_livec                    s   i | ]\}} |r||qS r!   r!   r=   r   r!   r"   rA   A  
    z5SideEffects.prune_dead_object_new.<locals>.<dictcomp>c                    s   i | ]\}} |r||qS r!   r!   r=   r   r!   r"   rA   D  r   )setr   r   r   rJ   stackZsymbolic_localsr1   valuesr8   rW   r.   r2   rB   )r   txr   r   Zsetattrsr!   )r   r   r   r"   prune_dead_object_new&  s"   

z!SideEffects.prune_dead_object_newc                 C   s    |  | |jt|jjddS )NTr   )rX   rE   r   rW   r   )r   ZoldvarZnewvarr!   r!   r"   mutationH  s   
zSideEffects.mutationc                    s    fdd j  D S )Nc                    s   g | ]	}  |r|qS r!   )r   )r>   r   rD   r!   r"   
<listcomp>O  s    z2SideEffects._get_modified_vars.<locals>.<listcomp>)r1   r   rD   r!   rD   r"   _get_modified_varsN  s   zSideEffects._get_modified_varscgc                 C   s  |   D ]}t|jttfr8t|tjr8|tj	d |
tdd || t|jtr7t|j| |j_qt|jtrt|tjrHtd d| j|ji v rbt|tjsZJ |tj	d n|tj	d ||jj |
tdd || t|j| |j_q||jv r|j|d u sJ ||jj || q| jD ]+\}}||j |
td	d
dg |D ]}|| q|
g tt|td qd S )NZ	make_cellr   Tz'AutogradFunctionContextVariable escaped__call_nn_module_initr   r   r   LOAD_METHODr4   argvalPOP_TOP)r   r8   rW   r,   r.   r	   rb   Zload_import_fromr   r$   extend_outputr
   Z	add_cacher   Ztempvarsr   rV   r   r2   ru   ZUnspecializedNNModuleVariabler/   r4   r   r   len)r   r   r   r   r   argr!   r!   r"   codegen_save_tempvarsQ  sZ   








z!SideEffects.codegen_save_tempvarsc                 C   s4   t | j }||||f| j|< |jrJ ||_d S r   )r   r5   r:   idx)r   tensorhookhandlerY   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  rt   zSideEffects.remove_hookc                 C   s   | j  D ]A\}}}}|jsJ d|| |||g || |tdd t|dr>|jr>|||jg q|t	dg qd S )Nz4Hooks on non input tensors NYI - should not get herer   Tuser_code_variable_namer   )
r5   r   r   r   Zcreate_load_attrr
   hasattrr   Zcreate_storer   )r   r   r   r   r   rY   r!   r!   r"   codegen_hooks  s$   #zSideEffects.codegen_hooksc              	   C   s4  g }|   D ]}t|tjr6||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	dd
g ||dd ||jj |td	dd
g |	g tdtdtdtd q| |r| j|ji  D ]m\}}t|tjr|jj| || |	td|d
g q|dkrqt|tjrt|jtrtt|dd |r|jj| ||jj |	td|d
g q|jj| || ||jj |	td|d
g qqtt|t|D ]}|| qd S )NF)Zallow_cacheBUILD_SLICE   )r   STORE_SUBSCRclearupdater   r   r   r   r   STORE_GLOBALr   rZ   DELETE_ATTR
STORE_ATTR)r   r8   r	   ZListVariablerW   r   r   Zcreate_load_constr   ry   ZConstDictVariabler   outputZupdate_co_namesr   r[   r2   ru   rB   r   r]   r,   r   getattrAssertionErrortypereversed)r   r   suffixesr   rY   rZ   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   rD   r!   r!   r"   is_empty  s   zSideEffects.is_emptyc                 C   s   | j   | j  d S r   )r3   r   r1   rD   r!   r!   r"   r     s   
zSideEffects.clear)NNNNNr#   )9r$   r%   r&   r'   r   intr   __annotations__r   strr   r   r   rn   r(   r9   r   r;   rE   rJ   rS   rU   rX   r\   r_   rd   rf   ri   rj   staticmethodrs   r[   rv   r   r   r   r{   Z
track_listZ
track_dictr}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r)   r!   r!   r   r"   r0   ;   s   
 






",CCr0   )#rl   typingr   r   r   r   r   Ztorch.nnro    r   r	   Zbytecode_transformationr
   r   r   Zcodegenr   excr   r   r   r   r   r   Zvariables.baser   r   r   r   r   r*   r,   r.   r0   r!   r!   r!   r"   <module>   s    
