
    &VfD                         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  G d dej                  Z G d de          ZdS )    N)parse)backend)	callbacks)
optimizers)tree)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                 r    t                                                       d | _        d | _        d | _        d S N)super__init__train_functiontest_functionpredict_function)self	__class__s    \/var/www/html/software/conda/lib/python3.11/site-packages/keras/src/backend/torch/trainer.pyr   zTorchTrainer.__init__   s7    "! $    c                     | j         rEt          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   sV    
  	%e&7 8 85>> I IM<    %Dr   c                    t          j        |          \  }}}| j        r | |d          }n | |          }|                                  |                     ||||          }| j                            |t          j        |          d         j	        d                    | j
        | j
                            |          }| j        rv|                                 | j        d d          }d |D             }t          j                    5  | j
                            ||           d d d            n# 1 swxY w Y   nt#          j        d           |                     ||||          S )NTtrainingxyy_predsample_weightr   r)   c                 &    g | ]}|j         j        S  )valuegrad).0vs     r   
<listcomp>z+TorchTrainer.train_step.<locals>.<listcomp>D   s    AAA!AAAr   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(   lossr<   	gradientss	            r   
train_stepzTorchTrainer.train_step'   s   0I$OO1m & 	T!d+++FFT!WWF 	  1V= ! 
 
 	''Q 2 8 ; 	( 	
 	
 	
 >%>,,T22D ! 	L MMOOO $ 6qqq 9AA/@AAAI  C C$$Y0ABBBC C C C C C C C C C C C C C C MJKKK##Aq&#NNNs   D77D;>D;c                 T   t          j        |          \  }}}| j        r | |d          }n | |          }|                     ||||          }| j                            |t          j        |          d         j        d                    | 	                    ||||          S )NFr#   r%   r   r*   )
r
   r2   r3   r5   r6   r7   r   r8   r9   r@   )r   rA   r&   r'   r)   r(   rB   s          r   	test_stepzTorchTrainer.test_stepN   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
   r2   r3   )r   rA   r&   _r(   s        r   predict_stepzTorchTrainer.predict_step`   sK    $=dCC1a& 	T!e,,,FFT!WWFr   Fc                       j         	|s j         S  j        dk    rt          d j                    fd}                                 rt	          j        |           _         d S | _         d S )N   X`steps_per_execution` must be 1 with the PyTorch backend. Received: steps_per_execution=c                 >    | d         }                      |           S )z/Runs a single training step on a batch of data.r   )rD   rA   r   s    r   one_step_on_dataz:TorchTrainer.make_train_function.<locals>.one_step_on_datar   s    7D??4(((r   )r   steps_per_execution
ValueErrorr!   r   compiler   forcerO   s   `  r   make_train_functionz TorchTrainer.make_train_functionh   s    *5*&&#a''L151IL L  
	) 	) 	) 	) 	)
 %%'' 	3"'-0@"A"AD"2Dr   c                       j         	|s j         S  j        dk    rt          d j                    fd}                                 rt	          j        |           _         d S | _         d S )NrK   rL   c                     | d         } t          j                    5                      |           cddd           S # 1 swxY w Y   dS )z+Runs a single test step on a batch of data.r   N)r   r>   rF   rN   s    r   rO   z9TorchTrainer.make_test_function.<locals>.one_step_on_data   s    7D , ,~~d++, , , , , , , , , , , , , , , , , ,   ?AA)r   rP   rQ   r!   r   rR   rS   s   `  r   make_test_functionzTorchTrainer.make_test_function|   s    )%)%%#a''L151IL L  
	, 	, 	, 	, 	, %%'' 	2!&/?!@!@D!1Dr   c                       j         	|s j         S  j        dk    rt          d j                    fd}                                 rt	          j        |           _         d S | _         d S )NrK   rL   c                     | d         } t          j                    5                      |           cddd           S # 1 swxY w Y   dS )z,Runs a predict test step on a batch of data.r   N)r   r>   rI   rN   s    r   rO   z<TorchTrainer.make_predict_function.<locals>.one_step_on_data   s    7D / /((../ / / / / / / / / / / / / / / / / /rX   )r   rP   rQ   r!   r   rR   rS   s   `  r   make_predict_functionz"TorchTrainer.make_predict_function   s     ,U,((#a''L151IL L  
	/ 	/ 	/ 	/ 	/ %%'' 	5$)M2B$C$CD!!!$4D!!!r   NrK   auto        Tr   c                 l   | j         st          d          d | _        |r"| t          j        |||f|          \  \  }}}}|t          j        |          \  }}}t          ||||||	|
| j                  }| 	                    |           t          |t          j                  s$t          j        |d|dk    |||j        |           }d| _        |                                  |                                 | j        p|}t%          ||          D ]}|                                  |                    |           |                                  |                                D ]c\  }}|                    |           |                     |          }|                     |          }|                    ||           | j        r ndt7          |                     |                    }|                                  ||                     ||          rt?          | d	d           "t          ||||p|| j        |d
          | _        |                      ||||p|||dd          }d |!                                D             }|"                    |           |#                    ||           |}| j        r nt          | j$        tJ          j&                  r%|dk    r| j$        '                    | j(                   t?          | d	d           | `|)                    |           | j*        S )Nz1You must call `compile()` before calling `fit()`.)validation_split)r&   r'   r)   
batch_sizesteps_per_epochshuffleclass_weightrP   iteratorTr   add_historyadd_progbarverboseepochsstepsmodelF_eval_epoch_iterator)r&   r'   r)   ra   rP   rb   rc   )r&   r'   r)   ra   rl   r   return_dict_use_cached_eval_datasetc                      i | ]\  }}d |z   |S )val_r,   )r/   namevals      r   
<dictcomp>z$TorchTrainer.fit.<locals>.<dictcomp>%  s/       +44FTM3  r   )logs)+compiledrQ   rn   r	   train_validation_splitr
   r2   TorchEpochIteratorrP   _symbolic_build
isinstancecallbacks_moduleCallbackListnum_batchesstop_trainingrU   on_train_begin_initial_epochrangereset_metricson_epoch_begintrainenumerate_epochon_train_batch_beginr   _pythonify_logson_train_batch_enddict_get_metrics_result_or_logseval_should_evalgetattrevaluateitemsupdateon_epoch_endr:   optimizers_module	Optimizerfinalize_variable_valuesr<   on_train_endhistory)r   r&   r'   ra   rk   rj   r   r`   validation_datarc   rd   r)   initial_epochrb   validation_stepsvalidation_batch_sizevalidation_freqval_xval_yval_sample_weightepoch_iteratorepochsteprA   rv   
epoch_logsval_logstraining_logss                               r   fitzTorchTrainer.fit   s   ( } 	C  
 %)! 
	 7 "/!EA}%8H" " "	  &
 #;OLL	! ,'!+% $ 8	
 	
 	
 	n555 )%5%BCC 		(5 #qL$0  I #  """  """+<}=&11 ;	 ;	E   $$U+++
 JJLLL,<<>> 
 

d..t444**400++D11 ,,T4888% E d>>tDDEEJ IIKKK *t/@/@0 0* 4!7>>F0B&7#8#FJ,0,D(8 %1 1 1D-  =="34B
*' $-1 ) 	 	 8@8H8H   !!(+++""5*555&M!  t~'8'BCC	L

N33D4JKKK 4/66B)M222|r   c	           	      p   |	                     dd          }
|	rt          d|	           |
r| j        }nt          |||||d| j                  }|                     |           t          |t          j                  s$t          j        |d|dk    |d|j	        | 	          }| 
                                 |                                  d| _        |                                 d }|                                  |                                D ]c\  }}|                    |           |                     |          }|                     |          }|                    ||           | j        r nd|                     |          }|                    |           |r|S |                     |          S )
Nrp   FzArguments not recognized: )r&   r'   r)   ra   rb   rc   rP   re   Tr   rK   rg   )poprQ   rn   ry   rP   rz   r{   r|   r}   r~   r   rY   stop_evaluatingon_test_beginr   r   on_test_batch_beginr   r   on_test_batch_endr   on_test_end_flatten_metrics_in_order)r   r&   r'   ra   rj   r)   rl   r   ro   kwargsuse_cached_eval_datasetr   rv   r   rA   s                  r   r   zTorchTrainer.evaluate;  s    #)**-G"O"O 	DB&BBCCC" 	!6NN 0+% %$($<  N 	n555 )%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| 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        |          }t          j        |t(          j        |          S )	NF)r&   ra   rb   rc   rP   Tr   rK   rg   c                 h    |t          j        d |           }nt          j        | d ||            |S )Nc                     | gS r   r,   )batch_outputs    r   <lambda>zATorchTrainer.predict.<locals>.append_to_outputs.<locals>.<lambda>  s    , r   c                 ,    |                      |          S r   )append)outputr   s     r   r   zATorchTrainer.predict.<locals>.append_to_outputs.<locals>.<lambda>  s    |1L1L r   )r   map_structuremap_structure_up_to)batch_outputsoutputss     r   append_to_outputsz/TorchTrainer.predict.<locals>.append_to_outputs  sQ    ,77! 
 (!LL!	   Nr   r   )ry   rP   r{   r|   r}   r~   r   r\   stop_predictingon_predict_beginr   on_predict_batch_beginr   on_predict_batch_endon_predict_endr   r   r   convert_to_numpyr   npconcatenate)r   r&   ra   rj   rl   r   r   r   r   r   rA   r   s               r   predictzTorchTrainer.predict  s   
 ,!! $ 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#   """$W%=wGG'r~wOOOr   c                 p   |                      d           |,|t          d| d|           t          j        ||          }|||f}|                     |           |                                  |                     |g          }t          j        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                 *    t          j        |           S r   r   arrayr&   s    r   r   z-TorchTrainer.train_on_batch.<locals>.<lambda>      BHQKK r   )
_assert_compile_calledrQ   r
   class_weight_to_sample_weightsrz   rU   r   r   r   r   )r   r&   r'   r)   rd   ro   rA   rv   s           r   r   zTorchTrainer.train_on_batch  s     	##$4555#( 3/<3 3 %13 3   /M< M 1m$ 	---  """""D6**!"7"7>> 	K--d333r   c                    |                      d           |||f}|                     |           |                                  |                     |g          }t	          j        d |          }|r|S |                     |          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   rz   rY   r   r   r   r   )r   r&   r'   r)   ro   rA   rv   s          r   r   zTorchTrainer.test_on_batch  s     	##O4441m$ 	---!!!!!4&))!"7"7>> 	K--d333r   c                     |                                   |                     |fg          }t          j        t          j        |          }|S r   )r\   r   r   r   r   r   )r   r&   r   s      r   predict_on_batchzTorchTrainer.predict_on_batch  sM    ""$$$--tf55*$m
 
 r   )F)NNNrK   r]   Nr^   NTNNr   NNNrK   )NNNr]   NNNF)Nr]   NN)NNNF)NNF)__name__
__module____qualname__r   r!   rD   rF   rI   rU   rY   r\   r   filter_tracebackr   r   r   r   r   r   __classcell__)r   s   @r   r   r      s       % % % % %     %O %O %ONO O O$  3 3 3 3(2 2 2 2*5 5 5 5* % 
"#R R R &%Rh % 
A4 A4 A4 &%A4F %HL7P 7P 7P &%7Px 4 4 4 4H 4 4 4 4*      r   r   c                       e Zd Zd ZdS )ry   c                 4    | j                                         S r   )data_adapterget_torch_dataloaderr    s    r   _get_iteratorz TorchEpochIterator._get_iterator  s     55777r   N)r   r   r   r   r,   r   r   ry   ry     s#        8 8 8 8 8r   ry   )r   numpyr   r   packaging.versionr   	keras.srcr   r   r|   r   r   r   keras.src.trainersr   base_trainer keras.src.trainers.data_adaptersr	   r
   !keras.src.trainers.epoch_iteratorr   keras.src.utilsr   Trainerr   ry   r,   r   r   <module>r      sA         # # # # # #       3 3 3 3 3 3 5 5 5 5 5 5       6 6 6 6 6 6 : : : : : : ? ? ? ? ? ? ; ; ; ; ; ; + + + + + +c c c c c<' c c cL8 8 8 8 8 8 8 8 8 8r   