o
    2hE                     @   s   d dl Z d dlZ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 d dlmZ G dd dejZG dd deZdS )    N)parse)backend)	callbacks)
optimizers)tree)config)trainer)array_slicing)data_adapter_utils)EpochIterator)traceback_utilsc                       s   e Zd Z fddZdd Zdd Zdd Zd	d
 Zd$ddZd$ddZ	d$ddZ
ej																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 )*TorchTrainerc                    s    t    d | _d | _d | _d S N)super__init__train_functiontest_functionpredict_functionself	__class__ Z/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/backend/torch/trainer.pyr      s   

zTorchTrainer.__init__c                 C   s.   | j rttjtdk rtd d| _ | j S )Nz2.1.0z_Please upgrade to torch>=2.1.0 for `jit_compile=True` to take effect. Using `jit_compile=False`F)jit_compiler   torch__version__warningswarnr   r   r   r   _should_torch_compile   s   z"TorchTrainer._should_torch_compilec           	      C   s   t |\}}}| jr| |dd}n| |}|   | j||||dd}| jj|t|d j	d d | j
d ur?| j
|}| jrp|  | jd d  }dd |D }t  | j
|| W d    n1 sjw   Y  ntd | j||||dS )	NTtrainingxyy_predsample_weightr!   r   r&   c                 S   s   g | ]}|j jqS r   )valuegrad).0vr   r   r   
<listcomp>E   s    z+TorchTrainer.train_step.<locals>.<listcomp>z.The model does not have any trainable weights.)r
   unpack_x_y_sample_weight_call_has_training_arg	zero_grad_compute_loss_loss_trackerupdate_stater   flattenshape	optimizer
scale_losstrainable_weightsbackwardr   no_gradapplyr   r   compute_metrics)	r   datar#   r$   r&   r%   lossr7   	gradientsr   r   r   
train_step(   s.   



zTorchTrainer.train_stepc                 C   sr   t |\}}}| jr| |dd}n| |}| j||||dd}| jj|t|d jd d | j	||||dS )NFr    r"   r   r'   )
r
   r-   r.   r0   r1   r2   r   r3   r4   r;   )r   r<   r#   r$   r&   r%   r=   r   r   r   	test_stepO   s   
zTorchTrainer.test_stepc                 C   s2   t |\}}}| jr| |dd}|S | |}|S )NFr    )r
   r-   r.   )r   r<   r#   _r%   r   r   r   predict_stepa   s   zTorchTrainer.predict_stepFc                    \    j d ur
|s
 j S  jdkrtd j  fdd}  r)t| _ d S | _ d S )N   X`steps_per_execution` must be 1 with the PyTorch backend. Received: steps_per_execution=c                    s   | d }   | S )z/Runs a single training step on a batch of data.r   )r?   r<   r   r   r   one_step_on_datas   s   
z:TorchTrainer.make_train_function.<locals>.one_step_on_data)r   steps_per_execution
ValueErrorr   r   compiler   forcerG   r   r   r   make_train_functioni   s   

z TorchTrainer.make_train_functionc                    rC   )NrD   rE   c                    >   | d } t    | W  d   S 1 sw   Y  dS )z+Runs a single test step on a batch of data.r   N)r   r9   r@   rF   r   r   r   rG         
$z9TorchTrainer.make_test_function.<locals>.one_step_on_data)r   rH   rI   r   r   rJ   rK   r   r   r   make_test_function}      

zTorchTrainer.make_test_functionc                    rC   )NrD   rE   c                    rN   )z,Runs a predict test step on a batch of data.r   N)r   r9   rB   rF   r   r   r   rG      rO   z<TorchTrainer.make_predict_function.<locals>.one_step_on_data)r   rH   rI   r   r   rJ   rK   r   r   r   make_predict_function   rQ   z"TorchTrainer.make_predict_functionNrD   auto        Tr   c                 C   s^  | j stdt }|r||k rtd|  |}d | _|r2|d u r2tj|||f|d\\}}}}|d ur>t	
|\}}}t||||||	|
| jd}| j|d |  t|tjsjtj|d|dk|||j| d}d	| _i }|   |  | jp{|}t||D ]}|   || |   i }|D ]\}}}|| | |}||| | jr nqt| |}|    |d ur| !||rt"| d
d d u rt||||p|| j|d	d| _| j#||||p|||ddd}dd |$ D }|%| |&|| |}| jr nqt| j't(j)r|dkr| j'*| j+ t"| d
d d ur&| `|j,|d | j-S )Nz1You must call `compile()` before calling `fit()`.zLimiting epochs to %d)validation_split)r#   r$   r&   
batch_sizesteps_per_epochshuffleclass_weightrH   iteratorTr   )add_historyadd_progbarverboseepochsstepsmodelF_eval_epoch_iterator)r#   r$   r&   rV   rH   rW   rX   )r#   r$   r&   rV   r`   r   return_dict_use_cached_eval_datasetc                 S   s   i | ]	\}}d | |qS )val_r   )r*   namevalr   r   r   
<dictcomp>-  s    z$TorchTrainer.fit.<locals>.<dictcomp>)logs).compiledrI   r   
max_epochsr   r   rb   r	   train_validation_splitr
   r-   TorchEpochIteratorrH   _symbolic_buildreset
isinstancecallbacks_moduleCallbackListnum_batchesstop_trainingrM   on_train_begin_initial_epochrangereset_metricson_epoch_begintrainon_train_batch_beginr   on_train_batch_enddict_get_metrics_result_or_logseval_should_evalgetattrevaluateitemsupdateon_epoch_endr5   optimizers_module	Optimizerfinalize_variable_valuesr7   on_train_endhistory)r   r#   r$   rV   r_   r^   r   rU   validation_datarX   rY   r&   initial_epochrW   validation_stepsvalidation_batch_sizevalidation_freqrk   val_xval_yval_sample_weightepoch_iteratortraining_logsepochri   
begin_stepend_stepr<   
epoch_logsval_logsr   r   r   fit   s   





	


zTorchTrainer.fitc	              	   K   s  |	 dd}
|	rtd|	 |
r| j}nt|||||d| jd}| j|d |  t|tj	s?tj	||dk|d|j
| d}|   |   d| _|  i }|   |D ]\}}}|| | |}||| | jrp nqV| |}|| |r|S | |S )	Nrd   FzArguments not recognized: )r#   r$   r&   rV   rW   rX   rH   rZ   r   rD   r]   r^   r_   r`   ra   )poprI   rb   rm   rH   rn   ro   rp   rq   rr   rs   r   rP   stop_evaluatingon_test_beginrx   on_test_batch_beginr   on_test_batch_endr~   on_test_end_flatten_metrics_in_order)r   r#   r$   rV   r^   r&   r`   r   rc   kwargsuse_cached_eval_datasetr   ri   r   r   r<   r   r   r   r   C  sV   






zTorchTrainer.evaluatec                 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rV nq5|  ttj|}t|tj|S )	NF)r#   rV   rW   rX   rH   r   rD   r   c                 S   s4   |d u rt dd | }|S t | dd ||  |S )Nc                 S   s   | gS r   r   )batch_outputr   r   r   <lambda>  s    zATorchTrainer.predict.<locals>.append_to_outputs.<locals>.<lambda>c                 S   s
   |  |S r   )append)outputr   r   r   r   r        
 )r   map_structuremap_structure_up_to)batch_outputsoutputsr   r   r   append_to_outputs  s   z/TorchTrainer.predict.<locals>.append_to_outputsr   )rm   rH   rp   rq   rr   rs   r   rR   stop_predictingon_predict_beginon_predict_batch_beginr   on_predict_batch_endon_predict_endr   r   r   convert_to_numpyr   npconcatenate)r   r#   rV   r^   r`   r   r   r   r   r   r   r<   r   r   r   r   predict  sB   		


zTorchTrainer.predictc                 C   s   |  d |d ur|d urtd| d| t||}|||f}| j|d |   | |g}tdd |}|r>|S | 	|S )Ntrain_on_batchzkArguments `sample_weight` and `class_weight` cannot be specified at the same time. Received: sample_weight=z, class_weight=
data_batchc                 S   
   t | S r   r   arrayr#   r   r   r   r     r   z-TorchTrainer.train_on_batch.<locals>.<lambda>)
_assert_compile_calledrI   r
   class_weight_to_sample_weightsrn   rM   r   r   r   r   )r   r#   r$   r&   rY   rc   r<   ri   r   r   r   r     s*   


zTorchTrainer.train_on_batchc                 C   sV   |  d |||f}| j|d |   | |g}tdd |}|r&|S | |S )Ntest_on_batchr   c                 S   r   r   r   r   r   r   r   r     r   z,TorchTrainer.test_on_batch.<locals>.<lambda>)r   rn   rP   r   r   r   r   )r   r#   r$   r&   rc   r<   ri   r   r   r   r     s   


zTorchTrainer.test_on_batchc                 C   s(   |    | |fg}ttj|}|S r   )rR   r   r   r   r   r   )r   r#   r   r   r   r   predict_on_batch  s   zTorchTrainer.predict_on_batch)F)NNNrD   rS   NrT   NTNNr   NNNrD   )NNNrS   NNNF)NrS   NN)NNNF)NNF)__name__
__module____qualname__r   r   r?   r@   rB   rM   rP   rR   r   filter_tracebackr   r   r   r   r   r   __classcell__r   r   r   r   r      sf    '


 B;
$
r   c                   @   s   e Zd Zdd ZdS )rm   c                 C   s
   | j  S r   )data_adapterget_torch_dataloaderr   r   r   r   _get_iterator  s   
z TorchEpochIterator._get_iteratorN)r   r   r   r   r   r   r   r   rm     s    rm   )r   numpyr   r   packaging.versionr   	keras.srcr   r   rq   r   r   r   keras.src.backendr   keras.src.trainersr   base_trainer keras.src.trainers.data_adaptersr	   r
   !keras.src.trainers.epoch_iteratorr   keras.src.utilsr   Trainerr   rm   r   r   r   r   <module>   s&       n