U
    ªÊ¹jv  ã                   @   sÄ   d dl mZmZ d dlZddlmZ ddlmZmZm	Z	 ddl
mZ ddlmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ G dd„ deƒZG dd„ deƒZG dd„ deƒZdS )é    )ÚDictÚListNé   )ÚGuardBuilder)Ú
AttrSourceÚGetItemSourceÚGlobalWeakRefSource)Úglobal_key_nameé   )ÚMutableLocalÚVariableTracker)ÚConstantVariable)ÚConstDictVariable)ÚListVariable)ÚGetAttrVariable)ÚUserDefinedObjectVariablec                   @   s   e Zd ZdS )ÚArgMappingExceptionN©Ú__name__Ú
__module__Ú__qualname__© r   r   ú`/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/_dynamo/variables/optimizer.pyr      s   r   c                   @   s   e Zd ZdS )ÚGuardInstallExceptionNr   r   r   r   r   r      s   r   c                       s`   e Zd Zd‡ fdd„	Zddddœ‡ fdd	„Z‡ fd
d„Zdd„ Zdd„ Zdd„ Zdd„ Z	‡  Z
S )ÚOptimizerVariableNc                    sN   t ƒ j|f|Ž | jjD ]}d|krd|d< q|d kr<i | _|d krJi | _d S )NZ
capturableT)ÚsuperÚ__init__ÚvalueÚparam_groupsÚgrad_to_sourceÚtensor_to_source)Úselfr   r   r    ÚkwargsÚgroup©Ú	__class__r   r   r      s    
zOptimizerVariable.__init__zList[VariableTracker]zDict[str, VariableTracker]r   )Úargsr"   Úreturnc              
      s†   |dkrtzD| j ||Ž\}}| jj||Ž |  |¡ |  |||||¡ tdƒW S  ttfk
rr } zW 5 d}~X Y nX tƒ  	||||¡S )zUThis is an optimization to avoid tracing the very slow intialization of the optimizerÚ_init_groupN)
Úget_python_argsr   r(   Úmap_sources_and_install_guardsÚupdate_list_argsr   r   r   r   Úcall_method)r!   ÚtxÚnamer&   r"   Úpy_argsÚ	py_kwargsÚ_r$   r   r   r,   '   s    

zOptimizerVariable.call_methodc                    s    |dkrt | |ƒS tƒ  ||¡S )Nr(   )r   r   Úvar_getattr)r!   r-   r.   r$   r   r   r2   <   s    
zOptimizerVariable.var_getattrc                    s<   ‡fdd„‰ ‡ fdd„|D ƒ}‡ fdd„|  ¡ D ƒ}||fS )z9Get python values equivalent to the variable tracker argsc                    sr   t | tƒr|  ¡ S t | tƒr&| js&g S t | tƒrht | jtƒrht | jjt	ƒrh| jjj
dkrhˆ jj| jj S tƒ ‚d S )Nr   )Ú
isinstancer   Zas_python_constantr   Úitemsr   Úsourcer   Úbaser   Úmemberr   r   Úindexr   )Úarg)r!   r   r   Úmap_argE   s    
ÿ
þýüz2OptimizerVariable.get_python_args.<locals>.map_argc                    s   g | ]}ˆ |ƒ‘qS r   r   )Ú.0r9   ©r:   r   r   Ú
<listcomp>T   s     z5OptimizerVariable.get_python_args.<locals>.<listcomp>c                    s   i | ]\}}|ˆ |ƒ“qS r   r   )r;   ÚkÚvr<   r   r   Ú
<dictcomp>U   s      z5OptimizerVariable.get_python_args.<locals>.<dictcomp>)r4   )r!   r&   r"   Únew_argsZ
new_kwargsr   )r:   r!   r   r)   B   s    z!OptimizerVariable.get_python_argsc                 C   s¼  ddl m} i | _i | _t| jjƒD ]f\}}tt| j	dƒ|ƒ}t|d ƒD ]>\}}tt|dƒ|ƒ}|| j|< |j
d k	rJt|dƒ| j|j
< qJq$tƒ }	t| j	dƒ}
|	 |
 tj¡¡ | jj ¡ D ]Â\}}| t|ƒ|¡ t|
| j| ƒ}|	 | tj¡¡ | ¡ D ]~\}}t|tjƒ�r>|| jk�r>|| jk�r>t||ƒ| j|< qþ|d k�s\t|ttttfƒ�rv|	 t||ƒ tj¡¡ qþtƒ ‚qþq¼|jj |	¡ ||t| j	dƒƒ| jjƒ}|jj |j¡ d S )Nr
   ©ÚVariableBuilderr   ÚparamsÚgradÚstate) ÚbuilderrC   r   r    Ú	enumerater   r   r   r   r5   rE   ÚsetÚaddZ
make_guardr   Z	DICT_KEYSrF   r4   Ústore_dict_keyr	   r3   ÚtorchÚTensorÚboolÚintÚfloatÚstrZCONSTANT_MATCHr   ÚoutputÚguardsÚupdate)r!   r-   rC   Zg_indr#   Zgroup_sourceZp_indÚpZparam_sourcerS   Zstate_sourcer   Zp_state_sourcer>   r?   Zgroup_guardsr   r   r   r*   Y   sV     ÿ

þ
ÿþý
ÿÿ
ÿz0OptimizerVariable.map_sources_and_install_guardsc                 C   sr   ddl m} || jkr*||| j| ƒ|ƒS || jkrH||| j| ƒ|ƒS | t|ƒ|¡ ||tt|ƒƒƒ|ƒS dS )z%Wrap state tensor in a TensorVariabler
   rB   N)rG   rC   r    r   rK   r	   r   )r!   r-   Ztensor_valuerC   r   r   r   Úwrap_tensorŒ   s    
ÿ
 
ÿþzOptimizerVariable.wrap_tensorc           	         s`   t ||ƒD ]P\}}t|tƒr
tdd„ |D ƒƒr
t‡ ‡fdd„|D ƒtƒ i d�}ˆ ||¡ q
dS )z7Update the args and kwargs to the traced optimizer callc                 s   s   | ]}t |tjƒV  qd S )N)r3   rL   rM   ©r;   Útr   r   r   Ú	<genexpr>£   s    z5OptimizerVariable.update_list_args.<locals>.<genexpr>c                    s   g | ]}ˆ   ˆ|¡‘qS r   )rV   rW   ©r!   r-   r   r   r=   §   s     z6OptimizerVariable.update_list_args.<locals>.<listcomp>)Zmutable_localZrecursively_containsN)Úzipr3   r   Úallr   Zreplace_all)	r!   r-   r&   r"   r/   r0   r9   Zpy_argZtensor_varsr   rZ   r   r+       s    ÿýz"OptimizerVariable.update_list_args)NN)r   r   r   r   r,   r2   r)   r*   rV   r+   Ú__classcell__r   r   r$   r   r      s   ú3r   )Útypingr   r   rL   rS   r   r5   r   r   r   Úutilsr	   r6   r   r   Zconstantr   Zdictsr   Úlistsr   Úmiscr   Zuser_definedr   Ú	Exceptionr   r   r   r   r   r   r   Ú<module>   s   