
    |hd                     f    d Z ddlmZ ddlmZ ddlmZ d Zd Zd Z	d Z
dd	Zd
 Zd ZddZd Zy)zDContains layer utilities for input validation and format conversion.    )
smart_cond)cond)	variablesc                     | dk(  r!|dk(  ry|dk(  ry|dk(  ryt        d| d	      | d
k(  r!|dk(  ry|dk(  ry|dk(  ryt        d| d	      t        d|  d      )Nchannels_last   NWC   NHWC   NDHWCzInput rank: z5 not supported. We only support input rank 3, 4 or 5.channels_firstNCWNCHWNCDHWzInvalid data_format: z5. We only support "channels_first" or "channels_last")
ValueError)data_formatndims     ]/var/www/html/test/engine/venv/lib/python3.12/site-packages/tensorflow/python/layers/utils.pyconvert_data_formatr      s    O#qy		dV ,/ / 0 0&&qy		dV ,/ / 0 0 ,[M :; ; < <    c                    t        | t              r| f|z  S 	 t        |       }t        |      |k7  r&t	        d| dt        |       dt        |              |D ]  }	 t        |        |S # t        $ r' t	        d| dt        |       dt        |              w xY w# t        t        f$ rH t	        d| dt        |       dt        |        dt        |       dt        t        |             
      w xY w)a  Transforms a single integer or iterable of 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.

  Returns:
    A tuple of n integers.

  Raises:
    ValueError: If something else than an int/long or iterable thereof was
      passed.
  z
Argument `z` must be a tuple of z integers. Received: z including element z	 of type )
isinstanceinttuple	TypeErrorr   strlentype)valuennamevalue_tuplesingle_values        r   normalize_tupler%   0   s7   " s8a<<%Lk ;1D6)>s1vh G..1%j\; < <# 77L7   <D6)>s1vh G..1%j\; < << )$ 7:dV+@Q I003E
|;N-.i\ 2346 7 	77s   A, B,0BAC6c                 ^    | j                         }|dvrt        dt        |        d      |S )N>   r   r   zWThe `data_format` argument must be one of "channels_first", "channels_last". Received: .lowerr   r   )r    r   s     r   normalize_data_formatr*   W   sA    +;;
 EE
|1& ' ' 
r   c                 ^    | j                         }|dvrt        dt        |       d      |S )N>   samevalidzAThe `padding` argument must be one of "valid", "same". Received: r'   r(   )r    paddings     r   normalize_paddingr/   `   s=    KKM'%%
 ""%g,q2 3 3	.r   c                     | y|dv sJ ||dz
  |dz
  z  z   }|dk(  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".
      stride: integer.
      dilation: dilation rate, integer.

  Returns:
      The output length (integer).
  N>   fullr,   r-      r,   r-   r1    )input_lengthfilter_sizer.   stridedilationdilated_filter_sizeoutput_lengths          r   conv_output_lengthr:   h   s     	-	--	-#{Q8a<&HH M' #66:M& #66:M
&
 1
$	//r   c                 p    | y|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 )	zDetermines 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   r,   r-   r,      r-   r   r1   r2   r3   )r9   r5   r.   r6   pads        r   conv_input_lengthr>      sj     	-	--	-

C'
C&
/C
!
v	%C	/+	==r   c                 h    | y| |z  } |dk(  r| t        ||z
  d      z  } | S |dk(  r| ||z   d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".
      stride: integer.

  Returns:
      The output length (integer).
  Nr-   r   r1   r<   )max)r4   r5   r.   r6   s       r   deconv_output_lengthrA      sa     &,Cf,a00L 
 &Vk)A-.L	r   Nc                     t        | t        j                        rt        j                  | |||      S t	        j
                  | |||      S )a  Return either `true_fn()` if predicate `pred` is true else `false_fn()`.

  If `pred` is a bool or has a constant value, we return either `true_fn()`
  or `false_fn()`, otherwise we use `tf.cond` to dynamically route to both.

  Args:
    pred: A scalar determining whether to return the result of `true_fn` or
      `false_fn`.
    true_fn: The callable to be performed if pred is true.
    false_fn: The callable to be performed if pred is false.
    name: Optional name prefix when using `tf.cond`.

  Returns:
    Tensors returned by the call to either `true_fn` or `false_fn`.

  Raises:
    TypeError: If `true_fn` or `false_fn` is not callable.
  )true_fnfalse_fnr"   )r   r   Variabler   smart_moduler   )predrC   rD   r"   s       r   r   r      sJ    & i(()99gt= =		 	 
GhT
; ;r   c                     t        | t              r| dk(  rd} n| dk(  rd} t        | t        j                        ryt	        j
                  |       S )a  Return the bool value for `pred`, or None if `pred` had a dynamic value.

    Args:
      pred: A scalar, either a Python bool or a TensorFlow boolean variable
        or tensor, or the Python integer 1 or 0.

    Returns:
      True or False if `pred` has a constant boolean value, None otherwise.

    Raises:
      TypeError: If `pred` is not a Variable, Tensor or bool, or Python
        integer 1 or 0.
    r2   Tr   FN)r   r   r   rE   rF   smart_constant_value)rG   s    r   constant_valuerJ      sJ     cqyd	di(()		*	*4	00r   )r2   )NNN)__doc__tensorflow.python.frameworkr   rF   tensorflow.python.opsr   r   r   r%   r*   r/   r:   r>   rA   rJ   r3   r   r   <module>rN      sB     K B & +<4$N04>0,;41r   