
    ~Wh!                         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g            G d	 d
ej                                          Zej                             dej                  e_         dS )zSGD optimizer implementation.    N)	optimizer)register_keras_serializable)keras_exportz!keras.optimizers.experimental.SGDzkeras.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
        `tf.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.experimental.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.experimental.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).
    {Gz?        FNGz?Tc                     t                      j        d|||||||	|
|d	| |                     |          | _        || _        || _        t          |t          t          f          r|dk     s|dk    rt          d          d S d S )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/movieo_spanner_bot/venv/lib/python3.11/site-packages/keras/optimizers/sgd.pyr   zSGD.__init___   s      	 	
%+%$;#	
 	
 	
 	
 	
 #77FF  he-- 	CqLLHqLLABBB	C 	C(L    c                     t                                          |           t          | d          r	| j        rdS g | _        |D ]1}| j                            |                     |d                     2d| _        dS )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   s     	h4"" 	t{ 	F 	 	CN!!00#&c 1     
 r'   c                 r   t          j        | j        |j                  }d}|                     |          }t          j        | j        |j                  }| j        | j        |                  }t          |t           j	                  rt          j	        |j
         |z  |j                  }|z|                    ||z             |                    |           | j        r/|                    |           |                    ||z             dS |                    |           dS |                    |           dS |^|                    | |z  ||z  z              | j        r!|                    | |z  ||z  z              dS |                    |           dS |                    | |z             dS )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   s   WT'88--))74=(.99N4+G45 h 011 	4( 2%x'7 I }X&&&i(((= +((333''H55555''*****$$Y///// }(R!h,6777= +''	BX(EFFFFF''*****##XIN33333r'   c                     t                                                      }|                    |                     | j                  | j        | j        d           |S )N)r#   r   r   )r   
get_configupdate_serialize_hyperparameterr   r   r   )r"   configr%   s     r&   rG   zSGD.get_config   sd    ##%%!%!?!?'" " !M M 	
 	
 	
 r'   )r	   r
   FNNNNFr   NTr   )	__name__
__module____qualname____doc__r   r-   rE   rG   __classcell__)r%   s   @r&   r   r      s        
> >D  $"C "C "C "C "C "CH    *!4 !4 !4F        r'   r   z{{base_optimizer_keyword_args}})rN   tensorflow.compat.v2compatv2r5   keras.optimizersr    keras.saving.object_registrationr    tensorflow.python.util.tf_exportr   	Optimizerr   replacebase_optimizer_keyword_argsr   r'   r&   <module>rY      s    $ # ! ! ! ! ! ! ! ! ! & & & & & & H H H H H H : 9 9 9 9 9 ')?B  i i i i i)
 i i  iX k!!%y'L r'   