
    &Vf                         d dl mZ d dlmZ d dlmZ  ed           G d dej                              Zej        	                    dej
                  e_        dS )	    )ops)keras_export)	optimizerzkeras.optimizers.SGDc                   X     e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 d fd	Z fdZd	 Z fd
Z xZS )SGDaI  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 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.01`.
        momentum: float hyperparameter >= 0 that accelerates gradient descent in
            the relevant direction and dampens oscillations. 0 is vanilla
            gradient descent. Defaults to `0.0`.
        nesterov: boolean. Whether to apply Nesterov momentum.
            Defaults to `False`.
        {{base_optimizer_keyword_args}}
    {Gz?        FNGz?c                      t                      j        d||||||||	|
||d| t          |t                    r|dk     s|dk    rt	          d          || _        || _        d S )N)learning_ratenameweight_decayclipnorm	clipvalueglobal_clipnormuse_emaema_momentumema_overwrite_frequencyloss_scale_factorgradient_accumulation_stepsr      z*`momentum` must be a float between [0, 1]. )super__init__
isinstancefloat
ValueErrormomentumnesterov)selfr   r   r   r   r   r   r   r   r   r   r   r   r   kwargs	__class__s                  U/var/www/html/software/conda/lib/python3.11/site-packages/keras/src/optimizers/sgd.pyr   zSGD.__init__+   s    " 	 	
'%+%$;/(C	
 	
 	
 	
 	
 (E** 	KhllhllIJJJ      c                     | j         rdS t                                          |           g | _        | j        dk    r4|D ]3}| j                            |                     |d                     2dS 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.
        Nr   r   )reference_variabler   )builtr   build	momentumsr   appendadd_variable_from_reference)r    	variablesvariabler"   s      r#   r(   z	SGD.buildO   s     : 	Fi   =A%  %%44+3* 5       r$   c           
         t          j        ||j                  }t          j        ||j                  }d}| j        dk    r | j        |                     |                   }|t          j        | j        |j                  }|                     |t          j        t          j        ||          t          j        ||                               | j	        rQ| 
                    |t          j        t          j        ||          t          j        ||                               dS | 
                    ||           dS |                     |t          j        ||                     dS )z=Update step given gradient and the associated model variable.Nr   )r   castdtyper   r)   _get_variable_indexassignsubtractmultiplyr   
assign_add
assign_sub)r    gradientr-   r   mr   s         r#   update_stepzSGD.update_stepd   sR   ??8Hhn55=At77AABA=xx~>>HKKLH--L=99    } 	-LQ11X}==      !,,,,,OOHcl8]&K&KLLLLLr$   c                     t                                                      }|                    | j        | j        d           |S )N)r   r   )r   
get_configupdater   r   )r    configr"   s     r#   r;   zSGD.get_config   sI    ##%% M M 	
 	
 	
 r$   )r   r	   FNNNNFr
   NNNr   )	__name__
__module____qualname____doc__r   r(   r9   r;   __classcell__)r"   s   @r#   r   r      s        ! !J  $$("! "! "! "! "! "!H    *M M M<        r$   r   z{{base_optimizer_keyword_args}}N)	keras.srcr   keras.src.api_exportr   keras.src.optimizersr   	Optimizerr   rA   replacebase_optimizer_keyword_argsr   r$   r#   <module>rI      s          - - - - - - * * * * * * $%%C C C C C)
 C C &%CL k!!%y'L r$   