o
    "i.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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__ X/home/ubuntu/SoloSpeech/.venv/lib/python3.10/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   3      
z"AttributeMutationExisting.__init__)r&   r'   r(   r   r   r+   r#   r#   r!   r$   r.   2   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   Localr1   )r    r   r1   r!   r#   r$   r   9   r/   zAttributeMutationNew.__init__)r&   r'   r(   r   r   r   r+   r#   r#   r!   r$   r0   8   s    &r0   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 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+d, Zd-d. Z d/d0 Z!e"fded1efd2d3Z#e#Z$ded1efd4d5Z%d6e&d7ed8efd9d:Z'd;d< Z(d=e&defd>d?Z)d=e&defd@dAZ*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   r4   r5   r6   save_for_backwardtensor_hooks)r    r4   r5   r6   r7   r8   r!   r#   r$   r   H   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   )
isinstancer3   r4   r5   r7   r8   )r    r9   r#   r#   r$   __eq__W   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 diffr7   r8   )r4   keysr5   r7   r8   )r    r9   sk_itvok_itvsk_sam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>)r4   r5   r6   r7   r8   )	r"   rC   r4   r5   itemslistr6   r7   r8   r    r#   r#   r$   clonew   s   zSideEffects.clonec                 C   s   t || jv S r   )idr4   r    itemr#   r#   r$   __contains__      zSideEffects.__contains__c                 C   s   | j t| S r   )r4   rM   rN   r#   r#   r$   __getitem__   rQ   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))torch._dynamo.variables.miscrS   r;   r   mutable_localr   )r    rO   rS   r#   r#   r$   check_allowed_side_effect   s   

z%SideEffects.check_allowed_side_effectrO   namevaluec                 C   sD   |  |sJ | | |j| jvri | j|j< || j|j |< d S r   )is_attribute_mutationrV   rU   r5   )r    rO   rW   rX   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)rY   r5   rU   r;   r	   DeletedVariabler   )r    rO   rW   
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)r;   r	   NewCellVariabler   rZ   )r    cellvarrX   r#   r#   r$   
store_cell      zSideEffects.store_cellc                 C   s   t |tjsJ | |dS r_   )r;   r	   ra   r^   )r    rb   r#   r#   r$   	load_cell      zSideEffects.load_cellgvarc                 C   s   t |tjsJ | ||S r   )r;   r	   r   r^   )r    rg   rW   r#   r#   r$   load_global   rf   zSideEffects.load_globalc                 C   s2   t |tjsJ t |tjsJ | ||| d S r   )r;   r	   r   rZ   )r    rg   rW   rX   r#   r#   r$   store_global   rd   zSideEffects.store_globalc                 C   s   t | dd tju S )N__getattribute__)inspectgetattr_staticobjectrj   )clsr#   r#   r$   "cls_supports_mutation_side_effects   s   z.SideEffects.cls_supports_mutation_side_effectsc                 C   s   t |jtS r   )r;   rU   r,   rN   r#   r#   r$   rY         z!SideEffects.is_attribute_mutationc                 C   s   |  |ot| j|jS r   )rY   r*   r5   getrU   rN   r#   r#   r$   has_pending_mutation   s   z SideEffects.has_pending_mutationc                 C   s   |  |o|| j|jdv S )Nr#   )rY   r5   rq   rU   )r    rO   rW   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v S |jjS NT)r;   rU   r0   rY   r5   r   rN   r#   r#   r$   r      s
   
zSideEffects.is_modifiedvariablec                 C   s8   |j dusJ ||j |_|| jt|< | j| |S )z*Start tracking a new variable for mutationN)r   rU   r4   rM   r6   append)r    rO   ru   mutable_clsr#   r#   r$   
_track_obj   s
   zSideEffects._track_objc                 C   s   | j ||tdS )N)rw   )rx   r.   )r    rO   ru   r#   r#   r$   track_object_existing   s   z!SideEffects.track_object_existingr1   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t|}||fdtd |i|}|| jt|< | j| |S )NT)recordrU   )torchautogradfunctionFunctionCtxwarningscatch_warningsFunction
issubclassnnModuler   r   r0   r4   rM   r6   rv   )r    r1   rz   r{   optionsobjru   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)rU   )rm   r	   ra   r0   r4   rM   r6   rv   )r    r   ru   r#   r#   r$   track_cell_new   s   zSideEffects.track_cell_newr   c                 C   .   t jt|d}|| jt|< | j| |S r   )r	   ra   r.   r4   rM   r6   rv   r    r   rO   ru   r#   r#   r$   track_cell_existing     zSideEffects.track_cell_existingc                 C   r   r   )r	   NewGlobalVariabler.   r4   rM   r6   rv   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   )r;   r	   rS   r7   rv   )r    ctxargsr#   r#   r$   track_save_for_backward  s   z#SideEffects.track_save_for_backwardc                 C   sD   |j D ]}t|}|j| }|| jvrt|tjr| || qd S r   )r6   rM   r4   r;   r	   TensorVariablery   )r    r9   
other_itemother_idother_variabler#   r#   r$   1track_tensor_variables_from_runahead_side_effects  s   

z=SideEffects.track_tensor_variables_from_runahead_side_effectsc                    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 d S d S d S r   )r;   rU   r0   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 rt   )r;   r0   r   rU   r   )is_liver   r#   r$   r   3  s
   


z2SideEffects.prune_dead_object_new.<locals>.is_livec                    s   i | ]\}} |r||qS r#   r#   rD   r   r#   r$   rH   B  
    z5SideEffects.prune_dead_object_new.<locals>.<dictcomp>c                    s   i | ]\}} |r||qS r#   r#   rD   r   r#   r$   rH   E  r   )setr   r   r   r   stacksymbolic_localsr4   valuesr;   rU   r0   r5   rI   )r    txr   r   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 d S rt   )rV   r;   rU   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   )rE   r   rK   r#   r$   
<listcomp>O  s    z2SideEffects._get_modified_vars.<locals>.<listcomp>)r4   r   rK   r#   rK   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 |d	 |D ]}|| q|
g tt|td
 qd S )N	make_cellr   Tz'AutogradFunctionContextVariable escaped__call_nn_module_initr   r   r   r7   POP_TOP)r   r;   rU   r.   r0   r	   ra   load_import_fromr   r&   extend_outputr
   	add_cacher   tempvarsr   rS   r   r5   rq   UnspecializedNNModuleVariabler1   r7   load_methodr   lenr   )r    r   r   r   r   argr#   r#   r$   codegen_save_tempvarsQ  sV   









z!SideEffects.codegen_save_tempvarsc                 C   s   t |tjsJ t |tjsJ t |tjr|jsJ ttj|s#J t	| j
 }|| j
v r8|d7 }|| j
v s/||||f| j
|< |jrFJ ||_d S )Nr   )r;   r	   r   r   RemovableHandleVariablerU   hasattrr}   Tensorr   r8   r=   idx)r    tensorhookhandlerW   r   r#   r#   r$   register_hook{  s   




zSideEffects.register_hookc                 C   s   | j |= d S r   )r8   )r    r   r#   r#   r$   remove_hook  rp   zSideEffects.remove_hookc                 C   sf   | j  D ]+\}}}}|jsJ d|| |||g || |tdd || qd S )Nz4Hooks on non input tensors NYI - should not get herer   T)r8   r   r   r   create_load_attrr
   r   )r    r   r   r   r   rW   r#   r#   r$   codegen_hooks  s   #zSideEffects.codegen_hooksc              	   C   s  g }|   D ]f}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g ||dd ||jj |tdg |	g td	td
tdtd
 q| |r@| j|ji  D ]\}}t|tjr|jj| || t|jjtsJ |	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 qt|tjr#| r#|dd |d ||jj |t| || |	g tdtd
 q|jj| || ||jj |	td|dg qqt|tjrht |j!D ]}|t"j#d ||jj |$dd |%  qLqt&t'|t(|D ]}|| qrd S )NF)allow_cacheBUILD_SLICE   )r   STORE_SUBSCRclearupdater   r   r   STORE_GLOBAL)argvalr   rX   DELETE_ATTRbuiltinsrm   __setattr__   
STORE_ATTR	iter_nextT))r   r;   r	   ListVariablerU   r   r   create_load_constr   rv   ConstDictVariabler   outputupdate_co_namesr   r   rY   r5   rq   rI   r   r   r[   r.   r   getattrUserDefinedObjectVariableneeds_slow_setattrr   r   ConstantVariableTupleIteratorVariablerangeindexr   r&   call_functionpop_topAssertionErrortypereversed)r    r   suffixesr   rW   rX   _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   r4   r   r8   r7   rK   r#   r#   r$   is_empty  s   zSideEffects.is_emptyc                 C   s   | j   | j  d S r   )r6   r   r4   rK   r#   r#   r$   r     s   
zSideEffects.clear)NNNNNr%   )9r&   r'   r(   r)   r   intr   __annotations__r   strr   r   r   rm   r*   r<   r   rB   rL   rP   rR   rV   rZ   r^   rc   re   rh   ri   staticmethodro   rY   rr   rs   r   r   rx   track_mutablery   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r+   r#   r#   r!   r$   r3   >   s~   
 





!*2Wr3   )&rk   r   typingr   r   r   r   r   torch.nnr}    r   r	   bytecode_transformationr
   r   r   r   codegenr   excr   r   r   r   r   r   r   variables.baser   r   r   r   r   r,   r.   r0   r3   r#   r#   r#   r$   <module>   s    
