
    AVh                         d Z ddlmZ ddlmZ  ej
                  d      dej                  fd       Z ej
                  d      dej                  fd       Z ej
                  d	      dej                  fd
       Z	y)z"Gradients for CuudnnRNN operators.    )ops)gen_cudnn_rnn_opsCudnnRNNopc                 \   | j                  d      st        d      t        j                  di d| j                  d   d| j                  d   d| j                  d   d	| j                  d
   d| j
                  d   d| j
                  d   d| j
                  d   d|d   d|d   d|d   d| j
                  d
   d| j                  d      d| j                  d      d| j                  d      d| j                  d      d| j                  d      d| j                  d      S )zGradients for the CudnnRNN op.is_trainingz>To use CudnnRNN in gradients, is_training must be set to True.inputr   input_h   input_c   params   outputoutput_houtput_coutput_backpropoutput_h_backpropoutput_c_backpropreserve_spacedropoutseedseed2rnn_mode
input_mode	direction )get_attr
ValueErrorr   cudnn_rnn_backpropinputsoutputsr   gradss     T/home/dcms/DCMS/lib/python3.12/site-packages/tensorflow/python/ops/cudnn_rnn_grad.py_cudnn_rnn_backwardr&      s]    
]	#
HJ J		-	- 
*IIaL
*iil
* iil
* YYq\	
*
 ZZ]
* zz!}
* zz!}
* Ah
* a
* a
* JJqM
* kk)$
* ;;v
* KK 
* {{:&
*  \*!
*" K(#
* *    
CudnnRNNV2c                 |   | j                  d      st        d      t        j                  di d| j                  d   d| j                  d   d| j                  d   d	| j                  d
   d| j
                  d   d| j
                  d   d| j
                  d   d|d   d|d   d|d   d| j
                  d
   d| j
                  d   d| j                  d      d| j                  d      d| j                  d      d| j                  d      d| j                  d      d| j                  d      S )Nr   z@To use CudnnRNNV2 in gradients, is_training must be set to True.r	   r   r
   r   r   r   r   r   r   r   r   r   r   r   r   host_reserved   r   r   r   r   r   r   r   )r   r   r   cudnn_rnn_backprop_v2r!   r"   )r   grads     r%   _cudnn_rnn_backward_v2r.   .   sm   	]	#
JL L		0	0 
*IIaL
*iil
* iil
* YYq\	
*
 ZZ]
* zz!}
* zz!}
* 1g
* Q
* Q
* JJqM
* JJqM
* kk)$
* ;;v
* KK 
*  {{:&!
*" \*#
*$ K(%
* *r'   
CudnnRNNV3c                    | j                  d      st        d      t        j                  di d| j                  d   d| j                  d   d| j                  d   d	| j                  d
   d| j                  d   d| j
                  d   d| j
                  d   d| j
                  d   d|d   d|d   d|d   d| j
                  d
   d| j
                  d   d| j                  d      d| j                  d      d| j                  d      d| j                  d      d| j                  d      d| j                  d      d| j                  d      d| j                  d      dz   S )z Gradients for the CudnnRNNV3 op.r   z@To use CudnnRNNV3 in gradients, is_training must be set to True.r	   r   r
   r   r   r   r   r   sequence_lengthsr+   r   r   r   r   r   r   r   r*   r   r   r   
time_majornum_projr   r   r   )Nr   )r   r   r   cudnn_rnn_backprop_v3r!   r"   r#   s     r%   _cudnn_rnn_backwardv3r5   H   s    
]	#
JL L		0	0 
*IIaL
*iil
* iil
* YYq\	
*
 yy|
* ZZ]
* zz!}
* zz!}
* Ah
* a
* a
* JJqM
* JJqM
* kk)$
* ;;v
*  KK !
*" \*#
*$ {{:&%
*& {{:&'
*( \*)
** K(+
** -4+
4 4r'   N)
__doc__tensorflow.python.frameworkr   tensorflow.python.opsr   RegisterGradient	Operationr&   r.   r5   r   r'   r%   <module>r;      s    ) + 3 j!*CMM * "*2 l#*s}} * $*2 l#4cmm 4 $4r'   