o
    I&i!                     @   s   d dl Z d dlmZmZ d dlZddlm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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 )    N)DictList   )mark_static_address)GuardBuilderinstall_guard)
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   LC:\wamp64\www\opt\env\Lib\site-packages\torch/_dynamo/variables/optimizer.pyr          r   c                   @   r   )GuardInstallExceptionNr   r   r   r   r   r      r   r   c                       sz   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	dd Z
dd Z  ZS )OptimizerVariableNc                    sp   t  j|fi | | jjD ]}d|v rd|d< |d D ]}t|dd qq|p)i | _|p.i | _|p4t | _d S )NZ
capturableTparamsFguard)	super__init__valueparam_groupsr   grad_to_sourcetensor_to_sourcesetstatic_tensor_names)selfr$   r&   r)   r'   kwargsgroupp	__class__r   r   r#      s   

zOptimizerVariable.__init__argsList[VariableTracker]r+   Dict[str, VariableTracker]returnr   c           	   
      s   |dkrNz5| j |i |\}}| jj|i |}| | | ||||| ||  | j | | t	|W S  t
tfyM } zW Y d}~nd}~ww t ||||S )zVThis is an optimization to avoid tracing the very slow initialization of the optimizer_init_groupN)get_python_argsr$   r4   map_sources_and_install_guardsupdate_list_argsstore_global_weakrefget_global_namecreate_finalizerr   creater   r   r"   call_method)	r*   txnamer0   r+   py_args	py_kwargsZret_val_r.   r   r   r<   1   s   

zOptimizerVariable.call_methodc                    s    |dkr	t | |S t ||S )Nr4   )r   r"   var_getattr)r*   r=   r>   r.   r   r   rB   O   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   Zas_python_constantr   itemsr   sourcer	   baser   memberr$   r%   indexr   )argr*   r   r   map_argX   s   

z2OptimizerVariable.get_python_args.<locals>.map_argc                    s   g | ]} |qS r   r   ).0rI   rK   r   r   
<listcomp>g   s    z5OptimizerVariable.get_python_args.<locals>.<listcomp>c                    s   i | ]	\}}| |qS r   r   )rL   kvrM   r   r   
<dictcomp>h   s    z5OptimizerVariable.get_python_args.<locals>.<dictcomp>)rD   )r*   r0   r+   new_argsZ
new_kwargsr   )rK   r*   r   r5   U   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| j	d}	t|	tj | jj D ]Y\}}
|t|| t|	| j| }t|tj |
 D ]8\}}t|tjr|| jvr|| jvrt||| j|< qz|d u st|ttttfrtt||tj qzt qZ||t| j	d| jj  d S )Nr   VariableBuilderr%   r   gradstate)builderrT   r&   r'   	enumerater$   r%   r	   r   rE   rU   r   Z
make_guardr   Z	DICT_KEYSrV   rD   r8   r   rC   torchTensorboolintfloatstrZCONSTANT_MATCHr   Zrecursive_realize)r*   r=   rT   Zg_indr,   Zgroup_sourceZp_indr-   Zparam_sourceZstate_sourcer$   Zp_state_sourcerO   rP   r   r   r   r6   l   sR   







z0OptimizerVariable.map_sources_and_install_guardsc                 C   s   ddl m} || jv r%t|dd ||| j| }| j|j|j n0|| j	v r3||| j	| }n"t|dd |
t|| ||tt|}| j|j|j ||}|S )z%Wrap state tensor in a TensorVariabler   rS   Fr    )rW   rT   r'   r   r)   addoutputZmodule_key_namer>   r&   r8   r   r
   )r*   r=   Ztensor_valuerT   rW   resultr   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 d}|| qdS )z7Update the args and kwargs to the traced optimizer callc                 s   s    | ]	}t |tjV  qd S N)rC   rY   rZ   rL   tr   r   r   	<genexpr>   s    
z5OptimizerVariable.update_list_args.<locals>.<genexpr>c                    s   g | ]}  |qS r   )rb   rd   r*   r=   r   r   rN      s    z6OptimizerVariable.update_list_args.<locals>.<listcomp>)Zmutable_localN)ziprC   r   allr   Zreplace_all)	r*   r=   r0   r+   r?   r@   rI   Zpy_argZtensor_varsr   rg   r   r7      s   z"OptimizerVariable.update_list_argsc                    s4   | j  | j|jj fdd}|j| d S )Nc                    s     fdd}t | d S )Nc                     s:   D ]}  j | d   j| d  jrj  qd S rc   )_bufferspop_parametersZparams_flatclear)r>   )gmnames_to_deletetcr   r   clear_static_tensor_refs   s   
z\OptimizerVariable.create_finalizer.<locals>.init_finalizer.<locals>.clear_static_tensor_refs)weakreffinalize)rn   rq   ro   rp   r$   )rn   r   init_finalizer   s   z:OptimizerVariable.create_finalizer.<locals>.init_finalizer)r)   r$   r`   Ztracing_contextZadd_graph_finalizer)r*   r=   ru   r   rt   r   r:      s
   
z"OptimizerVariable.create_finalizerc                 C   s   dt | j S )NZ__optimizer_)idr$   rJ   r   r   r   r9      s   z!OptimizerVariable.get_global_name)NNN)r0   r1   r+   r2   r3   r   )r   r   r   r#   r<   rB   r5   r6   rb   r7   r:   r9   __classcell__r   r   r.   r   r      s&    0r   )!rr   typingr   r   rY   Z
decoratorsr   Zguardsr   r   rE   r   r	   r
   utilsr   rF   r   r   Zconstantr   Zdictsr   listsr   miscr   Zuser_definedr   	Exceptionr   r   r   r   r   r   r   <module>   s     