a
    d|                  
   @   s"  d dl mZmZmZmZmZ d dlZdeee dddZ	dd e
dfded	e feeje
ee
e
f ee
 f ee
ee
e
f ee ejejejd
ddZdejeeee
e
f  ddddZdejeeee
e
f  eeddddZdeeje
ef eeej eej ejdddZdS )    )ListOptionalTupleUnioncastNZ
batch_sizeZsame_on_batchc                 C   sL   t | tu r| dks$td|  d|durHt |turHtd| ddS )z*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 )typeintAssertionErrorboolr    r   s/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/kornia/augmentation/utils/param_validation.py_common_param_check   s    r   g        infjointcpu)factornamecenterboundscheckdevicedtypereturnc                 C   s   t | tjstj| ||d} |  dkr| dk rDtd| d|  | dtjddg| j| jd | }|	|d |d j
||d}ntj| ||d}|d	ur|d
krt||| n&|dkrt||| ntd| d|S )z9Check inputs and compute the corresponding factor bounds.r   r   r   zIf z9 is a single number number, it must be non negative. Got                ?   Nr   Zsingularz	methods 'z' not implemented.)
isinstancetorchTensortensordim
ValueErrorrepeatr   r   clamptoZ	as_tensor_joint_range_check_singular_range_checkNotImplementedError)r   r   r   r   r   r   r   Zfactor_boundr   r   r   _range_bound   s    
& r,   )ranged_factorr   r   r   c                 C   s   |du rt dt df}|  dkrt| dkr|d | d krP|d | d ksjt| d| d|  d	|d | d   kr| d   kr|d ksn t| d
| d|  nt| d| d|  d	dS )zGCheck 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)   2   s     0r)   F2d)r-   r   r   	skip_nonemoder   c                 C   s   |dkrd}n|dkrd}nt d| |r:| du r:dS |du rRtdtdf}|  d	krt| |kr| D ]<}|d
 |  kr|d	 ksnn t | d| d|  dqnnt| d| d| d|  dS )zbCheck if bounds[0] <= ranged_factor[0] <= bounds[1] and bounds[0] <= ranged_factor[1] <= bounds[1]r4   r   Z3d   z%'mode' shall be either 2d or 3d. Got Nr.   r   r   r   r/   r0   r   z1 should be a float number or a tuple with length z whose values between z.Got )r%   r1   r$   r2   r3   )r-   r   r   r5   r6   Zdim_sizefr   r   r   r*   B   s$    r*   )input_rangetarget_sizer   r   r   c                 C   s  t |dg}t | szt| ttfrd| dk r>td|  t j|  | g||d|d d}qt| t	t
frt| dkrt| d ttfrt| d ttfrt j| ||d|d d}nt| t	t
frt| |d krtdd | D rt jdd	 | D ||d}ndt| t	t
frZt| |d krZtd
d | D rZt j| ||d}ntd| d| d|  dn.tt j| } t| jdkst| jdkr t| dkr | dk rtd|  | dt jddg| j| jd }||d d}nt| jdkr0t| dkr0| |d d}nxt| jdkr~t| |d kr~| dddt jddg| j| jd }n*| j|kr| }ntdt
| d|  |S )aS  Given target_size, it will generate the corresponding (target_size, 2) range tensor for element-wise params.

    Example:
    >>> degree = torch.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   zCIf input_range is only one number it must be a positive number. Gotr   r   c                 s   s   | ]}t |ttfV  qd S N)r    r1   r
   .0xr   r   r   	<genexpr>       z&_tuple_range_reader.<locals>.<genexpr>c                 S   s   g | ]}| |fqS r   r   )r=   sr   r   r   
<listcomp>   r@   z'_tuple_range_reader.<locals>.<listcomp>c                 s   s   | ]}t |ttfV  qd S r;   )r    tuplelistr<   r   r   r   r?      r@   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   r   zDegrees must be a z; tensor for the degree range for independent operation.Got )r!   SizeZ	is_tensorr    r1   r
   r%   r#   r&   rC   rD   r2   allr3   r   r"   shaper   r   Z	unsqueeze)r9   r:   r   r   Ztarget_shapeZinput_range_tmpr   r   r   _tuple_range_reader`   s|    
.
"
rI   )N)N)NFr4   )NN)typingr   r   r   r   r   r!   r
   r   r   r1   r   Zget_default_dtyper"   strr   r,   r)   r*   rC   rI   r   r   r   r   <module>   sL   

$$   !  