a
    Sic                     @   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f 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__ Z/var/www/html/django/DPS/env/lib/python3.9/site-packages/keras/layers/reshaping/reshape.pyr   <   s    zReshape.__init__c           	      C   s   t |}d||}d\}}t|D ]8\}}|dk rT|du rB|}q\td| dq$||9 }q$tj|td}|dur|dks|| dkrt||| ||< n||krt||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=.)dtype)listformat	enumerate
ValueErrornpprodint)	r	   input_shapeoutput_shapemsgknownunknownindexdimoriginalr   r   r   _fix_unknown_dimensionG   s0    
zReshape._fix_unknown_dimensionc                 C   sp   t | }d |dd  v rB|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>)tf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  s8|| |j |S )Nr   )r&   reshapeshaper   executing_eagerly	set_shaper)   )r	   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	   configbase_configr   r   r   r1      s    

zReshape.get_config)
__name__
__module____qualname____doc__r   r!   r)   r0   r1   __classcell__r   r   r   r   r      s   2	r   )r9   numpyr   tensorflow.compat.v2compatv2r&   keras.engine.base_layerr    tensorflow.python.util.tf_exportr   r   r   r   r   r   <module>   s   