o
    i e                     @   sV   d Z ddlZddlZddlm  mZ ddlmZ	 ddl
mZ G dd dejjZdS )z/Test related utilities for KPL + tf.distribute.    N)string_lookupc                   @   sP   e Zd ZdZg dZddgZdd Zdd Zd	d
 Zdd Z	dd Z
dd ZdS )DistributeKplTestUtilsz&Utils for test of tf.distribute + KPL.)avengerironmanbatmanhulk	spidermankingkongwonder_womanyesnoc           
      C   s   |rt jdd}|| j t jddd}|| j nt j| jdd}t j| jddd}tjjdtj	d	d
d}||}t
d|i|}tjjdtj	dd}||}t
d|i|}	||	fS )a  Function that defines KPL used for unit tests of tf.distribute.

        Args:
          use_adapt: if adapt will be called. False means there will be
            precomputed statistics.

        Returns:
          feature_mapper: a simple keras model with one keras StringLookup layer
          which maps feature to index.
          label_mapper: similar to feature_mapper, but maps label to index.

           )num_oov_indicesr   N)r   
mask_token)
vocabularyr   )r   r   r      featureT)shapedtypenameraggedfeatures)r   labelr   r   r   )r   StringLookupadaptFEATURE_VOCABLABEL_VOCABkeraslayersInputtfstringModel)
self	use_adaptfeature_lookup_layerlabel_lookup_layerraw_feature_inputfeature_id_inputfeature_mapperraw_label_inputlabel_id_inputlabel_mapper r/   M/var/www/myenv/lib/python3.10/site-packages/keras/src/utils/kpl_test_utils.pydefine_kpls_for_training(   s4   
z/DistributeKplTestUtils.define_kpls_for_trainingc                    s`   fdd}t jjj|t dgt jt dgt jdddd}| fd	d
}|S )an  Function that generates dataset for test of tf.distribute + KPL.

        Args:
          feature_mapper: a simple keras model with one keras StringLookup layer
            which maps feature to index.
          label_mapper: similar to feature_mapper, but maps label to index.

        Returns:
          Generated dataset for test of tf.distribute + KPL.

        c                  3   s:    	 t  jd}  jd | v rdgndg}| |dV  q)NTr   r   r   r   r   r   )randomsampler   r2   )r%   r/   r0   feature_and_label_gena   s   z@DistributeKplTestUtils.dataset_fn.<locals>.feature_and_label_genr   r   r2   )output_signatured       c                    s   d | d i| d fS )Nr   r   r/   )x)r+   r.   r/   r0   <lambda>u   s   
z3DistributeKplTestUtils.dataset_fn.<locals>.<lambda>)	r"   dataDatasetfrom_generator
TensorSpecr#   shufflebatchmap)r%   r+   r.   r5   raw_datasettrain_datasetr/   )r+   r.   r%   r0   
dataset_fnT   s   z!DistributeKplTestUtils.dataset_fnc                 C   sh   t jjdtjdd}t jjt| jd dd|}tj|dd}t jj	dd	d
|}t 
d|i|}|S )z/A simple model for test of tf.distribute + KPL.r   model_inputr         )	input_dim
output_dimr   axissigmoid)units
activationr   )r   r    r!   r"   int64	Embeddinglenr   reduce_meanDenser$   )r%   rE   
emb_outputdense_outputmodelr/   r/   r0   define_model|   s   z#DistributeKplTestUtils.define_modelc                 C   s   t jdd| jdd}|S )z/Create string reverse lookup layer for serving.r   NT)r   r   r   invert)r   r   r   )r%   label_inverse_lookup_layerr/   r/   r0   define_reverse_lookup_layer   s   z2DistributeKplTestUtils.define_reverse_lookup_layerc                    s6   t j fdd}| _| _|t jdt jddS )z-Create serving signature for the given model.c                    s\   t j| dd}  | } |}t j|dd}t t |dt j} |}t j|ddS )Nr   rJ   g      ?)r"   expand_dimsr+   squeezecastgreaterrO   rY   )raw_featurestransformed_featuresoutputsdecoded_outputsrV   r/   r0   serve_fn   s   

zADistributeKplTestUtils.create_serving_signature.<locals>.serve_fnr   exampler   )r"   functionr+   rY   get_concrete_functionr>   r#   )r%   rV   r+   rY   rd   r/   rc   r0   create_serving_signature   s   	z/DistributeKplTestUtils.create_serving_signaturec           	      C   s   |  |||}tj|  d}|j|dd|id tjjj|j	d }|t
g dd }| | dd |t
g d	d }| | dd d
S )zTest save/load/serving model.)dirr"   serving_default)save_format
signatures)r   r   r   output_0zUTF-8)r   r   )r   r   unknownN)rh   tempfilemkdtempget_temp_dirsaver   savinglegacy
load_modelrl   r"   constantassertInnumpydecode)	r%   rV   r+   rY   
serving_fnsaved_model_dirloaded_serving_fnprediction0prediction1r/   r/   r0   test_save_load_serving_model   s4   
z3DistributeKplTestUtils.test_save_load_serving_modelN)__name__
__module____qualname____doc__r   r   r1   rD   rW   rZ   rh   r   r/   r/   r/   r0   r      s    	,(r   )r   r3   ro   tensorflow.compat.v2compatv2r"   	keras.srcsrcr   keras.src.layers.preprocessingr   testTestCaser   r/   r/   r/   r0   <module>   s   