
    ~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FTRL optimizer implementation.    N)	optimizer)register_keras_serializable)keras_exportz"keras.optimizers.experimental.Ftrlzkeras.optimizers.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 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}}
    MbP?      皙?        NFGz?Tc                     t                      j        d	|||	|
|||||d	| |dk     rt          d| d          |dk    rt          d| d          |dk     rt          d| d          |dk     rt          d| d          |dk     rt          d| d          |                     |          | _        || _        || _        || _        || _        || _	        || _
        d S )
N)	nameweight_decayclipnorm	clipvalueglobal_clipnormuse_emaema_momentumema_overwrite_frequencyjit_compiler   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/movieo_spanner_bot/venv/lib/python3.11/site-packages/keras/optimizers/ftrl.pyr   zFtrl.__init__c   s   ( 	 	
%+%$;#	
 	
 	
 	
 	
 %s**0,0 0 0  
 $$>':> > >   &++1-1 1 1  
 &++1-1 1 1  
 0#55<8< < <   #77FF#6 )B&*D'*D'0 	1 			    c                    t                                          |           t          | d          r	| j        rdS g | _        g | _        |D ]}| j                            |                     |dt          j	        t          j
        |j        | j                  |j                                       | j                            |                     |d                     d	| _        dS )
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)r1   r2   T)r   buildhasattrr,   _accumulators_linearsappendadd_variable_from_referencetfcastfillshaper    r0   )r%   var_listvarr(   s      r)   r5   z
Ftrl.build   s    	h4"" 	t{ 	F 	 	C%%00#&"/"$'!$$2P   "i	# # # 1 	 	   M  00#&h 1     
 r*   c                    t          j        | j        |j                  }|                     |          }| j        | j        |                  }| j        | j        |                  }| j        }| j	        }|| j
        d|z  z  z   }|d| j        z  |z  z   }	|t          j        |d          z   }
|                    |	t          j        |
|           t          j        ||           z
  |z  |z  z
             t          j        |
|           |z  d|z  z   }t          j        || j         | j                  }|                    ||z
  |z             |                    |
           dS )z=Update step given gradient and the associated model variable.g       @   N)r;   r<   r&   r0   _var_keyr7   _index_dictr8   r   r"   r$   r#   pow
assign_addclip_by_valuer!   assign)r%   gradientvariablelrvar_keyaccumr4   lr_powerl2_reggrad_to_use	new_accum	quadraticlinear_clippeds                r)   update_stepzFtrl.update_step   s~    WT'88--))"4#3G#<=t/89+0$)sRx00
 q4DDxOO 	 BF8Q///	vi(++bfUXI.F.FF	
 	
 	
 F9y22R7!f*D	),,+
 

 	&0I=>>>Yr*   c           
          t                                                      }|                    |                     | 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)   rV   zFtrl.get_config   s}    ##%%!%!?!?'" " (,'?-1-K.2.M.2.M8<8a	
 
	
 	
 	
 r*   )r	   r
   r   r   r   r   r   NNNNFr   NTr   )	__name__
__module____qualname____doc__r   r5   rT   rV   __classcell__)r(   s   @r)   r   r      s        
B BL  "%#&#&-0 $#G G G G G GR    >     B        r*   r   z{{base_optimizer_keyword_args}})r]   tensorflow.compat.v2compatv2r;   keras.optimizersr    keras.saving.object_registrationr    tensorflow.python.util.tf_exportr   	Optimizerr   replacebase_optimizer_keyword_argsr   r*   r)   <module>rh      s    % $ ! ! ! ! ! ! ! ! ! & & & & & & H H H H H H : 9 9 9 9 9 (*Ab  ^ ^ ^ ^ ^9 ^ ^  ^B |##%y'L r*   