
    &Vf                         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d
S )    )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                 d     t                      j        di | || _        d| _        d| _        d S )NTF )super__init__axissupports_masking_reshape_required)selfr   kwargs	__class__s      a/var/www/html/software/conda/lib/python3.11/site-packages/keras/src/layers/merging/concatenate.pyr   zConcatenate.__init__"   s=    ""6"""	 $!&    c                    t          |          dk     s"t          |d         t          t          f          st	          d|           t          d |D                       rd S d |D             }t                      }t          t          |                    D ]}| j        t          ||                   z  }t          ||         dd          d          D ]\  }|k    r|dk    r	||         = t          ||                   | j        k    r||         | j        = |
                    t          ||                              t          |          dk    rd| }t          d |D                       }t          |          dk    rt	          |          |\  }	t          |	          D ]?t          fd	|D                       }
t          |
          dk    rt	          |          @d
| _        d S )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 V  	d S Nr
   .0shapes     r   	<genexpr>z$Concatenate.build.<locals>.<genexpr>1   s&      66u}666666r   c                 ,    g | ]}t          |          S r
   )listr   s     r   
<listcomp>z%Concatenate.build.<locals>.<listcomp>4   s     F F Fe F F Fr   )startztA `Concatenate` layer requires inputs with matching shapes except for the concatenation axis. Received: input_shape=c              3   4   K   | ]}t          |          V  d S r   )lenr   s     r   r   z$Concatenate.build.<locals>.<genexpr>S   s(      ::uE

::::::r   c              3   8   K   | ]}|         
|         V  d S r   r
   )r   r   r   s     r   r   z$Concatenate.build.<locals>.<genexpr>[   s=       " "T{. $K...." "r   T)r"   
isinstancetupler   
ValueErrorallsetranger   	enumerateaddbuilt)r   input_shapereduced_inputs_shapes	shape_seticoncat_axis
axis_valueerr_msgranksrankunique_dimsr   s              @r   buildzConcatenate.build(   si   {azNUDM(
 (
 I;FI I   66+66666 	F F F+ F F FEE	s01122 	; 	;A )c*?*B&C&CCK$-%a(,A% % % 
7 
7 j ;&&:??-a06(+,,ty88)!,TY7MM% 5a 899::::y>>Q7)47 7  ::	:::::E5zzQ )))GTd 	. 	. " " " " "!*" " "  
 {##a''$W--- (


r   c                 8    t          j        || j                  S )Nr   )r   concatenater   )r   inputss     r   _merge_functionzConcatenate._merge_functiond   s    vDI6666r   c                    t          |t          t          f          r"t          |d         t          t          f          st          d|           |}t          |d                   }|dd          D ]H}|| j                 || j                 d || j        <    n!|| j        xx         || j                 z  cc<   It          |          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_shapeg   s    ;66 	;q>E4=99	 7)47 7   #LO,,!!""% 	8 	8EDI&.%	2B2J*.TY'###uTY'77####\"""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 g }t          ||          D ]\  }}|*|                    t          j	        |d                     1|j
        |j
        k     r*|                    t          j        |d	
                     k|                    |           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 V  	d S r   r
   )r   ms     r   r   z+Concatenate.compute_mask.<locals>.<genexpr>   s&      ''QqDy''''''r   bool)dtyper   r9   F)r   keepdims)r$   r%   r   r&   r"   r'   zipappendr   	ones_likendimexpand_dimsr:   r   )r   r;   maskmasksinput_imask_iconcatenateds          r   compute_maskzConcatenate.compute_masky   s   <4$.. 	OMtMMNNN&5$-00 	GvGG   t99F##5$*5 57:6{{5 55 5),T5 5  
 ''$''''' 	4 "6400 	% 	%OGV~S]7&AAABBBBw|++S_V"===>>>>V$$$$u49===w|"u====r   c                     d| j         i}t                                                      }t          t	          |                                          t	          |                                          z             S )Nr   )r   r   
get_configdictr   items)r   configbase_configr   s      r   rS   zConcatenate.get_config   s[    $)$gg((**D**,,--V\\^^0D0DDEEEr   r   r   )__name__
__module____qualname____doc__r   r7   r<   r@   rQ   rS   __classcell__)r   s   @r   r   r      s         4' ' ' ' ' ': : :x7 7 7# # #$> > > >BF F F F F F F F Fr   r   zkeras.layers.concatenater   c                 0     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   r:   r:      s'     ,;++D+F++F333r   NrX   )	keras.srcr   keras.src.api_exportr   #keras.src.layers.merging.base_merger   r   r:   r
   r   r   <module>rb      s          - - - - - - 5 5 5 5 5 5 ())VF VF VF VF VF% VF VF *)VFr ())4 4 4 *)4 4 4r   