
    Ng                     d    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dS )a1  
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

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f fd	Z ej                    dd            Z xZS )	SGDPr   Fg:0yE>g?c
           
          t          ||||||||	          }
t          t          |                               ||
           d S )N)lrmomentum	dampeningweight_decaynesterovepsdeltawd_ratio)dictsuperr   __init__)selfparamsr
   r   r   r   r   r   r   r   defaults	__class__s              K/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/optim/sgdp.pyr   zSGDP.__init__   sT    H	3ehH H H 	dD""6844444    Nc                 (   d }|5t          j                    5   |            }d d d            n# 1 swxY w Y   | j        D ]O}|d         }|d         }|d         }|d         }|d         D ]"}|j        |j        }	| j        |         }
t          |
          dk    rt          j        |          |
d<   |
d         }|                    |                              |	d|z
             |r	|	||z  z   }n|}d}t          |j	                  d	k    r)t          ||	||d
         |d         |d                   \  }}|dk    r0|                    d|d         |d         z  |z  d	|z
  z  z
             |                    ||d                     $Q|S )Nr   r   r   r   r   r   g      ?)alphar   r   r   r   r
   )torchenable_gradparam_groupsgradstatelen
zeros_likemul_add_shaper   )r   closurelossgroupr   r   r   r   pr    r!   bufd_pr   s                 r   stepz	SGDP.step   s   "$$ ! !wyy! ! ! ! ! ! ! ! ! ! ! ! ! ! ! & "	0 "	0E 0LZ(Hk*IZ(H8_ 0 06>v
1 u::??(-(8(;(;E*% J'""''BN'CCC C/CCC qw<<!##$.q$U7^US]M^`efk`l$m$mMC  1$$FF2deN.C Ch NRST\R\ ]]^^^ s5;,////90< s   /33)N)	__name__
__module____qualname__r   r   r   no_gradr-   __classcell__)r   s   @r   r   r      sw        "*Q!%Ts5 5 5 5 5 5 U]__* * * _* * * * *r   r   )__doc__r   torch.nn.functionalnn
functionalFtorch.optim.optimizerr   r   mathadampr   r    r   r   <module>r<      s               5 5 5 5 5 5 5 5       3 3 3 3 39 3 3 3 3 3r   