
    sgu7                        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rd dlmZ ddlm Z   G d de!      Z" G d de!      Z# G d de      Z$y)    N)DictListTYPE_CHECKING)tree_map_only   )GuardBuilderinstall_guard)
AttrSourceConstDictKeySourceGetItemSourceGlobalWeakRefSource
GradSource)GLOBAL_KEY_PREFIX   )ConstantVariable)ConstDictVariable)ListVariable)GetAttrVariable)UserDefinedObjectVariable)InstructionTranslator)VariableTrackerc                       e Zd Zy)ArgMappingExceptionN__name__
__module____qualname__     T/var/www/html/venv/lib/python3.12/site-packages/torch/_dynamo/variables/optimizer.pyr   r          r   r   c                       e Zd Zy)GuardInstallExceptionNr   r   r   r    r#   r#   #   r!   r   r#   c                        e Zd Zdddhej                  Z	 	 	 d	 d fdZ	 	 	 	 	 	 d fdZd fdZd Zd Z	d	 Z
d
 Zd ZddZ	 	 ddZd Z xZS )OptimizerVariablegrad_to_sourcetensor_to_sourcestatic_tensor_namesc                 x    t        |   |fi | |xs i | _        |xs i | _        |xs
 t	               | _        y N)super__init__r&   r'   setr(   )selfvaluer&   r(   r'   kwargs	__class__s         r    r,   zOptimizerVariable.__init__/   s@     	)&),2 0 6B#6#?#% r   c                    |dk(  r	 | j                  |       | j                           | j                  |i |\  }} | j                  j                  |i |}| j                  |       | j                  |||||       dt        | j                         }|j                  || j                         | j                  |       t        j                  |      S t        
| =  ||||      S # t        t        f$ r
}	Y d}	~	&d}	~	ww xY w)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/   r3   map_sources_and_install_guardsupdate_list_argsidstore_global_weakref_by_idcreate_finalizerr   creater   r#   r+   call_method)r.   txnameargsr0   py_args	py_kwargsret_valmangled_name_r1   s             r    r>   zOptimizerVariable.call_method<   s    = 44R8%%'%9T%9%94%J6%J"0$**00'GYG33B7%%b$K ".bn-=>--lDJJG%%b) (..w77
 w"2tT6::	 ()>? s   CC, ,D Dc                    |dv r"t        | |t        | j                  |            S |dk(  rDddlm} | j
                  j                  D ]  }|d   D ]
  } ||         | j                  |       t        | %  ||      S )N)r3   step)sourceparam_groupsr   mark_static_addressparams)
r   r
   rI   
decoratorsrL   r/   rJ   _set_capturabler+   var_getattr)r.   r?   r@   rL   grouppr1   s         r    rP   zOptimizerVariable.var_getattr]   s     **"4jd6STT>!800 +x +A'*++   $w"2t,,r   c                    | j                   j                  D ]i  }|d   D ]_  }|j                  j                  }|j                  j                  t        |      d       }|sA|j                  |      sSddlm	}  |d       k y )NrM   r   )UnsupportedzPending mutation on parameter)
r/   rJ   outputside_effectsid_to_variablegetr:   has_pending_mutationexcrT   )r.   r?   grR   rV   variablerT   s          r    r5   z1OptimizerVariable.graph_break_if_pending_mutationo   s~    
 (( 	GAx[ G!yy55'66::2a5$G A A( K1%&EFFG	Gr   c           
          ddl m} ddlm}  fd}t	         j
                  j                        D ]  \  }} ||      sd|d<    |j                    ||t         j                  d             j
                  j                              }t	        |j                        D ]O  \  }}t        j                  t        j                  d            }	t        j                  d      |j                  |	<   Q y )Nr   LazyVariableTrackerVariableBuilderc                     d}d}| j                  dg       D ]:  }||j                  xs |j                  z  }||j                  j                  vz  }< d| v xr |xr |S )NTrM   
capturable)rX   is_cudais_xpur/   state)rQ   all_uninitializedall_gpurR   r.   s       r    safe_to_set_capturablezAOptimizerVariable._set_capturable.<locals>.safe_to_set_capturable   sq     $GYYx, ?19900!Qdjj.>.>%>>!?  5(J->J7Jr   Trc   rJ   ) r_   builderra   	enumerater/   rJ   realize_allr
   rI   itemsr   _HashableTrackerr   r=   )
r.   r?   r_   ra   ri   indrQ   param_groups_vtparam_group_vtkeys
   `         r    rO   z!OptimizerVariable._set_capturable}   s    ),	K $DJJ$;$;< 	+JC%e,&*l#	+ .99HOB
4;; GH

''

 $-_-B-B#C 	FC#44 ''5C )9(?(?(EN  %		Fr   c                       fd}|D cg c]
  } ||       }}|j                         D ci c]  \  }}| ||       }}}||fS c c}w c c}}w )z9Get python values equivalent to the variable tracker argsc                    t        | t              r| j                         S t        | t              r| j                  sg S t        | t
              rt        | j                  t              rtt        | j                  j                  t              rP| j                  j                  j                  dk(  r-j                  j                  | j                  j                     S t        )NrJ   )
isinstancer   as_python_constantr   rn   r   rI   r   baser
   memberr/   rJ   indexr   )argr.   s    r    map_argz2OptimizerVariable.get_python_args.<locals>.map_arg   s    #/0--//C.syy	3 12szz=9szz
;JJOO**n<zz..szz/?/?@@%%r   )rn   )	r.   rA   r0   r|   r{   new_argskv
new_kwargss	   `        r    r7   z!OptimizerVariable.get_python_args   sY    	& -11SGCL1106?1am?
?## 2?s
   A	Ac                     | j                   j                  j                         D ];  \  }}d|v s|d   j                  s|d   j	                  |j
                        |d<   = y )NrH   )r/   rf   rn   is_cputodevice)r.   rR   rf   s      r    r6   z"OptimizerVariable.move_step_if_cpu   sW    

((..0 	;HAu5=#7#7 %f 0 0 :f	;r   c                 (   ddl m ddlm} ddlm} i | _        i | _        fd}t        t        j                  || j                  j                         |j                    ||t        | j                  d            | j                  j                               }  ||t        | j                  d            | j                  j                        }|j#                          t%        t'        | j                  j                   |j(                              D ]  \  }\  }}	t+        |d	         d
kD  r|d	   D ]  }
|
j,                  d }t%        | j                  j                  j/                               D ]  \  }}||
u s|} n |sRt        | j                  d      }|j                    ||t1        |t3        ||                  | j                  j                  |
                 n |	j                  }|	j5                  |t7        j8                  d	            }t%        t'        |d	   |j;                  |                  D ]}  \  }\  }}|j                  }|| j                  |<   t=        |d      }|j,                  || j                  |j,                  <   Vt?        |jA                  tB        jD                                 t        | j                  d      }t%        | j                  j                  j)                               D ]  \  }\  }}t1        |t3        ||            }|j)                         D ]W  \  }}tG        |t        j                        s!|| j                  vs0|| j                  vs?t1        ||      | j                  |<   Y  y )Nr   rK   r   r`   r^   c                      |        y r*   r   )xrL   s    r    mark_staticzEOptimizerVariable.map_sources_and_install_guards.<locals>.mark_static   s    "r   rJ   rf   rM   r   grad)$rN   rL   rk   ra   lazyr_   r&   r'   r   torchTensorr/   rf   rm   r
   rI   rJ   realizerl   ziprn   lenr   keysr   r   getitem_constr   r=   unpack_var_sequencer   r	   
make_guardr   CONSTANT_MATCHrv   )r.   r?   ra   r_   r   rq   state_vtg_indrQ   group_vtparam	key_indexir~   state_sourcegroup_source	params_vtp_indrR   p_vtparam_sourcegrad_sourceidxr/   p_state_sourcer   rL   s                             @r    r8   z0OptimizerVariable.map_sources_and_install_guards   sB   4,-  "	# 	ellK1A1AB .99HOB
4;; GH

''
 I?2z$++w'GHJJ
 	 )2

'')>)>?)
 )	W$E$E8
 5?#a'"8_ "Ezz-$(	$-djj.>.>.C.C.E$F &DAq Ez,-	 %& %+5dkk7+KL/;;!"$&$1(4(:<(S%&!" #'**"2"25"9!; "%"( $??L ..r3C3J3J83TUI$-E(OY%B%B2%FG% W y4  ${{+7%%a(( 
 66%2=D''/!+"8"89T9T"UVW9)	WZ "$++w7()9)9)?)?)AB 
	POC!U*0sCN  P1q%,,/!4!44!6!66/<^Q/OD))!,P	
	Pr   c                 *   ddl m} ddlm} || j                  v r] ||        ||| j                  |         }| j
                  j                  |j                  j                  |j                               n|| j                  v r ||| j                  |         }nn ||       |j                  t        |      } ||t        |            }| j
                  j                  |j                  j                  |j                                ||      }|S )z%Wrap state tensor in a TensorVariabler   rK   r   r`   )rN   rL   rk   ra   r'   r(   addrU   module_key_namer@   r&   r;   r   r   )r.   r?   tensor_valuerL   ra   rk   global_nameresults           r    wrap_tensorzOptimizerVariable.wrap_tensor!  s    4, 4000-%b$*?*?*MNG$$(()B)B7<<)PQT000%b$*=*=l*KLG  -778I<XK%b*=k*JKG$$(()B)B7<<)PQ&r   c                 t   t        ||      D ](  \  }}t        |t              st        |t              sJ d       t	        |      D ]  \  }}	|j
                  j                  j                  |       t        |	t        j                        r,|j                  j                  | j                  ||	             qddlm}
m} |j                   r=|j                  j                    ||t#        |j                   |            |	             |j                  j                  |
j%                  ||	              + y)z7Update the args and kwargs to the traced optimizer callz-py_arg should be a list in optimizer variabler   )SourcelessBuilderra   N)r   rv   r   listrl   rU   rV   mutationr   r   rn   appendr   rk   r   ra   rI   r   r=   )r.   r?   rA   r0   rB   rC   r{   py_argr   valr   ra   s               r    r9   z"OptimizerVariable.update_list_args=  s    tW- 	PKC#|,!D CBC  (/ PFAsII**33C8!#u||4		(()9)9"c)BCO::II,, QM#**a4P QRU V  II,,->-E-Eb#-NOP	Pr   c                     | j                   | j                  |j                  j                  fd}|j                  j	                  |       y )Nc                 B      fd}t        j                  |       y )Nc                      D ]a  } j                   j                  | d        j                  j                  | d        j                  sHj                  j	                          c y r*   )_bufferspop_parametersparams_flatclear)r@   gmnames_to_deletetcs    r    clear_static_tensor_refsz\OptimizerVariable.create_finalizer.<locals>.init_finalizer.<locals>.clear_static_tensor_refsZ  sO    + /DKKOOD$/NN&&tT2~~,,.	/r   )weakreffinalize)r   r   r   r   r/   s   ` r    init_finalizerz:OptimizerVariable.create_finalizer.<locals>.init_finalizerY  s    / U$<=r   )r(   r/   rU   tracing_contextadd_graph_finalizer)r.   r?   r   r   r   r/   s      @@@r    r<   z"OptimizerVariable.create_finalizerT  s?    22

YY&&	> 			%%n5r   )NNN)returnN)rA   zList[VariableTracker]r0   zDict[str, VariableTracker]r   r   )r?   r   )r   r   r   r   _nonvar_fieldsr,   r>   rP   r5   rO   r7   r6   r8   r   r9   r<   __classcell__)r1   s   @r    r%   r%   '   s     
#	1	1	N  @ 
@; &	;
 -; 
;B-$G FD$8;
_PB8P)P.6r   r%   )%r   typingr   r   r   r   torch.utils._pytreer   guardsr   r	   rI   r
   r   r   r   r   utilsr   constantr   dictsr   listsr   miscr   user_definedr   torch._dynamo.symbolic_convertr   rx   r   	Exceptionr   r#   r%   r   r   r    <module>r      si     , ,  - 0  & & $  ! 3 D%	) 		I 	|61 |6r   