
    ijH                       d dl Z d dlZd dlZ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 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$dPdZ%d Z&d Z'dQdZ(d Z)dRdZ*d Z+d Z,dSdZ-d Z.dTd Z/dSd!Z0dUd"Z1d# Z2dPd$Z3d% Z4dUd&Z5dUd'Z6dUd(Z7	 	 dVd)Z8	 	 dWd*Z9	 	 	 dXd+Z:	 	 	 dXd,Z;d- Z<dYd.Z=dYd/Z>dYd0Z?dYd1Z@dYd2ZAdYd3ZBdZd4ZCdZd5ZD	 	 d[d6ZE	 	 	 	 d\d7ZF	 	 	 	 d\d8ZG	 	 	 	 d\d9ZH	 	 	 	 	 d]d:ZId^d;ZJd^d<ZKd_d=ZLd_d>ZMd`d?ZNdad@ZO	 dbdAZPdcdBZQ	 	 dddCZR	 	 	 dedDZS	 	 	 	 	 dfdEZTdF ZUd`dGZVdH ZWdI ZX	 	 	 	 dgdJZY	 	 	 	 	 	 dhdKZZdidLZ[didMZ\djdNZ]djdOZ^y)k    N)logging)lax)nn)splash_attention_kernel)splash_attention_mask)backend)check_conv_input_channels)#check_conv_transpose_input_channels)%compute_adaptive_pooling_window_sizes)+compute_conv_transpose_padding_args_for_jax)cast)convert_to_tensorc                 B    t        |       } t        j                  |       S N)r   jnnreluxs    m/var/www/html/emotional.easysim.app/public_html/venv/lib/python3.12/site-packages/keras/src/backend/jax/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                 B    t        |       } t        j                  |       S r   )r   r   sparse_sigmoidr   s    r   r   r   0   s    !Aa  r   c                 B    t        |       } t        j                  |       S r   )r   r   tanhr   s    r   r   r   5   r   r   c                 H    t        |       } | t        j                  |       z
  S r   )r   jnpr   r   s    r   tanh_shrinkr"   :   s    !Asxx{?r   c                 B    t        |       } t        j                  |       S r   )r   r   softplusr   s    r   r$   r$   ?   s    !A<<?r   c                 B    t        |       } t        j                  |       S r   )r   r   	soft_signr   s    r   softsignr'   D       !A==r   c           	          t        |       } t        j                  | |kD  | |z
  t        j                  | | k  | |z   d            S N        r   r!   wherer   	thresholds     r   soft_shrinkr0   I   sE    !A99	I	I		!yj.!i-5 r   c                 B    t        |       } t        j                  |       S r   )r   r   sparse_plusr   s    r   r2   r2   R       !A??1r   c                 B    t        |       } t        j                  |       S r   )r   r   silur   s    r   r5   r5   W   r   r   c                 F    t        |       } t        j                  | |      S )N)b)r   r   
squareplus)r   r7   s     r   r8   r8   \   s    !A>>!q!!r   c                 B    t        |       } t        j                  |       S r   )r   r   log_sigmoidr   s    r   r:   r:   a   r3   r   c                 F    t        |       } t        j                  | |      S )N)negative_slope)r   r   
leaky_relu)r   r<   s     r   r=   r=   f   s    !A>>!N;;r   c                 B    t        |       } t        j                  |       S r   )r   r   hard_sigmoidr   s    r   r?   r?   k   s    !AAr   c                 B    t        |       } t        j                  |       S r   )r   r   	hard_silur   s    r   rA   rA   p   r(   r   c                 F    t        |       } t        j                  | |      S N)alpha)r   r   elur   rD   s     r   rE   rE   u   s    !A771E""r   c                 B    t        |       } t        j                  |       S r   )r   r   selur   s    r   rH   rH   z   r   r   c                 D    t        |       } t        j                  | |      S r   )r   r   gelu)r   approximates     r   rJ   rJ      s    !A88A{##r   c                 F    t        |       } t        j                  | |      S rC   )r   r   celurF   s     r   rM   rM      s    !A88AU##r   c                 F    t        |       } t        j                  | |      S Naxis)r   r   glur   rQ   s     r   rR   rR      s    !A7714  r   c                 B    t        |       } t        j                  |       S r   )r   r   	hard_tanhr   s    r   rU   rU      r(   r   c                 r    t        |       } t        j                  t        j                  |       |kD  | d      S r*   )r   r!   r-   absr.   s     r   hard_shrinkrX      s,    !A99SWWQZ)+Q44r   c                 L    t        |       } t        j                  | |kD  | |      S r   r,   )r   r/   default_values      r   r/   r/      s#    !A99Q]A}55r   c                 F    t        |       } t        j                  | |      S rO   )r   r   softmaxrS   s     r   r\   r\      s    !A;;qt$$r   c                 F    t        |       } t        j                  | |      S rO   )r   r   log_softmaxrS   s     r   r^   r^      s    !A??14((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 )	N      rP      r   TrQ   keepdimsr+   )r   r!   sortcumsumarangeshapendimreshapesumr-   maximum)r   rQ   logitslogits_sortedlogits_cumsumrr_shapesupportklogits_cumsum_safetauoutputs               r   	sparsemaxrw      s    q!F388FTM==MJJ}48M

1fll4(1,-AcFKKGGDM			'A}q0A559GdT2A7M3?77%D4@1D
IC[[#s+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ra   )ra   ra   
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                  | |||||      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'.)
ValueErrorupperr   reduce_window)inputsinitial_value	reduce_fn	pool_sizestridespaddings         r   _poolr      sY    . ''y(EF
 	
 mmoG r   c                     t        j                  |      }| j                  dz
  }t        |||      }||n|}t        |||      }t	        | t
        j                   t        j                  |||      S )N   )	r   standardize_data_formatri   r   r   r!   infr   max)r   r   r   r   r   r~   s         r   max_poolr      st     11+>K{{Q+#[I #?iG)!;G #''377IwHHr   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 )Nr   r+   r   ra   )r   r   ri   r   r   r   addmathprodziprh   r!   onesdtype)r   r   r   r   r   r~   pooledar7   rh   window_countss              r   average_poolr     s    11+>K{{Q+#[I #?iG)!;G 63GWEF'		),,, 036<</K
%+a!q&Qa
 
 HHUFLL)GG
 %%
s   C0c                    t        j                  t        j                  |      | z  |z        j                  t         j                        }t        j
                  t        j                  d|dz         | z  |z        j                  t         j                        }||z
  }||k(  }|dz
  }| |z
  dz   }|}	||z   }
t        j                  ||
|	      }|j                  t         j                        S )z2Compute gather indices for Two-Pool Gather method.ra   )r!   floorrg   astypeint32ceilr-   )	input_dimoutput_size
big_windowwindow_startswindow_endswindow_sizesis_bigsmall_window	small_lensmall_indicesbig_indicesgathers               r   (_compute_adaptive_pooling_gather_indicesr   +  s     II	K	 9	,;fSYY  ((	A{Q	')	3{BfSYY  .LZ'F>LL(1,I!M)+KYYv{M:F==##r   c                    t        |t              r|f}|dk(  rt        j                  | d      } | j                  \  }}}|d   }t        ||      \  }}t        |||      }	t        j                  | dt        j                  d|dfdd      |z  }
t        j                  | dt        j                  d|dfdd      |z  }t        j                  |
|gd      }t        j                  ||	d      }|dk(  rt        j                  |d      }|S )	Nchannels_firstr   r   ra   r   r+   ra   ra   ra   ra   r   rP   r|   r}   r!   	transposerh   r   r   r   r   r   concatenatetaker   r   r   nlcout_lsmallbigr   
small_poolbig_poolcombinedouts                 r   _adaptive_average_pool1dr   D  s   +s#"n&&vy1llGAq!NE6q%@JE35aDF 	C1eQ-G	
 	  	&#swwCYP
	 
 
H5A>H
((8V!
,C&&mmC+Jr   c                 D   t        |t              r|f}|dk(  rt        j                  | d      } | j                  \  }}}|d   }t        ||      \  }}t        |||      }	t        j                  | t        j                   t        j                  d|dfdd      }
t        j                  | t        j                   t        j                  d|dfdd      }t        j                  |
|gd      }t        j                  ||	d      }|dk(  rt        j                  |d      }|S )Nr   r   r   ra   r   r   rP   r|   r}   r!   r   rh   r   r   r   r   r   r   r   r   r   s                 r   _adaptive_max_pool1dr   f  s   +s#"n&&vy1llGAq!NE6q%@JE35aDF""#''Aua=)WJ   #''AsA;	7H 
H5A>H
((8V!
,C&&mmC+Jr   c           	      r   t        |t              r||f}|dk(  rt        j                  | d      } | j                  \  }}}}|\  }}t        ||      \  }	}
t        |||
      }t        ||      \  }}t        |||      }t        j                  | dt        j                  d|	ddfdd      |	z  }t        j                  | dt        j                  d|
ddfdd      |
z  }t        j                  ||gd      }t        j                  ||d      }t        j                  |dt        j                  dd|dfdd      |z  }t        j                  |dt        j                  dd|dfdd      |z  }t        j                  ||gd      }t        j                  ||d      }|dk(  rt        j                  |d	      }|S )
Nr   r   r      ra   r+   ra   ra   ra   ra   ra   r   rP   r   r   r   ra   r   r   r   r   r   r   hwr   out_hout_wsmall_hbig_hgather_hsmall_wbig_wgather_wsmall_h_pool
big_h_pool
combined_hpooled_hsmall_w_pool
big_w_pool
combined_wr   s                          r   _adaptive_average_pool2dr     s   +s#"K0&&v|4JAq!QLE5:1eDNGU75%HH:1eDNGU75%HH 	C1gq!"4lG	
 	  	C1eQ"2L'	
 	  ,
!;!DJxx
H15H 	c377Q7A$6g	
 	  	c377Q5!$4lG	
 	  ,
!;!DJ
((:xa
0C&&mmC.Jr   c           	         t        |t              r||f}|dk(  rt        j                  | d      } | j                  \  }}}}|\  }}t        ||      \  }	}
t        |||
      }t        ||      \  }}t        |||      }t        j                  | t        j                   t        j                  d|	ddfdd      }t        j                  | t        j                   t        j                  d|
ddfdd      }t        j                  ||gd      }t        j                  ||d      }t        j                  |t        j                   t        j                  dd|dfdd      }t        j                  |t        j                   t        j                  dd|dfdd      }t        j                  ||gd      }t        j                  ||d      }|dk(  rt        j                  |d      }|S )	Nr   r   ra   r   r   rP   r   r   r   r   s                          r   _adaptive_max_pool2dr     s   +s#"K0&&v|4JAq!QLE5:1eDNGU75%HH:1eDNGU75%HH$$#''Aw1#5|WL ""#''Aua#3\7J ,
!;!DJxx
H15H$$377(CGGaGQ%7wL ""377(CGGaE1%5|WJ ,
!;!DJ
((:xa
0C&&mmC.Jr   c           
         t        |t              r|||f}|dk(  rt        j                  | d      } | j                  \  }}}}}|\  }}	}
t        ||      \  }}t        |||      }t        ||	      \  }}t        ||	|      }t        ||
      \  }}t        ||
|      }t        j                  | dt        j                  d|dddfdd      |z  }t        j                  | dt        j                  d|dddfdd      |z  }t        j                  ||gd      }t        j                  ||d      }t        j                  |dt        j                  dd|ddfdd      |z  }t        j                  |dt        j                  dd|ddfdd      |z  }t        j                  ||gd      }t        j                  ||d      }t        j                  |dt        j                  ddd|dfdd      |z  }t        j                  |dt        j                  ddd|dfdd      |z  }t        j                  ||gd	      }t        j                  ||d	      }|dk(  rt        j                  |d
      }|S )Nr   r   r   r      ra   r+   ra   ra   ra   ra   ra   ra   r   rP   r   r   r   r   ra   r   r   r    r   r   r   r   dr   r   r   out_dr   r   small_dbig_dgather_dr   r   r   r   r   r   small_d_pool
big_d_pool
combined_dpooled_dr   r   r   r   r   r   r   r   s                                    r   _adaptive_average_pool3dr     s   +s#"K=&&v7LLMAq!Q%E5%:1eDNGU75%HH:1eDNGU75%HH:1eDNGU75%HH 	GGAq!	
 	  	C1eQ1"5	
 	  ,
!;!DJxx
H15H 	GG7Aq!	
 	  	GG5!Q	
 	  ,
!;!DJxx
H15H 	GG1gq!	
 	  	GG1eQ	
 	  ,
!;!DJ
((:xa
0C&&mmC1Jr   c           
      j   t        |t              r|||f}|dk(  rt        j                  | d      } | j                  \  }}}}}|\  }}	}
t        ||      \  }}t        |||      }t        ||	      \  }}t        ||	|      }t        ||
      \  }}t        ||
|      }t        j                  | t        j                   t        j                  d|dddfdd      }t        j                  | t        j                   t        j                  d|dddfdd      }t        j                  ||gd      }t        j                  ||d      }t        j                  |t        j                   t        j                  dd|ddfdd      }t        j                  |t        j                   t        j                  dd|ddfdd      }t        j                  ||gd      }t        j                  ||d      }t        j                  |t        j                   t        j                  ddd|dfdd      }t        j                  |t        j                   t        j                  ddd|dfdd      }t        j                  ||gd      }t        j                  ||d      }|dk(  rt        j                  |d	      }|S )
Nr   r   ra   r   r   rP   r   r   r   r   r   s                                    r   _adaptive_max_pool3dr   M  s   +s#"K=&&v7LLMAq!Q%E5%:1eDNGU75%HH:1eDNGU75%HH:1eDNGU75%HH$$		
GQ1L ""#''AuaA#6J ,
!;!DJxx
H15H$$		
Aw1L ""		
AuaJ ,
!;!DJxx
H15H$$		
Aq'1L ""		
Aq%J ,
!;!DJ
((:xa
0C&&mmC1Jr   c                     t        j                  |      }| j                  dz
  }|dk(  rt        | ||      S |dk(  rt	        | ||      S |dk(  rt        | ||      S t        d      )Nr   ra   r   z3adaptive_average_pool supports only 1D/2D/3D inputs)r   r   ri   r   r   r   r   r   r   r   dimss       r   adaptive_average_poolr     sm    11+>K;;?Dqy'[IIqy'[IIqy'[II
J
KKr   c                     t        j                  |      }| j                  dz
  }|dk(  rt        | ||      S |dk(  rt	        | ||      S |dk(  rt        | ||      S t        d      )Nr   ra   r   z/adaptive_max_pool supports only 1D/2D/3D inputs)r   r   ri   r   r   r   r   r   s       r   adaptive_max_poolr     sm    11+>K;;?Dqy#FKEEqy#FKEEqy#FKEE
F
GGr   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.r   ry   ra   r   r   ra   )lhs_specrhs_specout_spec)tupleranger   ConvDimensionNumbers)r~   r   r   num_dimsspatial_dims	inputs_dn	kernel_dns          r   &_convert_to_lax_conv_dimension_numbersr    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        |      }t        | |j                        } t        j                  j                  | ||||||
      }|j                  d	k(  r| j                  d	k7  rt        d      |S )Nr   Fr   r   ry   rb   ra   r   zgThe number of input channels must be evenly divisible by kernel's in_channels. Received input channels z and kernel in_channels z. r   rhs_dilationdimension_numbersfeature_group_countzThe convolution operation resulted in an empty output. This can happen if the input is too small for the given kernel size, strides, dilation rate, and padding mode. Please check the input shape and convolution parameters.)r   r   ri   r  r   rh   r   r   r   jaxr   conv_general_dilatedsize)r   kernelr   r   r   dilation_rater~   r  channelskernel_in_channelsr  results               r   convr    s[    11+>K{{Q>
 *#(	G 0#(	M o%<<#<<?b)$$q(==EJ G""4!5R9
 	

 #&88v&FvV\\:FWW))"+/ * F {{aFKK1,G
 	
 Mr   c           	         t        j                  |      }t        |       } t        |      }t        | ||       | j                  dz
  }t        ||d      }t        |||d      }t        |||d      }|dk(  r| j                  d   n| j                  d   }t        j                  ||j                  d d d||j                  d   z  fz         }t        j                  j                  | ||||||	      S )
Nr   Fr	  r
  ry   rb   ra   r  r  )r   r   r   r	   ri   r  r   rh   r!   rj   r  r   r  )	r   r  r   r   r   r  r~   r  r  s	            r   depthwise_convr    s    11+>Kv&Fv&Fffk:{{Q>
 *#(	G 0#(	M (?:RQ  [[SbQ 3fll26F FGGF 77''"+/ (  r   c                     t        j                  |      }t        |       } t        |      }t        |      }t        | ||       t	        | |||||      }t        ||dd||      S )Nra   r   )r   r   r   r  )r   r   r   r	   r  r  )r   depthwise_kernelpointwise_kernelr   r   r   r  depthwise_conv_outputs           r   separable_convr   =  s     11+>Kv&F()9:()9:f&6D* # r   c           	      ~   t        j                  |      }t        |       } t        |      }t        | ||       | j                  dz
  }t        | j                  |j                  ||||      }t        ||d      }	t        |||d      }t        |||d      }t        j                  j                  | |||||	d      S )Nr   )input_shapekernel_shaper   r   output_paddingr  Fr	  r
  T)r   r  r  transpose_kernel)r   r   r   r
   ri   r   rh   r  r   r  r   conv_transpose)
r   r  r   r   r$  r   r  r~   padding_valuesr  s
             r   r&  r&  ]  s     11+>Kv&Fv&F'D{{Q@LL\\%#N ?
 *#(	G 0#(	M 77!!"+ "  r   c                 >   t        |       } |rm|dk  r|t        | j                        z   dz   }|d}t        j                  t        j
                  |       d      j                  |      }|j                  d   }| j                  D cg c]  }t        j                  |       }}t        t        j                  |ddi      }|j                  |t        j                  | d             |D 	cg c]#  }	|	j                  |d      j                  d      % }}	t        j                  |d      }t        | j                        }
|
j                  ||       t        |
      }
t        j                   ||f|
dd	      S t#        j$                  | |||
      S c c}w c c}	w )Nr   ra   float32indexingijr   rP   Trh   indices_sortedunique_indicesrQ   r   )r   lenrh   r!   greater_equalravelr   rg   listmeshgridinsertrl   rj   r   r   
jax_sparseBCOOr   one_hot)r   num_classesrQ   r   sparsevaluesvalues_countdimindicesr   rh   s              r   r8  r8    s\   !A!8#agg,&*D=E ""399Q<3::5A||A./gg6s3::c?66s||W<t<=tS[[A./GNO!199\1-44W=OO//'2QWWT;'eW	
 	
 ;;q+D>> 7 Ps   F.(Fc                    t        |       } t        | j                        dkD  rdnd}|rt        | ||d|      }t	        j
                  ||f      }t	        j                  |      }t        j                  |j                  d      j                  |      }t	        j                  ||j                  f|j                  dd      S t        j                  t        t        | d      |||      |	      S )
Nra   r   r   )rQ   r   r:  axesTr,  r/  rP   )r   r0  rh   r8  r6  bcoo_reduce_sumbcoo_sum_duplicatesr!   r1  datar   r7  r>  r   r   )r   r9  rQ   r   r:  reduction_axisr  r;  s           r   	multi_hotrF    s    !Aagg,*QN{WV
 ++F.9JK//7""6;;299%@V^^$,,	
 	
 77Q +DF r   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
        j                  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=ra   zPArguments `target` and `output` must be at least rank 1. Received: target.shape=rP   Trd         ?)r!   arrayrh   r   r0  r  r   r^   rk   clipr   epsilonlogtargetrv   from_logitsrQ   log_probs        r   categorical_crossentropyrT    s   YYvFYYvF||v||#"LL>H
 	

 6<<1"LL>H
 	
 66%%f4%8#''&$>>&'//"3S7??;L5LM776?GGFX%D111r   c                    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        j                  j                  ||      }nn|t        j                  ||d	
      z  }t        j                  |t        j                         dt        j                         z
        }t        j                  |      }t        j                  | |j                  |   |      } t        j                  | |z  |       S )Nr   r  rb   ra   rP   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=rI  TrJ  rK  )r!   rL  r0  rh   squeezer   r  r   r^   rk   rM  r   rN  rO  r   r8  rP  s        r   sparse_categorical_crossentropyrW    sj   YYvW-FYYvF
6<<C--&,,r2Ba2GV"-
6<<1"LL>+
 	

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

 66%%f4%8#''&$>>&'//"3S7??;L5LM776?[[d!3$?FGGFX%D111r   c                 j   t        j                  |       } t        j                  |      }| j                  |j                  k7  r%t        d| j                   d|j                         |rPt        j
                  j                  |      }t        j
                  j                  |       }d| z  |z  d| z
  |z  z
  S t        j                  |t        j                         dt        j                         z
        }| t        j                  |      z  }|d| z
  t        j                  d|z
        z  z  }| S )NrH  rI  r`   rK  )r!   rL  rh   r   r  r   r:   rM  r   rN  rO  )rQ  rv   rR  
log_logitslog_neg_logitsbces         r   binary_crossentropyr\    s   YYvFYYvF||v||#"LL>H
 	
 VV''/
++VG4f}z)S6\^,KKKXXfgoo/w7H1HIF
3776?
"CC&LCGGC&L111C4Kr   c                 .   |rt        d      d}t        j                  | j                        }|dv rd}t	        | d      } t        j                  | |d      }t        j                  | |d      }|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 )Nz5Argument synchronized=True is not supported with JAX.F)float16bfloat16Tr)  rJ  rc   )NotImplementedErrorr   standardize_dtyper   r   r!   meanvarrV  rM  finfor^  minr   )r   rA  rd   synchronized	need_cast	ori_dtyperb  variances           r   momentsrj    s0   !C
 	
 I))!''2I++	I88Atd+Dwwqtd3H{{4&;;x.xx#))CKK(,,cii.D.H.H
 88cii,00#))CKK2H2L2L
 D)$),>r   c                    dgt        | j                        z  }|j                  d   ||<   t        j                  ||      }t        j                  ||      }t        j
                  j                  ||z         }|t        j                  ||      }||z  }| |z  }	|t        j                  ||      }|	|z   }	t        j                  | |z  |	      S )Nra   r   )r0  rh   r!   rj   r  r   rsqrtr   )
r   rb  ri  rQ   offsetscalerN  rh   invress
             r   batch_normalizationrq  0  s     C#agg,E**Q-E$K;;tU#D{{8U+H
''--7*
+CE5)Ek%#+CVU+Fl771s7C  r   c                 $   t        | d      } t        |      }t        |d      }t        |d      }|j                  \  }}| j                  \  }dt        j                  |j                  d      }t        ||      }d }	 |	||      }
 |	||      }|
j                  |j                        }
|j                  |j                        }t        j                  |      }|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        j                   j#                  | ||j                        }t        j$                  d||      }t        j                  |d
      }t        j&                  |dz   f|j                        z  }|j(                  d d df   j+                  d      }t        j&                  |f|j                        z  }d fd}|||j                  d      f}t        j,                  j/                  |||f|      \  }\  }} |d   |d         }|j(                  d   j+                  |      }t        j                   j#                  ||dz   |j                        }t        j$                  d||       }|S )Nr   r  g     jr)  c                     t        j                  |      j                  d| j                  z  |fz         }t        j                  | d      } || k  }t        j
                  |      S )Nrz   rb   rP   )r!   rg   rj   ri   expand_dimslogical_not)lengths
max_lengthr>  
elem_valids       r   _lengths_to_paddingsz&ctc_loss.<locals>._lengths_to_paddingsT  sY    **Z(007<<:-/
 //'3w&
z**r   ra   rP   rb   )r   r   r   ra   r   r   )r9  r   zbtk,bnk->btnr   r+   c           	          t        j                  | d d d df   t        j                  | d d dd f   |      gd      S )Nra   rb   rP   )r!   r   	logaddexp)phiadded_scores     r   update_phi_scorez"ctc_loss.<locals>.update_phi_score~  s>    BQBZs1ab5z;?@r
 	
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 )Nrb   rK  ra   )r!   r}  rj   )prevr   prev_phi	prev_emitprev_phi_origlogprob_emitlogprob_phipad	next_emitnext_phi
batch_sizelog_epsilonrepeatr  s             r   	loop_bodyzctc_loss.<locals>.loop_body  s    ") #Hi+:N.NO)*&k3 MMQV|+Y-E
	 k)#i+-sV|0LL
 kk:q/*)OsSyI&==	&#)x)??)$x&;;;r   ra   r   zbn,bn->b)r   rh   r   result_typer   r   r   r   r^   r!   rk   r   r)  r  r   r  r   r8  einsumr   atsetr   scan)rQ  rv   target_lengthoutput_length
mask_indexmax_input_lengthr9  max_label_lengthr   ry  target_paddingsoutput_paddingslogprobslabel_lengthslogprobs_phi_one_hotlogprobs_emitlogalpha_phi_initlogalpha_emit_initr  xs_logalpha_philogalpha_emitlogalpha_phi_lastper_seq_lossr  r  r  r  s                             @@@@r   ctc_lossr  E  s    vW5Fv&F%mW=M%mW=M06-J +#)<< J K i8E&% F+ +=:JKO*=:JKO%,,V\\:O%,,V\\:Ov&H$swwQ'G'N'N		( M
 QVnq!"u-55ckkBFWWV-.FAq*zA~"==>L==y9Lvv~~Kx~~  H JJ~xBMMM-;M 	*.236<<H
	  *,,QT266s;*./v||D
	 

<2 '@'@'H	IB'*ww||%'9:B($A$m
 )b)9=;LM??2&**+<=L vv~~$q(%%  H
 JJz+<hGGLr   c                    t        |       } t        |d      }| j                  \  }}}||dz
  }t        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   r  ra   rb   rP   r+   )rz  r  r   )r   rh   r!   argmaxr   rg   r-   r  rt  tileargsorttake_along_axisrk   )r   sequence_lengthsmerge_repeatedr  r  rw  r9  r>  scoresseqlen_maskrepeat_maskinvalid_maskorders                r   _ctc_greedy_decoder    s    v&F()9I*0,,'J
K 1_
jjb)GWWV"%F**Z(q1K!1!T'!::KiiZ9GYY{C0Faen3B37ggk+;<))KW= j(Liib'2G OOCJJz2;EHHUZO,EIIlJ6EKKB'E!!'5r:Gggf1%ag..FoogA.GF?r   c                    t        |       } t        |      }| j                  \  }}t        j                  |       } 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                  | d d df   d      d d |	 d f   }
t	        j                  |
k(  |
      }|j                  d d d |	df   j                  |      }t	        j                  |dz  ft        j                   | j                         j                  d d d |	f   j                  t	        j"                  | d d df   |
d            }|d d d d df   k(  }fdd fd	fd
fdfd} t%        j&                  |      |||| |      \  }}t	        j                  |k(  |z
  dz
        }t	        j(                  |g d      }||fS )Nra   r   rP   rb   r  r   c                    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                        j
                     j                  
      }t        j                  |dz        }|}|
k(  }| ||k(  z  }	t        j                  |	
|      }| j
                  ||f   j                  |      } t        j                  |dz        }||z   }| ||fS )Nr   rP   ra   r   )r!   r  r  rg   r-   r  r  r  )pathsr  maskedr   path_tail_indexpaths_arange
path_tailsclassesprev_maskedmasked_repeat_pad
beam_widthr  r9  s             r   _extend_pathsz._ctc_beam_search_decode.<locals>._extend_paths  s<   

5+A6FK0FK0**Ud];zz!j.;">?<1)<<=
YY!3T:F
**[),,Z8<<TB((7A
N3D$
g(=>))M4967;;GDHHQJ'!ff$$r   c                     t        j                  |      }t        j                  ||z
        }t        j                  |      j                  |    j                  |      }t        j                  |      |z   }|S r   )r!   r   exp
zeros_liker  r   rO  )unique_inverser  
scores_max
scores_exps       r   _merge_scoresz._ctc_beam_search_decode.<locals>._merge_scores  s]    WWV_
WWVj01
'**>:>>zJ:-r   c                    t        j                  | ddz  
z  d	      \  } }t        |j                        dk\  rt        j                  |d      }t        j
                  |t         j                   |      }t        j
                  ||t         j                         } ||      } ||      }t        j                  ||      }t        j                  |      
 d  }| |   } ||   }||   }t        j                  | d      } t        j                  ||g      }t        j                  t        j                  
t              t        j                  
t              g      }| ||fS )NTr   r   return_inverser  rQ   
fill_valuera   rP   )r   ra   )r!   uniquer0  rh   rV  r-   r   r}  r  r  r   zerosboolr   )r  r  r  r  emit_scoresmask_scorestotal_scorestop_indicesr  r  r  r9  s           r   _prune_pathsz-_ctc_beam_search_decode.<locals>._prune_paths&  s>    #

[:-!
~ ~##$) [[a@Nii&9ii9#NK@#NK@}}[+>kk,/=k"!+.!+.'+{!;<YYz4(#((:t*DE
 ff$$r   c                 H     | |||      \  } }} | ||      \  } }}| ||fS r    )r  r  r  r   r  r  s       r   _decode_stepz-_ctc_beam_search_decode.<locals>._decode_stepF  s<     -eVVQ Gvv ,UFF Cvvff$$r   c           	      h    | \  }}}|\  }}t        j                  |d ||||      \  }}}|||fd fS )Nc                     | ||fS r   r  )r  r  r  r   s       r   <lambda>z8_ctc_beam_search_decode.<locals>._step.<locals>.<lambda>Q  s    eVV-D r   )r   cond)r  r   r  r  r  r  r  s         r   _stepz&_ctc_beam_search_decode.<locals>._stepK  sV     $vv; #D!
vv vv&,,r   c                 f   t        j                  | ||f|dd  |dd  f      \  \  }}}}t        j                  |ddz  z  d      \  }}	t	        |	j
                        dk\  rt        j                  |	d      }	 |	|      }t        j                  |       d  d d d   }
||
   }||
   }||fS )Nra   Tr   r   r  rP   rb   )r   r  r!   r  r0  rh   rV  r  )
init_pathsinit_scoresinit_maskedr   r  r  r  r  r  r  r  r  r  r  r  r9  	top_pathss              r   _decode_batchz._ctc_beam_search_decode.<locals>._decode_batch[  s     &)XXk2ABZQR)&
" !$

[:-!
~ ~##$) [[a@N~v6kk&)9*+6tt<k"$f}r   r{  )r   rh   r   r^   r!   rg   flipfullr   builtinsre  r  r-   r  r  r   r   r  r  vmapr   )r   r  r  r  r  r  max_seq_lenr  r  num_init_pathsmax_classesinit_classesr  r  r  r  r  r  r  r  r  r  r  r9  s     ```            @@@@@@@r   _ctc_beam_search_decoder    s*    v&F()9:+1<<(J[__V$F**[)$'26Fq$w6OOK 1_
 XXf1%Fz)A-JD	Q^[14syyJ \\+z:N++fQTl3A7G4GHK99[J6kJLq/>/14599,GJ 	*a*n-xv||L	A	 	S  1{C	D 
 Q1W%-K%2%@%
-  4 ,CHH]+KfkME6
 IIetmT;+>+BCEMM%+E&=r   c                     t        |       } t        j                  | j                  d      }t	        | |      } |dk(  rt        | |||      S |dk(  rt        | ||||      S t        d| d      )Nr)  greedy)r  r  beam_search)r  r  r  zInvalid strategy z2. Supported values are 'greedy' and 'beam_search'.)r   r   r  r   r   r  r  r   )r   r  strategyr  r  r  r  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. r     
   )rh   r   r   r   r!   rb  squarelog10)x1x2max_valmsepsnrs        r   r  r    s    	xx288BHH:U288* 5+ +
 	

  rxx8G
((3::b2g&
'C		'""R#))C.%88DKr   c                    	 ddl m} ddl m} ddl m} ddl m} ddl m}	 ddlm}
 t        j                         d   j                  d
k(  ry	  |       } |d      st        d      t        t        j                  |	      j                   j#                               }dD ]  }|j%                  |        |D ci c]  }|d }} |	| ||fd |d      i| t        j                  |      j                   }| || |d      ||dud	d}t        |j#                               D ]  }||vs|j'                  |         |di | y# t        $ r |rt        d      Y y	w xY wc c}w #  |r Y y	xY w)z+Verify the availability of flash attention.r   )_normalize_layout)check_compute_capability)check_cudnn_version)check_is_flash_attention)check_layout)dot_product_attentionFlash attention is not supported in your current JAX version. Please update it by following the official guide: https://jax.readthedocs.io/en/latest/installation.htmlFtpuTz8.0z#Require at least Ampere arch to run)querykeyvaluebiaslayoutNr
  BTNH)r  r  r  r
  cudnn_versionhas_biasis_trainingr  )(jax._src.cudnn.fused_attention_stablehlor  r  r   r  r  jax.nnr  ImportErrorr  devicesplatformRuntimeErrorr3  inspect	signature
parameterskeysremovepop)r  r  r  r	  raise_errorr  r  r   r  r  r  r  check_layout_paramsknown_paramcheck_layout_kwargscheck_is_flash_attention_paramscheck_is_flash_attention_kwargsparams                     r   _can_use_flash_attentionr"    s   N	
 	Q	
 	JI {{}Q  E)/ ,-'.DEE #l+66;;=
 G 	4K&&{3	4 5HHSsDyHH		

 %V,	
 "	
 +2*;*;$+

* 	( '/*D( +
' 9>>@A 	;E;;/33E:	; 	!C#BCm  I 
 4 I:s7   $E A,E' 8
E"A'E' *E' EE"E' 'E.c                    ||s| S t        j                  | d      }|t        j                  ||      }|rm| j                  d   | j                  d   }}t        j                  t        j
                  ||fd            }|d d d d d d f   }t        j                  ||      }t        j                  dt        j                  | j                        j                  z  | j                        }t        j                  || |      }|S )Nr  r  r   r   gffffff)r!   	ones_likelogical_andrh   trilr   asarrayrd  r   r   r-   )rm   mask	is_causalcombined_maskTSlarge_negative_numberpadded_logitss           r   _apply_masksr/    s    |IMM&7Mt<||AQ1xx!Qv67D$1$%t<KKsyy&***&,, IImV5JKMr   c                    t        j                  | j                  t         j                        }t        j                  d| ||      }|t        j
                  ||j                        z  }|||z   j                  |j                        }t        |||      }	|	j                  t         j                        }	t        j                  j                  |	d      j                  |j                        }
t        j                  d|
|      S )NzBTNH,BSNH->BNTS)preferred_element_typer  rb   rP   zBNTS,BSNH->BTNH)r!   promote_typesr   r)  r  rL  r   r/  r  r   r\   )r  r  r  r	  r(  r)  rn  logits_dtyperm   r.  probss              r   _dot_product_attention_corer5    s     $$U[[#++>LZZ5#lF ciiV\\22F4-''5 y9M "((5MFFNN=rN299#))DE::'66r   c                    |4| j                   d   |j                  j                   d   k7  rt        d      |t        j                  |      }n2t        j
                  | j                   d   | j                   d   f      }t        j                  |f| j                   d   z        }	t        j                  |	|||      }
 t        j                  |
      | |||      S )	a  Applies a wrapped flash attention mechanism using the Splash kernel.
    This function prepares the appropriate attention mask (causal or custom),
    constructs a multi-head mask, and applies the Splash multi-head attention
    kernel to the provided query, key, and value tensors. It supports optional
    sharding and soft capping of attention logits.
    Args:
        query: jax.Array. The query tensor of shape
            (batch, num_heads, seq_len, head_dim).
        key: jax.Array. The key tensor of shape
            (batch, num_heads, seq_len, head_dim).
        value: jax.Array. The value tensor of shape
            (batch, num_heads, seq_len, head_dim).
        decoder_segment_ids: Optional. Segment IDs for the decoder, used for
            sharding or masking.
        custom_mask: Optional[jax.Array]. A custom attention mask to apply. If
            None, a causal mask is used.
        attn_logits_soft_cap: Optional[float]. If provided, applies a soft cap
            to the attention logits.
        head_shards: int, default=1. Number of shards for the attention heads.
        q_seq_shards: int, default=1. Number of shards for the query sequence
            dimension.
    Returns:
        jax.Array: The result of applying the Splash multi-head attention
            kernel to the inputs.
    Raises:
        AssertionError: If sharding along the sequence dimension is attempted
            with decoder_segment_ids.
    r   ra   zESharding along sequence dimension not allowed in TPU kernel attention)rL  )rh   )masks)r(  head_shardsq_seq_shardsattn_logits_soft_cap)segment_ids)rh   qr   r   	NumpyMask
CausalMaskMultiHeadMaskr   make_splash_mhar  r  )r  r  r  decoder_segment_idscustom_maskr:  r8  r9  r(  multi_head_masksplash_kernels              r   wrap_flash_attentionrE  "  s    L &;;q>02288;;+ 
 $..[A$//;;q>5;;q>2

 ,99gA&O ,;;!1	M #388M"sE': r   c	                 @  *+, t        |       } t        |      }t        |      }t        | j                        dk7  s0t        |j                        dk7  st        |j                        dk7  r3t        d| j                   d|j                   d|j                   d      t	        j
                  | j                  |j                  |j                        }	t        | |	      } t        ||	      }t        ||	      }|t        ||	      }t        j                         d   j                  }
|
d	k(  }|t        | |||      }n|d
u rt        | |||d
       |r|rd}d}	 ddlm} ddlm}  |       }|rPt        ||      rD|j                   }d|j"                  v r*|j"                  j%                  d      }|j                  |   }t/        j0                  | d      }t/        j0                  |d      }t/        j0                  |d      }|j                  \  }}}}|||t3        j4                  |      z  z  }t/        j6                  ||gt.        j8                        }t;        j<                  ||      }d}||j                  t.        j>                  k7  r|jA                  d      n|}|jB                  dk(  r|j                  d   |k(  r|d   }n&|jB                  dk(  r|j                  d   |k(  r|d   }|rR|Pt/        jD                  t/        jF                  ||ft.        j>                              }t/        jH                  ||      }|<|r:t/        jD                  t/        jF                  ||ft.        j>                              }t        |t        jJ                  jL                        s$t        |t        jJ                  jL                        rd}n+	 tO        ||||||||      }t/        j0                  |d      S tS        t        jT                  d      r9|rddgndg} | D ]+  }!	 t        jT                  jW                  | |||||||!      c S  |rtY        d       | j                  }"|j                  \  }#}#+}$|d!t/        j4                  |$      z  n|}| j                  \  }%}&,}$,+z  *t/        jZ                  | |%|&+*|$f      } *+,fd"}' |'|d#      } |'|d$      }t        j\                  t^        d%d&      }( |(| ||||||      })t/        jZ                  |)|"      S # t&        t        t(        f$ r t+        j,                  d       Y w xY w# tP        $ r t+        j,                  d       d}Y vw xY w# tP        $ r t+        j,                  d|! d       Y zw xY w)'a  Computes dot-product attention given query, key, and value.

    This is the core computation of attention that is used in transformers.
    For TPU platforms, flash attention optimizations are automatically applied
    when possible, and sharding parameters are inferred from the layout map
    in the current distribution context.

    Args:
        query: Queries with shape `[batch, time, heads,
            depth_k]`.
        key: Keys with shape `[batch, time, heads,
            depth_k]`.
        value: Values with shape `[batch, time, heads,
            depth_v]`.
        bias: Optional bias with shape broadcastable to
            `[batch, heads, dest_time, source_time]`.
        mask: Optional mask with shape broadcastable to
            `[batch, heads, dest_time, source_time]`.
        scale: Float. Optional scale that is applied to the attention
            computation.
        is_causal: Boolean. Specifying whether causal masking is applied.
        flash_attention: Boolean. Whether to use flash attention optimization
            for increased performance. Default to None, which means it will
            be auto-determined based on the platform, input shapes and
            compatibility.
        attn_logits_soft_cap: Float. Optional float to softly cap attention
            logits to avoid numerical stability issues. Applied as:
            `logits = logits / (1.0 + abs(logits) / attn_logits_soft_cap)`.

    Returns:
        JAX Array of shape `[batch, time, heads, depth_v]`.
    r   zG`dot_product_attention` only supports 4D inputs. Received: query.shape=z, key.shape=z, value.shape=.Nr  r   r  T)r  ra   )ModelParallel)distributionmodelzfFailed to determine distribution context for sharding. Using default head_shards=1 and q_seq_shards=1.)r   r   ra   r   r@  )r<  kvr  r   rz  F)rA  rB  r:  r8  r9  zdFailed to apply Splash kernel for flash attention. Falling back to JAX native dot_product_attention.r  cudnnxla)r	  r(  rn  r)  implementationzFailed to apply z0 implementation of jax.nn.dot_product_attention.r  rK  c           	         | | j                   dk  r`| j                   dk(  r*| j                  d   k(  rt        j                  | d      } nt        j                  | d      } | j                   dk  r`| j                  \  }}}}|dk(  r-t        j                  | d d d d d d d d d f   ||||f      } | S |k7  rt        d| d d| j                   d	      t        j                  | |||f      } | S )
Nr   r   ra   r   rP   z
Expected `z4` to have shape (B, 1, T, S) or (B, N, T, S) with N=z	 but got rG  )ri   rh   r!   rt  broadcast_tor   rj   )	tt_nametBtNtTtSGKNs	         r   _reshape_to_groupedz2dot_product_attention.<locals>._reshape_to_grouped2  s   =&&1*66Q;1771:?2A2A	 &&1*
 WWNBBQw$$Qq!T1a'7%82r1b":MN  7$$VH -//0c177)1F  KKB1b"#56r   r	  r(  )r   NNr   r   NN)in_axesout_axes)0r   r0  rh   r   r   r  r   r   r  r  r  r"  'keras.src.distribution.distribution_librH  rI  r|   device_mesh
axis_namesindexr  AttributeErrorr   	exceptionr!   r   r   sqrtr  r   r   
SegmentIdsbool_r   ri   r&  r   r%  coreTracerrE  	Exceptionhasattrr   r  r  rj   r  r5  )-r  r  r  r	  r(  rn  r)  flash_attentionr:  compute_dtyper  is_tpur8  r9  rH  get_distdistmeshmodel_dim_indexquery_tpu_layoutkey_tpu_layoutvalue_tpu_layoutbs	num_headsq_lenhead_dimr;  rA  rB  	mask_boolcausal_maskrv   implsimploutput_shaper  HBr+  rZ  
vmapped_fnencodedrW  rX  rY  s-                                             @@@r   r  r  f  sZ   V e$E
C
 Ce$E
5;;1CII! 3s5;;7G17L%%*[[Mcii[ I ;;-q*
 	

 ''SYYLM&E
sM
"C&E ]; {{}Q((HF 25#udK	D	  	!UDdK /	M
 :D
47''doo-&*oo&;&;G&DO"&**_"=K ==\Bs>==\B)9)?)?&Iuh   05499X;N3NO iiU399=5@@k

 /3zzSYY/FF+DI~~"yq'9R'?'l1$);r)A'o[4!hhHHeU^399= "ook;G9((388UEN#))#LMK dCHHOO,
1
 $O(-$"$(; +)= +!-	 }}V,?? svv./$3% % 	Dvv33'#' 4 	 		$ E
 	
 ;;LJAq!Q#(=S388A;eE JAq!Q	QAKK1aA/E& tV,DtV,D#1J
 UD$	5IG;;w--Y Z8 	B	@  (!!H #((,  !!&tf -4 4s7   A%T  )U &&U7 )UU U43U47"VVc           	      f   d } ||      } ||      } ||      } ||      }	| j                   \  }
}}}t        d |D              r*t        j                  | dd|d   |d   f|d   |d   ff      } t	        j
                  | ||	d|d      }|j                   \  }}}}|j                  |
|||z        S )	a  JAX implementation of Unfold.
    Extract sliding local blocks from a **NCHW** batched image tensor.

    Args:
        input: 4-D tensor, shape (N, C, H, W)  **required**.
        kernel_size: int or (kH, kW)
        dilation: int or (dH, dW), default 1
        padding: int or (pH, pW), default 0
        stride: int or (sH, sW), default 1

    Returns:
        3-D tensor, shape (N, C*kH*kW, L)
    c                 .    t        | t              r| | fS | S r   r{   r   s    r   _pairzunfold.<locals>._pair_  s    #As+1v22r   c              3   &   K   | ]	  }|d kD    yw)r   Nr  ).0r  s     r   	<genexpr>zunfold.<locals>.<genexpr>j  s     
Q1q5
s   rz  r   ra   VALID)NCHWOIHWr  )filter_shapewindow_stridesr   r  r  )rh   anyr!   r  r   conv_general_dilated_patchesrj   )inputkernel_sizedilationr   strider  rs   r   psrY  Cr}  Wpatchesr  CKKoHoWs                      r   unfoldr  P  s    3 	kAhAgAfAJAq!Q 
!
1qtqtQqTlKL..2G ]]NAsB??1c27++r   c                    d } ||      \  }} ||      \  }	}
 ||      \  }} ||      \  }} ||      \  }}| j                   \  }}}||	|
z  z  }|d|z  z   ||	dz
  z  z
  dz
  |z  dz   }|d|z  z   ||
dz
  z  z
  dz
  |z  dz   }t        j                  | ||||f      } t        j                  || j                        }|j                  |||	|
      }|j                  dddd      }t        j                  |d      }|d|z  z   }|d|z  z   }t        j                  | |||fd	||fd
      }|dkD  s|dkD  r|dddd|||z
  |||z
  f   }|S )a4  JAX implementation of Fold (col2im).
    Combine an array of sliding local blocks into a large tensor.

    Uses ``lax.conv_transpose`` with an identity kernel so that the
    entire operation is JIT-compilable and runs on XLA.

    Args:
        x: 3-D tensor, shape (N, C*kH*kW, L)  **required**.
        output_size: int or (oH, oW)
        kernel_size: int or (kH, kW)
        dilation: int or (dH, dW), default 1
        padding: int or (pH, pW), default 0
        stride: int or (sH, sW), default 1

    Returns:
        4-D tensor, shape (N, C, oH, oW)
    c                 .    t        | t              r| | fS | S r   r{   )vals    r   r  zfold.<locals>._pair  s    'S1Sz:s:r   r   ra   r  r   r   r   rP   r  )r  HWIOr  )r   r   r  r  N)	rh   r!   rj   eyer   r   r  r   r&  )r   r   r  r  r   r  r  r  r  kHkWdHdWpHpWsHsWrY  r  Lr  nHnWr  oH_padoW_padrv   s                              r   foldr  {  s   &; ;FB;FB8_FB7^FB6]FBIAsARA q2v+b1f
%
)b	01	4B
q2v+b1f
%
)b	01	4B 	A3B'(A WWS(F^^CB+FaAq)FXXf6*F !b&[F!b&[F 	R"X2F 
Ava1b6B;.Vb[0@@AMr   c           	         |dk(  rm| j                   \  }}}}||dz  z  }t        j                  | ||||||f      } t        j                  | d      } t        j                  | |||z  ||z  |f      } | S | j                   \  }}}}||dz  z  }t        j                  | ||||||f      } t        j                  | d      } t        j                  | ||||z  ||z  f      } | S )a+  JAX implementation of depth_to_space (pixel shuffle).

    Rearranges data from depth into blocks of spatial data.

    Args:
        x: 4-D tensor with shape (N, H, W, C) for channels_last or
            (N, C, H, W) for channels_first.
        block_size: An integer specifying the block size.
        data_format: "channels_last" or "channels_first".

    Returns:
        A tensor with shape (N, H*block_size, W*block_size, C/block_size**2)
        for channels_last or (N, C/block_size**2, H*block_size, W*block_size)
        for channels_first.
    ry   r   r   ra   r   r   r      )r   ra   r   r   r  r   rh   r!   rj   r   )r   
block_sizer   r   r   r   r   new_cs           r   depth_to_spacer    s      o%WW
1aj!m$KKAq!ZUCDMM!/0KKAq:~q:~uEF H WW
1aj!m$KKAuj*aCDMM!/0KKAua*na*nEFHr   c           	         |dk(  ro| j                   \  }}}}||z  }||z  }t        j                  | ||||||f      } t        j                  | d      } t        j                  | |||||dz  z  f      } | S | j                   \  }}}}||z  }||z  }t        j                  | ||||||f      } t        j                  | d      } t        j                  | |||dz  z  ||f      } | S )a#  JAX implementation of space_to_depth (pixel unshuffle).

    Rearranges blocks of spatial data into depth.

    Args:
        x: 4-D tensor with shape (N, H, W, C) for channels_last or
            (N, C, H, W) for channels_first.
        block_size: An integer specifying the block size.
        data_format: "channels_last" or "channels_first".

    Returns:
        A tensor with shape (N, H/block_size, W/block_size, C*block_size**2)
        for channels_last or (N, C*block_size**2, H/block_size, W/block_size)
        for channels_first.
    ry   r  r   )r   ra   r   r  r   r   r  )	r   r  r   r   r   r   r   new_hnew_ws	            r   space_to_depthr    s      o%WW
1aZZKKAuj%QGHMM!/0KKAueQQ->?@ H WW
1aZZKKAq%UJGHMM!/0KKAq:q=0%?@Hr   )g      ?)r   )g?)rK  )T)rb   )ry   T)Nr   )Nr   N)r   r   )ry   F)ra   r   Nra   )ra   r   NNra   )rb   NF)Frb   )F)FF)NNgMbP?)r   )TN)d   ra   N)r  r  ra   Tr   )NNra   ra   )NNNFNN)ra   r   ra   )ry   )_r  r  r   r  jax.experimental.sparseexperimentalr:  r6  	jax.numpynumpyr!   abslr   r   r   r   0jax.experimental.pallas.ops.tpu.splash_attentionr   r   	keras.srcr   &keras.src.backend.common.backend_utilsr	   r
   r   r   keras.src.backend.jax.corer   r   r   r   r   r   r   r"   r$   r'   r0   r2   r5   r8   r:   r=   r?   rA   rE   rH   rJ   rM   rR   rU   rX   r/   r\   r^   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r&  r8  rF  rT  rW  r\  rj  rq  r  r  r  r  r  r"  r/  r5  rE  r  r  r  r  r  r  r   r   <module>r     sl      
 , ,      L , 8


!






"

<


#

$
$
!

5
6
%
)
*  #	, #R I, %&P$2D<5p)XbJPf	L	H  8 9~ -h F 0f?8.2428,D ?C!*i^ 	(\ `L  
F
GT*72 AP 
	
g.T(,VCL$N&r   