o
    2ht                     @   sZ   d dl Z d dlmZ d dlmZ d dlmZ edG dd deZeddd
dZdS )    N)ops)keras_export)Mergezkeras.layers.Concatenatec                       sP   e Zd ZdZd fdd	Zdd Zdd Zd	d
 ZdddZ fddZ	  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                    s(   t  jdi | || _d| _d| _d S )NTF )super__init__axissupports_masking_reshape_required)selfr
   kwargs	__class__r   _/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/layers/merging/concatenate.pyr	   $   s   
zConcatenate.__init__c                    sf  t |dk st|d ttfstd| tdd |D r!d S dd |D }t|}t }tt |D ];}| j	t ||  }t
|ddD ]\ } |krX|dkrX||  = qGt || | j	krh|| | j	= |t||  q6t |dkrd	| }td
d |D }	t |	dkrt||	\}
t|
D ] t fdd|D }t |dkrt|qd S d S )N   r   z\A `Concatenate` layer should be called on a list of at least 1 input. Received: input_shape=c                 s       | ]}|d u V  qd S Nr   .0shaper   r   r   	<genexpr>3       z$Concatenate.build.<locals>.<genexpr>c                 S   s   g | ]}t |qS r   )listr   r   r   r   
<listcomp>6   s    z%Concatenate.build.<locals>.<listcomp>)startztA `Concatenate` layer requires inputs with matching shapes except for the concatenation axis. Received: input_shape=c                 s   s    | ]}t |V  qd S r   )lenr   r   r   r   r   U   r   c                 3   s$    | ]}|  d ur|  V  qd S r   r   r   r
   r   r   r   ]   s    )r   
isinstancetupler   
ValueErrorallcopysetranger
   	enumerateadd)r   input_shapereduced_inputs_shapesreduced_inputs_shapes_copy	shape_seticoncat_axis
axis_valueerr_msgranksrankunique_dimsr   r   r   build*   sT   
	
zConcatenate.buildc                 C   s   t j|| jdS )Nr   )r   concatenater
   )r   inputsr   r   r   _merge_functione   s   zConcatenate._merge_functionc                 C   s   t |ttfrt |d ttfstd| |}t|d }|dd  D ]&}|| j d u s5|| j d u r?d || j<  t|S || j  || j 7  < q%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   r   r   r   compute_output_shapeh   s"   
z Concatenate.compute_output_shapeNc              
   C   s"  |d u rd S t |ttfstd| t |ttfs"td| t|t|kr>td| dt| d| dt| tdd |D rId S g }t||D ]0\}}|d u rc|tj	|dd	 qP|j
|j
k r{|ttj|d
dt| qP|| qPtj|| jd}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                 s   r   r   r   )r   mr   r   r   r      r   z+Concatenate.compute_mask.<locals>.<genexpr>bool)dtyper   r   F)r
   keepdims)r   r    r   r!   r   r"   zipappendr   	ones_likendimbroadcast_toexpand_dimsr   r4   r
   any)r   r5   maskmasksinput_imask_iconcatenatedr   r   r   compute_maskz   sF   zConcatenate.compute_maskc                    s0   d| j i}t  }tt| t|  S )Nr
   )r
   r   
get_configdictr   items)r   configbase_configr   r   r   rK      s   

zConcatenate.get_configr   r   )__name__
__module____qualname____doc__r	   r3   r6   r9   rJ   rK   __classcell__r   r   r   r   r      s    ;
%r   zkeras.layers.concatenater   c                 K   s   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
   Nr   )r   )r5   r
   r   r   r   r   r4      s   r4   rP   )	r#   	keras.srcr   keras.src.api_exportr   #keras.src.layers.merging.base_merger   r   r4   r   r   r   r   <module>   s     