B
    d                 @   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               @   sZ   e Zd ZdZdddddddg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   L/var/www/html/venv/lib/python3.7/site-packages/keras/utils/kpl_test_utils.pydefine_kpls_for_training(   s(    
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>   x8t  jd}  jd | kr$dgndg}| |dV  qW d S )Nr   r   r   r   )r   r   )randomsampler   )r   r   )r   r   r    feature_and_label_gena   s    z@DistributeKplTestUtils.dataset_fn.<locals>.feature_and_label_genr   r   )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_input)r   r   r         )Z	input_dimZ
output_dimr   )axisZsigmoid)ZunitsZ
activationr   )r   r   r   r   int64Z	Embeddinglenr   Zreduce_meanZDenser   )r   r/   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   )r2   g      ?)r   Zexpand_dimsr   ZsqueezecastZgreaterr3   r8   )Zraw_featuresZtransformed_featuresoutputsZdecoded_outputs)r5   r   r    serve_fn   s    

zADistributeKplTestUtils.create_serving_signature.<locals>.serve_fnr   Zexample)r   r   r   )r   functionr   r8   Zget_concrete_functionr*   r   )r   r5   r   r8   r<   r   )r5   r    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
dddgd }| | dd	 |t
ddd
gd }| | dd	 dS )zTest save/load/serving model.)dirr   Zserving_default)Zsave_format
signaturesr   r   Zoutput_0zUTF-8)r   r   unknownN)r>   tempfilemkdtempZget_temp_dirsaver   ZsavinglegacyZ
load_modelr@   r   ZconstantZassertInnumpydecode)	r   r5   r   r8   Z
serving_fnZsaved_model_dirZloaded_serving_fnZprediction0Zprediction1r   r   r    test_save_load_serving_model   s$    

z3DistributeKplTestUtils.test_save_load_serving_modelN)__name__
__module____qualname____doc__r   r   r!   r.   r6   r9   r>   rH   r   r   r   r    r      s   ,(r   )rL   r"   rB   Ztensorflow.compat.v2compatZv2r   r   Zkeras.layers.preprocessingr   testZTestCaser   r   r   r   r    <module>   s   