
    ij5                         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y)    N)backend)	callbacks)tree)OPENVINO_DTYPES)OpenVINOKerasTensor)
get_device)trainer)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 Z	d Z
d	 Zdd
Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZej                  	 dd       Zej                  	 	 	 	 	 	 	 	 dd       Z	 	 	 	 ddZ	 	 	 ddZd Z xZS )OpenVINOTrainerc                 v    t         |           d | _        d | _        d | _        d | _        d | _        d | _        y N)super__init__test_functionpredict_functionov_compiled_model	ov_devicestruct_paramsstruct_outputs)self	__class__s    w/var/www/html/emotional.easysim.app/public_html/venv/lib/python3.12/site-packages/keras/src/backend/openvino/trainer.pyr   zOpenVINOTrainer.__init__   s=    ! $!%!"    c                 X    t        |t        t        f      rt        |      dk(  r|d   S |S )N   r   )
isinstancelisttuplelen)r   xs     r   _unpack_singletonz!OpenVINOTrainer._unpack_singleton   s(    a$'CFaKQ4Kr   c                 @   |d| j                    }| j                  t        j                  | j                  |            }| j
                  rSt        j                  |      }| j
                  j                         D ]!  \  }}t        j                  ||   ||          # |S )z>Split raw inference outputs into main outputs and apply masks.N)
_n_main_outputsr%   r   pack_sequence_asr   _output_mask_indicesflattenitemsr   set_keras_mask)r   all_outputsmain_outputsy_predflat_y_predout_idxmask_idxs          r   _unpack_inference_outputsz)OpenVINOTrainer._unpack_inference_outputs!   s    "#9T%9%9:''!!$"5"5|D
 $$,,v.K%)%>%>%D%D%F !&&(+h*? r   c                    t        j                  |      \  }}}t        j                  |       sD| j                  r | |d      }n | |      }t        j                  t        j                  |      }nM| j                  |      }t        j                  |      } ||      }| j                  |j                               }| j                  ||||d      }	t        j                  |	      }	| j                  j                  |	t        j                  |      d   j                   d          | j#                  ||||      S )NFtraining)r$   yr/   sample_weightr6   r   )r8   )r
   unpack_x_y_sample_weightbase_trainermodel_supports_jit_call_has_training_argr   map_structurer   convert_to_numpy_get_compiled_modelr*   r3   to_tuple_compute_loss_loss_trackerupdate_stateshapecompute_metrics)
r   datar$   r7   r8   r/   r   	flatten_x	ov_resultlosss
             r   	test_stepzOpenVINOTrainer.test_step/   s"   0II$O1m..t4**a%0a''(@(@&IF $ 8 8 ;QI))4I33I4F4F4HIF!!1V=5 " 
 ''-''Q 2 8 8 ; 	( 	
 ##Aq&#NNr   c                 ~   t        j                  |      \  }}}t        j                  |       sC| j                  r | |d      }n | |      }t        j                  t        j                  |      S | j                  |      }t        j                  |      } ||      }| j                  |j                               S )NFr5   )r
   r9   r:   r;   r<   r   r=   r   r>   r?   r*   r3   r@   )r   rF   r$   _r/   r   rG   rH   s           r   predict_stepzOpenVINOTrainer.predict_stepE   s    $==dC1a..t4**a%0a%%g&>&>GG 44Q7LLO	%i0	--i.@.@.BCCr   c                       j                   |s j                   S  fdfd} j                  dkD  r
|}| _         y }| _         y )Nc                 0    | d   } j                  |       S Nr   )rJ   rF   r   s    r   one_test_stepz9OpenVINOTrainer.make_test_function.<locals>.one_test_stepV   s    7D>>$''r   c                 (    | D ]  } |g      } S r    )rF   single_step_datalogsrR   s      r   multi_test_stepsz<OpenVINOTrainer.make_test_function.<locals>.multi_test_stepsZ   s&    $( 9 $&6%789Kr   r   )r   steps_per_execution)r   forcerW   rJ   rR   s   `   @r   make_test_functionz"OpenVINOTrainer.make_test_functionR   sU    )%%%%	(	
 ##a'(I ' &I&r   c                 *   t        |t        t        f      r-g }|D ]$  }| j                  |      }|j	                  |       & |S t        |t
              r:t               }|j                         D ]  \  }}| j                  |      }|||<    |S t        |t              r|}|S t        |t        j                        st        j                  |      rwt        t        |j                           }t        |j                        }t        |      dkD  rd|d<   t!        j"                  ||      }t        |j%                  d            }|S t        |t&              rKt!        j"                  g t(        j*                  j,                        }t        |j%                  d            }|S t        |t.              rKt!        j"                  g t(        j*                  j0                        }t        |j%                  d            }|S t3        dt5        |             )Nr   )rD   dtypezUnknown type of input data )r    r!   r"   _parameterize_dataappenddictr+   r   npndarrayisscalarr   strr]   rD   r#   ov_opset	parameteroutputintovTypei32floatf32
ValueErrortype)	r   rF   parametrize_dataelem
param_elem	elem_nameov_typeov_shapeparams	            r   r^   z"OpenVINOTrainer._parameterize_dataf   s   dT5M*! 4!44T:
 ''
342  - d##v#'::< 9	4!44T:
.8 +9(  # 12#    bjj)R[[->%c$**o6GDJJ'H8}q  &&XWEE25<<?C   c"&&Rrww{{CE25<<?C   e$&&Rrww{{CE25<<?C   :4:,GHHr   c                    g }t        j                  |      D ]l  }t        |t        j                        r?|j
                  dkD  rd|j                  dd  z   n|j                  }|j                  |       \|j                  d        n |S )Nr   )r\   r   )r   r*   r    ra   rb   ndimrD   r_   )r   rF   shapesr$   rD   s        r   _get_data_shapesz OpenVINOTrainer._get_data_shapes   sp    d# 	$A!RZZ(/0vvz+qwwe$d#	$ r   c                    | j                  |      }| j                  3t               | j                  k(  rt	        | dd       |k(  r| j                  S | `| j                  |      | _        | j                  r | | j                  d      | _        n | | j                        | _        g }t        j                  | j                        D ]+  }|j                  |j                  j                                - g }t        j                  | j                        }|D ]0  }|j                  t        j                  |j                               2 t!        |      | _        i | _        t'        |      D ]t  \  }}	t)        j*                  |	      }
|
t-        |
t.              s/t!        |      | j$                  |<   |j                  t        j                  |
j                               v t1        j2                  ||      }t1        j4                  |t                     | _        t               | _        || _        | j                  S )Nov_input_shapesFr5   )results
parameters)rz   r   r   r   getattrr^   r   r<   r   r   r*   r_   rg   get_nodere   resultr#   r'   r)   	enumerater   get_keras_maskr    r   ri   Modelcompile_modelr|   )r   rF   current_shapesr~   pr}   flat_struct_outputsrioutmaskov_models               r   r?   z#OpenVINOTrainer._get_compiled_model   s   ..t4""../6.H))) " "44T:&&"&t'9'9E"JD"&t'9'9":D
d001 	3Aahh//12	3"ll4+>+>?$ 	6ANN8??18845	6  #7| %'! 34 	=FAs))#.DJt5H$I/27|))!,xt{{;<		= 88G
C!#!1!1(JL!I#-%%%r   c                       j                   |s j                   S  fdfd} j                  dkD  r
|}| _         y }| _         y )Nc                 0    | d   } j                  |       S rP   )rM   rQ   s    r   one_predict_stepz?OpenVINOTrainer.make_predict_function.<locals>.one_predict_step   s    7D$$T**r   c                 t     | d d       }| dd  D ]#  } |g      }t        j                  d ||      }% |S )Nr   c                 0    t        j                  | |g      S r   )ra   concatenate)t1t2s     r   <lambda>zTOpenVINOTrainer.make_predict_function.<locals>.multi_predict_steps.<locals>.<lambda>   s    2>>2r(#; r   )r   r=   )rF   outputsrU   step_outputsr   s       r   multi_predict_stepszBOpenVINOTrainer.make_predict_function.<locals>.multi_predict_steps   sW    &tBQx0G$(H  /1A0BC,,;  Nr   r   )r   rX   )r   rY   r   rM   r   s   `   @r   make_predict_functionz%OpenVINOTrainer.make_predict_function   sU      ,U(((	+
	 ##a'.L !- ,L ,r   c                     t        d      )Nz,`fit` is not supported with openvino backendNotImplementedError)r   r$   r7   
batch_sizeepochsverboser   validation_splitvalidation_datashuffleclass_weightr8   initial_epochsteps_per_epochvalidation_stepsvalidation_batch_sizevalidation_freqs                    r   fitzOpenVINOTrainer.fit   s    & ":
 	
r   c           	      J   t        |||d| j                        }t        |t        j                        s)t        j                  |d|dk7  |d|j
                  |       }d }| j                          d| _        |j                          d }|j                         D ]S  \  }	}
}|j                  |	       | j                  |      } |||      }|j                  |
d|i       | j                  sS n |j                          t        j                  t         j"                  |      S )	NF)r$   r   r   r   rX   Tr   r   )add_historyadd_progbarr   r   stepsmodelc                 n    |t        j                  d |       }|S t        j                  | d ||        |S )Nc                     | gS r   rT   )batch_outputs    r   r   zDOpenVINOTrainer.predict.<locals>.append_to_outputs.<locals>.<lambda>
  s    , r   c                 $    | j                  |      S r   )r_   )rg   r   s     r   r   zDOpenVINOTrainer.predict.<locals>.append_to_outputs.<locals>.<lambda>  s    |1L r   )r   r=   map_structure_up_to)batch_outputsr   s     r   append_to_outputsz2OpenVINOTrainer.predict.<locals>.append_to_outputs  sG    ,,7! N ((!L!	 Nr   r   )r   rX   r    callbacks_moduleCallbackListnum_batchesr   stop_predictingon_predict_beginenumerate_epochon_predict_batch_beginr   on_predict_batch_endon_predict_endr   r   ra   r   )r   r$   r   r   r   r   epoch_iteratorr   r   
begin_stepend_steprF   r   s                r   predictzOpenVINOTrainer.predict   s"   
 '!! $ 8 8
 )%5%B%BC(55 #qL$00I	 	""$$""$*8*H*H*J 	&J$,,Z8 11$7M'w?G**8i5OP##	 	  "''r~~wOOr   c	           	         |	j                  dd      }
|	rt        d|	       |
r| j                  }nt        |||||d| j                        }t        |t        j                        s(t        j                  ||dk7  |d|j                  |       }| j                          d| _
        |j                          i }| j                          |D ]H  \  }}}|j                  |       | j                  |      }|j                  ||       | j                  sH n t!        | j#                  |            }|j%                  |       |r|S | j'                  |      S )N_use_cached_eval_datasetFzArguments not recognized: )r$   r7   r8   r   r   r   rX   r   r   )r   r   r   r   r   )poprn   _eval_epoch_iteratorr   rX   r    r   r   r   rZ   stop_evaluatingon_test_beginreset_metricson_test_batch_beginr   on_test_batch_endr   _get_metrics_result_or_logson_test_end_flatten_metrics_in_order)r   r$   r7   r   r   r8   r   r   return_dictkwargsuse_cached_eval_datasetr   rV   r   r   rF   s                   r   evaluatezOpenVINOTrainer.evaluate$  s_    #)**-G"O9&BCC"!66N*+% %$($<$<N )%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      )Nz7`train_on_batch` is not supported with openvino backendr   )r   r$   r7   r8   r   r   s         r   train_on_batchzOpenVINOTrainer.train_on_batch^  s     "E
 	
r   c                     | j                  d       | j                          | j                          | j                  |||fg      }t	        | j                  |            }|r|S | j                  |      S )Ntest_on_batch)_assert_compile_calledrZ   r   r   r   r   r   )r   r$   r7   r8   r   rV   s         r   r   zOpenVINOTrainer.test_on_batchj  sr     	##O4!!!Aq-#8"9:d>>tDEK--d33r   c                     | j                          | j                  |fg      }t        j                  t        j
                  |      }|S r   )r   r   r   r=   r   r>   )r   r$   r   s      r   predict_on_batchz OpenVINOTrainer.predict_on_batchz  sE    ""$--tf5**$$m
 r   )F)NNNr   autoNg        NTNNr   NNNr   )Nr   NN)NNNr   NNNF)NNNF)NNF)__name__
__module____qualname__r   r%   r3   rJ   rM   rZ   r^   rz   r?   r   r   r   filter_tracebackr   r   r   r   r   __classcell__)r   s   @r   r   r      s    #
O,D'( <,&\-: 
"#
. %%HL3P &3Pj %% 
74 &74x 

 4 r   r   )numpyra   openvinori   openvino.opset16opset16re   	keras.srcr   r   r   r   keras.src.backend.openvino.corer   r   r   keras.src.trainersr	   r:    keras.src.trainers.data_adaptersr
   !keras.src.trainers.epoch_iteratorr   keras.src.utilsr   keras.src.utils.python_utilsr   Trainerr   rT   r   r   <module>r      sC      #  3  ; ? 6 6 ? ; + 7nl** nr   