
    2Vh_E                         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ej2                        Z G d de      Zy)    N)parse)backend)	callbacks)
optimizers)tree)config)trainer)array_slicing)data_adapter_utils)EpochIterator)traceback_utilsc                       e Zd Z fdZd Zd Zd Zd ZddZddZ	ddZ
ej                  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd	       Zej                  	 	 	 	 	 	 	 	 dd
       Zej                  	 dd       Z	 	 	 	 ddZ	 	 	 ddZd Z xZS )TorchTrainerc                 L    t         |           d | _        d | _        d | _        y N)super__init__train_functiontest_functionpredict_function)self	__class__s    O/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/backend/torch/trainer.pyr   zTorchTrainer.__init__   s&    "! $    c                     | j                   rAt        t        j                        t        d      k  rt	        j
                  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warnr   s    r   _should_torch_compilez"TorchTrainer._should_torch_compile   sJ    
 e&7&7 85> IMM<  %Dr   c                    t        j                  |      \  }}}| j                  r | |d      }n | |      }| j                          | j	                  ||||d      }| j
                  j                  |t        j                  |      d   j                  d          | j                  | j                  j                  |      }| j                  r||j                          | j                  d d  }|D cg c]  }|j                  j                   }	}t!        j"                         5  | j                  j%                  |	|       d d d        nt'        j(                  d       | j+                  ||||      S c c}w # 1 sw Y   #xY w)NTtrainingxyy_predsample_weightr%   r   r*   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backwardvaluegradr   no_gradapplyr   r    compute_metrics)
r   datar'   r(   r*   r)   lossr6   v	gradientss
             r   
train_stepzTorchTrainer.train_step(   sm   0II$O1m &&!d+F!WF 	!!1V=4 " 
 	''Q 2 8 8 ; 	( 	
 >>%>>,,T2D !! MMO $ 6 6q 9/@A!AIA  C$$Y0ABC C MMJK##Aq&#NN BC Cs   5E8(E==Fc                 H   t        j                  |      \  }}}| j                  r | |d      }n | |      }| j                  ||||d      }| j                  j                  |t        j                  |      d   j                  d          | j                  ||||      S )NFr$   r&   r   r+   )
r   r,   r-   r/   r0   r1   r   r2   r3   r<   )r   r=   r'   r(   r*   r)   r>   s          r   	test_stepzTorchTrainer.test_stepO   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TorchTrainer.predict_stepa   sD    $==dC1a&&!e,F  !WFr   c                       j                   |s j                   S  j                  dkD  rt        d j                          fd} j                         rt	        j
                  |       _         y | _         y )N   X`steps_per_execution` must be 1 with the PyTorch backend. Received: steps_per_execution=c                 0    | d   } j                  |       S )z/Runs a single training step on a batch of data.r   )rA   r=   r   s    r   one_step_on_dataz:TorchTrainer.make_train_function.<locals>.one_step_on_datas   s    7D??4((r   )r   steps_per_execution
ValueErrorr"   r   compiler   forcerL   s   `  r   make_train_functionz TorchTrainer.make_train_functioni   s|    *5&&&##a'1151I1I0JL 
	)
 %%'"'--0@"AD"2Dr   c                       j                   |s j                   S  j                  dkD  rt        d j                          fd} j                         rt	        j
                  |       _         y | _         y )NrH   rI   c                     | d   } t        j                         5  j                  |       cddd       S # 1 sw Y   yxY w)z+Runs a single test step on a batch of data.r   N)r   r:   rC   rK   s    r   rL   z9TorchTrainer.make_test_function.<locals>.one_step_on_data   s6    7D ,~~d+, , ,   6?)r   rM   rN   r"   r   rO   rP   s   `  r   make_test_functionzTorchTrainer.make_test_function}   s|    )%%%%##a'1151I1I0JL 
	, %%'!&/?!@D!1Dr   c                       j                   |s j                   S  j                  dkD  rt        d j                          fd} j                         rt	        j
                  |       _         y | _         y )NrH   rI   c                     | d   } t        j                         5  j                  |       cddd       S # 1 sw Y   yxY w)z,Runs a predict test step on a batch of data.r   N)r   r:   rF   rK   s    r   rL   z<TorchTrainer.make_predict_function.<locals>.one_step_on_data   s8    7D /((./ / /rU   )r   rM   rN   r"   r   rO   rP   s   `  r   make_predict_functionz"TorchTrainer.make_predict_function   s|      ,U(((##a'1151I1I0JL 
	/ %%'$)MM2B$CD!$4D!r   c                    | j                   st        d      t        j                         }|r||k  rt	        j
                  d|z         |}d | _        |r#|!t        j                  |||f|      \  \  }}}}|t        j                  |      \  }}}t        ||||||	|
| j                        }| j                  |       |j                          t        |t         j"                        s)t!        j"                  |d|dk7  |||j$                  |       }d	| _        i }| j)                          |j+                          | j,                  xs |}t/        ||      D ]h  }| j1                          |j3                  |       | j5                          i }|D ]G  \  }}|j7                  |       | j9                  |      }|j;                  ||       | j&                  sG n t=        | j?                  |            }| jA                          || jC                  ||      rtE        | d
d       %t        |xs || j                  |d	      | _        | jG                  |xs |||dd      }|jI                         D ci c]  \  }}d|z   | }}}|jK                  |       |jM                  ||       |}| j&                  si n t        | jN                  tP        jR                        r*|dkD  r%| jN                  jU                  | jV                         tE        | d
d       | `|jY                  |       | jZ                  S c c}}w )Nz1You must call `compile()` before calling `fit()`.zLimiting epochs to %d)validation_split)r'   r(   r*   
batch_sizesteps_per_epochshuffleclass_weightrM   iteratorTr   )add_historyadd_progbarverboseepochsstepsmodelF_eval_epoch_iterator)r'   r(   r*   r\   rM   r]   r^   )r'   r(   r*   r\   rf   r   return_dict_use_cached_eval_datasetval_)logs).compiledrN   r   
max_epochsr   r    rh   r
   train_validation_splitr   r,   TorchEpochIteratorrM   _symbolic_buildreset
isinstancecallbacks_moduleCallbackListnum_batchesstop_trainingrR   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_endr4   optimizers_module	Optimizerfinalize_variable_valuesr6   on_train_endhistory)r   r'   r(   r\   re   rd   r   r[   validation_datar^   r_   r*   initial_epochr]   validation_stepsvalidation_batch_sizevalidation_freqrn   val_xval_yval_sample_weightepoch_iteratortraining_logsepochrl   stepr=   
epoch_logsval_logsnamevals                                  r   fitzTorchTrainer.fit   s   ( }}C  &&(
*v-MM1J>?F %)! 7 44A}%8H%A}
 &
 #;;OL	! ,'!+% $ 8 8	
 	n5 )%5%B%BC(55 #qL$00I #  "  "++<}=&1 <	E $$U+
 JJLD, 	
d..t4**40 ,,T48%%	 d>>tDEJ IIK *t/@/@0 4!7>F0B&7#8#FJ,0,D,D(8 %1D-  =="34B
*' $-1 ) 	 9A8H+44FTM3&  !!(+""5*5&M!!y<	~ t~~'8'B'BC
NN33D4J4JK 4/6B)M2||)s   >Mc	           	         |	j                  dd      }
|	rt        d|	       |
r| j                  }nt        |||||d| j                        }| j                  |       |j                          t        |t        j                        s(t        j                  ||dk7  |d|j                  |       }| j                          | j                          d| _        |j                          i }| j                          |D ]G  \  }}|j!                  |       | j#                  |      }|j%                  ||       | j                  sG n | j'                  |      }|j)                  |       |r|S | j+                  |      S )	Nrj   FzArguments not recognized: )r'   r(   r*   r\   r]   r^   rM   r`   r   rH   rc   rd   re   rf   rg   )poprN   rh   rp   rM   rq   rr   rs   rt   ru   rv   r   rV   stop_evaluatingon_test_beginr{   on_test_batch_beginr   on_test_batch_endr   on_test_end_flatten_metrics_in_order)r   r'   r(   r\   rd   r*   rf   r   ri   kwargsuse_cached_eval_datasetr   rl   r   r=   s                  r   r   zTorchTrainer.evaluateC  s    #)**-G"O9&BCC"!66N 0+% %$($<$<N 	n5 )%5%B%BC(55#qL$00I 			!$!( 	JD$))$/%%d+D''d3##	 //5d#K--d33r   c                    t        |||d| j                        }t        |t        j                        s(t        j                  ||dk7  |d|j
                  |       }d }| j                          | j                          d| _        |j                          d }|D ]R  \  }	}
|j                  |	       | j                  |
      } |||      }|j                  |	d|i       | j                  sR n |j                          t        j                  t         j"                  |      }t        j$                  t&        j(                  |      S )NF)r'   r\   r]   r^   rM   r   rH   r   c                 n    |t        j                  d |       }|S t        j                  | d ||        |S )Nc                     | gS r    )batch_outputs    r   <lambda>zATorchTrainer.predict.<locals>.append_to_outputs.<locals>.<lambda>  s    , r   c                 $    | j                  |      S r   )append)outputr   s     r   r   zATorchTrainer.predict.<locals>.append_to_outputs.<locals>.<lambda>  s    |1L r   )r   map_structuremap_structure_up_to)batch_outputsoutputss     r   append_to_outputsz/TorchTrainer.predict.<locals>.append_to_outputs  sG    ,,7! N ((!L!	 Nr   r   )rp   rM   rs   rt   ru   rv   r   rY   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'   r\   rd   rf   r   r   r   r   r   r=   r   s               r   predictzTorchTrainer.predict  s4   
 ,!! $ 8 8
 )%5%B%BC(55#qL$00I	  			""$$""$( 	JD$,,T2 11$7M'w?G**4)]1KL##	 	  "$$W%=%=wG''r~~wOOr   c                 D   | j                  d       |)|t        d| d|       t        j                  ||      }|||f}| j	                  |       | j                          | j                  |g      }t        j                  d |      }|r|S | j                  |      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                 ,    t        j                  |       S r   r   arrayr'   s    r   r   z-TorchTrainer.train_on_batch.<locals>.<lambda>      BHHQK r   )
_assert_compile_calledrN   r   class_weight_to_sample_weightsrq   rR   r   r   r   r   )r   r'   r(   r*   r_   ri   r=   rl   s           r   r   zTorchTrainer.train_on_batch  s     	##$45#( //<o >$$0>3  /MM<M 1m$ 	-  """D6*!!"7>K--d33r   c                     | j                  d       |||f}| j                  |       | j                          | j                  |g      }t	        j
                  d |      }|r|S | j                  |      S )Ntest_on_batchr   c                 ,    t        j                  |       S r   r   r   s    r   r   z,TorchTrainer.test_on_batch.<locals>.<lambda>  r   r   )r   rq   rV   r   r   r   r   )r   r'   r(   r*   ri   r=   rl   s          r   r   zTorchTrainer.test_on_batch  s{     	##O41m$ 	-!!!4&)!!"7>K--d33r   c                     | j                          | j                  |fg      }t        j                  t        j
                  |      }|S r   )rY   r   r   r   r   r   )r   r'   r   s      r   predict_on_batchzTorchTrainer.predict_on_batch  sE    ""$--tf5**$$m
 r   )F)NNNrH   autoNg        NTNNr   NNNrH   )NNNr   NNNF)Nr   NN)NNNF)NNF)__name__
__module____qualname__r   r"   rA   rC   rF   rR   rV   rY   r   filter_tracebackr   r   r   r   r   r   __classcell__)r   s   @r   r   r      s    % %ONO$3(2*5* %% 
"#Y &Yv %% 
@4 &@4D %%HL6P &6Pv 4H 4*r   r   c                       e Zd Zd Zy)rp   c                 6    | j                   j                         S r   )data_adapterget_torch_dataloaderr!   s    r   _get_iteratorz TorchEpochIterator._get_iterator  s      5577r   N)r   r   r   r   r   r   r   rp   rp     s    8r   rp   )r   numpyr   r   packaging.versionr   	keras.srcr   r   rt   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   rp   r   r   r   <module>r      sP       #  3 5  $ 6 : ? ; +h<'' hV8 8r   