a
    .Sic4                     @   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                
       sR   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 rNtd| |dk rbtd| |
dk rvtd|
 || _|| _|| _|| _|| _|du rd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_powerinitial_accumulator_valuel1_regularization_strengthl2_regularization_strengthuse_lockingnameZ
accum_nameZlinear_name$l2_shrinkage_regularization_strengthbeta	__class__ [/var/www/html/django/DPS/env/lib/python3.9/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p8 j  |d jpN j qd S )Nc                    s   ~t j| |d j S )N)shapedtype)r   onesr   )r.   r/   partition_infor    r,   r-   _accum_initializer   s    z7FtrlOptimizer._create_slots.<locals>._accum_initializeraccumlinear)	r   float32"_get_or_make_slot_with_initializerr.   r/   r   _name_zeros_slotr   )r    var_listr3   vr,   r2   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.-Du8#adjusted_l2_regularization_strengthr)   r(   r"   )r   convert_to_tensorr   r   r   r   r   r   r   maximumr   Z_beta_tensorr   r   r   r   r2   r,   r,   r-   _prepare   s*    zFtrlOptimizer._preparec                 C   s   |  |d}|  |d}| jdkrxt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 d S Nr4   r5   r   )r&   )get_slotr   r   
apply_ftrlr   castr   r/   
base_dtyper   r   r   _use_lockingapply_ftrl_v2r   r    gradvarr4   r5   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 d S rA   )rB   r   r   resource_apply_ftrlhandler   rD   r   r/   rE   r   r   r   rF   resource_apply_ftrl_v2r   rH   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 d S rA   )rB   r   r   sparse_apply_ftrlvaluesindicesr   rD   r   r/   rE   r   r   r   rF   sparse_apply_ftrl_v2r   rH   r,   r,   r-   _apply_sparse   sL    
zFtrlOptimizer._apply_sparsec                 C   s   |  |d}|  |d}| jdkrxt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 d S rA   )rB   r   r   resource_sparse_apply_ftrlrM   r   rD   r   r/   r   r   r   rF   resource_sparse_apply_ftrl_v2r   )r    rI   rJ   rR   r4   r5   r,   r,   r-   _resource_apply_sparse  sD    
z$FtrlOptimizer._resource_apply_sparse)
r   r   r   r   Fr   NNr   N)__name__
__module____qualname____doc__r   r<   r@   rK   rO   rT   rW   __classcell__r,   r,   r*   r-   r
      s$             ]  "r
   N)r[   tensorflow.python.frameworkr   r   tensorflow.python.opsr   r   tensorflow.python.trainingr   r    tensorflow.python.util.tf_exportr   	Optimizerr
   r,   r,   r,   r-   <module>   s   
