o
    Ne                     @   sR   d Z ddlZddlm  mZ ddlmZ ddl	m
Z
 e
dG dd deZdS )zContains the Reshape layer.    N)Layer)keras_exportzkeras.layers.Reshapec                       sD   e Zd ZdZ fddZdd Zdd Zdd	 Z fd
dZ  Z	S )Reshapea  Layer that reshapes inputs into the given shape.

    Input shape:
      Arbitrary, although all dimensions in the input shape must be known/fixed.
      Use the keyword argument `input_shape` (tuple of integers, does not
      include the samples/batch size axis) when using this layer as the first
      layer in a model.

    Output shape:
      `(batch_size,) + target_shape`

    Example:

    >>> # as first layer in a Sequential model
    >>> model = tf.keras.Sequential()
    >>> model.add(tf.keras.layers.Reshape((3, 4), input_shape=(12,)))
    >>> # model.output_shape == (None, 3, 4), `None` is the batch size.
    >>> model.output_shape
    (None, 3, 4)

    >>> # as intermediate layer in a Sequential model
    >>> model.add(tf.keras.layers.Reshape((6, 2)))
    >>> model.output_shape
    (None, 6, 2)

    >>> # also supports shape inference using `-1` as dimension
    >>> model.add(tf.keras.layers.Reshape((-1, 2, 2)))
    >>> model.output_shape
    (None, 3, 2, 2)
    c                    s    t  jdi | t|| _dS )a  Creates a `tf.keras.layers.Reshape`  layer instance.

        Args:
          target_shape: Target shape. Tuple of integers, does not include the
            samples dimension (batch size).
          **kwargs: Any additional layer keyword arguments.
        N )super__init__tupletarget_shape)selfr	   kwargs	__class__r   ND:\Projects\ConvertPro\env\Lib\site-packages\keras/layers/reshaping/reshape.pyr   <   s   zReshape.__init__c           	      C   s   t |}d||}d\}}t|D ]\}}|dk r)|du r!|}qtd| d||9 }qtj|td}|durO|dksC|| dkrGt||| ||< |S ||krWt||S )a  Find and replace a missing dimension in an output shape.

        This is a near direct port of the internal Numpy function
        `_fix_unknown_dimension` in `numpy/core/src/multiarray/shape.c`

        Args:
          input_shape: Shape of array being reshaped
          output_shape: Desired shape of the array with at most a single -1
            which indicates a dimension that should be derived from the input
            shape.

        Returns:
          The new output shape with a -1 replaced with its computed value.

        Raises:
          ValueError: If the total array size of the output_shape is
          different than the input_shape, or more than one unknown dimension
          is specified.
        zNtotal size of new array must be unchanged, input_shape = {}, output_shape = {})   Nr   NzTThere must be at most one unknown dimension in output_shape. Received: output_shape=.)Zdtype)listformat	enumerate
ValueErrornpprodint)	r
   input_shapeoutput_shapemsgZknownunknownindexdimoriginalr   r   r   _fix_unknown_dimensionG   s4   
zReshape._fix_unknown_dimensionc                 C   sp   t | }d |dd  v r!|d g}|tdd | jD 7 }n|d g}|| |dd  | j7 }t |S )Nr   r   c                 s   s     | ]}|d kr
|ndV  qdS )Nr   ).0sr   r   r   	<genexpr>~   s    
z/Reshape.compute_output_shape.<locals>.<genexpr>)tfZTensorShapeas_listr   r	   r   )r
   r   r   r   r   r   compute_output_shapey   s   



zReshape.compute_output_shapec                 C   s<   t |t |d f| j }t  s|| |j |S )Nr   )r$   Zreshapeshaper	   Zexecuting_eagerly	set_shaper&   )r
   Zinputsresultr   r   r   call   s   zReshape.callc                    s0   d| j i}t  }tt| t|  S )Nr	   )r	   r   
get_configdictr   items)r
   configZbase_configr   r   r   r+      s   

zReshape.get_config)
__name__
__module____qualname____doc__r   r   r&   r*   r+   __classcell__r   r   r   r   r      s    2	r   )r2   numpyr   Ztensorflow.compat.v2compatv2r$   Zkeras.engine.base_layerr   Z tensorflow.python.util.tf_exportr   r   r   r   r   r   <module>   s   