
    ij*F                         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 d dlmZ  G d dej6                        Z G d de      Zy)    N)parse)backend)	callbacks)
optimizers)tree)config)trainer)array_slicing)data_adapter_utils)EpochIterator)traceback_utils)pythonify_logsc                       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    t/var/www/html/emotional.easysim.app/public_html/venv/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        d 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&   c              3   &   K   | ]	  }||  y wr    .0is     r   	<genexpr>z*TorchTrainer.train_step.<locals>.<genexpr>;         am   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_statenextr   flattenshape	optimizer
scale_losstrainable_weightsbackwardvaluegradr   no_gradapplyr    r!   compute_metrics)
r   datar(   r)   r+   r*   lossr@   v	gradientss
             r   
train_stepzTorchTrainer.train_step)   s|   0II$O1m &&!d+F!WF 	!!1V=4 " 
 	'' <<? eA 	( 	
 >>%>>,,T2D !! MMO $ 6 6q 9/@A!AIA  C$$Y0ABC C MMJK##Aq&#NN BC Cs   F5F

Fc           	      b   t        j                  |      \  }}}| j                  r | |d      }n | |      }| j                  ||||d      }| j                  j                  |t        d t        j                  |      D              j                  d          | j                  ||||      S )NFr%   r'   c              3   &   K   | ]	  }||  y wr   r-   r.   s     r   r1   z)TorchTrainer.test_step.<locals>.<genexpr>b   r2   r3   r   r4   )r   r5   r6   r8   r9   r:   r;   r   r<   r=   rF   )r   rG   r(   r)   r+   r*   rH   s          r   	test_stepzTorchTrainer.test_stepS   s    
 77=		
&&!e,F!WF!!1V=5 " 
 	'' <<? eA 	( 	
 ##Aq&#NNr   c                 x    t        j                  |      \  }}}| j                  r | |d      }|S  | |      }|S )NFr%   )r   r5   r6   )r   rG   r(   _r*   s        r   predict_stepzTorchTrainer.predict_steph   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   )rK   rG   r   s    r   one_step_on_dataz:TorchTrainer.make_train_function.<locals>.one_step_on_dataz   s    7D??4((r   )r   steps_per_execution
ValueErrorr#   r   compiler   forcerW   s   `  r   make_train_functionz TorchTrainer.make_train_functionp   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 )NrS   rT   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   rD   rN   rV   s    r   rW   z9TorchTrainer.make_test_function.<locals>.one_step_on_data   s6    7D ,~~d+, , ,   6?)r   rX   rY   r#   r   rZ   r[   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 )NrS   rT   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   rD   rQ   rV   s    r   rW   z<TorchTrainer.make_predict_function.<locals>.one_step_on_data   s8    7D /((./ / /r`   )r   rX   rY   r#   r   rZ   r[   s   `  r   make_predict_functionz"TorchTrainer.make_predict_function   s|      ,U(((##a'1151I1I0JL 
	/ %%'$)MM2B$CD!$4D!r   c                    | j                  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 ]i  }| j/                          |j1                  |       | j3                          i }|D ]H  \  }}}|j5                  |       | j7                  |      }|j9                  ||       | j$                  sH n t;        | j=                  |            }| j?                          || jA                  ||      rtC        | d
d       %t        |xs || j                  |d	      | _        | jE                  |xs |||dd      }|jG                         D ci c]  \  }}d| | }}}|jI                  |       |jK                  ||       |}| j$                  sj n t        | jL                  tN        jP                        r*|dkD  r%| jL                  jS                  | jT                         tC        | d
d       | `|jW                  |       | jX                  S c c}}w )NfitzLimiting epochs to %d)validation_split)r(   r)   r+   
batch_sizesteps_per_epochshuffleclass_weightrX   iteratorTr   )add_historyadd_progbarverboseepochsstepsmodelF_eval_epoch_iterator)r(   r)   r+   rh   rX   ri   rj   )r(   r)   r+   rh   rr   r   return_dict_use_cached_eval_datasetval_)logs)-_assert_compile_calledr   
max_epochsr    r!   rt   r
   train_validation_splitr   r5   TorchEpochIteratorrX   _symbolic_buildreset
isinstancecallbacks_moduleCallbackListnum_batchesstop_trainingr]   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_endr>   optimizers_module	Optimizerfinalize_variable_valuesr@   on_train_endhistory) r   r(   r)   rh   rq   rp   r   rg   validation_datarj   rk   r+   initial_epochri   validation_stepsvalidation_batch_sizevalidation_freqrz   val_xval_yval_sample_weightepoch_iteratortraining_logsepochrx   
begin_stepend_steprG   
epoch_logsval_logsnamevals                                    r   rf   zTorchTrainer.fit   s|   ( 	##E*&&(
*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.< 	*
Hd..z:**40 ,,Xt<%%	 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d4&M3&  !!(+""5*5&M!!y<	~ t~~'8'B'BC
NN33D4J4JK 4/6B)M2||)s   9L=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 ]H  \  }}}|j!                  |       | j#                  |      }|j%                  ||       | j                  sH n t'        | j)                  |            }|j+                  |       |r|S | j-                  |      S )	Nrv   FzArguments not recognized: )r(   r)   r+   rh   ri   rj   rX   rl   r   rS   ro   rp   rq   rr   rs   )poprY   rt   r|   rX   r}   r~   r   r   r   r   r   ra   stop_evaluatingon_test_beginr   on_test_batch_beginr   on_test_batch_endr   r   on_test_end_flatten_metrics_in_order)r   r(   r)   rh   rp   r+   rr   r   ru   kwargsuse_cached_eval_datasetr   rx   r   r   rG   s                   r   r   zTorchTrainer.evaluateG  s    #)**-G"O9&BCC"!66N 0+% %$($<$<N 	n5 )%5%B%BC(55#qL$00I 			!$!*8 	&J$))*5%%d+D''$7##	 d>>tDE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 ]S  \  }	}
}|j                  |	       | j                  |      } |||      }|j                  |
d|i       | j                  sS n |j                          t        j                  t         j"                  |      }t        j$                  t&        j(                  |      S )NF)r(   rh   ri   rj   rX   r   rS   r   c                 n    |t        j                  d |       }|S t        j                  | d ||        |S )Nc                     | gS r   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   )r|   rX   r   r   r   r   r   rd   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(   rh   rp   rr   r   r   r   r   r   r   rG   r   s                r   predictzTorchTrainer.predict  s7   
 ,!! $ 8 8
 )%5%B%BC(55#qL$00I	  			""$$""$*8 	&J$,,Z8 11$7M'w?G**8i5OP##	 	  "$$W%=%=wG''r~~wOOr   c                 L   | j                  d       |)|t        d| d|       t        j                  ||      }|||f}| j	                  |       | j                          | j                          | j                  |g      }t        |      }|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_batch)
ry   rY   r   class_weight_to_sample_weightsr}   r]   r   r   r   r   )r   r(   r)   r+   rk   ru   rG   rx   s           r   r   zTorchTrainer.train_on_batch  s     	##$45#( //<o >$$0>3  /MM<M 1m$ 	-  """D6*d#K--d33r   c                     | j                  d       |||f}| j                  |       | j                          | j                          | j	                  |g      }t        |      }|r|S | j                  |      S )Ntest_on_batchr   )ry   r}   ra   r   r   r   r   )r   r(   r)   r+   ru   rG   rx   s          r   r   zTorchTrainer.test_on_batch  s~     	##O41m$ 	-!!!4&)d#K--d33r   c                     | j                          | j                  |fg      }t        j                  t        j
                  |      }|S r   )rd   r   r   r   r   r   )r   r(   r   s      r   predict_on_batchzTorchTrainer.predict_on_batch  sE    ""$--tf5**$$m
 r   )F)NNNrS   autoNg        NTNNr   NNNrS   )NNNr   NNNF)Nr   NN)NNNF)NNF)__name__
__module____qualname__r   r#   rK   rN   rQ   r]   ra   rd   r   filter_tracebackrf   r   r   r   r   r   __classcell__)r   s   @r   r   r      s    % (OTO*3(2*5* %% 
"#V &Vp %% 
@4 &@4D %%HL6P &6Pv  4J 4,r   r   c                       e Zd Zd Zy)r|   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   r|   r|     s    8r   r|   )r    numpyr   r   packaging.versionr   	keras.srcr   r   r   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   keras.src.utils.python_utilsr   Trainerr   r|   r-   r   r   <module>r      sS       #  3 5  $ 6 : ? ; + 7m<'' m`8 8r   