o
    ={c*                     @   sZ   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d	Z
	
			dddZdS )z.A simple network to use in tests and examples.    N)core)normalization)optimizer_v2FTc                    s0   dd }t jd|d  fdd}|| fS )z.Example of non-distribution-aware legacy code.c                  S   s$   t jjdgg } | jdddS )N      ?   T)Zdrop_remainder)tfdataDatasetZfrom_tensorsrepeatZbatch)Zdataset r   =lib/python3.10/site-packages/keras/distribute/test_example.py
dataset_fn   s   z)minimize_loss_example.<locals>.dataset_fnr   use_biasc                    sH    fdd}t tjr|fddS r|S | S )z(A very simple model written by the user.c                     s"   t  g t d } | |  S )Nr   )r   Zreshapeconstant)y)layerxr   r   loss_fn&   s   z8minimize_loss_example.<locals>.model_fn.<locals>.loss_fnc                          j S NZtrainable_variablesr   r   r   r   <lambda>,       z9minimize_loss_example.<locals>.model_fn.<locals>.<lambda>
isinstancer   ZOptimizerV2Zminimizer   r   r   	optimizeruse_callable_lossr   r   model_fn#   s   
z'minimize_loss_example.<locals>.model_fn)r   Dense)r   r   r    r   r"   r   r   r   minimize_loss_example   s   
r$   r   ?c                    sL    fdd}|  t j||ddtjdddfdd}||fS )	zKExample of non-distribution-aware legacy code with batch
    normalization.c                      s    t jjdd t D  S )Nc                    s"   g | ]  fd dt dD qS )c                    s$   g | ]  fd dt dD qS )c                    s$   g | ]}t  d  | d  qS )   d   )float).0r   )r   zr   r   
<listcomp>F   s   $ zObatchnorm_example.<locals>.dataset_fn.<locals>.<listcomp>.<listcomp>.<listcomp>r&   ranger)   r*   r!   r   r+   E   s    zDbatchnorm_example.<locals>.dataset_fn.<locals>.<listcomp>.<listcomp>   r,   r.   r   r/   r   r+   D   s    
z9batchnorm_example.<locals>.dataset_fn.<locals>.<listcomp>)r   r   r	   Zfrom_tensor_slicesr-   r
   r   )batch_per_epochr   r   r   @   s   z%batchnorm_example.<locals>.dataset_fnF)renormmomentumZfusedr   r   c                    s<    fdd}t tjr|fddS |S )zA model that uses batchnorm.c                     st    dd} t rt jjt jjjjng  t t | t 	d }W d    |S 1 s3w   Y  |S )NT)Ztrainingr   )
r   Zcontrol_dependenciescompatZv1Zget_collectionZ	GraphKeysZ
UPDATE_OPSZreduce_meanZ
reduce_sumr   )r   Zloss)	batchnormr   update_ops_in_replica_moder   r   r   r   V   s   


z4batchnorm_example.<locals>.model_fn.<locals>.loss_fnc                      r   r   r   r   r   r   r   r   f   r   z5batchnorm_example.<locals>.model_fn.<locals>.<lambda>r   r   )r5   r   r   r6   r!   r   r"   S   s   
z#batchnorm_example.<locals>.model_fn)r   ZBatchNormalizationr   r#   )Zoptimizer_fnr1   r3   r2   r6   r   r"   r   )r1   r5   r   r   r6   r   batchnorm_example6   s   

r7   )FT)r   r%   FF)__doc__Ztensorflow.compat.v2r4   Zv2r   Zkeras.legacy_tf_layersr   r   Zkeras.optimizers.optimizer_v2r   r$   r7   r   r   r   r   <module>   s   
 