o
    i e                     @   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d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)register_keras_serializable)keras_exportz%keras.optimizers.experimental.Adagradzkeras.optimizers.Adagradz-keras.dtensor.experimental.optimizers.Adagrad)v1c                       sZ   e Zd ZdZ												 d fd	d
	Z fddZdd Z fddZ  ZS )Adagradad  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                    sB   t  jd||||||	|
||d	| | || _|| _|| _d S )N)	weight_decay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   r   kwargs	__class__r   K/var/www/myenv/lib/python3.10/site-packages/keras/src/optimizers/adagrad.pyr   =   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'   ]   s   zAdagrad.buildc                 C   s   t | j|j}| |}| j| j|  }t|t jrK|	t |j
|j
 |j t j||jd}t || j }|	t | |j
 | |j dS |||  ||| t || j   dS )z=Update step given gradient and the associated model variable.)indicesN)tfcastr   r%   _var_keyr)   _index_dict
isinstanceIndexedSlicesscatter_addvaluesr0   gathersqrtr   
assign_add
assign_sub)r   gradvariablelrvar_keyr#   sparse_accumulatorsparse_denominatorr   r   r!   update_stepm   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!   rD      s   
	zAdagrad.get_config)r   r	   r
   NNNNFr   NTr   )	__name__
__module____qualname____doc__r   r'   rC   rD   __classcell__r   r   r   r!   r      s$     r   z{{base_optimizer_keyword_args}})rK   tensorflow.compat.v2compatv2r1   	keras.srcr   keras.src.optimizersr   $keras.src.saving.object_registrationr    tensorflow.python.util.tf_exportr   	Optimizerr   replacebase_optimizer_keyword_argsr   r   r   r!   <module>   s"   r
