o
    ?e4                     @   sz   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ ed	gd
G dd dejZdS )zFtrl-proximal for TensorFlow.    )dtypes)ops)	array_ops)math_ops)	optimizer)training_ops)	tf_exportztrain.FtrlOptimizer)v1c                       sf   e Zd ZdZ										d fdd		Zd
d Zdd Zdd Zdd Zdd Z	dd Z
  ZS )FtrlOptimizera  Optimizer that implements the FTRL algorithm.

  This version has support for both online L2 (McMahan et al., 2013) and
  shrinkage-type L2, which is the addition of an L2 penalty
  to the loss function.

  References:
    Ad-click prediction:
      [McMahan et al., 2013](https://dl.acm.org/citation.cfm?id=2488200)
      ([pdf](https://dl.acm.org/ft_gateway.cfm?id=2488200&ftid=1388399&dwn=1&CFID=32233078&CFTOKEN=d60fe57a294c056a-CB75C374-F915-E7A6-1573FBBC7BF7D526))
        皙?        FFtrlNc                    s   t t| || |dk rtd| |dkrtd| |dk r'td| |dk r1td| |
dk r;td|
 || _|| _|| _|| _|| _|du rPdn|| _	|
| _
d| _d| _d| _d| _d| _|| _|	| _dS )a9	  Construct a new FTRL optimizer.

    Args:
      learning_rate: A float value or a constant float `Tensor`.
      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. See section 3.1 in (McMahan et al., 2013).
      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.
      l2_regularization_strength: A float value, must be greater than or
        equal to zero.
      use_locking: If `True` use locks for update operations.
      name: Optional name prefix for the operations created when applying
        gradients.  Defaults to "Ftrl".
      accum_name: The suffix for the variable that keeps the gradient squared
        accumulator.  If not present, defaults to name.
      linear_name: The suffix for the variable that keeps the linear gradient
        accumulator.  If not present, defaults to name + "_1".
      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.
        The FTRL formulation can be written as:
        w_{t+1} = argmin_w(\hat{g}_{1:t}w + L1*||w||_1 + L2*||w||_2^2), where
        \hat{g} = g + (2*L2_shrinkage*w), and g is the gradient of the loss
        function w.r.t. the weights w.
        Specifically, in the absence of L1 regularization, it is equivalent to
        the following update rule:
        w_{t+1} = w_t - lr_t / (beta + 2*L2*lr_t) * g_t -
                  2*L2_shrinkage*lr_t / (beta + 2*L2*lr_t) * w_t
        where lr_t is the learning rate at t.
        When input is sparse shrinkage will only happen on the active weights.
      beta: A float value; corresponds to the beta parameter in the paper.

    Raises:
      ValueError: If one of the arguments is invalid.

    References:
      Ad-click prediction:
        [McMahan et al., 2013](https://dl.acm.org/citation.cfm?id=2488200)
        ([pdf](https://dl.acm.org/ft_gateway.cfm?id=2488200&ftid=1388399&dwn=1&CFID=32233078&CFTOKEN=d60fe57a294c056a-CB75C374-F915-E7A6-1573FBBC7BF7D526))
    r   z9initial_accumulator_value %f needs to be positive or zeroz3learning_rate_power %f needs to be negative or zeroz:l1_regularization_strength %f needs to be positive or zeroz:l2_regularization_strength %f needs to be positive or zerozDl2_shrinkage_regularization_strength %f needs to be positive or zeroN)superr
   __init__
ValueError_learning_rate_learning_rate_power_initial_accumulator_value_l1_regularization_strength_l2_regularization_strength_beta%_l2_shrinkage_regularization_strength_learning_rate_tensor_learning_rate_power_tensor"_l1_regularization_strength_tensor+_adjusted_l2_regularization_strength_tensor,_l2_shrinkage_regularization_strength_tensor_accum_name_linear_name)selflearning_ratelearning_rate_powerZinitial_accumulator_valuel1_regularization_strengthZl2_regularization_strengthuse_lockingnameZ
accum_nameZlinear_name$l2_shrinkage_regularization_strengthbeta	__class__ `/home/www/facesmatcher.com/pyenv/lib/python3.10/site-packages/tensorflow/python/training/ftrl.pyr   '   sX   7
zFtrlOptimizer.__init__c              	      sX   t jd f fdd	}|D ]} |||j|jd jp j  |d jp' j qd S )Nc                    s   ~t j| |d j S )N)shapedtype)r   Zonesr   )r,   r-   Zpartition_infor    r*   r+   _accum_initializer   s   z7FtrlOptimizer._create_slots.<locals>._accum_initializeraccumlinear)	r   Zfloat32Z"_get_or_make_slot_with_initializerr,   r-   r   _nameZ_zeros_slotr   )r    Zvar_listr/   vr*   r.   r+   _create_slots   s   
zFtrlOptimizer._create_slotsc                 C   s   t j| jdd| _t j| jdd| _t j| j| jdt	| jd   dd| _
| j
d us.J t j| jdd| _t j| jdd| _t j| jd	d| _d S )
Nr!   )r%   r#   g       @gr.-Du8Z#adjusted_l2_regularization_strengthr'   r&   r"   )r   Zconvert_to_tensorr   r   r   r   r   r   r   maximumr   Z_beta_tensorr   r   r   r   r.   r*   r*   r+   _prepare   s*   zFtrlOptimizer._preparec                 C   s   |  |d}|  |d}| jdkr<tj||||t| j|jjt| j	|jjt| j
|jjt| j|jj| jd	S tj||||t| j|jjt| j	|jjt| j
|jjt| j|jjt| j|jj| jd
S Nr0   r1   r   )r$   )get_slotr   r   Z
apply_ftrlr   castr   r-   
base_dtyper   r   r   _use_lockingZapply_ftrl_v2r   r    gradvarr0   r1   r*   r*   r+   _apply_dense   sH   
zFtrlOptimizer._apply_densec                 C   s   |  |d}|  |d}| jdkr?tj|j|j|j|t| j|jj	t| j
|jj	t| j|jj	t| j|jj	| jd	S tj|j|j|j|t| j|jj	t| j
|jj	t| j|jj	t| j|jj	t| j|jj	| jd
S r7   )r8   r   r   Zresource_apply_ftrlhandler   r9   r   r-   r:   r   r   r   r;   Zresource_apply_ftrl_v2r   r<   r*   r*   r+   _resource_apply_dense   sH   
z#FtrlOptimizer._resource_apply_densec                 C   s   |  |d}|  |d}| jdkr?tj||||j|jt| j|j	j
t| j|j	j
t| j|j	j
t| j|j	j
| jd
S tj||||j|jt| j|j	j
t| j|j	j
t| j|j	j
t| j|j	j
t| j|j	j
| jdS r7   )r8   r   r   Zsparse_apply_ftrlvaluesindicesr   r9   r   r-   r:   r   r   r   r;   Zsparse_apply_ftrl_v2r   r<   r*   r*   r+   _apply_sparse   sL   
zFtrlOptimizer._apply_sparsec                 C   s   |  |d}|  |d}| jdkr<tj|j|j|j||t| j|jt| j	|jt| j
|jt| j|j| jd
S tj|j|j|j||t| j|jt| j	|jt| j
|jt| j|jt| j|j| jdS r7   )r8   r   r   Zresource_sparse_apply_ftrlr@   r   r9   r   r-   r   r   r   r;   Zresource_sparse_apply_ftrl_v2r   )r    r=   r>   rC   r0   r1   r*   r*   r+   _resource_apply_sparse  sD   
z$FtrlOptimizer._resource_apply_sparse)
r   r   r   r   Fr   NNr   N)__name__
__module____qualname____doc__r   r4   r6   r?   rA   rD   rE   __classcell__r*   r*   r(   r+   r
      s&    ]  "r
   N)rI   Ztensorflow.python.frameworkr   r   Ztensorflow.python.opsr   r   Ztensorflow.python.trainingr   r   Z tensorflow.python.util.tf_exportr   Z	Optimizerr
   r*   r*   r*   r+   <module>   s   
