o
    2h                     @   s:   d Z ddlZddlmZ ddlmZ G dd dejZdS )zA class for JAX specific optimizer logic.

Its purpose is to route around statelessness
requirements in cond ops used for EMA handling
and gradient accumulation handling. We do this
by skipping conditionals entirely.
    N)numpy)base_optimizerc                   @   s   e Zd Zdd ZdS )JaxOptimizerc                    s  j rjd j  dk}j dd D dd jD fddD  tj| fdd fd	d}tj| fd
dfdd j	 tj|fddfdd}tj|fddfdd}t
|D ]	\}}|| qt
|jD ]	\}}|| qt
| D ]	\}	}
|
|	 qn j	 jrj jd urjd j dk}|d}t|d}dd jD t
jjD ]\}}||| |j|   qd S d S d S )N   r   c                 S      g | ]}|j qS  value.0vr   r   Z/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/backend/jax/optimizer.py
<listcomp>       z9JaxOptimizer._backend_apply_gradients.<locals>.<listcomp>c                 S   r   r   r   r
   r   r   r   r          c                    s   g | ]
} j  | qS r   )_accumulated_gradients_get_variable_indexr
   selfr   r   r      s    c                         dd  D S )Nc                 S   s   g | ]}t j|j|jd qS ))dtype)jnpzerosshaper   )r   gr   r   r   r   &   s    KJaxOptimizer._backend_apply_gradients.<locals>.<lambda>.<locals>.<listcomp>r   r   )	acc_gradsr   r   <lambda>&       z7JaxOptimizer._backend_apply_gradients.<locals>.<lambda>c                      s   dd t  D S )Nc                 S   s   g | ]\}}|| qS r   r   r   r   acc_gr   r   r   r   '   s    r   zipr   )r   gradsr   r   r   '   s    c                      s   fddt  D S )Nc                    s   g | ]
\}}||   qS r   r   r   )stepsr   r   r   ,   s    r   r!   r   )r   r#   r$   r   r   r   ,   s   
 c                      s   t  S N)listr   )r#   r   r   r   /   s    c                      r   )Nc                 S   r   r   r   r
   r   r   r   r   ;   r   r   r   r   )trainable_variablesr   r   r   ;   r   c                          S r%   r   r   )current_trainable_vars_valuer   r   r   <       c                      s   dd  j D S )Nc                 S   r   r   r   r
   r   r   r   r   @   r   r   )	variablesr   r   r   r   r   @   s    c                      r(   r%   r   r   )current_optimizer_vars_valuer   r   r   A   r*   int32c                 S   r   r   r   r
   r   r   r   r   d   r   )gradient_accumulation_steps_iterationsr+   jaxlaxcond_clip_gradients_apply_weight_decay_backend_update_steplearning_rater"   assignuse_ema&_update_model_variables_moving_average_trainable_variablesema_overwrite_frequency
iterationsastyper   logical_not_model_variables_moving_averager	   )r   r#   r'   is_update_step
new_g_accsnew_trainable_varsnew_opt_varsr	   r   n_g_accg_accshould_overwrite_model_varsshould_overwrite_model_vars_int#should_not_overwrite_model_vars_intvaraverage_varr   )r   r,   r)   r#   r   r$   r'   r   _backend_apply_gradients   s   



	






z%JaxOptimizer._backend_apply_gradientsN)__name__
__module____qualname__rK   r   r   r   r   r      s    r   )__doc__r0   r   r   keras.src.optimizersr   BaseOptimizerr   r   r   r   r   <module>   s
    