
    2VhW                     n    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y)    N)lax)numpy)tree)stateless_scopec           	      V   	"#$ d }|st        j                  |      t        j                        }|d   j                  d   }|Y|j                  dk7  r|j                  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
}|Yt        |      }r|j                          t        |      D ]  } ||      }||   #  |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$|j'                  |       |j'                  |       |g}|g} |d   }|d   }t        j(                  |      }nt        |      D ]V  } ||      }  |t        |      t        |      z         \  }}|
r#|j'                  |       |j'                  |       Q|g}|g}X |d   }|d   }t        j(                  |      }n| 	fd}|f} n fd}} t+        j,                         rt/        j0                         }!nt+        j2                         }!|!5  t5        j6                  |||       \  }}d d d        rt        j8                  d      }d   }|st        j                  ||      }||fS # 1 sw Y   DxY w)Nc                     t        t        t        | j                                    }d\  |d<   |d<   t	        j
                  | |      S )N)   r   r   r	   )listrangelenshapejnp	transpose)input_taxess     I/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/backend/jax/rnn.pyswap_batch_timestepz rnn.<locals>.swap_batch_timestep   s=    E#gmm,-.Qa}}Wd++    r   bool   )axisc                    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    >>&!;F8D  >>'"<WIF  &V\\)::	y! 	1A__VR0F	1C)Od7==+D&EE	xx	**r   z/Unrolling requires a fixed number of timesteps.c                 B    t        |       } r| j                          | S N)unstackreverse)r   go_backwardss    r   _process_single_input_tz$rnn.<locals>._process_single_input_tI   s    g&G!Nr   c                 ^    D cg c]  }||    	 }}t        j                  |      S c c}w r%   )r   pack_sequence_as)timet_inpinputsprocessed_inputs      r   _get_input_tensorzrnn.<locals>._get_input_tensorV   s2    &562d86C6((55 7s   *c              3   0   K   | ]  } |        y wr%    ).0sr#   r   s     r   	<genexpr>zrnn.<locals>.<genexpr>p   s      %01L+%s   c              3   R   K   | ]  \  }}}t        j                  |||       ! y wr%   r   where)r4   mr5   pss       r   r6   zrnn.<locals>.<genexpr>s   s+      * 1b IIaB'*s   %'c                    |\  }}t        j                  t        j                  |      dd       ||       \  }}	r+t        j                  t        j                  |      |      }n9| d   }t        j                  |      r| d   d   }t        j                  ||      }t        j                  fd| |      }||fS )Nr   T)r   keepdimsr   c                 2    t        j                  | |      S r%   r8   )r5   ns	is_maskeds     r   <lambda>z$rnn.<locals>._step.<locals>.<lambda>   s    #))Iq""= r   )r   alllogical_notr9   
zeros_liker   r   map_structure)
statescurrent_inputcurrent_maskoutput_t
new_statesmasked_outs
output_tm1r@   step_functionzero_output_for_masks
          @r   _stepzrnn.<locals>._step   s    .;+|GGOOL1T	 (5]F'K$*'"%))!3>>(#;X#K
 "(J~~j1%+BZ]
"%))Iz8"LK!//=

 #K00r   c                 $     ||       \  }}||fS r%   r3   )rF   rG   rI   rJ   rM   s       r   rO   zrnn.<locals>._step   s    '4]F'K$*!8++r   )finitxsr'   )r	   )r   rE   flattenr   dtypeastyper   r   r   r   tupler   r&   r'   r   rD   r9   zipr+   appendstackr   in_stateless_scope
contextlibnullcontextStatelessScoper   scanflip)%rM   r/   initial_statesr(   mask	constantsunrollinput_length
time_majorrN   return_all_outputsr   flattened_inputs
time_stepsrF   successive_statessuccessive_outputsr)   r1   	mask_listir.   outputrJ   tiled_mask_tprev_outputflat_statesflat_new_statesflat_final_stateslast_outputoutputsrO   scan_xsscoper#   r   r0   s%   `` `     `                        @@@r   rnnrx   
   s   , ##$7@||F+!!$**1-J::;;v&Dtzz?a??4b1D&t,D	+ NOO~&	 >>&!"00'O  7v>@O	6 I!!#:& !1'*"1%2vy)99&"
  ,FF;)"%.."8K"4R"8K<E"ll62"&,,z":$ %5@%   %* *$'$o{%* %! ..v7HI%&--f5%,,V4*0&)/%C!1D -R0K*2.Jii 23G :& 
1'*!.vy)99" &&--f5%,,V4*0&)/%
1 -R0K*2.Jii 23G 16 tnG, G--/**,E#224E 		 #&((#$	#J			 hhwQ/Gbk$$%8'B++#		 		s   ?NN(c                       y)NFr3   argskwargss     r   cudnn_okr}      s    r   c                      t         r%   NotImplementedErrorrz   s     r   lstmr          
r   c                      t         r%   r   rz   s     r   grur      r   r   c           	          t        | j                  |         D cg c]  }t        j                  | ||d       c}S c c}w )NF)r=   )r   r   r   index_in_dim)xr   rm   s      r   r&   r&      sB     qwwt}% 	Ate4  s    >)FNNFNFFT)r   )r\   jaxr   r   r   	keras.srcr   keras.src.backend.commonr   rx   r}   r   r   r&   r3   r   r   <module>r      sI        4 	I,Xr   