
    2VhV                     D    d dl mZ d dlmZ d dlmZ  G d de      Zd Zy)    )tree)data_adapter_utils)DataAdapterc                   p    e Zd ZdZddZd Zd Zd Zd Ze	d        Z
e	d	        Ze	d
        Ze	d        Zy)TFDatasetAdapterz'Adapter that handles `tf.data.Dataset`.Nc                 J   ddl m} t        ||j                  j                  |j
                  j                  f      st        d|       |=|j                  t        |            j                  |j                  j                        }||j                  |      }|| _        y)a  Initialize the TFDatasetAdapter.

        Args:
            dataset: The input `tf.data.Dataset` instance.
            class_weight: A map where the keys are integer class ids and values
                are the class weights, e.g. `{0: 0.2, 1: 0.6, 2: 0.3}`.
            distribution: A `keras.distribution.Distribution` instance. Used to
                shard the input dataset into per worker/process dataset
                instance.
        r   
tensorflowz?Expected argument `dataset` to be a tf.data.Dataset. Received: N)keras.src.utils.module_utilsr
   
isinstancedataDataset
distributeDistributedDataset
ValueErrormapmake_class_weight_map_fnprefetchAUTOTUNEdistribute_dataset_dataset)selfdatasetclass_weightdistributiontfs        c/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/trainers/data_adapters/tf_dataset_adapter.py__init__zTFDatasetAdapter.__init__	   s     	Bbggoor}}'G'GH
 $I'  #kk(6hrww''(  #"55g>G    c              #   j   K   ddl m} | j                  D ]  }t        j                  ||        y w)Nr   convert_to_numpy)!keras.src.backend.tensorflow.corer"   r   r   map_structure)r   r"   batchs      r   get_numpy_iteratorz#TFDatasetAdapter.get_numpy_iterator%   s0     F]] 	>E$$%5u==	>s   13c              #      K   ddl m ddlm fd}| j                  D ]  }t        j                  ||        y w)Nr   r!   r	   c                 j    t        | j                        rt        j                  |       S  |       S N)r   SparseTensorr   tf_sparse_to_jax_sparse)xr"   r   s    r   convert_to_jaxz9TFDatasetAdapter.get_jax_iterator.<locals>.convert_to_jax/   s/    !R__-)AA!DD (**r   )r#   r"   r   r
   r   r   r$   )r   r-   r%   r"   r   s      @@r   get_jax_iteratorz!TFDatasetAdapter.get_jax_iterator+   s:     FA	+ ]] 	<E$$^U;;	<s   =Ac                     | j                   S r)   )r   r   s    r   get_tf_datasetzTFDatasetAdapter.get_tf_dataset9   s    }}r   c                 @    t        j                  | j                        S r)   )r   get_torch_dataloaderr   r0   s    r   r3   z%TFDatasetAdapter.get_torch_dataloader<   s    !66t}}EEr   c                     | j                   j                  }t        |      r$t        | j                   j                               }nt        |      }|dk  ry |S Nr   )r   cardinalitycallableint)r   r6   s     r   num_batcheszTFDatasetAdapter.num_batches?   sL    mm//K dmm779:K k*K?r   c                 x    t        j                  | j                  j                        d   }|j                  d   S r5   )r   flattenr   element_specshape)r   first_element_specs     r   
batch_sizezTFDatasetAdapter.batch_sizeM   s1    !\\$--*D*DEaH!''**r   c                      y r)    r0   s    r   has_partial_batchz"TFDatasetAdapter.has_partial_batchR       r   c                      y r)   rA   r0   s    r   partial_batch_sizez#TFDatasetAdapter.partial_batch_sizeV   rC   r   )NN)__name__
__module____qualname____doc__r   r&   r.   r1   r3   propertyr9   r?   rB   rE   rA   r   r   r   r      so    1 8><F   + +    r   r   c           
          ddl m j                  t        t	        | j                               dz         D cg c]  }| j                  t        |      d       c}      fd}|S c c}w )a  Applies class weighting to a `Dataset`.

    The `Dataset` is assumed to be in format `(x, y)` or `(x, y, sw)`, where
    `y` must be a single `Tensor`.

    Args:
        class_weight: A map where the keys are integer class ids and values are
            the class weights, e.g. `{0: 0.2, 1: 0.6, 2: 0.3}`

    Returns:
        A function that can be used with `tf.data.Dataset.map` to apply class
        weighting.
    r   r	      g      ?c                     t        j                  |       \  }}|t        d      t        j                        rt        d      j
                  j                  dk\  rEj                  j                  j                  j                        d   dkD  fdfd      }n+j                  j                        j                        }j                  |      }||fS )z*Convert `class_weight` to `sample_weight`.z?You cannot `class_weight` and `sample_weight` at the same time.zA`class_weight` is only supported for Models with a single output.   rL   c                  @     j                  d j                        S )NrO   )axisoutput_type)argmaxint32r   ys   r   <lambda>zHmake_class_weight_map_fn.<locals>.class_weights_map_fn.<locals>.<lambda>   s    		!""((	C r   c                  |     j                   j                   j                  d             j                        S )NrO   )rQ   )castroundsqueezerT   rU   s   r   rW   zHmake_class_weight_map_fn.<locals>.class_weights_map_fn.<locals>.<lambda>   s,    AB)? @"((K r   )r   unpack_x_y_sample_weightr   r   	is_nestedr=   rank__internal__
smart_condrY   rZ   rT   gather)r   r,   sw	y_classescwrV   class_weight_tensorr   s        @r   class_weights_map_fnz6make_class_weight_map_fn.<locals>.class_weights_map_fnr   s    %>>tD1b>$  >>! 
 77<<122==B!#CKI RXX6IYY*I6!Rxr   )r   r
   convert_to_tensorrangemaxkeysgetr8   )r   crf   re   r   s      @@r   r   r   [   sm     >.. 3|0023a78	
 SVS)	
6  C	
s   "A,N)	keras.srcr    keras.src.trainers.data_adaptersr   -keras.src.trainers.data_adapters.data_adapterr   r   r   rA   r   r   <module>rp      s"     ? ER{ Rj2 r   