o
    ©i et  ã                   @   sF   d Z ddlmZ ddlmZ ddlmZ edƒG dd„ dejƒƒZdS )	zBase class for RNN cells.é    )Ú
base_layer)Ú	rnn_utils)Úkeras_exportzkeras.layers.AbstractRNNCellc                   @   s:   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZdd	d
„ZdS )ÚAbstractRNNCellaR  Abstract object representing an RNN cell.

    See [the Keras RNN API guide](https://www.tensorflow.org/guide/keras/rnn)
    for details about the usage of RNN API.

    This is the base class for implementing RNN cells with custom behavior.

    Every `RNNCell` must have the properties below and implement `call` with
    the signature `(output, next_state) = call(input, state)`.

    Examples:

    ```python
      class MinimalRNNCell(AbstractRNNCell):

        def __init__(self, units, **kwargs):
          self.units = units
          super(MinimalRNNCell, self).__init__(**kwargs)

        @property
        def state_size(self):
          return self.units

        def build(self, input_shape):
          self.kernel = self.add_weight(shape=(input_shape[-1], self.units),
                                        initializer='uniform',
                                        name='kernel')
          self.recurrent_kernel = self.add_weight(
              shape=(self.units, self.units),
              initializer='uniform',
              name='recurrent_kernel')
          self.built = True

        def call(self, inputs, states):
          prev_output = states[0]
          h = backend.dot(inputs, self.kernel)
          output = h + backend.dot(prev_output, self.recurrent_kernel)
          return output, output
    ```

    This definition of cell differs from the definition used in the literature.
    In the literature, 'cell' refers to an object with a single scalar output.
    This definition refers to a horizontal array of such units.

    An RNN cell, in the most abstract setting, is anything that has
    a state and performs some operation that takes a matrix of inputs.
    This operation results in an output matrix with `self.output_size` columns.
    If `self.state_size` is an integer, this operation also results in a new
    state matrix with `self.state_size` columns.  If `self.state_size` is a
    (possibly nested tuple of) TensorShape object(s), then it should return a
    matching structure of Tensors having shape `[batch_size].concatenate(s)`
    for each `s` in `self.batch_size`.
    c                 C   ó   t ‚)a«  The function that contains the logic for one RNN step calculation.

        Args:
          inputs: the input tensor, which is a slide from the overall RNN input
            by the time dimension (usually the second dimension).
          states: the state tensor from previous step, which has the same shape
            as `(batch, state_size)`. In the case of timestep 0, it will be the
            initial state user specified, or zero filled tensor otherwise.

        Returns:
          A tuple of two tensors:
            1. output tensor for the current timestep, with size `output_size`.
            2. state tensor for next step, which has the shape of `state_size`.
        ©ÚNotImplementedError)ÚselfÚinputsÚstates© r   úU/var/www/myenv/lib/python3.10/site-packages/keras/src/layers/rnn/abstract_rnn_cell.pyÚcallQ   s   zAbstractRNNCell.callc                 C   r   )z›size(s) of state(s) used by this cell.

        It can be represented by an Integer, a TensorShape or a tuple of
        Integers or TensorShapes.
        r   ©r	   r   r   r   Ú
state_sizeb   s   zAbstractRNNCell.state_sizec                 C   r   )z>Integer or TensorShape: size of outputs produced by this cell.r   r   r   r   r   Úoutput_sizek   s   zAbstractRNNCell.output_sizeNc                 C   s   t  | |||¡S )N)r   Ú#generate_zero_filled_state_for_cell)r	   r
   Ú
batch_sizeÚdtyper   r   r   Úget_initial_statep   s   ÿz!AbstractRNNCell.get_initial_state)NNN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr   r   r   r   r   r   r   r      s    6

r   N)	r   Úkeras.src.enginer   Úkeras.src.layers.rnnr   Ú tensorflow.python.util.tf_exportr   ÚLayerr   r   r   r   r   Ú<module>   s   