o
    Vh                  
   @   s   d dl mZ d dlZd dlm  mZ d dlmZ ddedededee	 fd	d
Z
ddedededefddZddee defddZdS )    )OptionalN)Tensorbilinearimgabsolute_gridmodealign_cornersc           	      C   s|   | j dd \}}|jddgdd\}}d| |d  d }|dkr,d| |d  d }tj||gdd}tj| |||dS )z_Same as torch's grid_sample, with absolute pixel coordinates instead of normalized coordinates.N   dim   )r   r   )shapesplittorchcatFgrid_sample)	r   r   r   r   hwxgridygridnormalized_grid r   Z/var/www/vscode/kcb/lib/python3.10/site-packages/torchvision/models/optical_flow/_utils.pyr      s   r   cpu
batch_sizer   r   devicec                 C   s^   t |}t jt j||dt j||ddd}t j|d d d dd }|d  | dddS )N)r   ij)indexingr   r   r   r
   )r   r   meshgridarangestackfloatrepeat)r   r   r   r   coordsr   r   r   make_coords_grid   s   
$r'      up_maskfactorc           
   	   C   s   | j \}}}}|| || }}|du r!|tj| ||fddd S ||dd||||}tj|dd}tj||  d	dd
||ddd||}	tj||	 dd}	|	dddddd		||||S )a,  Upsample flow by the input factor (default 8).

    If up_mask is None we just interpolate.
    If up_mask is specified, we upsample using a convex combination of its weights. See paper page 8 and appendix B.
    Note that in appendix B the picture assumes a downsample factor of 4 instead of 8.
    Nr   T)sizer   r   r
   	   r   r      )kernel_sizepaddingr         )
r   r   interpolateviewr   softmaxunfoldsumpermutereshape)
flowr)   r*   r   num_channelsr   r   new_hnew_wupsampled_flowr   r   r   upsample_flow   s   & r>   )r   N)r   )Nr(   )typingr   r   torch.nn.functionalnn
functionalr   r   strboolr   intr'   r>   r   r   r   r   <module>   s     