
    2Vh                         d dl mZ d dl mZ d dlmZ d dlmZ  edg       G d dej                               Zej                  j                  dej                        e_	        y	)
    )backend)ops)keras_export)	optimizerzkeras.optimizers.Nadamc                   d     e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fd	Z fdZ fdZd Z fdZ xZ	S )Nadama  Optimizer that implements the Nadam algorithm.

    Much like Adam is essentially RMSprop with momentum, Nadam is Adam with
    Nesterov momentum.

    Args:
        learning_rate: A float, a
            `keras.optimizers.schedules.LearningRateSchedule` instance, or
            a callable that takes no arguments and returns the actual value to
            use. The learning rate. Defaults to `0.001`.
        beta_1: A float value or a constant float tensor, or a callable
            that takes no arguments and returns the actual value to use. The
            exponential decay rate for the 1st moment estimates.
            Defaults to `0.9`.
        beta_2: A float value or a constant float tensor, or a callable
            that takes no arguments and returns the actual value to use. The
            exponential decay rate for the 2nd moment estimates. Defaults to
            `0.999`.
        epsilon: A small constant for numerical stability. This epsilon is
            "epsilon hat" in the Kingma and Ba paper (in the formula just before
            Section 2.1), not the epsilon in Algorithm 1 of the paper.
            Defaults to `1e-7`.
        {{base_optimizer_keyword_args}}

    Reference:

    - [Dozat, 2015](http://cs229.stanford.edu/proj2015/054_report.pdf).

    c                 f    t        |   d|||||||	|
|||d| || _        || _        || _        y )N)learning_ratenameweight_decayclipnorm	clipvalueglobal_clipnormuse_emaema_momentumema_overwrite_frequencyloss_scale_factorgradient_accumulation_steps )super__init__beta_1beta_2epsilon)selfr
   r   r   r   r   r   r   r   r   r   r   r   r   r   kwargs	__class__s                   J/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/optimizers/nadam.pyr   zNadam.__init__'   sY    $ 	 	
'%+%$;/(C	
 	
     c                    | j                   ry|r|d   j                  }nt        j                         }t        |   |       | j                  |ddg      \  | _        | _        t        j                  d|      | _
        y)zInitialize optimizer variables.

        Nadam optimizer has 2 types of variables: momentums and velocities.

        Args:
            var_list: list of model variables to build Nadam variables on.
        Nr   momentumvelocity      ?)dtype)builtr$   r   floatxr   buildadd_optimizer_variables
_momentums_velocitiesVariable
_u_product)r   var_listr$   r   s      r   r'   zNadam.buildK   ss     ::QK%%ENN$Eh,0,H,Hz:.-
)) "**3e<r   c                 6   | j                   j                  }| j                  | j                   | j                   | j                  z  ddt	        j
                  dt	        j                  | j                  dz   |            z  z
  z         t        | %  |||       y )Nr#         ?Q?   )
r,   r$   assignr   r   powercast
iterationsr   _backend_update_step)r   gradstrainable_variablesr
   r$   r   s        r   r6   zNadam._backend_update_step_   s    %%OOOOkk 		$11De(LMMN	
 	$U,?Or   c                    |j                   }t        j                  ||      }t        j                  ||      }t        j                  | j                  dz   |      }t        j                  | j                  dz   |      }t        j                  d|      }t        j                  | j                  |      }	t        j                  | j
                  |      }
|	ddt        j                  ||      z  z
  z  }|	ddt        j                  ||      z  z
  z  }t        j                  | j                  |      }||z  }t        j                  |
|      }| j                  | j                  |         }| j                  | j                  |         }| j                  |t        j                  t        j                  ||      d|	z
               | j                  |t        j                  t        j                  t        j                  |      |      d|
z
               t        j                  t        j                   t        j                  ||      d|z
        t        j                   t        j                  d|z
  |      d|z
              }t        j                   |d|z
        }| j#                  |t        j                   t        j                  ||      t        j                  t        j$                  |      | j&                                     y)z=Update step given gradient and the associated model variable.r1      r0   r#   r/   N)r$   r   r4   r5   r   r   r3   r,   r)   _get_variable_indexr*   
assign_addmultiplysubtractsquareadddivide
assign_subsqrtr   )r   gradientvariabler
   	var_dtypelr
local_step	next_stepdecayr   r   u_tu_t_1u_product_tu_product_t_1beta_2_powermvm_hatv_hats                       r   update_stepzNadam.update_stepl   s>   NN	XXmY/88Hi0XXdoo19=
HHT__q0)<	y)$++y1$++y1cSYYuj%ABBC#syy	'B CCDhht	:#e+yy4OOD44X>?T55h?@s||CLL15F
D	
 	s||CLLH)=qAAJP	
 JJs||E1-q=/@AJJs||AGX6KH
 

1q</1JJUB'%$,,)O	
r   c                     t         |          }|j                  | j                  | j                  | j
                  d       |S )N)r   r   r   )r   
get_configupdater   r   r   )r   configr   s     r   rV   zNadam.get_config   s=    #%++++<<	
 r   )gMbP?g?g+?gHz>NNNNFgGz?NNNnadam)
__name__
__module____qualname____doc__r   r'   r6   rT   rV   __classcell__)r   s   @r   r   r      sV    @  $$("H=(P&
P
 
r   r   z{{base_optimizer_keyword_args}}N)	keras.srcr   r   keras.src.api_exportr   keras.src.optimizersr   	Optimizerr   r]   replacebase_optimizer_keyword_argsr   r   r   <module>re      sb      - * '()VI V *Vr %%%y'L'Lr   