o
    hv                     @   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                   @      e Zd ZdS )ArgMappingExceptionN__name__
__module____qualname__ r   r   W/var/www/html/ai/venv/lib/python3.10/site-packages/torch/_dynamo/variables/optimizer.pyr          r   c                   @   r   )GuardInstallExceptionNr   r   r   r   r   r      r   r   c                       sd   e Zd Zd fdd	Z							d fd
dZ fddZdd Zdd Zdd Zdd Z	  Z
S )OptimizerVariableNc                    sV   t  j|fi | | jjD ]
}d|v rd|d< q|d u r i | _|d u r)i | _d S d S )N
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__argsList[VariableTracker]r%   Dict[str, VariableTracker]returnr   c              
      s   |dkr?z&| j |i |\}}| jj|i | | | | ||||| tdW S  ttfy> } zW Y d}~nd}~ww 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   r1   '   s   

zOptimizerVariable.call_methodc                    s    |dkr	t | |S t ||S )Nr-   )r   r   var_getattr)r$   r2   r3   r'   r   r   r7   <   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                    sn   t | tr	|  S t | tr| jsg S t | tr4t | jtr4t | jjt	r4| jjj
dkr4 jj| jj S t )Nr!   )
isinstancer   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   ).0r?   r@   r   r   
<listcomp>T   s    z5OptimizerVariable.get_python_args.<locals>.<listcomp>c                    s   i | ]	\}}| |qS r   r   )rA   kvrB   r   r   
<dictcomp>U   s    z5OptimizerVariable.get_python_args.<locals>.<dictcomp>)r:   )r$   r)   r%   new_args
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 ]3\}}tt| j	d|}t|d D ]\}}tt|d|}|| j|< |j
d urDt|d| j|j
< q%qt }	t| j	d}
|	|
tj | jj D ][\}}|t|| t|
| j| }|	|tj | D ]9\}}t|tjr|| jvr|| jvrt||| j|< q|d u st|ttttfr|	t||tj qt q^|jj|	 ||t| j	d| jj}|jj|j d S )Nr
   VariableBuilderr!   paramsgradstate) builderrJ   r"   r#   	enumerater    r!   r   r   r;   rL   setadd
make_guardr   	DICT_KEYSrM   r:   store_dict_keyr	   r8   torchTensorboolintfloatstrCONSTANT_MATCHr   outputguardsupdate)r$   r2   rJ   g_indr&   group_sourcep_indpparam_sourcer]   state_sourcer    p_state_sourcerD   rE   group_guardsr   r   r   r/   Y   sV   






z0OptimizerVariable.map_sources_and_install_guardsc                 C   sn   ddl m} || jv r||| j| |S || jv r$||| j| |S |t|| ||tt||S )z%Wrap state tensor in a TensorVariabler
   rI   )rN   rJ   r#   r"   rT   r	   r   )r$   r2   tensor_valuerJ   r   r   r   wrap_tensor   s   

zOptimizerVariable.wrap_tensorc           	         s`   t ||D ](\}}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)r8   rU   rV   rA   tr   r   r   	<genexpr>   s    
z5OptimizerVariable.update_list_args.<locals>.<genexpr>c                    s   g | ]}  |qS r   )rh   ri   r$   r2   r   r   rC      s    z6OptimizerVariable.update_list_args.<locals>.<listcomp>)mutable_localrecursively_containsN)zipr8   r   allr   replace_all)	r$   r2   r)   r%   r4   r5   r?   py_argtensor_varsr   rl   r   r0      s   z"OptimizerVariable.update_list_args)NN)r)   r*   r%   r+   r,   r   )r   r   r   r   r1   r7   r.   r/   rh   r0   __classcell__r   r   r'   r   r      s    3r   )typingr   r   rU   r]   r   r;   r   r   r   utilsr	   r<   r   r   constantr   dictsr   listsr   miscr   user_definedr   	Exceptionr   r   r   r   r   r   r   <module>   s    