
    Vpfi              	         d dl mZ d dlmZmZ d dlmZ d dlZd dlm	Z	 d dl
mZ d dl
mZ d dl
mZ d d	l
mZ d d
lmZ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"Z#d dlm$Z$ d dlm%Z% d dl&m'Z' d dl
m(Z( ej)        Z*ej+        Z,	 	 dhdid"Z-	 	 dhdjd'Z.dkd+Z/	 	 dhdld.Z0	 	 dhdld/Z1	 	 dhdld0Z2	 	 dhdld1Z3	 	 dhdld2Z4dmd7Z5dnd:Z6dod<Z7d= Z8d> Z9 ej:        d?          Z;d@ Z<e<ej=        e;<   dAe;_>        e;?                     eej@        e;                     e;A                    e8           e9ejB        e;<   dB ZC ejD        e;eC           dC ZEdD ZFdE ZG ejH        eEejI        dF          ZJ ejK        eJeF            eeGe0          ejB        eJ<   dG ZLdH ZM	 	 dhdIZN ejH        eMejI        dJ          ZO ejP        eO eeLejQ                              eeGe2          ejB        eO<    ejH        eMejI        dK          ZR ejP        eR eeLejS                              eeGe3          ZT eeGe3          ejB        eR<   dL ZU ejD        eJ eeUejV        dM                       ejD        eR eeUejW        ejX                              ejD        eO eeUejY        ejZ                             dN Z[ ejH        e[ejI        dO          Z\dP Z] ejD        e\e]           dQ Z^dR Z_dS Z`dT Za ejH        e^ejI        dU          Zbe`ejc        eb<   e_ej=        eb<   eaejB        eb<   dV Zd ejD        eb eje         eeddWX          dWY                      ejD        eb eje         eeddAX          dWY          dZ[            ejD        eb eje         eeddAX          dWY          d\[           d] Zfd^d_dpdbZgdc Zhdd Zide Zjdf Zk ejH        efejI        dg          Zleiej=        el<   ejejc        el<   ekejB        el<    ejD        el eje        ehdWY                      ejD        elegd\[           dS )q    )annotations)CallableSequence)partialN)	tree_util)core)dispatch)dtypes)util)ConcreteArrayShapedArray)ad)batching)mlir)convolution)lax)slicing)ir)hlo)	logaddexp)Array)ClosedJaxpr)jaxpr_as_fun)	jvp_jaxpr)ad_utilwindow_dimensions
core.Shapewindow_stridesSequence[int]paddingstr | Sequence[tuple[int, int]]base_dilationSequence[int] | Nonewindow_dilationc                   t          j        |           \  }}	t          j        |          \  }
}|	|k    rt          d|	 d|           t          |          t          |
          k    r/t          dt          |           dt          |
                     t          |          dk    rt          d          t	          |t
                    rI||nt          j        ||          }t          t          j	        |d         j
        |||                    }nt          |          }|dt          |          z  }|dt          |          z  }t          ||
          }|r || |||||          S t          t          j        |
          }t          j        |t          |          |          \  }}|	|k    rt          d|	 d|           t          j        g ||
R |j        t          |j                  t          |          t          |          |t          |          t          |          d	}t          j        ||          S )
zWraps XLA's `ReduceWindowWithGeneralPadding
  <https://www.tensorflow.org/xla/operation_semantics#reducewindow>`_
  operator.
  z;Operands must have the same tree structure as init_values: z vs. z9Must have same total number of operands as init_values:  r   z-reduce_window must have at least one operand.N   zGreduce_window output must have the same tree structure as the operands jaxprconstsr   r   r    r"   r$   )r   tree_flatten
ValueErrorlen
isinstancestrr   _dilate_shapetuplepadtype_to_padsshape_get_monoid_window_reducermap_abstractify_variadic_reduction_jaxprreduce_window_pbindr)   r*   tree_unflatten)operand
init_valuecomputationr   r   r    r"   r$   flat_operandsoperand_treeflat_init_valuesinit_value_treedilated_window_dimsmonoid_reducerflat_init_avalsr)   out_treeout_flats                     `/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/jax/_src/lax/windowed_reductions.py_reduce_windowrH   /   s    !* 6w ? ?-&/&<Z&H&H#O_$$
	=$	= 	=+:	= 	=   	3/0000
	=	= 	=%()9%:%:	= 	=  
 	1
D
E
EE ,4+_==  C'a 3^WN N O OGG GnnG30111MS!2333O-k;KLL. 8>'#4ng': : : #*,<==O3U?++_ OE8 x	*	* 	*'	* 	*+ + + # 
	
	
 
 kU\"" 122^,,M**o..
 
 
H #Hh777    r=   r   returnr   c           
     .    t          | |||||||          S N)rH   r;   r<   r=   r   r   r    r"   r$   s           rG   reduce_windowrN   t   s.     
	
 	
 	rI   xsSequence[Array]Callable | Nonec                   t          |          dk    rd S |\  }t          j        |          }t          |          t          u r|j        dk    r| t          j        u r|j        dk    ot          S | t          j
        u r)|j        t          j        |j                  k    ot          S | t          j        u r)|j        t          j        |j                  k    ot           S d S )Nr'    r   )r-   r   get_avaltyper   r3   r   addval_reduce_window_summax_get_max_identitydtype_reduce_window_maxmin_get_min_identity_reduce_window_min)	monoid_oprO   xavals       rG   r4   r4      s     	WW\\4	"!	q		$
4jjM!!tzR'7'7CGX]111	cg		h#/
;;; %$&	cg		h#/
;;; %$&	rI   r;   Sequence[tuple[int, int]]c           
        |dt          |          z  }|dt          |          z  }t                              | t          |          t          |          t          |          t          |          t          |                    S Nr&   )r   r   r    r"   r$   )r-   reduce_window_sum_pr9   r1   r;   r   r   r    r"   r$   s         rG   rX   rX          
 30111MS!2333O		!	!'8!9!9>**E'NN-((O,,	 
" 
. 
. .rI   c                   t          j        | d          }t          j        t           j        t          j        |                    \  }}|dt          |          z  }|dt          |          z  }t                              | |||t          |          t          |          t          |          t          |          t          |          	  	        \  }	|	S )Nr'   r&   r(   )	r   _const_reduction_jaxprmulr6   r-   r8   r9   r1   
r;   r   r   r    r"   r$   r<   r)   r*   outs
             rG   _reduce_window_prodro      s    
 z'1%%*&sw0@0L0LMM-%30111MS!2333O			zv/00>**E'NN-((O,, 
 
. 
.$# 
*rI   c           
        |dt          |          z  }|dt          |          z  }t                              | t          |          t          |          t          |          t          |          t          |                    S re   )r-   reduce_window_max_pr9   r1   rg   s         rG   r\   r\      rh   rI   c           
        |dt          |          z  }|dt          |          z  }t                              | t          |          t          |          t          |          t          |          t          |                    S re   )r-   reduce_window_min_pr9   r1   rg   s         rG   r_   r_      rh   rI   c                   t          j        | t          j                   }t          j        t
          t          j        |                    \  }}|dt          |          z  }|dt          |          z  }t          	                    | |||t          |          t          |          t          |          t          |          t          |          	  	        \  }	|	S )Nr&   r(   )r   rj   npinfrk   r   r6   r-   r8   r9   r1   rm   s
             rG   _reduce_window_logaddexprw      s     z'BF7++*&y#2B:2N2NOO-%30111MS!2333O			zv/00>**E'NN-((O,, 
 
. 
.$# 
*rI   selectsourcer<   scatterc                @   t          j        |t          j        |                    \  }}	t          j        |t          j        |                    \  }
}t                              | ||||	|
|t          |          t          |          t          |          
  
        S )N)select_jaxprselect_constsscatter_jaxprscatter_constsr   r   r    )r   rk   r6   select_and_scatter_pr9   r1   )r;   rx   r   r   r    ry   r<   rz   r|   r}   r~   r   s               rG   _select_and_scatterr      s    
 !$ 4
CZ((!* !*,"%"6Sj))#+ #+-		"	"vz!#u=N7O7O>**E'NN	 
# 
D 
D DrI   select_primcore.Primitivec           
         t                               | ||t          |          t          |          t          |                    S )N)r   r   r   r    )select_and_scatter_add_pr9   r1   ry   r;   r   r   r   r    s         rG   _select_and_scatter_addr      sJ    
 
"	&	&g;/00>**E'NN 
' 
D 
D DrI   tangentsc                    t                               | ||t          |          t          |          t          |          t          |          t          |                    S )a+  Extracts the tangent corresponding to the minimum or maximum element in
  each window of the `operand` array.

  Wraps XLA's `ReduceWindow
  <https://www.tensorflow.org/xla/operation_semantics#reducewindow>`_
  operator, which applies a reduction function to all elements in each window of
  the input multi-dimensional array. In this case, the input multi-dimensional
  array is built by packing each element in the `operand` array with its
  corresponding element in the `tangents` array.

  Args:
    tangents: an array
    operand: an array with the same shape as `tangents`
    select_prim: a reduction function (restricted to `ge_p` and `le_p`)
    window_dimensions: an array of integers for window dimension values
    window_strides: an array of integers for window stride values
    base_dilation: an array of integers for base dilation values
    window_dilation: an array of integers for window dilation values

  Returns:
    An array containing the elements in `tangents` corresponding to the output
    of the reduction of `operand` fin each window.
  )r   r   r   r    r"   r$   )select_and_gather_add_pr9   r1   )r   r;   r   r   r   r    r"   r$   s           rG   _select_and_gather_addr   
  s]    < 
!	%	%[/00>**E'NN-((O,, 
& 
. 
. .rI   c                   t          j        |t          |          dz  g          \  }}	t          d t	          ||	          D                       r9d}
t          |
                    d |D             d |	D                                 t          d |	D                       r.d}
t          |
                    d |	D                                 t          |d	         |||||          t          fd
|D                       S )N   c              3  <   K   | ]\  }}|j         |j         k    V  d S rL   r[   ).0oivs      rG   	<genexpr>z4_reduce_window_abstract_eval_rule.<locals>.<genexpr>;  s@       	 	#aag	 	 	 	 	 	rI   zsreduce_window got inconsistent dtypes for operands and init_values: got operand dtypes {} and init_value dtypes {}.c                    g | ]	}|j         
S rS   r   )r   r   s     rG   
<listcomp>z5_reduce_window_abstract_eval_rule.<locals>.<listcomp>@  s    ???A???rI   c                    g | ]	}|j         
S rS   r   )r   r   s     rG   r   z5_reduce_window_abstract_eval_rule.<locals>.<listcomp>A  s    BBBRBBBrI   c              3  F   K   | ]}t          |j                  d k    V  dS )r   N)r-   r3   r   vs     rG   r   z4_reduce_window_abstract_eval_rule.<locals>.<genexpr>B  s/      33qQW	333333rI   zPreduce_window expected init_values to be scalars but init_values have shapes {}.c                    g | ]	}|j         
S rS   r3   r   s     rG   r   z5_reduce_window_abstract_eval_rule.<locals>.<listcomp>E  s    @@@A@@@rI   r   c              3  B   K   | ]}t          |j                  V  d S rL   )r   r[   )r   op	out_shapes     rG   r   z4_reduce_window_abstract_eval_rule.<locals>.<genexpr>N  s/      HHB{9bh//HHHHHHrI   )	r   
split_listr-   anyzip	TypeErrorformat _common_reduce_window_shape_ruler1   )r)   r*   r   r   r    r"   r$   avalsoperand_avalsinit_val_avalsmsgr   s              @rG   !_reduce_window_abstract_eval_ruler   0  sL    #'/%#e**/9J"K"K- 	 	'*=.'I'I	 	 	   E>C
CJJ?????BB>BBBD D E E E33N33333 CC
CJJ@@@@@AA
B
BB.A ) 
HHHH-HHH	H	HHrI   c                  t          |           dz  }	t          j        | |	g          \  }
}t          j        ||	g          \  }}t          d |D                       rt	          d          t          d t          |
|          D                       fdt          |
|          D             }
d|z   }d|z   }d|z   }d|z   }d|z   }t          j        |
|z   |||||||d}|d	|	z  fS )
Nr   c              3     K   | ]}|d uV  	d S rL   rS   )r   	init_bdims     rG   r   z4_generic_reduce_window_batch_rule.<locals>.<genexpr>a  s'      AA9$	AAAAAArI   z<reduce_window batching is not implemented for initial valuesc              3  :   K   | ]\  }}||j         |         V  d S rL   r   )r   ra   axs      rG   r   z4_generic_reduce_window_batch_rule.<locals>.<genexpr>e  s9       ! !ea gbk! !rI   c                B    g | ]\  }}t          j        ||          S rS   )r   bdim_at_front)r   argbdimsizes      rG   r   z5_generic_reduce_window_batch_rule.<locals>.<listcomp>g  s<     = = =#t $S$55 = = =rI   r&   r   r   r(   r   )	r-   r   r   r   NotImplementedErrornextr   r8   r9   )batched_args
batch_dimsr)   r*   r   r   r    r"   r$   num_operandsoperandsinit_valuesoperand_bdimsinit_value_bdimsoutsr   s                  @rG   !_generic_reduce_window_batch_ruler   Q  s]    \""a',/,GG(K$(OJ$O$O!-!AA0@AAAAA 0
 / 0 0 0 
 ! !s8]'C'C ! ! ! 
! 
!$= = = ="8];;= = =(...(.'&-?*/		;uV).]%	
' 
' 
'$
 
tl"	""rI   rN   c	           
     R   |}	t          |           dz  t          j        | g          \  }
}t          j        |g          \  }}t          d |D                       st	          d          t          t          j        |          }t          |	|          }t          |dt          |          z  dgt          |          z            d         fd}t          g |
|g ||||||||          }t          j        |t          |          dz  g          \  } }g | g |fS )	Nr   c              3  J   K   | ]}t          |t          j                  V  d S rL   )r.   r   Zero)r   ts     rG   r   z$reduce_window_jvp.<locals>.<genexpr>  s.      @@Z27##@@@@@@rI   z?reduce_window jvp does not support non-zero init_value_tangent.)TFr   c                    t          j        | g          \  }}t          j        |g          \  }} t                    g ||||R  S rL   )r   r   r   )leftrightpltlprtrjvp_reductionns         rG   wrapperz"reduce_window_jvp.<locals>.wrapper  s^    _TA3''FB_UQC((FB&<&&::R:":r::::rI   rM   )r-   r   r   allr   r5   r   instantiater   r   rH   )primalsr   r   r   r    r"   r$   r)   r*   reduction_jaxprr;   r<   operand_tangentinit_value_tangentc_reduction_jaxprr   jvp_primals_tangentsr   r   s                    @@rG   reduce_window_jvpr   y  st    /	'lla!!55':(,1#(F(F%/%	@@-?@@@	@	@ W
U
V
VV7.0BCC!/6::-wX/FRUVhRiRiHijjklm-; ; ; ; ; ;
 (**/*3:3 23)#!%	 	 	 o&:SAU=V=VZ[=[<\]]'8	7[x[	  rI   Tc               
    t          j        |t          |          dz  g          \  }	}
t          j         j        t          |	          g          \  }}d	 fd}t	          j         d||	|
| j        |||||          S )
Nr   reducerir.BlockrJ   Sequence[ir.Value]c                    j         rt          d          t          j        j        j        t          j                    g| j        R dj        i\  }}t          j	        |          S )Nz'Cannot lower effectful `reduce_window`.dim_var_values)
effectsr   r   jaxpr_subcompmodule_context
name_stackTokenSet	argumentsr   flatten_ir_values)r   	out_nodes_r*   ctxr)   s      rG   reducer_bodyz2_generic_reduce_window_lower.<locals>.reducer_body  s|    } K IJJJ%c&8%+")"3+ + +)+ +LIq !),,,rI   generic_reduce_window_reducerreducer_namer   r   r   init_values_avals	out_avalsr   r   r"   r$   r    r   r   rJ   r   )r   r   r-   avals_inr   rN   	avals_out)r   r)   r*   r   r   r    r"   r$   argsr   r   r   init_value_avalsr   s   ```           rG   _generic_reduce_window_lowerr     s     /$Ta0@AA(Ks8}}oFF!- - - - - - - - 
		2()#!%
 
 
 rI   c                   t          j        | j        t          j                  s@d}t          |                    t          j        | j                  j                            t          | |||||          S )Nz=operand to reduce_window_sum must have a number dtype, got {})	r
   
issubdtyper[   ru   numberr   r   namer   r;   r   r   r    r"   r$   r   s          rG   _reduce_window_sum_shape_ruler     sm    		7=")	4	4 >
IC
CJJrx66;<<
=
==	)'3D*8'*7
J 
J JrI   c          	        t          j        |          sJ |j        j        }t	          j        |||| j        |||          }dgt          |          z  }	d t          ||          D             }
t          j	        | t          j
        |           |
          }t          |||dgt          |          z  |	|          }|j        |k    sJ |j        |f            |gS )Nr'   c                *    g | ]\  \  }}}|||d z
  fS r&   rS   )r   lohistrides       rG   r   z5_reduce_window_sum_transpose_rule.<locals>.<listcomp>  sA     G G G(R& VaZ( G G GrI   r   )r"   r$   )r   is_undefined_primalrb   r3   r   _conv_general_vjp_lhs_paddingr-   r   r   pad_zerorX   )	cotangentr;   r   r   r    r"   r$   input_shapepadsonespadding_configpad_cotangentresults                rG   !_reduce_window_sum_transpose_ruler    s    
		(	(((("+		2$niow_
& 
&$ s;	$G G,/n,E,EG G G.')SYy%9%9>JJ-m->%h[)9)99,0.=? ? ?& 
	$	$	$v|[&A	$	$	$
/rI   c               .   |\  }|\  }	|	x|d |	         dz   ||	d          z   }|d |	         dz   ||	d          z   }|d |	         dz   ||	d          z   }|d |	         dz   ||	d          z   }|d |	         dz   ||	d          z   } | ||||||          }||	fS )Nr&   r   rS   )
rN   r   bdimsr   r   r    r"   r$   r;   r   s
             rG   _reduce_window_batch_ruler    s     ('
%$	%4% 4'*;DEE*BB #ETE*T1N4554IINeteny(7455>9G!%4%(4/-2FFM%ete,t3odee6LLOM'#4ng': :'	$rI   reduce_window_sumc          
         | t           j        u s| t           j        u sJ | t           j        u rt           j        nt           j        }t          ||||||||          S rL   )r   max_pmin_pge_ple_pr   )	primgr;   r   r   r    r"   r$   r   s	            rG   _reduce_window_chooser_jvp_ruler    sa     
		dci//// CI--38+	7K9J . /
1 
1 1rI   c                   t          j        dd|d           t          j        dd|d           t          j        dd|           t          j        dd|           | j        t          |          k    r*d}t	          |                    | j        |                    t          |          t          |          k    r%d	}t	          |                    ||                    t          |          t          |          k    r%d
}t	          |                    ||                    t          |          t          |          k    r%d}t	          |                    ||                    t          | j        |||||          S )NrN   r   T)non_zero_shaper   r"   r$   ztreduce_window got the wrong number of window_dimensions for operand: got operand shape {} with window_dimensions {}.ztreduce_window got inconsistent window_strides and window_dimensions: got window_strides {} and window_dimensions {}.zrreduce_window got inconsistent base_dilation and window_dimensions: got base_dilation {} and window_dimensions {}.zvreduce_window got inconsistent window_dilation and window_dimensions: got window_dilation {} and window_dimensions {}.)r   _check_shapelikendimr-   r   r   r3   reduce_window_shape_tupler   s          rG   r   r     s    (;=N&*, , , ,(8.&*, , , ,GGG(9?KKK\S*++++	C  CJJw}.?@@
A
AAC 12222PC
CJJ~/@AA
B
BB301111OC
CJJ}.?@@
A
AAS!23333C CJJ0ABB
C
CC	"7=2C#17M#2
4 
4 4rI   c                    |t          j        | |          } |t          j        ||          }t          d t          | |          D                       }t          t	          t
          j        |||                    S )Nc              3  2   K   | ]\  }\  }}||z   |z   V  d S rL   rS   )r   dr   phs       rG   r   z,reduce_window_shape_tuple.<locals>.<genexpr>>  s2      TTHRR"TTTTTTrI   )r   r0   r1   r   r5   r   
stride_dim)operand_shaper   r   r    r"   r$   operand_paddeds          rG   r  r  7  s{     %m]CCM )*;_MMTTM78S8STTTTT.	s4?N4E~VV	W	WWrI   reduce_window_maxreduce_window_minc                    |j         \  }	|	                    d          }
t          j        |d|
j         d fd|gt          j        | ||
j                  |
          g|
g|j        |||||          S )NrS   r   reduce_window__reducerc                     | j          gS rL   )r   )r   	reduce_ops    rG   <lambda>z&_reduce_window_lower.<locals>.<lambda>g  s    IIw/@$A#B rI   r   )r   updater   rN   r[   full_like_avalr   )r*  r<   r   r;   r   r   r    r"   r$   operand_avalscalar_avals   `          rG   _reduce_window_lowerr0  T  s     ,-,##"#--+			?K$5???BBBBy

c::k.?#@#@+
N
N %)#!%
 
 
 rI   c                    dS )Nr   rS   )r   s    rG   r+  r+  w  s    Q rI   c                   t          j        dd|           t          j        dd|           t          |          t          |          k    r%d}
t          |
                    ||                    | j        S )Nselect_and_scatterr   r   zyselect_and_scatter got inconsistent window_strides and window_dimensions: got window_strides {} and window_dimensions {}.)r   r  r-   r   r   r3   )r;   ry   r<   r|   r}   r~   r   r   r   r    r   s              rG   _select_and_scatter_shape_ruler4    s     +-@(* * *+-=~NNN	s>2222PC
CJJ~/@AA
B
BB	rI   r3  c                  | j         \  }}}| j        \  }|                    d          }t          j        |          }t          j        t          j        |          |||t          j        |          t          j        |	          t          j	        
                    t          j        |
t          j                  t          |
          df                    }|j        j                            ||          }t          j        |          5  |j        rt)          d          t          j        | j        || j        t          j                    |g|j        R d| j        i\  }}t          j        t          j        |                     d d d            n# 1 swxY w Y   |j        j                            ||          }t          j        |          5  |j        rt)          d          t          j        | j        || j        t          j                    |g|j        R d| j        i\  }}t          j        t          j        |                     d d d            n# 1 swxY w Y   |j        S )NrS   r   r   )r   r   r    z Cannot lower effectful `select`.r   z!Cannot lower effectful `scatter`.)r   r   r,  r   aval_to_ir_typer   SelectAndScatterOpdense_int_arrayr   DenseIntElementsAttrgetru   asarrayint64r-   rx   blocksappendInsertionPointr   r   r   r   r   r   r   r   return_r   rz   results)r   r;   ry   r<   r|   r}   r~   r   r   r   r    r.  source_avalinit_value_avalaval_outr/  scalar_typer   rx   r   r   rz   s                         rG   _select_and_scatter_lowerrF    s    03|,,_m)(##"#--+$[11+

8$$,->??).99%))"*Wbh*G*G14Wq0A * C CD D D" 9"";<<&	   3 3 D BCCC%c&8,&)n&*moo}I (.'7I I I 695G	I ILIq
 K&y112223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 J$$[+>>'	!! 3 3 E CDDD%c&8-&)n&*moo~I (/'8I I I 695G	I ILIq
 K&y112223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 
s&   A>FF FA>I""I&)I&c                   |j         S rL   r   r   s         rG   "_select_and_scatter_add_shape_rulerH    s     
rI   c                   | \  }}|\  }}	t          ||||||          }
~	t          |          t          j        u r t          j                            |
          }nt          ||||||          }|
|fS rL   )r   rU   r   r   
from_value)r   r   r   r   r   r    ry   r;   g_source	g_operandval_outtangent_outs               rG   _select_and_scatter_add_jvprO    s     /&' (I#g{$5~ ' 	(^^w|##,))'22KK)';(9! !K 
+	rI   c          
        t          j        |          rt          j        |          rJ t          |           t          j        u rt          j        |j                  d gS dt          |          z  }t          | |||||||          }|d gS )Nr&   )r   r   rU   r   r   rb   r-   r   )	r   ry   r;   r   r   r   r    r  source_ts	            rG   !_select_and_scatter_add_transposerR    s     
		'	'O0Fw0O0OOOO	!WWL%%t,,	%&&	&$#Aw=N$2GT4I I(
D	rI   c               
   | \  }}|\  }}	t          d t          | |          D                       }
t          j        |||
          }t          j        ||	|
          }d|z   }d|z   }d|z   }t	          ||||||          }|dfS )Nc              3  :   K   | ]\  }}||j         |         V  d S rL   r   r   ar   s      rG   r   z5_select_and_scatter_add_batch_rule.<locals>.<genexpr>  =       # #4! gdm!!!!# #rI   r&   r   r   )r   r   r   r   r   )r   r   r   r   r   r    ry   r;   s_bdimo_bdimr   rn   s               rG   "_select_and_scatter_add_batch_rulerZ    s     !/&'.&&	 # #3|Z+H+H # # # 
# 
#$!&&$77&"7FD99'...(.'>O .	9 	9#	a-rI   select_and_scatter_addc                  | j         }fd}|t          j        k    rt          j        nt          j        }	|rf|j        }
|}t          j        u rt          j        nt          j	        }d |D             }t          j
        | ||          |          }d |D             }t          |||||| t          j        |          |	          }|r<d |D             }d t          ||
          D             }t          j        |||          }|S )Nc                0                         | |          S rL   )r9   )ra   yr   s     rG   r+  z._select_and_scatter_add_impl.<locals>.<lambda>  s    ((A.. rI   c                    g | ]
\  }}||d fS r   rS   r   r   r   s      rG   r   z0_select_and_scatter_add_impl.<locals>.<listcomp>  s"    000HRRQK000rI   c                    g | ]}d S r   rS   )r   r   s     rG   r   z0_select_and_scatter_add_impl.<locals>.<listcomp>   s    '''!v'''rI   c                    g | ]\  }}|S rS   rS   r`  s      rG   r   z0_select_and_scatter_add_impl.<locals>.<listcomp>  s    999HRR999rI   c                $    g | ]\  \  }}}||z   S rS   rS   )r   r   r   r  s       rG   r   z0_select_and_scatter_add_impl.<locals>.<listcomp>  s6     D D D}R!BF D D DrI   )r[   ru   bool_r   
bitwise_orrV   r3   r  rZ   r^   r  r   r  r   r   slice)ry   r;   r   r   r   r    expand_paddingr[   rx   rz   r"  original_paddingidentityr  rn   start_indicesstop_indicess     `              rG   _select_and_scatter_add_implrl    s?    ,%....&#rx//CNNSW' (MM)4)@)@%%* 00000Dggxx55G''w'''Gv(.'6	i'	# 	##  :99(8999MD D4D4A1C 1C D D DL
-]L
9
9C	*rI   F)rg  )multiple_resultscpu)platformgpuc                   | j         |j         k    r/d}t          |                    | j         |j                             t          ||||||          S )NzLselect_and_gather_add tangents and operand shapes must match, got {} and {}.)r3   r   r   r   )	r   r;   r   r   r   r    r"   r$   r   s	            rG   !_select_and_gather_add_shape_rulerr    s[     ^w}$$C
CJJx~w}==
>
>>	)
 
 rI   @   )max_bitsr   mlir.LoweringRuleContextc               z     j         \  }
} j        \  }t          |t          j                  s
J |            |j        t          j                  t          j	                  j
        |	k    sJ dz  |	k    }d  fd|rSt          j                 t          j        dz           t          j                  fd}fdfd}ngt          j        d           dz  t          j	                  j        z
  dz
  t          j                 xfd	}fd
fd}t          j        u st          j        u s
J             t          j        u rt$          j         nt$          j        }|                              }dfd}t          j         d| ||||          g | |           d          t          j        d                    gt          j        d          g|g|||||          \  } |||          gS )Nr   c                R    t          j        t          j        ||                     S Nr   )r   ir_constantru   array)r[   ra   s     rG   r+  z1_select_and_gather_add_lowering.<locals>.<lambda>2  s     4+BHQe,D,D,DEE rI   c                R    t          j         |j        |           |d          S )NrS   )broadcast_dimensions)r   broadcast_in_dimr[   )ra   rD  constr   s     rG   _broadcast_scalar_constz@_select_and_gather_add_lowering.<locals>._broadcast_scalar_const4  s5     eeHNA&>&>!)68: : : :rI   c                   |                               }|                               }t          j        t          j        |          |           } t          j        t          j        |          |          }t          j        t          j        |          |           } t          j        t          j        |          |          }t          j        |  |                    } t          j        | |          S rx  )r,  r   bitcast_convertr   r6  convert
shift_leftor_)	rV  bab_avalword_type_ab_avaldouble_word_type_ab_avalr  double_word_dtypenbits
word_dtypes	        rG   packz-_select_and_gather_add_lowering.<locals>.packA  s    !..z.::!(6G!H!H

d23DEEq
I
Ia

d23DEEq
I
Ia
+d*+CDDa
H
Ha
+d*+CDDa
H
Ha
.
$$U,DEEG GaWQ]]rI   c           	     J   t          j        | j                  j        rJ t	          j        |                      }t	          j        t           j                            g           t	          j        t           j                            g           |                    S rL   )	r   RankedTensorTyperU   r3   r   shift_right_logicalr  r:  r  )r   str~  r  etyper  	word_types     rG   fstz,_select_and_gather_add_lowering.<locals>.fstM  s    $QV,,2222"1ee,=u&E&EFFb 


!
!"e
,
,
+b)--b)<<b
A
AC C CrI   c           
         t          j        t          j        |                                        t          j        t          j        |                                        |                     S rx  )r   r  r   r6  r,  r  )r   t_avalr[   r  s     rG   sndz,_select_and_gather_add_lowering.<locals>.sndU  s_     

v}}5}99
:
:
+d*6==z=+J+JKKQ
O
OQ Q QrI   zUsing reduced precision for gradient of reduce-window min/max operator to work around missing XLA support for pair-reductions. This is likely from a second or higher derivative of a max-pooling operation.r'   c                    |                               }t          j        | t          j                  t          j                            } t          j        |t          j                  t          j                            }t          j        t          j        |          |           } t          j        t          j        |          |          }t          j        | |                    }t          j        | |          S )Nr   )exponent_bitsmantissa_bits)	r,  r   reduce_precisionr   i32_attrr  r6  r  r  )	rV  r  r  r  r  nexpnmantr_nbitsr  s	       rG   r  z-_select_and_gather_add_lowering.<locals>.packk  s    !..z.::

qd0C0C.2mE.B.BD D Da

qd0C0C.2mE.B.BD D Da

d23DEEq
I
Ia

d23DEEq
I
Ia

!
$$W.?@@B BaWQ]]rI   c                    t          j        | j                  j        rJ t	          j        |  dz  dz
  z                      }t	          j        t           j                            g           |          S )Nr'   )r   r  rU   r3   r   and_r  r:  )r   r  r~  r  r  r  s     rG   r  z,_select_and_gather_add_lowering.<locals>.fstx  sp    $QV,,22228AuuZ1<1*<)HIIJJb !4!8!8U!C!CRHHHrI   c                    t          j        t          j        |                                        t          j        |  |                                                            S rx  )r   r  r   r6  r,  r  )r   r  r  r[   r  r  s     rG   r  z,_select_and_gather_add_lowering.<locals>.snd~  sc     

v}}5}99
:
:
.33GV]]Q[]=\=\]]
^
^` ` `rI   r   r   r   rJ   r   c                    | j         \  }}t          j        u st          j        u sJ t          j        u rdnd}t	          j        t          j         |           |          |          ||          }|S )NGELE)r   r   r  r  r   SelectOpr   compare_hlo)r   ra   r^  cmp_oprn   r  r   s        rG   r   z5_select_and_gather_add_lowering.<locals>.reducer_body  s|     DAq#(""kSX&=&=&=&= CH,,TT$F
,t'AA??A
F
FCJrI   #reduce_window_select_and_gather_addr   rS   r   r   )r   r   r.   r   r   r[   r   dtype_to_ir_typer
   finfobitsr   _UINT_DTYPESwarningswarnr  r  r  ru   rv   r,  rN   ) r   r   r;   r   r   r   r    r"   r$   rt  r   r.  out_avaldouble_word_reductionr  r  initdouble_word_out_avalr   resr  r~  r  r[   r  r  r  r  r  r  r  r  s    `  `                @@@@@@@@@@@@rG   _select_and_gather_add_loweringr  #  s   
 \!\m)(	L$"2	3	3AA\AAA

%


&
&%
,u


"%	(				!)x/
E
E%: : : : : :
  H` !%(J(3%j11I	 	 	 	 	 	 	 	C C C C C C C C CQ Q Q Q Q Q Q M B C C C qjG<#DdNQE%(%5e%<<

 
 
 
 
 
 
 
 
I I I I I I I I` ` ` ` ` ` ` `
 
	 	 K38$;$;$;[$;$;$;38++"&$!/@AA       
	C8Wh5564eT**EE%OOT=MbRW=X=XYYZ)".?@@A%&)#!%
 
 
$# #c'
(
(	))rI   c          
     J   fd}t           j        u st           j        u s
J             t           j        u rt          j         nt          j        }	t          || ft          j        |	|j                  t          j        d|j                  f||||||          \  }
}|S )Nc                    | \  }}|\  }}                     ||          }t          j        |||          t          j        |||          fS rL   )r9   r   rx   )ra   r^  kxvxkyvywhichr   s          rG   r   zC_select_and_gather_add_using_variadic_reducewindow.<locals>.reducer  sQ    FBFBR$$EJub"%%sz%R'@'@AArI   r   r   )r   r  r  ru   rv   rN   rz  r[   )r   r;   r   r   r   r    r"   r$   r   r  r   rn   s     `         rG   2_select_and_gather_add_using_variadic_reducewindowr    s    B B B B B 
	 	 K38$;$;$;[$;$;$;38++"&$hXd'-((("(1GM*J*J*JK	 &!S
 
*rI   c          
         | \  }}	|\  }
}t          ||	||||||          }~t          |
          t          j        u r t          j                            |          }nt          |
|	||||||          }||fS rL   )r   rU   r   r   rJ  )r   r   r   r   r   r    r"   r$   ry   r;   rK  rL  rM  rN  s                 rG   _select_and_gather_add_jvpr    s     /&' (I"g{$5~}o/ /' 	(^^w|##,))'22KK(';(9A AK 
+	rI   c                  |t           j        t           j        fv sJ t          j        |          rt          j        |          rJ t          d |D                       r$d}	t          |	                    |                    t          |           t          j
        u rt          j
        |j                  d gS t          d |D                       }
|
ra|t           j        u rt           j        nt           j        }t          j        | ||j                  t!          d |D                                 }t#          | |||||          }|
r1t%          j        |dt)          |j                  z  |j        |          }|d gS )Nc              3  "   K   | ]
}|d k    V  dS r'   NrS   r   r  s     rG   r   z3_select_and_gather_add_transpose.<locals>.<genexpr>  s&      ))Aa))))))rI   zaVJP not implemented for select_and_gather (MaxPool) with window dilation, got window_dilation={}.c              3  "   K   | ]
}|d k    V  dS r  rS   r  s     rG   r   z3_select_and_gather_add_transpose.<locals>.<genexpr>  s&      88Q!q&888888rI   c              3  &   K   | ]}d d |dz
  fV  dS )r   r'   NrS   r  s     rG   r   z3_select_and_gather_add_transpose.<locals>.<genexpr>  s,      AAaQ1q5MAAAAAArI   r   )r   r  r  r   r   r   r   r   rU   r   r   rb   rZ   r^   r  r[   r1   r   r   rf  r-   r3   )r   r   r;   r   r   r   r    r"   r$   r   has_base_dilationselect_identityr
  s                rG    _select_and_gather_add_transposer    s    
38,	,	,	,	,

 
*
* /$W--/ / /))))))) ;/C
cjj99
:
::	!WWL''..88-88888 C0;sx0G0Gs,,1 ggw}==AA=AAAAAC CG"1g{<M#17< <& *]64#fl*;*;#;V\(* *F
$rI   c          
     "   | \  }}	|\  }
}t          d t          | |          D                       }t          j        ||
|          }t          j        |	||          }	d|z   }d|z   }d|z   }d|z   }d|z   }t	          ||	||||||          }|dfS )Nc              3  :   K   | ]\  }}||j         |         V  d S rL   r   rU  s      rG   r   z7_select_and_gather_add_batching_rule.<locals>.<genexpr>  rW  rI   r&   r   r   )r   r   r   r   r   )r   r   r   r   r   r    r"   r$   r   ra   t_bdimx_bdimr   rn   s                 rG   $_select_and_gather_add_batching_ruler    s     
$!Q.&&	 # #3|Z+H+H # # # 
# 
#$Q--!Q--!...(.'&-?*/q![2C-w.	0 	0# q/rI   select_and_gather_add)NN)
r   r   r   r   r    r!   r"   r#   r$   r#   )r=   r   r   r   r   r   r    r!   r"   r#   r$   r#   rJ   r   )rO   rP   rJ   rQ   )r;   r   r   r   r   r   r    rc   r"   r#   r$   r#   rJ   r   )r;   r   rx   r   r   r   r   r   r    rc   ry   r   r<   r   rz   r   rJ   r   )ry   r   r;   r   r   r   r   r   r   r   r    rc   rJ   r   )r   r   r;   r   r   r   r   r   r   r   r    rc   r"   r   r$   r   rJ   r   )r   ru  )m
__future__r   collections.abcr   r   	functoolsr   r  jaxr   jax._srcr   r	   r
   r   jax._src.corer   r   jax._src.interpretersr   r   r   jax._src.laxr   r   r   jax._src.lib.mlirr   jax._src.lib.mlir.dialectsr   jax._src.numpy.ufuncsr   jax._src.typingr   numpyru   r   r   jax._src.interpreters.adr   r   safe_mapr5   safe_zipr   rH   rN   r4   rX   ro   r\   r_   rw   r   r   r   r   r   	Primitiver8   r   primitive_jvpsrm  def_implapply_primitivedef_abstract_evalprimitive_batchersr   register_loweringr   r  r  standard_primitive_input_dtyperf   
deflinear2r  r   r  rq   defjvpr  rs   r  _reduce_window_min_batch_ruler0  rV   min_hlor^   max_hlorZ   r4  r   rF  rH  rO  rR  rZ  r   primitive_transposesrl  	lower_funrr  r  r  r  r  r  r   rS   rI   rG   <module>r     sx	   # " " " " " . . . . . . . .                                      4 4 4 4 4 4 4 4 $ $ $ $ $ $ * * * * * * & & & & & & $ $ $ $ $ $                               * * * * * * + + + + + + ! ! ! ! ! !     % % % % % % & & & & & & . . . . . .      
m
m +/,0A8 A8 A8 A8 A8X +/,0    ,   , >B?C	. . . . .$ ?C@D	    , >B?C	. . . . .$ >B?C	. . . . .& +/,0    (D D D DD D D D#. #. #. #.LI I IB"# "# "#J !$.11(! (! (!T &7 / "#'     !9?KK L L L  ! !"C D D D/P O ,# # #L  (D E E EJ J J  &  $ -c,!3#35HJ J  !#D E E E3:7/41 41 / 01 1 1$4 $4 $4N 6:.2X X X X -c,$c&68KM M  		
ww'F'*y 2  2 3 3 33:7/41 41 / 0 -c,$c&68KM M  		
ww'F'*y 2  2 3 3 3 !((A(:!< !< 3:7/41 41 / 0  D  *GG#';;-0 -0 1 1 1  *GG$,(=-? -? @ @ @  *GG$,(=-? -? @ @ @

 
 
 .s-"C$46JL L % % %N  +-F G G G  
  "	 	 	  " 231&(8  
 &  0 1.I * +& 	 4 5  0  /G(???2 2 2     /G(>>>2 2 2&+- - - -  /G(>>>2 2 2&+- - - -
	 	 	 	y* y* y* y* y* y*x  $  "  2  ( 1#0%s'7   .H ) *"  / 0 ' 	 3 4  .61 1 1     #     rI   