
    6biv                     p    S r SSKrSSKJs  Jr  SSKJr  SSKJ	r	  \R                  r
S rS rS rS rS	 rg)
z*Utilities related to distributed training.    N)flags)backendc                 .    U R                   R                  $ )N)extended_global_batch_size)distribution_strategys    l/home/james-whalen/.local/lib/python3.13/site-packages/tf_keras/src/distribute/distributed_training_utils.pyglobal_batch_size_supportedr
      s     ))<<<    c                    SnSU;   a  UR                  S5      nOA[        R                  R                  5       (       a  [        R                  R	                  5       n[
        R                  " U5      nU(       d`  U(       aY  [        R                  R                  5       (       a6  UR                  5          UR                  R                  XU5      sSSS5        $ U " U0 UD6$ ! , (       d  f       N= f)a  Call a function that uses replica-local variables.

This function correctly handles calling `fn` in a cross-replica
context.

Args:
  fn: The function to call.
  *args: Positional arguments to the `fn`.
  **kwargs: Keyword argument to `fn`.

Returns:
  The result of calling `fn`.
Nstrategy)poptf
distributehas_strategyget_strategyr   is_tpu_strategyin_cross_replica_contextscoper   call_for_each_replica)fnargskwargsr   is_tpus        r	   call_replica_local_fnr   "   s      HV::j)==%%''}}113H $$X.FR]]%K%K%M%M^^$$::2VL tv s   3C!!
C/c                     [        U [        R                  R                  5      =(       a    [        U [        R                  5      $ )z.Returns whether `v` is a distributed variable.)
isinstancer   r   DistributedValuesVariable)vs    r	   is_distributed_variabler!   A   s0    a889 j	2;;? r   c                  |   [         R                  n 1 SknU S:X  a  [         R                  nU(       d  [        S5      e[        R
                  R                  R                  US9n[        R                  R                  U5        [        R                  R                  R                  U5        [        R
                  R                  R                  U5      nU$ U S:X  a*  [        R
                  R                  R                  5       nU$ U S:X  a   [        R
                  R                  5       nU$ U S:X  aS  [        R
                  R                  R!                  5       n[        R
                  R                  R#                  U5      nU$ U S:X  a!  [        R
                  R%                  S	5      nU$ [        S
U  SU 35      e)aZ  Creates a `tf.distribute.Strategy` object from flags.

Example usage:

```python
strategy = utils.get_strategy()
with strategy.scope():
  model = tf.keras.Sequential([tf.keras.layers.Dense(10)])

model.compile(...)
train_ds, test_ds = ...
model.fit(train_ds, validation_data=test_ds, epochs=10)
```

Returns:
  `tf.distribute.Strategy` instance.
>   tpumirrored
one_deviceparameter_servermulti_worker_mirroredr#   zdWhen using a TPU strategy, you must set the flag `keras_distribute_strategy_tpu_addr` (TPU address).)r#   r'   r$   r&   r%   z/gpu:0zNUnknown distribution strategy flag. Received: keras_distribute_strategy_class=z. It should be one of )FLAGSkeras_distribute_strategy_class"keras_distribute_strategy_tpu_addr
ValueErrorr   r   cluster_resolverTPUClusterResolverconfigexperimental_connect_to_clusterr#   experimentalinitialize_tpu_systemTPUStrategyMultiWorkerMirroredStrategyMirroredStrategyTFConfigClusterResolverParameterServerStrategyOneDeviceStrategy)clsaccepted_stratstpu_addrr,   r   s        r	   r   r   H   s   $ 
/
/CO e|;;F  ==99LL M 
 			112BC
112BC==--99:JK( O' 
'	'==--IIK$ O# 

	==113  O 
"	"MM**BBD 	 ==--EE
 O 
	==228< O //2e 4##2"35
 	
r   c                     [        U SS 5      (       a  U R                  R                  5       nU$ [        R                  " 5       nU$ )N_preemption_handler)getattrr<   watch_preemption_scope
contextlibnullcontext)modelpreemption_checkpoint_scopes     r	   maybe_preemption_handler_scoperC      sH    u+T22%%<<> 	$ '& '1&<&<&>#&&r   )__doc__r?   tensorflow.compat.v2compatv2r   abslr   tf_keras.srcr   r(   r
   r   r!   r   rC    r   r	   <module>rK      s<    1  ! !   =>:z'r   