
    2Vhۍ                     >   d dl Z 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lm
Z
 d dlmZ d dlmZ d	 Zd
 Zd Zd Zd Zd Zd Zd Zd=dZd Zd Zd>dZd Zd?dZd Zd Zd@dZ	 	 dAdZdBdZ d@dZ!dCdZ"d Z#d=dZ$d  Z%dDd!Z&dDd"Z'dCd#Z(	 	 dEd$Z)	 	 dFd%Z*	 	 	 dGd&Z+	 dDd'Z,	 	 dHd(Z-	 	 	 	 dId)Z.	 	 	 	 dId*Z/	 	 	 	 dId+Z0	 	 	 	 	 dJd,Z1dKd-Z2dKd.Z3dLd/Z4dLd0Z5dMd1Z6dNd2Z7	 dOd3Z8dPd4Z9	 	 dQd5Z:	 	 	 dRd6Z;	 	 	 	 	 dSd7Z<d8 Z=d9 Z>d: Z?d; Z@	 	 	 	 	 	 dTd<ZAy)U    N)lax)backend)+compute_conv_transpose_padding_args_for_jax)cast)convert_to_tensor)	is_tensor)scipyc                     t        |       } t        j                  | t        j                  d| j                              S N        r   npmaximumarraydtypexs    J/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/backend/numpy/nn.pyrelur      s,    !A::a#qww/00    c           	          t        |       } t        j                  t        j                  | t        j                  d| j
                              t        j                  d| j
                              S )Nr         @)r   r   minimumr   r   r   r   s    r   relu6r      sM    !A ::


1bhhsAGG,-rxxQWW/E r   c                     t        |       } t        j                  d| j                        t        j                  d| j                        t        j                  |        z   z  S N      ?)r   r   r   r   expr   s    r   sigmoidr      sD    !A88C!RXXc177%;bffaRj%HIIr   c                 <   t        |       } t        j                  | dk  t        j                  d| j                        t        j                  | dk\  t        j                  d| j                        t        j                  d| dz   z  | j                                    S )Nr      r         ?r   r   wherer   r   r   s    r   sparse_sigmoidr&   "   ss    !A88	R
agg
FBHHS!''*BHHSAE]AGG,L	
 r   c                 ,    t        j                  |       S N)r   tanhr   s    r   r)   r)   -   s    771:r   c                 H    t        |       } | t        j                  |       z
  S r(   )r   r   r)   r   s    r   tanh_shrinkr+   1   s    !Arwwqz>r   c                     t        |       } t        j                  | t        j                  d| j                              S r   )r   r   	logaddexpr   r   r   s    r   softplusr.   6   s,    !A<<288C122r   c                     t        |       } | t        j                  d| j                        t        j                  |       z   z  S r   )r   r   r   r   absr   s    r   softsignr1   ;   s3    !Aagg&233r   c                 .   t        j                  | |kD  t        j                  | |z
  | j                        t        j                  | | k  t        j                  | |z   | j                        t        j                  d| j                                    S )Nr   r   )r   r%   r   r   r   	thresholds     r   soft_shrinkr6   @   sm    88	I
Yagg.

NHHQ]!''2HHS(	
 r   c                     t        j                  | dk  t        j                  | | j                        t        j                  | dk  t        j                  d| dz   dz  z  | j                        |             S )Nr!   r3   r"   g      ?   )r   r%   
zeros_liker   r   r   s    r   sparse_plusr:   L   s\    88	R
aqww'
Q%AEa<!7qwwGK r   c                 4    t        |       } | t        |       z  S r(   )r   r   r   s    r   silur<   T   s    !Awqz>r   c                     t        |       } t        || j                        }| t        j                  | dz  |z         z   }|dz  S )Nr3   r8   )r   r   r   sqrt)r   bys      r   
squareplusrA   Y   s@    !A!177+A	BGGAqD1HAq5Lr   c                 2    t        |       } t        |         S r(   )r   r.   r   s    r   log_sigmoidrC   `   s    !AaRL=r   c                     t        |       } t        j                  | t        j                  || j                        | z        S r(   r   )r   negative_slopes     r   
leaky_relurF   e   s1    !A::a.!'':Q>??r   c                 f   | t        j                  d| j                        z  t        j                  d| j                        z   } t        j                  | dk  t        j                  d| j                        t        j                  | dk\  t        j                  d| j                        |             S )Nr   r#   r   r   )r   r   r   r%   r   s    r   hard_sigmoidrH   j   s~     	
BHHS!''""RXXc177%;;A88	S
agg
c288C115 r   c                     | t        |       z  S r(   )rH   r   s    r   	hard_silurJ   u   s    |Ar   c                     t        |       } t        j                  | t        j                  d| j                        k\  | t        j                  || j                        t        j
                  |       z        S r   )r   r   r%   r   r   expm1r   alphas     r   elurO   y   sT    !A88	RXXc177##Q(@288A;(N r   c                 r    t        |       } t        j                  || j                        t	        | |      z  S r(   )r   r   r   r   rO   )r   rN   scales      r   selurR      s.    
 	!A88E177#c!Um33r   c           
         t        |       } |rt        j                  dt        j                  z        j	                  | j
                        }t        j                  d| j
                        t        j                  d| j
                        t        j                  || t        j                  d| j
                        | dz  j	                  | j
                        z  z   z        z   z  }| |z  S t        j                  d      j	                  | j
                        }| t        j                  j                  | |z        dz   j	                  | j
                        z  t        j                  d| j
                        z  S )Nr8   r#   r   gHm?   r"   )r   r   r>   piastyper   r   r)   r	   specialerf)r   approximatesqrt_2_over_picdfsqrt_2s        r   gelur]      s   !ARUU+22177;hhsAGG$HHS!''"ggrxx!''2ad]]1775KKKM
 3w""177+}}  V,q088ABhhq!''"#	
r   c                 `   t        |       } t        j                  || j                        }t        j                  | t        j                  d| j                              |t        j
                  t        j                  | t        j                  d| j                              |z        z  z   S Nr   r3   )r   r   r   r   r   rL   r   rM   s     r   celur`      s|    !AHHUAGG$E::a#QWW56


1bhhs!''23e;B :  r   c                     t        |       } | j                  |   dz  dk7  rt        d| j                   d|       t        j                  | d|      \  }}|ddt        j
                  |       z   z  z  S )Nr8   r   z4axis size must be divisible by 2. Received: x.shape=z with axis=r"   )r   shape
ValueErrorr   splitr   )r   axisx1x2s       r   glurh      s}    !Awwt}qA!!"	TF<
 	
 XXaD!FBa"&&"+o&''r   c                    t        |       } t        j                  d| j                        }t        j                  d| j                        }t        j                  t        j
                  | ||      | j                        S )N      r   r3   )r   r   asarrayr   r   clip)r   min_valmax_vals      r   	hard_tanhro      sV    !Ajjqww'Gjjagg&G88BGGAw0@@r   c           
      .   t        |       } t        j                  || j                        }t        j                  t        j
                  t        j                  |       |kD  | t        j                  d| j                              | j                        S r_   )r   r   rk   r   r   r%   r0   r4   s     r   hard_shrinkrq      sd    !A

9agg.I88
Y&288Cqww+GHgg r   c                     t        |       } t        j                  | |kD  | t        j                  || j                              S )Nr3   r$   )r   r5   default_values      r   r5   r5      s2    !A88A	M1bhh}AGG&LMMr   c                     t        j                  | t        j                  | |d      z
        }|t        j                  ||d      z  S NTre   keepdims)r   r   maxsum)r   re   exp_xs      r   softmaxr{      s:    FF1rvvadT::;E266%dT:::r   c                     t        j                  | |d      }t        j                  t        j                  | |z
        j	                  |d            }| |z
  |z
  S ru   )r   rx   logr   ry   )r   re   max_x	logsumexps       r   log_softmaxr      sN    FF14$/Ervva%i(,,$,FGIu9y  r   c                    t        |       } dt        j                  d| z  |      z  }t        j                  ||      }t        j                  d| j
                  |   dz         }dg| j                  z  }d||<   |j                  |      }||dz
  |z  z
  dkD  }t        j                  ||d      }t        j                  ||d      }t        j                  ||d      dz
  |z  }	t        j                  | |	z
  d      }
|
S )	Nrj   re   r"   r!   r   Trv   r   )r   r   sortcumsumarangerb   ndimreshapery   r%   r   )logitsre   logits_sortedlogits_cumsumrr_shapesupportklogits_cumsum_safetauoutputs              r   	sparsemaxr      s    v&F2774&=t<<MIIm$7M
		!V\\$'!+,AcFKKGGDM			'A}q0A559G
wTD1A'=#>66$4$?!Cq
HCZZc*FMr   c                 f    t        | t              r| f|z  n| } |s| S |dk(  r
d| z   dz   } | S d| z   } | S )Nchannels_lastr"   )r"   r"   )
isinstanceint)r   num_spatial_dimsdata_formatinclude_batch_and_channelss       r   _convert_to_spatial_operandr      sP     $.a#51A%o%1HtO H !OHr   c           
          |dvrt        d| d      |j                         }t        j                  t	        j
                  | |||||            S )aC  Helper function to define pooling functions.

    Args:
        inputs: input data of shape `N+2`.
        initial_value: the initial value for the reduction.
        reduce_fn: a reduce function of the form `(T, T) -> T`.
        pool_size: a sequence of `N` integers, representing the window size to
            reduce over.
        strides: a sequence of `N` integers, representing the inter-window
            strides (default: `(1, ..., 1)`).
        padding: either the string `same` or `valid`.

    Returns:
        The output of the reduction for each window slice.
    )samevalidzInvalid padding 'z', must be 'same' or 'valid'.)rc   upperr   r   r   reduce_window)inputsinitial_value	reduce_fn	pool_sizestridespaddings         r   _poolr      se    . ''y(EF
 	
 mmoG88	
	 	r   c                     t        j                  |      }| j                  dz
  }t        |||      }||n|}t        |||      }t	        | t
        j                   t        j                  |||      S )Nr8   )	r   standardize_data_formatr   r   r   r   infr   rx   )r   r   r   r   r   r   s         r   max_poolr     st     11+>K{{Q+#[I #?iG)!;G "&&#''9gwGGr   c                    t        j                  |      }| j                  dz
  }t        |||      }||n|}t        |||      }t	        | dt
        j                  |||      }|dk(  r|t        j                  |      z  S t        | j                  |      D cg c]  \  }}|dk7  r|nd }	}}t	        t        j                  |	| j                        dt
        j                  |||      }
||
z  S c c}}w )Nr8   r   r   r"   )r   r   r   r   r   r   addr   prodziprb   onesr   )r   r   r   r   r   r   pooledar?   rb   window_countss              r   average_poolr   0  s    11+>K{{Q+#[I #?iG)!;G 63GWEF'	*** 036<</K
%+a!q&Qa
 
 GGE6<<(GG
 %%
s   C0c                 N   | dz   }|dk(  r#t        t        d|dz
              }d|dz
  f|z   }nt        t        d|            }d|z   }|r#|dz
  |dz
  ft        t        |dz
              z   }n"|dz
  |dz
  ft        t        |dz
              z   }t        j                  |||      S )z9Create a `lax.ConvDimensionNumbers` for the given inputs.r8   r   r"   r   r   r"   )lhs_specrhs_specout_spec)tupleranger   ConvDimensionNumbers)r   r   	transposenum_dimsspatial_dims	inputs_dn	kernel_dns          r   &_convert_to_lax_conv_dimension_numbersr   X  s      !#Ho%U1hl341%4	U1h/0\)	\8a<05x!|9L3MM	\8a<05x!|9L3MM	##Y r   c                    t        j                  |      }| j                  dz
  }t        ||d      }t	        |||d      }t	        |||d      }|dk(  r| j
                  d   }n| j
                  d   }|j
                  d   }	||	z  d	kD  rt        d
| d|	 d      ||	z  }
t        j                  t        j                  j                  | t        |      r|n|j                         |||||
            S )Nr8   Fr   r   r   r!   r"   r   zgThe number of input channels must be evenly divisible by kernel's in_channels. Received input channels z and kernel in_channels z. rhs_dilationdimension_numbersfeature_group_count)r   r   r   r   r   rb   rc   r   r   jaxr   conv_general_dilatedr   numpy)r   kernelr   r   r   dilation_rater   r   channelskernel_in_channelsr   s              r   convr   q  s,    11+>K{{Q>
 *#(	G 0#(	M o%<<#<<?b)$$q(==EJ G""4!5R9
 	

 #&8888$$'FV\\^&/ 3 	% 	

 
r   c                     t        j                  |      }| j                  dz
  }t        ||d      }t	        |||d      }t	        |||d      }|dk(  r| j
                  d   n| j
                  d   }t        j                  t        |      r|n|j                         |j
                  d d d||j
                  d   z  fz         }t        j                  t        j                  j                  | ||||||	            S )
Nr8   Fr   r   r   r!   r"   r   r   )r   r   r   r   r   rb   r   r   r   r   r   r   r   r   )	r   r   r   r   r   r   r   r   r   s	            r   depthwise_convr     s    11+>K{{Q>
 *#(	G 0#(	M (?:RQ  ZZF#SbQ 3fll26F FGGF 88$$&/ 3 	% 	

 
r   c                 n    t        j                  |      }t        | |||||      }t        ||dd||      S )Nr"   r   )r   r   r   r   )r   r   r   r   )r   depthwise_kernelpointwise_kernelr   r   r   r   depthwise_conv_outputs           r   separable_convr     sR     11+>K* # r   c                    t        j                  |      }| j                  dz
  }t        | j                  |j                  ||||      }t        ||d      }	t        |||d      }t        |||d      }t        j                  t        j                  j                  | t        |      r|n|j                         ||||	d            S )Nr8   )input_shapekernel_shaper   r   output_paddingr   Fr   r   T)r   r   r   transpose_kernel)r   r   r   r   rb   r   r   r   r   r   r   conv_transposer   r   )
r   r   r   r   r   r   r   r   padding_valuesr   s
             r   r   r     s     11+>K{{Q@LL\\%#N ?
 *#(	G 0#(	M 88'FV\\^"&/! 	 	

 
r   c                    |rt        d      t        |       } | j                  }| j                  d      } |st	        j
                  |       dz   }| j                  d   }t	        j                  ||f|      }| dk\  }d|t	        j                  |      |   | |   f<   ||fz   }	t	        j                  ||	      }|dk7  rt	        j                  |d|      }|S )N2Unsupported value `sparse=True` with numpy backendr!   r"   r   r3   )	rc   r   rb   r   r   rx   zerosr   moveaxis)
r   num_classesre   r   sparser   
batch_sizecategoricalvalid_indicesoutput_shapes
             r   one_hotr   "  s    MNN!A''K			"AffQi!mJ((J4EBKFMJKK		*%m4a6FFG +/L**[,7K rzkk+r48r   c                     |rt        d      t        |       } t        | j                        dkD  rdnd}t	        j
                  t        t        | d      |||      |      }|S )Nr   r"   r   int32)re   r   r   )rc   r   lenrb   r   rx   r   r   )r   r   re   r   r   reduction_axisoutputss          r   	multi_hotr   <  s^    MNN!Aagg,*QNffQ +DFG Nr   c                 ~   t        j                  |       } t        j                  |      }| j                  |j                  k7  r%t        d| j                   d|j                         t	        | j                        dk  r%t        d| j                   d|j                         |rt        ||      }nn|t        j                  ||d      z  }t        j                  |t        j                         dt        j                         z
        }t        j                  |      }t        j                  | |z  |       S )	NQArguments `target` and `output` must have the same shape. Received: target.shape=, output.shape=r"   zPArguments `target` and `output` must be at least rank 1. Received: target.shape=r   Trw   r   )r   r   rb   rc   r   r   ry   rl   r   epsilonr}   targetr   from_logitsre   log_probs        r   categorical_crossentropyr   H  s
   XXfFXXfF||v||#"LL>H
 	

 6<<1"LL>H
 	
 vD1"&&==!2C'//:K4KL66&>FF6H$4000r   c                 L   t        j                  | d      } t        j                  |      }t        | j                        t        |j                        k(  r)| j                  d   dk(  rt        j                  | d      } t        |j                        dk  rt        d|j                         | j                  |j                  d d k7  r%t        d| j                   d|j                         |rt        ||      }nn|t        j                  ||d	
      z  }t        j                  |t        j                         dt        j                         z
        }t        j                  |      }t        | |j                  |   |      } t        j                  | |z  |       S )Nr   r3   r!   r"   r   zBArgument `output` must be at least rank 1. Received: output.shape=zcArguments `target` and `output` must have the same shape up until the last dimension: target.shape=r   Tr   r   )r   r   r   rb   squeezerc   r   ry   rl   r   r   r}   r   r   s        r   sparse_categorical_crossentropyr   b  sY   XXfG,FXXfF
6<<C--&,,r2Ba2GF,
6<<1"LL>+
 	

 ||v||CR(("LL>H
 	

 vD1"&&==!2C'//:K4KL66&>VV\\$/d;FFF6H$4000r   c                    t        j                  |       } t        j                  |      }| j                  |j                  k7  r%t        d| j                   d|j                         |rt	        |      }t        j
                  |t        j                         dt        j                         z
        }| t        j                  |      z  }|d| z
  t        j                  d|z
        z  z  }| S )Nr   r   r   )	r   r   rb   rc   r   rl   r   r   r}   )r   r   r   bces       r   binary_crossentropyr  ~  s    XXfFXXfF||v||#"LL>H
 	
 WWVW__.goo6G0GHF
266&>
!CC&LBFF3<000C4Kr   c                    |rt        d      t        |t              rt        |      n|}d}t	        j
                  | j                        }|dk(  rd}t        | d      } t        j                  | |d      }t        j                  t        j                  |       |d      t        j                  |      z
  }|s,t        j                  ||      }t        j                  ||      }|rt        j                  |t        j                  t        j                        j                  t        j                  t        j                        j                         }t        j                  |t        j                  t        j                        j                  t        j                  t        j                        j                         }t        ||      }t        ||      }||fS )Nz7Argument synchronized=True is not supported with NumPy.Ffloat16Tfloat32r   rv   )NotImplementedErrorr   listr   r   standardize_dtyper   r   r   meansquarer   rl   finfor  minrx   )r   axesrw   synchronized	need_cast	ori_dtyper  variances           r   momentsr    sW   !E
 	
 %T405;dD I))!''2II	I771dT*D wwryy|$>4PHzz$%::h-wwtRXXbjj155rxx

7K7O7OP77bhhrzz*..0D0H0H
 D)$),>r   c                 v   dgt        | j                        z  }|j                  d   ||<   t        j                  ||      }t        j                  ||      }dt        j                  ||z         z  }|t        j                  ||      }||z  }| |z  }	|t        j                  ||      }|	|z   }	| |z  |	z   S )Nr"   r   r   )r   rb   r   r   r>   )
r   r  r  re   offsetrQ   r   rb   invress
             r   batch_normalizationr    s     C#agg,E**Q-E$K::dE"Dzz(E*H
7*+
+C

5%(Ek%#+CFE*Fls7S=r   c                    t        | d      } t        |      }t        |d      }t        |d      }|j                  \  }}| j                  \  }dt        j                  |j                  d      }|j                  |      }d }	 |	||      }
 |	||      }|
j                  |j                        }
|j                  |j                        }t        |d      }|t        j                  |
d      j                  t        j                        z
  }| d d d df   | d d dd f   k(  j                  t        j                        t        j                  d	      |d d d d ||dz   f   }t        j                  |d
      }t        | |      }t        j                  d||      }t        j                  |d
      }t        j                  |dz   f|j                        z  }d|d d df<   t        j                  |f|j                        z  }d fd}d }|||j                  d      f} ||||f|      \  }\  }} |d   |d         }||d<   t        ||dz         }t        j                  d||       }|S )Nr   r3   g     jr  c                     t        j                  |      j                  d| j                  z  |fz         }t        j                  | d      } || k  }t        j
                  |      S )Nr   r!   r   )r   r   r   r   expand_dimslogical_not)lengths
max_lengthindices
elem_valids       r   _lengths_to_paddingsz&ctc_loss.<locals>._lengths_to_paddings  sY    ))J'//7<<:-/
 ..r2w&
~~j))r   r!   r   r"   )r   r   r   r"   r   r8   )r   zbtk,bnk->btnr   r   c           	          t        j                  | d d d df   t        j                  | d d dd f   |      gd      S )Nr"   r!   r   )r   concatenater-   )phiadded_scores     r   update_phi_scorez"ctc_loss.<locals>.update_phi_score  s>    ~~BQBZc!QR%j+>?b
 	
r   c                 (   | \  }}|} ||z  z         }|\  }}}t        j                  |d d d df   |z   ||z         }||z   }	 |	||z   dz
  z  z         }	|j                  
df      }||z  d|z
  |z  z   }||z  d|z
  |	z  z   }	|	|f|	|ffS )Nr!   r   r"   )r   r-   r   )prevr   prev_phi	prev_emitprev_phi_origlogprob_emitlogprob_phipad	next_emitnext_phir   log_epsilonrepeatr&  s             r   	loop_bodyzctc_loss.<locals>.loop_body  s    ") #Hi+:N.NO)*&k3 LLQV|+Y-E
	 k)#i+-sV|0LL
 kk:q/*)OsSyI&==	&#)x)??)$x&;;;r   c           
         |}g }t        | D ]  } | ||      \  }}|j                  |       ! g }t        t        |d               D ]7  }|j                  t	        j
                  |D cg c]  }||   	 c}             9 ||fS c c}w )Nr   )r   appendr   r   r   stack)	finitxscarryysr   r@   resultis	            r   np_scanzctc_loss.<locals>.np_scan   s    b 	A{HE1IIaL	 s2a5z" 	8AMM"(("#5QAaD#567	8f} $6s   )Br"   r   zbn,bn->b)r   rb   r   result_typer   rV   r   r   ry   r   r  r.  r   r   einsumr   )r   r   target_lengthoutput_length
mask_indexmax_input_lengthr   max_label_lengthr   r  target_paddingsoutput_paddingslogprobslabel_lengthslogprobs_phi_one_hotlogprobs_emitlogalpha_phi_initlogalpha_emit_initr3  r>  r9  _logalpha_philogalpha_emitlogalpha_phi_lastper_seq_lossr   r1  r2  r&  s                              @@@@r   ctc_lossrU    s    vW5Fv&F%mW=M%mW=M06-J +#)<< J K i8E]]5!F* +=:JKO*=:JKO%,,V\\:O%,,V\\:O6+H$rvvoA'F'M'M
( M
 QVnq!"u-55bjjAFVVF,-FAq*zA~"==>L<<i8Lv;7HIInhAMLL	:M 	-12&,,G
	  "ad
-.fllC
	 

<2	 '@'@'H	IB'.%'9:B($A$m
 )b)9=;LM(L }2BQ2FGHIIj*;XFFLr   c                    t        |       } t        |d      }| j                  \  }}}||dz
  }t        j                  | d      j	                  d      }t        j
                  | d      }t        j                  |      d d d f   }	|	|d d d f   k\  }	t        j                  |	||      }t        j                  |	d|      }|rD|d d dd f   |d d d df   k(  }
t        j                  |
d      }
t        j                  |
||      }||k(  }t        j                  |d|      }t        j                  t        j                  |      d      }t        j                  ||df      }t        j                  |||      }t        j                  |d      }t        j                  ||d      }t        j                  |d      d d d f    }t        j                  |d      }||fS )	Nr   r3   r"   r!   r   r   )r   r?  r   )r   rb   r   argmaxrV   rx   r   r%   r.  r  tileargsorttake_along_axisry   )r   sequence_lengthsmerge_repeatedrD  r   r  r   r  scoresseqlen_maskrepeat_maskinvalid_maskorders                r   _ctc_greedy_decoderb  ;  s    v&F()9I*0,,'J
K 1_
iiR(//8GVVF$F))J'a0K!1!T'!::Khh{J8GXXk3/Faen3B37ff[*:;((;
G< j(Lhh|R1G NN299Z0q9EGGEJ?+EHH\:u5EJJu2&E  %b9GffV!$QW--FnnW1-GF?r   c                 (   t        |       } t        |      }| j                  \  }}t        | d      } t        j                  |      d d d f   |d d d f   k\  }dz
  t        j
                  | d      } z
  dz
  dt        j                  |dz  |ft        j                        }t        j                  t        j                  g            }	t        j                  | d d df   d      d d |	 d f   }
t        j                  |
k(  |
      }||d d d |	df<   t        j                  |dz  ft        j                   | j                        }t        j                  | d d df   |
d      |d d d |	f<   |d d d d df   k(  }fdd fd	fd
fdfd}t        |||| |      D cg c]  \  }}}}} ||||||       }}}}}}t        j                   |D cg c]  }|d   	 c}      }t        j                   |D cg c]  }|d   	 c}      }t        j                  |k(  |z
  dz
        }t        j"                  |g d      }||fS c c}}}}}w c c}w c c}w )Nr!   r   r"   r8   r3   r   c                 F   t        j                  | d      } t        j                  |      }t        j                  |      }t        j                  | 
k(  d      }t        j                  dz  z        }| ||dz
  f   }t        j                  |dk(  
|      }t        j                        }
|<   t        j
                  |dz        }|}|
k(  }| ||k(  z  }	t        j                  |	
|      }|| ||f<   t        j
                  |dz        }||z   }| ||fS )Nr   r   r"   r8   )r   r2  rW  r   r%   rX  )pathsr]  maskedr   path_tail_indexpaths_arange
path_tailsclassesprev_maskedmasked_repeat_pad
beam_widthrD  r   s             r   _extend_pathsz._ctc_beam_search_decode.<locals>._extend_paths  s!   		%156;/6;/))ETM:yyZ+!=><1)<<=
XXo2D*E
))K("
'''1z>2D$
g(=>((=$8/6lO+,GGAq:~&!ff$$r   c                     t        j                  |      }t        j                  ||z
        }t        j                  |      }t	        |       D ]  \  }}||xx   ||   z  cc<    t        j
                  |      |z   }|S r(   )r   rx   r   r9   	enumerater}   )unique_inverser]  
scores_max
scores_expr=  us         r   _merge_scoresz._ctc_beam_search_decode.<locals>._merge_scores  sq    VVF^
VVFZ/0
v&n- 	'DAq1IA&I	'*,r   c                 J   t        j                  | dd      \  } }dz  z  t        |       z
  }|dkD  rt        j                  | d|gddgg
      } | d dz  z   } t        |j                        dk\  rt        j
                  |d      }t        j                  |t         j                   |      }t        j                  ||t         j                         } 	||      } 	||      }t        j                  ||      }t        j                  |d	       d  }| |   } ||   }||   }t        j                  | d
      } t        j                  ||g      }t        j                  t        j                  t              t        j                  t              g      }| ||fS )NTr   return_inversere   r8   constant_valuesr"   r   stable)kind)r8   r"   )r   uniquer   r.  rb   r   r%   r   r-   rY  rX  r#  r   boolr   )re  r]  rf  rr  pad_sizeemit_scoresmask_scorestotal_scorestop_indicesrv  rm  rn  r   s            r   _prune_pathsz-_ctc_beam_search_decode.<locals>._prune_paths  s}    "		%1 M~Oj0CJ>a<FF5Ax=1a&"94PE4K*45~##$)ZZQ?Nhhvw7hhvvw7#NK@#NK@||K=jjH=zklKk"!+.!+.v&k :;XXj$'T)BC
 ff$$r   c                 H     | |||      \  } }} | ||      \  } }}| ||fS r(    )re  r]  rf  r   ro  r  s       r   _decode_stepz-_ctc_beam_search_decode.<locals>._decode_step  s<     -eVVQ Gvv ,UFF Cvvff$$r   c                 J    | \  }}}|\  }}|s ||||      \  }}}|||fd fS r(   r  )r(  r   re  r]  rf  r^  r  s         r   _stepz&_ctc_beam_search_decode.<locals>._step  sD     $vv;$0$J!E66vv&,,r   c                    d } || ||f|dd  |dd  f      \  \  }}}}	t        j                  |dd      \  }}
dz  z  t        |      z
  }|dkD  rt        j                  |d|gddgg      }|d dz  z   }t        |
j                        dk\  rt        j
                  |
d      }
 |
|      }t        j                  |       d  d d d	   }||   }||   }||fS )
Nc                 @    |}t        | D ]  } | ||      \  }} |d fS r(   )r   )r7  r8  r9  r:  r   r@   s         r   np_scan_only_carryzJ_ctc_beam_search_decode.<locals>._decode_batch.<locals>.np_scan_only_carry  s3    E"X 'UA;q'$;r   r"   Tr   rx  r8   rz  r   r!   )r   r~  r   r.  rb   r   rY  )
init_pathsinit_scoresinit_maskedr   r^  r  re  r]  rf  rP  rr  r  r  rv  rm  r  rn  r   	top_pathss                r   _decode_batchz._ctc_beam_search_decode.<locals>._decode_batch  s   	 &8k2ABZQR)&
" !#		%1 M~Oj0CJ>a<FF5Ax=1a&"94PE4K*45~##$)ZZQ?N~v6jj()5dd;k"$f}r   r!  )r   rb   r   r   r   flipfullr   r  r   rY  r%   r   r   rZ  r   r6  r   )r   r[  rn  r  rD  r   max_seq_lenr^  r  num_init_pathsmax_classesinit_classesr  r  r  psmr=  smresultsr   re  r]  r  ro  rv  rm  r  r  r   s     ```                   @@@@@@@r   _ctc_beam_search_decoder  f  s    v&F()9:+1<<(J[b)F))K(q15Eag5NNK 1_
 WWV!$Fz)A-JD	Q^[14rxxJ VVBHHk:%>?@N**VAqD\21~o6F3FGK88K:5t[IL(4Jq/>/1$%''	Q^$rvvgV\\K ')&8&8q!tk'K?N?"# Q1W%-K%4%<%
- @ "[&+
 Aq!Q 	aAq"%G  HHG,qad,-EXXW-qt-.F HHUd]D+*=*ABELL	*E&= --s   JJ
2Jc                     t        |       } t        j                  | j                  d      }t	        | |      } |dk(  rt        | |||      S |dk(  rt        | ||||      S t        d| d      )Nr  greedy)r\  rD  beam_search)rn  r  rD  zInvalid strategy z2. Supported values are 'greedy' and 'beam_search'.)r   r   r@  r   r   rb  r  rc   )r   r[  strategyrn  r  r\  rD  r   s           r   
ctc_decoder    s     v&Fi8E&% F8!)!	
 	
 
]	"&!!
 	
 z ** *
 	
r   c                 j   | j                   |j                   k7  r&t        d| j                    d|j                    d      t        ||j                        }t	        j
                  t	        j                  | |z
              }dt	        j                  |      z  dt	        j                  |      z  z
  }|S )NzInput shapes z and z" must match for PSNR calculation. r3      
   )rb   rc   r   r   r   r  r	  log10)rf   rg   rn   msepsnrs        r   r  r  .  s    	xx288BHH:U288* 5+ +
 	

  rxx8G
''"))BG$
%C!!B#$66DKr   c                 r    t        j                  |       } | dk(  rdnd}t        j                  |dz  |       S )Nr  g    @g̓$Ggffffffr3   )r   r  r   rk   )r   vals     r   _get_large_negativer  ;  s5    %%e,Ei''ZC::cDj..r   c                    ||s| S t        j                  | t         j                        }|t        j                  ||      }|r{| j                  d   | j                  d   }}t        j
                  t        j                  ||ft         j                              }|d d d d d d f   }t        j                  ||      }t        j                  || t        | j                              }|S )Nr3   r8   rT   )
r   	ones_likebool_logical_andrb   trilr   r%   r  r   )r   mask	is_causalcombined_maskTSpadded_logitss          r   _apply_masksr  A  s    |ILLrxx8M}d;||AQ1wwrww1vRXX67D$1$%}d;HHv26<<@M r   c                 Z   |j                   }t        j                  | j                   t        j                        }t	        j
                  |j                         dk(  r"|j                  d      }|j                  d      }t        j                  d| |      }	|	j                  |      }	|	t        j                  ||	j                         z  }	||	|z   j                  |	j                         }	t        |	||      }
|
j                  t        j                        }
t        |
d      j                  |      }|j                   }t	        j
                  |j                         dk(  r"|j                  d      }|j                  d      }t        j                  d||      }|j                  |      }|S )Nbfloat16r  zBTNH,BSNH->BNTSr3   r!   r   zBNTS,BSNH->BTNH)r   r   promote_typesr  r   r  rV   rA  r   r  r{   )querykeyvaluebiasr  r  rQ   original_dtypelogits_dtyper   r  probsencoded_dtypeencodeds                 r   _dot_product_attention_xlar  U  sM   YYN##EKK<L  +z9jj#Y'YY(%5F]]<(F
bhhuFLL11F4-''5 y9M "((4MM+22>BEKKM  -;Y'Y'ii)5%8Gnn]+GNr   c	           	      x   |d}|rt        d      t        |       } t        |      }t        |      }t        | j                        dk7  r3t        d| j                   d|j                   d|j                   d      |j                  \  }	}	}	}
|dt	        j
                  |
      z  n|}t        | ||||||      S )	NFz2Flash attention is not supported in numpy backend.   zG`dot_product_attention` only supports 4D inputs. Received: query.shape=z, key.shape=z, value.shape=.r   )rc   r   r   rb   r   r>   r  )r  r  r  r  r  rQ   r  flash_attentionattn_logits_soft_caprP  Hs              r   dot_product_attentionr  r  s     MNN
 e$E
C
 Ce$E
5;;1%%*[[Mcii[ I ;;-q*
 	

 JAq!Q"'-S2771:UE%sE4y% r   )r#   )r  )g?)r   )g,x?g2֫?)T)r!   r(   )r   T)Nr   )Nr   N)r   F)r"   r   Nr"   )r"   r   NNr"   )r!   r  F)Fr!   )F)FF)NNgMbP?)r   )TN)d   r"   N)r  r  r"   Tr   )NNNFNN)Br   r   r   r   	keras.srcr   &keras.src.backend.common.backend_utilsr   keras.src.backend.numpy.corer   r   r   keras.src.utils.module_utilsr	   r   r   r   r&   r)   r+   r.   r1   r6   r:   r<   rA   rC   rF   rH   rJ   rO   rR   r]   r`   rh   ro   rq   r5   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  rU  rb  r  r  r  r  r  r  r  r  r   r   <module>r     s   
    . : 2 .1
J

3
4
	

@
 ,
+4
,(AN
;
!*  #	, %V H0 %&T  8 1n ,f > /d4	1418( H ?C*nh 	(\ bP  
F
/(B 
	
 r   