
    RЦi.                     2    S r SSKrSSKJr   " S S\5      rg)am  PyTorch LARS / LARC Optimizer

An implementation of LARS (SGD) + LARC in PyTorch

Based on:
  * PyTorch SGD: https://github.com/pytorch/pytorch/blob/1.7/torch/optim/sgd.py#L100
  * NVIDIA APEX LARC: https://github.com/NVIDIA/apex/blob/master/apex/parallel/LARC.py

Additional cleanup and modifications to properly support PyTorch XLA.

Copyright 2021 Ross Wightman
    N)	Optimizerc                      ^  \ rS rSrSr         SU 4S jjrU 4S jr\R                  " 5       SS j5       r	Sr
U =r$ )	Lars   a  LARS for PyTorch

Paper: `Large batch training of Convolutional Networks` - https://arxiv.org/pdf/1708.03888.pdf

Args:
    params (iterable): iterable of parameters to optimize or dicts defining parameter groups.
    lr (float, optional): learning rate (default: 1.0).
    momentum (float, optional): momentum factor (default: 0)
    weight_decay (float, optional): weight decay (L2 penalty) (default: 0)
    dampening (float, optional): dampening for momentum (default: 0)
    nesterov (bool, optional): enables Nesterov momentum (default: False)
    trust_coeff (float): trust coefficient for computing adaptive lr / trust_ratio (default: 0.001)
    eps (float): eps for division denominator (default: 1e-8)
    trust_clip (bool): enable LARC trust ratio clipping (default: False)
    always_adapt (bool): always apply LARS LR adapt, otherwise only when group weight_decay != 0 (default: False)
c                    > US:  a  [        SU 35      eUS:  a  [        SU 35      eUS:  a  [        SU 35      eU(       a  US::  d  US:w  a  [        S5      e[        UUUUUUUU	U
S9	n[        TU ]  X5        g )Ng        zInvalid learning rate: zInvalid momentum value: zInvalid weight_decay value: r   z8Nesterov momentum requires a momentum and zero dampening)	lrmomentum	dampeningweight_decaynesterovtrust_coeffeps
trust_clipalways_adapt)
ValueErrordictsuper__init__)selfparamsr   r	   r
   r   r   r   r   r   r   defaults	__class__s               N/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/optim/lars.pyr   Lars.__init__#   s     86rd;<<c>7zBCC#;L>JKKQ)q.WXX%#!%

 	*    c                 n   > [         TU ]  U5        U R                   H  nUR                  SS5        M     g )Nr   F)r   __setstate__param_groups
setdefault)r   stategroupr   s      r   r   Lars.__setstate__F   s0    U#&&EZ/ 'r   c           
         SnUb%  [         R                  " 5          U" 5       nSSS5        U R                   GH  nUS   nUS   nUS   nUS   nUS   nUS   n	US    GHq  n
U
R                  c  M  U
R                  nUS	:w  d
  US
   (       a  U
R	                  S5      nUR	                  S5      nX-  XU-  -   U	-   -  n[         R
                  " US	:  [         R
                  " US	:  US5      S5      nUS   (       a  [         R                  " XS   -  SS9nUR                  XS9  UR                  U5        US	:w  a  U R                  U
   nSU;  a*  [         R                  " U5      R                  5       =nUS'   O'US   nUR                  U5      R                  USU-
  S9  U(       a  UR                  UUS9nOUnU
R                  XS   * S9  GMt     GM     U$ ! , (       d  f       GN= f)zPerforms a single optimization step.

Args:
    closure (callable, optional): A closure that reevaluates the model and returns the loss.
Nr   r	   r
   r   r   r   r   r   r   g       @      ?r   r   )max)alphamomentum_buffer)torchenable_gradr   gradnormwhereclampadd_mul_r    clonedetachadd)r   closurelossr!   r   r	   r
   r   r   r   pr*   w_normg_normtrust_ratioparam_statebufs                    r   step	Lars.stepK   s    ""$y % &&E 0LZ(Hk*IZ(H.K,C8_66>vv  1$n(=VVC[F!YYs^F"-"6&LCX:X[^:^"_K #(++
FQJSA#K
 \*&+kk+d2KQT&UIIaI4IIk* q="&**Q-K(;?D{{4?P?W?W?YYk*;<)*;<*//BN/K#xx8x<"t$K<0I % '\ c %$s   G
G* )	r$   r   r   r   FgMbP?g:0yE>FF)N)__name__
__module____qualname____firstlineno____doc__r   r   r(   no_gradr;   __static_attributes____classcell__)r   s   @r   r   r      sJ    ( !+F0
 ]]_9 9r   r   )rB   r(   torch.optim.optimizerr   r   r=   r   r   <module>rG      s      +t9 tr   