
    &Vf,                         d dl 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
d	S )
    )backend)keras_export)	InputSpec)Layer)argument_validationz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).

    Example:

    >>> input_shape = (2, 28, 28, 10, 3)
    >>> x = np.arange(np.prod(input_shape)).reshape(input_shape)
    >>> y = keras.layers.Cropping3D(cropping=(2, 4, 2))(x)
    >>> 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 three 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 Keras
            config file at `~/.keras/keras.json` (if exists). 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, channels)`
        - If `data_format` is `"channels_first"`:
          `(batch_size, channels, 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, channels)`
        - If `data_format` is `"channels_first"`:
          `(batch_size, channels, first_cropped_axis, second_cropped_axis,
          third_cropped_axis)`
       r   r   r   Nc                 p    t                      j        di | t          j        |          | _        t          |t                    r*|dk     rt          d| d          ||f||f||ff| _        nt          |d          rt          |          dk    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          | _        d S )Nr   z2`cropping` cannot be negative. Received: cropping=.__len__   z-`cropping` should have 3 elements. Received:    z1st entry of croppingT)
allow_zeror   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   standardize_data_formatdata_format
isinstanceint
ValueErrorcroppinghasattrlenr   standardize_tupler   
input_spec)selfr   r   kwargsdim1_croppingdim2_croppingdim3_cropping	__class__s          b/var/www/html/software/conda/lib/python3.11/site-packages/keras/src/layers/reshaping/cropping3d.pyr   zCropping3D.__init__;   s    	""6"""":;GGh$$ $	!|| 6*26 6 6  
 8$8$8$DMM
 Xy)) 	8}}!! OHOOO   0AQ 7D  M 0AQ 7D  M 0AQ 7D  M +M=IDMM) &) ) )	 	 	 $+++    c                    | j         dk    rt          |dd                   }nt          |dd                   }t          dd          D ]Y}||         ||xx         t          | j        |                   z  cc<   ||         dk    rt          d| d	| j                   Z| j         dk    r|d         |d         g|R S |d         g||d         R S )
Nchannels_firstr   r   r      r   r   z}Values in `cropping` argument should be smaller than the corresponding spatial dimension of the input. Received: input_shape=, cropping=)r   listrangesumr   r   )r"   input_shapespatial_dimsindexs       r(   compute_output_shapezCropping3D.compute_output_shapeg   s&   ///AaC 011LLAaC 011L1a[[ 		 		EE"*3t}U';#<#<<E"a'' K#.K K;?=K K   ( ///NKNB\BBBNB\B;q>BBBr)   c                    | j         dk    rt          |j        dd                   }nt          |j        dd                   }t          dd          D ]^}||         ||xx         t	          | j        |                   z  cc<   ||         dk    rt          d|j         d	| j                   _| j         dk    rM| j        d         d         | j        d         d         cxk    r| j        d         d         cxk    rdk    rMn nJ|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    r_n n\|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    r_n n\|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    r_n n\|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    rn|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    rn|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    rn|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    rMn nJ|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    r_n n\|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    r_n n\|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    r_n n\|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    rn|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    rn|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    rn|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   z~Values in `cropping` argument should be smaller than the corresponding spatial dimension of the input. Received: inputs.shape=r-   )r   r.   shaper/   r0   r   r   )r"   inputsr2   r3   s       r(   callzCropping3D.call}   s$   ///QqS 122LLQqS 122L1a[[ 		 		EE"*3t}U';#<#<<E"a'' M$*LM M=A]M M   ( ///a #=#A&   =#A&        
 AAAAM!$Q'))M!$Q'))M!$Q'))	+  q!!$a(8(;@@@@q@@@@@AAAAM!$Q'))M!$Q'))M!$Q'4=+;A+>*>>	@  q!!$a(8(;@@@@q@@@@@AAAAM!$Q'4=+;A+>*>>M!$Q'))M!$Q'))	+  q!!$a(8(;@@@@q@@@@@AAAAM!$Q'))M!$Q'4=+;A+>*>>M!$Q'))	+  q!!$))AAAAM!$Q'))M!$Q'4=+;A+>*>>M!$Q'4=+;A+>*>>	@  q!!$))AAAAM!$Q'4=+;A+>*>>M!$Q'))M!$Q'4=+;A+>*>>	@  q!!$))AAAAM!$Q'4=+;A+>*>>M!$Q'4=+;A+>*>>M!$Q'))	+  a #t}Q'7':&::a #t}Q'7':&::a #t}Q'7':&::	<  a #=#A&   =#A&        
 AAM!$Q'))M!$Q'))M!$Q'))AA	  q!!$a(8(;@@@@q@@@@@AAM!$Q'))M!$Q'))M!$Q'4=+;A+>*>>AA	  q!!$a(8(;@@@@q@@@@@AAM!$Q'4=+;A+>*>>M!$Q'))M!$Q'))AA	  q!!$a(8(;@@@@q@@@@@AAM!$Q'))M!$Q'4=+;A+>*>>M!$Q'))AA	  q!!$))AAM!$Q'))M!$Q'4=+;A+>*>>M!$Q'4=+;A+>*>>AA	  q!!$))AAM!$Q'4=+;A+>*>>M!$Q'))M!$Q'4=+;A+>*>>AA	  q!!$))AAM!$Q'4=+;A+>*>>M!$Q'4=+;A+>*>>M!$Q'))AA	  a #t}Q'7':&::a #t}Q'7':&::a #t}Q'7':&::	 r)   c                 n    | j         | j        d}t                                                      }i ||S )N)r   r   )r   r   r   
get_config)r"   configbase_configr'   s      r(   r:   zCropping3D.get_config  s:    "mD<LMMgg((**(+(((r)   )r
   N)	__name__
__module____qualname____doc__r   r4   r8   r:   __classcell__)r'   s   @r(   r	   r	      s        / /d >B*, *, *, *, *, *,XC C C,Z Z Zx) ) ) ) ) ) ) ) )r)   r	   N)	keras.srcr   keras.src.api_exportr   keras.src.layers.input_specr   keras.src.layers.layerr   keras.src.utilsr   r	   r   r)   r(   <module>rG      s          - - - - - - 1 1 1 1 1 1 ( ( ( ( ( ( / / / / / / '((S) S) S) S) S) S) S) )(S) S) S)r)   