a
    žd2  ć                   @   s>   d dl Z d dlZd dlZdd Zdd Ze ” d	ddZdS )
é    Nc                 C   sn   t  | ”}|d }|d }d| d|  d |dk |” d| d|  d|  d |dk|dk  |”  S )z2cubic function used for calculate_weights_indices.é   é   g      ų?g      @é   g      ąæé   )ŚtorchŚabsZtype_as)ŚxZabsxZabsx2Zabsx3© r	   śg/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/basicsr/utils/matlab_functions.pyŚcubic   s    
’ ’’’r   c                 C   sĄ  |dk r|r|| }t  d||”}|| ddd|    }t  ||d  ”}t |”d }	| |d” ||	”t  d|	d |	” d|	” ||	” }
| |d” ||	”|
 }|dk rĘ|rĘ|t||  }nt|}t  |d” |d”}|| ||	” }t  |dkd”}tj	|d ddds<|
 
dd|	d ”}
| 
dd|	d ”}tj	|d dddsv|
 
dd|	d ”}
| 
dd|	d ”}| ” }|
 ” }
|
 ”  d }|
 ” |  }|
| d }
||
t|t|fS )a8  Calculate weights and indices, used for imresize function.

    Args:
        in_length (int): Input length.
        out_length (int): Output length.
        scale (float): Scale factor.
        kernel_width (int): Kernel width.
        antialisaing (bool): Whether to apply anti-aliasing when downsampling.
    r   g      ą?r   r   gķµ ÷Ę°>)Zrel_tolé’’’’)r   ZlinspaceŚfloorŚmathŚceilŚviewŚexpandr   ŚsumŚiscloseŚnarrowŚ
contiguousŚminŚmaxŚint)Z	in_lengthZ
out_lengthŚscaleŚkernelŚkernel_widthŚantialiasingr   ŚuŚleftŚpŚindicesZdistance_to_centerŚweightsZweights_sumZweights_zero_tmpZ	sym_len_sZ	sym_len_er	   r	   r
   Ścalculate_weights_indices   s8    ,’r"   Tc                 C   sÄ  d}t | jtjkrVd}| jdkr<| dddddf } d}t |  ddd”” ” } nd}| jdkrr|  	d”} d}|  
” \}}}t || ”t || ” }}	d}
d}t|||||
|\}}}}t||	|||
|\}}}}t ||| | |”}| d||” | ” | ddd|ddf }t | 
d”d d	d	” ” }| d|”}| dd|” |” | dd| dddf }t | 
d”d d	d	” ” }| d|”}| d|| |” |” t |||”}| 
d”}
t|D ]`}t|| d }t|D ]@}|||||
 ddf  dd” || ”|||ddf< qņqÖt |||| | ”}| d||” |” |ddddd|f }t | 
d”d d	d	” ” }| d|”}| dd|” |” |dddd| df }t | 
d”d d	d	” ” }| d|”}| d|| |” |” t |||	”}| 
d”}
t|	D ]X}t|| d }t|D ]8}||dd|||
 f  || ”||dd|f< qPq4|r| d”}|rĄ| ” }|sĄ| ddd”}|S )
a\  imresize function same as MATLAB.

    It now only supports bicubic.
    The same scale applies for both height and width.

    Args:
        img (Tensor | Numpy array):
            Tensor: Input image with shape (c, h, w), [0, 1] range.
            Numpy: Input image with shape (h, w, c), [0, 1] range.
        scale (float): Scale factor. The same scale applies for both height
            and width.
        antialisaing (bool): Whether to apply anti-aliasing when downsampling.
            Default: True.

    Returns:
        Tensor: Output image with shape (c, h, w), [0, 1] range, w/o round.
    FTr   Nr   r   r   r   r   )ŚtypeŚ
__module__ŚnpŚ__name__Śndimr   Z
from_numpyZ	transposeŚfloatZ	unsqueezeŚsizer   r   r"   ZFloatTensorr   Zcopy_ZarangeŚlongZindex_selectŚranger   ŚmvZsqueezeŚnumpy)Śimgr   r   Zsqueeze_flagZ
numpy_typeZin_cZin_hZin_wZout_hZout_wr   r   Z	weights_hZ	indices_hZ
sym_len_hsZ
sym_len_heZ	weights_wZ	indices_wZ
sym_len_wsZ
sym_len_weZimg_augZ	sym_patchZinv_idxZsym_patch_invZout_1ŚiŚidxŚjZ	out_1_augZout_2r	   r	   r
   ŚimresizeU   sx    


’’
B
:
r2   )T)r   r-   r%   r   r   r"   Zno_gradr2   r	   r	   r	   r
   Ś<module>   s   
E