
    2Vht                     z    d dl Z d dlmZ d dlmZ d dlmZ  ed       G d de             Z ed      d
d	       Zy)    N)ops)keras_export)Mergezkeras.layers.Concatenatec                   H     e Zd ZdZd fd	Zd Zd Zd Zd	dZ fdZ	 xZ
S )
Concatenatea  Concatenates a list of inputs.

    It takes as input a list of tensors, all of the same shape except
    for the concatenation axis, and returns a single tensor that is the
    concatenation of all inputs.

    Examples:

    >>> x = np.arange(20).reshape(2, 2, 5)
    >>> y = np.arange(20, 30).reshape(2, 1, 5)
    >>> keras.layers.Concatenate(axis=1)([x, y])

    Usage in a Keras model:

    >>> x1 = keras.layers.Dense(8)(np.arange(10).reshape(5, 2))
    >>> x2 = keras.layers.Dense(8)(np.arange(10, 20).reshape(5, 2))
    >>> y = keras.layers.Concatenate()([x1, x2])

    Args:
        axis: Axis along which to concatenate.
        **kwargs: Standard layer keyword arguments.

    Returns:
        A tensor, the concatenation of the inputs alongside axis `axis`.
    c                 N    t        |   di | || _        d| _        d| _        y )NTF )super__init__axissupports_masking_reshape_required)selfr   kwargs	__class__s      T/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/layers/merging/concatenate.pyr   zConcatenate.__init__$   s*    "6"	 $!&    c                 T   t        |      dk  st        |d   t        t        f      st	        d|       t        d |D              ry |D cg c]  }t        |       }}t        j                  |      }t               }t        t        |            D ]  }| j                  t        ||         z  }t        |d      D ]  \  }|k7  s|dk(  s||   =  t        ||         | j                  kD  r||   | j                  = |j                  t        ||                 t        |      dk7  rrd| }	t        d |D              }
t        |
      dk7  rt	        |	      |
\  }t        |      D ]/  t        fd|D              }t        |      dkD  s&t	        |	       y y c c}w )	N   r   z\A `Concatenate` layer should be called on a list of at least 1 input. Received: input_shape=c              3   $   K   | ]  }|d u  
 y wNr	   .0shapes     r   	<genexpr>z$Concatenate.build.<locals>.<genexpr>3   s     6u}6   )startztA `Concatenate` layer requires inputs with matching shapes except for the concatenation axis. Received: input_shape=c              3   2   K   | ]  }t        |        y wr   )lenr   s     r   r   z$Concatenate.build.<locals>.<genexpr>U   s     :uE
:s   c              3   2   K   | ]  }|   |     y wr   r	   )r   r   r   s     r   r   z$Concatenate.build.<locals>.<genexpr>]   s'      "T{. $K"s   )r   
isinstancetuplelist
ValueErrorallcopysetranger   	enumerateadd)r   input_shaper   reduced_inputs_shapesreduced_inputs_shapes_copy	shape_seticoncat_axis
axis_valueerr_msgranksrankunique_dimsr   s                @r   buildzConcatenate.build*   s   {azNUDM(
 ;;F-I  6+66:E Fe F F%)YY/D%E"E	s567 	;A ))c*DQ*G&HHK$-*!% 
7 j ;&:?-a06
7 (+,tyy8)!,TYY7MM% 5a 89:'	;* y>Q))47  :	::E5zQ ))GTd 	. " "!*" 
 {#a'$W--	. 1 !Gs   F%c                 D    t        j                  || j                        S )Nr   )r   concatenater   )r   inputss     r   _merge_functionzConcatenate._merge_functione   s    vDII66r   c                    t        |t        t        f      rt        |d   t        t        f      st        d|       |}t        |d         }|dd  D ]_  }|| j                     || j                     d || j                  <    t        |      S || j                  xx   || j                     z  cc<   a t        |      S )Nr   zRA `Concatenate` layer should be called on a list of inputs. Received: input_shape=r   )r!   r"   r#   r$   r   )r   r+   input_shapesoutput_shaper   s        r   compute_output_shapez Concatenate.compute_output_shapeh   s    ;6;q>E4=9))47  #LO,!!"% 	8EDII&.%		2B2J*.TYY'\"" #uTYY'77#		8
 \""r   c                    |y t        |t        t        f      st        d|       t        |t        t        f      st        d|       t	        |      t	        |      k7  r)t        d| dt	        |       d| dt	        |             t        d |D              ry g }t        ||      D ]  \  }}|'|j                  t        j                  |d             /|j                  |j                  k  rN|j                  t        j                  t        j                  |d	
      t        j                  |                   |j                  |        t        j                  || j                  
      }t        j                   |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  
 y wr   r	   )r   ms     r   r   z+Concatenate.compute_mask.<locals>.<genexpr>   s     'QqDy'r   bool)dtyper8   F)r   keepdims)r!   r"   r#   r$   r   r%   zipappendr   	ones_likendimbroadcast_toexpand_dimsr   r9   r   any)r   r:   maskmasksinput_imask_iconcatenateds          r   compute_maskzConcatenate.compute_maskz   sg   <$.FtfMNN&5$-0>vhG  t9F#$$*8;s6{m Dv[T5 
 '$'' "640 	%OGV~S]]7&ABw||+$$R8#))G:L V$	% u499=ww|"u==r   c                     d| j                   i}t        | 	         }t        t	        |j                               t	        |j                               z         S )Nr   )r   r
   
get_configdictr#   items)r   configbase_configr   s      r   rU   zConcatenate.get_config   sG    $))$g(*D**,-V\\^0DDEEr   rE   r   )__name__
__module____qualname____doc__r   r6   r;   r?   rS   rU   __classcell__)r   s   @r   r   r      s/    4'9.v7#$#>JF Fr   r   zkeras.layers.concatenatec                 (     t        dd|i||       S )a  Functional interface to the `Concatenate` layer.

    Args:
        inputs: A list of input tensors.
        axis: Concatenation axis.
        **kwargs: Standard layer keyword arguments.

    Returns:
        A tensor, the concatenation of the inputs alongside axis `axis`.
    r   r	   )r   )r:   r   r   s      r   r9   r9      s     ,;+D+F+F33r   rZ   )	r&   	keras.srcr   keras.src.api_exportr   #keras.src.layers.merging.base_merger   r   r9   r	   r   r   <module>rd      sS      - 5 ()YF% YF *YFx ()4 *4r   