
    BVh                         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
       G d de	j                               Zy)z&Adagrad Dual Averaging for TensorFlow.    )constant_op)ops)	array_ops)gen_training_ops)math_ops)	optimizer)	tf_exportztrain.AdagradDAOptimizer)v1c                   R     e Zd ZdZ	 	 	 	 	 d	 fd	Zd Zd Zd Zd Zd Z	d Z
 xZS )
AdagradDAOptimizera,  Adagrad Dual Averaging algorithm for sparse linear models.

  This optimizer takes care of regularization of unseen features in a mini batch
  by updating them when they are seen with a closed form update rule that is
  equivalent to having updated them on every mini-batch.

  AdagradDA is typically used when there is a need for large sparsity in the
  trained model. This optimizer only guarantees sparsity for linear models. Be
  careful when using AdagradDA for deep networks as it will require careful
  initialization of the gradient accumulators for it to train.

  References:
    Adaptive Subgradient Methods for Online Learning and Stochastic Optimization
      :[Duchi et al., 2011](http://jmlr.org/papers/v12/duchi11a.html)
      ([pdf](http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf))
  c                     |dk  rt        d|z        t        t        |   ||       || _        || _        d| _        || _        || _        || _	        d| _
        y)a1  Construct a new AdagradDA optimizer.

    Args:
      learning_rate: A `Tensor` or a floating point value.  The learning rate.
      global_step: A `Tensor` containing the current training step number.
      initial_gradient_squared_accumulator_value: A floating point value.
        Starting value for the accumulators, must be positive.
      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 "AdagradDA".

    Raises:
      ValueError: If the `initial_gradient_squared_accumulator_value` is
      invalid.
            z?initial_gradient_squared_accumulator_value must be positive: %sN)
ValueErrorsuperr   __init___learning_rate+_initial_gradient_squared_accumulator_value_learning_rate_tensor_l1_regularization_strength_l2_regularization_strength_global_step_global_step_on_worker)	selflearning_rateglobal_step*initial_gradient_squared_accumulator_valuel1_regularization_strengthl2_regularization_strengthuse_lockingname	__class__s	           U/home/dcms/DCMS/lib/python3.12/site-packages/tensorflow/python/training/adagrad_da.pyr   zAdagradDAOptimizer.__init__,   s{    6 2S8 &AB C C 

d,[$?'D2 	4 "&D'AD$'AD$#D"&D    c                    |D ]  }t        j                  |      5  t        j                  d|j	                         |j
                  j                        }t        j                  | j                  |j	                         |j
                  j                        }d d d        | j                  |d| j                         | j                  |d| j                          y # 1 sw Y   HxY w)Nr   )shapedtypegradient_accumulatorgradient_squared_accumulator)
r   colocate_withr   constant	get_shaper&   
base_dtyper   _get_or_make_slot_name)r   var_listvg_valgg_vals        r"   _create_slotsz AdagradDAOptimizer._create_slotsV   s     
)Q &$$q{{}AGG,>,>@%%<<++-''$$&& Q'=tzzJ
Q(F!ZZ)
)& &s   A?C!!C*	c                    t        j                  | j                  d      | _        t        j                  | j                        5  t        j                  | j                        dz   | _        d d d        y # 1 sw Y   y xY w)Nr   )r       )	r   convert_to_tensorr   r   r)   r   identityr   r   )r   s    r"   _preparezAdagradDAOptimizer._preparec   sm    !$!6!6/"3D 
		455	6 N$-$6$6t7H7H$IA$Md!N N Ns   (A77B c                 l   | j                  |d      }| j                  |d      }t        j                  |j                        5  t        j                  | j
                        }d d d        t        j                  ||||t        j                  | j                  |j                  j                        t        j                  | j                  |j                  j                        t        j                  | j                  |j                  j                        | j                  	      S # 1 sw Y   xY wNr'   r(   )r   )get_slotr   devicer   r7   r   r   apply_adagrad_dar   castr   r&   r,   r   r   _use_lockingr   gradvarg_accgg_accr   s         r"   _apply_densezAdagradDAOptimizer._apply_densek   s    MM#56E]]3 >?F	CJJ	 D&&t'B'BCkD,,d00#))2F2FGd66		8L8LMd66		8L8LM%%	' 	'D Ds    D**D3c                    | j                  |d      }| j                  |d      }t        j                  |j                        5  t        j                  | j
                        }d d d        t        j                  |j                  |j                  |j                  |t        j                  | j                  |j                  j                        t        j                  | j                  |j                  j                        t        j                  | j                  |j                  j                        | j                   	      S # 1 sw Y   xY wr:   )r;   r   r<   r   r7   r   r   resource_apply_adagrad_dahandler   r>   r   r&   r,   r   r   r?   r@   s         r"   _resource_apply_densez(AdagradDAOptimizer._resource_apply_dense{   s    MM#56E]]3 >?F	CJJ	 D&&t'B'BCkD55

d00$**2G2GHd66

8M8MNd66

8M8MN%%	' 	'D Ds    EEc                    | j                  |d      }| j                  |d      }t        j                  |j                        5  t        j                  | j
                        }d d d        t        j                  ||||j                  |j                  t        j                  | j                  |j                  j                        t        j                  | j                  |j                  j                        t        j                  | j                   |j                  j                        | j"                  
      S # 1 sw Y   xY wr:   )r;   r   r<   r   r7   r   r   sparse_apply_adagrad_davaluesindicesr   r>   r   r&   r,   r   r   r?   r@   s         r"   _apply_sparsez AdagradDAOptimizer._apply_sparse   s    MM#56E]]3 >?F	CJJ	 D&&t'B'BCkD33d00#))2F2FGd66		8L8LMd66		8L8LM%%
' 
'D Ds    D??Ec                 n   | j                  |d      }| j                  |d      }t        j                  |j                        5  t        j                  | j
                        }d d d        t        j                  |j                  |j                  |j                  ||t        j                  | j                  |j                        t        j                  | j                  |j                        t        j                  | j                  |j                        | j                  
      S # 1 sw Y   xY wr:   )r;   r   r<   r   r7   r   r    resource_sparse_apply_adagrad_darH   r   r>   r   r&   r   r   r?   )r   rA   rB   rM   rC   rD   r   s          r"   _resource_apply_sparsez)AdagradDAOptimizer._resource_apply_sparse   s    MM#56E]]3 >?F	CJJ	 D&&t'B'BCkD<<

d00$**=d66

Cd66

C%%
' 
'D Ds    D++D4)g?r   r   F	AdagradDA)__name__
__module____qualname____doc__r   r3   r8   rE   rI   rN   rQ   __classcell__)r!   s   @r"   r   r      s>    ( ;>*-*- ('T)N' ' '"'r#   r   N)rV   tensorflow.python.frameworkr   r   tensorflow.python.opsr   r   r   tensorflow.python.trainingr    tensorflow.python.util.tf_exportr	   	Optimizerr    r#   r"   <module>r^      sL    - 3 + + 2 * 0 6 )*+Q',, Q' ,Q'r#   