U
    zh6                     @   s   d dl Z d dlmZ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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 ddlmZ erd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TYPE_CHECKING)tree_map_only   )GuardBuilderinstall_guard)
AttrSourceConstDictKeySourceGetItemSourceGlobalWeakRefSource
GradSource)GLOBAL_KEY_PREFIX   )ConstantVariable)ConstDictVariable)ListVariable)GetAttrVariable)UserDefinedObjectVariable)VariableTrackerc                   @   s   e Zd ZdS )ArgMappingExceptionN__name__
__module____qualname__ r   r   S/var/www/html/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ddhej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dd Zdd Zdd Zdd Z  ZS ) OptimizerVariablegrad_to_sourcetensor_to_sourcestatic_tensor_namesNc                    s4   t  j|f| |pi | _|p i | _|p,t | _d S N)super__init__r   r    setr!   )selfvaluer   r!   r    kwargs	__class__r   r   r$   -   s    

zOptimizerVariable.__init__zList[VariableTracker]zDict[str, VariableTracker]r   )argsr(   returnc           
   
      s   |dkrz|  | |   | j||\}}| jj||}| | | ||||| dt| j }||| j | 	| t
|W S  ttfk
r }	 zW 5 d}	~	X Y nX t ||||S )zVThis is an optimization to avoid tracing the very slow initialization of the optimizer_init_groupZ__optimizer_N)graph_break_if_pending_mutationmove_step_if_cpuget_python_argsr'   r-   map_sources_and_install_guardsupdate_list_argsidstore_global_weakref_by_idcreate_finalizerr   creater   r   r#   call_method)
r&   txnamer+   r(   py_args	py_kwargsZret_valZmangled_name_r)   r   r   r7   :   s    


zOptimizerVariable.call_methodc                    sn   |dkrt | |t| j|dS |dkr`ddlm} | jjD ]}|d D ]}|| qFq:| | t 	||S )N)r-   step)sourceparam_groupsr   mark_static_addressparams)
r   r	   r>   
decoratorsrA   r'   r?   _set_capturabler#   var_getattr)r&   r8   r9   rA   grouppr)   r   r   rE   [   s    
zOptimizerVariable.var_getattrc                 C   s\   | j jD ]N}|d D ]@}|jj}|jt|d }|r||rddlm	} |dqqd S )NrB   r   )UnsupportedzPending mutation on parameter)
r'   r?   outputside_effectsZid_to_variablegetr3   Zhas_pending_mutationexcrH   )r&   r8   grG   rJ   variablerH   r   r   r   r.   m   s    z1OptimizerVariable.graph_break_if_pending_mutationc           
         s   ddl m} ddlm}  fdd}t jjD ]\}}||r0d|d< q0|||t j	d jj}t|j
D ](\}}ttd}	td|j
|	< qtd S )	Nr   LazyVariableTrackerVariableBuilderc                    sF   d}d}|  dt D ]}||jM }|| jjkM }qd| koD|oD|S )NTrB   
capturable)rK   listZis_cudar'   state)rF   Zall_uninitializedZall_cudarG   r&   r   r   safe_to_set_capturable   s    
zAOptimizerVariable._set_capturable.<locals>.safe_to_set_capturableTrS   r?   ) rP   builderrR   	enumerater'   r?   realize_allr	   r>   itemsr   Z_HashableTrackerr   r6   )
r&   r8   rP   rR   rW   indrF   param_groups_vtZparam_group_vtkeyr   rV   r   rD   {   s     
z!OptimizerVariable._set_capturablec                    s<   fdd  fdd|D } fdd|  D }||fS )z9Get python values equivalent to the variable tracker argsc                    sp   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   r\   r   r>   r   baser	   memberr'   r?   indexr   )argrV   r   r   map_arg   s    

z2OptimizerVariable.get_python_args.<locals>.map_argc                    s   g | ]} |qS r   r   ).0rd   re   r   r   
<listcomp>   s     z5OptimizerVariable.get_python_args.<locals>.<listcomp>c                    s   i | ]\}}| |qS r   r   )rf   kvrg   r   r   
<dictcomp>   s      z5OptimizerVariable.get_python_args.<locals>.<dictcomp>)r\   )r&   r+   r(   new_argsZ
new_kwargsr   )re   r&   r   r0      s    z!OptimizerVariable.get_python_argsc                 C   s@   | j j D ].\}}d|kr|d jr|d |j|d< qd S )Nr=   )r'   rU   r\   Zis_cputoZdevice)r&   rG   rU   r   r   r   r/      s    z"OptimizerVariable.move_step_if_cpuc                    sX  ddl m  ddlm} ddlm} i | _i | _ fdd}tt	j
|| jj |||t| jd| jj}||t| jd	| jj}|  tt| jj|jD ]&\}\}}	t|d
 dkrJ|d
 D ]|}
|
jd k	rd }t| jj D ]\}}||
kr|} q
q|rt| jd	}|||t|t||| jj|
   qJq|	j}|	td
}tt|d
 ||D ]R\}\}}|j}|| j|< t|d}|jd k	r|| j|j< nt| t!j" qxqt| jd	}t| jj D ]h\}\}}t|t||}| D ]@\}}t#|t	j
r|| jkr|| jkrt||| j|< qqd S )Nr   r@   r   rQ   rO   c                    s    |  d S r"   r   )xr@   r   r   mark_static   s    zEOptimizerVariable.map_sources_and_install_guards.<locals>.mark_staticr?   rU   rB   r   grad)$rC   rA   rY   rR   ZlazyrP   r   r    r   torchTensorr'   rU   r[   r	   r>   r?   ZrealizerZ   zipr\   lenrp   keysr   r
   Zgetitem_constr   r6   Zunpack_var_sequencer   r   Z
make_guardr   ZCONSTANT_MATCHr`   )r&   r8   rR   rP   ro   r^   Zstate_vtZg_indrF   Zgroup_vtparamZ	key_indexiri   Zstate_sourceZgroup_sourceZ	params_vtZp_indrG   Zp_vtZparam_sourceZgrad_sourceidxr'   Zp_state_sourcerj   r   r@   r   r1      s    


	
 
z0OptimizerVariable.map_sources_and_install_guardsc                 C   s   ddl m} ddlm} || jkrR|| ||| j| }| j|j|j	 nT|| j
krn||| j
| }n8|| |t|}||t|}| j|j|j	 ||}|S )z%Wrap state tensor in a TensorVariabler   r@   r   rQ   )rC   rA   rY   rR   r    r!   addrI   Zmodule_key_namer9   r   r4   r   r   )r&   r8   Ztensor_valuerA   rR   rY   Zglobal_nameresultr   r   r   wrap_tensor  s    

zOptimizerVariable.wrap_tensorc              	   C   s   t ||D ]\}}t|tr
t|ts.tdt|D ]\}}	|jj| t|	t	j
rn|j| ||	 q6ddlm}
m} |jr|j||t|j||	 q6|j|
||	 q6q
dS )z7Update the args and kwargs to the traced optimizer callz-py_arg should be a list in optimizer variabler   )SourcelessBuilderrR   N)rs   r`   r   rT   AssertionErrorrZ   rI   rJ   Zmutationrq   rr   r\   appendr{   rY   r|   rR   r>   r   r6   )r&   r8   r+   r(   r:   r;   rd   Zpy_argrw   valr|   rR   r   r   r   r2   ;  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 ]0}  j | d   j| d  jrj  qd S r"   )_bufferspop_parametersZparams_flatclear)r9   )gmnames_to_deletetcr   r   clear_static_tensor_refsV  s
    z\OptimizerVariable.create_finalizer.<locals>.init_finalizer.<locals>.clear_static_tensor_refs)weakreffinalize)r   r   r   r   r'   )r   r   init_finalizerU  s    z:OptimizerVariable.create_finalizer.<locals>.init_finalizer)r!   r'   rI   Ztracing_contextZadd_graph_finalizer)r&   r8   r   r   r   r   r5   P  s
    
z"OptimizerVariable.create_finalizer)NNN)r   r   r   r   Z_nonvar_fieldsr$   r7   rE   r.   rD   r0   r/   r1   r{   r2   r5   __classcell__r   r   r)   r   r   %   s.   
   !"ar   )#r   typingr   r   r   rq   Ztorch.utils._pytreer   Zguardsr   r   r>   r	   r
   r   r   r   utilsr   Zconstantr   Zdictsr   listsr   miscr   Zuser_definedr   ra   r   	Exceptionr   r   r   r   r   r   r   <module>   s    