
    2Vh5                     l    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e             Z	y	)
    )ops)tree)keras_export)Layer)serialization_libzkeras.layers.StackedRNNCellsc                   t     e Zd ZdZ fdZed        Zed        Zd
dZddZ	d Z
 fdZed
d	       Z x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                     t        |   di | |D ]8  }dt        |      vrt        d|       dt        |      vs,t        d|        || _        y )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__s       V/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/layers/rnn/stacked_rnn_cells.pyr   zStackedRNNCells.__init__"   s    "6" 
	DSY& >>BVE  3t9, ==AFD 
	 
    c                 T    | j                   D cg c]  }|j                   c}S c c}w N)r   r   )r   cs     r   r   zStackedRNNCells.state_size1   s    &*jj1111s   %c                 ,   t        | j                  d   dd       | 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tuple)r   s    r   r   zStackedRNNCells.output_size5   sv    4::b>=$7C::b>---

211D%=A::b>,,Q//::b>,,,r   c           
         g }| j                   D ]  }t        |dd       }|r|j                   ||             +t        |j                  t
              r=|j                  t        j                  ||j                  f| j                               |j                  |j                  D cg c]%  }t        j                  ||f| j                        ' c}        |S c c}w )Nget_initial_state)
batch_size)dtype)	r   r   appendr    r   intr   zeroscompute_dtype)r   r%   initial_statesr   get_initial_state_fnds         r   r$   z!StackedRNNCells.get_initial_state>   s    JJ 	D#*41Dd#K #%%(J? doos3"))		'9"&"4"4 #)) &*__ !  IIz1oT=O=OP	* s   **C
c                    g }t        | j                  |      D ]  \  }}t        j                  |      }t        j                  |      rt	        |      n|g}t        |t              r|j                  r||d<   n|j                  dd        t        |      r|j                  n|j                  } |||fi |\  }}t        |      dk(  r|s|d   }|j                  |        t        |      dk(  r|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_fns	            r   r   zStackedRNNCells.callW   s    


F3 	&LD& NN62M%)^^F%;T&\&F$&4+F+F%-z"

:t,,4TN4==		L)&&CFCNFF6{af%	& z?a#AJz!!r   c                 r   | j                   D ]  }t        |t              r$|j                  s|j	                  |       d|_        t        |dd       |j                  }n<t        |j                  t        t        f      r|j                  d   }n|j                  }t        j                  |      d   }||f} y )NTr   r   )r   r    r   builtbuildr   r   r   r!   r"   r   flatten)r   input_shaper   
output_dimr%   s        r   r?   zStackedRNNCells.buildk   s    JJ 	3D$&tzz

;'!
t]D1=!--
DOOdE];!__Q/
!__
k215J%z2K	3r   c                     g }| j                   D ]&  }|j                  t        j                  |             ( d|i}t        |          }i ||S )Nr   )r   r'   r   serialize_keras_objectr   
get_config)r   r   r   configbase_configr   s        r   rE   zStackedRNNCells.get_configy   s\    JJ 	IDLL*AA$GH	I5!g(*(+(((r   c                     g }|j                  d      D ](  }|j                  t        j                  ||             *  | |fi |S )Nr   )custom_objects)r4   r'   r   deserialize_keras_object)clsrF   rI   r   cell_configs        r   from_configzStackedRNNCells.from_config   sP    !::g. 	KLL!::	 5#F##r   r   )F)__name__
__module____qualname____doc__r   propertyr   r   r$   r   r?   rE   classmethodrM   __classcell__)r   s   @r   r	   r	      s]    0 2 2 - -2"(3) $ $r   r	   N)
	keras.srcr   r   keras.src.api_exportr   keras.src.layers.layerr   keras.src.savingr   r	   r   r   r   <module>rY      s8      - ( . ,-A$e A$ .A$r   