
    ~WhN                         d Z ddlZddlZddlmc mZ ddlm	Z	 d Z
ddZddZd	 Z	 	 	 dd
Zd Zd Zd Zd Zd Zd Zd ZdS )z%Utilities used by convolution layers.    N)backendc                     | dk    r+|dk    rdS |dk    rdS |dk    rdS t          d| d	          | d
k    r+|dk    rdS |dk    rdS |dk    rdS t          d| d	          t          d|  d          )Nchannels_last   NWC   NHWC   NDHWCzInput rank not supported: z. Expected values are [3, 4, 5]channels_firstNCWNCHWNCDHWzInvalid data_format: z9. Expected values are ["channels_first", "channels_last"])
ValueError)data_formatndims     \/var/www/html/movieo_spanner_bot/venv/lib/python3.11/site-packages/keras/utils/conv_utils.pyconvert_data_formatr      s    o%%1995QYY6QYY70T 0 0 0   
(	(	(1995QYY6QYY70T 0 0 0  
 FK F F F
 
 	
    Fc           	         d| d| d|  }t          | t                    r| f|z  }n	 t          |           }n# t          $ r t	          |          w xY wt          |          |k    rt	          |          |D ]N}	 t          |           # t          t          f$ r( |d| dt          |           z  }t	          |          w xY w|rd |D             }d}nd |D             }d	}|r|d
| d| dz  }t	          |          |S )a  Transforms non-negative/positive integer/integers into an integer tuple.

    Args:
      value: The value to validate and convert. Could an int, or any iterable of
        ints.
      n: The size of the tuple to be returned.
      name: The name of the argument being validated, e.g. "strides" or
        "kernel_size". This is only used to format error messages.
      allow_zero: Default to False. A ValueError will raised if zero is received
        and this param is False.

    Returns:
      A tuple of n integers.

    Raises:
      ValueError: If something else than an int/long or iterable thereof or a
      negative value is
        passed.
    zThe `z` argument must be a tuple of z integers. Received: zincluding element z	 of type c                     h | ]
}|d k     |S r    .0vs     r   	<setcomp>z"normalize_tuple.<locals>.<setcomp>f   s    >>>AAar   z>= 0c                     h | ]
}|d k    |S r   r   r   s     r   r   z"normalize_tuple.<locals>.<setcomp>i   s    ???AQar   z> 0z including z( that does not satisfy the requirement `z`.)
isinstanceinttuple	TypeErrorr   lentype)	valuenname
allow_zero	error_msgvalue_tuplesingle_valueunqualified_valuesreq_msgs	            r   normalize_tupler.   9   s   *	' 	' 	'A 	' 	'$	' 	' 
 % ,hl	(,,KK 	( 	( 	(Y'''	({q  Y'''' 	, 	,L,L!!!!	* , , ,1 1 1 ..1 1	 !+++,  >>>>>????? $C, C C7>C C C	
	 ###s   9 A=B9C   c                     | dS |dv sJ ||dz
  |dz
  z  z   }|dv r| }n|dk    r	| |z
  dz   }n|dk    r| |z   dz
  }||z   dz
  |z  S )a:  Determines output length of a convolution given input length.

    Args:
        input_length: integer.
        filter_size: integer.
        padding: one of "same", "valid", "full", "causal"
        stride: integer.
        dilation: dilation rate, integer.

    Returns:
        The output length (integer).
    N>   fullsamevalidcausalr/   )r2   r4   r3   r1   r   )input_lengthfilter_sizepaddingstridedilationdilated_filter_sizeoutput_lengths          r   conv_output_lengthr<   v   s     t99999%qX\(JJ$$$$	G		$'::Q>	F		$'::Q>F"Q&611r   c                 x    | dS |dv sJ |dk    r|dz  }n|dk    rd}n|dk    r|dz
  }| dz
  |z  d|z  z
  |z   S )	a  Determines input length of a convolution given output length.

    Args:
        output_length: integer.
        filter_size: integer.
        padding: one of "same", "valid", "full".
        stride: integer.

    Returns:
        The input length (integer).
    N>   r1   r2   r3   r2      r3   r   r1   r/   r   )r;   r6   r7   r8   pads        r   conv_input_lengthr@      s|     t/////&Q	G			F		AoA'!c'1K??r   c                 $   |dv sJ | dS ||dz
  |dz
  z  z   }|A|dk    r| |z  t          ||z
  d          z   }nU|dk    r| |z  ||z   dz
  z
  }n@|dk    r| |z  }n4|dk    r|dz  }n|dk    rd}n|dk    r|dz
  }| dz
  |z  |z   d|z  z
  |z   }|S )	a  Determines output length of a transposed convolution given input length.

    Args:
        input_length: Integer.
        filter_size: Integer.
        padding: one of `"same"`, `"valid"`, `"full"`.
        output_padding: Integer, amount of padding along the output dimension.
          Can be set to `None` in which case the output length is inferred.
        stride: Integer.
        dilation: Integer.

    Returns:
        The output length (integer).
    >   r1   r2   r3   Nr/   r3   r   r1   r>   r2   )max)r5   r6   r7   output_paddingr8   r9   lengthr?   s           r   deconv_output_lengthrE      s   , /////t qX\ BBK g!F*Sv1Eq-I-IIFF!F*f{.BQ.FGFF!F*F f"CCCC/C A'+5C?.P 	 Mr   c                     | t          j                    } |                                 }|dvrt          d|            |S )N>   r   r   zWThe `data_format` argument must be one of "channels_first", "channels_last". Received: )r   image_data_formatlowerr   )r%   r   s     r   normalize_data_formatrI      s]    })++++--K===D<AD D
 
 	
 r   c                     t          | t          t          f          r| S |                                 }|dvrt	          d|           |S )N>   r2   r3   r4   zqThe `padding` argument must be a list/tuple or one of "valid", "same" (or "causal", only for `Conv1D). Received: )r   listr!   rH   r   )r%   r7   s     r   normalize_paddingrL      sa    %$'' kkmmG111# # #
 
 	

 Nr   c                 6   |dvrt          d| d          t          |           }t          |t                    r|f|z  }t          |t                    r|f|z  }t          |          }t          |          }||k    s||k    rt	          d| d| d|           t          | |||          }| |z   }t          j        |t                    }	d |D             }
t          j
        |
 D ].}t          | ||||          }t          j
        | D ]
}d|	||z   <   /|	S )	a  Compute a mask representing the connectivity of a convolution operation.

    Assume a convolution with given parameters is applied to an input having N
    spatial dimensions with `input_shape = (d_in1, ..., d_inN)` to produce an
    output with shape `(d_out1, ..., d_outN)`. This method returns a boolean
    array of shape `(d_in1, ..., d_inN, d_out1, ..., d_outN)` with `True`
    entries indicating pairs of input and output locations that are connected by
    a weight.

    Example:

      >>> input_shape = (4,)
      >>> kernel_shape = (2,)
      >>> strides = (1,)
      >>> padding = "valid"
      >>> conv_kernel_mask(input_shape, kernel_shape, strides, padding)
      array([[ True, False, False],
             [ True,  True, False],
             [False,  True,  True],
             [False, False,  True]])

      where rows and columns correspond to inputs and outputs respectively.


    Args:
      input_shape: tuple of size N: `(d_in1, ..., d_inN)`, spatial shape of the
        input.
      kernel_shape: tuple of size N, spatial shape of the convolutional kernel /
        receptive field.
      strides: tuple of size N, strides along each spatial dimension.
      padding: type of padding, string `"same"` or `"valid"`.
        `"valid"` means no padding. `"same"` results in padding evenly to
        the left/right or up/down of the input such that output has the same
        height/width dimension as the input.

    Returns:
      A boolean 2N-D `np.ndarray` of shape
      `(d_in1, ..., d_inN, d_out1, ..., d_outN)`, where `(d_out1, ..., d_outN)`
      is the spatial shape of the output. `True` entries in the mask represent
      pairs of input-output locations that are connected by a weight.

    Raises:
      ValueError: if `input_shape`, `kernel_shape` and `strides` don't have the
          same number of dimensions.
      NotImplementedError: if `padding` is not in {`"same"`, `"valid"`}.
    >   r2   r3   Padding type 8 not supported. Only "valid" and "same" are implemented.UNumber of strides, input and kernel dimensions must all match. Received: stride_dims=
, in_dims=, kernel_dims=c                 ,    g | ]}t          |          S r   ranger   dims     r   
<listcomp>z$conv_kernel_mask.<locals>.<listcomp>@      <<<s<<<r   T)NotImplementedErrorr#   r   r    r   conv_output_shapenpzerosbool	itertoolsproductconv_connected_inputs)input_shapekernel_shapestridesr7   in_dimskernel_dimsstride_dimsoutput_shape
mask_shapemaskoutput_axes_ticksoutput_positioninput_axes_ticksinput_positions                 r   conv_kernel_maskro      s   ^ '''!7G 7 7 7
 
 	

 +G,$$ 1$0'3 '*w&l##Kg,,Kg!7!7<,7< << <.9< <
 
 	
 %\7G L |+J8J%%D<<|<<<$,.?@ : :0
 
 (/1AB 	: 	:N59D/122	: Kr   c              #   6  K   |dvrt          d| d          t          |           }t          |t                    r|f|z  }t          |t                    r|f|z  }t          |          }t          |          }	||k    s|	|k    rt	          d|	 d| d|           t          | |||          }
d |
D             }|dk    rd	 }n|d
k    rd }nt	          d| d          t          j        | D ]}t          | ||||          }t          j        | D ]}t          |          D ]n}t          |          D ]\}t          j         |||           ||
|                    }t          j         |||           || |                    }||fV  ]odS )a'  Yields output-input tuples of indices in a CNN layer.

    The generator iterates over all `(output_idx, input_idx)` tuples, where
    `output_idx` is an integer index in a flattened tensor representing a single
    output image of a convolutional layer that is connected (via the layer
    weights) to the respective single input image at `input_idx`

    Example:

      >>> input_shape = (2, 2)
      >>> kernel_shape = (2, 1)
      >>> strides = (1, 1)
      >>> padding = "valid"
      >>> filters_in = 1
      >>> filters_out = 1
      >>> data_format = "channels_last"
      >>> list(conv_kernel_idxs(input_shape, kernel_shape, strides, padding,
      ...                       filters_in, filters_out, data_format))
      [(0, 0), (0, 2), (1, 1), (1, 3)]

    Args:
      input_shape: tuple of size N: `(d_in1, ..., d_inN)`, spatial shape of the
        input.
      kernel_shape: tuple of size N, spatial shape of the convolutional kernel /
        receptive field.
      strides: tuple of size N, strides along each spatial dimension.
      padding: type of padding, string `"same"` or `"valid"`.
        `"valid"` means no padding. `"same"` results in padding evenly to
        the left/right or up/down of the input such that output has the same
        height/width dimension as the input.
      filters_in: `int`, number if filters in the input to the layer.
      filters_out: `int', number if filters in the output of the layer.
      data_format: string, "channels_first" or "channels_last".

    Yields:
      The next tuple `(output_idx, input_idx)`, where `output_idx` is an integer
      index in a flattened tensor representing a single output image of a
      convolutional layer that is connected (via the layer weights) to the
      respective single input image at `input_idx`.

    Raises:
        ValueError: if `data_format` is neither `"channels_last"` nor
          `"channels_first"`, or if number of strides, input, and kernel number
          of dimensions do not match.

        NotImplementedError: if `padding` is neither `"same"` nor `"valid"`.
    )r2   r3   rN   rO   rP   rQ   rR   c                 ,    g | ]}t          |          S r   rT   rV   s     r   rX   z$conv_kernel_idxs.<locals>.<listcomp>  rY   r   r   c                     |f| z   S Nr   spatial_idx
filter_idxs     r   <lambda>z"conv_kernel_idxs.<locals>.<lambda>  s    ZMK,G r   r   c                     | |fz   S rs   r   rt   s     r   rw   z"conv_kernel_idxs.<locals>.<lambda>  s    kE
 7
 r   zData format `zK` not recognized.`data_format` must be "channels_first" or "channels_last".)multi_indexdimsN)rZ   r#   r   r    r   r[   r_   r`   ra   rU   r\   ravel_multi_index)rb   rc   rd   r7   
filters_infilters_outr   re   rf   rg   rh   rk   concat_idxsrl   rm   rn   f_inf_outout_idxin_idxs                       r   conv_kernel_idxsr   K  s     p '''!7G 7 7 7
 
 	

 +G,$$ 1$0'3 '*w&l##Kg,,Kg!7!7<,7< << <.9< <
 
 	
 %\7G L =<|<<<&&&GG 	 
	'	'
 
 IK I I I
 
 	

 %,.?@ , ,0
 
 (/1AB 	, 	,Nj)) 
, 
,";// 	, 	,E 2$/K$G$G([{CC  G  1$/K$E$E([jAA  F #F+++++	,
,	,	, ,r   c                 h   g }t          |           }t          |          D ]}t          ||         dz            }||         |z
  }	||         ||         z  }
|dk    r|
|z  }
t          d|
|z
            }t	          | |         |
|	z             }|                    t          ||                     |S )a%  Return locations of the input connected to an output position.

    Assume a convolution with given parameters is applied to an input having N
    spatial dimensions with `input_shape = (d_in1, ..., d_inN)`. This method
    returns N ranges specifying the input region that was convolved with the
    kernel to produce the output at position
    `output_position = (p_out1, ..., p_outN)`.

    Example:

      >>> input_shape = (4, 4)
      >>> kernel_shape = (2, 1)
      >>> output_position = (1, 1)
      >>> strides = (1, 1)
      >>> padding = "valid"
      >>> conv_connected_inputs(input_shape, kernel_shape, output_position,
      ...                       strides, padding)
      [range(1, 3), range(1, 2)]

    Args:
      input_shape: tuple of size N: `(d_in1, ..., d_inN)`, spatial shape of the
        input.
      kernel_shape: tuple of size N, spatial shape of the convolutional kernel /
        receptive field.
      output_position: tuple of size N: `(p_out1, ..., p_outN)`, a single
        position in the output of the convolution.
      strides: tuple of size N, strides along each spatial dimension.
      padding: type of padding, string `"same"` or `"valid"`.
        `"valid"` means no padding. `"same"` results in padding evenly to
        the left/right or up/down of the input such that output has the same
        height/width dimension as the input.

    Returns:
      N ranges `[[p_in_left1, ..., p_in_right1], ...,
                [p_in_leftN, ..., p_in_rightN]]` specifying the region in the
      input connected to output_position.
    r>   r3   r   )r#   rU   r    rB   minappend)rb   rc   rl   rd   r7   rangesndimsd
left_shiftright_shiftcenterstartends                r   ra   ra     s    P FE5\\ ) )a1,--
"1o
2 #gaj0gj FAv
*+++a.&;"677eE3''((((Mr   c                      t          t                              } fd|D             t           fd|D                       S )a  Return the output shape of an N-D convolution.

    Forces dimensions where input is empty (size 0) to remain empty.

    Args:
      input_shape: tuple of size N: `(d_in1, ..., d_inN)`, spatial shape of the
        input.
      kernel_shape: tuple of size N, spatial shape of the convolutional kernel /
        receptive field.
      strides: tuple of size N, strides along each spatial dimension.
      padding: type of padding, string `"same"` or `"valid"`.
        `"valid"` means no padding. `"same"` results in padding evenly to
        the left/right or up/down of the input such that output has the same
        height/width dimension as the input.

    Returns:
      tuple of size N: `(d_out1, ..., d_outN)`, spatial shape of the output.
    c           	      X    g | ]&}t          |         |         |                   'S r   )r<   )r   r   rb   rc   r7   rd   s     r   rX   z%conv_output_shape.<locals>.<listcomp>  sC        	;q><?GWQZPP  r   c                 <    g | ]}|         d k    rd n|         S r   r   )r   r   rb   rh   s     r   rX   z%conv_output_shape.<locals>.<listcomp>  s/    EEE1k!n!!|AEEEr   )rU   r#   r!   )rb   rc   rd   r7   rz   rh   s   ```` @r   r[   r[     s    & \""##D        L EEEEEEEE L r   c                    t          j        d          5  | j        }|| d         }|                                st          j        |           | d         }|d|          }|                                st          j        |           d|          }t	          |t           j                  r,t          j        | dg|                                z             }n,t          j        | t          j        dg|fd                    } ||          }|j        | d         }|                                st          j        |          | d         }t          j        |t          j        ||fd                    }	|		                    | j        d|          |	j        | d         z              |	cddd           S # 1 swxY w Y   dS )a.  Returns `unsqueeze_batch(op(squeeze_batch(inp)))`.

    Where `squeeze_batch` reshapes `inp` to shape
    `[prod(inp.shape[:-inner_rank])] + inp.shape[-inner_rank:]`
    and `unsqueeze_batch` does the reverse reshape but on the output.

    Args:
      inp: A tensor with dims `batch_shape + inner_shape` where `inner_shape`
        is length `inner_rank`.
      op: A callable that takes a single input tensor and returns a single.
        output tensor.
      inner_rank: A python integer.

    Returns:
      `unsqueeze_batch_op(squeeze_batch(inp))`.
    squeeze_batch_dimsN)axis)
tf
name_scopeshapeis_fully_definedr   TensorShapereshapeas_listconcat	set_shape)
inpop
inner_rankr   inner_shapebatch_shapeinp_reshapedout_reshapedout_inner_shapeouts
             r   r   r     s   " 
+	,	,  	ZKLL)++-- 	6(3--5KLj[L)++-- 	6(3--*5Kk2>22 	:cB4+2E2E2G2G+GHHLL:RYk2<<< L r,''&,j[\\://11 	C h|44j[\\BOj")[/$BLLL
 
 	ci*-	:+,,0GGHHH;                 s   FG  GG)F)r/   )Nr   r/   )__doc__r_   numpyr\   tensorflow.compat.v2compatv2r   kerasr   r   r.   r<   r@   rE   rI   rL   ro   r   ra   r[   r   r   r   r   <module>r      s9   , +         ! ! ! ! ! ! ! ! !      
 
 
@: : : :z2 2 2 24@ @ @8 1 1 1 1h	 	 	
 
 
S S Slo, o, o,d9 9 9x  <. . . . .r   