
    |hk                         d Z ddlmc mZ ddlmZ ddlmZ ddl	m
Z
  e        e
dddg 	       G d
 dej                                      Zej                   j                  dej                        e_         y)zSGD optimizer implementation.    N)	optimizer)register_keras_serializable)keras_exportzkeras.optimizers.SGDz!keras.optimizers.experimental.SGDz)keras.dtensor.experimental.optimizers.SGD)v1c                   V     e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 d fd	Z fdZd Z fdZ xZS )SGDa  Gradient descent (with momentum) optimizer.

    Update rule for parameter `w` with gradient `g` when `momentum` is 0:

    ```python
    w = w - learning_rate * g
    ```

    Update rule when `momentum` is larger than 0:

    ```python
    velocity = momentum * velocity - learning_rate * g
    w = w + velocity
    ```

    When `nesterov=True`, this rule becomes:

    ```python
    velocity = momentum * velocity - learning_rate * g
    w = w + momentum * velocity - learning_rate * g
    ```

    Args:
        learning_rate: A `Tensor`, floating point value, or a schedule that is a
            `keras.optimizers.schedules.LearningRateSchedule`, or a callable
            that takes no arguments and returns the actual value to use. The
            learning rate. Defaults to 0.001.
        momentum: float hyperparameter >= 0 that accelerates gradient descent in
            the relevant direction and dampens oscillations.
            Defaults to 0, i.e., vanilla gradient descent.
        nesterov: boolean. Whether to apply Nesterov momentum.
            Defaults to `False`.
      {{base_optimizer_keyword_args}}

    Usage:

    >>> opt = tf.keras.optimizers.SGD(learning_rate=0.1)
    >>> var = tf.Variable(1.0)
    >>> loss = lambda: (var ** 2)/2.0         # d(loss)/d(var1) = var1
    >>> opt.minimize(loss, [var])
    >>> # Step is `- learning_rate * grad`
    >>> var.numpy()
    0.9

    >>> opt = tf.keras.optimizers.SGD(0.1, momentum=0.9)
    >>> var = tf.Variable(1.0)
    >>> val0 = var.value()
    >>> loss = lambda: (var ** 2)/2.0         # d(loss)/d(var1) = var1
    >>> # First step is `- learning_rate * grad`
    >>> opt.minimize(loss, [var])
    >>> val1 = var.value()
    >>> (val0 - val1).numpy()
    0.1
    >>> # On later steps, step-size increases because of momentum
    >>> opt.minimize(loss, [var])
    >>> val2 = var.value()
    >>> (val1 - val2).numpy()
    0.18

    Reference:
        - For `nesterov=True`, See [Sutskever et al., 2013](
          http://proceedings.mlr.press/v28/sutskever13.pdf).
    c                     t        |   d|||||||	|
|d	| | j                  |      | _        || _        || _        t        |t        t        f      r|dk  s|dkD  rt        d      y y )N)	nameweight_decayclipnorm	clipvalueglobal_clipnormuse_emaema_momentumema_overwrite_frequencyjit_compiler      z"`momentum` must be between [0, 1]. )
super__init___build_learning_rate_learning_ratemomentumnesterov
isinstanceintfloat
ValueError)selflearning_rater   r   r   r   r   r   r   r   r   r   r
   kwargs	__class__s                 Z/var/www/html/test/engine/venv/lib/python3.12/site-packages/tf_keras/src/optimizers/sgd.pyr   zSGD.__init__b   s      	 	
%+%$;#	
 	
 #77F  he-qLHqLABB ) .    c                     t         |   |       t        | d      r| j                  ryg | _        |D ].  }| j                  j                  | j                  |d             0 d| _        y)zInitialize optimizer variables.

        SGD optimizer has one variable `momentums`, only set if `self.momentum`
        is not 0.

        Args:
          var_list: list of model variables to build SGD variables on.
        _builtNm)model_variablevariable_nameT)r   buildhasattrr&   	momentumsappendadd_variable_from_reference)r   var_listvarr"   s      r#   r*   z	SGD.build   sm     	h4"t{{ 	CNN!!00#&c 1 	 r$   c                 l   t        j                  | j                  |j                        }d}| j	                  |      }t        j                  | j
                  |j                        }| j                  | j                  |      }t        |t         j                        rt        j                  |j                   |z  |j                        }|i|j                  ||z         |j                  |       | j                  r&|j                  |       |j                  ||z         y|j                  |       y|j                  |       y|U|j                  | |z  ||z  z          | j                  r|j                  | |z  ||z  z          y|j                  |       y|j                  | |z         y)z=Update step given gradient and the associated model variable.N)tfcastr    dtype_var_keyr   r,   _index_dictr   IndexedSlicesvaluesindicesassignscatter_addr   
assign_add)r   gradientvariablelrr'   var_keyr   	add_values           r#   update_stepzSGD.update_step   sg   WWT''8--)774==(..9NN4++G45 h 0 01(( 2%x'7'7I }X&i(==((3''H5''*$$Y/ }(R!h,67==''	BX(EF''*##XIN3r$   c                     t         |          }|j                  | j                  | j                        | j
                  | j                  d       |S )N)r    r   r   )r   
get_configupdate_serialize_hyperparameterr   r   r   )r   configr"   s     r#   rD   zSGD.get_config   sO    #%!%!?!?''" !MM MM	
 r$   )g{Gz?g        FNNNNFgGz?NTr   )	__name__
__module____qualname____doc__r   r*   rB   rD   __classcell__)r"   s   @r#   r   r      sK    >D  $"CH*!4F r$   r   z{{base_optimizer_keyword_args}})rK   tensorflow.compat.v2compatv2r2   tf_keras.src.optimizersr   'tf_keras.src.saving.object_registrationr    tensorflow.python.util.tf_exportr   	Optimizerr   replacebase_optimizer_keyword_argsr   r$   r#   <module>rV      s    $ ! ! - O : '/		i)

 i iX kk!!%y'L'Lr$   