
    ij	B                         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dZ	 	 	 dd	Z	 	 dd
Z	 	 	 	 d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     n/var/www/html/emotional.easysim.app/public_html/venv/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)r5   mr6   pss       r   r7   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&   r9   )r6   ns	is_maskeds     r   <lambda>z$rnn.<locals>._step.<locals>.<lambda>   s    #))Iq""= r   )r   alllogical_notr:   
zeros_liker   r   map_structure)
statescurrent_inputcurrent_maskoutput_t
new_statesmasked_outs
output_tm1rA   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&   r4   )rG   rH   rJ   rK   rN   s       r   rP   zrnn.<locals>._step   s    '4]F'K$*!8++r   )finitxsr(   )r	   )r   rF   flattenr   dtypeastyper   r   r   r   tupler   r'   r(   r   rE   r:   zipr,   appendstackr   in_stateless_scope
contextlibnullcontextStatelessScoper   scanflip)%rN   r0   initial_statesr)   mask	constantsunrollinput_length
time_majorrO   return_all_outputsr   flattened_inputs
time_stepsrG   successive_statessuccessive_outputsr*   r2   	mask_listir/   outputrK   tiled_mask_tprev_outputflat_statesflat_new_statesflat_final_stateslast_outputoutputsrP   scan_xsscoper$   r   r1   s%   `` `     `                        @@@r   rnnry   
   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                  0    dd l } | j                         dk(  S )Nr   gpu)jaxdefault_backend)r|   s    r   _is_gpu_availabler~      s     E))r   c                     ddl m} ddl m} | |j                  t        j                  |j                  fv xr/ ||j
                  |j
                  fv xr | xr |xr
 t               S )Nr   )activations)ops)	keras.srcr   r   tanhr   sigmoidr~   )
activationrecurrent_activationre   use_biasr   r   s         r   cudnn_okr      sk     & 	{''388<< 	  [%8%8#++$FF	 J	  	  r   c                 D   |t         t        ||||d u      st         	 ddlm} |j
                  d   }|j
                  d   }| j
                  d   }t        j                  |      j                  }t        j                  |      j                  }|t        j                  |      }nt        j                  d|z        }t        j                  |      }t        j                  |j                         |j                         |j                         |j                         g      }t        j                  |      }t        j                  |      }|j                  dk(  r&|t        j                     }|t        j                     }|
rt        j                  | d      } t        j                   |f| j
                  d   t        j"                  	      }	  || ||||||dd
d
      \  }}}|j+                  d      }|j+                  d      }|d d df   }|	s|d d t        j                  d d f   }n|}|
r|	rt        j                  |d      }||||gfS # t        $ r}t        d|       |d }~ww xY w# t$        t&        t(        f$ r}t        d|       |d }~ww xY w)Nr   r   lstm"jax.experimental.rnn unavailable:    r   r	   r   rV           F
input_sizehidden_size
num_layersdropoutbidirectionalzcuDNN LSTM failed: r   )NotImplementedErrorr   jax.experimental.rnnr   ImportErrorr   r   asarrayTzerosrE   concatenateravelndimnewaxisra   fullint32RuntimeError	TypeErrorr   squeeze)r0   initial_state_hinitial_state_crc   kernelrecurrent_kernelbiasr   r   return_sequencesr)   re   jax_lstmer   r   
batch_sizeW_ihW_hhb_ihb_hhweightsh_0c_0seq_lengthsyh_nc_nru   rv   s                                 r   r   r      sn     !!T!	 "!9 aJ"((+KaJ ;;v  D;;'(**D{{4 yy[)>>$D oo	tzz|TZZ\4::<@G
 ++o
&C
++o
&C
xx1}#++#++&q)((J=&,,q/KKD!#
3  ++a.C
++a.CArE(Kaa/0(((7+#s++E  !04
	d )Z0 D!$7s";<!CDs/   I I7 	I4 I//I47JJJc                 V  ' |t         t        ||||duxr |du      st         	 ddlm} |j
                  d   }|j
                  d   '| j
                  d   }d }'fd}t        j                   |||       ||	|
       ||       ||      g      }t        j                  t        j                  |      t        j                  |      gd      }t        j                  t        j                  |      t        j                  |      gd      }t        j                  |f| j
                  d	   t        j                  
      }	  || |||||'d	dd
      \  }}}|dd'f   }|d'df   }|d   |d	   } }|d   |d	   }"}!|dddf   }#|dddf   }$|r|}%|}&n4|#ddt        j                  ddf   }%|$ddt        j                  ddf   }&|#|%||!gf|$|&| |"gffS # t        $ r}t        d|       |d}~ww xY w# t        t        t        f$ r}t        d|       |d}~ww xY w)aS  Fused bidirectional cuDNN LSTM.

    Runs forward and backward LSTM passes in a single
    `jax.experimental.rnn.lstm(..., bidirectional=True)` call instead of
    invoking the unidirectional cuDNN path twice. Returns outputs in
    original time order for both directions, ready for the caller's
    `merge_mode` to consume directly.
    Nr   r   r   r   c                     t        j                  |       j                  }t        j                  |      j                  }t        j                  |j	                         |j	                         g      S r&   )r   r   r   r   r   )r   r   r   r   s       r   _pack_matricesz*bidirectional_lstm.<locals>._pack_matrices  sM     {{6"$${{+,..

djjl;<<r   c                     | t        j                  |       }nt        j                  dz        }t        j                  |      }t        j                  |j                         |j                         g      S )Nr   )r   r   r   rE   r   r   )r   r   r   r   s      r   _pack_biasesz(bidirectional_lstm.<locals>._pack_biases  sW    ;;t$D99Q_-D~~d#

djjl;<<r   r   r	   r   r   Tr   z!cuDNN bidirectional LSTM failed: .r   )r   r   r   r   r   r   r   r   r[   r   r   r   r   r   r   r   )(r0   fwd_initial_state_hfwd_initial_state_cbwd_initial_state_hbwd_initial_state_crc   
fwd_kernelfwd_recurrent_kernelfwd_bias
bwd_kernelbwd_recurrent_kernelbwd_biasr   r   r   re   r   r   r   r   r   r   r   r   r   r   r   r   r   y_fwdy_bwdfwd_h_nbwd_h_nfwd_c_nbwd_c_nfwd_lastbwd_lastfwd_outputsbwd_outputsr   s(                                          @r   bidirectional_lstmr   P  s   4 !!%>($*>	 "!9 !!!$J&,,Q/KaJ== oo:';<:';<""		
G ))	(	)3;;7J+KLC ))	(	)3;;7J+KLC
 ((J=&,,q/KK!#
3* c<K< Ec;< E 1vs1vWG1vs1vWG
 QU|HQT{Hq#++q01q#++q01 
;' 23	;' 23 u  !04
	z )Z0 !/s3
	s/   G  	H   	G=)G88G= H(H##H(c                    |r|
s|t         j                  d   }t        j                  |      }t        j                        | t        j                  |      }|d   }|d   n0t        j                  d|z        }t        j                  d|z        t        j                  |       } t        j                  |      }|	rt        j
                  | d      } t        j                  | |      |z   }t        j                  |dd      }fd}t        j                  |||      \  }}t        j                  |dd      }|}|s|d d t        j                  d d f   }|||gfS )Nr   r	      r   c                    t        j                  |       z   }t        j                  |dd      \  }}}t        j                  |dd      \  }}} ||z         }	 ||z         }
 ||
|z  z         }|	| z  d|	z
  |z  z   }||fS )Nr   r   r   r	   )r   matmulsplit)hx_th_allx_zx_rx_hh_zh_rh_hzrhhh_newr   r   recurrent_biasr   s                r   stepzgru.<locals>.step   s    

1./.@		#qr2S#		%4S# s+ s+a#g&AQ"$e|r   )r   r   r   r   r   ra   r   swapaxesr   r`   r   )r0   initial_staterc   r   r   r   r   r   r   r)   re   reset_afterr   
input_biasr   x_allr   h_lastrv   ru   r   s       ` ``            @r   grur     s@    &D$4!!"((+K[[ F{{#34{{4 !W
aYYq;/
1{?3[[ F
++m
$C&q)
 JJvv&3ELL1%E hhtS%0OFGll7Aq)GKaa/0&))r   c                      t         r&   )r   )argskwargss     r   bidirectional_grur     s
    
 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   rn   s      r   r'   r'      sB     qwwt}% 	Ate4  s    >)FNNFNFFT)T)FFF)FF)FFFT)r   )r]   r|   r   r   r   r   r   keras.src.backend.commonr   ry   r~   r   r   r   r   r   r'   r4   r   r   <module>r      s        4 	I,X* 	8 _,b !C^ ?*Dr   