
    2Vh                     R    d dl Zd dlmZ 	 	 	 	 	 	 	 	 d	dZd Zd Zd
dZddZd Z	y)    N)treec           	         	!"# 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
}|Xt        |      }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(                  |      }nt        |      D ]V  } ||      }  |t        |      t        |      z         \  }}|
r#|j'                  |       |j'                  |       Q|g}|g}X |d   }|d   }t        j(                  |      }nE| 	fd}|f} n fd}} t+        ||| |      \  }}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np	transpose)input_taxess     K/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/backend/numpy/rnn.pyswap_batch_timestepz rnn.<locals>.swap_batch_timestep   s=    E#gmm,-.Qa||GT**    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! 	0A^^FB/F	0C)Od7==+D&EE	wwvy))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_tE   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_tensorR   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>l   s      %01L+%s   c              3   R   K   | ]  \  }}}t        j                  |||       ! y wr#   r   where)r2   mr3   pss       r   r4   zrnn.<locals>.<genexpr>o   s+      * 1b HHQ2&*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#   r6   )r3   ns	is_maskeds     r   <lambda>z$rnn.<locals>._step.<locals>.<lambda>   s    "((9a"< r   )r   alllogical_notr7   
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    .;+|FFNN<0rD	 (5]F'K$*'"$((!2==#:H#K
 "(J~~j1%+BZ]
"$((9j("KK!//<

 #K00r   c                 $     ||       \  }}||fS r#   r1   )rD   rE   rG   rH   rK   s       r   rM   zrnn.<locals>._step   s    '4]F'K$*!8++r   )finitxsr%   mask)r   )r   rC   flattenr
   dtypeastyper	   r   r   r   tupler   r$   r%   r   rB   r7   zipr)   appendstack
numpy_scanflip)$rK   r-   initial_statesr&   rR   	constantsunrollinput_length
time_majorrL   return_all_outputsr   flattened_inputs
time_stepsrD   successive_statessuccessive_outputsr'   r/   	mask_listir,   outputrH   tiled_mask_tprev_outputflat_statesflat_new_statesflat_final_stateslast_outputoutputsrM   scan_xsr!   r   r.   s$   `` `     `                       @@@r   rnnrq      s   + ##$7@||F+!!$**1-J::;;v&Dtzz?a>>$R0D&t,D	* NOO~&	 >>&!"00'O  7v>@O	6 I!!#:& !1'*"1%2vy)99&"
  ,FF;)"$--"7K"4R"8K,D"ll62"&,,z":$ %5@%   %* *$'$o{%* %! ..v7HI%&--f5%,,V4*0&)/%C!1D -R0K*2.Jhh12G :& 
1'*!.vy)99" &&--f5%,,V4*0&)/%
1 -R0K*2.Jhh12G 16 tnG, G( 

G gggA.Gbk$$%8'B++r   c                      t         r#   NotImplementedErrorargskwargss     r   lstmrx          
r   c                      t         r#   rs   ru   s     r   grur{      ry   r   c                 x    t        | j                  |         D cg c]  }| j                  ||       c}S c c}w r#   )r   r
   take)xr   rg   s      r   r$   r$      s-    %*1774=%9:AFF1dO:::s   7c                    |}g }|o|\  }}|rt        j                  |d      n|}|rt        j                  |d      n|}t        ||      D ]$  \  }}	 | |||	f      \  }}
|j                  |
       & n?|rt        j                  |d      n|}|D ]  } | ||      \  }}
|j                  |
       ! t        j                  |      }|rt        j                  |d      }||fS )Nr   r   )r   r[   rW   rX   array)rO   rP   rQ   r%   rR   rD   ro   r~   each_x	each_maskrh   s              r   rZ   rZ      s    FG4")BGGAAq(/rwwt!$T!$Q 	#FIv	':;NFFNN6"	# %,RWWRa  	#Avq\NFFNN6"	# hhwG'''*7?r   c                       y)NFr1   ru   s     r   cudnn_okr      s    r   )FNNFNFFT)r   )FN)
numpyr   	keras.srcr   rq   rx   r{   r$   rZ   r   r1   r   r   <module>r      sE      	B,J;6r   