
    2Vh?+                         d dl Zd dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ  G d dej,                        Zy)    N)backend)	callbacks)tree)standardize_dtype)KerasTensor)	is_tensor)trainer)data_adapter_utils)EpochIterator)traceback_utilsc                        e Zd Z fdZd Zd ZddZddZd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	e
j                  	 dd       Ze
j                  	 	 	 	 	 	 	 	 dd	       Z	 	 	 	 dd
Z	 	 	 ddZd Z xZS )NumpyTrainerc                 >    t         |           d | _        d | _        y N)super__init__test_functionpredict_function)self	__class__s    O/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/backend/numpy/trainer.pyr   zNumpyTrainer.__init__   s    ! $    c                 H   t        j                  |      \  }}}| j                  r | |d      }n | |      }| j                  ||||d      }| j                  j                  |t        j                  |      d   j                  d          | j                  ||||      S )NFtraining)xyy_predsample_weightr   r   r   )
r
   unpack_x_y_sample_weight_call_has_training_arg_compute_loss_loss_trackerupdate_stater   flattenshapecompute_metrics)r   datar   r   r   r   losss          r   	test_stepzNumpyTrainer.test_step   s    
 77=		
&&!e,F!WF!!1V=5 " 
 	''Q 2 8 8 ; 	( 	
 ##Aq&#NNr   c                 x    t        j                  |      \  }}}| j                  r | |d      }|S  | |      }|S )NFr   )r
   r!   r"   )r   r)   r   _r   s        r   predict_stepzNumpyTrainer.predict_step'   sD    $==dC1a&&!e,F  !WFr   c                       j                   |s j                   S  fdfd} j                  dkD  r
|}| _         y }| _         y )Nc                 0    | d   } j                  |       S Nr   )r+   r)   r   s    r   one_test_stepz6NumpyTrainer.make_test_function.<locals>.one_test_step3   s    7D>>$''r   c                 (    | D ]  } |g      } S r    )r)   single_step_datalogsr3   s      r   multi_test_stepsz9NumpyTrainer.make_test_function.<locals>.multi_test_steps7   s&    $( 9 $&6%789Kr      )r   steps_per_execution)r   forcer8   r+   r3   s   `   @r   make_test_functionzNumpyTrainer.make_test_function/   sU    )%%%%	(	
 ##a'(I ' &I&r   c                       j                   |s j                   S  fdfd} j                  dkD  r
|}| _         y }| _         y )Nc                 0    | d   } j                  |       S r1   )r.   r2   s    r   one_predict_stepz<NumpyTrainer.make_predict_function.<locals>.one_predict_stepG   s    7D$$T**r   c                 t     | d d       }| dd  D ]#  } |g      }t        j                  d ||      }% |S )Nr9   c                 0    t        j                  | |g      S r   )npconcatenate)t1t2s     r   <lambda>zQNumpyTrainer.make_predict_function.<locals>.multi_predict_steps.<locals>.<lambda>Q   s    2>>2r(#; r   )r   map_structure)r)   outputsr6   step_outputsr?   s       r   multi_predict_stepsz?NumpyTrainer.make_predict_function.<locals>.multi_predict_stepsK   sW    &tBQx0G$(H  /1A0BC,,;  Nr   r9   )r   r:   )r   r;   rJ   r.   r?   s   `   @r   make_predict_functionz"NumpyTrainer.make_predict_functionC   sU      ,U(((	+
	 ##a'.L !- ,L ,r   c                 X   t        d | j                         D               }| j                  d uxr | j                  j                   }| j                  d uxr | j                  j                   }|s|s|rd }t        j                  ||      }t        j                  |      \  }}}	 t        j                  | |      }	|r$t        j                  | j                  |||	|       |r$t        j                  | j                  |||	|       | j                          y #  t        d      xY w)Nc              3   4   K   | ]  }|j                     y wr   built.0layers     r   	<genexpr>z/NumpyTrainer._symbolic_build.<locals>.<genexpr>_   s     PP   c                 n    t        |       r)t        | j                  t        | j                              S | S r   )r   r   r'   r   dtype)vs    r   to_symbolic_inputz7NumpyTrainer._symbolic_build.<locals>.to_symbolic_inputj   s)    Q<&qww0A!''0JKKr   a  Unable to automatically build the model. Please build it yourself before calling fit/evaluate/predict. A model is 'built' when its variables have been created and its `self.built` attribute is True. Usually, calling the model on a batch of data is the right way to build it.r    )all_flatten_layers_compile_metricsrO   _compile_lossr   rG   r
   r!   r   compute_output_specRuntimeErrorr(   r#   _post_build)
r   
data_batchmodel_unbuiltcompile_metrics_unbuiltcompile_loss_unbuiltrX   r   r   r   r   s
             r   _symbolic_buildzNumpyTrainer._symbolic_build^   sB   P9M9M9OPPP!!- 0))/// 	 
 d*K43E3E3K3K/K 	 37K
 ++,=zJJ
 #;;JG	 44T1= '++(("/ $++&&"/ 	9	"< s   )D D)c                     t        d      )Nz&fit not implemented for NumPy backend.NotImplementedError)r   r   r   
batch_sizeepochsverboser   validation_splitvalidation_datashuffleclass_weightr   initial_epochsteps_per_epochvalidation_stepsvalidation_batch_sizevalidation_freqs                    r   fitzNumpyTrainer.fit   s    & ""JKKr   c                 *   t        |||d| j                        }t        |t        j                        s(t        j                  ||dk7  |d|j
                  |       }d }| j                          d| _        |j                          d }|D ]R  \  }	}
|j                  |	       | j                  |
      } |||      }|j                  |	d|i       | j                  sR n |j                          t        j                  t        j                   |      S )NF)r   rh   rp   rm   r:   r   r9   add_progbarrj   ri   stepsmodelc                 n    |t        j                  d |       }|S t        j                  | d ||        |S )Nc                     | gS r   r5   )batch_outputs    r   rF   zANumpyTrainer.predict.<locals>.append_to_outputs.<locals>.<lambda>   s    , r   c                 $    | j                  |      S r   )append)outputr|   s     r   rF   zANumpyTrainer.predict.<locals>.append_to_outputs.<locals>.<lambda>   s    |1L r   )r   rG   map_structure_up_to)batch_outputsrH   s     r   append_to_outputsz/NumpyTrainer.predict.<locals>.append_to_outputs   sG    ,,7! N ((!L!	 Nr   rH   )r   r:   
isinstancecallbacks_moduleCallbackListnum_batchesrK   stop_predictingon_predict_beginon_predict_batch_beginr   on_predict_batch_endon_predict_endr   r   rB   rC   )r   r   rh   rj   rx   r   epoch_iteratorr   rH   stepr)   r   s               r   predictzNumpyTrainer.predict   s   
 '!! $ 8 8
 )%5%B%BC(55#qL$00I	 	""$$""$( 	JD$,,T2 11$7M'w?G**4)]1KL##	 	  "''r~~wOOr   c	           	         |	j                  dd      }
|	rt        d|	       |
r| j                  }nt        |||||d| j                        }t        d | j                         D              s!|D ]  \  }}|d   }| j                  |        n t        |t        j                        s(t        j                  ||dk7  |d|j                  |       }| j                          d| _        |j                          i }| j                          |D ]G  \  }}|j!                  |       | j#                  |      }|j%                  ||       | j                  sG n | j'                  |      }|j)                  |       |r|S | j+                  |      S )	N_use_cached_eval_datasetFzArguments not recognized: )r   r   r   rh   rp   rm   r:   c              3   4   K   | ]  }|j                     y wr   rN   rP   s     r   rS   z(NumpyTrainer.evaluate.<locals>.<genexpr>   s     C55;;CrT   r   r9   rv   )pop
ValueError_eval_epoch_iteratorr   r:   rY   rZ   rd   r   r   r   r   r<   stop_evaluatingon_test_beginreset_metricson_test_batch_beginr   on_test_batch_end_get_metrics_result_or_logson_test_end_flatten_metrics_in_order)r   r   r   rh   rj   r   rx   r   return_dictkwargsuse_cached_eval_datasetr   r-   r)   r`   r7   r   s                    r   evaluatezNumpyTrainer.evaluate   s    #)**-G"O9&BCC"!66N ++% %$($<$<N CD,@,@,BCC) 4!!W
$$Z0 )%5%B%BC(55#qL$00I 	!$!( 	JD$))$/%%d+D''d3##	 //5d#K--d33r   c                     t        d      )Nz1train_on_batch not implemented for NumPy backend.rf   )r   r   r   r   rn   r   s         r   train_on_batchzNumpyTrainer.train_on_batch$  s     "?
 	
r   c                     | j                  d       |||f}| j                  |       | j                          | j                  |g      }t	        j
                  d |      }|r|S | j                  |      S )Ntest_on_batchc                 ,    t        j                  |       S r   )rB   array)r   s    r   rF   z,NumpyTrainer.test_on_batch.<locals>.<lambda>@  s    BHHQK r   )_assert_compile_calledrd   r<   r   r   rG   r   )r   r   r   r   r   r)   r7   s          r   r   zNumpyTrainer.test_on_batch0  sx     	##O41m$ 	T"!!!4&)!!"7>K--d33r   c                     | j                          | j                  |fg      }t        j                  t        j
                  |      }|S r   )rK   r   r   rG   r   convert_to_numpy)r   r   r   s      r   predict_on_batchzNumpyTrainer.predict_on_batchE  sE    ""$--tf5**$$m
 r   )F)NNNr9   autoNg        NTNNr   NNNr9   )Nr   NN)NNNr   NNNF)NNNF)NNF)__name__
__module____qualname__r   r+   r.   r<   rK   rd   rt   r   filter_tracebackr   r   r   r   r   __classcell__)r   s   @r   r   r      s    %
O$'(-66t 
"#L* %%HL2P &2Ph %% 
A4 &A4L 

 4*r   r   )numpyrB   	keras.srcr   r   r   r   keras.src.backend.commonr   %keras.src.backend.common.keras_tensorr   keras.src.backend.numpy.corer   keras.src.trainersr	   base_trainer keras.src.trainers.data_adaptersr
   !keras.src.trainers.epoch_iteratorr   keras.src.utilsr   Trainerr   r5   r   r   <module>r      s:      3  6 = 2 6 ? ; +|<'' |r   