o
    2hW                     @   sx   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d	Z	d
d Z
dd Zdd ZdddZdS )    N)lax)numpy)tree)stateless_scopeFTc           "         s<  dd }|st |t }|d jd }|d ur:|jdkr&|d}t|jdkr4tj|dd}|s:||}|d u r@g }dd	d
 |r=|sNt	dt
|}g }g }fdd}t rht |n|ffdd}|d urt|}r|  t|D ]k}||}|| |t
|t
| \}} |}|st|}n|d }t|||}t |}t |}t
 fdd|D }t
dd t|||D }t ||}|
r|| || q|g}|g}q|d }|d }t|}nt|D ])}||}|t
|t
| \}}|
r'|| || q|g}|g}q|d }|d }t|}nS|d urNfdd}|f} nfdd}} t r`t }!nt }!|! tj||| d\}}W d    n	1 s}w   Y  rtj|dd}|d }|st ||}|||fS )Nc                 S   s.   t tt| j}d\|d< |d< t| |S )N)   r   r   r   )listrangelenshapejnp	transpose)input_taxes r   T/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/backend/jax/rnn.pyswap_batch_timestep   s   z rnn.<locals>.swap_batch_timestepr   bool   )axisr   c                 S   s   t | rtd|  t |rtd| t|jt| j }t|D ]}t| d} q&dg| t|j|d   }t	| |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_	multiplesr   r   r   _expand_mask.   s   

zrnn.<locals>._expand_maskz/Unrolling requires a fixed number of timesteps.c                    s   t | }  r
|   | S N)unstackreverse)r   )go_backwardsr   r   _process_single_input_tI   s   z$rnn.<locals>._process_single_input_tc                    s    fddD }t |S )Nc                    s   g | ]}|  qS r   r   ).0t_timer   r   
<listcomp>W   s    z2rnn.<locals>._get_input_tensor.<locals>.<listcomp>)r   pack_sequence_as)r(   inp)inputsprocessed_inputr'   r   _get_input_tensorV   s   zrnn.<locals>._get_input_tensorc                 3   s    | ]} |V  qd S r    r   )r%   s)r   r   r   r   	<genexpr>p   s    

zrnn.<locals>.<genexpr>c                 s   s$    | ]\}}}t |||V  qd S r    r   where)r%   mr/   psr   r   r   r0   s   s
    
c                    s   |\}}t jt |ddd || \}}r#t  t ||}n| d }t|r2| d d }t  ||}t fdd| |}||fS )Nr   T)r   keepdimsr   c                    s   t  | |S r    r1   )r/   ns	is_maskedr   r   <lambda>   s    z$rnn.<locals>._step.<locals>.<lambda>)r   alllogical_notr2   
zeros_liker   r   map_structure)statescurrent_inputcurrent_maskoutput_t
new_statesmasked_outs
output_tm1)step_functionzero_output_for_maskr7   r   _step   s&   

zrnn.<locals>._stepc                    s    || \}}||fS r    r   )r>   r?   rA   rB   )rE   r   r   rG      s   )finitxsr"   )r   )r   r=   flattenr
   dtypeastyper	   r   r   r   tupler   r!   r"   r   r<   r2   zipr*   appendstackr   in_stateless_scope
contextlibnullcontextStatelessScoper   scanflip)"rE   r,   initial_statesr#   mask	constantsunrollinput_length
time_majorrF   return_all_outputsr   flattened_inputs
time_stepsr>   successive_statessuccessive_outputsr$   r.   	mask_listir+   outputrB   tiled_mask_tprev_outputflat_statesflat_new_statesflat_final_stateslast_outputoutputsrG   scan_xsscoper   )r   r#   r,   r   r-   rE   rF   r   rnn
   s   


















ro   c                  O   s   dS )NFr   argskwargsr   r   r   cudnn_ok      rs   c                  O      t r    NotImplementedErrorrp   r   r   r   lstm   rt   rx   c                  O   ru   r    rv   rp   r   r   r   gru   rt   ry   c                    s    fddt j  D S )Nc                    s   g | ]}t j| d dqS )F)r5   )r   index_in_dim)r%   rd   r   xr   r   r)      s    zunstack.<locals>.<listcomp>)r   r
   )r|   r   r   r{   r   r!      s   r!   )FNNFNFFT)r   )rS   jaxr   r   r   	keras.srcr   keras.src.backend.commonr   ro   rs   rx   ry   r!   r   r   r   r   <module>   s&    
 M