o
    i e?                     @   s   d Z ddlmZ ddlmZ ddlmZ ddlm  mZ ddl	m
Z ddl	mZ ddlmZ dd	lmZ ed
g dG dd dejZG dd dejjjZejdd ZdS )zHA layer that produces a dense `Tensor` based on given `feature_columns`.    )absolute_import)division)print_functionN)base_feature_layer)dense_features)tf_contextlib)keras_exportzkeras.layers.DenseFeatures)v1c                       s.   e Zd ZdZd fdd	Z fddZ  ZS )	DenseFeaturesa0  A layer that produces a dense `Tensor` based on given `feature_columns`.

    Generally a single example in training data is described with
    FeatureColumns.  At the first layer of the model, this column oriented data
    should be converted to a single `Tensor`.

    This layer can be called multiple times with different features.

    This is the V2 version of this layer that uses name_scopes to create
    variables instead of variable_scopes. But this approach currently lacks
    support for partitioned variables. In that case, use the V1 version instead.

    Example:

    ```python
    price = tf.feature_column.numeric_column('price')
    keywords_embedded = tf.feature_column.embedding_column(
        tf.feature_column.categorical_column_with_hash_bucket("keywords",
                                                              10000),
        dimensions=16)
    columns = [price, keywords_embedded, ...]
    feature_layer = tf.keras.layers.DenseFeatures(columns)

    features = tf.io.parse_example(
        ..., features=tf.feature_column.make_parse_example_spec(columns))
    dense_tensor = feature_layer(features)
    for units in [128, 64, 32]:
      dense_tensor = tf.keras.layers.Dense(units, activation='relu')(
        dense_tensor)
    prediction = tf.keras.layers.Dense(1)(dense_tensor)
    ```
    TNc                    s,   t  jd|||d| t| | j| _dS )a&  Creates a DenseFeatures object.

        Args:
          feature_columns: An iterable containing the FeatureColumns to use as
            inputs to your model. All items should be instances of classes
            derived from `DenseColumn` such as `numeric_column`,
            `embedding_column`, `bucketized_column`, `indicator_column`. If you
            have categorical features, you can wrap them with an
            `embedding_column` or `indicator_column`.
          trainable:  Boolean, whether the layer's variables will be updated via
            gradient descent during training.
          name: Name to give to the DenseFeatures.
          **kwargs: Keyword arguments to construct a layer.

        Raises:
          ValueError: if an item in `feature_columns` is not a `DenseColumn`.
        )feature_columns	trainablenameN )super__init___StateManagerImplV2r   _state_manager)selfr   r   r   kwargs	__class__r   Y/var/www/myenv/lib/python3.10/site-packages/keras/src/feature_column/dense_features_v2.pyr   B   s   zDenseFeatures.__init__c              	      sZ   | j D ]}t|j || j W d    n1 sw   Y  qttj| 	d  d S )N)
_feature_columnstf
name_scoper   create_stater   r   kfc_BaseFeaturesLayerbuild)r   _columnr   r   r   r   \   s   
zDenseFeatures.build)TN)__name__
__module____qualname____doc__r   r   __classcell__r   r   r   r   r
      s    !r
   c                   @   s"   e Zd ZdZ				dddZdS )r   z#Manages the state of DenseFeatures.NTc           	   	   C   s   || j | v rtdt| j | jj||||| jo||d}W d    n1 s*w   Y  t|tjj	j
rC| j||jd |  || j | |< |S )NzVariable already exists.)r   shapedtypeinitializerr   use_resource/)_cols_to_vars_map
ValueError#no_manual_dependency_tracking_scope_layer
add_weight
_trainable
isinstancer   __internal__tracking	Trackable_track_trackabler   )	r   feature_columnr   r&   r'   r   r)   r(   varr   r   r   create_variableh   s    
	z#_StateManagerImplV2.create_variable)NTTN)r!   r"   r#   r$   r8   r   r   r   r   r   e   s    r   c                 c   s0    t | dd}d| _z	dV  W || _dS || _w )a  A context that disables manual dependency tracking for the given `obj`.

    Sometimes library methods might track objects on their own and we might want
    to disable that and do the tracking on our own. One can then use this
    context manager to disable the tracking the library method does and do your
    own tracking.

    For example:

    class TestLayer(tf.keras.Layer):
      def build():
        with no_manual_dependency_tracking_scope(self):
          var = self.add_weight("name1")  # Creates a var and doesn't track it
        # We track variable with name `name2`
        self._track_trackable("name2", var)

    Args:
      obj: A trackable object.

    Yields:
      a scope in which the object doesn't track dependencies manually.
    _manual_trackingTFN)getattrr9   )objprevious_valuer   r   r   r-      s   r-   )r$   
__future__r   r   r   tensorflow.compat.v2compatv2r   keras.src.feature_columnr   r   r   keras.src.utilsr    tensorflow.python.util.tf_exportr   r
   r2   r6   StateManagerr   contextmanagerr-   r   r   r   r   <module>   s   
E!