
    [ThWA                     <   S r SSKrSSKrSSKJr  SSKrSSKJr  SSKJ	r	  SSK
JrJr  SSKJrJrJrJrJrJr  SS	KJr  S
SKJr  S
SKJr  S
SKJr  S
SKJr  S
SKJr  S
SK J!r!  \(       a  SSK"J#r#   " S S\$5      r% " S S\$5      r&\" \'S5      r(S r) " S S\!5      r*g)a
  
This module implements variable tracking for PyTorch optimizers during Dynamo tracing.

The OptimizerVariable class provides specialized handling for optimizer instances by:
- Optimizing the tracing of expensive optimizer initialization
- Managing optimizer state and parameter group tracking
- Handling tensor sources and guards for optimizer state tensors
- Supporting CUDA graph execution through static tensor address management
- Providing special handling for parameter gradients and optimizer state tensors

Key features include:
- Efficient initialization tracing via _init_group optimization
- Automatic marking of optimizer state tensors as static for CUDA graphs
- Proper source tracking for parameter groups, gradients, and state tensors
- Guard installation for optimizer state structure
- Support for both CPU and GPU tensor handling
- Cleanup of static tensor references via finalizers

The module integrates with Dynamo's broader tracing system while providing
optimizer-specific optimizations and safety guarantees.
    N)TYPE_CHECKING)getArtifactLogger)tree_map_only   )GuardBuilderinstall_guard)
AttrSourceConstDictKeySourceDictGetItemSourceGetItemSourceGlobalWeakRefSource
GradSource)GLOBAL_KEY_PREFIX   )VariableTracker)ConstantVariable)ConstDictVariable)ListVariable)GetAttrVariable)UserDefinedObjectVariable)InstructionTranslatorc                       \ rS rSrSrg)ArgMappingException7    N__name__
__module____qualname____firstlineno____static_attributes__r       Y/var/www/auris/envauris/lib/python3.13/site-packages/torch/_dynamo/variables/optimizer.pyr   r   7       r"   r   c                       \ rS rSrSrg)GuardInstallException;   r   Nr   r   r"   r#   r&   r&   ;   r$   r"   r&   
perf_hintsc                    SSK Jn  U R                  (       au  U" U R                  R                  S5      n[
        R                  R                  R                  U 5      S LnU(       a$  U=(       d    UR                  R                  U 5      $ U$ g)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_addresss       r#   _is_static_for_cudagraphsr8   B   ss    ;yyahhnne4!MM//GGJRVV! J''FFqI
 %$ r"   c                      ^  \ rS rSrSSS1\R
                  kr   S SU 4S jjjr      SU 4S jjrSU 4S jjrS r	S	 r
S
 rS rS rSS jr  SS jrS rSrU =r$ )OptimizerVariableT   grad_to_sourcetensor_to_sourcestatic_tensor_namesc                    > [         TU ]  " U40 UD6  U=(       d    0 U l        U=(       d    0 U l        U=(       d
    [	        5       U l        g N)super__init__r<   r=   setr>   )selfvaluer<   r>   r=   kwargs	__class__s         r#   rB   OptimizerVariable.__init__\   s@     	)&),2 0 6B#6#?#% r"   c                 
  > US:X  a   U R                  U5        U R                  5         U R                  " U0 UD6u  pVU R                  R                  " U0 UD6nU R                  U5        U R                  XXEU5        S[        U R                  5       3nUR                  XR                  5        U R                  U5        [        R                  " U5      $ [        T
U ]=  XX45      $ ! [        [        4 a
  n	 Sn	A	N%Sn	A	ff = f)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_argsrE   rJ   map_sources_and_install_guardsupdate_list_argsidstore_global_weakref_by_idcreate_finalizerr   creater   r&   rA   call_method)rD   txnameargsrF   py_args	py_kwargsret_valmangled_name_rG   s             r#   rU   OptimizerVariable.call_methodi   s     = 44R8%%'%)%9%94%J6%J"**00'GYG33B7%%bK ".bn-=>--lJJG%%b) (..w77
 w"2T::	 ()>? s   CC( (D=Dc                   > US;   a  [        X[        U R                  U5      S9$ US:X  aH  SSKJn  U R
                  R                   H  nUS    H  nU" U5        M     M     U R                  U5        [        TU ]%  X5      $ )N)rJ   step)sourceparam_groupsr   mark_static_addressparams)
r   r	   ra   
decoratorsrd   rE   rb   _set_capturablerA   var_getattr)rD   rV   rW   rd   groupprG   s         r#   rh   OptimizerVariable.var_getattr   s{     **"4jd6STT>!800xA'* ) 1   $w"2,,r"   c                 &   U R                   R                   Hw  nUS    Hk  nUR                  R                  nUR                  R                  [        U5      S 5      nU(       d  MG  UR                  U5      (       d  M_  SSKJ	n  U" S5      e   My     g )Nre   r   )UnsupportedzPending mutation on parameter)
rE   rb   outputside_effectsid_to_variablegetrQ   has_pending_mutationexcrm   )rD   rV   grj   ro   variablerm   s          r#   rL   1OptimizerVariable.graph_break_if_pending_mutation   su    
 ((Ax[!yy55'66::2a5$G8 A A( K K1%&EFF ! )r"   c                   ^  SSK Jn  U 4S jnT R                  R                   H  nU" U5      (       d  M  SUS'   M     T R                  =(       a    [        T R                  S5      nUR                  [        R                  " UT R                  R                  U5      5      nUR                   HP  n[        R                  " [        R                  " S5      5      n[        R                  " S5      UR                  U'   MR     g )Nr   LazyVariableTrackerc                    > SnSnU R                  S/ 5       H?  nX#R                  =(       d    UR                  -  nXTR                  R                  ;  -  nMA     SU ;   =(       a    U=(       a    U$ )NTre   
capturable)rq   r,   is_xpurE   state)ri   all_uninitializedall_gpurj   rD   s       r#   safe_to_set_capturableAOptimizerVariable._set_capturable.<locals>.safe_to_set_capturable   sh     $GYYx,9900!djj.>.>%>>! -  5(J->J7Jr"   Tr{   rb   ) ry   rE   rb   ra   r	   realize_allr   builditemsr   _HashableTrackerr   rT   )	rD   rV   ry   r   ri   ra   param_groups_vtparam_group_vtkeys	   `        r#   rg   !OptimizerVariable._set_capturable   s    )	K ZZ,,E%e,,&*l# - HDKK!H-99!!"djj&=&=vF
 .33N#44 ''5C )9(?(?(EN  %	 4r"   c                    ^  U 4S jnU Vs/ s H
  oC" U5      PM     nnUR                  5        VVs0 s H  u  pgXc" U5      _M     nnnXX4$ s  snf s  snnf )z9Get python values equivalent to the variable tracker argsc                   > [        U [        5      (       a  U R                  5       $ [        U [        5      (       a  U R                  (       d  / $ [        U [
        5      (       a  [        U R                  [        5      (       az  [        U R                  R                  [        5      (       aQ  U R                  R                  R                  S:X  a-  TR                  R                  U R                  R                     $ [        e)Nrb   )
isinstancer   as_python_constantr   r   r   ra   r   baser	   memberrE   rb   r.   r   )argrD   s    r#   map_arg2OptimizerVariable.get_python_args.<locals>.map_arg   s    #/00--//C..syy	3 122szz=99szz
;;JJOO**n<zz..szz/?/?@@%%r"   )r   )	rD   rX   rF   r   r   new_argskv
new_kwargss	   `        r#   rN   !OptimizerVariable.get_python_args   sW    	& -11DSGCLD106?am
?## 2?s
   AAc                     U R                   R                  R                  5        HD  u  pSU;   d  M  US   R                  (       d  M#  US   R	                  UR
                  5      US'   MF     g )Nr`   )rE   r}   r   is_cputor-   )rD   rj   r}   s      r#   rM   "OptimizerVariable.move_step_if_cpu   sS    

((..0HA5=#7#7#7 %f 0 0 :f 1r"   c                 	  ^ SSK Jm  SSKJn  0 U l        0 U l        U4S jn[        [        R                  X0R                  R                  5        U R                  =(       a    [        U R                  S5      nUR                  [        R                  " XR                  R                   U5      5      nU R                  =(       a    [        U R                  S5      n[        R                  " XR                  R                  U5      nUR#                  5         UR$                  R&                  R)                  UR+                  5       5        [-        U R                  R                   UR.                  5       GH<  u  p[1        US   5      S	:  a  US    H  n
U
R2                  c  M  S n[5        U R                  R                  R7                  5       5       H  u  pXL d  M  Un  O   U(       d  M[  UR                  [        R                  " UU R                  R                  U
   [9        U[;        Xk5      5      5      5          O   U	R=                  U[>        R@                  " S5      5      nS
n/ n[5        [-        US   URC                  U5      5      5       H  u  nu  nnUR                  nUU R
                  U'   [E        US5      nUR2                  bJ  UU R                  UR2                  '   [G        UR2                  5      (       d  SnURI                  U5        M  M  [K        URM                  [N        RP                  5      5        M     U(       a  GM  [R        RU                  [V        RX                  5      (       d  GM  U Vs/ s H  nUR+                  5       PM     nn[R        R[                  SU5        GM?     [5        U R                  R                  R/                  5       5       H  u  nu  nn[9        U[;        UU5      5      nUR$                  R&                  R)                  UR+                  5       5        [5        UR/                  5       5       Hq  u  nu  nn[]        U[        R                  5      (       d  M*  UU R                  ;  d  M<  UU R
                  ;  d  MN  [9        U[;        UU5      5      U R
                  U'   Ms     M     g s  snf )Nr   rc   r   rx   c                    > T" U 5        g r@   r   )r5   rd   s    r#   mark_staticEOptimizerVariable.map_sources_and_install_guards.<locals>.mark_static   s    "r"   rb   r}   re   r   TgradF)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.)/rf   rd   lazyry   r<   r=   r   r/   TensorrE   r}   ra   r	   r   r   r   rb   realizern   guard_on_key_orderaddrW   zipr   lenr   	enumeratekeysr   r
   getitem_constr   rT   unpack_var_sequencer   r8   appendr   
make_guardr   CONSTANT_MATCHperf_hint_logisEnabledForloggingDEBUGwarningr   )rD   rV   ry   r   params_groups_sourcer   state_sourcestate_vtri   group_vtparam	key_indexir   	params_vt
all_staticnon_static_gradsp_indrj   p_vtparam_sourcegrad_sourcesrcidxrE   p_state_source	inner_idxr   rd   s                               @r#   rO   0OptimizerVariable.map_sources_and_install_guards   s   4-  "	# 	ellK1A1AB  ${{Vz$++~/V-99!!"jj&=&=?ST
 {{Gz$++w'G"((ZZ-=-=|L 	
		$$(():):)<=  #4::#:#:O<Q<QROE 5?#a'"8_Ezz-$(	$-djj.>.>.C.C.E$FDA z,-	 % %G %9/;; / 5 5$&$(JJ$4$4U$;$5(4(:<(S%&!"	 "% -( !..r3C3J3J83TUIJ!$-E(OY%B%B2%FG% y4  ${{+7%%a(( 
 66%2=D''/4QVV<<%*
(//< = "+"8"89T9T"UV!%( :-"<"<W]]"K"K:J#K:J3CHHJ:J #K%%
 %c  Sx  ))9)9)?)?)ABOC!U.0sCN II((,,^-@-@-BC%.u{{}%=!	6Aqq%,,//!4!44!6!66/@&(:>9(U0D))!, &>  C $Ls   >Sc                 "   SSK Jn  X R                  ;   aZ  U" U5        U R                  U   nU R                  R	                  UR
                  R                  UR                  5       5      5        OX R                  ;   a  U R                  U   nOkU" U5        UR                  [        U5      n[        U5      nU R                  R	                  UR
                  R                  UR                  5       5      5        [        R                  " XU5      $ )z%Wrap state tensor in a TensorVariabler   rc   )rf   rd   r=   r>   r   rn   module_key_namerW   r<   rR   r   r   r   r   )rD   rV   tensor_valuerd   ra   global_names         r#   wrap_tensorOptimizerVariable.wrap_tensor\  s    4 000-**<8F$$(()B)B6;;=)QR000((6F  -778I<XK(5F$$(()B)B6;;=)QR$$Rv>>r"   c           	      P   [        X$5       GH  u  pg[        U[        5      (       d  M  [        U[        5      (       d   S5       e[	        U5       H  u  pUR
                  R                  R                  U5        [        U	[        R                  5      (       a,  UR                  R                  U R                  X5      5        Mu  UR                  =(       a    [        UR                  U5      n
UR                  R                  [        R                   " XU
5      5        M     GM     g)z7Update the args and kwargs to the traced optimizer callz-py_arg should be a list in optimizer variableN)r   r   r   listr   rn   ro   mutationr/   r   r   r   r   ra   r   r   r   )rD   rV   rX   rF   rY   rZ   r   py_argr   valra   s              r#   rP   "OptimizerVariable.update_list_argsv  s     t-KC#|,,!&$// C/ (/FAII**33C8!#u||44		(()9)9")BC!$!Lcjj!0L		(()>)>r)OP 0 .r"   c                    ^^^ U R                   mU R                  mUR                  R                  mUUU4S jnUR                  R	                  U5        g )Nc                 F   >^  U UU4S jn[         R                  " TU5        g )Nc                  8  > T H  n TR                   R                  U S 5        TR                  R                  U S 5        TR                  (       a  TR                  R	                  5         TR
                  (       d  My  TR
                  R	                  5         M     g r@   )_bufferspop_parametersparams_flatclearparams_flat_unwrap_subclasses)rW   gmnames_to_deletetcs    r#   clear_static_tensor_refs\OptimizerVariable.create_finalizer.<locals>.init_finalizer.<locals>.clear_static_tensor_refs  sh    +DKKOOD$/NN&&tT2~~,,.77788>>@ ,r"   )weakreffinalize)r   r   r   r   rE   s   ` r#   init_finalizer:OptimizerVariable.create_finalizer.<locals>.init_finalizer  s    A U$<=r"   )r>   rE   rn   tracing_contextadd_graph_finalizer)rD   rV   r   r   r   rE   s      @@@r#   rS   "OptimizerVariable.create_finalizer  s?    22

YY&&
	> 			%%n5r"   )r<   r>   r=   )NNN)returnN)rX   zlist[VariableTracker]rF   zdict[str, VariableTracker]r   r   )rV   r   )r   r   r   r    r   _nonvar_fieldsrB   rU   rh   rL   rg   rN   rM   rO   r   rP   rS   r!   __classcell__)rG   s   @r#   r:   r:   T   s     
#	1	1	N  @ 
@ @; &	;
 -; 
;B-$GF@$8;
ob?4Q)Q"6 6r"   r:   )+__doc__r   r   typingr   r/   torch._loggingr   torch.utils._pytreer   guardsr   r   ra   r	   r
   r   r   r   r   r1   r   r   r   constantr   dictsr   listsr   miscr   user_definedr   torch._dynamo.symbolic_convertr   	Exceptionr   r&   r   r   r8   r:   r   r"   r#   <module>r      s   ,      , - 0  & ! & $  ! 3 D	) 		I 	 "(L9$D61 D6r"   