o
    oi                     @   sn  d dl mZmZmZmZmZ d dlZd dlmZm	Z	m
Z
 d#dedee ddfddZd	d ed
fdddfdeeeeeef ee f dedee deeeef  dee deej deej defddZd#dededeeeef  ddfddZ			d$dededeeeef  dededdfddZ		d%deeeeedf f d edeej deej def
d!d"ZdS )&    )AnyListOptionalTupleUnionN)Tensor	as_tensortensor
batch_sizesame_on_batchreturnc                 C   sL   t | tr	| dkstd|  d|dur"t |ts$td| ddS dS )z0Check valid batch_size and same_on_batch params.r   z.`batch_size` shall be a positive integer. Got .Nz&`same_on_batch` shall be boolean. Got )
isinstanceintAssertionErrorbool)r
   r    r   ^/home/ubuntu/.local/lib/python3.10/site-packages/kornia/augmentation/utils/param_validation.py_common_param_check   s
   r   g        infjointfactornamecenterboundscheckdevicedtypec                 C   s(  |du r	t d}|du rt  }t| tst| ||d} |  dkrg| dk r2td| d|  d|du s:|du rEtd| d	| d| d
tddg| j| j	d | }|
|d |d j||d}nt| ||d}|dur|dkr~t||| |S |dkrt||| |S td| d|S )z9Check inputs and compute the corresponding factor bounds.Ncpur   r   r   zIf z2 is a single number, it must be non negative. Got r   z<`center` and `bounds` cannot be None for single number. Got z,    g      g      ?   r   singularz	methods 'z' not implemented.)torchr   get_default_dtyper   r   r	   dim
ValueErrorrepeatr   clamptor   _joint_range_check_singular_range_checkNotImplementedError)r   r   r   r   r   r   r   factor_boundr   r   r   _range_bound!   s.   


$ r.   ranged_factorc                 C   s   |du rt dt df}|  dkr[t| dkr[|d | d kr(|d | d ks5t| d| d|  d	|d | d   krL| d   krL|d ksYn t| d
| d|  dS t| d| d|  d	)zHCheck if bounds[0] <= ranged_factor[0] <= ranged_factor[1] <= bounds[1].N-infr   r!   r    r     out of bounds. Expected inside , got r   z[0] should be smaller than z[1] got z7 should be a tensor with length 2 whose values between z. Got )floatr%   lenr&   	TypeError)r/   r   r   r   r   r   r*   K   s    0r*   F2d	skip_nonemodec                 C   s   |dkrd}n|dkrd}nt d| |r| du rdS |du r)tdtdf}|  d	krXt| |krX| D ]}|d
 |  krG|d	 ksUn t | d| d|  dq7dS t| d| d| d|  )zcCheck if bounds[0] <= ranged_factor[0] <= bounds[1] and bounds[0] <= ranged_factor[1] <= bounds[1].r6   r    3d   z%'mode' shall be either 2d or 3d. Got Nr0   r   r!   r   r1   r2   r   z1 should be a float number or a tuple with length z whose values between z.Got )r&   r3   r%   r4   r5   )r/   r   r   r7   r8   dim_sizefr   r   r   r+   Y   s(   r+   input_range.target_sizec                 C   s  t |dg}t| trt| jdks t| jdkrHt| dkrH| dk r+td|  | dj||dt	ddg||d }||d d}|S t| jdkrdt| dkrd| |d dj||d}|S t| jdkrt| |d kr| 
dddj||dt	ddg||d }|S | j|kr| j||d}|S tdt| d|  t| ttfr| dk rtd|  t	|  | g||d|d d}|S t| ttfrt| dkrt| d ttfrt| d ttfrt	| ||d|d d}|S t| ttfr!t| |d kr!td	d
 | D r!t	dd | D ||d}|S t| ttfrEt| |d krEtdd
 | D rEt	| ||d}|S td| d| d|  d)aN  Given target_size, it will generate the corresponding (target_size, 2) range tensor for element-wise params.

    Example:
    >>> degree = tensor([0.2, 0.3])
    >>> _tuple_range_reader(degree, 3)  # read degree for yaw, pitch and roll.
    tensor([[0.2000, 0.3000],
            [0.2000, 0.3000],
            [0.2000, 0.3000]])

    r    r   r!   zCIf input_range is only one number it must be a positive number. Gotr   zDegrees must be a z; tensor for the degree range for independent operation.Got c                 s       | ]
}t |ttfV  qd S N)r   r3   r   .0xr   r   r   	<genexpr>       z&_tuple_range_reader.<locals>.<genexpr>c                 S   s   g | ]}| |fqS r   r   )rC   sr   r   r   
<listcomp>   s    z'_tuple_range_reader.<locals>.<listcomp>c                 s   r@   rA   )r   tuplelistrB   r   r   r   rE      rF   z]If not pass a tensor, it must be float, (float, float) for isotropic operation or a tuple of z floats or z/ (float, float) for independent operation. Got r   )r#   Sizer   r   r4   shaper&   r'   r)   r	   	unsqueezerJ   r3   r   rI   allr5   )r=   r>   r   r   target_shapeinput_range_tmpr   r   r   _tuple_range_readerw   s~   
(
30
-
( rQ   rA   )NFr6   )NN)typingr   r   r   r   r   r#   kornia.corer   r   r	   r   r   r   r3   strr   r   r.   r*   r+   rQ   r   r   r   r   <module>   sp   

(*
!