a
    +=ic                     @   sR   d Z ddlZddlZddlm  mZ ddl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ironmanZbatmanZhulkZ	spidermanZkingkongZwonder_womanyesnoc           
      C   s   |r8t 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nameZraggedfeatures)r   labelr   r   r   )r   StringLookupZadaptFEATURE_VOCABLABEL_VOCABkeraslayersInputtfstringModel)
selfZ	use_adaptZfeature_lookup_layerZlabel_lookup_layerZraw_feature_inputZfeature_id_inputfeature_mapperZraw_label_inputZlabel_id_inputlabel_mapper r!   k/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/keras/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 d S )Nr   r   r   r   r   r   )randomsampler   r$   )r   r!   r"   feature_and_label_gena   s    z@DistributeKplTestUtils.dataset_fn.<locals>.feature_and_label_genr   r   r$   )Zoutput_signatured       c                    s   d | d i| d fS )Nr   r   r!   )x)r   r    r!   r"   <lambda>u   s    
z3DistributeKplTestUtils.dataset_fn.<locals>.<lambda>)	r   dataZDatasetZfrom_generator
TensorSpecr   shufflebatchmap)r   r   r    r'   Zraw_datasetZtrain_datasetr!   )r   r    r   r"   
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         )Z	input_dimZ
output_dimr   ZaxisZsigmoid)ZunitsZ
activationr   )r   r   r   r   int64Z	Embeddinglenr   Zreduce_meanZDenser   )r   r2   Z
emb_outputZdense_outputmodelr!   r!   r"   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!   r"   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   r5   g      ?)r   Zexpand_dimsr   ZsqueezecastZgreaterr6   r;   )Zraw_featuresZtransformed_featuresoutputsZdecoded_outputsr8   r!   r"   serve_fn   s    

zADistributeKplTestUtils.create_serving_signature.<locals>.serve_fnr   Zexampler   )r   functionr   r;   Zget_concrete_functionr-   r   )r   r8   r   r;   r@   r!   r?   r"   create_serving_signature   s    	z/DistributeKplTestUtils.create_serving_signaturec           	      C   s   |  |||}tj|  d}|j|dd|id t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   Zserving_default)Zsave_format
signatures)r   r   r   Zoutput_0zUTF-8)r   r   )r   r   unknownN)rB   tempfilemkdtempZget_temp_dirsaver   ZsavingZ
load_modelrD   r   ZconstantZassertInnumpydecode)	r   r8   r   r;   Z
serving_fnZsaved_model_dirZloaded_serving_fnZprediction0Zprediction1r!   r!   r"   test_save_load_serving_model   s4    z3DistributeKplTestUtils.test_save_load_serving_modelN)__name__
__module____qualname____doc__r   r   r#   r1   r9   r<   rB   rK   r!   r!   r!   r"   r      s   	,(r   )rO   r%   rF   Ztensorflow.compat.v2compatv2r   r   Zkeras.layers.preprocessingr   testZTestCaser   r!   r!   r!   r"   <module>   s   