
    6biN&                     T    S r SSKJs  Jr  SSKJr  SSKJr  SSK	J
r
   " S S\5      rg)zEPrivate base class for layers that can merge several inputs into one.    N)backend)Layer)tf_utilsc                      ^  \ rS rSrSrU 4S jrS rS r\R                  S 5       r
S r\R                  S 5       rSS	 jrU 4S
 jrSrU =r$ )_Merge   z_Generic merge layer for elementwise merge functions.

Used to implement `Sum`, `Average`, etc.
c                 4   > [         TU ]  " S0 UD6  SU l        g)zPInitializes a Merge layer.

Args:
  **kwargs: standard layer keyword arguments.
TN )super__init__supports_masking)selfkwargs	__class__s     `/home/james-whalen/.local/lib/python3.13/site-packages/tf_keras/src/layers/merging/base_merge.pyr   _Merge.__init__   s     	"6" $    c                     [         eN)NotImplementedError)r   inputss     r   _merge_function_Merge._merge_function'   s    !!r   c                    SX4;   a  g[        U5      [        U5      :  a  U R                  X!5      $ U(       d  U$ [        US[        U5      *  5      n[        U[        U5      * S U5       Hw  u  pEUb  Uc  UR	                  S5        M  US:X  a  UR	                  U5        M7  US:X  a  UR	                  U5        MP  XE:w  a  [        SU SU 35      eUR	                  U5        My     [        U5      $ )a  Computes the shape of the resultant of an elementwise operation.

Args:
    shape1: tuple or None. Shape of the first tensor
    shape2: tuple or None. Shape of the second tensor

Returns:
    expected output shape when an element-wise operation is
    carried out on 2 tensors with shapes shape1 and shape2.
    tuple or None.

Raises:
    ValueError: if shape1 and shape2 are not compatible for
        element-wise operations.
N   z1Inputs have incompatible shapes. Received shapes z and )len!_compute_elemwise_op_output_shapelistzipappend
ValueErrortuple)r   shape1shape2output_shapeijs         r   r   (_Merge._compute_elemwise_op_output_shape*   s      F##[3v;&99&IIMF>c&k\23F|~.7DAyAI##D)a##A&a##A&6$++1(%xA  ##A& 8 \""r   c                 <   [        US   [        5      (       d  [        SU S35      e[        U5      S:  a  [        S[        U5       SU 35      eU Vs1 s H  o"(       d  M  US   iM     snS 1-
  n[        U5      S:  a  [        SU 35      eUS   c  S nOUS   SS  n[	        S[        U5      5       H#  nX   c  S nOX   SS  nU R                  XF5      nM%     S U;  a.  [        [        [        [        U5      5      5      S:X  a  SU l        g S	U l        g s  snf )
Nr   zJA merge layer should be called on a list of inputs. Received: input_shape=z (not a list of shapes)r   zBA merge layer should be called on a list of at least 1 input. Got z$ inputs. Full input_shape received: zICannot merge tensors with different batch sizes. Got tensors with shapes FT)	
isinstancer"   r!   r   ranger   setmap_reshape_required)r   input_shapesbatch_sizesr%   r&   shapes          r   build_Merge.buildQ   sZ    +a.%00))45LN  {a;'( )..9]<  &16[Atqt[6$?{a++6-9  q>!L&q>!"-Lq#k*+A~%#qr*AAL , {"s3s3/D+E'F!'K%*D"%)D"/ 7s   
D#	Dc                    [        U[        [        45      (       d  [        SU S35      eU R                  (       Ga  / n[        [        [        R                  U5      5      nS U;  au  [        U5      nU HS  n[        R                  " U5      n[        XF-
  5       H  n[        R                  " USS9nM     UR                  U5        MU     U R                  U5      $ SnU GHA  n[        R                  " U5      nUc  [        R                  " U5      n	U	S   n
[        R                  " U	SS  [        R                  " U
SS9/5      n[        R                   " U[        R"                  " U
[        R$                  " U	SS  5      /SS95      n[        R&                  " USS	9n[        R                   " X5      nUR                  U5        S
nM  US:  aA  [        [        SU5      5      S/-   nUR                  [        R&                  " X]S	95        S
nGM0  UR                  U5        GMD     U R                  U5      n[        R                  " U5      nU(       a  Uc  [        R                  " U5      n[        R                  " U5      S   nUUS-
     n
[        R                  " [        R                  " U
SS9US US-
   /5      n[        R                   " USU
45      n[        R&                  " USS	9n[        R                   " X5      nU$ US:  a2  US-
  /[        [        US-
  5      5      -   n[        R&                  " XS	9nU$ U R                  U5      $ )NzEA merge layer should be called on a list of inputs. Received: inputs=z (not a list of tensors)r   axisFr   )r   r   )permT)r*   r   r"   r!   r.   r-   r   ndimmaxr+   tfexpand_dimsr    r   r2   concatenatereshapestackreduce_prod	transpose)r   r   reshaped_inputsinput_ndimsmax_ndimxx_ndim_
transposedx_shape
batch_size	new_shapex_transposeddimsyy_ndimy_shapes                    r   call_Merge.cally   s   &4-00$$*8+CE  !!! Os7<<89K;& {+A$\\!_F"8#45NN115 6#**1-	  
 ++O<<
 #
A$\\!_F~"$((1+%,QZ
$+$7$7$QR[".."*MN%	 (*zzHH!+R^^GABK-H I%&( (*||Lv'N')zz,'J'..|<%)
!#E!V$45;'..r||A/IJ%)
 (..q15  6 ((9 a ~"$((1+!#'!21!5%,VaZ%8
$+$7$7 "z C '&1* 5%	 JJq2z*:;LL8JJq4   ! &
|d5!3D.EELL6''//r   c                 6   US   c  S nOUS   SS  n[        S[        U5      5       H#  nX   c  S nOX   SS  nU R                  X$5      nM%     U Vs1 s H  oUc  M  US   iM     snS 1-
  n[        U5      S:X  a  [        U5      S   4U-   nU$ SU-   nU$ s  snf )Nr   r   r   )r+   r   r   r   )r   r/   r%   r&   r2   r0   r1   s          r   compute_output_shape_Merge.compute_output_shape   s    q>!L&q>!"-Lq#k*+A~%#qr*AAL , &1B[tqt[BdVK{q  -a02\AL  #\1L Cs   B	Bc                    Uc  g [        U[        [        45      (       d  [        SU 35      e[        U[        [        45      (       d  [        SU 35      e[	        U5      [	        U5      :w  a)  [        SU S[	        U5       SU S[	        U5       35      e[        S U 5       5      (       a  g U Vs/ s H  o3c  M  [        R                  " USS9PM     nn[        R
                  " [        R                  " USS9SS	S
9$ s  snf )Nz(`mask` should be a list. Received: mask=z,`inputs` should be a list. Received: inputs=zLThe lists `inputs` and `mask` should have the same length. Received: inputs=z of length z, and mask=c              3   (   #    U  H  oS L v   M
     g 7fr   r
   ).0ms     r   	<genexpr>&_Merge.compute_mask.<locals>.<genexpr>   s     '$QDy$s   r   r6   F)r7   keepdims)
r*   r"   r   r!   r   allr<   r=   r   r>   )r   r   maskrZ   maskss        r   compute_mask_Merge.compute_mask   s   <$..GvNOO&5$-00>vhG  t9F#$$*8;s6{m Dv[T5 
 '$'''48JDq**DJ{{A.Q
 	
 Ks   4D>Dc                     > [         TU ]  5       $ r   )r   
get_config)r   r   s    r   rd   _Merge.get_config   s    w!##r   )r.   r   r   )__name__
__module____qualname____firstlineno____doc__r   r   r   r   shape_type_conversionr3   rR   rU   ra   rd   __static_attributes____classcell__)r   s   @r   r   r      sc    
%"%#N ##%* $%*NK0Z ## $(
,$ $r   r   )rj   tensorflow.compat.v2compatv2r<   tf_keras.srcr   tf_keras.src.engine.base_layerr   tf_keras.src.utilsr   r   r
   r   r   <module>rt      s(    L ! !   0 'Z$U Z$r   