o
    2hv+                     @   s   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 dejZdS )    N)backend)	callbacks)tree)standardize_dtype)KerasTensor)	is_tensor)trainer)data_adapter_utils)EpochIterator)traceback_utilsc                       s   e Zd Z fddZdd Zdd Zd dd	Zd d
dZdd Z																d!ddZ	e
j	d"ddZe
j								d#ddZ				d$ddZ			d%ddZdd Z  ZS )&NumpyTrainerc                    s   t    d | _d | _d S N)super__init__test_functionpredict_functionself	__class__ Z/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/backend/numpy/trainer.pyr      s   

zNumpyTrainer.__init__c                 C   sr   t |\}}}| jr| |dd}n| |}| j||||dd}| jj|t|d jd d | j	||||d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   lossr   r   r   	test_step   s   
zNumpyTrainer.test_stepc                 C   s2   t |\}}}| jr| |dd}|S | |}|S )NFr   )r	   r   r    )r   r'   r   _r   r   r   r   predict_step'   s   zNumpyTrainer.predict_stepFc                    J   j d ur
|s
j S fdd  fdd}jdkr|}n }|_ d S )Nc                       | d }   | S Nr   )r)   r'   r   r   r   one_test_step3      
z6NumpyTrainer.make_test_function.<locals>.one_test_stepc                    s   | D ]} |g}q|S r   r   )r'   single_step_datalogs)r0   r   r   multi_test_steps7   s   z9NumpyTrainer.make_test_function.<locals>.multi_test_steps   )r   steps_per_execution)r   forcer4   r)   r   )r0   r   r   make_test_function/   s   

zNumpyTrainer.make_test_functionc                    r,   )Nc                    r-   r.   )r+   r/   r   r   r   one_predict_stepG   r1   z<NumpyTrainer.make_predict_function.<locals>.one_predict_stepc                    sB    | d d }| dd  D ]} |g}t dd ||}q|S )Nr5   c                 S   s   t | |gS r   )npconcatenate)t1t2r   r   r   <lambda>Q   s    zQNumpyTrainer.make_predict_function.<locals>.multi_predict_steps.<locals>.<lambda>)r   map_structure)r'   outputsr2   step_outputs)r9   r   r   multi_predict_stepsK   s   
z?NumpyTrainer.make_predict_function.<locals>.multi_predict_stepsr5   )r   r6   )r   r7   rB   r+   r   )r9   r   r   make_predict_functionC   s   

z"NumpyTrainer.make_predict_functionc           
      C   s   t dd |  D  }| jd uo| jj }| jd uo| jj }|s&|s&|rbdd }t||}t|\}}}zt	
| |}	W n   td|rUt	j
| j|||	|d |rbt	j
| j|||	|d |   d S )Nc                 s       | ]}|j V  qd S r   built.0layerr   r   r   	<genexpr>_       z/NumpyTrainer._symbolic_build.<locals>.<genexpr>c                 S   s   t | rt| jt| jS | S r   )r   r   r%   r   dtype)vr   r   r   to_symbolic_inputj   s   z7NumpyTrainer._symbolic_build.<locals>.to_symbolic_inputa  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_metricsrF   _compile_lossr   r?   r	   r   r   compute_output_specRuntimeErrorr&   r!   _post_build)
r   
data_batchmodel_unbuiltcompile_metrics_unbuiltcompile_loss_unbuiltrN   r   r   r   r   r   r   r   _symbolic_build^   sJ   
	zNumpyTrainer._symbolic_buildNr5   auto        Tr   c                 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_freqr   r   r   fit   s   zNumpyTrainer.fitc                 C   s   t |||d| jd}t|tjstj||dk|d|j| d}dd }|   d| _|  d }|D ]!\}	}
}|	|	 | 
|}|||}||
d|i | jrR nq1|  t|tj|S )	NF)r   r`   rh   re   r6   r   r5   add_progbarrb   ra   stepsmodelc                 S   s4   |d u rt dd | }|S t | dd ||  |S )Nc                 S   s   | gS r   r   )batch_outputr   r   r   r>      s    zANumpyTrainer.predict.<locals>.append_to_outputs.<locals>.<lambda>c                 S   s
   |  |S r   )append)outputrq   r   r   r   r>         
 )r   r?   map_structure_up_to)batch_outputsr@   r   r   r   append_to_outputs   s   z/NumpyTrainer.predict.<locals>.append_to_outputsr@   )r
   r6   
isinstancecallbacks_moduleCallbackListnum_batchesrC   stop_predictingon_predict_beginon_predict_batch_beginr   on_predict_batch_endon_predict_endr   ru   r:   r;   )r   r   r`   rb   ro   r   epoch_iteratorrw   r@   
begin_stepend_stepr'   rv   r   r   r   predict   s>   		


zNumpyTrainer.predictc	              	   K   s$  |	 dd}
|	rtd|	 |
r| j}nt|||||d| jd}tdd |  D s=|D ]\}}}|d }| |  t|t	j
sQt	j
||dk|d|j| d	}|   d| _|  i }|   |D ]\}}}|| | |}||| | jr~ nqd| |}|| |r|S | |S )
N_use_cached_eval_datasetFzArguments not recognized: )r   r   r   r`   rh   re   r6   c                 s   rD   r   rE   rG   r   r   r   rJ      rK   z(NumpyTrainer.evaluate.<locals>.<genexpr>r   r5   rm   )pop
ValueError_eval_epoch_iteratorr
   r6   rO   rP   rZ   rx   ry   rz   r{   r8   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   r`   rb   r   ro   r   return_dictkwargsuse_cached_eval_datasetr   r*   r'   rV   r3   r   r   r   r   r   evaluate   sZ   

	




zNumpyTrainer.evaluatec                 C   r]   )Nz1train_on_batch not implemented for NumPy backend.r^   )r   r   r   r   rf   r   r   r   r   train_on_batch$  s   zNumpyTrainer.train_on_batchc                 C   sT   |  d |||f}| | |   | |g}tdd |}|r%|S | |S )Ntest_on_batchc                 S   s
   t | S r   )r:   array)r   r   r   r   r>   @  rt   z,NumpyTrainer.test_on_batch.<locals>.<lambda>)_assert_compile_calledrZ   r8   r   r   r?   r   )r   r   r   r   r   r'   r3   r   r   r   r   0  s   



zNumpyTrainer.test_on_batchc                 C   s(   |    | |fg}ttj|}|S r   )rC   r   r   r?   r   convert_to_numpy)r   r   rv   r   r   r   predict_on_batchE  s   zNumpyTrainer.predict_on_batch)F)NNNr5   r[   Nr\   NTNNr   NNNr5   )Nr[   NN)NNNr[   NNNF)NNNF)NNF)__name__
__module____qualname__r   r)   r+   r8   rC   rZ   rl   r   filter_tracebackr   r   r   r   r   __classcell__r   r   r   r   r      s^    

:
4F

r   )numpyr:   	keras.srcr   r   ry   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   r   r   r   r   <module>   s    