o
    2h                     @   s^   d dl Zd dlmZ 								dddZdd Zd	d
 ZdddZdddZdd Z	dS )    N)treeFTc           !         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|}nnt|D ])}||}|t
|t
| \}}|
r'|| || q|g}|g}q|d }|d }t|}n2|d urNfdd}|f} nfdd}} t||| |d\}}rktj|dd}|d }|sxt ||}|||fS )Nc                 S   s.   t tt| j}d\|d< |d< t| |S )N)   r   r   r   )listrangelenshapenp	transpose)input_taxes r   V/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/backend/numpy/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_tE   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>S   s    z2rnn.<locals>._get_input_tensor.<locals>.<listcomp>)r   pack_sequence_as)r&   inp)inputsprocessed_inputr%   r   _get_input_tensorR   s   zrnn.<locals>._get_input_tensorc                 3   s    | ]} |V  qd S r   r   )r#   s)r   r   r   r   	<genexpr>l   s    

zrnn.<locals>.<genexpr>c                 s   s$    | ]\}}}t |||V  qd S r   r   where)r#   mr-   psr   r   r   r.   o   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   r/   )r-   ns	is_maskedr   r   <lambda>   s    z$rnn.<locals>._step.<locals>.<lambda>)r   alllogical_notr0   
zeros_liker   r   map_structure)statescurrent_inputcurrent_maskoutput_t
new_statesmasked_outs
output_tm1)step_functionzero_output_for_maskr5   r   _step   s&   

zrnn.<locals>._stepc                    s    || \}}||fS r   r   )r<   r=   r?   r@   )rC   r   r   rE      s   )finitxsr    mask)r   )r   r;   flattenr   dtypeastyper   r   r   r   tupler   r   r    r   r:   r0   zipr(   appendstack
numpy_scanflip)!rC   r*   initial_statesr!   rI   	constantsunrollinput_length
time_majorrD   return_all_outputsr   flattened_inputs
time_stepsr<   successive_statessuccessive_outputsr"   r,   	mask_listir)   outputr@   tiled_mask_tprev_outputflat_statesflat_new_statesflat_final_stateslast_outputoutputsrE   scan_xsr   )r   r!   r*   r   r+   rC   rD   r   rnn   s   
















rh   c                  O      t r   NotImplementedErrorargskwargsr   r   r   lstm      ro   c                  O   ri   r   rj   rl   r   r   r   gru   rp   rq   c                    s    fddt j  D S )Nc                    s   g | ]} | qS r   )take)r#   r^   r   xr   r   r'      s    zunstack.<locals>.<listcomp>)r   r   )rt   r   r   rs   r   r      s   r   c                 C   s   |}g }|d ur;|\}}|rt j|ddn|}|r t j|ddn|}t||D ]\}}	| |||	f\}}
||
 q'n|rDt j|ddn|}|D ]}| ||\}}
||
 qHt |}|ret j|dd}||fS )Nr   r   )r   rR   rN   rO   array)rF   rG   rH   r    rI   r<   rf   rt   each_x	each_maskr_   r   r   r   rQ      s$   
rQ   c                  O   s   dS )NFr   rl   r   r   r   cudnn_ok   rp   rx   )FNNFNFFT)r   )FN)
numpyr   	keras.srcr   rh   ro   rq   r   rQ   rx   r   r   r   r   <module>   s"    
 F

