
    2Vhm#                         d dl Zd dlZd dlmc 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j4                        Zy)    N)backend)	callbacks)tree)OPENVINO_DTYPES)OpenVINOKerasTensor)
get_device)trainer)data_adapter_utils)EpochIterator)traceback_utilsc                        e Zd Z fdZd Zd Zd Zd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    R/home/dcms/DCMS/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                     t        d      )Nz2`test_step` is not supported with openvino backendNotImplementedError)r   datas     r   	test_stepzOpenVINOTrainer.test_step    s    !@
 	
r   c                    t        j                  |      \  }}}| j                  |      }t        j                  |      } ||      }| j                  t        j                  | j                  |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_preds          r   predict_stepzOpenVINOTrainer.predict_step%   st    $==dC1a 44Q7LLO	"9-''!!$"5"5v7HI
 r   c                       j                   |s j                   S  fdfd} j                  dkD  r
|}| _         y }| _         y )Nc                 0    | d   } j                  |       S Nr   )r)   r(   r   s    r   one_test_stepz9OpenVINOTrainer.make_test_function.<locals>.one_test_step4   s    7D>>$''r   c                 (    | D ]  } |g      } S r    )r(   single_step_datalogsr8   s      r   multi_test_stepsz<OpenVINOTrainer.make_test_function.<locals>.multi_test_steps8   s&    $( 9 $&6%789Kr   r   )r   steps_per_execution)r   forcer=   r)   r8   s   `   @r   make_test_functionz"OpenVINOTrainer.make_test_function0   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        j                        st        j                  |      rdt        t        |j                           }t        |j                        }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(                  j.                        }t!        |j#                  d            }|S dj1                  t3        |            )N)shapedtyper   zUnknown type of input data {})r   r    r!   _parameterize_dataappenddictitemsnpndarrayisscalarr   strrC   rB   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params	            r   rD   z"OpenVINOTrainer._parameterize_dataD   s   dT5M*! 4!44T:
 ''
34*  % d##v#'::< 9	4!44T:
.8 +9    bjj)R[[->%c$**o6GDJJ'H&&XWEE25<<?C   c"&&Rrww{{CE25<<?C   e$&&Rrww{{CE25<<?C   288dDDr   c                    | j                   #t               | j                  k(  r| j                   S | ` | j                  |      | _         | | j                        | _        g }t        j                  | j                        D ]+  }|j                  |j                  j                                - g }t        j                  | j
                        D ]0  }|j                  t        j                  |j                               2 t        j                  ||      }t        j                  |t                     | _         t               | _        | j                   S )N)results
parameters)r   r   r   rD   r   r   r   r-   rE   rN   get_noderL   resultrP   Modelcompile_model)r   r(   r`   pr_   rov_models          r   r,   z#OpenVINOTrainer._get_compiled_model^   s   ""..))) " "44T:"4#5#56
d001 	3Aahh//12	3d112 	6ANN8??18845	6 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 r6   )r3   r7   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   )rH   concatenate)t1t2s     r   <lambda>zTOpenVINOTrainer.make_predict_function.<locals>.multi_predict_steps.<locals>.<lambda>   s    2>>2r(#; r   )r   map_structure)r(   outputsr;   step_outputsrj   s       r   multi_predict_stepszBOpenVINOTrainer.make_predict_function.<locals>.multi_predict_steps   sW    &tBQx0G$(H  /1A0BC,,;  Nr   r   )r   r>   )r   r?   rt   r3   rj   s   `   @r   make_predict_functionz%OpenVINOTrainer.make_predict_functionz   sU      ,U(((	+
	 ##a'.L !- ,L ,r   c                     t        d      )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_freqs                    r   fitzOpenVINOTrainer.fit   s    & ":
 	
r   c           	      H   t        |||d| j                        }t        |t        j                        s)t        j                  |d|dk7  |d|j
                  |       }d }| j                          d| _        |j                          d }|j                         D ]R  \  }	}
|j                  |	       | j                  |
      } |||      }|j                  |	d|i       | j                  sR n |j                          t        j                  t         j"                  |      S )	NF)r#   rx   r   r}   r>   Tr   r   )add_historyadd_progbarrz   ry   stepsmodelc                 n    |t        j                  d |       }|S t        j                  | d ||        |S )Nc                     | gS r   r:   )batch_outputs    r   rp   zDOpenVINOTrainer.predict.<locals>.append_to_outputs.<locals>.<lambda>   s    , r   c                 $    | j                  |      S r   )rE   )rN   r   s     r   rp   zDOpenVINOTrainer.predict.<locals>.append_to_outputs.<locals>.<lambda>   s    |1L r   )r   rq   map_structure_up_to)batch_outputsrr   s     r   append_to_outputsz2OpenVINOTrainer.predict.<locals>.append_to_outputs   sG    ,,7! N ((!L!	 Nr   rr   )r   r>   r   callbacks_moduleCallbackListnum_batchesru   stop_predictingon_predict_beginenumerate_epochon_predict_batch_beginr   on_predict_batch_endon_predict_endr   r   rH   rm   )r   r#   rx   rz   r   r   epoch_iteratorr   rr   stepr(   r   s               r   predictzOpenVINOTrainer.predict   s   
 '!! $ 8 8
 )%5%B%BC(55 #qL$00I	 	""$$""$(88: 	JD$,,T2 11$7M'w?G**4)]1KL##	 	  "''r~~wOOr   c	                     t        d      )Nz1`evaluate` is not supported with openvino backendr&   )
r   r#   rw   rx   rz   r   r   r   return_dictkwargss
             r   evaluatezOpenVINOTrainer.evaluate   s     "?
 	
r   c                     t        d      )Nz7`train_on_batch` is not supported with openvino backendr&   )r   r#   rw   r   r~   r   s         r   train_on_batchzOpenVINOTrainer.train_on_batch   s     "E
 	
r   c                     t        d      )Nz6`test_on_batch` is not supported with openvino backendr&   )r   r#   rw   r   r   s        r   test_on_batchzOpenVINOTrainer.test_on_batch   s     "D
 	
r   c                     | j                          | j                  |fg      }t        j                  t        j
                  |      }|S r   )ru   r   r   rq   r   convert_to_numpy)r   r#   r   s      r   predict_on_batchz OpenVINOTrainer.predict_on_batch
  sE    ""$--tf5**$$m
 r   )F)NNNr   autoNg        NTNNr   NNNr   )Nr   NN)NNNr   NNNF)NNNF)NNF)__name__
__module____qualname__r   r$   r)   r3   r@   rD   r,   ru   r   r   filter_tracebackr   r   r   r   r   __classcell__)r   s   @r   r   r      s    #


	'( 4&8-: 
"#
. %%HL3P &3Pj %% 

 &
& 

 	
r   r   )numpyrH   openvinorP   openvino.runtime.opset14runtimeopset14rL   	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   <module>r      sC      + +  3  ; ? 6 6 ? ; +l** r   