Ë
    éÓ^j›  ã                   ó\   — d Z ddlZddlmc mZ ddlmZmZ ddl	Z	ddl
mZ  G d„ de«      Zy)aÞ  
SGDP Optimizer Implementation copied from https://github.com/clovaai/AdamP/blob/master/adamp/sgdp.py

Paper: `Slowing Down the Weight Norm Increase in Momentum-based Optimizers` - https://arxiv.org/abs/2006.08217
Code: https://github.com/clovaai/AdamP

References for added functionality:
    Cautious Optimizers: https://arxiv.org/abs/2411.16085
    Spherical Cautious Optimizers: https://openreview.net/forum?id=OyT2CJ4fh7 
Copyright (c) 2020-present NAVER Corp.
MIT license
é    N)Ú	OptimizerÚrequiredé   )Ú
projectionc            	       ób   ‡ — e Zd Zeddddddddf	ˆ fd„	Z ej                  «       dd„«       Zˆ xZS )ÚSGDPr   Fg:Œ0âŽyE>gš™™™™™¹?c                 óV   •— t        ||||||||	|
¬«	      }t        t        | �  ||«       y )N)	ÚlrÚmomentumÚ	dampeningÚweight_decayÚnesterovÚepsÚdeltaÚwd_ratioÚcaution)ÚdictÚsuperr   Ú__init__)ÚselfÚparamsr
   r   r   r   r   r   r   r   r   ÚdefaultsÚ	__class__s               €úZ/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/optim/sgdp.pyr   zSGDP.__init__   s=   ø€ ô ØØØØ%ØØØØØô

ˆô 	Œd�DÑ" 6¨8Õ4ó    c                 óÚ  — d }|�$t        j                  «       5   |«       }d d d «       | j                  D �]¥  }|d   }|d   }|d   }|d   }|j                  dd«      }|d   D �]s  }	|	j                  €Œ|	j                  }
| j
                  |	   }t        |«      dk(  rt        j                  |	«      |d<   |d   }|j                  |«      j                  |
d	|z
  ¬
«       |r	|
||z  z   }n|j                  «       }d	}t        |	j                  «      dkD  rt        |	|
||d   |d   |d   |«      \  }}nc|ra||
z  dkD  j                  |
j                  «      }|j                  |j!                  «       j#                  d¬«      «       |j                  |«       |dk7  r&|	j                  d	|d   |d   z  |z  d|z
  z  z
  «       |	j                  ||d    ¬
«       �Œv �Œ¨ |S # 1 sw Y   �ŒÁxY w)Nr   r   r   r   r   Fr   r   g      ð?)Úalphar   r   r   r   gü©ñÒMbP?)Úminr
   )ÚtorchÚenable_gradÚparam_groupsÚgetÚgradÚstateÚlenÚ
zeros_likeÚmul_Úadd_ÚcloneÚshaper   ÚtoÚdtypeÚdiv_ÚmeanÚclamp_)r   ÚclosureÚlossÚgroupr   r   r   r   r   Úpr#   r$   ÚbufÚd_pr   Úmasks                   r   Ústepz	SGDP.step1   s  € àˆØÐÜ×"Ñ"Ó$ñ !Ù“y�÷!ð ×&Ñ&ó '	0ˆEØ  Ñ0ˆLØ˜ZÑ(ˆHØ˜kÑ*ˆIØ˜ZÑ(ˆHØ—i‘i 	¨5Ó1ˆGà˜8‘_ó  0�Ø—6‘6�>ØØ—v‘v�ØŸ
™
 1™�ô �u“: ’?Ü(-×(8Ñ(8¸Ó(;�E˜*Ñ%ð ˜JÑ'�Ø—‘˜Ó"×'Ñ'¨°B¸±NÐ'ÔCÙØ ¨C¡Ñ/‘CàŸ)™)›+�Cð �Ü�q—w‘w“< !Ò#Ü$.¨q°$¸¸UÀ7¹^ÈUÐS]ÑM^Ð`eÐfkÑ`lÐnuÓ$v‘M�C™ÙØ $™J¨™N×.Ñ.¨t¯z©zÓ:�DØ—I‘I˜dŸi™i›k×0Ñ0°TÐ0Ó:Ô;Ø—H‘H˜T”Nð   1Ò$Ø—F‘F˜2  d¡¨e°NÑ.CÑ CÀhÑ NÐRSÐT\ÑR\Ñ ]Ñ]Ô^ð —‘�s 5¨¡; ,�Ö/òA 0ð'	0ðR ˆ÷Y!ñ !ús   ™G Ç G*)N)	Ú__name__Ú
__module__Ú__qualname__r   r   r   Úno_gradr7   Ú__classcell__)r   s   @r   r   r      sA   ø„ ð ØØØØØØØØõ5ð4 €U‡]�]ƒ_ò/ó ô/r   r   )Ú__doc__r   Útorch.nn.functionalÚnnÚ
functionalÚFÚtorch.optim.optimizerr   r   ÚmathÚadampr   r   © r   r   ú<module>rF      s,   ðñó ß Ð ß 5Û å ôKˆ9õ Kr   