
    &Vf                     L    d dl Z d dl mZ d dlmZ  G d dej                  ZdS )    N)numpy)base_optimizerc                       e Zd ZdZd ZdS )JaxOptimizerzA 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.
    c                 @     j         r j        dz    j         z  dk    } j         d D             d  j        D              fdD             t          j                            |fdfd          }t          j                            |fdfd	                                j                   t          j                            |fd
fd          }t          j                            | fdfd          }t          |          D ]\  }}|	                    |           t          | j                  D ]\  }}|	                    |           t          |          D ]\  }	}
|
	                    |	           n                      j                    j
        rǉ                      j                    j         j        dz    j        z  dk    }|                    d          }t          j        |                              d          }d  j        D             t           j         j                  D ](\  }}|	                    ||z  |j        |z  z              ) j                            d           d S )N   r   c                     g | ]	}|j         
S  value.0vs     \/var/www/html/software/conda/lib/python3.11/site-packages/keras/src/backend/jax/optimizer.py
<listcomp>z9JaxOptimizer._backend_apply_gradients.<locals>.<listcomp>   s'     , , ,, , ,    c                     g | ]	}|j         
S r
   r   r   s     r   r   z9JaxOptimizer._backend_apply_gradients.<locals>.<listcomp>   s    +L+L+LAG+L+L+Lr   c                 P    g | ]"}j                             |                   #S r
   )_accumulated_gradients_get_variable_index)r   r   selfs     r   r   z9JaxOptimizer._backend_apply_gradients.<locals>.<listcomp>   s?        +D,D,DQ,G,GH  r   c                      d  D             S )Nc                 N    g | ]"}t          j        |j        |j                   #S ))dtype)jnpzerosshaper   )r   gs     r   r   zKJaxOptimizer._backend_apply_gradients.<locals>.<lambda>.<locals>.<listcomp>&   s+    NNNq17!':::NNNr   r
   )	acc_gradss   r   <lambda>z7JaxOptimizer._backend_apply_gradients.<locals>.<lambda>&   s    NNINNN r   c                  8    d t                     D             S )Nc                     g | ]
\  }}||z   S r
   r
   )r   r   acc_gs      r   r   zKJaxOptimizer._backend_apply_gradients.<locals>.<lambda>.<locals>.<listcomp>'   s     IIIxq%UIIIr   zip)r   gradss   r   r    z7JaxOptimizer._backend_apply_gradients.<locals>.<lambda>'   s     II3ui3H3HIII r   c                  <    fdt                     D             S )Nc                 &    g | ]\  }}||z   z  S r
   r
   )r   r   r#   stepss      r   r   zKJaxOptimizer._backend_apply_gradients.<locals>.<lambda>.<locals>.<listcomp>,   s3       ,4AuQY%'  r   r$   )r   r&   r)   s   r   r    z7JaxOptimizer._backend_apply_gradients.<locals>.<lambda>,   s5        8;E98M8M   r   c                  "    t                     S N)list)r&   s   r   r    z7JaxOptimizer._backend_apply_gradients.<locals>.<lambda>/   s    U r   c                      d  D             S )Nc                     g | ]	}|j         
S r
   r   r   s     r   r   zKJaxOptimizer._backend_apply_gradients.<locals>.<lambda>.<locals>.<listcomp>7   s    >>>Q>>>r   r
   )trainable_variabless   r   r    z7JaxOptimizer._backend_apply_gradients.<locals>.<lambda>7   s    >>*=>>> r   c                       S r+   r
   )current_trainable_vars_values   r   r    z7JaxOptimizer._backend_apply_gradients.<locals>.<lambda>8       4 r   c                  &    d  j         D             S )Nc                     g | ]	}|j         
S r
   r   r   s     r   r   zKJaxOptimizer._backend_apply_gradients.<locals>.<lambda>.<locals>.<listcomp><   s    999Q999r   )	variables)r   s   r   r    z7JaxOptimizer._backend_apply_gradients.<locals>.<lambda><   s    99$.999 r   c                       S r+   r
   )current_optimizer_vars_values   r   r    z7JaxOptimizer._backend_apply_gradients.<locals>.<lambda>=   r2   r   int32c                     g | ]	}|j         
S r
   r   r   s     r   r   z9JaxOptimizer._backend_apply_gradients.<locals>.<listcomp>\   s'     0 0 0 !AG0 0 0r   )gradient_accumulation_steps
iterationsr5   jaxlaxcond_backend_update_steplearning_rater%   assignuse_ema&_update_model_variables_moving_average_trainable_variablesema_overwrite_frequencyastyper   logical_not_model_variables_moving_averager   
assign_add)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   r7   r1   r)   s   ```             @@@@r   _backend_apply_gradientsz%JaxOptimizer._backend_apply_gradients   s   + ;	!#01456N 4E, ,!4, , ,( ,M+LT^+L+L+L(
   ,  I
 NNNNIIIII J GLL      $### E %%*D,>   "%>>>>4444" "
 7<<99994444 L   24GHH    qdn==    q"%j)"<"< & &W%%%%& %%*D,>   < 	77)   +7Oa'0/145/6+ 066w?? 0 7:o/7 7&// 40 0%)%>0 0 0, ),-8) )  $C JJ#&EE)&IIJ   
 	""1%%%%%r   N)__name__
__module____qualname____doc__rU   r
   r   r   r   r      s2         X& X& X& X& X&r   r   )r<   r   r   keras.src.optimizersr   BaseOptimizerr   r
   r   r   <module>r\      ss    



       / / / / / /a& a& a& a& a&>/ a& a& a& a& a&r   