o
    ?e3                     @   s  d Z ddl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
ZdZejgZeeedg dededd Zeeedg d		d$ddZdd Zd%ddZdd Zdd Z			d&ddZ			d&ddZd$d d!Zd"d# ZdS )'z3FeatureColumn serialization, deserialization logic.    N)feature_column_v2_types)init_ops)deprecation)tf_decorator)
tf_inspect)	tf_export)doc_controlsa      Warning: tf.feature_column is not recommended for new code. Instead,
    feature preprocessing can be done directly using either [Keras preprocessing
    layers](https://www.tensorflow.org/guide/migrate/migrating_feature_columns)
    or through the one-stop utility [`tf.keras.utils.FeatureSpace`](https://www.tensorflow.org/api_docs/python/tf/keras/utils/FeatureSpace)
    built on top of them. See the [migration guide](https://tensorflow.org/guide/migrate)
    for details.
    zUse Keras preprocessing layers instead, either directly or via the `tf.keras.utils.FeatureSpace` utility. Each of `tf.feature_column.*` has a functional equivalent in `tf.keras.layers` for feature preprocessing when training a Keras model.z4__internal__.feature_column.serialize_feature_column)v1c                 C   s<   t | tjr| S t | tjr| jj|  dS td	| )a  Serializes a FeatureColumn or a raw string key.

  This method should only be used to serialize parent FeatureColumns when
  implementing FeatureColumn.get_config(), else serialize_feature_columns()
  is preferable.

  This serialization also keeps information of the FeatureColumn class, so
  deserialization is possible without knowing the class type. For example:

  a = numeric_column('x')
  a.get_config() gives:
  {
      'key': 'price',
      'shape': (1,),
      'default_value': None,
      'dtype': 'float32',
      'normalizer_fn': None
  }
  While serialize_feature_column(a) gives:
  {
      'class_name': 'NumericColumn',
      'config': {
          'key': 'price',
          'shape': (1,),
          'default_value': None,
          'dtype': 'float32',
          'normalizer_fn': None
      }
  }

  Args:
    fc: A FeatureColumn or raw feature key string.

  Returns:
    Keras serialization for FeatureColumns, leaves string keys unaffected.

  Raises:
    ValueError if called with input that is not string or FeatureColumn.
  
class_nameconfigz#Instance: {} is not a FeatureColumn)

isinstancesixstring_typesfc_typesFeatureColumn	__class____name__
get_config
ValueErrorformatfc r   o/home/www/facesmatcher.com/pyenv/lib/python3.10/site-packages/tensorflow/python/feature_column/serialization.pyserialize_feature_column-   s
   -r   z6__internal__.feature_column.deserialize_feature_columnc                 C   sx   t | tjr| S dd tD }|du ri }t| ||dd\}}t|tjs,td	||j
|||d}|t||S )an  Deserializes a `config` generated with `serialize_feature_column`.

  This method should only be used to deserialize parent FeatureColumns when
  implementing FeatureColumn.from_config(), else deserialize_feature_columns()
  is preferable. Returns a FeatureColumn for this config.

  Args:
    config: A Dict with the serialization of feature columns acquired by
      `serialize_feature_column`, or a string representing a raw column.
    custom_objects: A Dict from custom_object name to the associated keras
      serializable objects (FeatureColumns, classes or functions).
    columns_by_name: A Dict[String, FeatureColumn] of existing columns in order
      to avoid duplication.

  Raises:
    ValueError if `config` has invalid format (e.g: expected keys missing,
    or refers to unknown classes).

  Returns:
    A FeatureColumn corresponding to the input `config`.
  c                 S   s   i | ]}|j |qS r   )r   ).0clsr   r   r   
<dictcomp>   s    z.deserialize_feature_column.<locals>.<dictcomp>NZfeature_column_v2module_objectscustom_objectsprintable_module_namez/Expected FeatureColumn class, instead found: {})r!   columns_by_name)r   r   r   _FEATURE_COLUMNS-_class_and_config_for_serialized_keras_object
issubclassr   r   r   r   from_config
setdefault_column_name_with_class_name)r   r!   r#   Zmodule_feature_column_classesr   
cls_configZnew_instancer   r   r   deserialize_feature_columnb   s2   
r+   c                 C   s   dd | D S )a  Serializes a list of FeatureColumns.

  Returns a list of Keras-style config dicts that represent the input
  FeatureColumns and can be used with `deserialize_feature_columns` for
  reconstructing the original columns.

  Args:
    feature_columns: A list of FeatureColumns.

  Returns:
    Keras serialization for the list of FeatureColumns.

  Raises:
    ValueError if called with input that is not a list of FeatureColumns.
  c                 S   s   g | ]}t |qS r   )r   )r   r   r   r   r   
<listcomp>   s    z-serialize_feature_columns.<locals>.<listcomp>r   )Zfeature_columnsr   r   r   serialize_feature_columns   s   r-   c                    s   i   fdd| D S )aI  Deserializes a list of FeatureColumns configs.

  Returns a list of FeatureColumns given a list of config dicts acquired by
  `serialize_feature_columns`.

  Args:
    configs: A list of Dicts with the serialization of feature columns acquired
      by `serialize_feature_columns`.
    custom_objects: A Dict from custom_object name to the associated keras
      serializable objects (FeatureColumns, classes or functions).

  Returns:
    FeatureColumn objects corresponding to the input configs.

  Raises:
    ValueError if called with input that is not a list of FeatureColumns.
  c                    s   g | ]}t | qS r   )r+   )r   cr#   r!   r   r   r,      s    
z/deserialize_feature_columns.<locals>.<listcomp>r   )Zconfigsr!   r   r/   r   deserialize_feature_columns   s   r0   c                 C   s   | j jd | j S )a  Returns a unique name for the feature column used during deduping.

  Without this two FeatureColumns that have the same name and where
  one wraps the other, such as an IndicatorColumn wrapping a
  SequenceCategoricalColumn, will fail to deserialize because they will have the
  same name in columns_by_name, causing the wrong column to be returned.

  Args:
    fc: A FeatureColumn.

  Returns:
    A unique name as a string.
  :)r   r   namer   r   r   r   r)      s   r)   c              	   C   s   t | \}} | du rdS t| drZ| jj}|  }i }| D ]4\}}t|tj	r/|||< q zt
|}t|trBt|tsBd|d< |||< W q  tyT   |||< Y q w ||dS t| drb| jS td| )z?Serialize a Keras object into a JSON-compatible representation.Nr   T__passive_serialization__r
   r   zCannot serialize)r   unwraphasattrr   r   r   itemsr   r   r   _serialize_keras_objectdictr   )instance_r2   r   Zserialization_configkeyitemZserialized_itemr   r   r   r7      s.   



r7   objectc           
      C   s  | du rdS t | trG| }t||||\}}t|dr<t|j}|p$i }d|jv r7|j|tt|	 dS ||S |p?i }|di |S t | t
jrx| }|r[||v r[||}	n||}	|	du rntd| d | t|	rv|	 S |	S t| r| S td|| f )	zGTurns the serialized form of a Keras object back into an actual object.Nr'   r!   )r!   Unknown : z%Could not interpret serialized %s: %sr   )r   r8   r%   r5   r   getfullargspecr'   argslistr6   r   r   getr   isclass
isfunction)

identifierr    r!   r"   r   r   r*   Zarg_specZobject_nameobjr   r   r   _deserialize_keras_object   sD   






rH   c           
      C   s   t | trd| vsd| vrtdt|  | d }t|||d}|du r.td| d | | d }i }| D ]-\}}	t |	trPd|	v rPt|	||d	d
||< q8t |	tjret	
t|	|ret|	|||< q8| D ]
\}}	|| ||< qj||fS )z@Returns the class name and config for a serialized keras object.r   r   zImproper config format: )r!   r    Nr>   r?   r3   Zconfig_itemr   )r   r8   r   str_get_registered_objectr6   rH   r   r   r   rE   )
r   r    r!   r"   r   r   r*   Zdeserialized_objectsr;   r<   r   r   r   r%   +  s8   
r%   c                 C   s,   |r
| |v r
||  S |r| |v r||  S d S Nr   )r2   r!   r    r   r   r   rJ   V  s
   rJ   c                 C   s   t |  | S )z;Decorator that registers a FeatureColumn for serialization.)r$   appendr   r   r   r   register_feature_column^  s   
rM   )NNrK   )NNr=   )__doc__r   Z tensorflow.python.feature_columnr   r   Ztensorflow.python.opsr   Ztensorflow.python.utilr   r   r   Z tensorflow.python.util.tf_exportr   Ztensorflow.tools.docsr   Z#_FEATURE_COLUMN_DEPRECATION_WARNINGZ+_FEATURE_COLUMN_DEPRECATION_RUNTIME_WARNINGZTruncatedNormalr$   header
deprecatedr   r+   r-   r0   r)   r7   rH   r%   rJ   rM   r   r   r   r   <module>   sN   

0
9
 
4

+