
    &VfS                     8    d Z ddlZddlmZ  G d d          ZdS )a-  
Separation of concerns:

DataAdapter:
    - x, y
    - sample_weight
    - class_weight
    - shuffle
    - batch_size
        - steps, as it relates to batch_size for array data

EpochIterator:
    - whether to yield numpy or tf data
    - steps
    - most argument validation

Trainer:
    - steps_per_execution
    - validation_split
    - validation_data
    - callbacks
    - validation_freq
    - epochs
    - initial_epoch
    - any backend-specific concern such as distribution

PyDataset:
    - num_workers
    - use_multiprocessing
    - max_queue_size

EpochIterator steps:

1. Look at data type and select correct DataHandler
2. Instantiate DataHandler with correct arguments
3. Raise or warn on unused arguments
4. in __iter__, iterate, either for a fixed number of steps
or until there is no data

    N)data_adaptersc                   F    e Zd Z	 	 	 	 	 	 	 ddZd Zd Zed             ZdS )	EpochIteratorNF   c	           	          || _         || _        |rd | _        d| _        t	          j        |||||||          | _        | j        j        | _        d S )NF)xysample_weight
batch_sizesteps_per_epochshuffleclass_weight)	r   steps_per_execution_current_iterator_insufficient_datar   get_data_adapterdata_adapternum_batches_num_batches)	selfr   r	   r
   r   r   r   r   r   s	            ^/var/www/html/software/conda/lib/python3.11/site-packages/keras/src/trainers/epoch_iterator.py__init__zEpochIterator.__init__0   sq      /#6  	,%)D"&+D#):'!+%
 
 
 !-9    c                 4    | j                                         S N)r   get_numpy_iteratorr   s    r   _get_iteratorzEpochIterator._get_iteratorK   s     33555r   c              #     K   g }| j         r| j        -t          |                                           | _        d| _        t          | j                   D ]}| j        r n	 t          | j                  }|                    |           t          |          | j	        k    r|t          |          z
  dz   |fV  g }i# t          f$ r' t          j        dd           d | _        d| _        Y w xY w|r|t          |          z
  dz   |fV  nt          |                                           D ]M\  }}|                    |           t          |          | j	        k    r|t          |          z
  dz   |fV  g }N|r|t          |          z
  dz   |fV  | j        s
|dz   | _        | j                                         d S )NFr   zYour input ran out of data; interrupting epoch. Make sure that your dataset or generator can generate at least `steps_per_epoch * epochs` batches. You may need to use the `.repeat()` function when building your dataset.   )
stacklevelT)r   r   iterr   r   rangenextappendlenr   StopIterationwarningswarn	enumerater   r   on_epoch_end)r   bufferstepdatas       r   enumerate_epochzEpochIterator.enumerate_epochN   s%      '	-%-)-d.@.@.B.B)C)C&*/'d233 3 3* E3 677DMM$'''6{{d&>>>"S[[014f<<<<!#%' 
3 
3 
3M?
 $%    .2D*.2D+++
3  5S[[(1,f4444'(:(:(<(<==    
dd###v;;$":::V,q0&8888F 5S[[(1,f4444$ - %)1H!&&(((((s   !AB>>/C0/C0c                 ,    | j         r| j         S | j        S r   )r   r   r   s    r   r   zEpochIterator.num_batchesz   s!     	(''   r   )NNNNFNr   )__name__
__module____qualname__r   r   r/   propertyr    r   r   r   r   /   sy         : : : :66 6 6*) *) *)X ! ! X! ! !r   r   )__doc__r(   keras.src.trainersr   r   r5   r   r   <module>r8      si   ' 'R  , , , , , ,Q! Q! Q! Q! Q! Q! Q! Q! Q! Q!r   