o
    2h#                     @   s   d dl Zd dlZd dlm  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dS )    N)backend)	callbacks)tree)OPENVINO_DTYPES)OpenVINOKerasTensor)
get_device)trainer)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
dZdd Zdd Z	d$ddZ
																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 )*OpenVINOTrainerc                    s2   t    d | _d | _d | _d | _d | _d | _d S N)super__init__test_functionpredict_functionov_compiled_model	ov_devicestruct_paramsstruct_outputsself	__class__ ]/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/backend/openvino/trainer.pyr      s   

zOpenVINOTrainer.__init__c                 C   s&   t |ttfrt|dkr|d S |S )N   r   )
isinstancelisttuplelen)r   xr   r   r   _unpack_singleton   s   z!OpenVINOTrainer._unpack_singletonc                 C      t d)Nz2`test_step` is not supported with openvino backendNotImplementedError)r   datar   r   r   	test_step    s   zOpenVINOTrainer.test_stepc                 C   sH   t |\}}}| |}t|}||}| t| j| }|S r   )	r	   unpack_x_y_sample_weight_get_compiled_modelr   flattenr"   pack_sequence_asr   to_tuple)r   r&   r!   _r   	flatten_xy_predr   r   r   predict_step%   s   

zOpenVINOTrainer.predict_stepFc                    J   j d ur
|s
j S fdd  fdd}jdkr|}n }|_ d S )Nc                       | d }   | S Nr   )r'   r&   r   r   r   one_test_step4      
z9OpenVINOTrainer.make_test_function.<locals>.one_test_stepc                    s   | D ]} |g}q|S r   r   )r&   single_step_datalogs)r5   r   r   multi_test_steps8   s   z<OpenVINOTrainer.make_test_function.<locals>.multi_test_stepsr   )r   steps_per_execution)r   forcer9   r'   r   )r5   r   r   make_test_function0   s   

z"OpenVINOTrainer.make_test_functionc           	      C   s$  t |ttfrg }|D ]}| |}|| q|S t |tr6t }| D ]\}}| |}|||< q&|S t |tjsAt	|r]t
t|j }t|j}tj||d}t|d}|S t |trttjg tjjd}t|d}|S t |trtjg tjjd}t|d}|S dt|)N)shapedtyper   zUnknown type of input data {})r   r   r   _parameterize_dataappenddictitemsnpndarrayisscalarr   strr>   r=   ov_opset	parameterr   outputintovTypei32floatf32formattype)	r   r&   parametrize_dataelem
param_elem	elem_nameov_typeov_shapeparamr   r   r   r?   D   s6   




	

z"OpenVINOTrainer._parameterize_datac                 C   s   | j d urt | jkr| j S | ` | || _| | j| _g }t| jD ]
}||j	
  q$g }t| jD ]}|t|j	 q7tj||d}t|t | _ t | _| j S )N)results
parameters)r   r   r   r?   r   r   r   r*   r@   rI   get_noderG   resultrK   Modelcompile_model)r   r&   rZ   prY   rov_modelr   r   r   r)   ^   s    
z#OpenVINOTrainer._get_compiled_modelc                    r1   )Nc                    r2   r3   )r0   r4   r   r   r   one_predict_step~   r6   z?OpenVINOTrainer.make_predict_function.<locals>.one_predict_stepc                    sB    | d d }| dd  D ]} |g}t dd ||}q|S )Nr   c                 S   s   t | |gS r   )rC   concatenate)t1t2r   r   r   <lambda>   s    zTOpenVINOTrainer.make_predict_function.<locals>.multi_predict_steps.<locals>.<lambda>)r   map_structure)r&   outputsr7   step_outputs)rb   r   r   multi_predict_steps   s   
zBOpenVINOTrainer.make_predict_function.<locals>.multi_predict_stepsr   )r   r:   )r   r;   rj   r0   r   )rb   r   r   make_predict_functionz   s   

z%OpenVINOTrainer.make_predict_functionNr   auto        Tr   c                 C   r#   )Nz,`fit` is not supported with openvino backendr$   )r   r!   y
batch_sizeepochsverboser   validation_splitvalidation_datashuffleclass_weightsample_weightinitial_epochsteps_per_epochvalidation_stepsvalidation_batch_sizevalidation_freqr   r   r   fit   s   zOpenVINOTrainer.fitc              	   C   s   t |||d| jd}t|tjstj|d|dk|d|j| d}dd }|   d| _|  d }|	 D ]!\}	}
}|
|	 | |}|||}||
d	|i | jrU nq4|  t|tj|S )
NF)r!   ro   rx   rt   r:   Tr   r   )add_historyadd_progbarrq   rp   stepsmodelc                 S   s4   |d u rt dd | }|S t | dd ||  |S )Nc                 S   s   | gS r   r   )batch_outputr   r   r   rf      s    zDOpenVINOTrainer.predict.<locals>.append_to_outputs.<locals>.<lambda>c                 S   s
   |  |S r   )r@   )rI   r   r   r   r   rf      s   
 )r   rg   map_structure_up_to)batch_outputsrh   r   r   r   append_to_outputs   s   z2OpenVINOTrainer.predict.<locals>.append_to_outputsrh   )r
   r:   r   callbacks_moduleCallbackListnum_batchesrk   stop_predictingon_predict_beginenumerate_epochon_predict_batch_beginr   on_predict_batch_endon_predict_endr   r   rC   rc   )r   r!   ro   rq   r   r   epoch_iteratorr   rh   
begin_stepend_stepr&   r   r   r   r   predict   s@   	



zOpenVINOTrainer.predictc	           
      K   r#   )Nz1`evaluate` is not supported with openvino backendr$   )
r   r!   rn   ro   rq   rv   r   r   return_dictkwargsr   r   r   evaluate   s   zOpenVINOTrainer.evaluatec                 C   r#   )Nz7`train_on_batch` is not supported with openvino backendr$   )r   r!   rn   rv   ru   r   r   r   r   train_on_batch   s   zOpenVINOTrainer.train_on_batchc                 C   r#   )Nz6`test_on_batch` is not supported with openvino backendr$   )r   r!   rn   rv   r   r   r   r   test_on_batch   s   zOpenVINOTrainer.test_on_batchc                 C   s(   |    | |fg}ttj|}|S r   )rk   r   r   rg   r   convert_to_numpy)r   r!   r   r   r   r   predict_on_batch
  s   z OpenVINOTrainer.predict_on_batch)F)NNNr   rl   Nrm   NTNNr   NNNr   )Nrl   NN)NNNrl   NNNF)NNNF)NNF)__name__
__module____qualname__r   r"   r'   r0   r<   r?   r)   rk   r|   r   filter_tracebackr   r   r   r   r   __classcell__r   r   r   r   r      sb    	


5

r   )numpyrC   openvinorK   openvino.runtime.opset14runtimeopset14rG   	keras.srcr   r   r   r   keras.src.backend.openvino.corer   r   r   keras.src.trainersr   base_trainer keras.src.trainers.data_adaptersr	   !keras.src.trainers.epoch_iteratorr
   keras.src.utilsr   Trainerr   r   r   r   r   <module>   s    