o
    oi?                     @  s   d dl mZ d dlZd dlm  mZ d dlmZ d dlmZm	Z	m
Z
 G dd dejZG dd deZG d	d
 d
eZG dd deZdddZdddZdS )    )annotationsN)nn)ModuleTensorpadc                      s,   e Zd Z						dd fddZ  ZS )ConvNormAct   reluconvnormactin_channelsintout_channelskernel_sizestridestrgroupsconv_namingnorm_naming
act_namingreturnNonec
              
     s   t    |d dkr$|d d }
|d |
 }t|
||
|f| _d}n|d d }t|||||d|d}t|}tjtjtj	d| dd}| 
|| | 
|| | 
|	| d S )N   r   r   F)r	   silunoneT)inplace)super__init__r   	ZeroPad2dr   Conv2dBatchNorm2dReLUSiLUIdentity__setattr__)selfr   r   r   r   r   r   r   r   r   p1p2paddingr
   r   
activation	__class__ P/home/ubuntu/.local/lib/python3.10/site-packages/kornia/contrib/models/common.pyr      s   

zConvNormAct.__init__)r   r	   r   r
   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )__name__
__module____qualname__r   __classcell__r-   r-   r+   r.   r      s    r   c                      s,   e Zd Z	dd fddZdddZ  ZS )MLPF	input_dimr   
hidden_dim
output_dim
num_layerssigmoid_outputboolr   r   c                   sR   t    || _|g|d  }tdd t|g|g ||D | _|| _d S )Nr   c                 s  s     | ]\}}t ||V  qd S N)r   Linear).0nkr-   r-   r.   	<genexpr>F   s    zMLP.__init__.<locals>.<genexpr>)r   r   r7   r   
ModuleListziplayersr8   )r&   r4   r5   r6   r7   r8   hr+   r-   r.   r   @   s
   
*
zMLP.__init__xr   c                 C  sL   t | jD ]\}}|| jd k rt||n||}q| jr$t|}|S )Nr   )	enumeraterB   r7   Fr	   r8   sigmoid)r&   rD   ilayerr-   r-   r.   forwardI   s
   &
zMLP.forward)F)r4   r   r5   r   r6   r   r7   r   r8   r9   r   r   rD   r   r   r   r/   r0   r1   r   rJ   r2   r-   r-   r+   r.   r3   ?   s    	r3   c                      s.   e Zd ZdZdd fd
dZdddZ  ZS )DropPathzYDrop paths (Stochastic Depth) per sample  (when applied in main path of residual blocks).        T	drop_probfloatscale_by_keepr9   r   r   c                   s   t    || _|| _d S r:   )r   r   rO   rQ   )r&   rO   rQ   r+   r-   r.   r   V   s   

zDropPath.__init__rD   r   c                 C  sh   | j dks| js
|S d| j  }|jd fd|jd   }|||}|dkr0| jr0|| || S )NrN   r   r   )r   )rO   trainingshapendim	new_empty
bernoulli_rQ   div_)r&   rD   	keep_probrS   random_tensorr-   r-   r.   rJ   [   s   

zDropPath.forward)rN   T)rO   rP   rQ   r9   r   r   rK   )r/   r0   r1   __doc__r   rJ   r2   r-   r-   r+   r.   rM   S   s    rM   c                      s*   e Zd Zdd fdd	ZdddZ  ZS )LayerNorm2dư>num_channelsr   epsrP   r   r   c                   s8   t    tt|| _tt|| _|| _	d S r:   )
r   r   r   	Parametertorchonesweightzerosbiasr^   )r&   r]   r^   r+   r-   r.   r   i   s   

zLayerNorm2d.__init__rD   r   c                 C  sl   |j ddd}|| dj ddd}|| || j   }| jd d d d f | | jd d d d f  }|S )Nr   T)keepdimr   )meanpowr^   sqrtrb   rd   )r&   rD   usr-   r-   r.   rJ   o   s
   ,zLayerNorm2d.forward)r\   )r]   r   r^   rP   r   r   rK   rL   r-   r-   r+   r.   r[   h   s    r[   rD   r   window_sizer   r   tuple[Tensor, tuple[int, int]]c                 C  s   | j \}}}}|||  | }|||  | }|dks|dkr*t| ddd|d|f} || || }}	| ||| ||	| ||} | dddddd d|||}
|
||	ffS )aC  Partition into non-overlapping windows with padding if needed.

    Args:
        x: input tokens with [B, H, W, C].
        window_size: window size.

    Returns:
        windows: windows after partition with [B * num_windows, window_size, window_size, C].
        (Hp, Wp): padded height and width before partition

    r   r      r         )rS   r   viewpermute
contiguous)rD   rk   BHWCpad_hpad_wHpWpwindowsr-   r-   r.   window_partitionw   s   $r}   r|   pad_hwtuple[int, int]hwc           
      C  s   |\}}|\}}| j d || | |  }| ||| || ||d}	|	dddddd |||d}	||ks=||krO|	ddd|d|ddf  }	|	S )	ay  Window unpartition into original sequences and removing padding.

    Args:
        windows: input tokens with [B * num_windows, window_size, window_size, C].
        window_size: window size.
        pad_hw: padded height and width (Hp, Wp).
        hw: original height and width (H, W) before padding.

    Returns:
        x: unpartitioned sequences with [B, H, W, C].

    r   rp   r   rm   r   rn   ro   N)rS   rq   rr   rs   )
r|   rk   r~   r   rz   r{   ru   rv   rt   rD   r-   r-   r.   window_unpartition   s   $$r   )rD   r   rk   r   r   rl   )
r|   r   rk   r   r~   r   r   r   r   r   )
__future__r   r`   torch.nn.functionalr   
functionalrF   kornia.corer   r   r   
Sequentialr   r3   rM   r[   r}   r   r-   r-   r-   r.   <module>   s   $
