U
    ªÊ¹jÆB  ã                   @   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/bwave/python/venv/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rˆd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ƒr”tdƒ d| j |ji ¡krÈt|tjƒs¸t‚| 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�rxn–t|tjƒ�rØt|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   
