
    6bid1                     t    S r SSKJs  Jr  SSKJr  SSKJr  \" SSS/S9 " S S	\R                  5      5       r
g)
z'Ftrl-proximal optimizer implementation.    N)optimizer_v2)keras_exportzkeras.optimizers.legacy.Ftrlzkeras.optimizers.Ftrl)v1c                   r   ^  \ rS rSrSr        S
U 4S jjrS rU 4S jrSS jrSS jr	U 4S jr
S	rU =r$ )Ftrl   a  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 = (sqrt(n) - sqrt(prev_n)) / 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

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, or a schedule that is a
    `tf.keras.optimizers.schedules.LearningRateSchedule`. The learning rate.
  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`.
  name: Optional name prefix for the operations created when applying
    gradients.  Defaults to `"Ftrl"`.
  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`.
  **kwargs: keyword arguments. Allowed arguments are `clipvalue`,
    `clipnorm`, `global_clipnorm`.
    If `clipvalue` (float) is set, the gradient of each weight
    is clipped to be no higher than this value.
    If `clipnorm` (float) is set, the gradient of each weight
    is individually clipped so that its norm is no higher than this value.
    If `global_clipnorm` (float) is set the gradient of all weights is
    clipped so that their global norm is no higher than this value.

Reference:
  - [McMahan et al., 2013](
    https://research.google.com/pubs/archive/41159.pdf)
c	                    > [         T
U ]  " U40 U	D6  US:  a  [        SU S35      eUS:  a  [        SU S35      eUS:  a  [        SU S35      eUS:  a  [        SU S35      eUS:  a  [        SU S35      eU R                  SU5        U R                  S	U R                  5        U R                  S
U5        U R                  SU5        U R                  SU5        U R                  SU5        X0l        UU l        g )N        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=learning_ratedecaylearning_rate_powerl1_regularization_strengthl2_regularization_strengthbeta)super__init__
ValueError
_set_hyper_initial_decay_initial_accumulator_value%_l2_shrinkage_regularization_strength)selfr   r   initial_accumulator_valuer   r   name$l2_shrinkage_regularization_strengthr   kwargs	__class__s             ]/home/james-whalen/.local/lib/python3.13/site-packages/tf_keras/src/optimizers/legacy/ftrl.pyr   Ftrl.__init__m   s^    	(($s*--F,GqJ 
 $'':&;1> 
 &+8-.a1 
 &+8-.a1 
 0#589<  	7!4!45-/BC(*D	
 	(*D	
 	%*C'0 	2    c                     U Hp  nUR                   R                  n[        R                  R                  R                  U R                  US9nU R                  USU5        U R                  US5        Mr     g )N)dtypeaccumulatorlinear)r#   
base_dtypetfcompatr   constant_initializerr   add_slot)r   var_listvarr#   inits        r   _create_slotsFtrl._create_slots   sc    CII((E99<<44//u 5 D MM#}d3MM#x( r!   c                   > [         TU ]  XU5        X1U4   R                  [        [        R
                  " U R                  SU5      5      [        R
                  " U R                  SU5      5      [        R
                  " U R                  SU5      5      [        R
                  " U R                  SU5      5      [        R                  " U R                  U5      S95        g )Nr   r   r   r   )r   r   r   r   r   )	r   _prepare_localupdatedictr'   identity
_get_hypercastr   )r   
var_device	var_dtypeapply_stater   s       r   r1   Ftrl._prepare_local   s    zkB+,33$&KKOO$99E% ,.;;OO$@)L, ,.;;OO$@)L, [[!CD57WW>>	6	
r!   c                    UR                   UR                  R                  pTU=(       d    0 R                  XE45      =(       d    U R	                  XE5      nUS   US   SUS   -  -  -   nU R                  US5      nU R                  US5      n	U R                  S::  aV  [        R                  R                  UR                  UR                  U	R                  UUS   US   UUS	   U R                  S
9	$ [        R                  R                  UR                  UR                  U	R                  UUS   US   UUS   US	   U R                  S9
$ )Nr   r          @lr_tr$   r%   r
   r   r   )	r,   accumr%   gradlrl1l2lr_poweruse_lockingr   )
r,   r>   r%   r?   r@   rA   rB   l2_shrinkagerC   rD   )devicer#   r&   get_fallback_apply_stateget_slotr   r'   raw_opsResourceApplyFtrlhandle_use_lockingResourceApplyFtrlV2)
r   r?   r,   r9   r7   r8   coefficients#adjusted_l2_regularization_strengthr>   r%   s
             r   _resource_apply_denseFtrl._resource_apply_dense   sh    #

CII,@,@I#)r..#
 ?''
> 	 /;(/
 C,v*>$>?/@+ c=1sH-55<:://JJll}}' <=6%&;< -- 0 
 
 ::11JJll}}' <=6): &&;< -- 2  r!   c                    UR                   UR                  R                  peU=(       d    0 R                  XV45      =(       d    U R	                  XV5      nUS   US   SUS   -  -  -   nU R                  US5      n	U R                  US5      n
U R                  S::  aW  [        R                  R                  UR                  U	R                  U
R                  UUUS   US   UUS	   U R                  S
9
$ [        R                  R                  UR                  U	R                  U
R                  UUUS   US   UUS   US	   U R                  S9$ )Nr   r   r<   r=   r$   r%   r
   r   r   )
r,   r>   r%   r?   indicesr@   rA   rB   rC   rD   r   )r,   r>   r%   r?   rT   r@   rA   rB   rE   rC   rD   )rF   r#   r&   rG   rH   rI   r   r'   rJ   ResourceSparseApplyFtrlrL   rM   ResourceSparseApplyFtrlV2)r   r?   r,   rT   r9   r7   r8   rO   rP   r>   r%   s              r   _resource_apply_sparseFtrl._resource_apply_sparse   sn    #

CII,@,@I#)r..#
 ?''
> 	 /;(/
 C,v*>$>?/@+ c=1sH-55<::55JJll}}' <=6%&;< -- 6   ::77JJll}}' <=6): &&;< -- 8  r!   c                 *  > [         TU ]  5       nUR                  U R                  S5      U R                  U R
                  U R                  S5      U R                  S5      U R                  S5      U R                  S5      U R                  S.5        U$ )Nr   r   r   r   r   )r   r   r   r   r   r   r   r   )r   
get_configr2   _serialize_hyperparameterr   r   r   )r   configr   s     r   rZ   Ftrl.get_config  s    #%!%!?!?#" ,,-1-L-L'+'E'E)( /3.L.L0/ /3.L.L0/ 66v>8<8b8b!	
( r!   )r   r   )gMbP?g      g?r
   r
   r   r
   r
   )N)__name__
__module____qualname____firstlineno____doc__r   r.   r1   rQ   rW   rZ   __static_attributes____classcell__)r   s   @r   r   r      sJ    
L`  "%#&#&-0:
x)
()V+Z r!   r   )rb   tensorflow.compat.v2r(   v2r'   tf_keras.src.optimizers.legacyr    tensorflow.python.util.tf_exportr   OptimizerV2r    r!   r   <module>rk      sO    . " ! 7 : "!?@W<## W	Wr!   