
    2Vh                     R   d dl Z d dlmc 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 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dAdZ d Z!d Z"dBdZ#d Z$dCdZ%dBdZ&dDdZ'd  Z(d?d!Z)d" Z*dDd#Z+dDd$Z,dDd%Z-	 dEd&Z.	 dEd'Z/d( Z0d) Z1d* Z2	 	 	 dFd+Z3	 	 	 dFd,Z4	 	 	 	 dGd-Z5	 	 	 	 dGd.Z6	 	 	 	 dGd/Z7	 	 	 	 	 dHd0Z8dId1Z9dId2Z:dJd3Z;dJd4Z<dKd5Z=dLd6Z>	 dMd7Z?	 dNd8Z@	 	 dOd9ZA	 	 	 	 	 dPd:ZBd; ZCd< ZD	 dQd=ZE	 	 	 	 	 	 dRd>ZFy)S    N)backend)-compute_conv_transpose_padding_args_for_torch)cast)convert_to_tensor)
get_device)expand_dims)maximum)where)standardize_tuplec                 B    t        |       } t        j                  |       S N)r   tnnreluxs    J/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/backend/torch/nn.pyr   r          !A88A;    c                 B    t        |       } t        j                  |       S r   )r   r   relu6r   s    r   r   r      s    !A99Q<r   c                 B    t        |       } t        j                  |       S r   )r   r   sigmoidr   s    r   r   r      s    !A;;q>r   c                 0   t        |       } t        j                  | dk  t        j                  d| j                  | j
                        t        j                  | dk\  t        j                  d| j                  | j
                        d| dz   z              S )N        devicedtype         ?      ?)r   torchr
   tensorr   r   r   s    r   sparse_sigmoidr$       sr    !A;;	RS9FLLQXXQWW=1q5M	
 r   c                 B    t        |       } t        j                  |       S r   )r   r   tanhr   s    r   r&   r&   -   r   r   c                 B    t        |       } t        j                  |       S r   )r   r   
tanhshrinkr   s    r   tanh_shrinkr)   2       !A>>!r   c                 B    t        |       } t        j                  |       S r   )r   r   softplusr   s    r   r,   r,   7       !A<<?r   c                 B    t        |       } t        j                  |       S r   )r   r   softsignr   s    r   r/   r/   <   r-   r   c                 F    t        |       } t        j                  | |      S N)lambd)r   r   
softshrinkr   	thresholds     r   soft_shrinkr6   A       !A>>!9--r   c           
          t        |       } t        j                  | dk  t        j                  |       t        j                  | dk  d| dz   dz  z  |             S )Nr   r   g      ?   )r   r"   r
   
zeros_liker   s    r   sparse_plusr;   F   sS    !A;;	RAEEa!e\115 r   c                 B    t        |       } t        j                  |       S r   )r   r   silur   s    r   r=   r=   O   r   r   c                 t    t        |       } t        |      }| t        j                  | dz  |z         z   }|dz  S )Nr9   )r   r"   sqrt)r   bys      r   
squareplusrB   T   s:    !A!A	EJJq!tax  Aq5Lr   c                 B    t        |       } t        j                  |       S r   )r   r   
logsigmoidr   s    r   log_sigmoidrE   [   r*   r   c                 F    t        |       } t        j                  | |      S )N)negative_slope)r   r   
leaky_relu)r   rG   s     r   rH   rH   `   s    !A>>!N;;r   c                 B    t        |       } t        j                  |       S r   )r   r   hardsigmoidr   s    r   hard_sigmoidrK   e   s    !A??1r   c                 B    t        |       } t        j                  |       S r   )r   r   	hardswishr   s    r   	hard_silurN   j   s    !A==r   c                 D    t        |       } t        j                  | |      S r   )r   r   elur   alphas     r   rP   rP   o   s    !A771er   c                 B    t        |       } t        j                  |       S r   )r   r   selur   s    r   rT   rT   t   r   r   c                 t    t        |       } |rt        j                  | d      S t        j                  |       S )Nr&   )approximate)r   r   gelu)r   rV   s     r   rW   rW   y   s.    !Axxv..88A;r   c                 F    t        |       } t        j                  | |      S )N)rR   )r   r   celurQ   s     r   rY   rY      s    !A88AU##r   c                 F    t        |       } t        j                  | |      S )Ndim)r   r   glu)r   axiss     r   r]   r]      s    !A771$r   c                 H    t        |       } t        j                  | dd      S )Ng      r    )min_valmax_val)r   r   hardtanhr   s    r   	hard_tanhrc      s    !A<<455r   c                 F    t        |       } t        j                  | |      S r1   )r   r   
hardshrinkr4   s     r   hard_shrinkrf      r7   r   c                 H    t        |       } t        j                  | ||      S )N)r5   value)r   r   r5   )r   r5   default_values      r   r5   r5      s    !A==i}EEr   c                    t        |       } t        j                  | j                        }t	               dk(  r.t        j                  | j                        dk(  rt        | d      } |Ot        j                  | dg      }t        j                  |d      }t        j                  || j                        }nt        j                  | |      }t        ||      S Ncpufloat16float32r   r[   )r   r   standardize_dtyper   r   r   r"   reshaper   softmaxshaper   r^   r   outputs       r   rq   rq      s    !A%%agg.E 	%%agg.);I| q2$'V,vqww/QD)r   c                    t        |       } t        j                  | j                        }t	               dk(  r.t        j                  | j                        dk(  rt        | d      } |Ot        j                  | dg      }t        j                  |d      }t        j                  || j                        }nt        j                  | |      }t        ||      S rk   )r   r   ro   r   r   r   r"   rp   r   log_softmaxrr   rs   s       r   rv   rv      s    !A%%agg.E 	%%agg.);I| q2$'R0vqww/-r   c                 r   t        |       } t        j                  | |d      \  }}t        j                  ||      }t        j                  d| j                  |      dz   | j                  | j                        }dg| j                  z  }d||<   |j                  |      }||dz
  |z  z
  dkD  }t        j                  ||d      }t        j                  ||t        j                  d	| j                  
            }	t        j                  |	|d      dz
  |z  }
t        j                  | |
z
  d	      }|S )NT)r\   
descendingr[   r   r   r   r   r\   keepdimr   r   )min)r   r"   sortcumsumarangesizer   r   ndimviewsumr
   r#   clamp)logitsr^   logits_sorted_logits_cumsumrr_shapesupportklogits_cumsum_safetaurt   s               r   	sparsemaxr      s   v&Fzz&dtDM1LLD9M	6;;tq fll	A cFKKGGDM	wA}q0A559G		'tT2AS G 99'T4@1D
IC[[#3/FMr   c                     |dz
  |z  dz   }|dk(  r|dz
  }n#| |z   dz
  |z  }t        d|dz
  |z  |z   | z
        }|dz  }||z
  }||fS )zSCompute padding length along one dimension with support
    for asymmetric padding.r   r   r9   )max)	input_lengthkernel_lengthstridedilation_rateeffective_k_sizetotal_paddingoutput_sizeleft_paddingright_paddings	            r   _compute_padding_lengthr      s    
 &)]:Q>{(1, $f,q0V;a6),<<|K

 !A%L!L0M-((r   c                    | j                   dd }t        |      }g }|dk7  rt        ||d      }t        |      D ]6  }	|dk(  rdn||	   }
t	        ||	   ||	   ||	   |
      }|j                  |       8 t        d |D              r| |D cg c]  \  }}|	 c}}fS g }t        |      D ]  }|j                  |        |dk(  rdnd}t        j                  | t        |      |	      d
fS c c}}w )aZ  Apply same padding to the input tensor.

    This function will evaluate if the padding value is compatible with torch
    functions. To avoid calling `pad()` as much as possible, which may cause
    performance or memory issues, when compatible, it does not apply the padding
    to the tensor, but returns the input tensor and the padding value to pass to
    the torch functions. If not compatible, it returns the padded tensor and 0
    as the padding value.

    Returns:
        tensor: A padded tensor or the inputs.
        padding: The padding value, ready to pass to the torch functions.
    r9   Npoolingr   r   c              3   ,   K   | ]  \  }}||k(    y wr    ).0leftrights      r   	<genexpr>z&_apply_same_padding.<locals>.<genexpr>  s     
4[T545=
4s   	replicateconstant)padmoder   )rr   lenr   ranger   appendallreversedextendr   r   tuple)inputskernel_sizestridesdata_formatoperation_typer   spatial_shapenum_spatial_dimspaddingidilr   r   r   flattened_paddingr   s                   r   _apply_same_paddingr      s     LL$M=)G")+_
 #$ !Y.aM!4D%!k!ngaj#
 	s 
4G
44G4q444   &  %& )I5;:D776u%67dCQFF 5s   C+c                     | 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      )	z=Transpose inputs from channels_last to channels_first format.r9   r   r   r9   r   )r      r   r9   r   )r      r   r9   r   z^Inputs must have ndim=3, 4 or 5, corresponding to 1D, 2D and 3D inputs. Received input shape: .)r   r"   permute
ValueErrorrr   )r   r   s     r   _transpose_spatial_inputsr     s{     ;;?Dqy}}VY//	}}V\22	}}V_55
	!!'a	1 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 )Nr9   r   r   )r   r9   r   r   r   )r   r9   r   r   r   r   rr   r"   r   )outputsr   s     r   _transpose_spatial_outputsr   -  su    7==)A-1--3
 N	 
Q	--6 N 
Q	--9Nr   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 )Nr9   r   )r9   r   r   )r   r9   r   r   r   )r   r   r   r   r9   r   )kernelr   s     r   _transpose_conv_kernelr   9  sw     6<<(1,1vy1
 M	 
Q	v|4 M 
Q	v7Mr   c                    t        |       } | j                  dz
  }t        ||d      }||}nt        ||d      }t        j                  |      }|dk(  rt        |       } |dk(  rt        | |||d      \  } }nd}t               }|dk(  r,t        j                  | j                  | j                  d	
      } |dk(  rt        j                  | |||      }nW|dk(  rt        j                  | |||      }n8|dk(  rt        j                  | |||      }nt!        d| j                   d      |j#                  |      }|dk(  rt%        |      }|S )z!Fixed max pooling implementation.r9   	pool_sizer   channels_lastsamer   r   metarl   )r   r   r   r   )r   r   r   r   lInputs to pooling op must have ndim=3, 4 or 5, corresponding to 1D, 2D and 3D inputs. Received input shape: r   )r   r   r   r   standardize_data_formatr   r   r   r"   emptyrr   r   r   
max_pool1d
max_pool2d
max_pool3dr   tor   )r   r   r   r   r   r   r   r   s           r   max_poolr   F  sl    v&F{{Q!)-={KI#G-=yI11+>Ko%*62& .IwY
 \F V\\%
 1..	'7
 
Q	..	'7
 
Q	..	'7
 %%+\\N!5
 	
 jj Go%,W5Nr   c                 
   t        |       } | j                  dz
  }t        ||d      }||nt        ||d      }t        j                  |      }|}|dk(  rt        |       } |dk(  rt        | ||dd      \  } }nd}|d	k(  rt        j                  | |||d
      }nY|dk(  rt        j                  | |||d
      }n9|dk(  rt        j                  | |||d
      }nt        d| j                   d      |dk(  rt        |      }|S )z7Fixed average pooling with correct padding calculation.r9   r   r   r   r   channels_firstr   r   r   F)r   r   r   count_include_padr   r   r   )r   r   r   r   r   r   r   r   
avg_pool1d
avg_pool2d
avg_pool3dr   rr   r   )r   r   r   r   r   r   orig_formatr   s           r   average_poolr     sR    v&F{{Q!)-={KI ? 	w(8)D  11+>KKo%*62& .
  1..!#
 
Q	..!#
 
Q	..!#
 %%+\\N!5
 	
 o%,W5Nr   c                    t        |       } t        |      }| j                  dz
  }t        ||d      }t        j                  |      }|dk(  rt        |       } t        |      }| j                  d   }|j                  d   }||z  dk7  rt        d| d| d      ||z  }	|d	k(  r!t        | |j                  dd
 ||d|      \  } }nd}|dk(  rt        j                  | |||||	      }
n[|dk(  rt        j                  | |||||	      }
n:|dk(  rt        j                  | |||||	      }
nt        d| j                   d      |dk(  rt        |
      }
|
S )z&Convolution with fixed group handling.r9   r   r   r   r   zInput channels (z.) must be divisible by kernel input channels ()r   Nconv)r   r   dilationgroupsr   zrInputs to conv operation should have ndim=3, 4, or 5,corresponding to 1D, 2D and 3D inputs. Received input shape: r   )r   r   r   r   r   r   r   rr   r   r   r   conv1dconv2dconv3dr   )r   r   r   r   r   r   r   in_channelskernel_in_channelsr   r   s              r   r   r     s    v&Fv&F{{Q)99EG11+>Ko%*62#F+F ,,q/Ka''1,{m ,&&8%9<
 	
 ..F &-LL
  1**"
 
Q	**"
 
Q	**"
 ll^1&
 	
 o%,W5Nr   c                     t        |      }t        j                  ||j                  d d d|j                  d   |j                  d   z  fz         }t	        | |||||      S )Nr   r   )r   r"   rp   rr   r   )r   r   r   r   r   r   s         r   depthwise_convr   !  sd     v&F]]Sb!QR(86<<;K(K$LLF +}MMr   c                 D    t        | |||||      }t        ||dd||      S )Nr   valid)r   r   r   r   )r   r   )r   depthwise_kernelpointwise_kernelr   r   r   r   depthwise_conv_outputs           r   separable_convr   0  sB     + # r   c                    t        |       } t        |      }| j                  dz
  }t        ||d      }t        j                  |      }t        | j                  |j                  ||||      \  }}	|dk(  rt        |       } t        |      }|j                  dd  }
t        |t              r|gt        |
      z  }|dk(  rt        j                  | ||||	|      }n[|dk(  rt        j                  | ||||	|      }n:|dk(  rt        j                  | ||||	|      }nt!        d| j                   d	      |dk(  rt#        |      }|S )
Nr9   r   )input_shapekernel_shaper   r   output_paddingr   r   r   )r   r   r   r   r   z|Inputs to conv transpose operation should have ndim=3, 4, or 5,corresponding to 1D, 2D and 3D inputs. Received input shape: r   )r   r   r   r   r   r   rr   r   r   
isinstanceintr   r   conv_transpose1dconv_transpose2dconv_transpose3dr   r   )r   r   r   r   r   r   r   r   torch_paddingtorch_output_paddingkernel_spatial_shaper   s               r   conv_transposer   K  s~    v&Fv&F{{Q)99EG11+>K 	6LL\\%#	 o%*62#F+F!<<+-%&#.B*CC1&&!/"
 
Q	&&!/"
 
Q	&&!/"
 ll^1&
 	

 o%,W5Nr   c                    |rt        d      t        | t        j                        } t        dt        j                        }t	        j
                  t        | d      |      }t        t        | d      dk\  ||      }t        ||      }|j                         }|dk7  rP||k7  rKt        t        |            }d||<   t        |dz   |      D ]  }	||	xx   dz  cc<    |j                  |      }|S )N2Unsupported value `sparse=True` with torch backendr   r   r   r^   r   )r   r   r"   longr   one_hotr	   r
   r   r\   listr   r   )
r   num_classesr^   r   sparsezerort   dimsnew_axes_orderaxs
             r   r  r    s    MNN 	!5::.AQejj1D [[A4F;qr*a/>FvU3F::<DrzddleDk*!tq$' 	$B2!#	$/Mr   c                     |rt        d      t        |       } t        | j                        dkD  rdnd}t	        j
                  t        t        | d      |||      |      }|S )Nr   r   r   int32)r^   r   r[   )r   r   r   rr   r"   amaxr  r   )r   r  r^   r   r  reduction_axisr   s          r   	multi_hotr    s^    MNN!Aagg,*QNjjQ +DFG Nr   c                 j   t        |       } t        |      }| j                  |j                  k7  r%t        d| j                   d|j                         t        | j                        dk  r%t        d| j                   d|j                         |rt	        j
                  ||      }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[   Try   r    )r   rr   r   r   r   rv   r"   r   clipr   epsilonlog)targetrt   from_logitsr^   log_probs        r   categorical_crossentropyr    s   v&Fv&F||v||#"LL>H
 	

 6<<1"LL>H
 	
 ??6t4%))FdCCFGOO$5sW__=N7NO99V$IIfx'T222r   c                 |   t        | t        j                        } t        |      }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                        |k7  r%t        d| j                   d|j                         |rt        j                  ||      }nn|t        j                  ||d	      z  }t        j                  |t        j                         d
t        j                         z
        }t        j                  |      }t        | |j                  |   |      } t        j                  | |z  |       S )Nr  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  Try   r    r  )r   r"   r  r   rr   squeezer   r  r   rv   r   r  r   r  r  r  )r  rt   r  r^   output_shape_without_class_dimr  s         r   sparse_categorical_crossentropyr    sl   vUZZ8Fv&F
6<<C--&,,r2Ba2Gv2.
6<<1"LL>+
 	

 &*&,,%7"&t,FLL;;"LL>H
 	

 ??6t4%))FdCCFGOO$5sW__=N7NO99V$VV\\$/d;FIIfx'T222r   c                    t        |       } t        |      }| j                  |j                  k7  r%t        d| j                   d|j                         |rt        j                  || d      S t        j                  |t        j                         dt        j                         z
        }t        j                  || d      S )Nr  r  none)	reductionr    )
r   rr   r   r    binary_cross_entropy_with_logitsr"   r  r   r  binary_cross_entropy)r  rt   r  s      r   binary_crossentropyr$    s    v&Fv&F||v||#"LL>H
 	
 33Ff
 	
 FGOO$5sW__=N7NO''&IIr   c                    |rt        d      t        |       } 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 )Nz9Argument synchronized=True is not supported with PyTorch.Frm   Trn   ry   )NotImplementedErrorr   r   ro   r   r   r"   meansquarer  r  finform   r|   r   )r   axeskeepdimssynchronized	need_cast	ori_dtyper'  variances           r   momentsr0    s_   !G
 	
 	!A I))!''2II	I::aT40D zzQT4TH }}T4(==40zzKK&**KK&**

 ::KK&**KK&**

 D)$),>r   c                    t        |       } t        |      }t        |      }dgt        | j                        z  }|j                  d   ||<   t        j                  ||      }t        j                  ||      }|"t        |      }t        j                  ||      }nt        j
                  |      }|"t        |      }t        j                  ||      }nt        j                  |      }| j                  |      j                  |j                  |      j                         j                  |            j                  |      S )Nr   r   )r   r   rr   r"   rp   r:   	ones_likesubtractmul_addrsqrt_muladd_)r   r'  r/  r^   offsetscaler  rr   s           r   batch_normalizationr;  5  s    	!AT"D *HC#agg,E**Q-E$K==u%D}}Xu-H"6*vu-!!$'!%(eU+) 	


4	hll7#**,007	8	fr   c                 H   t        |       } t        |      }t        |      }t        |      }t        j                  |j                  d      }t	        ||      }t        j                  |dd      }t        j                  |d      }t        j                  || |||d      }|S )Nrn   r   r   r   r[   r   )blankr!  )
r   r   result_typer   r   r"   	transposer   rv   ctc_loss)r  rt   target_lengthoutput_length
mask_indexr   r   losss           r   r@  r@  S  s     v&Fv&F%m4M%m4M i8E&% F__VQ*F__V,F<<D Kr   c                    t        |       } t        |d      }| j                  \  }}}||dz
  }t        j                  | d      }t	        |d      }t        j
                  | d      d   }t        j                  ||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                  ||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  r  r   r   r  r   r{   r   )r   r   r   r   r[   )r   rr   r"   argmaxr   r   r   r   r
   r   r   	unsqueezetileargsorttake_along_dimr   )r   sequence_lengthsmerge_repeatedrC  
batch_size
max_lengthr  indicesscoresseqlen_maskrepeatinvalid_maskorders                r   _ctc_greedy_decoderU  p  s    v&F()9I*0,,'J
K 1_
ll6+G7G$GYYvB'*F,,z'..A$'JK!1!T'!::Kkk+z7;G[[c62FAB71crc6?2.++fj': j(Lkk,G4G OOZ7QE JJuz1o.EKKj%8EMM%R(E""7Er:GiiQ'400Foog1-GF?r   c                     t        |       } t        j                  | j                  d      }t	        | |      } |dk(  rt        | |||      S |dk(  rt        d      t        d| d      )Nrn   greedy)rL  rC  beam_searchzKTorch backend doesn't yet support the beam search strategy for CTCdecoding.zInvalid strategy z2. Supported values are 'greedy' and 'beam_search'.)r   r   r>  r   r   rU  r&  r   )r   rK  strategy
beam_width	top_pathsrL  rC  r   s           r   
ctc_decoder\    s     v&Fi8E&% F8!)!	
 	
 
]	"!
 	

 z ** *
 	
r   c                 v   | j                   |j                   k7  r&t        d| j                    d|j                    d      t        |       t        |      }} t        || j                        }t	        j
                  | |z
  dz        }dt	        j                  |      z  dt	        j                  |      z  z
  }|S )NzInput shapes z and z" must match for PSNR calculation. r  r9      
   )rr   r   r   r   r"   r'  log10)x1x2ra   msepsnrs        r   rd  rd    s    	xx288BHH:U288* 5+ +
 	
 	"" 	B  rxx8G
**b2g!^
$CG$$rEKK,<'<<DKr   c                 `    t        j                  |       } | dk(  rd}nd}t        |dz  |       S )Nrm   g    @g̓$Ggffffffr  )r   ro   r   )r   vals     r   _get_large_negativerg    s5    %%e,E	S4Zu55r   c           	          	 ddl m} ddl m} 	  || |||d|d      }|r ||d      du rt        d       ||d      S # t        $ r |rt        d      Y yw xY w# t        $ r  || |||d|      }Y Uw xY w)	z+Verify the availability of flash attention.r   )
SDPAParams)can_use_flash_attentionzFlash attention is not supported in your current PyTorch version. Please update it by following the official guide: https://pytorch.org/get-started/locally/Fr   TzfFlash attention is not supported with the provided inputs. Please check the warnings for more details.)torch.backends.cudari  rj  ImportError	TypeErrorRuntimeError)	querykeyrh   mask	is_causalraise_errorri  rj  spda_paramss	            r   _can_use_flash_attentionru    s    
2?
 
& .{DAUJ:
 	
 #;66E  ; 
 &  	
 
	
s    > A AAA32A3c	           	         |t        d      t        |       } t        |      }t        |      }t        | j                        dk7  s0t        |j                        dk7  st        |j                        dk7  r3t        d| j                   d|j                   d|j                   d      ||nt        |d      }|,d	}t	        j
                  |d
t        | j                              }d\  }	}
t	        j                  | |	|
      } t	        j                  ||	|
      }t	        j                  ||	|
      }|t        | ||||      }n|du rt        | ||||d       |rt        j                  j                  j                  t        j                  j                  j                  j                  g      5  t        j                  j                  j!                  | |||||      }d d d        nk||j#                         }t        j                  j                  j!                  | j#                         |j#                         |j#                         |||      }t	        j                  |
|	      S # 1 sw Y    xY w)Nz7torch's `dot_product_attention` doesn't support `bias`.r   zG`dot_product_attention` only supports 4D inputs. Received: query.shape=z, key.shape=z, value.shape=r   boolr  Fr   )r   r9   T)rs  )backends)	attn_maskrr  r:  )r   r   r   rr   r"   r
   rg  r   r?  ru  nn	attentionsdpa_kernel
SDPBackendFLASH_ATTENTION
functionalscaled_dot_product_attention
contiguous)ro  rp  rh   biasrq  r:  rr  flash_attentionattn_logits_soft_capaxis0axis1attention_outputs               r   dot_product_attentionr    s_    E
 	
 e$E
C
 Ce$E
5;;1CII! 3s5;;7G17L%%*[[Mcii[ I ;;-q*
 	

 <4%6t6%JD	{{4&9%++&FGLE5OOE5%0E
//#ue
,COOE5%0E23tY
 
D	  	!3tYD	
 XX++hh((33CCD , 
 
	  %xx22OO#  P  
	 
	 ??$D 88..KKNN L 
 ??+UE::-
	 
	s   30I..I7)r!   )r   )g?)r    )T)r   )r   )Nr   N)r   r   Nr   )r   r   NNr   )r   rn   F)Fr   )F)FF)NNgMbP?)r   )TN)rW  d   r   Tr   )NFF)NNNFNN)Gr"   torch.nn.functionalrz  r  r   	keras.srcr   &keras.src.backend.common.backend_utilsr   keras.src.backend.torch.corer   r   r   keras.src.backend.torch.numpyr   r	   r
   #keras.src.utils.argument_validationr   r   r   r   r$   r&   r)   r,   r/   r6   r;   r=   rB   rE   rH   rK   rN   rP   rT   rW   rY   r]   rc   rf   r5   rq   rv   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r$  r0  r;  r@  rU  r\  rd  rg  ru  r  r   r   r   <module>r     s    ! !  . : 3 5 1 / A







.


<




$
 
6
.
F
((. 89). NO*GZ$	
  ;B GZ Pl N& < EP4	343@J**\ ?CF @ 	+b 
@"6 @E)7` 
	
D;r   