
    2VhO                        d dl Z 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 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d Zd?dZd>dZd@dZd Z d;dZ!d Z"d@dZ#d@dZ$d@d Z%d! Z&d" Z'	 	 	 dAd#Z(	 	 	 dAd$Z)d% Z*	 	 	 	 dBd&Z+	 	 	 	 dBd'Z,	 	 	 	 dBd(Z-	 	 	 	 	 dCd)Z.dDd*Z/dDd+Z0d, Z1dEd-Z2dEd.Z3dFd/Z4dGd0Z5d1 Z6d2 Z7	 dHd3Z8	 dId4Z9	 	 	 	 	 dJd5Z:d6 Z;d7 Z<d8 Z=d9 Z>	 	 	 	 	 	 dKd:Z?y)L    N)backend)#compute_conv_transpose_output_shape)cast)convert_to_tensorc                 @    t         j                  j                  |       S N)tfnnreluxs    O/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/backend/tensorflow/nn.pyr   r          55::a=    c                 @    t         j                  j                  |       S r   )r	   r
   relu6r   s    r   r   r      s    55;;q>r   c                 V    | }t         j                  j                  |       }||_        |S r   )r	   r
   sigmoid_keras_logits)r   logitsoutputs      r   r   r      s&    FUU]]1F!FMr   c                    t        |       } t        j                  | dk  t        j                  d| j                        t        j                  | dk\  t        j                  d| j                        d| dz   z              S )N        dtype         ?      ?)r   r	   whereconstantr   r   s    r   sparse_sigmoidr"      sa    !A88	R
Cqww'
aS8#Q-H r   c                 @    t         j                  j                  |       S r   )r	   r
   tanhr   s    r   r$   r$   &   r   r   c                 F    | t         j                  j                  |       z
  S r   )r	   mathr$   r   s    r   tanh_shrinkr'   *   s    rww||Ar   c                 @    t         j                  j                  |       S r   )r	   r&   softplusr   s    r   r)   r)   .   s    77Ar   c                 @    t         j                  j                  |       S r   )r	   r
   softsignr   s    r   r+   r+   2   s    55>>!r   c                     t        j                  | |kD  | |z
  t        j                  | | k  | |z   t        j                  |                   S r   )r	   r    
zeros_liker   	thresholds     r   soft_shrinkr0   6   sD    88	I	I
iZYa0@A r   c                     t        j                  | dk  t        j                  |       t        j                  | dk  dt        j                  | dz   d      z  |             S )Nr   r   g      ?   )r	   r    r-   powr   s    r   sparse_plusr4   >   sN    88	R
a
Q"&&Q"22A6 r   c                 @    t         j                  j                  |       S r   )r	   r
   silur   s    r   r6   r6   F   r   r   c                     t        |       } t        || j                        }| t        j                  t        j                  |       |z         z   }|dz  S )Nr   r2   )r   r   r	   sqrtsquare)r   bys      r   
squareplusr<   J   sE    !A!177+A	BGGBIIaL1$%%Aq5Lr   c                 @    t         j                  j                  |       S r   )r	   r&   log_sigmoidr   s    r   r>   r>   Q   s    77q!!r   c                 D    t         j                  j                  | |      S )N)alpha)r	   r
   
leaky_relu)r   negative_slopes     r   rA   rA   U   s    55A^44r   c                     t        |       } t        | t        j                  d| j                        z         t        j                  d| j                        z  S )Ng      @g      @)r   r   r	   r!   r   r   s    r   hard_sigmoidrD   Y   s?    !AR[[agg../"++c1772KKKr   c                     | t        |       z  S r   )rD   r   s    r   	hard_silurF   ^   s    |Ar   c                     t         j                  j                  |       }|dk(  r|S t        j                  | dkD  |||z        S )Nr   r   )r	   r
   elur    )r   r@   ress      r   rH   rH   b   s:    
%%))A,Cz
xxAsECK00r   c                 @    t         j                  j                  |       S r   )r	   r
   selur   s    r   rK   rK   j   r   r   c                 Z    t        |       } t        j                  j                  | |      S )N)approximate)r   r	   r
   gelu)r   rM   s     r   rN   rN   n   s#    !A55::a[:11r   c                     t        j                  | d      |t         j                  j                  t        j                  | d      |z        z  z   S )Nr   )r	   maximumr&   expm1minimum)r   r@   s     r   celurS   s   sC    ::a


1cU") !  r   c                     | j                   |   dz  dk7  rt        d| j                    d|       t        j                  | d|      \  }}|t        j                  |      z  S )Nr2   r   z4axis size must be divisible by 2. Received: x.shape=z with axis=)num_or_size_splitsaxis)shape
ValueErrorr	   splitr   )r   rV   x1x2s       r   glur\   y   sh    wwt}qA!!"	TF<
 	
 XXaAD9FB

2r   c                 2    t        j                  | dd      S )Ng      r   )clip_value_minclip_value_max)r	   clip_by_valuer   s    r   	hard_tanhra      s    Ad3GGr   c                     t        j                  t        j                  |       |kD  | t        j                  |             S r   )r	   r    absr-   r.   s     r   hard_shrinkrd      s+    88BFF1I	)1bmmA.>??r   c                 6    t        j                  | |kD  | |      S r   )r	   r    )r   r/   default_values      r   r/   r/      s    88A	M1m44r   c                 "   | }|bt        j                  | dg      }t         j                  j                  |d      }t        j                  |t        j                  |             }n!t         j                  j                  | |      }||_        |S Nr   rV   )r	   reshaper
   softmaxrW   r   )r   rV   r   r   s       r   rk   rk      sq    F| At$vB/FBHHQK0qt,!FMr   c                 
   |at        j                  | dg      }t         j                  j                  |d      }t        j                  |t        j                  |             S t         j                  j                  | |      S rh   )r	   rj   r
   log_softmaxrW   )r   rV   r   s      r   rm   rm      sg    | At$""6"3zz&"((1+..55QT**r   c                 |   t        |       } t        j                  | d|      }t        j                  ||      }t        j                  dt        j
                  |       |   dz   | j                        }dgt        | j
                        z  }d||<   t        j                  ||      }||dz
  |z  z
  dkD  }t        j                  ||d      }t        j                  t        j                  || j                        |d	
      }t        j                  ||d	
      dz
  |z  }	t        j                  | |	z
  d      }
|
S )N
DESCENDING)	directionrV   ri   r   r   r   r   r   TrV   keepdims)r   r	   sortcumsumrangerW   r   lenrj   r    
reduce_sumr   rP   )r   rV   logits_sortedlogits_cumsumrr_shapesupportlogits_cumsum_safektaur   s              r   	sparsemaxr      s   v&FGGFlFMIIm$7M
BHHV$T*Q.fllCAcC%%GGDM


1gA}q0A559G'=#>
bgggv||44$OA==+$FJa
OCZZc*FMr   c                    t        | j                        dz
  }|dk(  rt        j                  | d      } | S |dk(  rt        j                  | d      } | S |dk(  rt        j                  | d      } | S t	        d| j                   d      )	Nr2   r   r   r2   r   )r   r2      r   r   )r   r2   r      r   zePooling inputs's shape must be 3, 4 or 5, corresponding to 1D, 2D and 3D inputs. But received shape: .)rv   rW   r	   	transposerX   )inputsnum_spatial_dimss     r   _transpose_spatial_inputsr      s    6<<(1, 1fi0 M 
Q	fl3 M 
Q	fo6 M	 228,,qB
 	
r   c                     t        | j                        dz
  }|dk(  rt        j                  | d      } | S |dk(  rt        j                  | d      } | S |dk(  rt        j                  | d      } | S )Nr2   r   r   )r   r   r   r2   r   )r   r   r   r2   r   )rv   rW   r	   r   )outputsr   s     r   _transpose_spatial_outputsr      su    7==)A-1,,w	2
 N	 
Q	,,w5 N 
Q	,,w8Nr   c                     t        j                  |      }||n|}|j                         }t        dt	        | j
                              }|dk(  rt        |       } t        j                  j                  | ||||      }|dk(  rt        |      }|S Nchannels_lastchannels_first)r   standardize_data_formatupper_convert_data_formatrv   rW   r   r	   r
   max_poolr   r   	pool_sizestridespaddingdata_formattf_data_formatr   s          r   r   r           11+>K"?iGmmoG)/3v||;LMN&& +62eennG &&,W5Nr   c                     t        j                  |      }||n|}|j                         }t        dt	        | j
                              }|dk(  rt        |       } t        j                  j                  | ||||      }|dk(  rt        |      }|S r   )r   r   r   r   rv   rW   r   r	   r
   avg_poolr   r   s          r   average_poolr      r   r   c                     | dk(  r!|dk(  ry|dk(  ry|dk(  ryt        d| d	      | d
k(  r!|dk(  ry|dk(  ry|dk(  ryt        d| d	      t        d|  d      )Nr   r   NWCr   NHWC   NDHWCzInput rank not supported: z. Expected values are [3, 4, 5]r   NCWNCHWNCDHWzInvalid data_format: z9. Expected values are ["channels_first", "channels_last"])rX   )r   ndims     r   r   r     s    o%19QYQY,TF 30 0  
(	(19QYQY,TF 30 0 
 #K= 1F F
 	
r   c                 \   	  fd	t        j                  d      	fd       }dk(  xr t         j                        dk(  }t	        j
                        dk(  r j                  d   }n j                  d	   }|xs |j                  d
   k7  }|r |       S  	       S )Nc                      t        t        j                              } t        j                  j                  j                         |       S )Nr   	dilations)r   rv   rW   r	   r
   convolutionr   )r   r   dilation_rater   kernelr   r   s    r   _convzconv.<locals>._conv7  sL    -k3v||;LMuu  MMO&# ! 
 	
r   T)jit_compilec                               S r    )r   s   r   	_conv_xlazconv.<locals>._conv_xlaD  s
    wr   r   r   r   r   r   )r	   functionrv   rW   r   r   )
r   r   r   r   r   r   r   	needs_xlachannelsr   s
   ``````   @r   convr   /  s    	
 	
 [[T" # //JC4E4JI11+>Ko%<<#<<?9Xb)99I{wr   c                    t        j                  |      }t        | j                        dz
  }|dkD  rt	        d| j
                   d      t        |d      }|j                         }t        |t              r|f|z  }t        |t              r|f|z  }|dk(  r|dk(  rd|dz  z   dz   }d}n
d|dz  z   }d}t        j                  | |      } t        j                  |d	
      }|d nd|z   }t        j                  j                  | |||||      }	t        j                  |	|g      S |dk(  rd|z   dz   }d}nd|z   }d}t        j                  j                  | |||||      S )Nr2   z<`inputs` rank must be 3 (1D conv) or 4 (2D conv). Received: r   r   r   r   r   r   r   r   ri   r   )r   r   rv   rW   rX   r   r   r   
isinstanceintr	   expand_dimsr
   depthwise_conv2dsqueeze)
r   r   r   r   r   r   r   r   spatial_start_dimr   s
             r   depthwise_convr   W  s    11+>K6<<(1,!J{{m1
 	
 *+q9NmmoG'3*//-%&(+;;1/)Wq[(4/G !w{*G !(9:Q/ - 54-;O%%((&# ) 
 zz'$5#677o%.4'7"55!!" "  r   c           	         t        j                  |      }t        | j                        dz
  }|dkD  rt	        d| d      t        |d      }|j                         }t        |t              r|f|z  }t        |t              r|f|z  }|dk(  r|dk(  rd|dz  z   dz   }d}	n
d|dz  z   }d}	t        j                  | |	      } t        j                  |d	
      }t        j                  |d	
      }|d nd|z   }t        j                  j                  | ||||||      }
t        j                  |
|	g      S |dk(  r	d|z   dz   }nd|z   }t        j                  j                  | ||||||      S )Nr2   z>`num_spatial_dims` must be 1 or 2. Received: num_spatial_dims=r   r   r   r   r   r   r   ri   r   )r   r   rv   rW   rX   r   r   r   r   r	   r   r
   separable_conv2dr   )r   depthwise_kernelpointwise_kernelr   r   r   r   r   r   r   r   s              r   separable_convr     s    11+>K6<<(1,!  014
 	
 *+q9NmmoG'3*//-%&(+;;1/)Wq[(4/G !w{*G !(9:>>*:C>>*:C - 54-;O%%((&# ) 
 zz'$5#677o%.4'7"55!!" "  r   c           
         t        j                  |      }t        |t        | j                              }|j                  d d }|j                  d   }	t        | j                        }
t        j                  |       }t        |
      D ]  \  }}|	||   |
|<    t        |
||	|||||      }t        j                  j                  | ||||j                         ||      S )Nr   )r   r   r   )r   r   r   rv   rW   listr	   	enumerater   r
   conv_transposer   )r   r   r   r   output_paddingr   r   r   kernel_sizefiltersinput_shapesymbolic_shapeieoutput_shapes                  r   r   r     s     11+>K)+s6<<7HIN,,s#Kll2Gv||$KXXf%N+& /19+A.KN/ 7	L 55"    r   c                    t        | d      } |d}nt        j                  |      }|r|dk  r|t        | j                        z   dz   }t        j                  | j                        }t        j                  | |f      }t        j                  t        j                  |d      |      }| j                  D cg c]  }t        j                  |       }}t        j                  |ddi}|j                  |t        j                  | d             |D 	cg c]  }	t        j                  |	|df       }}	|D 	cg c]&  }	t        j                  |	t        j                        ( }}	t        j                   |d      }t#        | j                        }
|
j                  ||       t        j$                  |||
      S |d	k(  rd
nd\  }}t        j&                  | |||||      S c c}w c c}	w c c}	w )Nint64r   float32r   r   indexingijri   bool)TF)NN)on_value	off_valuerV   r   )r   r   standardize_dtyperv   rW   r&   prodr	   rj   r   greater_equalru   meshgridinsertrP   r   concatr   SparseTensorone_hot)r   num_classesrV   r   sparsevalues_countvaluesdimindicesarW   r   r   s                r   r   r     s   !7+A}))%0 !8#agg,&*Dyy)A/ ))&!4EB,-GG4S288C=44++w66tRZZ1-.=DE2::a,!23EE189A2771bhh'99))G!,QWWT;'w66+0F?-Hi::	  5 F9s   :G%G*<+G/c                 <   t        | j                        dkD  rdnd}t        j                  |      dk(  r|rgt	        | ||dd      }t
        j                  j                  ||d      }|j                  }t        j                  ||      }|j                  |       |S t	        | |||      }t        j                  ||	      S |r2t	        | |||d      }t
        j                  j                  ||d      S t	        | |||      }t        j                  ||	      S )
Nr   r   r   int8T)rV   r   r   )rV   output_is_sparse)rV   r   ri   )rv   rW   r   r   r   r	   r   
reduce_maxr   	set_shape
reduce_any)r   r   rV   r   r   reduction_axisr   outputs_shapes           r   	multi_hotr      s   agg,*QN  '61 ;TG ii**nt + G $MMMgggu-Gm,Na4uEG==~>> ;TtG 99''nt (   a4uEG==~>>r   c                    | }|}t        | d      }|r| j                  }d}t        | d      xrP t        | t        j                  j
                  t        j                  f       xr | j                  j                  |k(  xr | }|r?t        | j                  j                        dk(  sJ | j                  j                  d   }d}|r"|s|rt        j                  d| d| dd	
       ||fS )zCRetrieves logits tensor from maybe-softmax or maybe-sigmoid tensor.r   Topr   r   z"`zK` received `from_logits=True`, but the `output` argument was produced by a zB activation and thus does not represent logits. Was this intended?r2   )
stacklevel)hasattrr   r   r	   __internal__EagerTensorVariabler   typerv   r   warningswarn)r   from_logitsop_typefn_nameoutput_from_logits_has_keras_logitsfrom_expected_op_types           r   _get_logitsr  B  s   GLv7&& 	 	&6BOO$?$?#MNN	&IINNg% 
	   699##$)))))""1%(,A	 77>i @!! 	
 L  r   c                    t        j                  |       } t        j                  |      }t        | j                        dk  r%t	        d| j                   d|j                         t        | j                        t        |j                        k7  r%t	        d| j                   d|j                         t        | j                  |j                        D ]5  \  }}|	|||k7  st	        d| j                   d|j                          t        ||dd      \  }}|r"t         j                  j                  | ||      S |t        j                  ||d	
      z  }t        j                  |t        j                         dt        j                         z
        }t        j                  | t         j                  j                  |      z  |       S )a  Categorical crossentropy between an output tensor and a target tensor.

    Args:
        target: A tensor of the same shape as `output`.
        output: A tensor resulting from a softmax
            (unless `from_logits` is `True`, in which
            case `output` is expected to be the logits).
        from_logits: Boolean, whether `output` is the
            result of a softmax, or is a tensor of logits.
        axis: Int specifying the channels axis. `axis=-1` corresponds to data
            format `channels_last`, and `axis=1` corresponds to data format
            `channels_first`.

    Returns:
        Output tensor.

    Example:

    >>> a = tf.constant([1., 0., 0., 0., 1., 0., 0., 0., 1.], shape=[3,3])
    >>> print(a)
    tf.Tensor(
      [[1. 0. 0.]
       [0. 1. 0.]
       [0. 0. 1.]], shape=(3, 3), dtype=float32)
    >>> b = tf.constant([.9, .05, .05, .05, .89, .06, .05, .01, .94],
    ...                 shape=[3, 3])
    >>> print(b)
    tf.Tensor(
      [[0.9  0.05 0.05]
       [0.05 0.89 0.06]
       [0.05 0.01 0.94]], shape=(3, 3), dtype=float32)
    >>> loss = categorical_crossentropy(a, b)
    >>> print(np.around(loss, 5))
    [0.10536 0.11653 0.06188]
    >>> loss = categorical_crossentropy(a, a)
    >>> print(np.around(loss, 5))
    [0. 0. 0.]
    r   zPArguments `target` and `output` must be at least rank 1. Received: target.shape=, output.shape=WArguments `target` and `output` must have the same rank (ndim). Received: target.shape=QArguments `target` and `output` must have the same shape. Received: target.shape=Softmaxcategorical_crossentropy)labelsr   rV   Trr   r   )r	   r   rv   rW   rX   zipr  r
   !softmax_cross_entropy_with_logitsrw   r`   r   epsilonr&   log)targetr   r   rV   e1e2s         r   r  r  e  s   N !!&)F!!&)F
6<<1"LL>H
 	

 6<<C--"LL>H
 	

 fllFLL1 B>bnr  &~_V\\NL  &Y(BFK uu66&t 7 
 	
 bmmFD4@@F !3):#:F MM&277;;v#66===r   c                 j   |dk7  r)|t        |j                        dz
  k7  rt        d|       t        ||dd      \  }}t	        j
                  |       } 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                         t        | j                        t        |j                  d
d       k7  r%t        d| j                   d|j                         t        | j                  |j                  d
d       D ]5  \  }}|	|||k7  st        d| j                   d|j                          |s]t	        j                  |t        j                         dt        j                         z
        }t        j                  j                  |      }t        j                  j                  | |      }|S )aN  Categorical crossentropy with integer targets.

    Args:
        target: An integer tensor.
        output: A tensor resulting from a softmax
            (unless `from_logits` is True, in which
            case `output` is expected to be the logits).
        from_logits: Boolean, whether `output` is the
            result of a softmax, or is a tensor of logits.
        axis: Int specifying the channels axis. `axis=-1` corresponds to data
            format `channels_last`, and `axis=1` corresponds to data format
            `channels_first`.

    Returns:
        Output tensor.
    r   r   z4Only axis=-1 is currently supported. Received: axis=r
  sparse_categorical_crossentropyr   r   ri   zBArgument `output` must be at least rank 1. Received: output.shape=NzRArgument `output` must have rank (ndim) `target.ndim - 1`. Received: target.shape=r  zcArguments `target` and `output` must have the same shape up until the last dimension: target.shape=r  r   )rv   rW   rX   r  r	   r   r   r   r  r`   r   r  r&   r  r
   (sparse_softmax_cross_entropy_with_logits)r  r   r   rV   r  r  results          r   r  r    s
   " rzdc&,,/!33B4&I
 	
 &Y(IFK !!&)FWWV7+F!!&)F
6<<C--&,,r2Ba2GF,
6<<1"LL>+
 	

 6<<CSb 122"LL>H
 	

 fllFLL"$56 B>bnr  &~_V\\NL  !!GOO%q7??+<'<
 V$UU;;f < F Mr   c                 *   t        j                  |       } t        j                  |      }t        | j                        t        |j                        k7  r%t	        d| j                   d|j                         t        | j                  |j                        D ]5  \  }}|	|||k7  st	        d| j                   d|j                          t        ||dd      \  }}|r!t         j                  j                  | |      S t        j                  |t        j                         dt        j                         z
        }| t         j                  j                  |      z  }|d| z
  t         j                  j                  d|z
        z  z  }| S )	ap  Binary crossentropy between an output tensor and a target tensor.

    Args:
        target: A tensor with the same shape as `output`.
        output: A tensor.
        from_logits: Whether `output` is expected to be a logits tensor.
            By default, we consider that `output`
            encodes a probability distribution.

    Returns:
        A tensor.
    r  r  r	  Sigmoidbinary_crossentropyr  r   r   )r	   r   rv   rW   rX   r  r  r
   !sigmoid_cross_entropy_with_logitsr`   r   r  r&   r  )r  r   r   r  r  bces         r   r  r    sx    !!&)F!!&)F
6<<C--"LL>H
 	

 fllFLL1 B>bnr  &~_V\\NL  &Y(=FK uu66& 7 
 	

 !3):#:F 277;;v&
&CAJ"''++a&j111C4Kr   c                    d}t        j                  | j                        }|dv rd}t        | d      } |rt	        | ||      \  }}nt        | ||      \  }}|rt        j                  |t        j                  j                  t        j                  j                        }t        j                  |t        j                  j                  t        j                  j                        }t        ||      }t        ||      }||fS )NF)float16bfloat16Tr   )r   r   r   r   _compute_moments_sync_compute_momentsr	   r`   r   minmax)r   axesrr   synchronized	need_cast	ori_dtypemeanvariances           r   momentsr,  '  s     I))!''2I++	I.q$Ah)!T8<hbjjnnbjjnnE##HbjjnnbjjnnMD)$),>r   c                    t         j                  j                         }|st        | ||      S t        j                  | d      }t        j
                  | |d      }t        j
                  t        j                  |       |d      }t        j
                  ||d      }|j                  t         j                  j                  j                  |      }|j                  t         j                  j                  j                  |      }|j                  t         j                  j                  j                  |      }	t         j                  j                  ||	      }
t         j                  j                  ||	      }t        j                  |t        j                  |
      z
  d      }|s,t        j                  |
|      }
t        j                  ||      }|
|fS )Ncount)nameTrq   r   )r	   
distributeget_replica_contextr#  	ones_likerw   r9   
all_reduceReduceOpSUMr&   divide_no_nanrP   r   )r   r&  rr   replica_ctxlocal_count	local_sumlocal_squared_sumy_sumy_squared_sum	count_sumr*  y_squared_meanr+  s                r   r"  r"  >  sY   --335K422,,qw/KadT:IbiilM--$FK ""2==#9#9#=#=yIE**
""$5M &&r}}'='='A'A;OI77  	2DWW**=)DNzz.299T?:C@Hzz$%::h->r   c                 F    t         j                  j                  | ||      S )Nr  )r	   r
   r,  )r   r&  rr   s      r   r#  r#  ^  s    55==D8=44r   c                 d   |dk7  rdgt        | j                        z  }|j                  d   ||<   t        j                  ||      }t        j                  ||      }|t        j                  ||      }|t        j                  ||      }t        j                  j                  | |||||      S )Nr   r   r   )r   r*  r+  offsetscalevariance_epsilon)rv   rW   r	   rj   r
   batch_normalization)r   r*  r+  rV   rA  rB  r  rW   s           r   rD  rD  b  s     rzc!''l"jjmdzz$&::h.ZZ.FJJue,E55$$
  %  r   c                 P   t        |       } t        |      }t        j                  | d      } t        j                  |j
                  d      }|dk(  rdn|}t        j                  ||      }t        j                  j                  | ||||d      }t        j                  ||      S )Nint32r   r   float64F)r  r   label_lengthlogit_lengthblank_indexlogits_time_major)r   r	   r   r   result_typer   r
   ctc_loss)r  r   target_lengthoutput_length
mask_indexresult_dtypecompute_dtypelosss           r   rM  rM  y  s     v&Fv&FWWV7+F &&v||Y?L!-!:IMWWV]+F55>>""  D 774&&r   c                    t        |       } t        j                  |       }|d   |d   }	}t        j                  | d      } t	        j
                  | j                  d      }
t        j                  | |
      } t        |d      }|dk(  r't        j                  j                  | |||      \  }}nx|d	k(  rd|;| d
d |f   }| d
||dz   f   }| d
|dz   d f   }t        j                  |||gd      } t        j                  j                  | |||      \  }}nt        d| d      g }|D ]_  }t        j                  |j                  |j                  ||	f      }|j!                  t        j"                  j%                  |d             a t        j&                  |d      }t        j                  |d      }|d	k(  r,|*|dk  r||d   z   }t        j(                  ||k\  |dz   |      }||fS )Nr   r   )r   r   r2   r   rF  r   greedy)r   sequence_lengthmerge_repeatedrJ  beam_search.r   ri   )r   rV  
beam_width	top_pathszInvalid strategy z2. Supported values are 'greedy' and 'beam_search'.)sp_inputrf   )r   r	   rW   r   r   rL  r   r   r
   ctc_greedy_decoderr   ctc_beam_search_decoderrX   r   r   r   appendr   to_densestackr    )r   sequence_lengthsstrategyrY  rZ  rW  rP  r   num_samples	num_stepsr   decodedscoresinputs_beforeinputs_maskinputs_afterdecoded_densests                     r   
ctc_decoderl    s'    v&F((6"K(^[^K\\&),Fi8EWWVU#F()9I8EE44,)"	 5 
& 
]	" !"3#34M j:>&A!ABK!#zA~'7"78LYYk:F EE99,!	 : 
& z ** *
 	
 M P__RZZ[)4LMRYY//2/NOP HH]3MGGM73M = Z%;>#k"o5JZ'):M
 &  r   c                 B   ddl m} | j                  |j                  k7  r&t        d| j                   d|j                   d      t	        ||j
                        }t        j                  t        j                  | |z
              }d ||      z  d ||      z  z
  }|S )	Nr   )log10zInput shapes z and z" must match for PSNR calculation. r      
   )	"keras.src.backend.tensorflow.numpyrn  rW   rX   r   r   r	   reduce_meanr9   )rZ   r[   max_valrn  msepsnrs         r   ru  ru    s    8	xx288BHH:U288* 5+ +
 	

  rxx8G
..27+
,CgeCj0DKr   c                 r    t        j                  |       } | dk(  rdnd}t        j                  |dz  |       S )Nr   g    @g̓$Ggffffffr   )r   r   r	   r!   )r   vals     r   _get_large_negativerx    s5    %%e,Ei''ZC;;sTz//r   c                    ||s| S t        j                  | d      }|t        j                  ||      }|ryt        j                  |       }|d   |d   }}t         j                  j                  t        j                  ||fd      dd      }|d d d d d d f   }t        j                  ||      }t        j                  || t        | j                              }|S )Nr   r   r2   r   r   r   )
r	   r2  logical_andrW   linalg	band_partonesr    rx  r   )r   mask	is_causalcombined_masklogits_shapeTSpadded_logitss           r   _apply_masksr    s    |ILLv6M}d;xx'AQ1yy""277Aq66#:BBD$1$%}d;HHv26<<@M r   c                    t        j                  | j                  d      }t        j                  d| |d      }t        j
                  ||      }t        j                  |t        j
                  ||j                              }|4t        j                  |t        j
                  ||j                              }t        |||      }	t        j                  |	j                  d      }
t        j
                  t        j                  j                  t        j
                  |	|
      d      |j                        }t        j                  d||d      S )Nr   zBTNH,BSNH->BNTSoptimal)optimizer   ri   zBNTS,BSNH->BTNH)r   rL  r   r	   einsumr   multiplyaddr  r
   rk   )querykeyvaluebiasr~  r  rB  logits_dtyper   r  probs_dtypeprobss               r   _dot_product_attention_xlar    s    &&u{{I>LYY(%yIFWWV\*F[[!=>Ffll ;< y9M %%m&9&99EKGG
bggm[9CSYYE 99&uyIIr   c	           	         |d}|rt        d      t        |       } t        |      }t        |      }t        | j                        dk7  r3t        d| j                   d|j                   d|j                   d      t	        j                  |      d   }	|,d	t	        j
                  t	        j                  |	d
            z  n|}t        | ||||||      S )NFz7Flash attention is not supported in tensorflow backend.r   zG`dot_product_attention` only supports 4D inputs. Received: query.shape=z, key.shape=z, value.shape=r   r   r   r   )rX   r   rv   rW   r	   r8   r   r  )
r  r  r  r  r~  rB  r  flash_attentionattn_logits_soft_capHs
             r   dot_product_attentionr    s     E
 	
 e$E
C
 Ce$E
5;;1%%*[[Mcii[ I ;;-q*
 	

 	bA6;mS2772771i011E%sE4y% r   )r   )r   )g?)r   )T)r   )NvalidN)r   r  Nr   )r   r  NNr   )r   r   F)Fr   )F)FF)NNgMbP?)r   )rU  d   r   Tr   )NNNFNN)@r&   r   
tensorflowr	   	keras.srcr   &keras.src.backend.common.backend_utilsr   !keras.src.backend.tensorflow.corer   r   r   r   r   r"   r$   r'   r)   r+   r0   r4   r6   r<   r>   rA   rD   rF   rH   rK   rN   rS   r\   ra   rd   r/   rk   rm   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r,  r"  r#  rD  rM  rl  ru  rx  r  r  r  r   r   r   <module>r     s       3 ?"5L
12
H@5+$$	 > 8
F %V ;D <D %P!H?D !FP>f<~-`.@5
 ?C8 '@ >!B0*J. 
	
"r   