
    |hO&                         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                   j                  dej                        e_         y)zFTRL optimizer implementation.    N)	optimizer)register_keras_serializable)keras_exportzkeras.optimizers.Ftrlz"keras.optimizers.experimental.Ftrl)v1c                   ^     e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fd	Z fdZd Z fdZ xZS )Ftrla
  Optimizer that implements the FTRL algorithm.

    "Follow The Regularized Leader" (FTRL) is an optimization algorithm
    developed at Google for click-through rate prediction in the early 2010s. It
    is most suitable for shallow models with large and sparse feature spaces.
    The algorithm is described by
    [McMahan et al., 2013](https://research.google.com/pubs/archive/41159.pdf).
    The TF-Keras version has support for both online L2 regularization
    (the L2 regularization described in the paper
    above) and shrinkage-type L2 regularization
    (which is the addition of an L2 penalty to the loss function).

    Initialization:

    ```python
    n = 0
    sigma = 0
    z = 0
    ```

    Update rule for one variable `w`:

    ```python
    prev_n = n
    n = n + g ** 2
    sigma = (n ** -lr_power - prev_n ** -lr_power) / lr
    z = z + g - sigma * w
    if abs(z) < lambda_1:
      w = 0
    else:
      w = (sgn(z) * lambda_1 - z) / ((beta + sqrt(n)) / alpha + lambda_2)
    ```

    Notation:

    - `lr` is the learning rate
    - `g` is the gradient for the variable
    - `lambda_1` is the L1 regularization strength
    - `lambda_2` is the L2 regularization strength
    - `lr_power` is the power to scale n.

    Check the documentation for the `l2_shrinkage_regularization_strength`
    parameter for more details when shrinkage is enabled, in which case gradient
    is replaced with a gradient with shrinkage.

    Args:
        learning_rate: A `Tensor`, floating point value, 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`.
        learning_rate_power: A float value, must be less or equal to zero.
            Controls how the learning rate decreases during training. Use zero
            for a fixed learning rate.
        initial_accumulator_value: The starting value for accumulators. Only
            zero or positive values are allowed.
        l1_regularization_strength: A float value, must be greater than or equal
            to zero. Defaults to `0.0`.
        l2_regularization_strength: A float value, must be greater than or equal
            to zero. Defaults to `0.0`.
        l2_shrinkage_regularization_strength: A float value, must be greater
            than or equal to zero. This differs from L2 above in that the L2
            above is a stabilization penalty, whereas this L2 shrinkage is a
            magnitude penalty. When input is sparse shrinkage will only happen
            on the active weights.
        beta: A float value, representing the beta value from the paper.
            Defaults to 0.0.
        {{base_optimizer_keyword_args}}
    c                    t        |   d	|||	|
|||||d	| |dk  rt        d| d      |dkD  rt        d| d      |dk  rt        d| d      |dk  rt        d| d      |dk  rt        d| d      | j                  |      | _        || _        || _        || _        || _        || _	        || _
        y )
N)	nameweight_decayclipnorm	clipvalueglobal_clipnormuse_emaema_momentumema_overwrite_frequencyjit_compile        z^`initial_accumulator_value` needs to be positive or zero. Received: initial_accumulator_value=.zR`learning_rate_power` needs to be negative or zero. Received: learning_rate_power=z``l1_regularization_strength` needs to be positive or zero. Received: l1_regularization_strength=z``l2_regularization_strength` needs to be positive or zero. Received: l2_regularization_strength=zt`l2_shrinkage_regularization_strength` needs to be positive or zero. Received: l2_shrinkage_regularization_strength= )super__init__
ValueError_build_learning_rate_learning_ratelearning_rate_powerinitial_accumulator_valuel1_regularization_strengthl2_regularization_strength$l2_shrinkage_regularization_strengthbeta)selflearning_rater   r   r   r   r   r    r   r   r   r   r   r   r   r   r
   kwargs	__class__s                     [/var/www/html/test/engine/venv/lib/python3.12/site-packages/tf_keras/src/optimizers/ftrl.pyr   zFtrl.__init__d   sR   ( 	 	
%+%$;#	
 	
 %s*7,-Q0 
 $'':&;1>  &+8-.a1 
 &+8-.a1 
 0#589<  #77F#6 )B&*D'*D'0 	1 	    c                    t         |   |       t        | d      r| j                  ryg | _        g | _        |D ]  }| j                  j                  | j                  |dt        j                  t        j                  |j                  | j                        |j                                     | j
                  j                  | j                  |d              d	| _        y)
zInitialize optimizer variables.

        Args:
          var_list: list of model variables to build Ftrl variables on.
        _builtNaccumulator)dimsvalue)dtype)model_variablevariable_nameinitial_valuelinear)r-   r.   T)r   buildhasattrr(   _accumulators_linearsappendadd_variable_from_referencetfcastfillshaper   r,   )r!   var_listvarr$   s      r%   r1   z
Ftrl.build   s     	h4"t{{ 	C%%00#&"/"$''!$$2P2P "ii	# 1 	 MM  00#&h 1 	$ r&   c                    t        j                  | j                  |j                        }| j	                  |      }| j
                  | j                  |      }| j                  | j                  |      }| j                  }| j                  }|| j                  d|z  z  z   }|d| j                  z  |z  z   }	|t        j                  |d      z   }
|j                  |	t        j                  |
|       t        j                  ||       z
  |z  |z  z
         t        j                  |
|       |z  d|z  z   }t        j                  || j                   | j                        }|j!                  ||z
  |z         |j!                  |
       y)z=Update step given gradient and the associated model variable.g       @   N)r7   r8   r"   r,   _var_keyr3   _index_dictr4   r   r   r    r   pow
assign_addclip_by_valuer   assign)r!   gradientvariablelrvar_keyaccumr0   lr_powerl2_reggrad_to_use	new_accum	quadraticlinear_clippeds                r%   update_stepzFtrl.update_step   sy    WWT''8--)""4#3#3G#<=t//89++00$))sRx00
 q4DDDxOO 	 BFF8Q//	vvi(+bffUXI.FF	
 FF9y2R7!f*D	)),,,++

 	&0I=>Yr&   c           
          t         |          }|j                  | j                  | j                        | j
                  | j                  | j                  | j                  | j                  | j                  d       |S )N)r"   r   r   r   r   r   r    )r   
get_configupdate_serialize_hyperparameterr   r   r   r   r   r   r    )r!   configr$   s     r%   rR   zFtrl.get_config   su    #%!%!?!?''" (,'?'?-1-K-K.2.M.M.2.M.M8<8a8a		
	
 r&   )gMbP?g      g?r   r   r   r   NNNNFgGz?NTr   )	__name__
__module____qualname____doc__r   r1   rP   rR   __classcell__)r$   s   @r%   r   r      sX    
CN  "%#&#&-0 $#GR> B r&   r   z{{base_optimizer_keyword_args}})rY   tensorflow.compat.v2compatv2r7   tf_keras.src.optimizersr   'tf_keras.src.saving.object_registrationr    tensorflow.python.util.tf_exportr   	Optimizerr   replacebase_optimizer_keyword_argsr   r&   r%   <module>rd      s{    % ! ! - O : Ab_9 _ _D ||##%y'L'Lr&   