o
    bi5                     @   sX   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 edG dd deZ	d	S )
    )ops)tree)keras_export)Layer)serialization_libzkeras.layers.StackedRNNCellsc                       sn   e Zd ZdZ fddZedd Zedd Zdd	d
ZdddZ	dd Z
 fddZedddZ  ZS )StackedRNNCellsa>  Wrapper allowing a stack of RNN cells to behave as a single cell.

    Used to implement efficient stacked RNNs.

    Args:
      cells: List of RNN cell instances.

    Example:

    ```python
    batch_size = 3
    sentence_length = 5
    num_features = 2
    new_shape = (batch_size, sentence_length, num_features)
    x = np.reshape(np.arange(30), new_shape)

    rnn_cells = [keras.layers.LSTMCell(128) for _ in range(2)]
    stacked_lstm = keras.layers.StackedRNNCells(rnn_cells)
    lstm_layer = keras.layers.RNN(stacked_lstm)

    result = lstm_layer(x)
    ```
    c                    sZ   t  jdi | |D ]}dt|vrtd| dt|vr'td| q|| _d S )NcallzLAll cells must have a `call` method. Received cell without a `call` method: 
state_sizezTAll cells must have a `state_size` attribute. Received cell without a `state_size`:  )super__init__dir
ValueErrorcells)selfr   kwargscell	__class__r
   Z/home/ubuntu/.local/lib/python3.10/site-packages/keras/src/layers/rnn/stacked_rnn_cells.pyr   "   s    
zStackedRNNCells.__init__c                 C   s   dd | j D S )Nc                 S   s   g | ]}|j qS r
   )r	   ).0cr
   r
   r   
<listcomp>3   s    z.StackedRNNCells.state_size.<locals>.<listcomp>)r   r   r
   r
   r   r	   1   s   zStackedRNNCells.state_sizec                 C   sT   t | jd dd d ur| jd jS t| jd jttfr$| jd jd S | jd jS )Noutput_sizer   )getattrr   r   
isinstancer	   listtupler   r
   r
   r   r   5   s
   zStackedRNNCells.output_sizeNc                    s|   g }j D ]6}t|dd }|r|| d qt|jtr-|tj |jfjd q| fdd|jD  q|S )Nget_initial_state)
batch_sizedtypec                    s    g | ]}t j |fjd qS )r"   )r   zeroscompute_dtype)r   dr!   r   r
   r   r   P   s    z5StackedRNNCells.get_initial_state.<locals>.<listcomp>)	r   r   appendr   r	   intr   r$   r%   )r   r!   initial_statesr   get_initial_state_fnr
   r'   r   r    >   s(   
z!StackedRNNCells.get_initial_stateFc           	      K   s   g }t | j|D ]N\}}t|}t|rt|n|g}t|tr*|jr*||d< n|dd  t	|r7|j
n|j}|||fi |\}}t|dkrQ|sQ|d }|| qt|dkra|d }||fS )Ntraining   r   )zipr   r   	is_nestedr   r   r   _call_has_training_argpopcallable__call__r   lenr(   )	r   inputsstatesr,   r   
new_statesr   state_is_listcell_call_fnr
   r
   r   r   W   s   

zStackedRNNCells.callc                 C   s   | j D ]:}t|tr|js|| d|_t|dd d ur!|j}nt|jtt	fr/|jd }n|j}t
|d }||f}qd S )NTr   r   )r   r   r   builtbuildr   r   r	   r   r   r   flatten)r   input_shaper   
output_dimr!   r
   r
   r   r;   k   s   


zStackedRNNCells.buildc                    s>   g }| j D ]
}|t| qd|i}t  }i ||S )Nr   )r   r(   r   serialize_keras_objectr   
get_config)r   r   r   configbase_configr   r
   r   r@   y   s   

zStackedRNNCells.get_configc                 C   s8   g }| dD ]}|tj||d q| |fi |S )Nr   )custom_objects)r1   r(   r   deserialize_keras_object)clsrA   rC   r   cell_configr
   r
   r   from_config   s   zStackedRNNCells.from_config)N)F)__name__
__module____qualname____doc__r   propertyr	   r   r    r   r;   r@   classmethodrG   __classcell__r
   r
   r   r   r      s    



r   N)
	keras.srcr   r   keras.src.api_exportr   keras.src.layers.layerr   keras.src.savingr   r   r
   r
   r
   r   <module>   s    