a
    Sic                     @   s   d Z ddlm  mZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ e
 edg dG d	d
 d
ejZej deje_ dS )z!Adagrad optimizer implementation.    N)initializers)	optimizer)generic_utils)keras_exportz%keras.optimizers.experimental.Adagrad)v1c                       sB   e Zd ZdZd fd	d
	Z fddZdd Z fddZ  ZS )Adagrada6  Optimizer that implements the Adagrad algorithm.

    Adagrad is an optimizer with parameter-specific learning rates,
    which are adapted relative to how frequently a parameter gets
    updated during training. The more updates a parameter receives,
    the smaller the updates.

    Args:
      learning_rate: Initial value for the learning rate:
        either a floating point value,
        or a `tf.keras.optimizers.schedules.LearningRateSchedule` instance.
        Defaults to 0.001.
        Note that `Adagrad` tends to benefit from higher initial learning rate
        values compared to other optimizers.
        To match the exact form in the original paper, use 1.0.
      initial_accumulator_value: Floating point value.
        Starting value for the accumulators (per-parameter momentum values).
        Must be non-negative.
      epsilon: Small floating point value used to maintain numerical stability.
      {{base_optimizer_keyword_args}}

    Reference:
      - [Duchi et al., 2011](
        http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf).
    MbP?皙?Hz>NFGz?Tc                    s@   t  jf ||||||	|
|d| | || _|| _|| _d S )N)clipnorm	clipvalueglobal_clipnormuse_emaema_momentumema_overwrite_frequencyjit_compilename)super__init___build_learning_rate_learning_rateinitial_accumulator_valueepsilon)selflearning_rater   r   r   r   r   r   r   r   r   r   kwargs	__class__ k/var/www/html/django/DPS/env/lib/python3.9/site-packages/keras/optimizers/optimizer_experimental/adagrad.pyr   8   s    	zAdagrad.__init__c              
      sj   t  | t| dr | jr d S d| _g | _t| j}|D ](}| j| j	|d||j
|jdd q<d S )N_builtTaccumulator)shapedtype)initial_value)r   buildhasattrr!   _accumulatorsr   Constantr   appendadd_variable_from_referencer#   r$   )r   var_listinitializervarr   r   r    r&   V   s    zAdagrad.buildc                 C   s   t | j|j}| |}| j| j|  }t|t jrT|	t |j
|j
 |j n|||  ||| t || j   dS )z=Update step given gradient and the associated model variable.N)tfcastr   r$   _var_keyr(   _index_dict
isinstanceIndexedSlicesscatter_addvaluesindices
assign_add
assign_subsqrtr   )r   gradvariablelrvar_keyr"   r   r   r    update_stepf   s    
zAdagrad.update_stepc                    s,   t   }|| | j| j| jd |S )N)r   r   r   )r   
get_configupdate_serialize_hyperparameterr   r   r   )r   configr   r   r    r@   w   s    
	zAdagrad.get_config)r   r	   r
   NNNFr   NTr   )	__name__
__module____qualname____doc__r   r&   r?   r@   __classcell__r   r   r   r    r      s               r   z{{base_optimizer_keyword_args}})rG   tensorflow.compat.v2compatv2r/   kerasr   'keras.optimizers.optimizer_experimentalr   keras.utilsr    tensorflow.python.util.tf_exportr   register_keras_serializable	Optimizerr   replacebase_optimizer_keyword_argsr   r   r   r    <module>   s   
i