U
    9%eB                     @   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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__ Y/var/www/html/Darija-Ai-API/env/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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(   &   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   1   s    z"AttributeMutationExisting.__init__r"   r#   r$   r   r   r'   r    r    r   r!   r*   0   s   r*   c                       s$   e Zd Z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   7   s    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< dQ fdd	Zeedd	d
Zd ee	 dddZdd Zddd fddZdd Zdd Zdd Zee	edddZdRd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/d0 Z!e"fe#eed1d2d3Z$e$Z%e$Z&e#eed1d4d5Z'e#eed6d7d8Z(d9d: Z)e#ed;d<d=Z*e#ed;d>d?Z+d@dA Z,dBdC Z-dDdE Z.dFdG Z/e0dHdIdJZ1e0dHdKdLZ2dMdN Z3dOdP Z4  Z5S )S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 | _|p6g | _d S r   )r   r   collectionsOrderedDictr/   r0   r1   save_for_backward)r   r/   r0   r1   r4   r   r    r!   r   F   s
    

zSideEffects.__init__)otherreturnc                 C   s2   t |tst| j|jko0| j|jko0| j|jkS r   )
isinstancer.   AssertionErrorr/   r0   r4   )r   r5   r    r    r!   __eq__S   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 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   )r/   keysr0   r4   )r   r5   Zsk_itvZok_itvZsk_samZ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   )r2   r3   .0kvr    r    r!   	<genexpr>t   s   z$SideEffects.clone.<locals>.<genexpr>)r/   r0   r1   r4   )	r   r2   r3   r/   r0   itemslistr1   r4   r   r    r    r!   clonep   s    

zSideEffects.clonec                 C   s   dS )NFr    )_r    r    r!   <lambda>|       zSideEffects.<lambda>c                    sn    d krt   t fdd| j D | _t fdd| j D | _t| j | _d S )Nc                 3   s&   | ]\}}|t | fV  qd S r   r   applyr<   cachefnskip_fnr    r!   r@      s   z$SideEffects.apply.<locals>.<genexpr>c                 3   s&   | ]\}}|t | fV  qd S r   rH   r<   rJ   r    r!   r@      s   )	dictr2   r3   r/   rA   r0   r   rI   r4   )r   rL   rK   rM   r    rJ   r!   rI   |   s    

   zSideEffects.applyc                 C   s   t || jkS r   )idr/   r   itemr    r    r!   __contains__   s    zSideEffects.__contains__c                 C   s   | j t| S r   )r/   rO   rP   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.miscrT   r7   r   mutable_localr   )r   rQ   rT   r    r    r!   check_allowed_side_effect   s    

z%SideEffects.check_allowed_side_effect)rQ   namevaluec                 C   sH   |  |st| | |j| jkr4t | j|j< || j|j |< d S r   )is_attribute_mutationr8   rV   rU   r0   r2   r3   )r   rQ   rW   rX   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)rY   r8   r0   rU   r7   r   DeletedVariabler   )r   rQ   rW   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)r7   r   NewCellVariabler8   r   rZ   )r   cellvarrX   r    r    r!   
store_cell   s    zSideEffects.store_cellc                 C   s   t |tjst| |dS r^   )r7   r   r`   r8   r]   )r   ra   r    r    r!   	load_cell   s    zSideEffects.load_cell)gvarrW   c                 C   s   t |tjst| ||S r   )r7   r   r   r8   r]   )r   rd   rW   r    r    r!   load_global   s    zSideEffects.load_global)rd   rW   rX   c                 C   s2   t |tjstt |tjs t| ||| d S r   )r7   r   r   r8   rZ   )r   rd   rW   rX   r    r    r!   store_global   s    zSideEffects.store_globalc                 C   s   t | dd tjtjjjfkS )N__setattr__)inspectgetattr_staticobjectrg   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   )r7   rU   r(   rP   r    r    r!   rY      s    z!SideEffects.is_attribute_mutationc                 C   s   |  |ot| j|jS r   )rY   r&   r0   getrU   rP   r    r    r!   has_pending_mutation   s    z SideEffects.has_pending_mutationc                 C   s.   t |jtrdS | |r&|j| jkS |jjS NT)r7   rU   r,   rY   r0   r   rP   r    r    r!   r      s
    
zSideEffects.is_modified)r   rQ   variablec                 C   s0   |j |||d}|| jt|< | j| |S )z*Start tracking a new variable for mutation)rU   r   )rD   r/   rO   r1   append)r   r   rQ   rs   mutable_clsr    r    r!   
_track_obj   s    zSideEffects._track_objc                 C   s   | j |||tdS )N)ru   )rv   r*   r   r   rQ   rs   r    r    r!   track_object_existing   s       z!SideEffects.track_object_existing)r-   user_clsvariable_clsc                 C   sr   |t jjjkrt j }n t|t jjr2t|}nt	|}||fdt
d |i|}|| jt|< | j| |S )NrU   )rk   ZautogradfunctionZFunctionCtxFunction
issubclassrl   rm   r   r   r,   r/   rO   r1   rt   )r   r-   ry   rz   optionsobjrs   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   )rj   r   r`   r,   r/   rO   r1   rt   )r   r   rs   r    r    r!   track_cell_new  s    zSideEffects.track_cell_new)r   rQ   c                 C   s.   t jt|d}|| jt|< | j| |S r   )r   r`   r*   r/   rO   r1   rt   rw   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*   r/   rO   r1   rt   rw   r    r    r!   track_global_existing  s    z!SideEffects.track_global_existingc                 C   s$   t |tjst| j||f d S r   )r7   r   rT   r8   r4   rt   )r   ctxargsr    r    r!   track_save_for_backward  s    z#SideEffects.track_save_for_backwardc                    s   t  d tdfdd}td fdd t||j|jf | j D ]}t|jt	sPt|| qP| j
 D ]\}t|| qxt fdd| j D | _t fdd| j
 D | _
d S )	Nvarc                    s&   t | jtr"| jk	r" | j | S r   )r7   rU   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 rr   )r7   r,   r   rU   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    r<   r   r    r!   r@   >  s     z4SideEffects.prune_dead_object_new.<locals>.<genexpr>c                 3   s"   | ]\}} |r||fV  qd S r   r    r<   r   r    r!   r@   A  s     )setr   rI   stackZsymbolic_localsr/   valuesr7   rU   r,   r0   rA   r2   r3   )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   )rV   rD   r   rU   r   )r   ZoldvarZnewvarr    r    r!   mutationE  s    
zSideEffects.mutationc                    s    fdd j  D S )Nc                    s   g | ]}  |r|qS r    )r   )r=   r   rC   r    r!   
<listcomp>L  s     
 z2SideEffects._get_modified_vars.<locals>.<listcomp>)r/   r   rC   r    rC   r!   _get_modified_varsK  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 ]X\}}||j |
td	d
dg |D ]}|| qx|
tt|tdf qNd S )NZ	make_cellr   Tz'AutogradFunctionContextVariable escaped__call_nn_module_initr   r   r   LOAD_METHODr4   argvalPOP_TOP)r   r7   rU   r*   r,   r   r`   Zload_import_fromr   r"   extend_outputr	   Z	add_cacher   Ztempvarsr   rT   r   r0   rp   ZUnspecializedNNModuleVariabler8   r-   r4   r   r
   len)r   r   r   r   r   argr    r    r!   codegen_save_tempvarsN  sT     

 



z!SideEffects.codegen_save_tempvarsc              	   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	dd
g ||dd ||jj |td	dd
g |	tdtdftdtdf q| |r| j|ji  D ]\}}t|tjrl|jj| || |	td|d
g n|dkrxnt|tjrt|jtrtt|dd |r|jj| ||jj |	td|d
g n6|jj| || ||jj |	td|d
g q*qtt|qt|D ]}|| q*d S )NF)Zallow_cacheBUILD_SLICE   )r   STORE_SUBSCRclearupdater   r   r   r   r   STORE_GLOBALr   rX   DELETE_ATTR
STORE_ATTR)r   r7   r   ZListVariablerU   r   r   Zcreate_load_constr   rt   ZConstDictVariabler   outputZupdate_co_namesr
   rY   r0   rp   rA   r   r[   r*   hasattrgetattrr8   typereversed)r   r   suffixesr   rW   rX   suffixr    r    r!   codegen_update_mutatedz  sx    
 
 z"SideEffects.codegen_update_mutatedc                 C   s   t t| j| j p| j S r   )anymapr   r/   r   r4   rC   r    r    r!   is_empty  s    zSideEffects.is_emptyc                 C   s   | j   | j  d S r   )r1   r   r/   rC   r    r    r!   r     s    
zSideEffects.clear)NNNN)F)6r"   r#   r$   r%   r   intr   __annotations__r(   strr   r   r   rj   r&   r9   r   r;   rD   rI   rR   rS   rV   rZ   r]   rb   rc   re   rf   staticmethodro   rY   rq   r   r   r   rv   Z
track_listZ
track_dictrx   r   r   r   r   r   r   r   r   r   r   r   r   r   r'   r    r    r   r!   r.   <   sl   
    	

",Cr.   )#r2   rh   typingr   r   r   r   Ztorch.nnrk    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,   r.   r    r    r    r!   <module>   s   
