+
    –°³jo7  ã                   óð   a € R t0 t ^ RIt^ RIt^ RIHtHtHt ^ RIHt ^ RI	H
t
Ht ^ RIt^ RIHt ^ RIHt ^ RIHt ^ RIHt . t] ^ k ]P,                  ! ]4      t ! R R	]P2                  4      tR
 R ltR# )é    N)ÚCallableÚ
CollectionÚMapping)Údeepcopy)ÚAnyÚoverload)Úoptim)ÚShardedTensor)ÚFullyShardedDataParallelc                   ó&  a € ] tR t^t o RtRV 3R lR lltV 3R lR ltV 3R lR lt]RV 3R	 lR
 ll4       t	]V 3R lR l4       t	RV 3R lR llt	]
V 3R lR l4       tV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltRtV tR# )Ú_NamedOptimizera`  
``_NamedOptimizer`` takes a dict of parameters and exposes ``state_dict`` by parameter key.

We replace the original key (number) in an optim to the
fully qualified name (FQN) string. User can initialize the optim as they
initialize a PyTorch optim, the only difference is that they also need to
pass in the FQN of each parameters.

Args:
    named_parameters (Mapping[str, Union[torch.Tensor, ShardedTensor]]):
        Mapping from FQN to parameter.
    optimizer_class (optim.Optimizer):
        The class of optimizer to instantiate.
    param_groups (Collection[Mapping[str, Any]]):
        `param_groups` to pass to optimizer if specified.
        The key of the inner map needs to be FQNs.
        Default: None
    module (nn.Module): the module whose parameters to be updated
        by the optimizer.
    args: arguments to pass to the optimizer constructor.
    kwargs: arguments to pass to the optimizer constructor.

Example::
    >>> # xdoctest: +SKIP("distributed")
    >>> from torch import optim
    >>> from torch.distributed.optim import _NamedOptimizer
    >>>
    >>> # Define the named optimizer.
    >>> m = Model(...)
    >>> named_optim = _NamedOptimizer(m.named_parameters(), optim.SGD)
    >>> # Forward pass + backward pass.
    >>> named_optim.step()
    >>> ...
    >>> # Call state_dict for the named optimizer returns an FQN state_dict.
    >>> named_optim.state_dict()

Warning: This API is still in development and subject to change.

TODO: Add tutorial for _NamedOptimizer.
TODO: Add documentation in the docstring for the public attributes
      like self.param_groups and self.named_parameters.
Nc                ó  <€ V ^8„  d   QhRS[ S[S[P                  S[,          3,          RS[P                  RS[S[ S[S[3,          ,          R,          RS[	P                  R,          RS[S[R3,          RS[S[S[3,          R	R/# )
é   Únamed_parametersÚoptimizer_classÚparam_groupsNÚmoduleÚargs.ÚkwargsÚreturn)r   ÚstrÚtorchÚTensorr
   r	   Ú	Optimizerr   r   ÚnnÚModuleÚtupleÚdict)ÚformatÚ__classdict__s   "€Úh/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torch/distributed/optim/named_optimizer.pyÚ__annotate__Ú_NamedOptimizer.__annotate__?   s”   ø€ ÷ )9ñ )9á!¡#¡u§|¡|±mÕ'CÐ"CÕDð)9ñ Ÿ™ð)9ñ !¡©©c¨Õ!2Õ3°dÕ:ð	)9ñ
 —	‘	˜DÕ ð)9ñ ‘S˜#�X�ð)9ñ ‘s™C�x•.ð)9ð 
ñ)9ó    c                ó¾  € \         P                  P                  R 4       W0n        V P	                  4        \        V4      V n        Vf   V P                  P                  4       MTpV! V.VO5/ VB V n        W@n	        Vf*   \        V P                  P                  4       4      V n        M’\        P                  ! R^R7       V P                  P                  4        UU	u/ uF  w  r‰W˜bK	  	  p
pp	. pV F?  pVR,           F/  p	Wš9  d   \!        RV	 R24      hVP#                  W©,          4       K1  	  KA  	  W°n        V P                  P                  V n        R# u up	pi )z'torch.distributed.optim._NamedOptimizerNzvSince we pass in param_groups, we will use param_groups to initialize the optimizer, not all parameters of the module.)Ú
stacklevelÚparamszExpect param name z% found in param group but is missing.)r   Ú_CÚ_log_api_usage_oncer   Ú_param_groups_checkr   r   ÚvaluesÚ
_optimizerr   ÚlistÚkeysÚordered_param_keysÚwarningsÚwarnÚitemsÚ
ValueErrorÚappend)Úselfr   r   r   r   r   r   Úparams_for_optimizerÚkeyÚparamÚparam_to_keyr/   Úgroups   &&&&&*,      r!   Ú__init__Ú_NamedOptimizer.__init__?   sT  € ô 	�‰×$Ñ$Ð%NÔOØ;GÔØ× Ñ Ô"Ü $Ð%5Ó 6ˆÔà.:Ò.BˆD×!Ñ!×(Ñ(Ô*Èð 	ñ *Ø ð
àò
ð ñ
ˆŒð
 ŒØÒÜ&*¨4×+@Ñ+@×+EÑ+EÓ+GÓ&HˆDÕ#ä�MŠMðNàõð
 :>×9NÑ9N×9TÑ9TÔ9VÔWÑ9V©:¨3˜EšJÑ9VˆLÑWØ!#ÐÛ%�Ø" 8Ÿ_˜_�EØÔ0Ü(Ø0°°Ð7\Ð]óð ð '×-Ñ-¨lÕ.AÖBó -ñ &ð '9Ô#à ŸO™O×8Ñ8ˆÖùó Xs   ÃEc                ó   <€ V ^8„  d   QhRR/# ©r   r   N© )r   r    s   "€r!   r"   r#   j   s   ø€ ÷ /ñ / Tñ /r$   c                óÆ  € V P                   eÓ   V P                    FÀ  p\        V\        4      '       g   \        R4      hRV9  d   \        R4      hVR,          p\        V\        P
                  4      '       d   V.p\        V4      pV FI  p\        V\        P
                  4      '       d   K%  \        R\        P                  ! V4      ,           4      h	  W!R&   KÂ  	  R # R # )Núparam group must be a dictr'   z#param group must contain key paramsz>optimizer can only optimize Tensors, but one of the params is )	r   Ú
isinstancer   ÚAssertionErrorr   r   r-   Ú	TypeErrorÚtypename)r5   Úparam_groupr'   r8   s   &   r!   r*   Ú#_NamedOptimizer._param_groups_checkj   sÄ   € Ø×ÑÒ(Ø#×0Ô0�Ü! +¬t×4Ò4Ü(Ð)EÓFÐFØ ;Ô.Ü(Ð)NÓOÐOØ$ XÕ.�Ü˜f¤e§l¡l×3Ò3Ø$˜X�FÜ˜f›�Û#�EÜ% e¬U¯\©\×:Ô:Ü'ð8Ü:?¿.º.ÈÓ:OõPóð ñ $ð )/˜HÓ%ó  1ñ )r$   c                ó6   <€ V ^8„  d   QhRS[ S[S[3,          /# ©r   r   ©r   r   r   )r   r    s   "€r!   r"   r#   }   s   ø€ ÷ Wñ W™D¡¡c �Nñ Wr$   c                ó   € V P                   P                  4       pVR,          pVR,          P                  4        UUu/ uF  w  r4V P                  V,          VbK  	  ppp. pV Fx  pVR,           Uu. uF  q€P                  V,          NK  	  p	pR\	        V	4      /p
VP                  4        F  w  r¼VR8w  g   K  \        V4      W«&   K  	  VP                  V
4       Kz  	  V P                  RVRV/4      # u uppi u upi )z•
Return the ``state_dict`` of the optimizer.

Instead of using number to index
parameters, we will use module fully qualified name (FQN) as the key.
r   Ústater'   )r,   Ú
state_dictr2   r/   Úsortedr   r4   Ú_post_state_dict)r5   rM   r   Úst_keyÚ	state_valÚ	ret_stateÚ
ret_groupsr:   r8   Ú
param_keysÚ	ret_groupÚkÚvs   &            r!   rM   Ú_NamedOptimizer.state_dict}   s  € ð —_‘_×/Ñ/Ó1ˆ
Ø! .Õ1ˆð &0°Õ%8×%>Ñ%>Ô%@ô
á%@Ñ!�ð ×#Ñ# FÕ+¨YÒ6Ù%@ð 	ñ 
ð
 ˆ
Û!ˆEØFKÈHÆoÓVÁo¸U×1Ñ1°%×8Ð8ÁoˆJÐVØ!¤6¨*Ó#5Ð6ˆIØŸ™ž‘�Ø˜–=Ü#+¨A£;�I“Lñ &ð ×Ñ˜iÖ(ñ "ð ×$Ñ$ g¨y¸.È*Ð%UÓVÐVùó
ùò Ws   ¾C5Á2C;c                ó"   <€ V ^8„  d   QhRRRR/# ©r   ÚclosureNr   r?   )r   r    s   "€r!   r"   r#   ˜   s   ø€ ×5Ñ5˜DÐ5¨DÑ5r$   c                ó   € R # ©Nr?   ©r5   r[   s   &&r!   ÚstepÚ_NamedOptimizer.step—   s   € Ù25r$   c                ó:   <€ V ^8„  d   QhRS[ . S[3,          RS[/# )r   r[   r   ©r   Úfloat)r   r    s   "€r!   r"   r#   ›   s   ø€ ×>Ñ>™H R© YÕ/Ð>±EÑ>r$   c                ó   € R # r]   r?   r^   s   &&r!   r_   r`   š   s   € Ù;>r$   c                óV   <€ V ^8„  d   QhRS[ . S[3,          R,          RS[R,          /# rZ   rb   )r   r    s   "€r!   r"   r#   �   s-   ø€ ÷ 5ñ 5™H R© YÕ/°$Õ6ð 5Á%È$Å,ñ 5r$   c                ó:   € V P                   P                  VR7      # )zr
Perform a single optimization step.

This will call :meth:`torch.optim.Optimizer.step` on the wrapped
optimizer.
©r[   )r,   r_   r^   s   &&r!   r_   r`   �   s   € ð �‰×#Ñ#¨GÐ#Ó4Ð4r$   c                óJ   <€ V ^8„  d   QhRS[ S[P                  S[3,          /# rI   )r   r   r   r   )r   r    s   "€r!   r"   r#   §   s"   ø€ ÷ %ñ %‘w™uŸ|™|©SÐ0Õ1ñ %r$   c                ó.   € V P                   P                  # r]   )r,   rL   )r5   s   &r!   rL   Ú_NamedOptimizer.state¦   s   € à�‰×$Ñ$Ð$r$   c                ó:   <€ V ^8„  d   QhRS[ S[S[3,          RR/# )r   rM   r   NrJ   )r   r    s   "€r!   r"   r#   ª   s'   ø€ ÷ h8ñ h8©$©s±C¨x­.ð h8¸Tñ h8r$   c                ó¼  € V P                   P                  4       pV P                  V4      pVR,          pVR,          p\        V4      ^ 8X  d   \	        R4      h\        V P                  4       EF  w  rVWc9  d   K  \        W6,          4      \        WE,          4      8w  d3   \	        R\        WE,          4       RV R\        W6,          4       24      hWE,          P                  4        EF˜  w  rxWsV,          9  d   \	        RV RV R24      hW6,          V,          p	\        V\        4      '       dÓ   \        V	\        4      '       g   \        h\        VP                  4       4      p
\        V	P                  4       4      pW«8w  d   \	        RV R	V
 R
V RV 24      h\        VP                  4       V	P                  4       4       F8  w  rÍVP                  P                  4       P                  VP                  4       K:  	  EK  \        V\         P"                  4      '       dI   \        V	\         P"                  4      '       g   \        hVP                  4       P                  V	4       EK„  \%        V	4      WE,          V&   EK›  	  EK  	  VR,          pVR,          p/ pV F#  p\'        VR,          4      pVV\)        V4      &   K%  	  / pV FE  p. pVR,           F%  pVP+                  V P                  V,          4       K'  	  VV\)        V4      &   KG  	  VP                  4        F˜  w  ppVV9  d   K  VV,          p\        V4      \        V4      8w  d(   \	        R\        V4       RV R	\        V4       R24      hV F:  pVV9  d   \	        RV RV R24      hVR8w  g   K%  \%        VV,          4      VV&   K<  	  Kš  	  V P                   P-                  V4       R# )a@  
Define the default behavior to load a state_dict for ``_NamedOptimizer``.

Sample Code
```
    my_model = MyModule()
    optimizer = _NamedOptimizer(my_model.named_parameters(), Adagrad)
    ...

    optim_state_dict = optimizer.state_dict()
    ...
    ...

    optimizer.load_state_dict(optim_state_dict)
    ...
```
Args:
    state_dict (dict[str, Any]) : A ``state_dict`` to load into the optimizer.
        Note that this state dict update is performed in place.

.. note:: PyTorch is using lazy init to initialize the optim states.
    So it is possible that there is no optim state when user call
    ``load_state_dict`` and for ``_NamedOptimizer`` we make it stricter
    that users can only call ``load_state_dict`` after the state is initialized.
    By doing this, we can validate the optim ``state_dict`` to be loaded.
rL   zJExpects the optim to be initialized before load but found not initialized.zExpects equal length as z for parameter z but found: zExpects state z but not found.z"Expects equal number of shards as z but found z for Ú/r   r'   z"Expects equal param_group size as z for group Ú.zExpects group key z to be in group z  in `state_dict` but is missing.N)r,   rM   Ú_pre_load_state_dictÚlenr3   Ú	enumerater/   r2   rB   r
   rC   Úlocal_shardsÚzipÚtensorÚdetachÚcopy_r   r   r   r-   Ú_gen_param_group_keyr4   Úload_state_dict)r5   rM   Únew_state_dictrL   Ú	new_stateÚidxÚ	param_keyÚ	state_keyrQ   Úsrc_state_valÚ
num_shardsÚnum_new_shardsÚshardÚ	src_shardÚsrc_param_groupsÚnew_param_groupsÚsrc_group_mapr:   rT   Únew_group_mapÚ	new_groupÚ	group_keyÚ	src_grouprV   s   &&                      r!   rx   Ú_NamedOptimizer.load_state_dictª   s¿  € ð6 Ÿ™×3Ñ3Ó5ˆØ×.Ñ.¨zÓ:ˆ
Ø˜7Õ#ˆØ" 7Õ+ˆ	Üˆy‹>˜QÔÜØ\óð ô (¨×(?Ñ(?×@‰NˆCàÔ%ÙÜ�5Õ#Ó$¬¨I­NÓ(;Ô;Ü Ø.¬s°9µ>Ó/BÐ.CÀ?ÐS\ÐR]Ð]iÔjmÐnsÕn~Ójð  jAð  Bóð ð )2­×(<Ñ(<×(>Ñ$�	Ø¨)Õ$4Ô4Ü$Ø(¨¨°?À9À+È_Ð]óð ð !&Õ 0°Õ ;�Ü˜i¬×7Ò7Ü% m´]×CÒCÜ,Ð,Ü!$ Y×%;Ñ%;Ó%=Ó!>�JÜ%(¨×)CÑ)CÓ)EÓ%F�NØ!Ô3Ü(Ø@ÀÐ@PÐP[Ð\fÐ[gÐglÐmvÐlwÐwxð  zCð  yDð  Eóð ô -0Ø!×.Ñ.Ó0°-×2LÑ2LÓ2Nö-Ñ(˜ð Ÿ™×+Ñ+Ó-×3Ñ3°I×4DÑ4DÖEô-ô   	¬5¯<©<×8Ò8Ü% m´U·\±\×BÒBÜ,Ð,Ø×$Ñ$Ó&×,Ñ,¨]×;ä08¸Ó0G�I•N 9Ô-ô3 )?ñ AðJ & nÕ5ÐØ)¨.Õ9ÐàˆÛ%ˆEÜ˜e H�oÓ.ˆJØ>CˆMÔ.¨zÓ:Ó;ñ &ð ˆÛ)ˆIØˆJØ& x×0Ð0�	Ø×!Ñ! $×"9Ñ"9¸)Õ"DÖEñ 1à>GˆMÔ.¨zÓ:Ó;ñ	 *ð
 %2×$7Ñ$7Ö$9Ñ ˆI�yð  Ô-ÙØ% iÕ0ˆIÜ�9‹~¤ Y£Ô/Ü Ø8¼¸Y»Ð8HÈÐT]ÐS^Ð^iÔjmÐnwÓjxÐiyÐyzÐ{óð ó �Ø˜IÔ%Ü$Ø,¨Q¨CÐ/?À	¸{ÐJjÐkóð ð ˜–=Ü#+¨I°a­LÓ#9�I˜a“Ló ñ %:ð$ 	�‰×'Ñ'¨Ö7r$   c                ó:   <€ V ^8„  d   QhRS[ S[S[3,          RR/# )r   rF   r   N)r   r   r   )r   r    s   "€r!   r"   r#     s$   ø€ ÷ 9ñ 9©7±3¹°8Õ+<ð 9Àñ 9r$   c                ó  € \        V\        4      '       g   \        R4      hVR,          p\        V\        P                  4      '       d   V.VR&   M\        V4      VR&   V P                  P                  4        UUu/ uF  w  r4WCbK	  	  pppVR,           F5  pWE9  d   \        R4      hV P                  P                  WT,          4       K7  	  V P                  P                  V4       V P                  P                  V n        R# u uppi )z‡
Add a param group to the :class:`_NamedOptimizer` s `param_groups`.

Warning: This API is still in development and subject to change.
rA   r'   z%some parameters are not in the moduleN)rB   r   rC   r   r   r-   r   r2   r3   r/   r4   r,   Úadd_param_groupr   )r5   rF   r'   r7   r8   r9   s   &&    r!   r�   Ú_NamedOptimizer.add_param_group  sâ   € ô ˜+¤t×,Ò,Ü Ð!=Ó>Ð>à˜XÕ&ˆÜ�fœeŸl™l×+Ò+Ø%+ HˆK˜Ò!ä$(¨£LˆK˜Ñ!à59×5JÑ5J×5PÑ5PÔ5RÔSÑ5R¡z s˜š
Ñ5RˆÑSØ  ×*Ð*ˆEØÔ(Ü Ð!HÓIÐIØ×#Ñ#×*Ñ*¨<Õ+>Ö?ñ +ð
 	�‰×'Ñ'¨Ô4à ŸO™O×8Ñ8ˆÖùó Ts   Á=Dc                ó   <€ V ^8„  d   QhRR/# r>   r?   )r   r    s   "€r!   r"   r#   -  s   ø€ ÷  ñ  ˜Dñ  r$   c                ó  € V P                   P                  4        FQ  pVP                  '       g   K  \        P                  ! V4      p\        P
                  P                  V4      Vn        KS  	  V P                  RR7       R# )zÂ
Run a dummy optimizer step, which allows us to initialize optimizer state because we do lazy init for most optimizers.

This allows doing in-place loading of optimizer state from a checkpoint.
Nrg   )	r   r+   Úrequires_gradr   Ú
zeros_likeÚautogradÚVariableÚgradr_   )r5   r8   Úts   &  r!   Ú
init_stateÚ_NamedOptimizer.init_state-  s_   € ð ×*Ñ*×1Ñ1Ö3ˆEØ×"×"Ò"Ü×$Ò$ UÓ+�Ü"Ÿ^™^×4Ñ4°QÓ7�–
ñ 4ð
 	�	‰	˜$ˆ	Ör$   c                óR   <€ V ^8„  d   QhRS[ S[S[3,          RS[ S[S[3,          /# ©r   rM   r   rJ   )r   r    s   "€r!   r"   r#   :  s+   ø€ ÷ ñ ©t±C¹°H­~ð Á$ÁsÉCÀxÅ.ñ r$   c                ó¢   € \        V P                  \        4      '       d/   \        P                  ! V P                  V P                  VR R7      # V# )T)Úis_named_optimizer)rB   r   ÚFSDPÚoptim_state_dict_to_loadr,   ©r5   rM   s   &&r!   ro   Ú$_NamedOptimizer._pre_load_state_dict:  sA   € ô �d—k‘k¤4×(Ò(Ü×0Ò0Ø—‘˜TŸ_™_¨jÈTôð ð Ðr$   c                óR   <€ V ^8„  d   QhRS[ S[S[3,          RS[ S[S[3,          /# rš   rJ   )r   r    s   "€r!   r"   r#   C  s+   ø€ ÷ ñ ©4±±S°­>ð ¹dÁ3ÉÀ8½nñ r$   c                óž   € \        V P                  \        4      '       d-   \        P                  ! V P                  V P                  V4       V# r]   )rB   r   r�   Úoptim_state_dictr,   rŸ   s   &&r!   rO   Ú _NamedOptimizer._post_state_dictC  s5   € ô �d—k‘k¤4×(Ò(Ü×!Ò! $§+¡+¨t¯©À
ÔKØÐr$   )r,   r   r   r/   r   )NNr]   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r;   r*   rM   r   r_   ÚpropertyrL   rx   r�   r—   ro   rO   Ú__static_attributes__Ú__classdictcell__)r    s   @r!   r   r      s    ø‡ € ñ)÷V)9ò )9÷V/ð /÷&Wð Wð4 ß5Ñ5ó Ø5àß>ó Ø>÷5ò 5ð ÷%ó ð%÷h8ð h8÷T9ð 9÷2 ð  ÷ð ÷ö r$   r   c                óF   € V ^8„  d   QhR\         \        ,          R\        /# )r   rT   r   )r-   r   )r   s   "r!   r"   r"   K  s   € ÷ (ñ (¤T¬#¥Yð (´3ñ (r$   c                ó6   € RP                  \        V 4      4      # )zFConcatenate all param keys as a unique identifier for one param group.rm   )ÚjoinrN   )rT   s   &r!   rw   rw   K  s   € à�8‰8”F˜:Ó&Ó'Ð'r$   c                óV   € V ^8„  d   Qh/ ^ \         9   d   \        \        ,          ;R&   # )r   Ú__all__)Ú__conditional_annotations__r-   r   )r   s   "r!   r"   r"      s   € ‡�÷ Ò ŒŒc�Ñ ò r$   )r²   Úloggingr0   Úcollections.abcr   r   r   Úcopyr   Útypingr   r   r   Útorch.nnr   r	   Ú'torch.distributed._shard.sharded_tensorr
   Útorch.distributed.fsdpr   r�   r±   Ú	getLoggerr¥   Úloggerr   r   rw   r"   )r²   s   @r!   Ú<module>r¼      s[   øðß €Û ß 9Ñ 9Ý ß  ã Ý Ý Ý AÝ Cð €Ó à	×	Ò	˜8Ó	$€ôu�e—o‘oô u÷p	(r$   