
    0h.                     v    d Z ddlmc mZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ  ed       G d d	e             Zy)
z"Keras cropping layer for 3D input.    N)Layer)	InputSpec)
conv_utils)keras_exportzkeras.layers.Cropping3Dc                   <     e Zd ZdZ	 d fd	Zd Zd Z fdZ xZS )
Cropping3Da{  Cropping layer for 3D data (e.g. spatial or spatio-temporal).

      Examples:

    >>> input_shape = (2, 28, 28, 10, 3)
    >>> x = np.arange(np.prod(input_shape)).reshape(input_shape)
    >>> y = tf.keras.layers.Cropping3D(cropping=(2, 4, 2))(x)
    >>> print(y.shape)
    (2, 24, 20, 6, 3)

    Args:
      cropping: Int, or tuple of 3 ints, or tuple of 3 tuples of 2 ints.
        - If int: the same symmetric cropping
          is applied to depth, height, and width.
        - If tuple of 3 ints: interpreted as two different
          symmetric cropping values for depth, height, and width:
          `(symmetric_dim1_crop, symmetric_dim2_crop, symmetric_dim3_crop)`.
        - If tuple of 3 tuples of 2 ints: interpreted as
          `((left_dim1_crop, right_dim1_crop), (left_dim2_crop,
            right_dim2_crop), (left_dim3_crop, right_dim3_crop))`
      data_format: A string,
        one of `channels_last` (default) or `channels_first`.
        The ordering of the dimensions in the inputs.
        `channels_last` corresponds to inputs with shape
        `(batch_size, spatial_dim1, spatial_dim2, spatial_dim3, channels)`
        while `channels_first` corresponds to inputs with shape
        `(batch_size, channels, spatial_dim1, spatial_dim2, spatial_dim3)`.
        When unspecified, uses
        `image_data_format` value found in your TF-Keras config file at
         `~/.keras/keras.json` (if exists) else 'channels_last'.
        Defaults to 'channels_last'.

    Input shape:
      5D tensor with shape:
      - If `data_format` is `"channels_last"`:
        `(batch_size, first_axis_to_crop, second_axis_to_crop,
        third_axis_to_crop, depth)`
      - If `data_format` is `"channels_first"`:
        `(batch_size, depth, first_axis_to_crop, second_axis_to_crop,
          third_axis_to_crop)`

    Output shape:
      5D tensor with shape:
      - If `data_format` is `"channels_last"`:
        `(batch_size, first_cropped_axis, second_cropped_axis,
        third_cropped_axis, depth)`
      - If `data_format` is `"channels_first"`:
        `(batch_size, depth, first_cropped_axis, second_cropped_axis,
          third_cropped_axis)`
    c                    t        |   di | t        j                  |      | _        t        |t              r||f||f||ff| _        nt        |d      r|t        |      dk7  rt        d| d      t        j                  |d   ddd	      }t        j                  |d
   ddd	      }t        j                  |d   ddd	      }|||f| _        nt        d| d      t        d      | _        y )N__len__   z-`cropping` should have 3 elements. Received: .r      z1st entry of croppingT)
allow_zero   z2nd entry of croppingz3rd entry of croppinga  `cropping` should be either an int, a tuple of 3 ints (symmetric_dim1_crop, symmetric_dim2_crop, symmetric_dim3_crop), or a tuple of 3 tuples of 2 ints ((left_dim1_crop, right_dim1_crop), (left_dim2_crop, right_dim2_crop), (left_dim3_crop, right_dim2_crop)). Received:    )ndim )super__init__r   normalize_data_formatdata_format
isinstanceintcroppinghasattrlen
ValueErrornormalize_tupler   
input_spec)selfr   r   kwargsdim1_croppingdim2_croppingdim3_cropping	__class__s          b/var/www/html/engine/venv/lib/python3.12/site-packages/tf_keras/src/layers/reshaping/cropping3d.pyr   zCropping3D.__init__Q   s"    	"6"%;;KHh$8$8$8$DM
 Xy)8}! CH:QO  '66Q 7DM '66Q 7DM '66Q 7DM +M=IDM &Ja)
 
 $+    c                 j   t        j                  |      j                         }| j                  dk(  r|d   ,|d   | j                  d   d   z
  | j                  d   d   z
  }nd }|d   ,|d   | j                  d   d   z
  | j                  d   d   z
  }nd }|d   ,|d   | j                  d   d   z
  | j                  d   d   z
  }nd }t        j                  |d   |d   |||g      S | j                  dk(  r|d   ,|d   | j                  d   d   z
  | j                  d   d   z
  }nd }|d   ,|d   | j                  d   d   z
  | j                  d   d   z
  }nd }|d   ,|d   | j                  d   d   z
  | j                  d   d   z
  }nd }t        j                  |d   ||||d   g      S y )Nchannels_firstr   r   r   r      channels_last)tfTensorShapeas_listr   r   )r   input_shapedim1dim2dim3s        r%   compute_output_shapezCropping3D.compute_output_shapey   s   nn[199;//1~)NT]]1%5a%884==;KA;NN  1~)NT]]1%5a%884==;KA;NN  1~)NT]]1%5a%884==;KA;NN  >>QQtTB  01~)NT]]1%5a%884==;KA;NN  1~)NT]]1%5a%884==;KA;NN  1~)NT]]1%5a%884==;KA;NN  >>QtT;q>B ' 1r&   c                    | j                   dk(  r| j                  d   d   | j                  d   d   cxk(  r| j                  d   d   cxk(  rdk(  rGn nD|d d d d | j                  d   d   d | j                  d   d   d | j                  d   d   d f   S | j                  d   d   | j                  d   d   cxk(  rdk(  rXn nU|d d d d | j                  d   d   d | j                  d   d   d | j                  d   d   | j                  d   d    f   S | j                  d   d   | j                  d   d   cxk(  rdk(  rXn nU|d d d d | j                  d   d   | j                  d   d    | j                  d   d   d | j                  d   d   d f   S | j                  d   d   | j                  d   d   cxk(  rdk(  rXn nU|d d d d | j                  d   d   d | j                  d   d   | j                  d   d    | j                  d   d   d f   S | j                  d   d   dk(  rf|d d d d | j                  d   d   d | j                  d   d   | j                  d   d    | j                  d   d   | j                  d   d    f   S | j                  d   d   dk(  rf|d d d d | j                  d   d   | j                  d   d    | j                  d   d   d | j                  d   d   | j                  d   d    f   S | j                  d   d   dk(  rf|d d d d | j                  d   d   | j                  d   d    | j                  d   d   | j                  d   d    | j                  d   d   d f   S |d d d d | j                  d   d   | j                  d   d    | j                  d   d   | j                  d   d    | j                  d   d   | j                  d   d    f   S | j                  d   d   | j                  d   d   cxk(  r| j                  d   d   cxk(  rdk(  rGn nD|d d | j                  d   d   d | j                  d   d   d | j                  d   d   d d d f   S | j                  d   d   | j                  d   d   cxk(  rdk(  rXn nU|d d | j                  d   d   d | j                  d   d   d | j                  d   d   | j                  d   d    d d f   S | j                  d   d   | j                  d   d   cxk(  rdk(  rXn nU|d d | j                  d   d   | j                  d   d    | j                  d   d   d | j                  d   d   d d d f   S | j                  d   d   | j                  d   d   cxk(  rdk(  rXn nU|d d | j                  d   d   d | j                  d   d   | j                  d   d    | j                  d   d   d d d f   S | j                  d   d   dk(  rf|d d | j                  d   d   d | j                  d   d   | j                  d   d    | j                  d   d   | j                  d   d    d d f   S | j                  d   d   dk(  rf|d d | j                  d   d   | j                  d   d    | j                  d   d   d | j                  d   d   | j                  d   d    d d f   S | j                  d   d   dk(  rf|d d | j                  d   d   | j                  d   d    | j                  d   d   | j                  d   d    | j                  d   d   d d d f   S |d d | j                  d   d   | j                  d   d    | j                  d   d   | j                  d   d    | j                  d   d   | j                  d   d    d d f   S )Nr(   r   r   r   )r   r   )r   inputss     r%   callzCropping3D.call   sF	   //a #==#A&==#A& 
 MM!$Q')MM!$Q')MM!$Q')	+  q!!$a(8(;@q@MM!$Q')MM!$Q')MM!$Q'4==+;A+>*>>	@  q!!$a(8(;@q@MM!$Q'4==+;A+>*>>MM!$Q')MM!$Q')	+  q!!$a(8(;@q@MM!$Q')MM!$Q'4==+;A+>*>>MM!$Q')	+  q!!$)MM!$Q')MM!$Q'4==+;A+>*>>MM!$Q'4==+;A+>*>>	@  q!!$)MM!$Q'4==+;A+>*>>MM!$Q')MM!$Q'4==+;A+>*>>	@  q!!$)MM!$Q'4==+;A+>*>>MM!$Q'4==+;A+>*>>MM!$Q')	+  a #t}}Q'7':&::a #t}}Q'7':&::a #t}}Q'7':&::	<  a #==#A&==#A& 
 MM!$Q')MM!$Q')MM!$Q')	  q!!$a(8(;@q@MM!$Q')MM!$Q')MM!$Q'4==+;A+>*>>	  q!!$a(8(;@q@MM!$Q'4==+;A+>*>>MM!$Q')MM!$Q')	  q!!$a(8(;@q@MM!$Q')MM!$Q'4==+;A+>*>>MM!$Q')	  q!!$)MM!$Q')MM!$Q'4==+;A+>*>>MM!$Q'4==+;A+>*>>	  q!!$)MM!$Q'4==+;A+>*>>MM!$Q')MM!$Q'4==+;A+>*>>	  q!!$)MM!$Q'4==+;A+>*>>MM!$Q'4==+;A+>*>>MM!$Q')	  a #t}}Q'7':&::a #t}}Q'7':&::a #t}}Q'7':&::	 r&   c                     | j                   | j                  d}t        |          }t	        t        |j                               t        |j                               z         S )N)r   r   )r   r   r   
get_configdictlistitems)r   configbase_configr$   s      r%   r7   zCropping3D.get_config5  sM    "mmD<L<LMg(*D**,-V\\^0DDEEr&   ))r   r   r=   r=   N)	__name__
__module____qualname____doc__r   r2   r5   r7   __classcell__)r$   s   @r%   r   r      s.    1h >B&,P.`JXF Fr&   r   )rA   tensorflow.compat.v2compatv2r+   tf_keras.src.engine.base_layerr   tf_keras.src.engine.input_specr   tf_keras.src.utilsr    tensorflow.python.util.tf_exportr   r   r   r&   r%   <module>rJ      sG    ) " ! 0 4 ) : '([F [F )[Fr&   