Ë
    éÓ^j$  ã            	       ó¦   — d Z ddlZddlmc mZ ddlmZ ddlZdej                  fd„Z
dej                  fd„Zddeded	ed
efd„Z G d„ de«      Zy)aá  
AdamP Optimizer Implementation copied from https://github.com/clovaai/AdamP/blob/master/adamp/adamp.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Úreturnc                 óD   — | j                  | j                  d«      d«      S )Nr   éÿÿÿÿ)ÚreshapeÚsize©Úxs    ú[/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/optim/adamp.pyÚ_channel_viewr      s   € Ø�9‰9�Q—V‘V˜A“Y Ó#Ð#ó    c                 ó&   — | j                  dd«      S )Né   r   )r   r	   s    r   Ú_layer_viewr      s   € Ø�9‰9�Q˜ÓÐr   ÚdeltaÚwd_ratioÚepsÚcautionc                 ót  — d}ddt        | j                  «      dz
  z  z   }t        t        fD �]¢  }	 |	| «      }
 |	|«      }t	        j
                  ||
d|¬«      j                  «       }|j                  «       |t        j                  |
j                  d«      «      z  k  sŒt| |
j                  dd¬«      j                  |«      j                  |«      z  }|| |	||z  «      j                  d¬«      j                  |«      z  z  }|rÃ| |	||z  «      j                  d¬«      j                  |«      z  }||z
  }||z  d	kD  j                  |j                   «      }|j#                  |j%                  «       j'                  d
¬«      «       |j)                  |«       || |	||z  «      j                  d¬«      j                  |«      z  z  }|}||fc S  |ra||z  d	kD  j                  |j                   «      }|j#                  |j%                  «       j'                  d
¬«      «       |j)                  |«       ||fS )Nç      ð?)r   )r   r   )Údimr   é   )Úpr   )r   r   çü©ñÒMbP?©Úmin)ÚlenÚshaper   r   ÚFÚcosine_similarityÚabs_ÚmaxÚmathÚsqrtr   ÚnormÚadd_r   ÚsumÚtoÚdtypeÚdiv_ÚmeanÚclamp_Úmul_)r   ÚgradÚperturbr   r   r   r   ÚwdÚexpand_sizeÚ	view_funcÚ
param_viewÚ	grad_viewÚ
cosine_simÚp_nÚgrad_radialÚ	grad_perpÚmasks                    r   Ú
projectionr:      s	  € Ø	€BØ˜$¤# a§g¡g£,°Ñ"2Ñ3Ñ3€KÜ#¤[Ð1ó ˆ	Ù˜q“\ˆ
Ù˜d“Oˆ	Ü×(Ñ(¨°JÀAÈ3ÔO×TÑTÓVˆ
ð �>‰>Ó˜e¤d§i¡i°
·±ÀÓ0BÓ&CÑCÓCØ�j—o‘o¨¨q�oÓ1×6Ñ6°sÓ;×CÑCÀKÓPÑPˆCØ�s™Y s¨W¡}Ó5×9Ñ9¸aÐ9Ó@×HÑHÈÓUÑUÑUˆGáà!¡I¨c°D©jÓ$9×$=Ñ$=À!Ð$=Ó$D×$LÑ$LÈ[Ó$YÑY�Ø  ;Ñ.�	à )Ñ+¨aÑ/×3Ñ3°D·J±JÓ?�Ø—	‘	˜$Ÿ)™)›+×,Ñ,°Ð,Ó6Ô7Ø—‘˜TÔ"à˜3¡¨3°©=Ó!9×!=Ñ!=À!Ð!=Ó!D×!LÑ!LÈ[Ó!YÑYÑY�ØˆBØ˜B�;Òð+ñ. à˜$‘ Ñ"×&Ñ& t§z¡zÓ2ˆØ�	‰	�$—)‘)“+×$Ñ$¨Ð$Ó.Ô/Ø�‰�TÔà�Bˆ;Ðr   c                   ó`   ‡ — e Zd Z	 	 	 	 	 	 	 	 dˆ fd„	Z ej
                  «       dd„«       Zˆ xZS )ÚAdamPc
           
      óT   •— t        ||||||||	¬«      }
t        t        | �  ||
«       y )N)ÚlrÚbetasr   Úweight_decayr   r   Únesterovr   )ÚdictÚsuperr<   Ú__init__)ÚselfÚparamsr>   r?   r   r@   r   r   rA   r   ÚdefaultsÚ	__class__s              €r   rD   zAdamP.__init__A   s:   ø€ ô ØØØØ%ØØØØô	
ˆô 	Œe�TÑ# F¨HÕ5r   c                 ó  — d }|�$t        j                  «       5   |«       }d d d «       | j                  D �]A  }|d   D �]5  }|j                  €Œ|j                  }|d   \  }}|d   }|j	                  dd«      }	| j
                  |   }
t        |
«      dk(  r5d|
d<   t        j                  |«      |
d<   t        j                  |«      |
d	<   |
d   |
d	   }}|
dxx   d
z  cc<   d
||
d   z  z
  }d
||
d   z  z
  }|j                  |«      j                  |d
|z
  ¬«       |j                  |«      j                  ||d
|z
  ¬«       |j                  «       t        j                  |«      z  j                  |d   «      }|d   |z  }|r||z  d
|z
  |z  z   |z  }n||z  }d}t        |j                  «      d
kD  rt        ||||d   |d   |d   |	«      \  }}nc|	ra||z  dkD  j                  |j                   «      }|j#                  |j%                  «       j'                  d¬«      «       |j                  |«       |d   dkD  r |j                  d|d   |d   z  |z  z
  «       |j                  || ¬«       �Œ8 �ŒD |S # 1 sw Y   �Œ]xY w)NrF   r?   rA   r   Fr   ÚstepÚexp_avgÚ
exp_avg_sqr   )Úalpha)Úvaluer   r>   r   r   r   r   r   r@   )ÚtorchÚenable_gradÚparam_groupsr.   ÚgetÚstater   Ú
zeros_liker-   r&   Úaddcmul_r$   r#   r   r:   r(   r)   r*   r+   r,   )rE   ÚclosureÚlossÚgroupr   r.   Úbeta1Úbeta2rA   r   rS   rK   rL   Úbias_correction1Úbias_correction2ÚdenomÚ	step_sizer/   r   r9   s                       r   rJ   z
AdamP.stepY   sº  € àˆØÐÜ×"Ñ"Ó$ñ !Ù“y�÷!ð ×&Ñ&ó 5	2ˆEØ˜8‘_ó 42�Ø—6‘6�>Øà—v‘v�Ø$ W™~‘��uØ  Ñ,�ØŸ)™) I¨uÓ5�àŸ
™
 1™�ô �u“: ’?Ø$%�E˜&‘MÜ',×'7Ñ'7¸Ó':�E˜)Ñ$Ü*/×*:Ñ*:¸1Ó*=�E˜,Ñ'ð ',¨IÑ&6¸¸lÑ8K˜�à�f“ Ñ"“Ø#$ u°°f±Ñ'=Ñ#=Ð Ø#$ u°°f±Ñ'=Ñ#=Ð à—‘˜UÓ#×(Ñ(¨°Q¸±YÐ(Ô?Ø—‘ Ó&×/Ñ/°°dÀ!ÀeÁ)Ð/ÔLà#Ÿ™Ó*¬T¯Y©YÐ7GÓ-HÑH×NÑNÈuÐUZÉ|Ó\�Ø! $™KÐ*:Ñ:�	áØ$ w™°!°e±)¸tÑ1CÑCÀuÑL‘Gà%¨™o�Gð �Ü�q—w‘w“< !Ò#Ü(2Ø˜4 ¨%°©.¸%À
Ñ:KÈUÐSXÉ\Ð[bó)Ñ%�G™Xñ à# d™N¨QÑ.×2Ñ2°4·:±:Ó>�DØ—I‘I˜dŸi™i›k×0Ñ0°TÐ0Ó:Ô;Ø—L‘L Ô&ð ˜Ñ(¨1Ò,Ø—F‘F˜2  d¡¨e°NÑ.CÑ CÀhÑ NÑNÔOð —‘�w y j�Ö1òi42ð5	2ðn ˆ÷u!ñ !ús   ™I<É<J)r   )gÍÌÌÌÌÌì?g+‡ÙÎ÷ï?g:Œ0âŽyE>r   çš™™™™™¹?r_   FF)N)Ú__name__Ú
__module__Ú__qualname__rD   rO   Úno_gradrJ   Ú__classcell__)rH   s   @r   r<   r<   @   s>   ø„ ð ØØØØØØØõ6ð0 €U‡]�]ƒ_ò=ó ô=r   r<   )F)Ú__doc__rO   Útorch.nn.functionalÚnnÚ
functionalr   Útorch.optim.optimizerr   r#   ÚTensorr   r   ÚfloatÚboolr:   r<   © r   r   ú<module>rn      sl   ðñó ß Ð Ý +Û ð$˜Ÿ™ó $ð�e—l‘ló ñ ¨ð  ¸ð  ÀUð  ÐUYó  ôFWˆIõ Wr   