
    &Vf)                         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dS )    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                 d    t                                                       d | _        d | _        d S N)super__init__test_functionpredict_function)self	__class__s    \/var/www/html/software/conda/lib/python3.11/site-packages/keras/src/backend/numpy/trainer.pyr   zNumpyTrainer.__init__   s/    ! $    c                 T   t          j        |          \  }}}| j        r | |d          }n | |          }|                     ||||          }| j                            |t          j        |          d         j        d                    | 	                    ||||          S )NFtraining)xyy_predsample_weightr   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==		
& 	T!e,,,FFT!WWF  1V= ! 
 
 	''Q 2 8 ; 	( 	
 	
 	
 ##Aq&#NNNr   c                 v    t          j        |          \  }}}| j        r | |d          }n | |          }|S )NFr   )r
   r!   r"   )r   r)   r   _r   s        r   predict_stepzNumpyTrainer.predict_step'   sK    $=dCC1a& 	T!e,,,FFT!WWFr   Fc                 l      j         	|s j         S  fdfd} j        dk    r|}n}| _         d S )Nc                 >    | d         }                      |           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 9 $}&6%788Kr      )r   steps_per_execution)r   forcer8   r+   r3   s   `   @r   make_test_functionzNumpyTrainer.make_test_function/   sw    )%)%%	( 	( 	( 	( 	(	 	 	 	 	
 #a''(II%I&r   c                 l      j         	|s j         S  fdfd} j        dk    r|}n}| _         d S )Nc                 >    | d         }                      |           S r1   )r.   r2   s    r   one_predict_stepz<NumpyTrainer.make_predict_function.<locals>.one_predict_stepG   s     7D$$T***r   c                      | d d                   }| dd          D ]%} |g          }t          j        d ||          }&|S )Nr9   c                 .    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   sn    &&tBQBx00G$(H   //1A0BCC,;;  
 Nr   r9   )r   r:   )r   r;   rJ   r.   r?   s   `   @r   make_predict_functionz"NumpyTrainer.make_predict_functionC   sw     ,U,((	+ 	+ 	+ 	+ 	+
	 
	 
	 
	 
	 #a''.LL+L ,r   c                    t          d |                                 D                        }| j        d uo| j        j         }|s|r{d }t	          j        ||          }t          j        |          \  }}}	 t          j	        | |          }n#  t          d          xY w|rt          j	        | j        ||||           |                                  d S )Nc              3   $   K   | ]}|j         V  d S r   built.0layers     r   	<genexpr>z/NumpyTrainer._symbolic_build.<locals>.<genexpr>_   s$      PPPPPPPPr   c                 r    t          |           r't          | j        t          | j                            S | S r   )r   r   r'   r   dtype)vs    r   to_symbolic_inputz7NumpyTrainer._symbolic_build.<locals>.to_symbolic_inputg   s3    Q<< L&qw0A!'0J0JK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   r   rG   r
   r!   r   compute_output_specRuntimeErrorr(   _post_build)	r   
data_batchmodel_unbuiltcompile_metrics_unbuiltrW   r   r   r   r   s	            r   _symbolic_buildzNumpyTrainer._symbolic_build^   s+   PP9M9M9O9OPPPPPP!- 0)// 	   #	3 #	  
 +,=zJJJ
 #;JGG	 4T1==	"<   ' +("/    	s   8B BNr9   auto        Tr   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KKr   c           	      b   t          |||d| j                  }t          |t          j                  s$t          j        |d|dk    |d|j        |           }d }|                                  d| _        |                                 d }|	                                D ]\\  }	}
|
                    |	           |                     |
          } |||          }|                    |	d|i           | j        r n]|                                 t          j        |t           j        |          S )	NF)r   rg   ro   rl   r:   Tr   r9   add_historyadd_progbarri   rh   stepsmodelc                 h    |t          j        d |           }nt          j        | d ||            |S )Nc                     | gS r   r5   )batch_outputs    r   rF   zANumpyTrainer.predict.<locals>.append_to_outputs.<locals>.<lambda>   s    , r   c                 ,    |                      |          S r   )append)outputr|   s     r   rF   zANumpyTrainer.predict.<locals>.append_to_outputs.<locals>.<lambda>   s    |1L1L r   )r   rG   map_structure_up_to)batch_outputsrH   s     r   append_to_outputsz/NumpyTrainer.predict.<locals>.append_to_outputs   sQ    ,77! 
 (!LL!	   Nr   rH   )r   r:   
isinstancecallbacks_moduleCallbackListnum_batchesrK   stop_predictingon_predict_beginenumerate_epochon_predict_batch_beginr   on_predict_batch_endon_predict_endr   r   rB   rC   )r   r   rg   ri   rx   r   epoch_iteratorr   rH   stepr)   r   s               r   predictzNumpyTrainer.predict   sh   
 '!! $ 8
 
 
 )%5%BCC 		(5 #qL$0  I	 	 	 	""$$$$""$$$(88:: 	 	JD$,,T222 11$77M''w??G**4)]1KLLL#   """'r~wOOOr   c	           	         |	                     dd          }
|	rt          d|	           |
r| j        }nt          |||||d| j                  }t          d |                                 D                       s7|                                D ]"\  }}|d         }|                     |            t          |t          j                  s$t          j        |d|dk    |d|j        | 	          }|                                  d| _        |                                 d }|                                  |                                D ]c\  }}|                    |           |                     |          }|                     |          }|                    ||           | j        r nd|                     |          }|                    |           |r|S |                     |          S )
N_use_cached_eval_datasetFzArguments not recognized: )r   r   r   rg   ro   rl   r:   c              3   $   K   | ]}|j         V  d S r   rN   rP   s     r   rS   z(NumpyTrainer.evaluate.<locals>.<genexpr>   s$      CC55;CCCCCCr   r   Tr9   ru   )pop
ValueError_eval_epoch_iteratorr   r:   rX   rY   r   ra   r   r   r   r   r<   stop_evaluatingon_test_beginreset_metricson_test_batch_beginr   _pythonify_logson_test_batch_end_get_metrics_result_or_logson_test_end_flatten_metrics_in_order)r   r   r   rg   ri   r   rx   r   return_dictkwargsuse_cached_eval_datasetr   r-   r)   r^   r7   r   s                    r   evaluatezNumpyTrainer.evaluate   sA    #)**-G"O"O 	DB&BBCCC" 	!6NN ++% %$($<  N CCD,@,@,B,BCCCCC 	)99;;  4!!W
$$Z000 )%5%BCC 		(5 #qL$0  I 	!!!$!!!(88:: 	 	JD$))$///%%d++D''--D''d333# //55d### 	K--d333r   c                      t          d          )Nz1train_on_batch not implemented for NumPy backend.re   )r   r   r   r   rm   r   s         r   train_on_batchzNumpyTrainer.train_on_batch  s     "?
 
 	
r   c                    |                      d           |||f}|                     |           |                                  |                     |g          }t	          j        d |          }|r|S |                     |          S )Ntest_on_batchc                 *    t          j        |           S r   )rB   array)r   s    r   rF   z,NumpyTrainer.test_on_batch.<locals>.<lambda>7  s    BHQKK r   )_assert_compile_calledra   r<   r   r   rG   r   )r   r   r   r   r   r)   r7   s          r   r   zNumpyTrainer.test_on_batch'  s     	##O4441m$ 	T"""!!!!!4&))!"7"7>> 	K--d333r   c                     |                                   |                     |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_batch<  sM    ""$$$--tf55*$m
 
 r   )F)NNNr9   rb   Nrc   NTNNr   NNNr9   )Nrb   NN)NNNrb   NNNF)NNNF)NNF)__name__
__module____qualname__r   r+   r.   r<   rK   ra   rs   r   filter_tracebackr   r   r   r   r   __classcell__)r   s   @r   r   r      s       % % % % %
O O O$  ' ' ' '(- - - -6* * *\ 
"#L L L L* %HL3P 3P 3P &%3Pj % 
C4 C4 C4 &%C4P 

 

 

 

 4 4 4 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 3 3 3 3 3       6 6 6 6 6 6 = = = = = = 2 2 2 2 2 2 6 6 6 6 6 6 ? ? ? ? ? ? ; ; ; ; ; ; + + + + + +s s s s s<' s s s s sr   