o
    ߗi                     @   s*  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
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!m"Z" ddlm#Z#m$Z$m%Z% ddl&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, ddl-m.Z. dd Z/G dd dZ0e j1dddZ2dS )    N)MutableMapping)CellType)AnyDictListOptionalSetType   )utils	variables)bytecode_from_templatecreate_call_functioncreate_call_methodcreate_instruction)	PyCodegen)unimplemented)GlobalSourceLocalCellSourceLocalSourceSource)is_frozen_dataclassnn_module_new
object_new)AttributeMutationAttributeMutationExistingAttributeMutationNewis_side_effect_safeValueMutationExistingVariableTracker)FrozenDataClassVariablec                 C   s   |   D ]\}}|||< qd S N)items)	dict_fromdict_tokv r'   X/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/torch/_dynamo/side_effects.py_manual_update_dict#   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< 					de 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 Zdd Zdd Zdd ZdededefddZdfd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-d. Zd/d0 Z d1d2 Z!e"fde
d3efd4d5Z#e#Z$de
d3efd6d7Z%d8e&d9e
d:e
fd;d<Z'	=	>dgd?d@Z(dAdB Z)dCee& dDe*dEefdFdGZ+dCe&de
fdHdIZ,dJdK Z-dLdM Z.dNdO Z/dPdQ Z0dRdS Z1dTe2fdUdVZ3dWdX Z4dYdZ Z5d[d\ Z6d]d^ Z7dTe2fd_d`Z8dadb Z9dcdd Z:  Z;S )h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                    sR   t    t|| _|pi | _|pi | _|pg | _|pg | _|p"i | _	d | _
d S r!   )super__init__weakrefrefoutput_graph_weakrefr+   r,   r-   save_for_backwardtensor_hooksca_final_callbacks_var)selfoutput_graphr+   r,   r-   r3   r4   	__class__r'   r(   r/   2   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!   )
isinstancer*   r+   r,   r3   r4   )r6   r:   r'   r'   r(   __eq__F   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 | j|jkrLdS d S )Nzid_to_variable keys: z != zid_to_variable: unknown diffzstore_attr_mutations keys: z"store_attr_mutations: unknown diffr3   r4   )r+   keysr,   r3   r4   )r6   r:   sk_itvok_itvsk_samok_samr'   r'   r(   diffP   s"   



zSideEffects.diffc                 C   s:   | 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.0r%   r&   r'   r'   r(   
<dictcomp>k   s    z%SideEffects.clone.<locals>.<dictcomp>)r7   r+   r,   r-   r3   r4   )
r9   r2   rD   r+   r,   r"   listr-   r3   r4   r6   r'   r'   r(   clonef   s   zSideEffects.clonec                 C   s   t || jv S r!   )idr+   r6   itemr'   r'   r(   __contains__s      zSideEffects.__contains__c                 C   s   | j t| S r!   )r+   rK   rL   r'   r'   r(   __getitem__v   rO   zSideEffects.__getitem__c                 C   s$   |   }|o|jjjjo|jjjjS r!   )r2   
current_txoutputcurrent_tracerunder_activation_checkpoint#allow_side_effects_under_checkpoint)r6   r7   r'   r'   r(   *should_allow_side_effects_under_checkpointy   s   

z6SideEffects.should_allow_side_effects_under_checkpointc                 C   s@   ddl m} t||rdS |  rdS t|jstd d S d S )Nr   )AutogradFunctionContextVariableTzOHigherOrderOperator: Mutating a variable not in the current scope (SideEffects))torch._dynamo.variables.miscrW   r<   rV   r   mutation_typer   )r6   rM   rW   r'   r'   r(   check_allowed_side_effect   s   

z%SideEffects.check_allowed_side_effectrM   namevaluec                 C   s>   |  |sJ | | || jvri | j|< || j| |< d S r!   )is_attribute_mutationrZ   r,   )r6   rM   r[   r\   r'   r'   r(   
store_attr   s
   


zSideEffects.store_attrFc                 C   s<   |r	|  |s	J | j| | }|st|tjrtd |S )Nzread deleted attribute)r]   r,   r<   r   DeletedVariabler   )r6   rM   r[   
deleted_okcheckresultr'   r'   r(   	load_attr   s   zSideEffects.load_attrc                 C   sB   |  rtd t|tjsJ t|tjsJ | |d| d S )Nz5Dynamo currently doesn't support writing to such cellcell_contents)is_immutabler   r<   r   CellVariabler   r^   )r6   cellvarr\   r'   r'   r(   
store_cell   s
   zSideEffects.store_cellc                 C   sD   t |tjsJ | |dr| j|dddS |jr|jS td d S )Nrd   F)ra   zcannot read uninitialized cell)r<   r   rf   has_pending_mutation_of_attrrc   pre_existing_contentsr   )r6   rg   r'   r'   r(   	load_cell   s   zSideEffects.load_cellgvarc                 C   s   t |tjsJ | ||S r!   )r<   r   r   rc   )r6   rl   r[   r'   r'   r(   load_global   s   zSideEffects.load_globalc                 C   s2   t |tjsJ t |tjsJ | ||| d S r!   )r<   r   r   r^   )r6   rl   r[   r\   r'   r'   r(   store_global   s   zSideEffects.store_globalc                 C   s   t | dd tju S )N__getattribute__)inspectgetattr_staticobjectro   )clsr'   r'   r(   "cls_supports_mutation_side_effects   s   z.SideEffects.cls_supports_mutation_side_effectsc                 C   s   t |jtS r!   )r<   rY   r   rL   r'   r'   r(   r]         z!SideEffects.is_attribute_mutationc                 C   s   |  |ot| j|S r!   )r]   boolr,   getrL   r'   r'   r(   has_pending_mutation   s   
z SideEffects.has_pending_mutationc                 C   s   |  |o|| j|dv S )Nr'   )r]   r,   rw   )r6   rM   r[   r'   r'   r(   ri      s
   z(SideEffects.has_pending_mutation_of_attrc                 C   s8   |  rdS t|jtrdS | |r|| jv S |jjS )NFT)re   r<   rY   r   r]   r,   is_modifiedrL   r'   r'   r(   ry      s   

zSideEffects.is_modifiedvariablec                 C   sj   |j dusJ t|| jv r"t| d|j  d| jt| j  d| |_|| jt|< | j| |S )z*Start tracking a new variable for mutationNz is already tracked for mutation. This could be because you are not using VariableBuilder to construct the variable tracker. Source of new object: z'. Source of previously tracked object: .)sourcerK   r+   AssertionErrorrY   r-   append)r6   rM   rz   mutation_type_clsr'   r'   r(   
_track_obj   s   zSideEffects._track_objc                 C   s   | j ||tdS )N)r   )r   r   )r6   rM   rz   r'   r'   r(   track_object_existing   s   z!SideEffects.track_object_existing
cls_sourceuser_clsvariable_clsc                 C   s   |t jjju r#tjdd t j }W d    n1 sw   Y  n#t|t jj	r/t
|}nzt|}W n tyE   td|  Y nw ||fdt|i|}|| jt|< | j| |S )NT)recordz'Unable to construct the object of type rY   )torchautogradfunctionFunctionCtxwarningscatch_warningsFunction
issubclassnnModuler   r   	TypeErrorr   r   r+   rK   r-   r~   )r6   r   r   r   optionsobjrz   r'   r'   r(   track_object_new   s,   
zSideEffects.track_object_newcls_variable"variables.UserDefinedClassVariablec                 C   s|   |j }|j}tj}t|tjjrtj}nt|t	rtj
}n
t|r$t}ntj}t|tjs/J tj||d}| |||i S )N)r   )r|   r\   r   UserDefinedObjectVariabler   r   r   r   UnspecializedNNModuleVariabler   MutableMappingVariabler   r    	functoolspartialr   )r6   r   r   r   r   r'   r'   r(   (track_object_new_from_user_defined_class  s   
z4SideEffects.track_object_new_from_user_defined_classc                 C   s2   t  }tjt d}|| jt|< | j| |S )NrY   )rr   r   rf   r   r+   rK   r-   r~   )r6   r   rz   r'   r'   r(   track_cell_new,  s   zSideEffects.track_cell_newr|   cellcontentsc                 C   s<   t j|d u rd nt ||d}|| jt|< | j| |S )N)rY   rj   r|   )r   rf   r   r+   rK   r-   r~   )r6   r|   r   r   rz   r'   r'   r(   track_cell_existing7  s   zSideEffects.track_cell_existingc                 C   s.   t jt |d}|| jt|< | j| |S )N)rY   r|   )r   NewGlobalVariabler   r+   rK   r-   r~   )r6   r|   rM   rz   r'   r'   r(   track_global_existingE  s   z!SideEffects.track_global_existingc                 C   s$   t |tjsJ | j||f d S r!   )r<   r   rW   r3   r~   )r6   ctxargsr'   r'   r(   track_save_for_backwardN  s   z#SideEffects.track_save_for_backwardc                 C   sD   |j D ]}t|}|j| }|| jvrt|tjr| || qd S r!   )r-   rK   r+   r<   r   TensorVariabler   )r6   r:   
other_itemother_idother_variabler'   r'   r(   1track_tensor_variables_from_runahead_side_effectsR  s   

z=SideEffects.track_tensor_variables_from_runahead_side_effectsc                    s   t  t  dtffdddtffdd dd j D }t|j|j||jjj	f  fdd	j
 D _ fd
d	j
 D _d S )Nvarc                    sP   | v rd S  |  t| jtr  |  | jv r&tj|   d S d S r!   )addr<   rY   r   r,   r   visitr   )live_new_objectsr6   r   visitedr'   r(   r   c  s   



z0SideEffects.prune_dead_object_new.<locals>.visitc                    s   t | jtr
|  v S dS NTr<   rY   r   r   )r   r'   r(   is_liver  s   z2SideEffects.prune_dead_object_new.<locals>.is_livec                 S   s   g | ]
}t |jts|qS r'   r   rF   r   r'   r'   r(   
<listcomp>w  s    
z5SideEffects.prune_dead_object_new.<locals>.<listcomp>c                    s   i | ]\}} |r||qS r'   r'   rE   r   r'   r(   rG     
    z5SideEffects.prune_dead_object_new.<locals>.<dictcomp>c                    s   i | ]\}} |r||qS r'   r'   rE   r   r'   r(   rG     r   )setr   r+   valuesr   stacksymbolic_localsrR   backward_stater4   r"   r,   )r6   txpre_existing_varsr'   )r   r   r6   r   r   r(   prune_dead_object_new^  s.   	

z!SideEffects.prune_dead_object_newc                 C   s&   |  | t|jtrd|j_d S d S r   )rZ   r<   rY   r   ry   )r6   r   r'   r'   r(   mutation  s   
zSideEffects.mutationc                    s    fdd j  D S )Nc                    s   g | ]	}  |r|qS r'   )ry   r   rI   r'   r(   r     s    z2SideEffects._get_modified_vars.<locals>.<listcomp>)r+   r   rI   r'   rI   r(   _get_modified_vars  s   zSideEffects._get_modified_varscgc                    sV  |   D ]z}t|jtrBt|tjrB|jd u r6  fdd  t	dd  
| t j| |_q|jd u rAt|j|_qt|jtrwt|tjrRtd   fdd  |jj  t	dd  
| t j| |_q|jd us~J q| jD ]&\}} |j  d |D ]} | q g tt|td	 qd S )
Nc                           tjdS )N	make_cellload_import_fromr   __name__r'   r   r'   r(   <lambda>      z3SideEffects.codegen_save_tempvars.<locals>.<lambda>r   Fz'AutogradFunctionContextVariable escapedc                      r   )Nr   r   r'   r   r'   r(   r     r   r
   r3   POP_TOP)r   r<   rY   r   r   rf   
local_nameadd_push_nullextend_outputr   	add_cacher   tempvarsr|   r   rW   r   r   r3   load_methodr   lenr   )r6   r   r   r   r   argr'   r   r(   codegen_save_tempvars  sL   









z!SideEffects.codegen_save_tempvarsc                 C   s   t |tjsJ t |tjsJ t |tjr| sJ ttj|s$J t	| j
 }|| j
v r9|d7 }|| j
v s0||||f| j
|< |jrGJ ||_d S )Nr
   )r<   r   r   r   RemovableHandleVariable
is_mutablehasattrr   Tensorr   r4   r>   idx)r6   tensorhookhandler[   r   r'   r'   r(   register_hook  s   




zSideEffects.register_hookc                 C   s   | j |= d S r!   )r4   )r6   r   r'   r'   r(   remove_hook  ru   zSideEffects.remove_hookc                    sf   | j  D ]+\}}jsJ d fdd} |  |  tdd  | qd S )Nz4Hooks on non input tensors NYI - should not get herec                      s        g d S r!   )r   create_load_attrr'   r   r[   r   r'   r(   gen_fn  s   z)SideEffects.codegen_hooks.<locals>.gen_fnr
   F)r4   r   r|   r   r   r   r   )r6   r   r   r   r   r'   r   r(   codegen_hooks  s   #
zSideEffects.codegen_hooksc                 C   s.   ddl m} | jd u rtjg | d| _| jS )Nr
   )ValueMutationNewr   )variables.baser   r5   r   ListVariable)r6   r   r'   r'   r(   get_ca_final_callbacks_var  s   
z&SideEffects.get_ca_final_callbacks_varc              	      s  g }|   D ]ttjr5 dd  j   d  d tdddg |tdg qttj	j
rtjtjrIjjd u sMtd  j  d  dd |g td	td
  j  d |g tdtd
 qttjri }tjjD ]
} jj ||< q j  td|d dg  dd  td|d dg  j  d tt|d}|g tdtd
|td
 qttjr) r( j  d  dd jr
 j  d |g td	td
 jr(|g tdtd
 qttjjr  fdd  dd tj  } j!d  |f7  <  "td|d   fdd  #j$  "tdt%j$d  d	d  "td
 qttj&rj'd ur| j(v r| )} | | *j'g q| +rgt,| j(-i . D ]\}}ttj/r jj0|  | tjt1sJ |td|dg qt|tj2rtj3t4rt5t6dd |r jj0|  j |td|dg qttj7rJ8 rJ 9dd  d  j  t|  | |g tdtd
 q jj0|  |  j |td|dg qqttj:rt;j<D ]}  fd d  j  d	d  =  qsqttj>r fd!d"}	 |	  ?j@A  |g tBd	dtd
 qtCtDt,|D ]}
 |
 qd S )#NF)allow_cacheBUILD_SLICE   )r   STORE_SUBSCRz1side effect on existing deque with limited maxlenextendr
   r   clearr   
STORE_FASTr$   )argvalr#   )varname_mapupdatec                      r   )Nget_torch_function_mode_stackr   r'   r   r'   r(   r         z4SideEffects.codegen_update_mutated.<locals>.<lambda>co_varnamesc                      r   )Nset_torch_function_mode_stackr   r'   r   r'   r(   r     r   
BUILD_LISTSTORE_GLOBALr\   DELETE_ATTRbuiltinsrr   __setattr__   
STORE_ATTRc                      r   )N	iter_nextr   r'   r   r'   r(   r     r   c                      s    j   d d S )Nsetstate)r|   rc   r'   r   r   r'   r(   r        
z2SideEffects.codegen_update_mutated.<locals>.gen_fn)Er   r<   r   r   r|   r   create_load_constr   r~   listsDequeVariablemaxlenConstantVariabler\   r   r   r   CustomizedDictVariabler)   __code__r   r   rR   new_varr   ConstDictVariablehas_new_itemsshould_reconstruct_alltorch_functionTorchFunctionModeStackVariabler   call_functionget_prev_stack_var_namecode_optionsappend_outputforeachsymbolic_stackr   rf   r   r,   rk   create_store_derefr]   reversedrw   r"   r   update_co_namesr   r_   rY   r   r   getattrr   needs_slow_setattrr   ListIteratorVariablerangeindexpop_topRandomVariable
wrap_staterandomgetstater   r}   type)r6   r   suffixesr   r[   dict_update_instscontents_varr\   _r   suffixr'   r   r(   codegen_update_mutated&  sb  








	
	












%


z"SideEffects.codegen_update_mutatedc                 C   s*   t t| j| j p| jp| jp| j S r!   )anymapry   r+   r   r4   r3   rI   r'   r'   r(   is_empty  s   zSideEffects.is_emptyc                 C   s   | j   | j  d S r!   )r-   r   r+   rI   r'   r'   r(   r     r   zSideEffects.clear)NNNNN)FF)r   r   )<r   
__module____qualname____doc__r   intr   __annotations__strr   r   r/   rr   rv   r=   r   rC   rJ   rN   rP   rV   rZ   r^   rc   rh   rk   rm   rn   staticmethodrt   r]   rx   ri   ry   r   r   track_mutabler   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r&  r)  r   __classcell__r'   r'   r8   r(   r*   (   s   
 




	


	?/6	 hr*   r   InstructionTranslatorc                 c   sH    | j jjsJ | j jj}zd| j j_d V  W || j j_d S || j j_w r   )rR   rS   rT   rU   )r   orig_valr'   r'   r(   rU     s   

rU   )r   r3  )3
contextlibr   rp   r   r0   collections.abcr   typesr   typingr   r   r   r   r   r	   torch.nnr    r   r   bytecode_transformationr   r   r   r   codegenr   excr   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   variables.user_definedr    r)   r*   contextmanagerrU   r'   r'   r'   r(   <module>   s4          w