
    &Vf                     p    d dl Z d dlmZ d dlmZ d dlmZ d dlmZ 	 	 	 	 	 	 	 	 ddZ	d	 Z
d
 Zd ZddZdS )    N)lax)numpy)tree)stateless_scopeFTc           	         	"#$ d }|st          j        |          t          j                  }|d         j        d         }|[|j        dk    r|                    d          }t          |j                  dk    rt          j        |d          }|s ||          }|g }dd"|r|st          d	          t          |          }g }g }fd
}t          j                  rt          j        |          $n |          f$$fd}|t          |          }r|                                 t          |          D ]8} ||          }||         #  |t          |          t          |          z             \  }} "#|          }|st          j        |          }n|d         }t          j        |||          }t          j        |          }t          j        |          }t          "#fd|D                       }t          d t#          |||          D                       }t          j        ||          }|
r,|                    |           |                    |           2|g}|g}:|d         }|d         }t          j        |          }nDt          |          D ]l} ||          }  |t          |          t          |          z             \  }}|
r+|                    |           |                    |           f|g}|g}m|d         }|d         }t          j        |          }n| 	fd}|f} n fd}} t+          j                    rt/          j                    }!nt+          j                    }!|!5  t5          j        |||           \  }}d d d            n# 1 swxY w Y   rt          j        |d          }|d         }|st          j        ||          }|||fS )Nc                     t          t          t          | j                                      }d\  |d<   |d<   t	          j        | |          S )N)   r   r   r	   )listrangelenshapejnp	transpose)input_taxess     V/var/www/html/software/conda/lib/python3.11/site-packages/keras/src/backend/jax/rnn.pyswap_batch_timestepz rnn.<locals>.swap_batch_timestep   sE    E#gm,,--..Qa}Wd+++    r   bool   )axisr	   c                    t          j        |           rt          d|            t          j        |          rt          d|           t          |j                  t          | j                  z
  }t          |          D ]}t          j        | d          } dg|z  t          |j        |d                    z   }t          j	        | |          S )Nz)mask_t is expected to be tensor, but got z*input_t is expected to be tensor, but got r   r	   )
r   	is_nested
ValueErrorr   r   r   r   expand_dimsr
   tile)mask_tr   	fixed_dim	rank_diff_	multipless         r   _expand_maskzrnn.<locals>._expand_mask.   s    >&!! 	DFDD   >'"" 	FWFF   &&V\):)::	y!! 	1 	1A_VR00FFC)Od7=+D&E&EE	x	***r   z/Unrolling requires a fixed number of timesteps.c                 R    t          |           } r|                                  | S N)unstackreverse)r   go_backwardss    r   _process_single_input_tz$rnn.<locals>._process_single_input_tI   s-    g&&G "!!!Nr   c                 L      fdD             }t          j        |          S )Nc                      g | ]
}|         S  r,   ).0t_times     r   
<listcomp>z2rnn.<locals>._get_input_tensor.<locals>.<listcomp>W   s    6662d8666r   )r   pack_sequence_as)r/   inpinputsprocessed_inputs   ` r   _get_input_tensorzrnn.<locals>._get_input_tensorV   s0    6666o666C(555r   c              3   0   K   | ]} |          V  d S r%   r,   )r-   sr#   r   s     r   	<genexpr>zrnn.<locals>.<genexpr>p   s@       % %01LL++% % % % % %r   c              3   J   K   | ]\  }}}t          j        |||          V  d S r%   r   where)r-   mr7   pss       r   r8   zrnn.<locals>.<genexpr>s   sJ       * * 1b IaB''* * * * * *r   c                 R   |\  }}t          j        t          j        |          dd           ||           \  }}	r)t          j        t          j        |          |          }n| d         }t          j        ||          }fdt          | |          D             }||fS )Nr   T)r   keepdimsr   c                 B    g | ]\  }}t          j        ||          S r,   r:   )r-   r7   ns	is_maskeds      r   r0   z&rnn.<locals>._step.<locals>.<listcomp>   s;       2 IiB//  r   )r   alllogical_notr;   
zeros_likezip)
statescurrent_inputcurrent_maskoutput_t
new_statesmasked_outs
output_tm1rB   step_functionzero_output_for_masks
          @r   _stepzrnn.<locals>._step   s    .;+|GOL11T  	 (5}]F'K'K$*' M"%)!3>(#;#;X# #KK
 "(J"%)Iz8"L"LK   !$VZ!8!8  
 #K00r   c                 *     ||           \  }}||fS r%   r,   )rG   rH   rJ   rK   rN   s       r   rP   zrnn.<locals>._step   s$    '4}]F'K'K$*!8++r   )finitxsr'   )r	   )r   map_structureflattenr   dtypeastyper   r   r   r   tupler   r&   r'   r   rE   r;   rF   r1   appendstackr   in_stateless_scope
contextlibnullcontextStatelessScoper   scanflip)%rN   r3   initial_statesr(   mask	constantsunrollinput_length
time_majorrO   return_all_outputsr   flattened_inputs
time_stepsrG   successive_statessuccessive_outputsr)   r5   	mask_listir2   outputrK   tiled_mask_tprev_outputflat_statesflat_new_statesflat_final_stateslast_outputoutputsrP   scan_xsscoper#   r   r4   s%   `` `     `                        @@@r   rnnry   
   s   , , ,  A#$7@@|F++!!$*1-J:;;v&&Dtz??a?4b111D 	-&&t,,D	+ + + +  M" 	PNOOO~&&	 	 	 	 	 >&!! 	A"0' OO  76v>>@O	6 	6 	6 	6 	6 	6 I $!!###:&& !1 !1''**"1%2]vy)9)99& &"
  ,|FF;;) 9"%."8"8KK"4R"8K<EE"l622"&,z":":$ % % % % %5@% % %     %* * *$'$o{% %* * * % %! .v7HII% 1&--f555%,,V4444*0&)/%%,R0K*2.Ji 233GG :&& 
1 
1''**!.vy)9)99" " & 1&--f555%,,V4444*0&)/%%,R0K*2.Ji 233GG 1 1 1 1 1 1. tnGG, , , , , G-// 	5*,,EE#244E 		 		 #&(#$	# # #J			 		 		 		 		 		 		 		 		 		 		 		 		 		 		  	0hwQ///Gbk C$%8'BB++s   OO
O
c                      dS )NFr,   argskwargss     r   cudnn_okr~      s    5r   c                      t           r%   NotImplementedErrorr{   s     r   lstmr          
r   c                      t           r%   r   r{   s     r   grur      r   r   c                 T      fdt           j                           D             S )Nc                 @    g | ]}t          j        |d           S )F)r?   )r   index_in_dim)r-   rn   r   xs     r   r0   zunstack.<locals>.<listcomp>   s=        	Ate444  r   )r   r   )r   r   s   ``r   r&   r&      sB        qwt}%%   r   )FNNFNFFT)r   )r]   jaxr   r   r   	keras.srcr   keras.src.backend.commonr   ry   r~   r   r   r&   r,   r   r   <module>r      s                          4 4 4 4 4 4 	E, E, E, E,P           r   