o
    hB                     @   s   d dl Z d dlZd dl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   )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__ P/var/www/html/ai/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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)   &   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   1      
z"AttributeMutationExisting.__init__r#   r$   r%   r   r   r(   r    r    r   r!   r+   0   s    r+   c                       s&   e Zd Zdedef fddZ  ZS )AttributeMutationNewr   
cls_sourcec                    s   t  tj| || _d S r   )r   r   r   Localr/   )r   r   r/   r   r    r!   r   7   r,   zAttributeMutationNew.__init__r-   r    r    r   r!   r.   6   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< 				dU 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dVd 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Z1dLe0fdOdPZ2dQdR Z3dSdT Z4  Z5S )W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
t | _|pt | _|pg | _|pg | _d S r   )r   r   collectionsOrderedDictr2   r3   r4   save_for_backward)r   r2   r3   r4   r7   r   r    r!   r   F   s
   

zSideEffects.__init__otherreturnc                 C   s2   t |tsJ | j|jko| j|jko| j|jkS r   )
isinstancer1   r2   r3   r7   )r   r8   r    r    r!   __eq__S   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 diffr7   )r2   keysr3   r7   )r   r8   sk_itvok_itvsk_samok_samr    r    r!   diff\   s   



zSideEffects.diffc                 C   s8   | j t| jtdd | j D t| j| jdS )zCreate a shallow copyc                 s   s"    | ]\}}|t |fV  qd S r   )r5   r6   .0kvr    r    r!   	<genexpr>t   s
    
z$SideEffects.clone.<locals>.<genexpr>)r2   r3   r4   r7   )	r   r5   r6   r2   r3   itemslistr4   r7   r   r    r    r!   clonep   s   

zSideEffects.clonec                 C   s   dS )NFr    )_r    r    r!   <lambda>|   s    zSideEffects.<lambda>c                    sn    d u rt   t fdd| j D | _t fdd| j D | _t| j | _d S )Nc                 3   (    | ]\}}|t | fV  qd S r   r   applyrB   cachefnskip_fnr    r!   rF      
    
z$SideEffects.apply.<locals>.<genexpr>c                 3   rM   r   rN   rB   rP   r    r!   rF      rT   )	dictr5   r6   r2   rG   r3   r   rO   r7   )r   rR   rQ   rS   r    rP   r!   rO   |   s   



zSideEffects.applyc                 C   s   t || jv S r   )idr2   r   itemr    r    r!   __contains__      zSideEffects.__contains__c                 C   s   | j t| S r   )r2   rV   rW   r    r    r!   __getitem__   rZ   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.miscr\   r:   r   mutable_localr   )r   rX   r\   r    r    r!   check_allowed_side_effect   s   

z%SideEffects.check_allowed_side_effectrX   namevaluec                 C   sH   |  |sJ | | |j| jvrt | j|j< || j|j |< d S r   )is_attribute_mutationr_   r^   r3   r5   r6   )r   rX   r`   ra   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)rb   r3   r^   r:   r   DeletedVariabler   )r   rX   r`   
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   rc   )r   cellvarra   r    r    r!   
store_cell      zSideEffects.store_cellc                 C   s   t |tjsJ | |dS rh   )r:   r   rj   rg   )r   rk   r    r    r!   	load_cell      zSideEffects.load_cellgvarc                 C   s   t |tjsJ | ||S r   )r:   r   r   rg   )r   rp   r`   r    r    r!   load_global   ro   zSideEffects.load_globalc                 C   s2   t |tjsJ t |tjsJ | ||| d S r   )r:   r   r   rc   )r   rp   r`   ra   r    r    r!   store_global   rm   zSideEffects.store_globalc                 C   s   t | dd tjtjjjfv S )N__setattr__)inspectgetattr_staticobjectrs   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   )r:   r^   r)   rW   r    r    r!   rb      s   z!SideEffects.is_attribute_mutationc                 C   s   |  |ot| j|jS r   )rb   r'   r3   getr^   rW   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)r:   r^   r.   rb   r3   r   rW   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)r^   r   )rJ   r2   rV   r4   append)r   r   rX   r   mutable_clsr    r    r!   
_track_obj   s   zSideEffects._track_objc                 C   s   | j |||tdS )N)r   )r   r+   r   r   rX   r   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 )Nr^   )rw   autogradfunctionFunctionCtxFunction
issubclassrx   ry   r   r   r.   r2   rV   r4   r   )r   r/   r   r   optionsobjr   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r^   )rv   r   rj   r.   r2   rV   r4   r   )r   r   r   r    r    r!   track_cell_new  s   zSideEffects.track_cell_newc                 C   .   t jt|d}|| jt|< | j| |S r   )r   rj   r+   r2   rV   r4   r   r   r    r    r!   track_cell_existing     zSideEffects.track_cell_existingc                 C   r   r   )r   NewGlobalVariabler+   r2   rV   r4   r   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   r\   r7   r   )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f fdd t||j|jf | j D ]}t|jt	s6t|| q(| j
 D ]
\}t|| q<t fdd| j D | _t fdd| j
 D | _
d S )	Nvarc                    s&   t | jtr| jur | j | S r   )r:   r^   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 r~   )r:   r.   r   r^   r   )is_liver   r    r!   r   /  s
   


z2SideEffects.prune_dead_object_new.<locals>.is_livec                 3   s$    | ]\}} |r||fV  qd S r   r    rB   r   r    r!   rF   >      
z4SideEffects.prune_dead_object_new.<locals>.<genexpr>c                 3   s$    | ]\}} |r||fV  qd S r   r    rB   r   r    r!   rF   A  r   )setr   rO   stacksymbolic_localsr2   valuesr:   r^   r.   r3   rG   r5   r6   )r   txr   r   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   )r_   rJ   r   r^   r   )r   oldvarnewvarr    r    r!   mutationE  s   
zSideEffects.mutationc                    s    fdd j  D S )Nc                    s   g | ]	}  |r|qS r    )r   )rC   r   rI   r    r!   
<listcomp>L  s    z2SideEffects._get_modified_vars.<locals>.<listcomp>)r2   r   rI   r    rI   r!   _get_modified_varsK  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 )N	make_cellr   Tz'AutogradFunctionContextVariable escaped__call_nn_module_initr   r   r   LOAD_METHODr7   argvalPOP_TOP)r   r:   r^   r+   r.   r   rj   load_import_fromr   r#   extend_outputr	   	add_cacher   tempvarsr   r\   r   r3   r|   UnspecializedNNModuleVariabler/   r7   r   r
   len)r   r   r   r   r   argr    r    r!   codegen_save_tempvarsN  sZ   








z!SideEffects.codegen_save_tempvarsc              	   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)allow_cacheBUILD_SLICE   )r   STORE_SUBSCRclearupdater   r   r   r   r   STORE_GLOBALr   ra   DELETE_ATTR
STORE_ATTR)r   r:   r   ListVariabler^   r   r   create_load_constr   r   ConstDictVariabler   outputupdate_co_namesr
   rb   r3   r|   rG   r   rd   r+   hasattrgetattrAssertionErrortypereversed)r   r   suffixesr   r`   ra   suffixr    r    r!   codegen_update_mutatedz  s   

z"SideEffects.codegen_update_mutatedc                 C   s   t t| j| j p| j S r   )anymapr   r2   r   r7   rI   r    r    r!   is_empty  s   zSideEffects.is_emptyc                 C   s   | j   | j  d S r   )r4   r   r2   rI   r    r    r!   r     s   
zSideEffects.clear)NNNNr"   )6r#   r$   r%   r&   r   intr   __annotations__r)   strr   r   r   rv   r'   r;   r   rA   rJ   rO   rY   r[   r_   rc   rg   rl   rn   rq   rr   staticmethodr{   rb   r}   r   r   r   r   
track_list
track_dictr   r   r   r   r   r   r   r   r   r   r   r   r   r   r(   r    r    r   r!   r1   <   s~   
 	





",Cr1   )#r5   rt   typingr   r   r   r   torch.nnrw    r   r   bytecode_transformationr	   r
   r   codegenr   excr   r   r   r   r   r   variables.baser   r   r   r   r   r)   r+   r.   r1   r    r    r    r!   <module>   s     
