o
    ߗi =                     @   s  d dl Z 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
 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 d	dl m!Z! erjd dl"m#Z# G dd de$Z%G dd de$Z&ee'dZ(dd Z)G dd de!Z*dS )    N)DictListTYPE_CHECKING)getArtifactLogger)tree_map_only   )GuardBuilderinstall_guard)
AttrSourceConstDictKeySourceGetItemSourceGlobalWeakRefSource
GradSource)GLOBAL_KEY_PREFIX   )VariableTracker)ConstantVariable)ConstDictVariable)ListVariable)GetAttrVariable)UserDefinedObjectVariable)InstructionTranslatorc                   @      e Zd ZdS )ArgMappingExceptionN__name__
__module____qualname__ r   r   _/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/torch/_dynamo/variables/optimizer.pyr           r   c                   @   r   )GuardInstallExceptionNr   r   r   r   r   r!   $   r    r!   
perf_hintsc                 C   sN   ddl m} | jr%|| jjd}tjj| d u}|r#|p"|j	
| S |S dS )Nr   )get_managerFT)torch._inductor.cudagraph_treesr#   is_cudadeviceindextorch_dynamoutilsget_static_address_typecurrent_node_is_cuda_graph_recorded_tensor)xr#   manageris_static_addressr   r   r   _is_static_for_cudagraphs+   s   
r1   c                       s   e Zd ZdddhejZ			d#	d$ fddZ				
			d% fddZd& fddZdd Zdd Z	dd Z
dd Zdd Zd&ddZ		d&dd Zd!d" Z  ZS )'OptimizerVariablegrad_to_sourcetensor_to_sourcestatic_tensor_namesNreturnc                    s8   t  j|fi | |pi | _|pi | _|pt | _d S N)super__init__r3   r4   setr5   )selfvaluer3   r5   r4   kwargs	__class__r   r   r9   E   s   

zOptimizerVariable.__init__argsList[VariableTracker]r=   Dict[str, VariableTracker]r   c           
   
      s   |dkr]zD|  | |   | j|i |\}}| jj|i |}| | | ||||| dt| j }||| j | 	| t
|W S  ttfy\ }	 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_group__optimizer_N)graph_break_if_pending_mutationmove_step_if_cpuget_python_argsr<   rC   map_sources_and_install_guardsupdate_list_argsidstore_global_weakref_by_idcreate_finalizerr   creater   r!   r8   call_method)
r;   txnamer@   r=   py_args	py_kwargsret_valmangled_name_r>   r   r   rN   R   s"   


zOptimizerVariable.call_methodrO   r   c                    sn   |dv rt | |t| j|dS |dkr0ddlm} | jjD ]}|d D ]}|| q#q| | t 	||S )N)rC   step)sourceparam_groupsr   mark_static_addressparams)
r   r
   rW   
decoratorsrZ   r<   rX   _set_capturabler8   var_getattr)r;   rO   rP   rZ   grouppr>   r   r   r^   s   s   

zOptimizerVariable.var_getattrc                 C   s\   | j jD ]'}|d D ] }|jj}|jt|d }|r*||r*ddlm	} |dq
qd S )Nr[   r   )UnsupportedzPending mutation on parameter)
r<   rX   outputside_effectsid_to_variablegetrJ   has_pending_mutationexcra   )r;   rO   gr`   rc   variablera   r   r   r   rE      s   z1OptimizerVariable.graph_break_if_pending_mutationc           
         s   ddl m}  fdd}t jjD ]\}}||rd|d< q jo't jd}|t	| jj|}t|j
D ]\}}ttd}	td|j
|	< q9d S )Nr   LazyVariableTrackerc                    sJ   d}d}|  dg D ]}||jp|jM }|| jjvM }q
d| v o$|o$|S )NTr[   
capturable)re   r%   is_xpur<   state)r_   all_uninitializedall_gpur`   r;   r   r   safe_to_set_capturable   s   zAOptimizerVariable._set_capturable.<locals>.safe_to_set_capturableTrl   rX   ) rk   	enumerater<   rX   rW   r
   realize_allr   builditemsr   _HashableTrackerr   rM   )
r;   rO   rk   rr   indr_   rW   param_groups_vtparam_group_vtkeyr   rq   r   r]      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                    sl   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)NrX   )
isinstancer   as_python_constantr   rw   r   rW   r   baser
   memberr<   rX   r'   r   )argrq   r   r   map_arg   s   

z2OptimizerVariable.get_python_args.<locals>.map_argc                    s   g | ]} |qS r   r   ).0r   r   r   r   
<listcomp>       z5OptimizerVariable.get_python_args.<locals>.<listcomp>c                    s   i | ]	\}}| |qS r   r   )r   kvr   r   r   
<dictcomp>   s    z5OptimizerVariable.get_python_args.<locals>.<dictcomp>)rw   )r;   r@   r=   new_args
new_kwargsr   )r   r;   r   rG      s   z!OptimizerVariable.get_python_argsc                 C   s@   | j j D ]\}}d|v r|d jr|d |j|d< qd S )NrV   )r<   rn   rw   is_cputor&   )r;   r`   rn   r   r   r   rF      s
   z"OptimizerVariable.move_step_if_cpuc                    s  ddl m  ddlm} i | _i | _ fdd}ttj|| j	j
 | jo)t| jd}|t|| j	j|}| jo>t| jd}t|| j	j
|}|  |jj|  tt| j	j|jD ]\}\}	}
t|	d	 d
kr|	d	 D ]6}|jd urd }t| j	j
 D ]\}}||u r|} nq|r|t|| j	j
| t|t||  nqq|
j}|
|t d	}d}g }tt|	d	 |!|D ]3\}\}}|j}|| j|< t"|d}|jd ur|| j|j< t#|jsd}|$| qt%|&t'j( q|st)*t+j,rdd |D }t)-d| q_t| j	j
 D ]D\}\}}t|t||}|jj|  t| D ]%\}\}}t.|tjrY|| jvrY|| jvrYt|t||| j|< q5qd S )Nr   rY   r   rj   c                    s    |  d S r7   r   )r.   rY   r   r   mark_static   s   zEOptimizerVariable.map_sources_and_install_guards.<locals>.mark_staticrX   rn   r[   r   TgradFc                 S   s   g | ]}|  qS r   rP   )r   srcr   r   r   r   +  r   zDOptimizerVariable.map_sources_and_install_guards.<locals>.<listcomp>)zGrad tensors %s will be copied during cudagraphs execution.If using cudagraphs and the grad tensor addresses will be the same across runs, use torch._dynamo.decorators.mark_static_address to elide this copy.)/r\   rZ   lazyrk   r3   r4   r   r(   Tensorr<   rn   rW   r
   ru   r   rv   rX   realizerb   guard_on_key_orderaddrP   rt   ziprw   lenr   keysr   r   getitem_constr   rM   unpack_var_sequencer   r1   appendr	   
make_guardr   CONSTANT_MATCHperf_hint_logisEnabledForloggingWARNINGwarningr}   )r;   rO   rk   r   params_groups_sourcerz   state_sourcestate_vtg_indr_   group_vtparam	key_indexir   group_source	params_vt
all_staticnon_static_gradsp_indr`   p_vtparam_sourcegrad_sourceidxr<   p_state_source	inner_idxr   r   rY   r   rH      s   











z0OptimizerVariable.map_sources_and_install_guardsc                 C   s   ddl m} || jv r || | j| }| j|j|j n$|| jv r+| j| }n|| |	t
|}t|}| j|j|j t|||S )z%Wrap state tensor in a TensorVariabler   rY   )r\   rZ   r4   r5   r   rb   module_key_namerP   r3   rK   r   r   r   rv   )r;   rO   tensor_valuerZ   rW   global_namer   r   r   wrap_tensorF  s   


zOptimizerVariable.wrap_tensorc              	   C   s   t ||D ]G\}}t|trLt|tsJ dt|D ]0\}}	|jj| t|	tj	r7|j
| ||	 q|jo?t|j|}
|j
t||	|
 qqdS )z7Update the args and kwargs to the traced optimizer callz-py_arg should be a list in optimizer variableN)r   r}   r   listrt   rb   rc   mutationr(   r   rw   r   r   rW   r   r   rv   )r;   rO   r@   r=   rQ   rR   r   py_argr   valrW   r   r   r   rI   `  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                     sJ   D ] }  j | d   j| d  jrj  jr"j  qd S r7   )_bufferspop_parametersparams_flatclearparams_flat_unwrap_subclassesr   )gmnames_to_deletetcr   r   clear_static_tensor_refsw  s   

z\OptimizerVariable.create_finalizer.<locals>.init_finalizer.<locals>.clear_static_tensor_refs)weakreffinalize)r   r   r   r   r<   )r   r   init_finalizerv  s   	z:OptimizerVariable.create_finalizer.<locals>.init_finalizer)r5   r<   rb   tracing_contextadd_graph_finalizer)r;   rO   r   r   r   r   rL   q  s
   z"OptimizerVariable.create_finalizer)NNN)r6   N)r@   rA   r=   rB   r6   r   )rO   r   )r   r   r   r   _nonvar_fieldsr9   rN   r^   rE   r]   rG   rF   rH   r   rI   rL   __classcell__r   r   r>   r   r2   =   s>    
! 
r
r2   )+r   r   typingr   r   r   r(   torch._loggingr   torch.utils._pytreer   guardsr   r	   rW   r
   r   r   r   r   r*   r   r   r   constantr   dictsr   listsr   miscr   user_definedr   torch._dynamo.symbolic_convertr   	Exceptionr   r!   r   r   r1   r2   r   r   r   r   <module>   s,   
