a
    d                     @   sp   d dl Z d dlZd dlmZ d dlmZ d dlmZ ddlm	Z	 G dd dej
Ze G d	d
 d
ej
ZdS )    N)nn)
functional)ARCH_REGISTRY   )	flow_warpc                       s(   e Zd ZdZ fddZdd Z  ZS )BasicModulezBasic Module for SpyNet.
    c                    s   t t|   ttjddddddtjddtjdd	ddddtjddtjd	dddddtjddtjdd
ddddtjddtjd
ddddd	| _d S )N          r      )Zin_channelsZout_channelskernel_sizestridepaddingF)Zinplace@         )superr   __init__r   Z
SequentialZConv2dZReLUbasic_module)self	__class__ b/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/basicsr/archs/spynet_arch.pyr      s    zBasicModule.__init__c                 C   s
   |  |S N)r   )r   tensor_inputr   r   r   forward   s    zBasicModule.forward)__name__
__module____qualname____doc__r   r   __classcell__r   r   r   r   r   
   s   
r   c                       s:   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Z  ZS )SpyNetzhSpyNet architecture.

    Args:
        load_path (str): path for pretrained SpyNet. Default: None.
    Nc              	      s   t t|   tdd tdD | _|rH| tj	|dd dd  | 
dtg d	d
dd
d
 | 
dtg dd
dd
d
 d S )Nc                 S   s   g | ]
}t  qS r   )r   ).0_r   r   r   
<listcomp>&       z#SpyNet.__init__.<locals>.<listcomp>   c                 S   s   | S r   r   )Zstoragelocr   r   r   <lambda>(   r&   z!SpyNet.__init__.<locals>.<lambda>)Zmap_locationparamsmean)g
ףp=
?gv/?gCl?r   r   std)gZd;O?gy&1?g?)r   r"   r   r   Z
ModuleListranger   Zload_state_dicttorchloadZregister_bufferZTensorview)r   Z	load_pathr   r   r   r   $   s    "zSpyNet.__init__c                 C   s   || j  | j }|S r   )r+   r,   )r   r   Ztensor_outputr   r   r   
preprocess-   s    zSpyNet.preprocessc                 C   s~  g }|  |g}|  |g}tdD ]@}|dtj|d dddd |dtj|d dddd q$|d |d ddtt	|d dd tt	|d dd g}tt
|D ]}tj|ddd	d
d }|d|| dkr
tj|g ddd}|d|| dkr8tj|g ddd}| j| t|| t|| |ddddddd|gd| }q|S )N   r   r   F)inputr   r   Zcount_include_padg       @r   bilinearT)r3   Zscale_factormodealign_corners)r   r   r   r   Z	replicate)r3   padr5   )r   r   r   r   r   Zborder)Zinterp_modeZpadding_mode)r1   r-   insertFZ
avg_pool2dZ	new_zerossizeintmathfloorleninterpolater7   r   r.   catr   Zpermute)r   refsuppflowlevelZupsampled_flowr   r   r   process1   s<     zSpyNet.processc                 C   s  |  |  ksJ | d| d }}tt|d d }tt|d d }tj|||fddd}tj|||fddd}tj| ||||fddd}|d d dd d d d f  t|t| 9  < |d d dd d d d f  t|t| 9  < |S )	Nr   r   g      @@r4   F)r3   r:   r5   r6   r   r   )r:   r<   r=   ceilr9   r?   rE   float)r   rA   rB   hwZw_floorZh_floorrC   r   r   r   r   Q   s    00zSpyNet.forward)N)	r   r   r   r    r   r1   rE   r   r!   r   r   r   r   r"      s
   	 r"   )r<   r.   r   Ztorch.nnr   r9   Zbasicsr.utils.registryr   Z	arch_utilr   Moduler   registerr"   r   r   r   r   <module>   s   