o
    "i6                     @   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rZd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                   @      e Zd ZdS )ArgMappingExceptionN__name__
__module____qualname__ r   r   _/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/_dynamo/variables/optimizer.pyr          r   c                   @   r   )GuardInstallExceptionNr   r   r   r   r   r   !   r   r   c                       s   e Zd Zdddhej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dd Zdd  Z  ZS )#OptimizerVariablegrad_to_sourcetensor_to_sourcestatic_tensor_namesNc                    s8   t  j|fi | |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__argsList[VariableTracker]r*   Dict[str, VariableTracker]returnr   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)   r1   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_kwargsret_valmangled_name_r+   r   r   r<   :   s"   


zOptimizerVariable.call_methodc                    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)r1   step)sourceparam_groupsr   mark_static_addressparams)
r   r	   rE   
decoratorsrH   r)   rF   _set_capturabler%   var_getattr)r(   r=   r>   rH   grouppr+   r   r   rL   [   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 )NrI   r   )UnsupportedzPending mutation on parameter)
r)   rF   outputside_effectsid_to_variablegetr8   has_pending_mutationexcrO   )r(   r=   grN   rQ   variablerO   r   r   r   r3   m   s   z1OptimizerVariable.graph_break_if_pending_mutationc           
         s   ddl m} ddlm}  fdd}t jjD ]\}}||r$d|d< q|||t j	d jj}t|j
D ]\}}ttd}	td|j
|	< q:d S )	Nr   LazyVariableTrackerVariableBuilderc                    sF   d}d}|  dt D ]}||jM }|| jjvM }qd| v o"|o"|S )NTrI   
capturable)rS   listis_cudar)   state)rM   all_uninitializedall_cudarN   r(   r   r   safe_to_set_capturable   s   
zAOptimizerVariable._set_capturable.<locals>.safe_to_set_capturableTr\   rF   ) rY   builderr[   	enumerater)   rF   realize_allr	   rE   itemsr   _HashableTrackerr   r;   )
r(   r=   rY   r[   rc   indrM   param_groups_vtparam_group_vtkeyr   rb   r   rK   {   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)NrF   )
isinstancer   as_python_constantr   rh   r   rE   r   baser	   memberr)   rF   indexr   )argrb   r   r   map_arg   s   

z2OptimizerVariable.get_python_args.<locals>.map_argc                    s   g | ]} |qS r   r   ).0rs   rt   r   r   
<listcomp>   s    z5OptimizerVariable.get_python_args.<locals>.<listcomp>c                    s   i | ]	\}}| |qS r   r   )ru   kvrv   r   r   
<dictcomp>   s    z5OptimizerVariable.get_python_args.<locals>.<dictcomp>)rh   )r(   r-   r*   new_args
new_kwargsr   )rt   r(   r   r5      s   z!OptimizerVariable.get_python_argsc                 C   s@   | j j D ]\}}d|v r|d jr|d |j|d< qd S )NrD   )r)   r_   rh   is_cputodevice)r(   rN   r_   r   r   r   r4      s
   z"OptimizerVariable.move_step_if_cpuc                    sJ  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r|d
 D ]<}
|
jd urd }t| jj D ]\}}||
u r|} nqu|rt| jd	}|||t|t||| jj|
   nqd|	j}|	td
}tt|d
 ||D ]'\}\}}|j}|| j|< t|d}|jd ur|| j|j< qt| t!j" qqRt| jd	}t| jj D ]3\}\}}t|t||}| D ] \}}t#|t	j
r || jvr || jvr t||| j|< qqd S )Nr   rG   r   rZ   rX   c                    s    |  d S r$   r   )xrG   r   r   mark_static   s   zEOptimizerVariable.map_sources_and_install_guards.<locals>.mark_staticrF   r_   rI   r   grad)$rJ   rH   re   r[   lazyrY   r!   r"   r   torchTensorr)   r_   rg   r	   rE   rF   realizerf   ziprh   lenr   keysr   r
   getitem_constr   r;   unpack_var_sequencer   r   
make_guardr   CONSTANT_MATCHrn   )r(   r=   r[   rY   r   rk   state_vtg_indrM   group_vtparam	key_indexirx   state_sourcegroup_source	params_vtp_indrN   p_vtparam_sourcegrad_sourceidxr)   p_state_sourcery   r   rG   r   r6      s   


	



z0OptimizerVariable.map_sources_and_install_guardsc                 C   s   ddl m} ddlm} || jv r)|| ||| j| }| j|j|j	 n*|| j
v r7||| j
| }n|| |t|}||t|}| j|j|j	 ||}|S )z%Wrap state tensor in a TensorVariabler   rG   r   rZ   )rJ   rH   re   r[   r"   r#   addrP   module_key_namer>   r!   r9   r   r   )r(   r=   tensor_valuerH   r[   re   global_nameresultr   r   r   wrap_tensor  s   

zOptimizerVariable.wrap_tensorc              	   C   s   t ||D ]X\}}t|tr]t|tsJ dt|D ]A\}}	|jj| t|	tj	r7|j
| ||	 qddlm}
m} |jrR|j
||t|j||	 q|j
|
||	 qqdS )z7Update the args and kwargs to the traced optimizer callz-py_arg should be a list in optimizer variabler   )SourcelessBuilderr[   N)r   rn   r   r]   rf   rP   rQ   mutationr   r   rh   appendr   re   r   r[   rE   r   r;   )r(   r=   r-   r*   r?   r@   rs   py_argr   valr   r[   r   r   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 r$   )_bufferspop_parametersparams_flatclear)r>   )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)   rP   tracing_contextadd_graph_finalizer)r(   r=   r   r   r   r   r:   P  s
   
z"OptimizerVariable.create_finalizer)NNN)r-   r.   r*   r/   r0   r   )r   r   r   r   _nonvar_fieldsr&   r<   rL   r3   rK   r5   r4   r6   r   r7   r:   __classcell__r   r   r+   r   r    %   s6    
!"ar    )#r   typingr   r   r   r   torch.utils._pytreer   guardsr   r   rE   r	   r
   r   r   r   utilsr   constantr   dictsr   listsr   miscr   user_definedr   rp   r   	Exceptionr   r   r    r   r   r   r   <module>   s"   