
    &Vf!$                     R    d dl mZ d dl mZ d dlmZ d dlmZ  G d de          ZdS )    )backend)ops)KerasTensor)Layerc                   X     e Zd ZdZ fdZd Zd Zd Zd Zd Z	d Z
dd
Z fdZ xZS )MergezGeneric merge layer for elementwise merge functions.

    Used to implement `Sum`, `Average`, etc.

    Args:
        **kwargs: standard layer keyword arguments.
    c                 H     t                      j        di | d| _        d S )NT )super__init__supports_masking)selfkwargs	__class__s     `/var/www/html/software/conda/lib/python3.11/site-packages/keras/src/layers/merging/base_merge.pyr   zMerge.__init__   s.    ""6""" $    c                     t           N)NotImplementedError)r   inputss     r   _merge_functionzMerge._merge_function   s    !!r   c                 J   d||fv rdS t          |          t          |          k     r|                     ||          S |s|S t          |dt          |                              }t          |t          |           d         |          D ]\  }}|||                    d           |dk    r|                    |           ;|dk    r|                    |           W||k    rt          d| d|           |                    |           t          |          S )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   z'Merge._compute_elemwise_op_output_shape   se   " FF###4[[3v;;&&99&&III 	MF>c&kk\>233F|~~.77 	' 	'DAqyAI##D))))a##A&&&&a##A&&&&66$A+1A A8>A A   ##A&&&&\"""r   c                    t          |d         t          t          f          st          d| d          t	          |          dk     r"t          dt	          |           d|           d |D             d hz
  }t	          |          dk    rt          d|           |d         d }n|d         dd          }t          dt	          |                    D ]3}||         d }n||         dd          }|                     ||          }4d |vr;t	          t          t          t          |                              dk    rd	| _	        nd
| _	        d
| _
        d S )Nr   zJA merge layer should be called on a list of inputs. Received: input_shape=z (not a list of shapes)r   zGA merge layer should be called on a list of at least 1 input. Received z$ inputs. Full input_shape received: c                 "    h | ]}||d          S )r   r
   .0ss     r   	<setcomp>zMerge.build.<locals>.<setcomp>N   s!    666A6qt666r   zNCannot merge tensors with different batch sizes. Received tensors with shapes FT)
isinstancer    r   r   r   ranger   setmap_reshape_requiredbuilt)r   input_shapebatch_sizesr#   r$   shapes         r   buildzMerge.build?   s   +a.5$-88 	N)4N N N   {a<,,< < /:< <   76[666$?{a>0;> >  
 q>!LL&q>!""-Lq#k**++ 	 	A1~%#Aqrr*AAe LL {""s3s3/D/D+E+E'F'F!'K'K%*D""%)D"


r   c                    t          |t          t          f          st          d| d          | j        r9g }t          t          t          j        |                    }d |vr}t          |          }|D ]V}t          j        |          }t          ||z
            D ]}t          j
        |d          }|                    |           W|                     |          S d}|D ]g}t          j        |          }|t          j        |          }	|	d         }
t          j        |	dd          t          j
        |
d          g          }t          j        |t          j        |
t          j        |	dd                    gd                    }t          j        |d	          }t          j        ||          }|                    |           d
}|dk    r]t          t          d|                    dgz   }|                    t          j        ||	                     t)          |           d
}R|                    |           i|                     |          }t          j        |          }|r|t          j        |          }t          j        |          d         }||dz
           }
t          j        t          j
        |
d          |d |dz
           g          }t          j        |d|
f          }t          j        |d	          }t          j        ||          }nB|dk    r<|dz
  gt          t          |dz
                      z   }t          j        ||	          }|S |                     |          S )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   r0   r/   r   ndimmaxr-   expand_dimsr   r   r4   r   concatenatereshapestackprod	transposeprint)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   callz
Merge.callk   s   &4-00 	E$*E E E   ! L	0 Os38V4455K;&& {++ . .A Xa[[F"8f#455 7 7OAA666#**1----++O<<<
 #
 2 2A Xa[[F~"%)A,,%,QZ
$+$7$QRR[#/*2*N*N*NO% %	 (+{I!+SXgabbk-B-B C%&  ( ( (+}\'O'O'O'*{<'K'K'..|<<<%)

!#E!V$4$455;'..s}QT/J/J/JKKKd%)

 (..q1111((99! 8 ~"%)A,,!$7!3!3A!6%,VaZ%8
$'O #
 D D D '&1* 5% %	  KB
+;<<M!&999K955! &
|d5!3D3D.E.EEM!$777''///r   c                 b   |d         d }n|d         dd          }t          dt          |                    D ]3}||         d }n||         dd          }|                     ||          }4d |D             d hz
  }t          |          dk    rt          |          d         f|z   }nd|z   }|S )Nr   r   c                 "    h | ]}||d         S )Nr   r
   r(   s     r   r+   z-Merge.compute_output_shape.<locals>.<setcomp>   s    BBBAMqtMMMr   r   )r-   r   r   r   )r   r2   r#   r$   r4   r3   s         r   compute_output_shapezMerge.compute_output_shape   s    q>!LL&q>!""-Lq#k**++ 	 	A1~%#Aqrr*AAe LL CB[BBBdVK{q   --a02\ALL"\1Lr   c                     |                      d |D                       }t          d |D                       }t          || j        |          S )Nc                     g | ]	}|j         
S r
   )r4   r)   rG   s     r   
<listcomp>z-Merge.compute_output_spec.<locals>.<listcomp>   s    1J1J1Ja!'1J1J1Jr   c              3   $   K   | ]}|j         V  d S r   )sparserY   s     r   	<genexpr>z,Merge.compute_output_spec.<locals>.<genexpr>   s$      55AH555555r   )dtyper\   )rV   allr   compute_dtype)r   r   r#   output_sparses       r   compute_output_speczMerge.compute_output_spec   sa    001J1J61J1J1JKK55f55555 2=
 
 
 	
r   Nc                    |d S t          |t          t          f          st          d|           t          |t          t          f          st          d|           t	          |          t	          |          k    r5t          d| dt	          |           d| dt	          |                     t          d |D                       rd S d |D             }t          j        t          j        |d	          dd
          S )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      K   | ]}|d u V  	d S r   r
   r)   ms     r   r]   z%Merge.compute_mask.<locals>.<genexpr>   s&      ''QqDy''''''r   c                 >    g | ]}|t          j        |d          S )Nr   r7   )r   r=   re   s     r   rZ   z&Merge.compute_mask.<locals>.<listcomp>   s(    KKKQ]+++]]]r   r   r7   F)r8   keepdims)r,   r    r   r   r   r_   r   r>   )r   r   maskmaskss       r   compute_maskzMerge.compute_mask   s<   <4$.. 	PNNNOOO&5$-00 	GvGG   t99F##5$*5 57:6{{5 55 5),T5 5  
 ''$''''' 	4KKTKKKwsu1555ANNNNr   c                 D    t                                                      S r   )r   
get_config)r   r   s    r   rm   zMerge.get_config   s    ww!!###r   r   )__name__
__module____qualname____doc__r   r   r   r5   rS   rV   rb   rk   rm   __classcell__)r   s   @r   r   r      s         % % % % %" " "&# &# &#P* * *XR0 R0 R0h  *
 
 
O O O O($ $ $ $ $ $ $ $ $r   r   N)	keras.srcr   r   %keras.src.backend.common.keras_tensorr   keras.src.layers.layerr   r   r
   r   r   <module>rv      s                = = = = = = ( ( ( ( ( (i$ i$ i$ i$ i$E i$ i$ i$ i$ i$r   